IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEAjhzqcDUdAAA1HQAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCiMgQm9pbGVycGxhdGUgYWRkZWQgYnkgc3VicGFyL2NvbXBpbGVyL3B5dGhvbl9hcmNoaXZlLnB5CmZyb20gc3VicGFyLnJ1bnRpbWUgaW1wb3J0IHN1cHBvcnQgYXMgXwpfLnNldHVwKGltcG9ydF9yb290cz1bJ3BpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMCcsICdiYXplbF90b29scycsICdwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAnLCAncnVsZXNfcHl0aG9uJ10sIHppcF9zYWZlPVRydWUpCmRlbCBfCiMgRW5kIGJvaWxlcnBsYXRlCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzdGF0CmltcG9ydCB6aXBmaWxlCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgICIiIkdldCB0aGUgY3VycmVudCB1bWFzayB3aGljaCBpbnZvbHZlcyBoYXZpbmcgdG8gc2V0IGl0IHRlbXBvcmFyaWx5LiIiIgogICAgbWFzayA9IG9zLnVtYXNrKDApCiAgICBvcy51bWFzayhtYXNrKQogICAgcmV0dXJuIG1hc2sKCgpkZWYgc2V0X2V4dHJhY3RlZF9maWxlX3RvX2RlZmF1bHRfbW9kZV9wbHVzX2V4ZWN1dGFibGUocGF0aCk6CiAgICAiIiIKICAgIE1ha2UgZmlsZSBwcmVzZW50IGF0IHBhdGggaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAoY2htb2QgK3gpIGlzIG5vLW9wIG9uIHdpbmRvd3MgcGVyIHB5dGhvbiBkb2NzCiAgICAiIiIKICAgIG9zLmNobW9kKHBhdGgsICgwbzc3NyAmIH5jdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X3N1ZmZpeChzZWxmKToKICAgICMgUmV0dXJucyBhIGNhbm9uaWNhbCBzdWZmaXggdGhhdCB3aWxsIGZvcm0gcGFydCBvZiB0aGUgbmFtZSBvZiB0aGUgQmF6ZWwKICAgICMgcmVwb3NpdG9yeSBmb3IgdGhpcyBwYWNrYWdlLgogICAgY2Fub25pY2FsID0gJ3B5cGlfX3t9X3t9Jy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCiAgICAjIEVzY2FwZSBhbnkgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZS4KICAgIHJldHVybiByZS5zdWIoJ1stLitdJywgJ18nLCBjYW5vbmljYWwpCgogIGRlZiBfZGlzdF9pbmZvKHNlbGYpOgogICAgIyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRpc3QtaW5mbyBkaXJlY3Rvcnkgd2l0aGluIHRoZSAud2hsIGZpbGUuCiAgICAjIGUuZy4gZ29vZ2xlX2Nsb3VkLTAuMjcuMC1weTIucHkzLW5vbmUtYW55LndobCAtPgogICAgIyAgICAgIGdvb2dsZV9jbG91ZC0wLjI3LjAuZGlzdC1pbmZvCiAgICByZXR1cm4gJ3t9LXt9LmRpc3QtaW5mbycuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQoKICBkZWYgbWV0YWRhdGEoc2VsZik6CiAgICAjIEV4dHJhY3QgdGhlIHN0cnVjdHVyZWQgZGF0YSBmcm9tIG1ldGFkYXRhLmpzb24gaW4gdGhlIFdITCdzIGRpc3QtaW5mbwogICAgIyBkaXJlY3RvcnkuCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgICMgZmlyc3QgY2hlY2sgZm9yIG1ldGFkYXRhLmpzb24KICAgICAgdHJ5OgogICAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL21ldGFkYXRhLmpzb24nKSBhcyBmOgogICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICBwYXNzCiAgICAgICMgZmFsbCBiYWNrIHRvIE1FVEFEQVRBIGZpbGUgKGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKQogICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9NRVRBREFUQScpIGFzIGY6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX21ldGFkYXRhKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgZGVmIG5hbWUoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnbmFtZScpCgogIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgZXh0cmE9Tm9uZSk6CiAgICAiIiJBY2Nlc3MgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIFdoZWVsLgoKICAgIEFyZ3M6CiAgICAgIGV4dHJhOiBpZiBzcGVjaWZpZWQsIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIG9mIHRoZSBuYW1lZCAiZXh0cmEiLgoKICAgIFlpZWxkczoKICAgICAgdGhlIG5hbWVzIG9mIHJlcXVpcmVtZW50cyBmcm9tIHRoZSBtZXRhZGF0YS5qc29uLCBpbiBsZXhpY2FsIG9yZGVyLgogICAgIiIiCiAgICAjIFRPRE8obWF0dG1vb3IpOiBJcyB0aGVyZSBhIHNjaGVtYSB0byBmb2xsb3cgZm9yIHRoaXM/CiAgICBkZXBlbmRlbmN5X3NldCA9IHNldCgpCgogICAgcnVuX3JlcXVpcmVzID0gc2VsZi5tZXRhZGF0YSgpLmdldCgncnVuX3JlcXVpcmVzJywgW10pCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gcnVuX3JlcXVpcmVzOgogICAgICBpZiByZXF1aXJlbWVudC5nZXQoJ2V4dHJhJykgIT0gZXh0cmE6CiAgICAgICAgIyBNYXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZXh0cmEgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgY29udGludWUKICAgICAgbWFya2VyID0gcmVxdWlyZW1lbnQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgIGlmIG1hcmtlciBhbmQgbm90IHBrZ19yZXNvdXJjZXMuZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgIyBUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgUEVQIDUwOCBtYXJrZXIsCiAgICAgICAgIyBzbyBpZ25vcmUgdGhpcyByZXF1aXJlbWVudC4KICAgICAgICBjb250aW51ZQogICAgICByZXF1aXJlcyA9IHJlcXVpcmVtZW50LmdldCgncmVxdWlyZXMnLCBbXSkKICAgICAgZm9yIGVudHJ5IGluIHJlcXVpcmVzOgogICAgICAgICMgU3RyaXAgb2ZmIGFueSB0cmFpbGluZyB2ZXJzaW9uaW5nIGRhdGEuCiAgICAgICAgcGFydHMgPSByZS5zcGxpdCgnWyA+PD0oKV0nLCBlbnRyeSkKICAgICAgICBkZXBlbmRlbmN5X3NldC5hZGQocGFydHNbMF0pCgogICAgcmV0dXJuIHNvcnRlZChkZXBlbmRlbmN5X3NldCkKCiAgZGVmIGV4dHJhcyhzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdleHRyYXMnLCBbXSkKCiAgZGVmIGV4cGFuZChzZWxmLCBkaXJlY3RvcnkpOgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICJyIiwgYWxsb3daaXA2ND1UcnVlKSBhcyB3aGw6CiAgICAgICAgd2hsLmV4dHJhY3RhbGwoZGlyZWN0b3J5KQogICAgICAgICMgVGhlIGZvbGxvd2luZyBsb2dpYyBpcyBib3Jyb3dlZCBmcm9tIFBpcDoKICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iL2NjNDhjMDdiNjRmMzM4YWM1ZTM0N2Q5MGY2Y2I0ZWZjMjJlZDBkMGIvc3JjL3BpcC9faW50ZXJuYWwvdXRpbHMvdW5wYWNraW5nLnB5I0wyNDAKICAgICAgICBmb3IgaW5mbyBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgIyBEbyBub3QgYXR0ZW1wdCB0byBtb2RpZnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIi8iKSBvciBuYW1lLmVuZHN3aXRoKCJcXCIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgbW9kZSA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICAjIGlmIG1vZGUgYW5kIHJlZ3VsYXIgZmlsZSBhbmQgYW55IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yCiAgICAgICAgICAgICMgdXNlci9ncm91cC93b3JsZD8KICAgICAgICAgICAgaWYgbW9kZSBhbmQgc3RhdC5TX0lTUkVHKG1vZGUpIGFuZCBtb2RlICYgMG8xMTE6CiAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKICAgICAgICAgICAgICAgIHNldF9leHRyYWN0ZWRfZmlsZV90b19kZWZhdWx0X21vZGVfcGx1c19leGVjdXRhYmxlKG5hbWUpCgogICMgX3BhcnNlX21ldGFkYXRhIHBhcnNlcyBNRVRBREFUQSBmaWxlcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDMxNC8KICBkZWYgX3BhcnNlX21ldGFkYXRhKHNlbGYsIGNvbnRlbnQpOgogICAgIyBUT0RPOiBoYW5kbGUgZmllbGRzIG90aGVyIHRoYW4ganVzdCBuYW1lCiAgICBuYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKCdOYW1lOiAoLiopJykKICAgIHJldHVybiB7ICduYW1lJzogbmFtZV9wYXR0ZXJuLnNlYXJjaChjb250ZW50KS5ncm91cCgxKSB9CgoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nVW5wYWNrIGEgV0hMIGZpbGUgYXMgYSBweV9saWJyYXJ5LicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdobCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgLndobCBmaWxlIHdlIGFyZSBleHBhbmRpbmcuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cycsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwaXBfaW1wb3J0IGZyb20gd2hpY2ggdG8gZHJhdyBkZXBlbmRlbmNpZXMuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9Jy4nLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBleHBhbmQgdGhpbmdzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhcycsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2V0IG9mIGV4dHJhcyBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgbGlicmFyeSB0YXJnZXRzLicpCgpkZWYgbWFpbigpOgogICIiIgogIEdlbmVyYXRlIGEgQlVJTEQgZmlsZSBmb3IgYW4gdW56aXBwZWQgV2hlZWwKCiAgV2UgYWxsb3cgZm9yIGVtcHR5IFB5dGhvbiBzb3VyY2VzIGFzIGZvciBXaGVlbHMgY29udGFpbmluZyBvbmx5IGNvbXBpbGVkIEMgY29kZQogIHRoZXJlIG1heSBiZSBubyBQeXRob24gc291cmNlcyB3aGF0c29ldmVyIChlLmcuIHBhY2thZ2VzIHdyaXR0ZW4gaW4gQ3l0aG9uOiBsaWtlIGBweW1zc3FsYCkuCiAgIiIiCgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgd2hsID0gV2hlZWwoYXJncy53aGwpCgogICMgRXh0cmFjdCB0aGUgZmlsZXMgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkKICB3aGwuZXhwYW5kKGFyZ3MuZGlyZWN0b3J5KQoKICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGFyZ3MuZGlyZWN0b3J5LCAnQlVJTEQnKSwgJ3cnKSBhcyBmOgogICAgZi53cml0ZSgiIiIKcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IikKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdLCBhbGxvd19lbXB0eSA9IFRydWUpLAogICAgZGF0YSA9IGdsb2IoWyIqKi8qIl0sIGV4Y2x1ZGU9WyIqKi8qLnB5IiwgIioqLyogKiIsICJCVUlMRCIsICJXT1JLU1BBQ0UiXSksCiAgICAjIFRoaXMgbWFrZXMgdGhpcyBkaXJlY3RvcnkgYSB0b3AtbGV2ZWwgaW4gdGhlIHB5dGhvbiBpbXBvcnQKICAgICMgc2VhcmNoIHBhdGggZm9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICAgaW1wb3J0cyA9IFsiLiJdLAogICAgZGVwcyA9IFt7ZGVwZW5kZW5jaWVzfV0sCikKe2V4dHJhc30iIiIuZm9ybWF0KAogIHJlcXVpcmVtZW50cz1hcmdzLnJlcXVpcmVtZW50cywKICBkZXBlbmRlbmNpZXM9JywnLmpvaW4oWwogICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGQKICAgIGZvciBkIGluIHdobC5kZXBlbmRlbmNpZXMoKQogIF0pLAogIGV4dHJhcz0nXG5cbicuam9pbihbCiAgICAiIiJweV9saWJyYXJ5KAogICAgbmFtZSA9ICJ7ZXh0cmF9IiwKICAgIGRlcHMgPSBbCiAgICAgICAgIjpwa2ciLHtkZXBzfQogICAgXSwKKSIiIi5mb3JtYXQoZXh0cmE9ZXh0cmEsCiAgICAgICAgICAgIGRlcHM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGRlcAogICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhKQogICAgICAgICAgICBdKSkKICAgIGZvciBleHRyYSBpbiBhcmdzLmV4dHJhcyBvciBbXQogIF0pKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAGJhemVsX3Rvb2xzL3Rvb2xzL3B5dGhvbi9weTN3cmFwcGVyLnNoIyEvYmluL3NoCgojIERvbid0IHNldCAtZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcm9idXN0IHRyYXBwaW5nIGFuZCBwcmludGluZyBvZiBlcnJvcnMuCnNldCAtdQoKIyBXZSB1c2UgL2Jpbi9zaCByYXRoZXIgdGhhbiAvYmluL2Jhc2ggZm9yIHBvcnRhYmlsaXR5LiBTZWUgZGlzY3Vzc2lvbiBoZXJlOgojIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vP25vbW9iaWxlPXRydWUjIXRvcGljL2JhemVsLWRldi80UWxfN2VEY0xDMAojIFdlIGRvIGxvc2UgdGhlIGFiaWxpdHkgdG8gc2V0IC1vIHBpcGVmYWlsLgoKU1RSSUNUPSIxIgoKaWYgWyAiJFNUUklDVCIgPSAiMSIgXTsgdGhlbgogIEZBSUxVUkVfSEVBREVSPSJcCkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBkZWZhdWx0IFB5dGhvbiB0b29sY2hhaW4gXAooQGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW4pLiIKZWxzZQogIEZBSUxVUkVfSEVBREVSPSJcCkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBub24tc3RyaWN0IGF1dG9kZXRlY3RpbmcgUHl0aG9uIFwKdG9vbGNoYWluIChAYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbl9ub25zdHJpY3QpLiIKZmkKCmRpZSgpIHsKICBlY2hvICIkRkFJTFVSRV9IRUFERVIiIDE+JjIKICBlY2hvICIkMSIgMT4mMgogIGV4aXQgMQp9CgojIFdlIHVzZSBgd2hpY2hgIHRvIGxvY2F0ZSB0aGUgUHl0aG9uIGludGVycHJldGVyIGNvbW1hbmQgb24gUEFUSC4gYGNvbW1hbmQgLXZgCiMgaXMgYW5vdGhlciBvcHRpb24sIGJ1dCBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXQgZmluZHMgaGFzIHRoZQojIGV4ZWN1dGFibGUgYml0LgojCiMgQSB0cmlja3kgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiB0aGlzIHdyYXBwZXIgaXMgaW52b2tlZCBhcyBwYXJ0IG9mIHJ1bm5pbmcgYQojIHRvb2wsIGUuZy4gcGFzc2luZyBhIHB5X2JpbmFyeSB0YXJnZXQgdG8gYGN0eC5hY3Rpb25zLnJ1bigpYC4gQmF6ZWwgd2lsbCB1bnNldAojIHRoZSBQQVRIIHZhcmlhYmxlLiBUaGVuIHRoZSBzaGVsbCB3aWxsIHNlZSB0aGVyZSdzIG5vIFBBVEggYW5kIGluaXRpYWxpemUgaXRzCiMgb3duLCBzb21ldGltZXMgd2l0aG91dCBleHBvcnRpbmcgaXQuIFRoaXMgY2F1c2VzIGB3aGljaGAgdG8gZmFpbCBhbmQgdGhpcwojIHNjcmlwdCB0byB0aGluayB0aGVyZSdzIG5vIFB5dGhvbiBpbnRlcnByZXRlciBpbnN0YWxsZWQuIFRvIGF2b2lkIHRoaXMgd2UKIyBleHBsaWNpdGx5IHBhc3MgUEFUSCB0byBlYWNoIGB3aGljaGAgaW52b2NhdGlvbi4gV2UgY2FuJ3QganVzdCBleHBvcnQgUEFUSAojIGJlY2F1c2UgdGhhdCB3b3VsZCBtb2RpZnkgdGhlIGVudmlyb25tZW50IHNlZW4gYnkgdGhlIGZpbmFsIHVzZXIgUHl0aG9uCiMgcHJvZ3JhbS4KIwojIFNlZSBhbHNvOgojCiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2NvbnRpbnVvdXMtaW50ZWdyYXRpb24vaXNzdWVzLzU3OAojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvODQxNAojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvODQxNQoKIyBUcnkgdGhlICJweXRob24zIiBjb21tYW5kIG5hbWUgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIG9uICJweXRob24iLgpQWVRIT05fQklOPSIkKFBBVEg9IiRQQVRIIiB3aGljaCBweXRob24zIDI+IC9kZXYvbnVsbCkiClVTRURfRkFMTEJBQ0s9IjAiCmlmIFsgLXogIiR7UFlUSE9OX0JJTjotfSIgXTsgdGhlbgogIFBZVEhPTl9CSU49IiQoUEFUSD0iJFBBVEgiIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbCkiCiAgVVNFRF9GQUxMQkFDSz0iMSIKZmkKaWYgWyAteiAiJHtQWVRIT05fQklOOi19IiBdOyB0aGVuCiAgZGllICJOZWl0aGVyICdweXRob24zJyBub3IgJ3B5dGhvbicgd2VyZSBmb3VuZCBvbiB0aGUgdGFyZ2V0IFwKcGxhdGZvcm0ncyBQQVRILCB3aGljaCBpczoKCiRQQVRICgpQbGVhc2UgZW5zdXJlIGFuIGludGVycHJldGVyIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIChhbmQgbWFya2VkIFwKZXhlY3V0YWJsZSksIG9yIGVsc2UgcmVnaXN0ZXIgYW4gYXBwcm9wcmlhdGUgUHl0aG9uIHRvb2xjaGFpbiBhcyBwZXIgdGhlIFwKZG9jdW1lbnRhdGlvbiBmb3IgcHlfcnVudGltZV9wYWlyIFwKKGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2Jsb2IvbWFzdGVyL3Rvb2xzL3B5dGhvbi90b29sY2hhaW4uYnpsKS4iCmZpCgppZiBbICIkU1RSSUNUIiA9ICIxIiBdOyB0aGVuCiAgIyBWZXJpZnkgdGhhdCB3ZSBncmFiYmVkIGFuIGludGVycHJldGVyIHdpdGggdGhlIHJpZ2h0IHZlcnNpb24uCiAgVkVSU0lPTl9TVFI9IiQoIiRQWVRIT05fQklOIiAtViAyPiYxKSIgXAogICAgICB8fCBkaWUgIkNvdWxkIG5vdCBnZXQgaW50ZXJwcmV0ZXIgdmVyc2lvbiB2aWEgJyRQWVRIT05fQklOIC1WJyIKICBpZiAhIGVjaG8gIiRWRVJTSU9OX1NUUiIgfCBncmVwIC1xICIgM1wuIiA7IHRoZW4KICAgICAgZGllICJBY2NvcmRpbmcgdG8gJyRQWVRIT05fQklOIC1WJywgdmVyc2lvbiBpcyAnJFZFUlNJT05fU1RSJywgYnV0IHdlIFwKbmVlZCB2ZXJzaW9uIDMuIFBBVEggaXM6CgokUEFUSAoKUGxlYXNlIGVuc3VyZSBhbiBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gMyBpcyBhdmFpbGFibGUgb24gdGhpcyBcCnBsYXRmb3JtIGFzICdweXRob24zJyBvciAncHl0aG9uJywgb3IgZWxzZSByZWdpc3RlciBhbiBhcHByb3ByaWF0ZSBcClB5dGhvbiB0b29sY2hhaW4gYXMgcGVyIHRoZSBkb2N1bWVudGF0aW9uIGZvciBweV9ydW50aW1lX3BhaXIgXAooaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvYmxvYi9tYXN0ZXIvdG9vbHMvcHl0aG9uL3Rvb2xjaGFpbi5iemwpLgoKTm90ZSB0aGF0IHByaW9yIHRvIEJhemVsIDAuMjcsIHRoZXJlIHdhcyBubyBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgXAppbnRlcnByZXRlcidzIHZlcnNpb24gbWF0Y2hlZCB0aGUgdmVyc2lvbiBkZWNsYXJlZCBieSB0aGUgdGFyZ2V0ICgjNDgxNSkuIElmIFwKeW91ciBidWlsZCB3b3JrZWQgcHJpb3IgdG8gQmF6ZWwgMC4yNywgYW5kIHlvdSdyZSBzdXJlIHlvdXIgdGFyZ2V0cyBkbyBub3QgXApyZXF1aXJlIFB5dGhvbiAzLCB5b3UgY2FuIG9wdCBvdXQgb2YgdGhpcyB2ZXJzaW9uIGNoZWNrIGJ5IHVzaW5nIHRoZSBcCm5vbi1zdHJpY3QgYXV0b2RldGVjdGluZyB0b29sY2hhaW4gaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgYXV0b2RldGVjdGluZyBcCnRvb2xjaGFpbi4gVGhpcyBjYW4gYmUgZG9uZSBieSBwYXNzaW5nIHRoZSBmbGFnIFwKXGAtLWV4dHJhX3Rvb2xjaGFpbnM9QGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW5fbm9uc3RyaWN0XGAgXApvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGFkZGluZyBpdCB0byB5b3VyIGJhemVscmMuIgogIGZpCmZpCgpleGVjICIkUFlUSE9OX0JJTiIgIiRAIgpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFxPukV+AAAAfgAAADQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvZWFzeV9pbnN0YWxsLnB5IiIiUnVuIHRoZSBFYXN5SW5zdGFsbCBjb21tYW5kIiIiCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBtYWluCiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAcbLJPPacBAD2nAQA+AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHkjIGNvZGluZzogdXRmLTgKIiIiClBhY2thZ2UgcmVzb3VyY2UgQVBJCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKc3ViZGlyZWN0b3J5IHRoZXJlb2YuICBUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgZXhwZWN0cyByZXNvdXJjZSBuYW1lcwp0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbApwYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKbmFtZXMgYmVpbmcgcGFzc2VkIGludG8gdGhlIEFQSS4KClRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCi5lZ2cgZmlsZXMsIGFuZCB1bnBhY2tlZCAuZWdnIGZpbGVzLiAgSXQgY2FuIGFsc28gd29yayBpbiBhIGxpbWl0ZWQgd2F5IHdpdGgKLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKbWV0aG9kLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgaW8KaW1wb3J0IHRpbWUKaW1wb3J0IHJlCmltcG9ydCB0eXBlcwppbXBvcnQgemlwZmlsZQppbXBvcnQgemlwaW1wb3J0CmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc3RhdAppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBwa2d1dGlsCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBwbGlzdGxpYgppbXBvcnQgZW1haWwucGFyc2VyCmltcG9ydCBlcnJubwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGluc3BlY3QKaW1wb3J0IG50cGF0aAppbXBvcnQgcG9zaXhwYXRoCmZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCgp0cnk6CiAgICBpbXBvcnQgX2ltcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAzLjIgY29tcGF0aWJpbGl0eQogICAgaW1wb3J0IGltcCBhcyBfaW1wCgp0cnk6CiAgICBGaWxlRXhpc3RzRXJyb3IKZXhjZXB0IE5hbWVFcnJvcjoKICAgIEZpbGVFeGlzdHNFcnJvciA9IE9TRXJyb3IKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBtYXAsIGZpbHRlcgoKIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCmZyb20gb3MgaW1wb3J0IHV0aW1lCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IG1rZGlyLCByZW5hbWUsIHVubGluawogICAgV1JJVEVfU1VQUE9SVCA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBubyB3cml0ZSBzdXBwb3J0LCBwcm9iYWJseSB1bmRlciBHQUUKICAgIFdSSVRFX1NVUFBPUlQgPSBGYWxzZQoKZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCmZyb20gb3MucGF0aCBpbXBvcnQgaXNkaXIsIHNwbGl0Cgp0cnk6CiAgICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeSBhcyBpbXBvcnRsaWJfbWFjaGluZXJ5CiAgICAjIGFjY2VzcyBhdHRyaWJ1dGUgdG8gZm9yY2UgaW1wb3J0IHVuZGVyIGRlbGF5ZWQgaW1wb3J0IG1lY2hhbmlzbXMuCiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5Ll9fbmFtZV9fCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydGxpYl9tYWNoaW5lcnkgPSBOb25lCgpmcm9tIC4gaW1wb3J0IHB5MzFjb21wYXQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgYXBwZGlycwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24nKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5yZXF1aXJlbWVudHMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcubWFya2VycycpCgoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCgppZiAoMywgMCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDUpOgogICAgcmFpc2UgUnVudGltZUVycm9yKCJQeXRob24gMy41IG9yIGxhdGVyIGlzIHJlcXVpcmVkIikKCmlmIHNpeC5QWTI6CiAgICAjIFRob3NlIGJ1aWx0aW4gZXhjZXB0aW9ucyBhcmUgb25seSBkZWZpbmVkIGluIFB5dGhvbiAzCiAgICBQZXJtaXNzaW9uRXJyb3IgPSBOb25lCiAgICBOb3RBRGlyZWN0b3J5RXJyb3IgPSBOb25lCgojIGRlY2xhcmUgc29tZSBnbG9iYWxzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIHRvCiMgc2F0aXNmeSB0aGUgbGludGVycy4KcmVxdWlyZSA9IE5vbmUKd29ya2luZ19zZXQgPSBOb25lCmFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyID0gTm9uZQpyZXNvdXJjZXNfc3RyZWFtID0gTm9uZQpjbGVhbnVwX3Jlc291cmNlcyA9IE5vbmUKcmVzb3VyY2VfZGlyID0gTm9uZQpyZXNvdXJjZV9zdHJlYW0gPSBOb25lCnNldF9leHRyYWN0aW9uX3BhdGggPSBOb25lCnJlc291cmNlX2lzZGlyID0gTm9uZQpyZXNvdXJjZV9zdHJpbmcgPSBOb25lCml0ZXJfZW50cnlfcG9pbnRzID0gTm9uZQpyZXNvdXJjZV9saXN0ZGlyID0gTm9uZQpyZXNvdXJjZV9maWxlbmFtZSA9IE5vbmUKcmVzb3VyY2VfZXhpc3RzID0gTm9uZQpfZGlzdHJpYnV0aW9uX2ZpbmRlcnMgPSBOb25lCl9uYW1lc3BhY2VfaGFuZGxlcnMgPSBOb25lCl9uYW1lc3BhY2VfcGFja2FnZXMgPSBOb25lCgoKY2xhc3MgUEVQNDQwV2FybmluZyhSdW50aW1lV2FybmluZyk6CiAgICAiIiIKICAgIFVzZWQgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGEgdmVyc2lvbiBvciBzcGVjaWZpZXIgbm90IGNvbXBseWluZyB3aXRoCiAgICBQRVAgNDQwLgogICAgIiIiCgoKZGVmIHBhcnNlX3ZlcnNpb24odik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24odikKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbih2KQoKCl9zdGF0ZV92YXJzID0ge30KCgpkZWYgX2RlY2xhcmVfc3RhdGUodmFydHlwZSwgKiprdyk6CiAgICBnbG9iYWxzKCkudXBkYXRlKGt3KQogICAgX3N0YXRlX3ZhcnMudXBkYXRlKGRpY3QuZnJvbWtleXMoa3csIHZhcnR5cGUpKQoKCmRlZiBfX2dldHN0YXRlX18oKToKICAgIHN0YXRlID0ge30KICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIF9zdGF0ZV92YXJzLml0ZW1zKCk6CiAgICAgICAgc3RhdGVba10gPSBnWydfc2dldF8nICsgdl0oZ1trXSkKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfX3NldHN0YXRlX18oc3RhdGUpOgogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICBnWydfc3NldF8nICsgX3N0YXRlX3ZhcnNba11dKGssIGdba10sIHYpCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX3NnZXRfZGljdCh2YWwpOgogICAgcmV0dXJuIHZhbC5jb3B5KCkKCgpkZWYgX3NzZXRfZGljdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5jbGVhcigpCiAgICBvYi51cGRhdGUoc3RhdGUpCgoKZGVmIF9zZ2V0X29iamVjdCh2YWwpOgogICAgcmV0dXJuIHZhbC5fX2dldHN0YXRlX18oKQoKCmRlZiBfc3NldF9vYmplY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuX19zZXRzdGF0ZV9fKHN0YXRlKQoKCl9zZ2V0X25vbmUgPSBfc3NldF9ub25lID0gbGFtYmRhICphcmdzOiBOb25lCgoKZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3MgbWF4aW11bSBjb21wYXRpYmxlIHZlcnNpb24uCgogICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCiAgICBvZiBNYWMgT1MgWCB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIHRvICp1c2UqIGV4dGVuc2lvbnMgcHJvZHVjZWQgYnkKICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCiAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKICAgIGV4cGxpY2l0bHkgcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgTWFjIE9TIFgsIHdlIG11c3QgYWxzbyBrbm93IHRoZQogICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KCiAgICBJZiB0aGlzIGNvbmRpdGlvbiBvY2N1cnMgZm9yIGFueSBvdGhlciBwbGF0Zm9ybSB3aXRoIGEgdmVyc2lvbiBpbiBpdHMKICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgogICAgIiIiCiAgICBwbGF0ID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKICAgIG0gPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocGxhdCkKICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBsYXQgPSAnbWFjb3N4LSVzLSVzJyAlICgnLicuam9pbihfbWFjb3N4X3ZlcnMoKVs6Ml0pLCBtLmdyb3VwKDMpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIG5vdCBNYWMgT1MgWAogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCl9fYWxsX18gPSBbCiAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQogICAgJ3JlcXVpcmUnLCAncnVuX3NjcmlwdCcsICdnZXRfcHJvdmlkZXInLCAnZ2V0X2Rpc3RyaWJ1dGlvbicsCiAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywKICAgICdpdGVyX2VudHJ5X3BvaW50cycsCiAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCiAgICAncmVzb3VyY2VfbGlzdGRpcicsICdyZXNvdXJjZV9leGlzdHMnLCAncmVzb3VyY2VfaXNkaXInLAoKICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCiAgICAnZGVjbGFyZV9uYW1lc3BhY2UnLCAnd29ya2luZ19zZXQnLCAnYWRkX2FjdGl2YXRpb25fbGlzdGVuZXInLAogICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCgogICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCiAgICAnRGlzdHJpYnV0aW9uJywgJ1JlcXVpcmVtZW50JywgJ0VudHJ5UG9pbnQnLAoKICAgICMgRXhjZXB0aW9ucwogICAgJ1Jlc29sdXRpb25FcnJvcicsICdWZXJzaW9uQ29uZmxpY3QnLCAnRGlzdHJpYnV0aW9uTm90Rm91bmQnLAogICAgJ1Vua25vd25FeHRyYScsICdFeHRyYWN0aW9uRXJyb3InLAoKICAgICMgV2FybmluZ3MKICAgICdQRVA0NDBXYXJuaW5nJywKCiAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCiAgICAncGFyc2VfcmVxdWlyZW1lbnRzJywgJ3BhcnNlX3ZlcnNpb24nLCAnc2FmZV9uYW1lJywgJ3NhZmVfdmVyc2lvbicsCiAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywgJ2ludmFsaWRfbWFya2VyJywgJ2V2YWx1YXRlX21hcmtlcicsCgogICAgIyBmaWxlc3lzdGVtIHV0aWxpdGllcwogICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAoKICAgICMgRGlzdHJpYnV0aW9uICJwcmVjZWRlbmNlIiBjb25zdGFudHMKICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCgogICAgIyAiUHJvdmlkZXIiIGludGVyZmFjZXMsIGltcGxlbWVudGF0aW9ucywgYW5kIHJlZ2lzdHJhdGlvbi9sb29rdXAgQVBJcwogICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCiAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAogICAgJ051bGxQcm92aWRlcicsICdFZ2dQcm92aWRlcicsICdEZWZhdWx0UHJvdmlkZXInLCAnWmlwUHJvdmlkZXInLAogICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCiAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCgogICAgIyBXYXJuaW5ncwogICAgJ1BrZ1Jlc291cmNlc0RlcHJlY2F0aW9uV2FybmluZycsCgogICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQogICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLApdCgoKY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3JzIiIiCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoc2VsZi5hcmdzKQoKCmNsYXNzIFZlcnNpb25Db25mbGljdChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbi4KCiAgICBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbiBhbmQgdGhlIHJlcXVlc3RlZAogICAgUmVxdWlyZW1lbnQuCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSAie3NlbGYuZGlzdH0gaXMgaW5zdGFsbGVkIGJ1dCB7c2VsZi5yZXF9IGlzIHJlcXVpcmVkIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIHdpdGhfY29udGV4dChzZWxmLCByZXF1aXJlZF9ieSk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgcmVxdWlyZWRfYnkgaXMgbm9uLWVtcHR5LCByZXR1cm4gYSB2ZXJzaW9uIG9mIHNlbGYgdGhhdCBpcyBhCiAgICAgICAgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZWRfYnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgYXJncyA9IHNlbGYuYXJncyArIChyZXF1aXJlZF9ieSwpCiAgICAgICAgcmV0dXJuIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoKmFyZ3MpCgoKY2xhc3MgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdChWZXJzaW9uQ29uZmxpY3QpOgogICAgIiIiCiAgICBBIFZlcnNpb25Db25mbGljdCB0aGF0IGFjY2VwdHMgYSB0aGlyZCBwYXJhbWV0ZXIsIHRoZSBzZXQgb2YgdGhlCiAgICByZXF1aXJlbWVudHMgdGhhdCByZXF1aXJlZCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbi4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9IFZlcnNpb25Db25mbGljdC5fdGVtcGxhdGUgKyAnIGJ5IHtzZWxmLnJlcXVpcmVkX2J5fScKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlZF9ieShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzJdCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCgogICAgX3RlbXBsYXRlID0gKCJUaGUgJ3tzZWxmLnJlcX0nIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICAgICAgICAiYW5kIGlzIHJlcXVpcmVkIGJ5IHtzZWxmLnJlcXVpcmVyc19zdHJ9IikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzX3N0cihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5yZXF1aXJlcnM6CiAgICAgICAgICAgIHJldHVybiAndGhlIGFwcGxpY2F0aW9uJwogICAgICAgIHJldHVybiAnLCAnLmpvaW4oc2VsZi5yZXF1aXJlcnMpCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVwb3J0KCkKCgpjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCgoKX3Byb3ZpZGVyX2ZhY3RvcmllcyA9IHt9CgpQWV9NQUpPUiA9ICd7fS57fScuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKQpFR0dfRElTVCA9IDMKQklOQVJZX0RJU1QgPSAyClNPVVJDRV9ESVNUID0gMQpDSEVDS09VVF9ESVNUID0gMApERVZFTE9QX0RJU1QgPSAtMQoKCmRlZiByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfdHlwZSwgcHJvdmlkZXJfZmFjdG9yeSk6CiAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKCiAgICBgbG9hZGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiBgYG1vZHVsZS5fX2xvYWRlcl9fYGAsCiAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAogICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgogICAgIiIiCiAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKCgpkZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKICAgICIiIlJldHVybiBhbiBJUmVzb3VyY2VQcm92aWRlciBmb3IgdGhlIG5hbWVkIG1vZHVsZSBvciByZXF1aXJlbWVudCIiIgogICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSwgUmVxdWlyZW1lbnQpOgogICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCiAgICB0cnk6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKCgpkZWYgX21hY29zeF92ZXJzKF9jYWNoZT1bXSk6CiAgICBpZiBub3QgX2NhY2hlOgogICAgICAgIHZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KICAgICAgICAjIGZhbGxiYWNrIGZvciBNYWNQb3J0cwogICAgICAgIGlmIHZlcnNpb24gPT0gJyc6CiAgICAgICAgICAgIHBsaXN0ID0gJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxpc3QpOgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwbGlzdGxpYiwgJ3JlYWRQbGlzdCcpOgogICAgICAgICAgICAgICAgICAgIHBsaXN0X2NvbnRlbnQgPSBwbGlzdGxpYi5yZWFkUGxpc3QocGxpc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgJ1Byb2R1Y3RWZXJzaW9uJyBpbiBwbGlzdF9jb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcGxpc3RfY29udGVudFsnUHJvZHVjdFZlcnNpb24nXQoKICAgICAgICBfY2FjaGUuYXBwZW5kKHZlcnNpb24uc3BsaXQoJy4nKSkKICAgIHJldHVybiBfY2FjaGVbMF0KCgpkZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgogICAgcmV0dXJuIHsnUG93ZXJQQyc6ICdwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzogJ3BwYyd9LmdldChtYWNoaW5lLCBtYWNoaW5lKQoKCmRlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCgogICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CiAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCiAgICAiIiIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0KCiAgICBwbGF0ID0gZ2V0X3BsYXRmb3JtKCkKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IF9tYWNvc3hfdmVycygpCiAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCiAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlICgKICAgICAgICAgICAgICAgIGludCh2ZXJzaW9uWzBdKSwgaW50KHZlcnNpb25bMV0pLAogICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgaWYgc29tZW9uZSBpcyBydW5uaW5nIGEgbm9uLU1hYyBkYXJ3aW4gc3lzdGVtLCB0aGlzIHdpbGwgZmFsbAogICAgICAgICAgICAjIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgptYWNvc1ZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIibWFjb3N4LShcZCspXC4oXGQrKS0oLiopIikKZGFyd2luVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJkYXJ3aW4tKFxkKylcLihcZCspXC4oXGQrKS0oLiopIikKIyBYWFggYmFja3dhcmQgY29tcGF0CmdldF9wbGF0Zm9ybSA9IGdldF9idWlsZF9wbGF0Zm9ybQoKCmRlZiBjb21wYXRpYmxlX3BsYXRmb3Jtcyhwcm92aWRlZCwgcmVxdWlyZWQpOgogICAgIiIiQ2FuIGNvZGUgZm9yIHRoZSBgcHJvdmlkZWRgIHBsYXRmb3JtIHJ1biBvbiB0aGUgYHJlcXVpcmVkYCBwbGF0Zm9ybT8KCiAgICBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHBsYXRmb3JtIGlzIGBgTm9uZWBgLCBvciB0aGUgcGxhdGZvcm1zIGFyZSBlcXVhbC4KCiAgICBYWFggTmVlZHMgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIExpbnV4IGFuZCBvdGhlciB1bml4eSBPU2VzLgogICAgIiIiCiAgICBpZiBwcm92aWRlZCBpcyBOb25lIG9yIHJlcXVpcmVkIGlzIE5vbmUgb3IgcHJvdmlkZWQgPT0gcmVxdWlyZWQ6CiAgICAgICAgIyBlYXN5IGNhc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgTWFjIE9TIFggc3BlY2lhbCBjYXNlcwogICAgcmVxTWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHJlcXVpcmVkKQogICAgaWYgcmVxTWFjOgogICAgICAgIHByb3ZNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCgogICAgICAgICMgaXMgdGhpcyBhIE1hYyBwYWNrYWdlPwogICAgICAgIGlmIG5vdCBwcm92TWFjOgogICAgICAgICAgICAjIHRoaXMgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIGJ1aWx0IGJlZm9yZQogICAgICAgICAgICAjIHNldHVwdG9vbHMgMC42LiBBbGwgcGFja2FnZXMgYnVpbHQgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsCiAgICAgICAgICAgICMgdXNlIHRoZSBuZXcgbWFjb3N4IGRlc2lnbmF0aW9uLgogICAgICAgICAgICBwcm92RGFyd2luID0gZGFyd2luVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKICAgICAgICAgICAgaWYgcHJvdkRhcndpbjoKICAgICAgICAgICAgICAgIGR2ZXJzaW9uID0gaW50KHByb3ZEYXJ3aW4uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBtYWNvc3ZlcnNpb24gPSAiJXMuJXMiICUgKHJlcU1hYy5ncm91cCgxKSwgcmVxTWFjLmdyb3VwKDIpKQogICAgICAgICAgICAgICAgaWYgZHZlcnNpb24gPT0gNyBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC4zIiBvciBcCiAgICAgICAgICAgICAgICAgICAgICAgIGR2ZXJzaW9uID09IDggYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuNCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgIyBlZ2cgaXNuJ3QgbWFjb3N4IG9yIGxlZ2FjeSBkYXJ3aW4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgYXJlIHRoZXkgdGhlIHNhbWUgbWFqb3IgdmVyc2lvbiBhbmQgbWFjaGluZSB0eXBlPwogICAgICAgIGlmIHByb3ZNYWMuZ3JvdXAoMSkgIT0gcmVxTWFjLmdyb3VwKDEpIG9yIFwKICAgICAgICAgICAgICAgIHByb3ZNYWMuZ3JvdXAoMykgIT0gcmVxTWFjLmdyb3VwKDMpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBpcyB0aGUgcmVxdWlyZWQgT1MgbWFqb3IgdXBkYXRlID49IHRoZSBwcm92aWRlZCBvbmU/CiAgICAgICAgaWYgaW50KHByb3ZNYWMuZ3JvdXAoMikpID4gaW50KHJlcU1hYy5ncm91cCgyKSk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgWFhYIExpbnV4IGFuZCBvdGhlciBwbGF0Zm9ybXMnIHNwZWNpYWwgY2FzZXMgc2hvdWxkIGdvIGhlcmUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBydW5fc2NyaXB0KGRpc3Rfc3BlYywgc2NyaXB0X25hbWUpOgogICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBgZGlzdF9zcGVjYCBhbmQgcnVuIGl0cyBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICBucy5jbGVhcigpCiAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgIHJlcXVpcmUoZGlzdF9zcGVjKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCgojIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKcnVuX21haW4gPSBydW5fc2NyaXB0CgoKZGVmIGdldF9kaXN0cmlidXRpb24oZGlzdCk6CiAgICAiIiJSZXR1cm4gYSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvYmplY3QgZm9yIGEgUmVxdWlyZW1lbnQgb3Igc3RyaW5nIiIiCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGRpc3QgPSBSZXF1aXJlbWVudC5wYXJzZShkaXN0KQogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBSZXF1aXJlbWVudCk6CiAgICAgICAgZGlzdCA9IGdldF9wcm92aWRlcihkaXN0KQogICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCwgRGlzdHJpYnV0aW9uKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIHN0cmluZywgUmVxdWlyZW1lbnQsIG9yIERpc3RyaWJ1dGlvbiIsIGRpc3QpCiAgICByZXR1cm4gZGlzdAoKCmRlZiBsb2FkX2VudHJ5X3BvaW50KGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBmb3IgYGRpc3RgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5sb2FkX2VudHJ5X3BvaW50KGdyb3VwLCBuYW1lKQoKCmRlZiBnZXRfZW50cnlfbWFwKGRpc3QsIGdyb3VwPU5vbmUpOgogICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X21hcChncm91cCkKCgpkZWYgZ2V0X2VudHJ5X2luZm8oZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKCgpjbGFzcyBJTWV0YWRhdGFQcm92aWRlcjoKICAgIGRlZiBoYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSdzIGRpc3RyaWJ1dGlvbiBjb250YWluIHRoZSBuYW1lZCBtZXRhZGF0YT8iIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIlRoZSBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgIiIiWWllbGQgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgbGlzdCBvZiBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZXMKCiAgICAgICBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gZWFjaCBsaW5lLCBhbmQgbGluZXMKICAgICAgIHdpdGggYGAjYGAgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgYXJlIG9taXR0ZWQuIiIiCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKG5hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCBtZXRhZGF0YSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIobmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiBtZXRhZGF0YSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgogICAgZGVmIHJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgIiIiRXhlY3V0ZSB0aGUgbmFtZWQgc2NyaXB0IGluIHRoZSBzdXBwbGllZCBuYW1lc3BhY2UgZGljdGlvbmFyeSIiIgoKCmNsYXNzIElSZXNvdXJjZVByb3ZpZGVyKElNZXRhZGF0YVByb3ZpZGVyKToKICAgICIiIkFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UgY29udGFpbiB0aGUgbmFtZWQgcmVzb3VyY2U/IiIiCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiByZXNvdXJjZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgoKY2xhc3MgV29ya2luZ1NldDoKICAgICIiIkEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBvbiBzeXMucGF0aCAob3IgYSBzaW1pbGFyIGxpc3QpIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIHdvcmtpbmcgc2V0IGZyb20gbGlzdCBvZiBwYXRoIGVudHJpZXMgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQogICAgICAgIHNlbGYuYnlfa2V5ID0ge30KICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCgogICAgICAgIGlmIGVudHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCgogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgogICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbWFzdGVyKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0LgogICAgICAgICIiIgogICAgICAgIHdzID0gY2xzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBUaGUgbWFpbiBwcm9ncmFtIGRvZXMgbm90IGxpc3QgYW55IHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXR1cm4gd3MKCiAgICAgICAgIyBlbnN1cmUgdGhlIHJlcXVpcmVtZW50cyBhcmUgbWV0CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cy5yZXF1aXJlKF9fcmVxdWlyZXNfXykKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICByZXR1cm4gY2xzLl9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhfX3JlcXVpcmVzX18pCgogICAgICAgIHJldHVybiB3cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9mcm9tX3JlcXVpcmVtZW50cyhjbHMsIHJlcV9zcGVjKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdvcmtpbmcgc2V0IGZyb20gYSByZXF1aXJlbWVudCBzcGVjLiBSZXdyaXRlcyBzeXMucGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKICAgICAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAogICAgICAgIHdzID0gY2xzKFtdKQogICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlbWVudHMocmVxX3NwZWMpCiAgICAgICAgZGlzdHMgPSB3cy5yZXNvbHZlKHJlcXMsIEVudmlyb25tZW50KCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIHdzLmFkZChkaXN0KQoKICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3cy5lbnRyaWVzOgogICAgICAgICAgICAgICAgd3MuYWRkX2VudHJ5KGVudHJ5KQoKICAgICAgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCiAgICAgICAgc3lzLnBhdGhbOl0gPSB3cy5lbnRyaWVzCiAgICAgICAgcmV0dXJuIHdzCgogICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CiAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAoKICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucwogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKICAgICAgICBhbHdheXMgYXBwZW5kZWQgdG8gYGAuZW50cmllc2BgLCBldmVuIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwogICAgICAgIGVxdWFsIGBgc3lzLnBhdGhgYC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIHNlbGYuZW50cmllcy5hcHBlbmQoZW50cnkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiVHJ1ZSBpZiBgZGlzdGAgaXMgdGhlIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIGl0cyBwcm9qZWN0IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmluZCBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyByZXF1aXJlbWVudCBgcmVxYAoKICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKICAgICAgICByZXR1cm5zIGl0IGFzIGxvbmcgYXMgaXQgbWVldHMgdGhlIHZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVkIGJ5CiAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAogICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgogICAgICAgIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgYGBOb25lYGAKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCiAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgaXRlcl9lbnRyeV9wb2ludHMoc2VsZiwgZ3JvdXAsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCgogICAgICAgIElmIGBuYW1lYCBpcyBOb25lLCB5aWVsZHMgYWxsIGVudHJ5IHBvaW50cyBpbiBgZ3JvdXBgIGZyb20gYWxsCiAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBlbnRyeQogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApLnZhbHVlcygpCiAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZSBvciBuYW1lID09IGVudHJ5Lm5hbWUKICAgICAgICApCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKICAgICAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGZvciBgcmVxdWlyZXNgIGFuZCBydW4gYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICAgICAgbnMuY2xlYXIoKQogICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgZm9yIG5vbi1kdXBsaWNhdGUgcHJvamVjdHMgaW4gdGhlIHdvcmtpbmcgc2V0CgogICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQogICAgICAgIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0ge30KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuZW50cnlfa2V5czoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBhIGNhY2hlIGlzc3VlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldID0gMQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuYnlfa2V5W2tleV0KCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHdvcmtpbmcgc2V0LCBhc3NvY2lhdGVkIHdpdGggYGVudHJ5YAoKICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCiAgICAgICAgT24gZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYGVudHJ5YCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nCiAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KCiAgICAgICAgYGRpc3RgIGlzIG9ubHkgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGlmIGl0J3MgZm9yIGEgcHJvamVjdCB0aGF0CiAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldCwgdW5sZXNzIGByZXBsYWNlPVRydWVgLgogICAgICAgIElmIGl0J3MgYWRkZWQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kCiAgICAgICAgd2lsbCBiZSBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaW5zZXJ0OgogICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5LCByZXBsYWNlPXJlcGxhY2UpCgogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJ5ID0gZGlzdC5sb2NhdGlvbgogICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAga2V5czIgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChkaXN0LmxvY2F0aW9uLCBbXSkKICAgICAgICBpZiBub3QgcmVwbGFjZSBhbmQgZGlzdC5rZXkgaW4gc2VsZi5ieV9rZXk6CiAgICAgICAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXM6CiAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzMjoKICAgICAgICAgICAga2V5czIuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMuICBgZW52YCwKICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCiAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQogICAgICAgIGVudHJ5IG9yIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQuICBgaW5zdGFsbGVyYCwgaWYgc3VwcGxpZWQsCiAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCiAgICAgICAgYGBOb25lYGAuCgogICAgICAgIFVubGVzcyBgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlYCwgcmFpc2VzIGEgVmVyc2lvbkNvbmZsaWN0IGV4Y2VwdGlvbgogICAgICAgIGlmCiAgICAgICAgYW55IHJlcXVpcmVtZW50cyBhcmUgZm91bmQgb24gdGhlIHBhdGggdGhhdCBoYXZlIHRoZSBjb3JyZWN0IG5hbWUgYnV0CiAgICAgICAgdGhlIHdyb25nIHZlcnNpb24uICBPdGhlcndpc2UsIGlmIGFuIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkIGl0IHdpbGwgYmUKICAgICAgICBpbnZva2VkIHRvIG9idGFpbiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgYWN0aXZhdGUKICAgICAgICBpdC4KCiAgICAgICAgYGV4dHJhc2AgaXMgYSBsaXN0IG9mIHRoZSBleHRyYXMgdG8gYmUgdXNlZCB3aXRoIHRoZXNlIHJlcXVpcmVtZW50cy4KICAgICAgICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGV4dHJhIHJlcXVpcmVtZW50cyBtYXkgbG9vayBsaWtlIGBteV9yZXE7CiAgICAgICAgZXh0cmEgPSAibXlfZXh0cmEiYCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVycHJldGVkIGFzIGEgcHVyZWx5CiAgICAgICAgb3B0aW9uYWwgcmVxdWlyZW1lbnQuICBJbnN0ZWFkLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYXNzZXJ0IHRoYXQgdGhlc2UKICAgICAgICByZXF1aXJlbWVudHMgYXJlIHRydWx5IHJlcXVpcmVkLgogICAgICAgICIiIgoKICAgICAgICAjIHNldCB1cCB0aGUgc3RhY2sKICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0KICAgICAgICAjIHNldCBvZiBwcm9jZXNzZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgcHJvY2Vzc2VkID0ge30KICAgICAgICAjIGtleSAtPiBkaXN0CiAgICAgICAgYmVzdCA9IHt9CiAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQoKICAgICAgICByZXFfZXh0cmFzID0gX1JlcUV4dHJhcygpCgogICAgICAgICMgTWFwcGluZyBvZiByZXF1aXJlbWVudCB0byBzZXQgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IHJlcXVpcmVkIGl0OwogICAgICAgICMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mbyBhYm91dCBjb25mbGljdHMuCiAgICAgICAgcmVxdWlyZWRfYnkgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCgogICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKICAgICAgICAgICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CiAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkKICAgICAgICAgICAgaWYgcmVxIGluIHByb2Nlc3NlZDoKICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm90IHJlcV9leHRyYXMubWFya2Vyc19wYXNzKHJlcSwgZXh0cmFzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXN0ID0gYmVzdC5nZXQocmVxLmtleSkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKICAgICAgICAgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZSBvciAoZGlzdCBub3QgaW4gcmVxIGFuZCByZXBsYWNlX2NvbmZsaWN0aW5nKToKICAgICAgICAgICAgICAgICAgICB3cyA9IHNlbGYKICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgYW4gZW1wdHkgZW52aXJvbm1lbnQgYW5kIHdvcmtpbmdzZXQgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IGZ1cnRoZXIgY29uZmxpY3RzIHdpdGggdGhlIGNvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoW10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaCgKICAgICAgICAgICAgICAgICAgICAgICAgcmVxLCB3cywgaW5zdGFsbGVyLAogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPXJlcGxhY2VfY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcnMgPSByZXF1aXJlZF9ieS5nZXQocmVxLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZChyZXEsIHJlcXVpcmVycykKICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICAjIE9vcHMsIHRoZSAiYmVzdCIgc28gZmFyIGNvbmZsaWN0cyB3aXRoIGEgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgZGVwZW5kZW50X3JlcSA9IHJlcXVpcmVkX2J5W3JlcV0KICAgICAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpLndpdGhfY29udGV4dChkZXBlbmRlbnRfcmVxKQoKICAgICAgICAgICAgIyBwdXNoIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9udG8gdGhlIHN0YWNrCiAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdCiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQobmV3X3JlcXVpcmVtZW50cykKCiAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIG5ldyByZXF1aXJlbWVudHMgbmVlZGVkIGJ5IHJlcQogICAgICAgICAgICBmb3IgbmV3X3JlcXVpcmVtZW50IGluIG5ld19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXF1aXJlZF9ieVtuZXdfcmVxdWlyZW1lbnRdLmFkZChyZXEucHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgcmVxX2V4dHJhc1tuZXdfcmVxdWlyZW1lbnRdID0gcmVxLmV4dHJhcwoKICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCgogICAgICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQogICAgICAgIHJldHVybiB0b19hY3RpdmF0ZQoKICAgIGRlZiBmaW5kX3BsdWdpbnMoCiAgICAgICAgICAgIHNlbGYsIHBsdWdpbl9lbnYsIGZ1bGxfZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLCBmYWxsYmFjaz1UcnVlKToKICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAoKICAgICAgICBFeGFtcGxlIHVzYWdlOjoKCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKICAgICAgICAgICAgICAgIEVudmlyb25tZW50KHBsdWdpbl9kaXJsaXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgICMgYWRkIHBsdWdpbnMrbGlicyB0byBzeXMucGF0aAogICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKQogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCiAgICAgICAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCcsIGVycm9ycykKCiAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKICAgICAgICBvbmx5IGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgaW4gdGhlIHByb2plY3QncyAicGx1Z2luIGRpcmVjdG9yeSIgb3IKICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCiAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgYGBXb3JraW5nU2V0YGAgdGhpcwogICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgoKICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQogICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAogICAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSBvbGRlciB2ZXJzaW9ucyBvZiBhIHBsdWdpbiBpZiB0aGUgbmV3ZXN0IHZlcnNpb24KICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSAyLXR1cGxlOiAoYGRpc3RyaWJ1dGlvbnNgLCBgZXJyb3JfaW5mb2ApLCB3aGVyZQogICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCiAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAogICAgICAgIHRvIHJlc29sdmUgdGhlaXIgZGVwZW5kZW5jaWVzLiAgYGVycm9yX2luZm9gIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaW5zdGFuY2UuCiAgICAgICAgIiIiCgogICAgICAgIHBsdWdpbl9wcm9qZWN0cyA9IGxpc3QocGx1Z2luX2VudikKICAgICAgICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCiAgICAgICAgcGx1Z2luX3Byb2plY3RzLnNvcnQoKQoKICAgICAgICBlcnJvcl9pbmZvID0ge30KICAgICAgICBkaXN0cmlidXRpb25zID0ge30KCiAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVudiA9IGZ1bGxfZW52ICsgcGx1Z2luX2VudgoKICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCiAgICAgICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikpCgogICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgoKICAgICAgICAgICAgICAgIHJlcSA9IFtkaXN0LmFzX3JlcXVpcmVtZW50KCldCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVlcyA9IHNoYWRvd19zZXQucmVzb2x2ZShyZXEsIGVudiwgaW5zdGFsbGVyKQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IgYXMgdjoKICAgICAgICAgICAgICAgICAgICAjIHNhdmUgZXJyb3IgaW5mbwogICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2CiAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ5IHRoZSBuZXh0IG9sZGVyIHZlcnNpb24gb2YgcHJvamVjdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCByZXNvbHZlZXMpKQogICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMudXBkYXRlKGRpY3QuZnJvbWtleXMocmVzb2x2ZWVzKSkKCiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQogICAgICAgIGRpc3RyaWJ1dGlvbnMuc29ydCgpCgogICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgKnJlcXVpcmVtZW50cyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAocG9zc2libHktbmVzdGVkKSBzZXF1ZW5jZQogICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCiAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKICAgICAgICBhY3RpdmF0ZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzOyBhbGwgcmVsZXZhbnQgZGlzdHJpYnV0aW9ucyBhcmUKICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCgogICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICAgICAgcmV0dXJuIG5lZWRlZAoKICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2ssIGV4aXN0aW5nPVRydWUpOgogICAgICAgICIiIkludm9rZSBgY2FsbGJhY2tgIGZvciBhbGwgZGlzdHJpYnV0aW9ucwoKICAgICAgICBJZiBgZXhpc3Rpbmc9VHJ1ZWAgKGRlZmF1bHQpLAogICAgICAgIGNhbGwgb24gYWxsIGV4aXN0aW5nIG9uZXMsIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnRyaWVzWzpdLCBzZWxmLmVudHJ5X2tleXMuY29weSgpLCBzZWxmLmJ5X2tleS5jb3B5KCksCiAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzWzpdCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZV9rX2JfYyk6CiAgICAgICAgZW50cmllcywga2V5cywgYnlfa2V5LCBjYWxsYmFja3MgPSBlX2tfYl9jCiAgICAgICAgc2VsZi5lbnRyaWVzID0gZW50cmllc1s6XQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IGtleXMuY29weSgpCiAgICAgICAgc2VsZi5ieV9rZXkgPSBieV9rZXkuY29weSgpCiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBjYWxsYmFja3NbOl0KCgpjbGFzcyBfUmVxRXh0cmFzKGRpY3QpOgogICAgIiIiCiAgICBNYXAgZWFjaCByZXF1aXJlbWVudCB0byB0aGUgZXh0cmFzIHRoYXQgZGVtYW5kZWQgaXQuCiAgICAiIiIKCiAgICBkZWYgbWFya2Vyc19wYXNzKHNlbGYsIHJlcSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEV2YWx1YXRlIG1hcmtlcnMgZm9yIHJlcSBhZ2FpbnN0IGVhY2ggZXh0cmEgdGhhdAogICAgICAgIGRlbWFuZGVkIGl0LgoKICAgICAgICBSZXR1cm4gRmFsc2UgaWYgdGhlIHJlcSBoYXMgYSBtYXJrZXIgYW5kIGZhaWxzCiAgICAgICAgZXZhbHVhdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gVHJ1ZS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9ldmFscyA9ICgKICAgICAgICAgICAgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5nZXQocmVxLCAoKSkgKyAoZXh0cmFzIG9yIChOb25lLCkpCiAgICAgICAgKQogICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlciBvciBhbnkoZXh0cmFfZXZhbHMpCgoKY2xhc3MgRW52aXJvbm1lbnQ6CiAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLAogICAgICAgICAgICBweXRob249UFlfTUFKT1IpOgogICAgICAgICIiIlNuYXBzaG90IGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIG9uIGEgc2VhcmNoIHBhdGgKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgoKICAgICAgICBgcGxhdGZvcm1gIGlzIGFuIG9wdGlvbmFsIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybQogICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCiAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KICAgICAgICBvcHRpb25hbCBzdHJpbmcgbmFtaW5nIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgUHl0aG9uIChlLmcuIGBgJzMuNidgYCk7CiAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgWW91IG1heSBleHBsaWNpdGx5IHNldCBgcGxhdGZvcm1gIChhbmQvb3IgYHB5dGhvbmApIHRvIGBgTm9uZWBgIGlmIHlvdQogICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCiAgICAgICAgc2VsZi5zY2FuKHNlYXJjaF9wYXRoKQoKICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIklzIGRpc3RyaWJ1dGlvbiBgZGlzdGAgYWNjZXB0YWJsZSBmb3IgdGhpcyBlbnZpcm9ubWVudD8KCiAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KICAgICAgICByZXF1aXJlbWVudHMgc3BlY2lmaWVkIHdoZW4gdGhpcyBlbnZpcm9ubWVudCB3YXMgY3JlYXRlZCwgb3IgRmFsc2UKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBweV9jb21wYXQgPSAoCiAgICAgICAgICAgIHNlbGYucHl0aG9uIGlzIE5vbmUKICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uIGlzIE5vbmUKICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uID09IHNlbGYucHl0aG9uCiAgICAgICAgKQogICAgICAgIHJldHVybiBweV9jb21wYXQgYW5kIGNvbXBhdGlibGVfcGxhdGZvcm1zKGRpc3QucGxhdGZvcm0sIHNlbGYucGxhdGZvcm0pCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcFtkaXN0LmtleV0ucmVtb3ZlKGRpc3QpCgogICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiU2NhbiBgc2VhcmNoX3BhdGhgIGZvciBkaXN0cmlidXRpb25zIHVzYWJsZSBpbiB0aGlzIGVudmlyb25tZW50CgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bwogICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCgogICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAoKICAgICAgICBVc2VzIGNhc2UtaW5zZW5zaXRpdmUgYHByb2plY3RfbmFtZWAgY29tcGFyaXNvbiwgYXNzdW1pbmcgYWxsIHRoZQogICAgICAgIHByb2plY3QncyBkaXN0cmlidXRpb25zIHVzZSB0aGVpciBwcm9qZWN0J3MgbmFtZSBjb252ZXJ0ZWQgdG8gYWxsCiAgICAgICAgbG93ZXJjYXNlIGFzIHRoZWlyIGtleS4KCiAgICAgICAgIiIiCiAgICAgICAgZGlzdHJpYnV0aW9uX2tleSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RtYXAuZ2V0KGRpc3RyaWJ1dGlvbl9rZXksIFtdKQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhZGRlZAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgICAgICAgICAgZGlzdHMuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgICAgICBkaXN0cy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdoYXNoY21wJyksIHJldmVyc2U9VHJ1ZSkKCiAgICBkZWYgYmVzdF9tYXRjaCgKICAgICAgICAgICAgc2VsZiwgcmVxLCB3b3JraW5nX3NldCwgaW5zdGFsbGVyPU5vbmUsIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCgogICAgICAgIFRoaXMgY2FsbHMgdGhlIGBgZmluZChyZXEpYGAgbWV0aG9kIG9mIHRoZSBgd29ya2luZ19zZXRgIHRvIHNlZSBpZiBhCiAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQogICAgICAgIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIGB3b3JraW5nX3NldGAuKSAgSWYgYSBzdWl0YWJsZSBkaXN0cmlidXRpb24KICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKICAgICAgICBkaXN0cmlidXRpb24gaXMgZm91bmQsIGFuZCBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmVzdWx0IG9mCiAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQogICAgICAgIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIGlmIG5vdCByZXBsYWNlX2NvbmZsaWN0aW5nOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZGlzdCA9IE5vbmUKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAjIHRyeSB0byBkb3dubG9hZC9pbnN0YWxsCiAgICAgICAgcmV0dXJuIHNlbGYub2J0YWluKHJlcSwgaW5zdGFsbGVyKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCAoZS5nLiB2aWEgZG93bmxvYWQpCgogICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQogICAgICAgIGJhc2UgYGBFbnZpcm9ubWVudGBgIGNsYXNzLCB0aGlzIHJvdXRpbmUganVzdCByZXR1cm5zCiAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCiAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKICAgICAgICB0byBhdHRlbXB0IG90aGVyIHdheXMgb2Ygb2J0YWluaW5nIGEgZGlzdHJpYnV0aW9uIGJlZm9yZSBmYWxsaW5nIGJhY2sKICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCiAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVyKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCB0aGUgdW5pcXVlIHByb2plY3QgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBkaXN0cmlidXRpb25zIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKICAgICAgICAgICAgaWYgc2VsZltrZXldOgogICAgICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRW52aXJvbm1lbnQpOgogICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgogICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgogICAgICAgICAgICBuZXcgKz0gZW52CiAgICAgICAgcmV0dXJuIG5ldwoKCiMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50CgoKY2xhc3MgRXh0cmFjdGlvbkVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKCiAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbjoKCiAgICBtYW5hZ2VyCiAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCByYWlzZWQgdGhpcyBleGNlcHRpb24KCiAgICBjYWNoZV9wYXRoCiAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciByZXNvdXJjZSBleHRyYWN0aW9uCgogICAgb3JpZ2luYWxfZXJyb3IKICAgICAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgY2F1c2VkIGV4dHJhY3Rpb24gdG8gZmFpbAogICAgIiIiCgoKY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgogICAgIiIiTWFuYWdlIHJlc291cmNlIGV4dHJhY3Rpb24gYW5kIHBhY2thZ2VzIiIiCiAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KCiAgICBkZWYgcmVzb3VyY2VfZXhpc3RzKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9pc2RpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyZWFtKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmluZygKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9saXN0ZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCgogICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgIENhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKQogICAgICAgICAgICB0byB0aGUgUHl0aG9uIGVnZyBjYWNoZToKCiAgICAgICAgICAgICAge29sZF9leGN9CgogICAgICAgICAgICBUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKCiAgICAgICAgICAgICAge2NhY2hlX3BhdGh9CgogICAgICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8KICAgICAgICAgICAgWW91IGNhbiBjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFCiAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgogICAgICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIGVyci5tYW5hZ2VyID0gc2VsZgogICAgICAgIGVyci5jYWNoZV9wYXRoID0gY2FjaGVfcGF0aAogICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKICAgICAgICByYWlzZSBlcnIKCiAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CiAgICAgICAgIiIiUmV0dXJuIGFic29sdXRlIGxvY2F0aW9uIGluIGNhY2hlIGZvciBgYXJjaGl2ZV9uYW1lYCBhbmQgYG5hbWVzYAoKICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKICAgICAgICBub3QgYWxyZWFkeSBleGlzdC4gIGBhcmNoaXZlX25hbWVgIHNob3VsZCBiZSB0aGUgYmFzZSBmaWxlbmFtZSBvZiB0aGUKICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAogICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQogICAgICAgIHNlcXVlbmNlIG9mIHBhdGggbmFtZSBwYXJ0cyAidW5kZXIiIHRoZSBlZ2cncyBleHRyYWN0aW9uIGxvY2F0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwogICAgICAgIG9idGFpbiBhbiBleHRyYWN0aW9uIGxvY2F0aW9uLCBhbmQgb25seSBmb3IgbmFtZXMgdGhleSBpbnRlbmQgdG8KICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBleHRyYWN0X3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCiAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUgKyAnLXRtcCcsICpuYW1lcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBzZWxmLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICBzZWxmLl93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdF9wYXRoKQoKICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCiAgICAgICAgcmV0dXJuIHRhcmdldF9wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBwYXRoIGlzIG92ZXJyaWRkZW4gYW5kIHNldCB0byBhbiBpbnNlY3VyZQogICAgICAgIGxvY2F0aW9uLCBzdWNoIGFzIC90bXAsIGl0IG9wZW5zIHVwIGFuIG9wcG9ydHVuaXR5IGZvciBhbiBhdHRhY2tlciB0bwogICAgICAgIHJlcGxhY2UgYW4gZXh0cmFjdGVkIGZpbGUgd2l0aCBhbiB1bmF1dGhvcml6ZWQgcGF5bG9hZC4gV2FybiB0aGUgdXNlcgogICAgICAgIGlmIGEga25vd24gaW5zZWN1cmUgbG9jYXRpb24gaXMgdXNlZC4KCiAgICAgICAgU2VlIERpc3RyaWJ1dGUgIzM3NSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgbm90IHBhdGguc3RhcnRzd2l0aChvcy5lbnZpcm9uWyd3aW5kaXInXSk6CiAgICAgICAgICAgICMgT24gV2luZG93cywgcGVybWlzc2lvbnMgYXJlIGdlbmVyYWxseSByZXN0cmljdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgICAgICMgIGFuZCB0ZW1wIGRpcmVjdG9yaWVzIGFyZSBub3Qgd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMsIHNvCiAgICAgICAgICAgICMgIGJ5cGFzcyB0aGUgd2FybmluZy4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbW9kZSA9IG9zLnN0YXQocGF0aCkuc3RfbW9kZQogICAgICAgIGlmIG1vZGUgJiBzdGF0LlNfSVdPVEggb3IgbW9kZSAmIHN0YXQuU19JV0dSUDoKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIiVzIGlzIHdyaXRhYmxlIGJ5IGdyb3VwL290aGVycyBhbmQgdnVsbmVyYWJsZSB0byBhdHRhY2sgIgogICAgICAgICAgICAgICAgIndoZW4gIgogICAgICAgICAgICAgICAgInVzZWQgd2l0aCBnZXRfcmVzb3VyY2VfZmlsZW5hbWUuIENvbnNpZGVyIGEgbW9yZSBzZWN1cmUgIgogICAgICAgICAgICAgICAgImxvY2F0aW9uIChzZXQgd2l0aCAuc2V0X2V4dHJhY3Rpb25fcGF0aCBvciB0aGUgIgogICAgICAgICAgICAgICAgIlBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQgdmFyaWFibGUpLiIgJSBwYXRoCiAgICAgICAgICAgICkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQoKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCB0ZW1wbmFtZSwgZmlsZW5hbWUpOgogICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKCiAgICAgICAgVGhpcyBpcyB3aGVyZSBNYWMgaGVhZGVyIHJld3JpdGVzIHNob3VsZCBiZSBkb25lOyBvdGhlciBwbGF0Zm9ybXMgZG9uJ3QKICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCgogICAgICAgIFJlc291cmNlIHByb3ZpZGVycyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBPTkxZIGFmdGVyIHN1Y2Nlc3NmdWxseQogICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcwogICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCgogICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKICAgICAgICByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVzb3VyY2UgZXhlY3V0YWJsZQogICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KHRlbXBuYW1lKS5zdF9tb2RlKSB8IDBvNTU1KSAmIDBvNzc3NwogICAgICAgICAgICBvcy5jaG1vZCh0ZW1wbmFtZSwgbW9kZSkKCiAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KCiAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQogICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAogICAgICAgIGlzIGJhc2VkIG9uIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2l0aCB2YXJpb3VzCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKICAgICAgICBkZXRhaWxzLikKCiAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCiAgICAgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYnV0IHRoZW4geW91IG11c3QgY2FsbCBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB0bwogICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgoKICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgLikKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKCiAgICBkZWYgY2xlYW51cF9yZXNvdXJjZXMoc2VsZiwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAogICAgICAgIG9mIHRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgdGhhdCBjb3VsZCBub3QgYmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IGV4Y2x1c2l2ZSB0byBhIHNpbmdsZSBwcm9jZXNzLiAgVGhpcyBtZXRob2QgaXMgbm90CiAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgogICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgdXNlZCBmb3IgZXh0cmFjdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFgKCgpkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgb3IgYSBwbGF0Zm9ybS1yZWxldmFudCB1c2VyIGNhY2hlIGRpciBmb3IgYW4gYXBwCiAgICBuYW1lZCAiUHl0aG9uLUVnZ3MiLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIG9zLmVudmlyb24uZ2V0KCdQWVRIT05fRUdHX0NBQ0hFJykKICAgICAgICBvciBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9J1B5dGhvbi1FZ2dzJykKICAgICkKCgpkZWYgc2FmZV9uYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQoKCmRlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiIKICAgIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgdmVyc2lvbgogICAgICAgIHJldHVybiBzdHIocGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbih2ZXJzaW9uKSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywgJy4nKQogICAgICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQoKCmRlZiBzYWZlX2V4dHJhKGV4dHJhKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnXycsCiAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuLV0rJywgJ18nLCBleHRyYSkubG93ZXIoKQoKCmRlZiB0b19maWxlbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCgogICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCiAgICAiIiIKICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgoKZGVmIGludmFsaWRfbWFya2VyKHRleHQpOgogICAgIiIiCiAgICBWYWxpZGF0ZSB0ZXh0IGFzIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXI7IHJldHVybiBhbiBleGNlcHRpb24KICAgIGlmIGludmFsaWQgb3IgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZXZhbHVhdGVfbWFya2VyKHRleHQpCiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKICAgICAgICBlLmZpbGVuYW1lID0gTm9uZQogICAgICAgIGUubGluZW5vID0gTm9uZQogICAgICAgIHJldHVybiBlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZXZhbHVhdGVfbWFya2VyKHRleHQsIGV4dHJhPU5vbmUpOgogICAgIiIiCiAgICBFdmFsdWF0ZSBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyLgogICAgUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgcmVzdWx0IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgICBSYWlzZSBTeW50YXhFcnJvciBpZiBtYXJrZXIgaXMgaW52YWxpZC4KCiAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICdweXBhcnNpbmcnIG1vZHVsZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIG1hcmtlciA9IHBhY2thZ2luZy5tYXJrZXJzLk1hcmtlcih0ZXh0KQogICAgICAgIHJldHVybiBtYXJrZXIuZXZhbHVhdGUoKQogICAgZXhjZXB0IHBhY2thZ2luZy5tYXJrZXJzLkludmFsaWRNYXJrZXIgYXMgZToKICAgICAgICByYWlzZSBTeW50YXhFcnJvcihlKQoKCmNsYXNzIE51bGxQcm92aWRlcjoKICAgICIiIlRyeSB0byBpbXBsZW1lbnQgcmVzb3VyY2VzIGFuZCBtZXRhZGF0YSBmb3IgYXJiaXRyYXJ5IFBFUCAzMDIgbG9hZGVycyIiIgoKICAgIGVnZ19uYW1lID0gTm9uZQogICAgZWdnX2luZm8gPSBOb25lCiAgICBsb2FkZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgX2dldF9tZXRhZGF0YV9wYXRoKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKQoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvCgogICAgICAgIHBhdGggPSBzZWxmLl9nZXRfbWV0YWRhdGFfcGF0aChuYW1lKQogICAgICAgIHJldHVybiBzZWxmLl9oYXMocGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICBwYXRoID0gc2VsZi5fZ2V0X21ldGFkYXRhX3BhdGgobmFtZSkKICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldChwYXRoKQogICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZSgndXRmLTgnKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAjIEluY2x1ZGUgdGhlIHBhdGggaW4gdGhlIGVycm9yIG1lc3NhZ2UgdG8gc2ltcGxpZnkKICAgICAgICAgICAgIyB0cm91Ymxlc2hvb3RpbmcsIGFuZCB3aXRob3V0IGNoYW5naW5nIHRoZSBleGNlcHRpb24gdHlwZS4KICAgICAgICAgICAgZXhjLnJlYXNvbiArPSAnIGluIHt9IGZpbGUgYXQgcGF0aDoge30nLmZvcm1hdChuYW1lLCBwYXRoKQogICAgICAgICAgICByYWlzZQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUKICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKAogICAgICAgICAgICAgICAgIlNjcmlwdCB7c2NyaXB0IXJ9IG5vdCBmb3VuZCBpbiBtZXRhZGF0YSBhdCB7c2VsZi5lZ2dfaW5mbyFyfSIKICAgICAgICAgICAgICAgIC5mb3JtYXQoKipsb2NhbHMoKSksCiAgICAgICAgICAgICkKICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsICdcbicpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsICdcbicpCiAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgc2NyaXB0KQogICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oc2NyaXB0X2ZpbGVuYW1lKS5yZWFkKCkKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcm9tIGxpbmVjYWNoZSBpbXBvcnQgY2FjaGUKICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKHNjcmlwdF9jb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2ZuKHNlbGYsIGJhc2UsIHJlc291cmNlX25hbWUpOgogICAgICAgIHNlbGYuX3ZhbGlkYXRlX3Jlc291cmNlX3BhdGgocmVzb3VyY2VfbmFtZSkKICAgICAgICBpZiByZXNvdXJjZV9uYW1lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZV9uYW1lLnNwbGl0KCcvJykpCiAgICAgICAgcmV0dXJuIGJhc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3ZhbGlkYXRlX3Jlc291cmNlX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgVmFsaWRhdGUgdGhlIHJlc291cmNlIHBhdGhzIGFjY29yZGluZyB0byB0aGUgZG9jcy4KICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3BrZ19yZXNvdXJjZXMuaHRtbCNiYXNpYy1yZXNvdXJjZS1hY2Nlc3MKCiAgICAgICAgPj4+IHdhcm5lZCA9IGdldGZpeHR1cmUoJ3JlY3dhcm4nKQogICAgICAgID4+PiB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycpCiAgICAgICAgPj4+IHZycCA9IE51bGxQcm92aWRlci5fdmFsaWRhdGVfcmVzb3VyY2VfcGF0aAogICAgICAgID4+PiB2cnAoJ2Zvby9iYXIudHh0JykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgRmFsc2UKICAgICAgICA+Pj4gdnJwKCcuLi9mb28vYmFyLnR4dCcpCiAgICAgICAgPj4+IGJvb2wod2FybmVkKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gd2FybmVkLmNsZWFyKCkKICAgICAgICA+Pj4gdnJwKCcvZm9vL2Jhci50eHQnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHZycCgnZm9vLy4uLy4uL2Jhci50eHQnKQogICAgICAgID4+PiBib29sKHdhcm5lZCkKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHdhcm5lZC5jbGVhcigpCiAgICAgICAgPj4+IHZycCgnZm9vL2YuLi9iYXIudHh0JykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgRmFsc2UKCiAgICAgICAgV2luZG93cyBwYXRoIHNlcGFyYXRvcnMgYXJlIHN0cmFpZ2h0LXVwIGRpc2FsbG93ZWQuCiAgICAgICAgPj4+IHZycChyJ1xcZm9vL2Jhci50eHQnKQogICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAuLi4KICAgICAgICBWYWx1ZUVycm9yOiBVc2Ugb2YgLi4gb3IgYWJzb2x1dGUgcGF0aCBpbiBhIHJlc291cmNlIHBhdGggXAppcyBub3QgYWxsb3dlZC4KCiAgICAgICAgPj4+IHZycChyJ0M6XFxmb28vYmFyLnR4dCcpCiAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgIC4uLgogICAgICAgIFZhbHVlRXJyb3I6IFVzZSBvZiAuLiBvciBhYnNvbHV0ZSBwYXRoIGluIGEgcmVzb3VyY2UgcGF0aCBcCmlzIG5vdCBhbGxvd2VkLgoKICAgICAgICBCbGFuayB2YWx1ZXMgYXJlIGFsbG93ZWQKCiAgICAgICAgPj4+IHZycCgnJykKICAgICAgICA+Pj4gYm9vbCh3YXJuZWQpCiAgICAgICAgRmFsc2UKCiAgICAgICAgTm9uLXN0cmluZyB2YWx1ZXMgYXJlIG5vdC4KCiAgICAgICAgPj4+IHZycChOb25lKQogICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAuLi4KICAgICAgICBBdHRyaWJ1dGVFcnJvcjogLi4uCiAgICAgICAgIiIiCiAgICAgICAgaW52YWxpZCA9ICgKICAgICAgICAgICAgb3MucGF0aC5wYXJkaXIgaW4gcGF0aC5zcGxpdChwb3NpeHBhdGguc2VwKSBvcgogICAgICAgICAgICBwb3NpeHBhdGguaXNhYnMocGF0aCkgb3IKICAgICAgICAgICAgbnRwYXRoLmlzYWJzKHBhdGgpCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpbnZhbGlkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbXNnID0gIlVzZSBvZiAuLiBvciBhYnNvbHV0ZSBwYXRoIGluIGEgcmVzb3VyY2UgcGF0aCBpcyBub3QgYWxsb3dlZC4iCgogICAgICAgICMgQWdncmVzc2l2ZWx5IGRpc2FsbG93IFdpbmRvd3MgYWJzb2x1dGUgcGF0aHMKICAgICAgICBpZiBudHBhdGguaXNhYnMocGF0aCkgYW5kIG5vdCBwb3NpeHBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnKQoKICAgICAgICAjIGZvciBjb21wYXRpYmlsaXR5LCB3YXJuOyBpbiBmdXR1cmUKICAgICAgICAjIHJhaXNlIFZhbHVlRXJyb3IobXNnKQogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgIG1zZ1s6LTFdICsgIiBhbmQgd2lsbCByYWlzZSBleGNlcHRpb25zIGluIGEgZnV0dXJlIHJlbGVhc2UuIiwKICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICBzdGFja2xldmVsPTQsCiAgICAgICAgKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocGF0aCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKICAgICAgICApCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCgoKY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKICAgIGRlZiBfc2V0dXBfcHJlZml4KHNlbGYpOgogICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgogICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQogICAgICAgIHBhdGggPSBzZWxmLm1vZHVsZV9wYXRoCiAgICAgICAgb2xkID0gTm9uZQogICAgICAgIHdoaWxlIHBhdGggIT0gb2xkOgogICAgICAgICAgICBpZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfcm9vdCA9IHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG9sZCA9IHBhdGgKICAgICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKCgpjbGFzcyBEZWZhdWx0UHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlZ2lzdGVyKGNscyk6CiAgICAgICAgbG9hZGVyX25hbWVzID0gJ1NvdXJjZUZpbGVMb2FkZXInLCAnU291cmNlbGVzc0ZpbGVMb2FkZXInLAogICAgICAgIGZvciBuYW1lIGluIGxvYWRlcl9uYW1lczoKICAgICAgICAgICAgbG9hZGVyX2NscyA9IGdldGF0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgbmFtZSwgdHlwZShOb25lKSkKICAgICAgICAgICAgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX2NscywgY2xzKQoKCkRlZmF1bHRQcm92aWRlci5fcmVnaXN0ZXIoKQoKCmNsYXNzIEVtcHR5UHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKCiAgICBtb2R1bGVfcGF0aCA9IE5vbmUKCiAgICBfaXNkaXIgPSBfaGFzID0gbGFtYmRhIHNlbGYsIHBhdGg6IEZhbHNlCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgoKZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKCgpjbGFzcyBaaXBNYW5pZmVzdHMoZGljdCk6CiAgICAiIiIKICAgIHppcCBtYW5pZmVzdCBidWlsZGVyCiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBidWlsZChjbHMsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgZGljdGlvbmFyeSBzaW1pbGFyIHRvIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgY2FjaGVzLCBleGNlcHQgaW5zdGVhZCBvZiB0dXBsZXMsIHN0b3JlIFppcEluZm8gb2JqZWN0cy4KCiAgICAgICAgVXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IgKG9zLnNlcCkgZm9yIHRoZSBwYXRoIGtleXMKICAgICAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHB5cHkgb24gV2luZG93cy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShwYXRoKSBhcyB6ZmlsZToKICAgICAgICAgICAgaXRlbXMgPSAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmFtZS5yZXBsYWNlKCcvJywgb3Muc2VwKSwKICAgICAgICAgICAgICAgICAgICB6ZmlsZS5nZXRpbmZvKG5hbWUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gemZpbGUubmFtZWxpc3QoKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBkaWN0KGl0ZW1zKQoKICAgIGxvYWQgPSBidWlsZAoKCmNsYXNzIE1lbW9pemVkWmlwTWFuaWZlc3RzKFppcE1hbmlmZXN0cyk6CiAgICAiIiIKICAgIE1lbW9pemVkIHppcGZpbGUgbWFuaWZlc3RzLgogICAgIiIiCiAgICBtYW5pZmVzdF9tb2QgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdtYW5pZmVzdF9tb2QnLCAnbWFuaWZlc3QgbXRpbWUnKQoKICAgIGRlZiBsb2FkKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIExvYWQgYSBtYW5pZmVzdCBhdCBwYXRoIG9yIHJldHVybiBhIHN1aXRhYmxlIG1hbmlmZXN0IGFscmVhZHkgbG9hZGVkLgogICAgICAgICIiIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCiAgICAgICAgbXRpbWUgPSBvcy5zdGF0KHBhdGgpLnN0X210aW1lCgogICAgICAgIGlmIHBhdGggbm90IGluIHNlbGYgb3Igc2VsZltwYXRoXS5tdGltZSAhPSBtdGltZToKICAgICAgICAgICAgbWFuaWZlc3QgPSBzZWxmLmJ1aWxkKHBhdGgpCiAgICAgICAgICAgIHNlbGZbcGF0aF0gPSBzZWxmLm1hbmlmZXN0X21vZChtYW5pZmVzdCwgbXRpbWUpCgogICAgICAgIHJldHVybiBzZWxmW3BhdGhdLm1hbmlmZXN0CgoKY2xhc3MgWmlwUHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUmVzb3VyY2Ugc3VwcG9ydCBmb3IgemlwcyBhbmQgZWdncyIiIgoKICAgIGVhZ2VycyA9IE5vbmUKICAgIF96aXBfbWFuaWZlc3RzID0gTWVtb2l6ZWRaaXBNYW5pZmVzdHMoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIEVnZ1Byb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLnppcF9wcmUgPSBzZWxmLmxvYWRlci5hcmNoaXZlICsgb3Muc2VwCgogICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhIHppcGZpbGUgc3VicGF0aAogICAgICAgICMgdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQogICAgICAgIGZzcGF0aCA9IGZzcGF0aC5yc3RyaXAob3Muc2VwKQogICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICByZXR1cm4gJycKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICkKCiAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QuCiAgICAgICAgIyBwc2V1ZG8tZnMgcGF0aAogICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgemlwaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5femlwX21hbmlmZXN0cy5sb2FkKHNlbGYubG9hZGVyLmFyY2hpdmUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgICAgICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QgLnppcCIKICAgICAgICAgICAgKQogICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwogICAgICAgIHppcF9wYXRoID0gc2VsZi5fcmVzb3VyY2VfdG9femlwKHJlc291cmNlX25hbWUpCiAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCiAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGVhZ2VyczoKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQogICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2RhdGVfYW5kX3NpemUoemlwX3N0YXQpOgogICAgICAgIHNpemUgPSB6aXBfc3RhdC5maWxlX3NpemUKICAgICAgICAjIHltZGhtcyt3ZGF5LCB5ZGF5LCBkc3QKICAgICAgICBkYXRlX3RpbWUgPSB6aXBfc3RhdC5kYXRlX3RpbWUgKyAoMCwgMCwgLTEpCiAgICAgICAgIyAxOTgwIG9mZnNldCBhbHJlYWR5IGRvbmUKICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCwgc2l6ZQoKICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CgogICAgICAgIGlmIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgogICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciwgb3MucGF0aC5qb2luKHppcF9wYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUobGFzdCkKCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKCiAgICAgICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5yZW5hbWUiIGFuZCAib3MudW5saW5rIiBhcmUgbm90IHN1cHBvcnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHRoaXMgcGxhdGZvcm0nKQogICAgICAgIHRyeToKCiAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKAogICAgICAgICAgICAgICAgIi4kZXh0cmFjdCIsCiAgICAgICAgICAgICAgICBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3Mud3JpdGUob3V0Ziwgc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpKQogICAgICAgICAgICBvcy5jbG9zZShvdXRmKQogICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsIHRpbWVzdGFtcCkpCiAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgYmVjYW1lIGN1cnJlbnQgc2luY2UgaXQgd2FzIGNoZWNrZWQgYWJvdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICMgIHNvIHByb2NlZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgogICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgZGVmIF9pc19jdXJyZW50KHNlbGYsIGZpbGVfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBmaWxlX3BhdGggaXMgY3VycmVudCBmb3IgdGhpcyB6aXBfcGF0aAogICAgICAgICIiIgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHN0YXQgPSBvcy5zdGF0KGZpbGVfcGF0aCkKICAgICAgICBpZiBzdGF0LnN0X3NpemUgIT0gc2l6ZSBvciBzdGF0LnN0X210aW1lICE9IHRpbWVzdGFtcDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBtYXRjaAogICAgICAgIHppcF9jb250ZW50cyA9IHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKQogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHJldHVybiB6aXBfY29udGVudHMgPT0gZmlsZV9jb250ZW50cwoKICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgogICAgICAgICAgICBlYWdlcnMgPSBbXQogICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgICAgICBlYWdlcnMuZXh0ZW5kKHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpKQogICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycwogICAgICAgIHJldHVybiBzZWxmLmVhZ2VycwoKICAgIGRlZiBfaW5kZXgoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZGlyaW5kZXgKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGluZCA9IHt9CiAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuemlwaW5mbzoKICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBvcy5zZXAuam9pbihwYXJ0c1s6LTFdKQogICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCiAgICAgICAgICAgIHNlbGYuX2RpcmluZGV4ID0gaW5kCiAgICAgICAgICAgIHJldHVybiBpbmQKCiAgICBkZWYgX2hhcyhzZWxmLCBmc3BhdGgpOgogICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9pbmRleCgpLmdldChzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSwgKCkpKQoKICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIF9yZXNvdXJjZV90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIFppcFByb3ZpZGVyKQoKCmNsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIGhhbmRsZXIgZm9yIHN0YW5kYWxvbmUgUEtHLUlORk8gZmlsZXMKCiAgICBVc2FnZTo6CgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCgogICAgVGhpcyBwcm92aWRlciByZWplY3RzIGFsbCBkYXRhIGFuZCBtZXRhZGF0YSByZXF1ZXN0cyBleGNlcHQgZm9yIFBLRy1JTkZPLAogICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CiAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBfZ2V0X21ldGFkYXRhX3BhdGgoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYucGF0aAoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJ1BLRy1JTkZPJyBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSAhPSAnUEtHLUlORk8nOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLnBhdGgsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0icmVwbGFjZSIpIGFzIGY6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZi5yZWFkKCkKICAgICAgICBzZWxmLl93YXJuX29uX3JlcGxhY2VtZW50KG1ldGFkYXRhKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfd2Fybl9vbl9yZXBsYWNlbWVudChzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIyBQeXRob24gMi43IGNvbXBhdCBmb3I6IHJlcGxhY2VtZW50X2NoYXIgPSAn77+9JwogICAgICAgIHJlcGxhY2VtZW50X2NoYXIgPSBiJ1x4ZWZceGJmXHhiZCcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcmVwbGFjZW1lbnRfY2hhciBpbiBtZXRhZGF0YToKICAgICAgICAgICAgdG1wbCA9ICJ7c2VsZi5wYXRofSBjb3VsZCBub3QgYmUgcHJvcGVybHkgZGVjb2RlZCBpbiBVVEYtOCIKICAgICAgICAgICAgbXNnID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgoKY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgZWdnIGRpcmVjdG9yaWVzCgogICAgVXNhZ2U6OgoKICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CgogICAgICAgIGVnZ19pbmZvID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLmVnZy1pbmZvIgogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKICAgICAgICBkaXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZWdnX2luZm8pKVswXQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpciwgcHJvamVjdF9uYW1lPWRpc3RfbmFtZSwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgoKICAgICAgICBlZ2dfcGF0aCA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS12ZXItcHl2ZXItZXRjLmVnZyIKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZWdnX2luZm8pOgogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCgoKY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIC5lZ2cgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgogICAgICAgICIiIkNyZWF0ZSBhIG1ldGFkYXRhIHByb3ZpZGVyIGZyb20gYSB6aXBpbXBvcnRlciIiIgoKICAgICAgICBzZWxmLnppcF9wcmUgPSBpbXBvcnRlci5hcmNoaXZlICsgb3Muc2VwCiAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgogICAgICAgIGlmIGltcG9ydGVyLnByZWZpeDoKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IGltcG9ydGVyLmFyY2hpdmUKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzPXt9KQoKCmRlZiByZWdpc3Rlcl9maW5kZXIoaW1wb3J0ZXJfdHlwZSwgZGlzdHJpYnV0aW9uX2ZpbmRlcik6CiAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCiAgICB0aGF0IHBhdGggaXRlbS4gIFNlZSBgYHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoYGAgZm9yIGFuIGV4YW1wbGUuIiIiCiAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCgoKZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQogICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQoKCmRlZiBmaW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiCiAgICBGaW5kIGVnZ3MgaW4gemlwIGZpbGVzOyBwb3NzaWJseSBtdWx0aXBsZSBuZXN0ZWQgZWdncy4KICAgICIiIgogICAgaWYgaW1wb3J0ZXIuYXJjaGl2ZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICMgd2hlZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaW5kZXIKICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSBQS0ctSU5GTyBtZXRhZGF0YSwgYW5kIHdvbid0IGV2ZXIgY29udGFpbiBlZ2dzCiAgICAgICAgcmV0dXJuCiAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKGltcG9ydGVyKQogICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCiAgICBpZiBvbmx5OgogICAgICAgICMgZG9uJ3QgeWllbGQgbmVzdGVkIGRpc3Ryb3MKICAgICAgICByZXR1cm4KICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJycpOgogICAgICAgIGlmIF9pc19lZ2dfcGF0aChzdWJpdGVtKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIGRpc3RzID0gZmluZF9lZ2dzX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIGVsaWYgc3ViaXRlbS5sb3dlcigpLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBzdWJtZXRhID0gRWdnTWV0YWRhdGEoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpKQogICAgICAgICAgICBzdWJtZXRhLmVnZ19pbmZvID0gc3VicGF0aAogICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbihwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCgoKcmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmluZF9lZ2dzX2luX3ppcCkKCgpkZWYgZmluZF9ub3RoaW5nKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgcmV0dXJuICgpCgoKcmVnaXN0ZXJfZmluZGVyKG9iamVjdCwgZmluZF9ub3RoaW5nKQoKCmRlZiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKToKICAgICIiIgogICAgR2l2ZW4gYSBsaXN0IG9mIGZpbGVuYW1lcywgcmV0dXJuIHRoZW0gaW4gZGVzY2VuZGluZyBvcmRlcgogICAgYnkgdmVyc2lvbiBudW1iZXIuCgogICAgPj4+IG5hbWVzID0gJ2JhcicsICdmb28nLCAnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJywgJ2ZvbycsICdiYXInXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgICIiIgogICAgZGVmIF9ieV92ZXJzaW9uKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGVhY2ggY29tcG9uZW50IG9mIHRoZSBmaWxlbmFtZQogICAgICAgICIiIgogICAgICAgIG5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbihuYW1lLnNwbGl0KCctJyksIFtleHRdKQogICAgICAgIHJldHVybiBbcGFja2FnaW5nLnZlcnNpb24ucGFyc2UocGFydCkgZm9yIHBhcnQgaW4gcGFydHNdCgogICAgcmV0dXJuIHNvcnRlZChuYW1lcywga2V5PV9ieV92ZXJzaW9uLCByZXZlcnNlPVRydWUpCgoKZGVmIGZpbmRfb25fcGF0aChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSBvbiBhIHN5cy5wYXRoIGRpcmVjdG9yeSIiIgogICAgcGF0aF9pdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQocGF0aF9pdGVtKQoKICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aF9pdGVtKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKICAgICAgICAgICAgcGF0aF9pdGVtLCBtZXRhZGF0YT1QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sICdFR0ctSU5GTycpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgZW50cmllcyA9IHNhZmVfbGlzdGRpcihwYXRoX2l0ZW0pCgogICAgIyBmb3IgcGVyZm9ybWFuY2UsIGJlZm9yZSBzb3J0aW5nIGJ5IHZlcnNpb24sCiAgICAjIHNjcmVlbiBlbnRyaWVzIGZvciBvbmx5IHRob3NlIHRoYXQgd2lsbCB5aWVsZAogICAgIyBkaXN0cmlidXRpb25zCiAgICBmaWx0ZXJlZCA9ICgKICAgICAgICBlbnRyeQogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzCiAgICAgICAgaWYgZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpCiAgICApCgogICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CiAgICBwYXRoX2l0ZW1fZW50cmllcyA9IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcoZmlsdGVyZWQpCiAgICBmb3IgZW50cnkgaW4gcGF0aF9pdGVtX2VudHJpZXM6CiAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKICAgICAgICBmYWN0b3J5ID0gZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmFjdG9yeShmdWxscGF0aCk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpkZWYgZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaXN0X2ZhY3RvcnkgZm9yIGEgcGF0aF9pdGVtIGFuZCBlbnRyeQogICAgIiIiCiAgICBsb3dlciA9IGVudHJ5Lmxvd2VyKCkKICAgIGlzX21ldGEgPSBhbnkobWFwKGxvd2VyLmVuZHN3aXRoLCAoJy5lZ2ctaW5mbycsICcuZGlzdC1pbmZvJykpKQogICAgcmV0dXJuICgKICAgICAgICBkaXN0cmlidXRpb25zX2Zyb21fbWV0YWRhdGEKICAgICAgICBpZiBpc19tZXRhIGVsc2UKICAgICAgICBmaW5kX2Rpc3RyaWJ1dGlvbnMKICAgICAgICBpZiBub3Qgb25seSBhbmQgX2lzX2VnZ19wYXRoKGVudHJ5KSBlbHNlCiAgICAgICAgcmVzb2x2ZV9lZ2dfbGluawogICAgICAgIGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJykgZWxzZQogICAgICAgIE5vRGlzdHMoKQogICAgKQoKCmNsYXNzIE5vRGlzdHM6CiAgICAiIiIKICAgID4+PiBib29sKE5vRGlzdHMoKSkKICAgIEZhbHNlCgogICAgPj4+IGxpc3QoTm9EaXN0cygpKCdhbnl0aGluZycpKQogICAgW10KICAgICIiIgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgaWYgc2l4LlBZMjoKICAgICAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bGxwYXRoKToKICAgICAgICByZXR1cm4gaXRlcigoKSkKCgpkZWYgc2FmZV9saXN0ZGlyKHBhdGgpOgogICAgIiIiCiAgICBBdHRlbXB0IHRvIGxpc3QgY29udGVudHMgb2YgcGF0aCwgYnV0IHN1cHByZXNzIHNvbWUgZXhjZXB0aW9ucy4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCiAgICBleGNlcHQgKFBlcm1pc3Npb25FcnJvciwgTm90QURpcmVjdG9yeUVycm9yKToKICAgICAgICBwYXNzCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICMgSWdub3JlIHRoZSBkaXJlY3RvcnkgaWYgZG9lcyBub3QgZXhpc3QsIG5vdCBhIGRpcmVjdG9yeSBvcgogICAgICAgICMgcGVybWlzc2lvbiBkZW5pZWQKICAgICAgICBpZ25vcmFibGUgPSAoCiAgICAgICAgICAgIGUuZXJybm8gaW4gKGVycm5vLkVOT1RESVIsIGVycm5vLkVBQ0NFUywgZXJybm8uRU5PRU5UKQogICAgICAgICAgICAjIFB5dGhvbiAyIG9uIFdpbmRvd3MgbmVlZHMgdG8gYmUgaGFuZGxlZCB0aGlzIHdheSA6KAogICAgICAgICAgICBvciBnZXRhdHRyKGUsICJ3aW5lcnJvciIsIE5vbmUpID09IDI2NwogICAgICAgICkKICAgICAgICBpZiBub3QgaWdub3JhYmxlOgogICAgICAgICAgICByYWlzZQogICAgcmV0dXJuICgpCgoKZGVmIGRpc3RyaWJ1dGlvbnNfZnJvbV9tZXRhZGF0YShwYXRoKToKICAgIHJvb3QgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgaWYgbGVuKG9zLmxpc3RkaXIocGF0aCkpID09IDA6CiAgICAgICAgICAgICMgZW1wdHkgbWV0YWRhdGEgZGlyOyBza2lwCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKHJvb3QsIHBhdGgpCiAgICBlbHNlOgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKHBhdGgpCiAgICBlbnRyeSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgIHJvb3QsIGVudHJ5LCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1ERVZFTE9QX0RJU1QsCiAgICApCgoKZGVmIG5vbl9lbXB0eV9saW5lcyhwYXRoKToKICAgICIiIgogICAgWWllbGQgbm9uLWVtcHR5IGxpbmVzIGZyb20gZmlsZSBhdCBwYXRoCiAgICAiIiIKICAgIHdpdGggb3BlbihwYXRoKSBhcyBmOgogICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCgpkZWYgcmVzb2x2ZV9lZ2dfbGluayhwYXRoKToKICAgICIiIgogICAgR2l2ZW4gYSBwYXRoIHRvIGFuIC5lZ2ctbGluaywgcmVzb2x2ZSBkaXN0cmlidXRpb25zCiAgICBwcmVzZW50IGluIHRoZSByZWZlcmVuY2VkIHBhdGguCiAgICAiIiIKICAgIHJlZmVyZW5jZWRfcGF0aHMgPSBub25fZW1wdHlfbGluZXMocGF0aCkKICAgIHJlc29sdmVkX3BhdGhzID0gKAogICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUocGF0aCksIHJlZikKICAgICAgICBmb3IgcmVmIGluIHJlZmVyZW5jZWRfcGF0aHMKICAgICkKICAgIGRpc3RfZ3JvdXBzID0gbWFwKGZpbmRfZGlzdHJpYnV0aW9ucywgcmVzb2x2ZWRfcGF0aHMpCiAgICByZXR1cm4gbmV4dChkaXN0X2dyb3VwcywgKCkpCgoKcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbmRfb25fcGF0aCkKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9oYW5kbGVycz17fSkKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX3BhY2thZ2VzPXt9KQoKCmRlZiByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcl90eXBlLCBuYW1lc3BhY2VfaGFuZGxlcik6CiAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgoKICAgICAgICBkZWYgbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfZW50cnksIG1vZHVsZU5hbWUsIG1vZHVsZSk6CiAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCgogICAgTmFtZXNwYWNlIGhhbmRsZXJzIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgaW1wb3J0ZXIgb2JqZWN0IGhhcyBhbHJlYWR5CiAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CiAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCiAgICBlcXVpdmFsZW50IHN1YnBhdGguICBGb3IgYW4gZXhhbXBsZSBuYW1lc3BhY2UgaGFuZGxlciwgc2VlCiAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCiAgICAiIiIKICAgIF9uYW1lc3BhY2VfaGFuZGxlcnNbaW1wb3J0ZXJfdHlwZV0gPSBuYW1lc3BhY2VfaGFuZGxlcgoKCmRlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgogICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgICMgY2FwdHVyZSB3YXJuaW5ncyBkdWUgdG8gIzExMTEKICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCiAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCgogICAgaWYgbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSA9IHR5cGVzLk1vZHVsZVR5cGUocGFja2FnZU5hbWUpCiAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW10KICAgICAgICBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSkKICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCiAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKICAgIHN1YnBhdGggPSBoYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX18KICAgICAgICBwYXRoLmFwcGVuZChzdWJwYXRoKQogICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSkKICAgICAgICBfcmVidWlsZF9tb2RfcGF0aChwYXRoLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgcmV0dXJuIHN1YnBhdGgKCgpkZWYgX3JlYnVpbGRfbW9kX3BhdGgob3JpZ19wYXRoLCBwYWNrYWdlX25hbWUsIG1vZHVsZSk6CiAgICAiIiIKICAgIFJlYnVpbGQgbW9kdWxlLl9fcGF0aF9fIGVuc3VyaW5nIHRoYXQgYWxsIGVudHJpZXMgYXJlIG9yZGVyZWQKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgc3lzLnBhdGggb3JkZXIKICAgICIiIgogICAgc3lzX3BhdGggPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gc3lzLnBhdGhdCgogICAgZGVmIHNhZmVfc3lzX3BhdGhfaW5kZXgoZW50cnkpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MjAgYW5kICM1MTMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3lzX3BhdGguaW5kZXgoZW50cnkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKCiAgICBkZWYgcG9zaXRpb25faW5fc3lzX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBvcmRpbmFsIG9mIHRoZSBwYXRoIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBpbiBzeXMucGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGhfcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICBtb2R1bGVfcGFydHMgPSBwYWNrYWdlX25hbWUuY291bnQoJy4nKSArIDEKICAgICAgICBwYXJ0cyA9IHBhdGhfcGFydHNbOi1tb2R1bGVfcGFydHNdCiAgICAgICAgcmV0dXJuIHNhZmVfc3lzX3BhdGhfaW5kZXgoX25vcm1hbGl6ZV9jYWNoZWQob3Muc2VwLmpvaW4ocGFydHMpKSkKCiAgICBuZXdfcGF0aCA9IHNvcnRlZChvcmlnX3BhdGgsIGtleT1wb3NpdGlvbl9pbl9zeXNfcGF0aCkKICAgIG5ld19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIG5ld19wYXRoXQoKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlLl9fcGF0aF9fLCBsaXN0KToKICAgICAgICBtb2R1bGUuX19wYXRoX19bOl0gPSBuZXdfcGF0aAogICAgZWxzZToKICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBuZXdfcGF0aAoKCmRlZiBkZWNsYXJlX25hbWVzcGFjZShwYWNrYWdlTmFtZSk6CiAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHBhcmVudCwgXywgXyA9IHBhY2thZ2VOYW1lLnJwYXJ0aXRpb24oJy4nKQoKICAgICAgICBpZiBwYXJlbnQ6CiAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKICAgICAgICAgICAgaWYgcGFyZW50IG5vdCBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYXJlbnQpCgogICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCiAgICAgICAgIyB0aGV5IGNhbiBiZSB1cGRhdGVkCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCBvciBOb25lLCBbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSwgW10pCgogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAogICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKICAgICAgICAgICAgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKQoKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMocGF0aF9pdGVtLCBwYXJlbnQ9Tm9uZSk6CiAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGZvciBwYWNrYWdlIGluIF9uYW1lc3BhY2VfcGFja2FnZXMuZ2V0KHBhcmVudCwgKCkpOgogICAgICAgICAgICBzdWJwYXRoID0gX2hhbmRsZV9ucyhwYWNrYWdlLCBwYXRoX2l0ZW0pCiAgICAgICAgICAgIGlmIHN1YnBhdGg6CiAgICAgICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc3VicGF0aCwgcGFja2FnZSkKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKCiAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCiAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKICAgIGZvciBpdGVtIGluIG1vZHVsZS5fX3BhdGhfXzoKICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKSA9PSBub3JtYWxpemVkOgogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKICAgICAgICByZXR1cm4gc3VicGF0aAoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbGVfbnNfaGFuZGxlcikKCgpkZWYgbnVsbF9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgcmV0dXJuIE5vbmUKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsIG51bGxfbnNfaGFuZGxlcikKCgpkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgogICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgogICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChvcy5wYXRoLm5vcm1wYXRoKF9jeWd3aW5fcGF0Y2goZmlsZW5hbWUpKSkpCgoKZGVmIF9jeWd3aW5fcGF0Y2goZmlsZW5hbWUpOiAgIyBwcmFnbWE6IG5vY292ZXIKICAgICIiIgogICAgQ29udHJhcnkgdG8gUE9TSVggMjAwOCwgb24gQ3lnd2luLCBnZXRjd2QgKDMpIGNvbnRhaW5zCiAgICBzeW1saW5rIGNvbXBvbmVudHMuIFVzaW5nCiAgICBvcy5wYXRoLmFic3BhdGgoKSB3b3JrcyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLiBBIGZpeCBpbiBvcy5nZXRjd2QoKQogICAgd291bGQgcHJvYmFibHkgYmV0dGVyLCBpbiBDeWd3aW4gZXZlbiBtb3JlIHNvLCBleGNlcHQKICAgIHRoYXQgdGhpcyBzZWVtcyB0byBiZSBieSBkZXNpZ24uLi4KICAgICIiIgogICAgcmV0dXJuIG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkgaWYgc3lzLnBsYXRmb3JtID09ICdjeWd3aW4nIGVsc2UgZmlsZW5hbWUKCgpkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsIF9jYWNoZT17fSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jYWNoZVtmaWxlbmFtZV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gZWdnLgogICAgIiIiCiAgICByZXR1cm4gcGF0aC5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJykKCgpkZWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiB1bnBhY2tlZCBlZ2cuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgX2lzX2VnZ19wYXRoKHBhdGgpIGFuZAogICAgICAgIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAnUEtHLUlORk8nKSkKICAgICkKCgpkZWYgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpOgogICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCiAgICBuYW1lID0gcGFydHMucG9wKCkKICAgIGlmIHBhcnRzOgogICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQogICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQoKCmRlZiB5aWVsZF9saW5lcyhzdHJzKToKICAgICIiIllpZWxkIG5vbi1lbXB0eS9ub24tY29tbWVudCBsaW5lcyBvZiBhIHN0cmluZyBvciBzZXF1ZW5jZSIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBmb3IgcyBpbiBzdHJzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQogICAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgeWllbGQgcwogICAgZWxzZToKICAgICAgICBmb3Igc3MgaW4gc3RyczoKICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgogICAgICAgICAgICAgICAgeWllbGQgcwoKCk1PRFVMRSA9IHJlLmNvbXBpbGUociJcdysoXC5cdyspKiQiKS5tYXRjaApFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiCiAgICAoP1A8bmFtZT5bXi1dKykgKAogICAgICAgIC0oP1A8dmVyPlteLV0rKSAoCiAgICAgICAgICAgIC1weSg/UDxweXZlcj5bXi1dKykgKAogICAgICAgICAgICAgICAgLSg/UDxwbGF0Pi4rKQogICAgICAgICAgICApPwogICAgICAgICk/CiAgICApPwogICAgIiIiLAogICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCikubWF0Y2gKCgpjbGFzcyBFbnRyeVBvaW50OgogICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhbiBhZHZlcnRpc2VkIGltcG9ydGFibGUgb2JqZWN0IiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZHVsZV9uYW1lLCBhdHRycz0oKSwgZXh0cmFzPSgpLCBkaXN0PU5vbmUpOgogICAgICAgIGlmIG5vdCBNT0RVTEUobW9kdWxlX25hbWUpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIG1vZHVsZSBuYW1lIiwgbW9kdWxlX25hbWUpCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZQogICAgICAgIHNlbGYuYXR0cnMgPSB0dXBsZShhdHRycykKICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKGV4dHJhcykKICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcyA9ICIlcyA9ICVzIiAlIChzZWxmLm5hbWUsIHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgaWYgc2VsZi5hdHRyczoKICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBSZXF1aXJlIHBhY2thZ2VzIGZvciB0aGlzIEVudHJ5UG9pbnQsIHRoZW4gcmVzb2x2ZSBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZSBvciBhcmdzIG9yIGt3YXJnczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJzIHRvIGxvYWQgYXJlIGRlcHJlY2F0ZWQuICBDYWxsIC5yZXNvbHZlIGFuZCAiCiAgICAgICAgICAgICAgICAiLnJlcXVpcmUgc2VwYXJhdGVseS4iLAogICAgICAgICAgICAgICAgUGtnUmVzb3VyY2VzRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yLAogICAgICAgICAgICApCiAgICAgICAgaWYgcmVxdWlyZToKICAgICAgICAgICAgc2VsZi5yZXF1aXJlKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIGl0cyBtb2R1bGUgYW5kIGF0dHJzLgogICAgICAgICIiIgogICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZnJvbWxpc3Q9WydfX25hbWVfXyddLCBsZXZlbD0wKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0b29scy5yZWR1Y2UoZ2V0YXR0ciwgc2VsZi5hdHRycywgbW9kdWxlKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKHN0cihleGMpKQoKICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5leHRyYXMgYW5kIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQoKICAgICAgICAjIEdldCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGVudHJ5IHBvaW50IHdpdGggYWxsIGl0cyBleHRyYXMgYW5kCiAgICAgICAgIyB0aGVuIHJlc29sdmUgdGhlbS4gV2UgaGF2ZSB0byBwYXNzIGBleHRyYXNgIGFsb25nIHdoZW4gcmVzb2x2aW5nIHNvCiAgICAgICAgIyB0aGF0IHRoZSB3b3JraW5nIHNldCBrbm93cyB3aGF0IGV4dHJhcyB3ZSB3YW50LiBPdGhlcndpc2UsIGZvcgogICAgICAgICMgZGlzdC1pbmZvIGRpc3RyaWJ1dGlvbnMsIHRoZSB3b3JraW5nIHNldCB3aWxsIGFzc3VtZSB0aGF0IHRoZQogICAgICAgICMgcmVxdWlyZW1lbnRzIGZvciB0aGF0IGV4dHJhIGFyZSBwdXJlbHkgb3B0aW9uYWwgYW5kIHNraXAgb3ZlciB0aGVtLgogICAgICAgIHJlcXMgPSBzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpCiAgICAgICAgaXRlbXMgPSB3b3JraW5nX3NldC5yZXNvbHZlKHJlcXMsIGVudiwgaW5zdGFsbGVyLCBleHRyYXM9c2VsZi5leHRyYXMpCiAgICAgICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkLCBpdGVtcykpCgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcidccyonCiAgICAgICAgcicoP1A8bmFtZT4uKz8pXHMqJwogICAgICAgIHInPVxzKicKICAgICAgICByJyg/UDxtb2R1bGU+W1x3Ll0rKVxzKicKICAgICAgICByJyg6XHMqKD9QPGF0dHI+W1x3Ll0rKSk/XHMqJwogICAgICAgIHInKD9QPGV4dHJhcz5cWy4qXF0pP1xzKiQnCiAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2UoY2xzLCBzcmMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgZW50cnkgcG9pbnQgZnJvbSBzdHJpbmcgYHNyY2AKCiAgICAgICAgRW50cnkgcG9pbnQgc3ludGF4IGZvbGxvd3MgdGhlIGZvcm06OgoKICAgICAgICAgICAgbmFtZSA9IHNvbWUubW9kdWxlOnNvbWUuYXR0ciBbZXh0cmExLCBleHRyYTJdCgogICAgICAgIFRoZSBlbnRyeSBuYW1lIGFuZCBtb2R1bGUgbmFtZSBhcmUgcmVxdWlyZWQsIGJ1dCB0aGUgYGA6YXR0cnNgYCBhbmQKICAgICAgICBgYFtleHRyYXNdYGAgcGFydHMgYXJlIG9wdGlvbmFsCiAgICAgICAgIiIiCiAgICAgICAgbSA9IGNscy5wYXR0ZXJuLm1hdGNoKHNyYykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgbXNnID0gIkVudHJ5UG9pbnQgbXVzdCBiZSBpbiAnbmFtZT1tb2R1bGU6YXR0cnMgW2V4dHJhc10nIGZvcm1hdCIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2csIHNyYykKICAgICAgICByZXMgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgZXh0cmFzID0gY2xzLl9wYXJzZV9leHRyYXMocmVzWydleHRyYXMnXSkKICAgICAgICBhdHRycyA9IHJlc1snYXR0ciddLnNwbGl0KCcuJykgaWYgcmVzWydhdHRyJ10gZWxzZSAoKQogICAgICAgIHJldHVybiBjbHMocmVzWyduYW1lJ10sIHJlc1snbW9kdWxlJ10sIGF0dHJzLCBleHRyYXMsIGRpc3QpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2V4dHJhcyhjbHMsIGV4dHJhc19zcGVjKToKICAgICAgICBpZiBub3QgZXh0cmFzX3NwZWM6CiAgICAgICAgICAgIHJldHVybiAoKQogICAgICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKCd4JyArIGV4dHJhc19zcGVjKQogICAgICAgIGlmIHJlcS5zcGVjczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCiAgICAgICAgcmV0dXJuIHJlcS5leHRyYXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9ncm91cChjbHMsIGdyb3VwLCBsaW5lcywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhbiBlbnRyeSBwb2ludCBncm91cCIiIgogICAgICAgIGlmIG5vdCBNT0RVTEUoZ3JvdXApOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICB0aGlzID0ge30KICAgICAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhsaW5lcyk6CiAgICAgICAgICAgIGVwID0gY2xzLnBhcnNlKGxpbmUsIGRpc3QpCiAgICAgICAgICAgIGlmIGVwLm5hbWUgaW4gdGhpczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBlbnRyeSBwb2ludCIsIGdyb3VwLCBlcC5uYW1lKQogICAgICAgICAgICB0aGlzW2VwLm5hbWVdID0gZXAKICAgICAgICByZXR1cm4gdGhpcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX21hcChjbHMsIGRhdGEsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBtYXAgb2YgZW50cnkgcG9pbnQgZ3JvdXBzIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KToKICAgICAgICAgICAgZGF0YSA9IGRhdGEuaXRlbXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGEgPSBzcGxpdF9zZWN0aW9ucyhkYXRhKQogICAgICAgIG1hcHMgPSB7fQogICAgICAgIGZvciBncm91cCwgbGluZXMgaW4gZGF0YToKICAgICAgICAgICAgaWYgZ3JvdXAgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW50cnkgcG9pbnRzIG11c3QgYmUgbGlzdGVkIGluIGdyb3VwcyIpCiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXAuc3RyaXAoKQogICAgICAgICAgICBpZiBncm91cCBpbiBtYXBzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICAgICAgbWFwc1tncm91cF0gPSBjbHMucGFyc2VfZ3JvdXAoZ3JvdXAsIGxpbmVzLCBkaXN0KQogICAgICAgIHJldHVybiBtYXBzCgoKZGVmIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KGxvY2F0aW9uKToKICAgIGlmIG5vdCBsb2NhdGlvbjoKICAgICAgICByZXR1cm4gJycKICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShsb2NhdGlvbikKICAgIGlmIHBhcnNlZFstMV0uc3RhcnRzd2l0aCgnbWQ1PScpOgogICAgICAgIHJldHVybiB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJzZWRbOi0xXSArICgnJywpKQogICAgcmV0dXJuIGxvY2F0aW9uCgoKZGVmIF92ZXJzaW9uX2Zyb21fZmlsZShsaW5lcyk6CiAgICAiIiIKICAgIEdpdmVuIGFuIGl0ZXJhYmxlIG9mIGxpbmVzIGZyb20gYSBNZXRhZGF0YSBmaWxlLCByZXR1cm4KICAgIHRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBmaWVsZCwgaWYgcHJlc2VudCwgb3IgTm9uZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIGRlZiBpc192ZXJzaW9uX2xpbmUobGluZSk6CiAgICAgICAgcmV0dXJuIGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpCiAgICB2ZXJzaW9uX2xpbmVzID0gZmlsdGVyKGlzX3ZlcnNpb25fbGluZSwgbGluZXMpCiAgICBsaW5lID0gbmV4dChpdGVyKHZlcnNpb25fbGluZXMpLCAnJykKICAgIF8sIF8sIHZhbHVlID0gbGluZS5wYXJ0aXRpb24oJzonKQogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2YWx1ZS5zdHJpcCgpKSBvciBOb25lCgoKY2xhc3MgRGlzdHJpYnV0aW9uOgogICAgIiIiV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5IHcvbWV0YWRhdGEiIiIKICAgIFBLR19JTkZPID0gJ1BLRy1JTkZPJwoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgbG9jYXRpb249Tm9uZSwgbWV0YWRhdGE9Tm9uZSwgcHJvamVjdF9uYW1lPU5vbmUsCiAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgcHlfdmVyc2lvbj1QWV9NQUpPUiwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCk6CiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBzYWZlX25hbWUocHJvamVjdF9uYW1lIG9yICdVbmtub3duJykKICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5weV92ZXJzaW9uID0gcHlfdmVyc2lvbgogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHNlbGYucHJlY2VkZW5jZSA9IHByZWNlZGVuY2UKICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSAqIDQKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKICAgICAgICBpZiBleHQubG93ZXIoKSBpbiBfZGlzdHJpYnV0aW9uSW1wbDoKICAgICAgICAgICAgY2xzID0gX2Rpc3RyaWJ1dGlvbkltcGxbZXh0Lmxvd2VyKCldCgogICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBtYXRjaC5ncm91cCgKICAgICAgICAgICAgICAgICAgICAnbmFtZScsICd2ZXInLCAncHl2ZXInLCAncGxhdCcKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdwogICAgICAgICkuX3JlbG9hZF92ZXJzaW9uKCkKCiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaGNtcChzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLnBhcnNlZF92ZXJzaW9uLAogICAgICAgICAgICBzZWxmLnByZWNlZGVuY2UsCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBfcmVtb3ZlX21kNV9mcmFnbWVudChzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yICcnLAogICAgICAgICAgICBzZWxmLnBsYXRmb3JtIG9yICcnLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPCBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID49IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICAjIEl0J3Mgbm90IGEgRGlzdHJpYnV0aW9uLCBzbyB0aGV5IGFyZSBub3QgZXF1YWwKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA9PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucwogICAgIyBtYXkgbm90IGtub3cgdGhlaXIgbmFtZSBvciB2ZXJzaW9uIHdpdGhvdXQgbG9hZGluZyBQS0ctSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBrZXkoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa2V5CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX3BhcnNlZF92ZXJzaW9uIik6CiAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgoKICAgIGRlZiBfd2Fybl9sZWdhY3lfdmVyc2lvbihzZWxmKToKICAgICAgICBMViA9IHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24KICAgICAgICBpc19sZWdhY3kgPSBpc2luc3RhbmNlKHNlbGYuX3BhcnNlZF92ZXJzaW9uLCBMVikKICAgICAgICBpZiBub3QgaXNfbGVnYWN5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXaGlsZSBhbiBlbXB0eSB2ZXJzaW9uIGlzIHRlY2huaWNhbGx5IGEgbGVnYWN5IHZlcnNpb24gYW5kCiAgICAgICAgIyBpcyBub3QgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24sIGl0J3MgYWxzbyB1bmxpa2VseSB0bwogICAgICAgICMgYWN0dWFsbHkgY29tZSBmcm9tIHNvbWVvbmUgYW5kIGluc3RlYWQgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdAogICAgICAgICMgaXQgY29tZXMgZnJvbSBzZXR1cHRvb2xzIGF0dGVtcHRpbmcgdG8gcGFyc2UgYSBmaWxlbmFtZSBhbmQKICAgICAgICAjIGluY2x1ZGluZyBpdCBpbiB0aGUgbGlzdC4gU28gZm9yIHRoYXQgd2UnbGwgZ2F0ZSB0aGlzIHdhcm5pbmcKICAgICAgICAjIG9uIGlmIHRoZSB2ZXJzaW9uIGlzIGFueXRoaW5nIGF0IGFsbCBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgICd7cHJvamVjdF9uYW1lfSAoe3ZlcnNpb259KScgaXMgYmVpbmcgcGFyc2VkIGFzIGEgbGVnYWN5LAogICAgICAgICAgICBub24gUEVQIDQ0MCwKICAgICAgICAgICAgdmVyc2lvbi4gWW91IG1heSBmaW5kIG9kZCBiZWhhdmlvciBhbmQgc29ydCBvcmRlci4KICAgICAgICAgICAgSW4gcGFydGljdWxhciBpdCB3aWxsIGJlIHNvcnRlZCBhcyBsZXNzIHRoYW4gMC4wLiBJdAogICAgICAgICAgICBpcyByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIFBFUCA0NDAgY29tcGF0aWJsZQogICAgICAgICAgICB2ZXJzaW9ucy4KICAgICAgICAgICAgIiIiKS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJyAnKQoKICAgICAgICB3YXJuaW5ncy53YXJuKHRtcGwuZm9ybWF0KCoqdmFycyhzZWxmKSksIFBFUDQ0MFdhcm5pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5fZ2V0X3ZlcnNpb24oKQogICAgICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fZ2V0X21ldGFkYXRhX3BhdGhfZm9yX2Rpc3BsYXkoc2VsZi5QS0dfSU5GTykKICAgICAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3Ige30gZmlsZSBhdCBwYXRoOiB7fSIKICAgICAgICAgICAgICAgICkuZm9ybWF0KHNlbGYuUEtHX0lORk8sIHBhdGgpCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc2VsZikKCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBtYXAgb2YgZXh0cmEgdG8gaXRzIGxpc3Qgb2YgKGRpcmVjdCkgcmVxdWlyZW1lbnRzCiAgICAgICAgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLCBpbmNsdWRpbmcgdGhlIG51bGwgZXh0cmEuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19kZXBfbWFwID0gc2VsZi5fZmlsdGVyX2V4dHJhcyhzZWxmLl9idWlsZF9kZXBfbWFwKCkpCiAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9maWx0ZXJfZXh0cmFzKGRtKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIG1hcHBpbmcgb2YgZXh0cmFzIHRvIGRlcGVuZGVuY2llcywgc3RyaXAgb2ZmCiAgICAgICAgZW52aXJvbm1lbnQgbWFya2VycyBhbmQgZmlsdGVyIG91dCBhbnkgZGVwZW5kZW5jaWVzCiAgICAgICAgbm90IG1hdGNoaW5nIHRoZSBtYXJrZXJzLgogICAgICAgICIiIgogICAgICAgIGZvciBleHRyYSBpbiBsaXN0KGZpbHRlcihOb25lLCBkbSkpOgogICAgICAgICAgICBuZXdfZXh0cmEgPSBleHRyYQogICAgICAgICAgICByZXFzID0gZG0ucG9wKGV4dHJhKQogICAgICAgICAgICBuZXdfZXh0cmEsIF8sIG1hcmtlciA9IGV4dHJhLnBhcnRpdGlvbignOicpCiAgICAgICAgICAgIGZhaWxzX21hcmtlciA9IG1hcmtlciBhbmQgKAogICAgICAgICAgICAgICAgaW52YWxpZF9tYXJrZXIobWFya2VyKQogICAgICAgICAgICAgICAgb3Igbm90IGV2YWx1YXRlX21hcmtlcihtYXJrZXIpCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZmFpbHNfbWFya2VyOgogICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgIG5ld19leHRyYSA9IHNhZmVfZXh0cmEobmV3X2V4dHJhKSBvciBOb25lCgogICAgICAgICAgICBkbS5zZXRkZWZhdWx0KG5ld19leHRyYSwgW10pLmV4dGVuZChyZXFzKQogICAgICAgIHJldHVybiBkbQoKICAgIGRlZiBfYnVpbGRfZGVwX21hcChzZWxmKToKICAgICAgICBkbSA9IHt9CiAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6CiAgICAgICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzcGxpdF9zZWN0aW9ucyhzZWxmLl9nZXRfbWV0YWRhdGEobmFtZSkpOgogICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSwgW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCiAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIHJlcXVpcmVzKHNlbGYsIGV4dHJhcz0oKSk6CiAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgogICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAogICAgICAgIGRlcHMgPSBbXQogICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCAoKSkpCiAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlcHMuZXh0ZW5kKGRtW3NhZmVfZXh0cmEoZXh0KV0pCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKICAgICAgICAgICAgICAgICAgICAiJXMgaGFzIG5vIHN1Y2ggZXh0cmEgZmVhdHVyZSAlciIgJSAoc2VsZiwgZXh0KQogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkZXBzCgogICAgZGVmIF9nZXRfbWV0YWRhdGFfcGF0aF9mb3JfZGlzcGxheShzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGdpdmVuIG1ldGFkYXRhIGZpbGUsIGlmIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgV2UgbmVlZCB0byBhY2Nlc3MgX2dldF9tZXRhZGF0YV9wYXRoKCkgb24gdGhlIHByb3ZpZGVyIG9iamVjdAogICAgICAgICAgICAjIGRpcmVjdGx5IHJhdGhlciB0aGFuIHRocm91Z2ggdGhpcyBjbGFzcydzIF9fZ2V0YXR0cl9fKCkKICAgICAgICAgICAgIyBzaW5jZSBfZ2V0X21ldGFkYXRhX3BhdGgoKSBpcyBtYXJrZWQgcHJpdmF0ZS4KICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3Byb3ZpZGVyLl9nZXRfbWV0YWRhdGFfcGF0aChuYW1lKQoKICAgICAgICAjIEhhbmRsZSBleGNlcHRpb25zIGUuZy4gaW4gY2FzZSB0aGUgZGlzdHJpYnV0aW9uJ3MgbWV0YWRhdGEKICAgICAgICAjIHByb3ZpZGVyIGRvZXNuJ3Qgc3VwcG9ydCBfZ2V0X21ldGFkYXRhX3BhdGgoKS4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gJ1tjb3VsZCBub3QgZGV0ZWN0XScKCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgZGVmIF9nZXRfdmVyc2lvbihzZWxmKToKICAgICAgICBsaW5lcyA9IHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKQogICAgICAgIHZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUobGluZXMpCgogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIGFjdGl2YXRlKHNlbGYsIHBhdGg9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIGRpc3RyaWJ1dGlvbiBpcyBpbXBvcnRhYmxlIG9uIGBwYXRoYCAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgsIHJlcGxhY2U9cmVwbGFjZSkKICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwa2cpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKICAgICAgICBmaWxlbmFtZSA9ICIlcy0lcy1weSVzIiAlICgKICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKICAgICAgICApCgogICAgICAgIGlmIHNlbGYucGxhdGZvcm06CiAgICAgICAgICAgIGZpbGVuYW1lICs9ICctJyArIHNlbGYucGxhdGZvcm0KICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLCBzZWxmLmxvY2F0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsICd2ZXJzaW9uJywgTm9uZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb24pCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICIiIkRlbGVnYXRlIGFsbCB1bnJlY29nbml6ZWQgcHVibGljIGF0dHJpYnV0ZXMgdG8gLm1ldGFkYXRhIHByb3ZpZGVyIiIiCiAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGF0dHIpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3QoCiAgICAgICAgICAgIHNldChzdXBlcihEaXN0cmlidXRpb24sIHNlbGYpLl9fZGlyX18oKSkKICAgICAgICAgICAgfCBzZXQoCiAgICAgICAgICAgICAgICBhdHRyIGZvciBhdHRyIGluIHNlbGYuX3Byb3ZpZGVyLl9fZGlyX18oKQogICAgICAgICAgICAgICAgaWYgbm90IGF0dHIuc3RhcnRzd2l0aCgnXycpCiAgICAgICAgICAgICkKICAgICAgICApCgogICAgaWYgbm90IGhhc2F0dHIob2JqZWN0LCAnX19kaXJfXycpOgogICAgICAgICMgcHl0aG9uIDIuNyBub3Qgc3VwcG9ydGVkCiAgICAgICAgZGVsIF9fZGlyX18KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscywgZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHJldHVybiBjbHMuZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGBgUmVxdWlyZW1lbnRgYCB0aGF0IG1hdGNoZXMgdGhpcyBkaXN0cmlidXRpb24gZXhhY3RseSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcGVjID0gIiVzPT09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQoKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKCiAgICBkZWYgbG9hZF9lbnRyeV9wb2ludChzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRW50cnkgcG9pbnQgJXIgbm90IGZvdW5kIiAlICgoZ3JvdXAsIG5hbWUpLCkpCiAgICAgICAgcmV0dXJuIGVwLmxvYWQoKQoKICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgogICAgICAgICAgICApCiAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLCB7fSkKICAgICAgICByZXR1cm4gZXBfbWFwCgogICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnlfbWFwKGdyb3VwKS5nZXQobmFtZSkKCiAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYz1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgc2VsZi5sb2NhdGlvbiBpcyBvbiBwYXRoCgogICAgICAgIElmIHJlcGxhY2U9RmFsc2UgKGRlZmF1bHQpOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgaW4gcGF0aCBhbnl3aGVyZSwgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIHRvIHRoZSBlbmQgb2YgcGF0aC4KICAgICAgICBJZiByZXBsYWNlPVRydWU6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBvbiBwYXRoIGFueXdoZXJlIChub3QgZWdncykKICAgICAgICAgICAgICBvciBoaWdoZXIgcHJpb3JpdHkgdGhhbiBpdHMgcGFyZW50IChlZ2dzKQogICAgICAgICAgICAgIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudCwKICAgICAgICAgICAgICAgIHJlbW92aW5nIGFueSBsb3dlci1wcmlvcml0eSBlbnRyaWVzLgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIGl0IHRvIHRoZSBmcm9udCBvZiBwYXRoLgogICAgICAgICIiIgoKICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgogICAgICAgIGlmIG5vdCBsb2M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBubG9jID0gX25vcm1hbGl6ZV9jYWNoZWQobG9jKQogICAgICAgIGJkaXIgPSBvcy5wYXRoLmRpcm5hbWUobmxvYykKICAgICAgICBucGF0aCA9IFsocCBhbmQgX25vcm1hbGl6ZV9jYWNoZWQocCkgb3IgcCkgZm9yIHAgaW4gcGF0aF0KCiAgICAgICAgZm9yIHAsIGl0ZW0gaW4gZW51bWVyYXRlKG5wYXRoKToKICAgICAgICAgICAgaWYgaXRlbSA9PSBubG9jOgogICAgICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1vZGlmeSBwYXRoIChldmVuIHJlbW92aW5nIGR1cGxpY2F0ZXMpIGlmCiAgICAgICAgICAgICAgICAgICAgIyBmb3VuZCBhbmQgbm90IHJlcGxhY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBpdGVtID09IGJkaXIgYW5kIHNlbGYucHJlY2VkZW5jZSA9PSBFR0dfRElTVDoKICAgICAgICAgICAgICAgICMgaWYgaXQncyBhbiAuZWdnLCBnaXZlIGl0IHByZWNlZGVuY2Ugb3ZlciBpdHMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIFVOTEVTUyBpdCdzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBzeXMucGF0aCBhbmQgcmVwbGFjZT1GYWxzZQogICAgICAgICAgICAgICAgaWYgKG5vdCByZXBsYWNlKSBhbmQgbmxvYyBpbiBucGF0aFtwOl06CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgICAgICBwYXRoLmluc2VydChwLCBsb2MpCiAgICAgICAgICAgICAgICBucGF0aC5pbnNlcnQocCwgbmxvYykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBsb2MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChsb2MpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHAgaXMgdGhlIHNwb3Qgd2hlcmUgd2UgZm91bmQgb3IgaW5zZXJ0ZWQgbG9jOyBub3cgcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBucCA9IG5wYXRoLmluZGV4KG5sb2MsIHAgKyAxKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgbnBhdGhbbnBdLCBwYXRoW25wXQogICAgICAgICAgICAgICAgIyBoYSEKICAgICAgICAgICAgICAgIHAgPSBucAoKICAgICAgICByZXR1cm4KCiAgICBkZWYgY2hlY2tfdmVyc2lvbl9jb25mbGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICMgaWdub3JlIHRoZSBpbmV2aXRhYmxlIHNldHVwdG9vbHMgc2VsZi1jb25mbGljdHMgIDooCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQogICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCiAgICAgICAgZm9yIG1vZG5hbWUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAogICAgICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtb2RuYW1lIGluICgncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJywgJ3NpdGUnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKICAgICAgICAgICAgaWYgZm4gYW5kIChub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgZm4uc3RhcnRzd2l0aChzZWxmLmxvY2F0aW9uKSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAogICAgICAgICAgICAgICAgIk1vZHVsZSAlcyB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmcm9tICVzLCBidXQgJXMgaXMgYmVpbmcgYWRkZWQiCiAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnZlcnNpb24KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIgKyByZXByKHNlbGYpKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9uZShzZWxmLCAqKmt3KToKICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCiAgICAgICAgbmFtZXMgPSAncHJvamVjdF9uYW1lIHZlcnNpb24gcHlfdmVyc2lvbiBwbGF0Zm9ybSBsb2NhdGlvbiBwcmVjZWRlbmNlJwogICAgICAgIGZvciBhdHRyIGluIG5hbWVzLnNwbGl0KCk6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqKmt3KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dHJhcyhzZWxmKToKICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGFja2FnZXMgaW5zdGFsbGVkIGJ5IGRpc3R1dGlscyAoZS5nLiBudW1weSBvciBzY2lweSksCiAgICAgICAgd2hpY2ggdXNlcyBhbiBvbGQgc2FmZV92ZXJzaW9uLCBhbmQgc28KICAgICAgICB0aGVpciB2ZXJzaW9uIG51bWJlcnMgY2FuIGdldCBtYW5nbGVkIHdoZW4KICAgICAgICBjb252ZXJ0ZWQgdG8gZmlsZW5hbWVzIChlLmcuLCAxLjExLjAuZGV2MCsyMzI5ZWFlIHRvCiAgICAgICAgMS4xMS4wLmRldjBfMjMyOWVhZSkuIFRoZXNlIGRpc3RyaWJ1dGlvbnMgd2lsbCBub3QgYmUKICAgICAgICBwYXJzZWQgcHJvcGVybHkKICAgICAgICBkb3duc3RyZWFtIGJ5IERpc3RyaWJ1dGlvbiBhbmQgc2FmZV92ZXJzaW9uLCBzbwogICAgICAgIHRha2UgYW4gZXh0cmEgc3RlcCBhbmQgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbQogICAgICAgIHRoZSBtZXRhZGF0YSBmaWxlIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBtZF92ZXJzaW9uID0gc2VsZi5fZ2V0X3ZlcnNpb24oKQogICAgICAgIGlmIG1kX3ZlcnNpb246CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBtZF92ZXJzaW9uCiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBEaXN0SW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkKICAgIHcvbWV0YWRhdGEsIC5kaXN0LWluZm8gc3R5bGUuCiAgICAiIiIKICAgIFBLR19JTkZPID0gJ01FVEFEQVRBJwogICAgRVFFUSA9IHJlLmNvbXBpbGUociIoW1woLF0pXHMqKFxkLio/KVxzKihbLFwpXSkiKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9wYXJzZWRfcGtnX2luZm8oc2VsZik6CiAgICAgICAgIiIiUGFyc2UgYW5kIGNhY2hlIG1ldGFkYXRhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykKICAgICAgICAgICAgc2VsZi5fcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIobWV0YWRhdGEpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fZGVwX21hcCA9IHNlbGYuX2NvbXB1dGVfZGVwZW5kZW5jaWVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCgogICAgZGVmIF9jb21wdXRlX2RlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICAiIiJSZWNvbXB1dGUgdGhpcyBkaXN0cmlidXRpb24ncyBkZXBlbmRlbmNpZXMuIiIiCiAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KCiAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgIyBJbmNsdWRpbmcgYW55IGNvbmRpdGlvbiBleHByZXNzaW9ucwogICAgICAgIGZvciByZXEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1JlcXVpcmVzLURpc3QnKSBvciBbXToKICAgICAgICAgICAgcmVxcy5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcSkpCgogICAgICAgIGRlZiByZXFzX2Zvcl9leHRyYShleHRyYSk6CiAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEubWFya2VyIG9yIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVxCgogICAgICAgIGNvbW1vbiA9IGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShOb25lKSkKICAgICAgICBkbVtOb25lXS5leHRlbmQoY29tbW9uKQoKICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1Byb3ZpZGVzLUV4dHJhJykgb3IgW106CiAgICAgICAgICAgIHNfZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhLnN0cmlwKCkpCiAgICAgICAgICAgIGRtW3NfZXh0cmFdID0gbGlzdChmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoZXh0cmEpKSAtIGNvbW1vbikKCiAgICAgICAgcmV0dXJuIGRtCgoKX2Rpc3RyaWJ1dGlvbkltcGwgPSB7CiAgICAnLmVnZyc6IERpc3RyaWJ1dGlvbiwKICAgICcuZWdnLWluZm8nOiBFZ2dJbmZvRGlzdHJpYnV0aW9uLAogICAgJy5kaXN0LWluZm8nOiBEaXN0SW5mb0Rpc3RyaWJ1dGlvbiwKfQoKCmRlZiBpc3N1ZV93YXJuaW5nKCphcmdzLCAqKmt3KToKICAgIGxldmVsID0gMQogICAgZyA9IGdsb2JhbHMoKQogICAgdHJ5OgogICAgICAgICMgZmluZCB0aGUgZmlyc3Qgc3RhY2sgZnJhbWUgdGhhdCBpcyAqbm90KiBjb2RlIGluCiAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgd2FybmluZ3Mud2FybihzdGFja2xldmVsPWxldmVsICsgMSwgKmFyZ3MsICoqa3cpCgoKY2xhc3MgUmVxdWlyZW1lbnRQYXJzZUVycm9yKFZhbHVlRXJyb3IpOgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuYXJncykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgogICAgIiIiWWllbGQgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMgZm9yIGVhY2ggc3BlY2lmaWNhdGlvbiBpbiBgc3Ryc2AKCiAgICBgc3Ryc2AgbXVzdCBiZSBhIHN0cmluZywgb3IgYSAocG9zc2libHktbmVzdGVkKSBpdGVyYWJsZSB0aGVyZW9mLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIHN0ZXBwYWJsZSBpdGVyYXRvciwgc28gd2UgY2FuIGhhbmRsZSBcLWNvbnRpbnVhdGlvbnMKICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAjIERyb3AgY29tbWVudHMgLS0gYSBoYXNoIHdpdGhvdXQgYSBzcGFjZSBtYXkgYmUgaW4gYSBVUkwuCiAgICAgICAgaWYgJyAjJyBpbiBsaW5lOgogICAgICAgICAgICBsaW5lID0gbGluZVs6bGluZS5maW5kKCcgIycpXQogICAgICAgICMgSWYgdGhlcmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgZHJvcCBpdCwgYW5kIGFwcGVuZCB0aGUgbmV4dCBsaW5lLgogICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0uc3RyaXAoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsaW5lICs9IG5leHQobGluZXMpCiAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQobGluZSkKCgpjbGFzcyBSZXF1aXJlbWVudChwYWNrYWdpbmcucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihSZXF1aXJlbWVudCwgc2VsZikuX19pbml0X18ocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBwYWNrYWdpbmcucmVxdWlyZW1lbnRzLkludmFsaWRSZXF1aXJlbWVudCBhcyBlOgogICAgICAgICAgICByYWlzZSBSZXF1aXJlbWVudFBhcnNlRXJyb3Ioc3RyKGUpKQogICAgICAgIHNlbGYudW5zYWZlX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBwcm9qZWN0X25hbWUgPSBzYWZlX25hbWUoc2VsZi5uYW1lKQogICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBzZWxmLnNwZWNzID0gWwogICAgICAgICAgICAoc3BlYy5vcGVyYXRvciwgc3BlYy52ZXJzaW9uKSBmb3Igc3BlYyBpbiBzZWxmLnNwZWNpZmllcl0KICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKG1hcChzYWZlX2V4dHJhLCBzZWxmLmV4dHJhcykpCiAgICAgICAgc2VsZi5oYXNoQ21wID0gKAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgc2VsZi51cmwsCiAgICAgICAgICAgIHNlbGYuc3BlY2lmaWVyLAogICAgICAgICAgICBmcm96ZW5zZXQoc2VsZi5leHRyYXMpLAogICAgICAgICAgICBzdHIoc2VsZi5tYXJrZXIpIGlmIHNlbGYubWFya2VyIGVsc2UgTm9uZSwKICAgICAgICApCiAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBpc2luc3RhbmNlKG90aGVyLCBSZXF1aXJlbWVudCkgYW5kCiAgICAgICAgICAgIHNlbGYuaGFzaENtcCA9PSBvdGhlci5oYXNoQ21wCiAgICAgICAgKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBpZiBpdGVtLmtleSAhPSBzZWxmLmtleToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgaXRlbSA9IGl0ZW0udmVyc2lvbgoKICAgICAgICAjIEFsbG93IHByZXJlbGVhc2VzIGFsd2F5cyBpbiBvcmRlciB0byBtYXRjaCB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YKICAgICAgICAjIHRoaXMgbWV0aG9kLiBJbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIgYW5kIGZvbGxvdyBQRVAgNDQwCiAgICAgICAgIyBtb3JlIGFjY3VyYXRlbHkuCiAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVyLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPVRydWUpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9faGFzaAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcGFyc2Uocyk6CiAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cyhzKQogICAgICAgIHJldHVybiByZXEKCgpkZWYgX2Fsd2F5c19vYmplY3QoY2xhc3Nlcyk6CiAgICAiIiIKICAgIEVuc3VyZSBvYmplY3QgYXBwZWFycyBpbiB0aGUgbXJvIGV2ZW4KICAgIGZvciBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICIiIgogICAgaWYgb2JqZWN0IG5vdCBpbiBjbGFzc2VzOgogICAgICAgIHJldHVybiBjbGFzc2VzICsgKG9iamVjdCwpCiAgICByZXR1cm4gY2xhc3NlcwoKCmRlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CiAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgogICAgdHlwZXMgPSBfYWx3YXlzX29iamVjdChpbnNwZWN0LmdldG1ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKSkKICAgIGZvciB0IGluIHR5cGVzOgogICAgICAgIGlmIHQgaW4gcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQoKCmRlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgcHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQoKCmRlZiBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJTYW5kYm94LWJ5cGFzc2luZyB2ZXJzaW9uIG9mIGVuc3VyZV9kaXJlY3RvcnkoKSIiIgogICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLm1rZGlyIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uJykKICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gc3BsaXQocGF0aCkKICAgIGlmIGRpcm5hbWUgYW5kIGZpbGVuYW1lIGFuZCBub3QgaXNkaXIoZGlybmFtZSk6CiAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KGRpcm5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBta2RpcihkaXJuYW1lLCAwbzc1NSkKICAgICAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yOgogICAgICAgICAgICBwYXNzCgoKZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgogICAgIiIiU3BsaXQgYSBzdHJpbmcgb3IgaXRlcmFibGUgdGhlcmVvZiBpbnRvIChzZWN0aW9uLCBjb250ZW50KSBwYWlycwoKICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCiAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAogICAgY29tbWVudC1vbmx5IGxpbmVzLiAgSWYgdGhlcmUgYXJlIGFueSBzdWNoIGxpbmVzIGJlZm9yZSB0aGUgZmlyc3Qgc2VjdGlvbgogICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCiAgICAiIiIKICAgIHNlY3Rpb24gPSBOb25lCiAgICBjb250ZW50ID0gW10KICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpOgogICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAogICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29udGVudC5hcHBlbmQobGluZSkKCiAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CiAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CgoKZGVmIF9ta3N0ZW1wKCphcmdzLCAqKmt3KToKICAgIG9sZF9vcGVuID0gb3Mub3BlbgogICAgdHJ5OgogICAgICAgICMgdGVtcG9yYXJpbHkgYnlwYXNzIHNhbmRib3hpbmcKICAgICAgICBvcy5vcGVuID0gb3Nfb3BlbgogICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3N0ZW1wKCphcmdzLCAqKmt3KQogICAgZmluYWxseToKICAgICAgICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCiAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuCgoKIyBTaWxlbmNlIHRoZSBQRVA0NDBXYXJuaW5nIGJ5IGRlZmF1bHQsIHNvIHRoYXQgZW5kIHVzZXJzIGRvbid0IGdldCBoaXQgYnkgaXQKIyByYW5kb21seSBqdXN0IGJlY2F1c2UgdGhleSB1c2UgcGtnX3Jlc291cmNlcy4gV2Ugd2FudCB0byBhcHBlbmQgdGhlIHJ1bGUKIyBiZWNhdXNlIHdlIHdhbnQgZWFybGllciB1c2VzIG9mIGZpbHRlcndhcm5pbmdzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMKIyBvbmUuCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1QRVA0NDBXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgojIGZyb20gamFyYWNvLmZ1bmN0b29scyAxLjMKZGVmIF9jYWxsX2FzaWRlKGYsICphcmdzLCAqKmt3YXJncyk6CiAgICBmKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBmCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZShnPWdsb2JhbHMoKSk6CiAgICAiU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyIChkZWxpYmVyYXRlbHkgbm90IHN0YXRlLXNhdmVkKSIKICAgIG1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIoKQogICAgZ1snX21hbmFnZXInXSA9IG1hbmFnZXIKICAgIGcudXBkYXRlKAogICAgICAgIChuYW1lLCBnZXRhdHRyKG1hbmFnZXIsIG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGRpcihtYW5hZ2VyKQogICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKQogICAgKQoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemVfbWFzdGVyX3dvcmtpbmdfc2V0KCk6CiAgICAiIiIKICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldCBhbmQgbWFrZSB0aGUgYGByZXF1aXJlKClgYAogICAgQVBJIGF2YWlsYWJsZS4KCiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBleHBsaWNpdCBlZmZlY3RzIG9uIHRoZSBnbG9iYWwgc3RhdGUKICAgIG9mIHBrZ19yZXNvdXJjZXMuIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgb25jZSBhdAogICAgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgbW9kdWxlLgoKICAgIEludm9jYXRpb24gYnkgb3RoZXIgcGFja2FnZXMgaXMgdW5zdXBwb3J0ZWQgYW5kIGRvbmUKICAgIGF0IHRoZWlyIG93biByaXNrLgogICAgIiIiCiAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQuX2J1aWxkX21hc3RlcigpCiAgICBfZGVjbGFyZV9zdGF0ZSgnb2JqZWN0Jywgd29ya2luZ19zZXQ9d29ya2luZ19zZXQpCgogICAgcmVxdWlyZSA9IHdvcmtpbmdfc2V0LnJlcXVpcmUKICAgIGl0ZXJfZW50cnlfcG9pbnRzID0gd29ya2luZ19zZXQuaXRlcl9lbnRyeV9wb2ludHMKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyID0gd29ya2luZ19zZXQuc3Vic2NyaWJlCiAgICBydW5fc2NyaXB0ID0gd29ya2luZ19zZXQucnVuX3NjcmlwdAogICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICBydW5fbWFpbiA9IHJ1bl9zY3JpcHQKICAgICMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCB3aXRoIHJlcGxhY2U9RmFsc2UgYW5kCiAgICAjIGVuc3VyZSB0aGF0IGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlCiAgICAjIChlLmcuIGJ5IGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwsCiAgICAjIHdpdGggaGlnaGVyIHByaW9yaXR5IChyZXBsYWNlPVRydWUpLgogICAgdHVwbGUoCiAgICAgICAgZGlzdC5hY3RpdmF0ZShyZXBsYWNlPUZhbHNlKQogICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0CiAgICApCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcigKICAgICAgICBsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZShyZXBsYWNlPVRydWUpLAogICAgICAgIGV4aXN0aW5nPUZhbHNlLAogICAgKQogICAgd29ya2luZ19zZXQuZW50cmllcyA9IFtdCiAgICAjIG1hdGNoIG9yZGVyCiAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGRfZW50cnksIHN5cy5wYXRoKSkKICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgpjbGFzcyBQa2dSZXNvdXJjZXNEZXByZWNhdGlvbldhcm5pbmcoV2FybmluZyk6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIHdhcm5pbmcgYWJvdXQgZGVwcmVjYXRpb25zIGluIGBgcGtnX3Jlc291cmNlc2BgCgogICAgVGhpcyBjbGFzcyBpcyBub3QgZGVyaXZlZCBmcm9tIGBgRGVwcmVjYXRpb25XYXJuaW5nYGAsIGFuZCBhcyBzdWNoIGlzCiAgICB2aXNpYmxlIGJ5IGRlZmF1bHQuCiAgICAiIiIKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAhvNh1H1gAAB9YAAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KIyBDb3B5cmlnaHQgKGMpIDIwMTMgRWRkeSBQZXRyaciZb3IKCiIiIlV0aWxpdGllcyBmb3IgZGV0ZXJtaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgZGlycy4KClNlZSA8aHR0cDovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycz4gZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoiIiIKIyBEZXYgTm90ZXM6CiMgLSBNU0ROIG9uIHdoZXJlIHRvIHN0b3JlIGFwcCBkYXRhIGZpbGVzOgojICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czszMTAyOTQjWFNMVEgzMTk0MTIxMTIzMTIwMTIxMTIwMTIwCiMgLSBNYWMgT1MgWDogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9NYWNPU1gvQ29uY2VwdHVhbC9CUEZpbGVTeXN0ZW0vaW5kZXguaHRtbAojIC0gWERHIHNwZWMgZm9yIFVuKng6IGh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwKCl9fdmVyc2lvbl9pbmZvX18gPSAoMSwgNCwgMykKX192ZXJzaW9uX18gPSAnLicuam9pbihtYXAoc3RyLCBfX3ZlcnNpb25faW5mb19fKSkKCgppbXBvcnQgc3lzCmltcG9ydCBvcwoKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgppZiBQWTM6CiAgICB1bmljb2RlID0gc3RyCgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IHBsYXRmb3JtCiAgICBvc19uYW1lID0gcGxhdGZvcm0uamF2YV92ZXIoKVszXVswXQogICAgaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdXaW5kb3dzJyk6ICMgIldpbmRvd3MgWFAiLCAiV2luZG93cyA3IiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICd3aW4zMicKICAgIGVsaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdNYWMnKTogIyAiTWFjIE9TIFgiLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ2RhcndpbicKICAgIGVsc2U6ICMgIkxpbnV4IiwgIlN1bk9TIiwgIkZyZWVCU0QiLCBldGMuCiAgICAgICAgIyBTZXR0aW5nIHRoaXMgdG8gImxpbnV4MiIgaXMgbm90IGlkZWFsLCBidXQgb25seSBXaW5kb3dzIG9yIE1hYwogICAgICAgICMgYXJlIGFjdHVhbGx5IGNoZWNrZWQgZm9yIGFuZCB0aGUgcmVzdCBvZiB0aGUgbW9kdWxlIGV4cGVjdHMKICAgICAgICAjICpzeXMucGxhdGZvcm0qIHN0eWxlIHN0cmluZ3MuCiAgICAgICAgc3lzdGVtID0gJ2xpbnV4MicKZWxzZToKICAgIHN5c3RlbSA9IHN5cy5wbGF0Zm9ybQoKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgICAgICAgICAgICAgIH4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiAgICAjIG9yIGluICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIFhQIChyb2FtaW5nKTogICAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChub3Qgcm9hbWluZyk6ICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBBdXRob3I+XDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoY29uc3QpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBkYXRhIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19EQVRBX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPicsCiAgICAgICAgICAgIGlmIFhER19EQVRBX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgc2l0ZSBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIC91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+IG9yIC91c3Ivc2hhcmUvPEFwcE5hbWU+CiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xBbGwgVXNlcnNcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQogICAgICAgIFdpbiA3OiAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPiAgICMgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3LgoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0RBVEFfRElSU1swXSBkZWZhdWx0LgoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfQ09NTU9OX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgICMgWERHIGRlZmF1bHQgZm9yICRYREdfREFUQV9ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9ESVJTJywKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGhzZXAuam9pbihbJy91c3IvbG9jYWwvc2hhcmUnLCAnL3Vzci9zaGFyZSddKSkKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgY29uZmlnIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgY29uZmlnIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5jb25maWcvPEFwcE5hbWU+ICAgICAjIG9yIGluICRYREdfQ09ORklHX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgTm9uZSwgcm9hbWluZykKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zaGFyZWQgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm11bHRpcGF0aCIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgYXBwbGljYWJsZSB0byAqbml4CiAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgbGlzdCBvZiBjb25maWcgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0NPTkZJR19ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL2V0Yy94ZGcvPEFwcE5hbWU+JywgaWYgWERHX0NPTkZJR19ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHNpdGUgY29uZmlnIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAvZXRjL3hkZy88QXBwTmFtZT4gb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4gZm9yIGVhY2ggdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgV2luICo6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19DT05GSUdfRElSU1swXSBkZWZhdWx0LCBpZiBtdWx0aXBhdGg9RmFsc2UKCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHNpdGVfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19DT05GSUdfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjYWNoZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJDYWNoZSIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLiBTZWUKICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIH4vTGlicmFyeS9DYWNoZXMvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+IChYREcgZGVmYXVsdCkKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncyBnbyBpbgogICAgdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub24tcm9hbWluZwogICAgYXBwIGRhdGEgZGlyICh0aGUgZGVmYXVsdCByZXR1cm5lZCBieSBgdXNlcl9kYXRhX2RpcmAgYWJvdmUpLiBBcHBzIHR5cGljYWxseQogICAgcHV0IGNhY2hlIGRhdGEgc29tZXdoZXJlICp1bmRlciogdGhlIGdpdmVuIGRpciBoZXJlLiBTb21lIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiQ2FjaGUiKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0NhY2hlcycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ0FDSEVfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcignfi8uY2FjaGUnKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfc3RhdGVfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBzdGF0ZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIHN0YXRlIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgfi8ubG9jYWwvc3RhdGUvPEFwcE5hbWU+ICAgIyBvciBpbiAkWERHX1NUQVRFX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gKjogICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhpcyBEZWJpYW4gcHJvcG9zYWwgPGh0dHBzOi8vd2lraS5kZWJpYW4ub3JnL1hER0Jhc2VEaXJlY3RvcnlTcGVjaWZpY2F0aW9uI3N0YXRlPgogICAgdG8gZXh0ZW5kIHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX1NUQVRFX0hPTUUuCgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc3RhdGUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCBOb25lLCByb2FtaW5nKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfU1RBVEVfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcigifi8ubG9jYWwvc3RhdGUiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfbG9nX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBsb2cgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiTG9ncyIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLCBhbmQgImxvZyIgdG8gdGhlCiAgICAgICAgICAgIGJhc2UgY2FjaGUgZGlyIGZvciBVbml4LiBTZWUgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgbG9nIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBNYWMgT1MgWDogICB+L0xpYnJhcnkvTG9ncy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4vbG9nICAjIG9yIHVuZGVyICRYREdfQ0FDSEVfSE9NRSBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XExvZ3MKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzCiAgICBnbyBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gKE5vdGU6IEknbSBpbnRlcmVzdGVkIGluCiAgICBleGFtcGxlcyBvZiB3aGF0IHNvbWUgd2luZG93cyBhcHBzIHVzZSBmb3IgYSBsb2dzIGRpci4pCgogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJMb2dzIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgCiAgICB2YWx1ZSBmb3IgV2luZG93cyBhbmQgYXBwZW5kcyAibG9nIiB0byB0aGUgdXNlciBjYWNoZSBkaXIgZm9yIFVuaXguCiAgICBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgb3Bpbmlvbj1GYWxzZWAgb3B0aW9uLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvTG9ncycpLAogICAgICAgICAgICBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBwYXRoID0gdXNlcl9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiTG9ncyIpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSB1c2VyX2NhY2hlX2RpcihhcHBuYW1lLCBhcHBhdXRob3IsIHZlcnNpb24pCiAgICAgICAgdmVyc2lvbiA9IEZhbHNlCiAgICAgICAgaWYgb3BpbmlvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAibG9nIikKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBBcHBEaXJzKG9iamVjdCk6CiAgICAiIiJDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBnZXR0aW5nIGFwcGxpY2F0aW9uIGRpcnMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLAogICAgICAgICAgICByb2FtaW5nPUZhbHNlLCBtdWx0aXBhdGg9RmFsc2UpOgogICAgICAgIHNlbGYuYXBwbmFtZSA9IGFwcG5hbWUKICAgICAgICBzZWxmLmFwcGF1dGhvciA9IGFwcGF1dGhvcgogICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICBzZWxmLnJvYW1pbmcgPSByb2FtaW5nCiAgICAgICAgc2VsZi5tdWx0aXBhdGggPSBtdWx0aXBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgbXVsdGlwYXRoPXNlbGYubXVsdGlwYXRoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NhY2hlX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX3N0YXRlX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9zdGF0ZV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9sb2dfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2xvZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKCiMtLS0tIGludGVybmFsIHN1cHBvcnQgc3R1ZmYKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeShjc2lkbF9uYW1lKToKICAgICIiIlRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaWYgUFkzOgogICAgICBpbXBvcnQgd2lucmVnIGFzIF93aW5yZWcKICAgIGVsc2U6CiAgICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXIsIHR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyKGNzaWRsX25hbWUpOgogICAgZnJvbSB3aW4zMmNvbS5zaGVsbCBpbXBvcnQgc2hlbGxjb24sIHNoZWxsCiAgICBkaXIgPSBzaGVsbC5TSEdldEZvbGRlclBhdGgoMCwgZ2V0YXR0cihzaGVsbGNvbiwgY3NpZGxfbmFtZSksIDAsIDApCiAgICAjIFRyeSB0byBtYWtlIHRoaXMgYSB1bmljb2RlIHBhdGggYmVjYXVzZSBTSEdldEZvbGRlclBhdGggZG9lcwogICAgIyBub3QgcmV0dXJuIHVuaWNvZGUgc3RyaW5ncyB3aGVuIHRoZXJlIGlzIHVuaWNvZGUgZGF0YSBpbiB0aGUKICAgICMgcGF0aC4KICAgIHRyeToKICAgICAgICBkaXIgPSB1bmljb2RlKGRpcikKCiAgICAgICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAgICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICAgICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGMgaW4gZGlyOgogICAgICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgd2luMzJhcGkKICAgICAgICAgICAgICAgIGRpciA9IHdpbjMyYXBpLkdldFNob3J0UGF0aE5hbWUoZGlyKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGN0eXBlcwoKICAgIGNzaWRsX2NvbnN0ID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogMjYsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogMzUsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAyOCwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVyhOb25lLCBjc2lkbF9jb25zdCwgTm9uZSwgMCwgYnVmKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGJ1ZjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZjIgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICAgICAgaWYgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTaG9ydFBhdGhOYW1lVyhidWYudmFsdWUsIGJ1ZjIsIDEwMjQpOgogICAgICAgICAgICBidWYgPSBidWYyCgogICAgcmV0dXJuIGJ1Zi52YWx1ZQoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYShjc2lkbF9uYW1lKToKICAgIGltcG9ydCBhcnJheQogICAgZnJvbSBjb20uc3VuIGltcG9ydCBqbmEKICAgIGZyb20gY29tLnN1bi5qbmEucGxhdGZvcm0gaW1wb3J0IHdpbjMyCgogICAgYnVmX3NpemUgPSB3aW4zMi5XaW5EZWYuTUFYX1BBVEggKiAyCiAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgc2hlbGwgPSB3aW4zMi5TaGVsbDMyLklOU1RBTkNFCiAgICBzaGVsbC5TSEdldEZvbGRlclBhdGgoTm9uZSwgZ2V0YXR0cih3aW4zMi5TaGxPYmosIGNzaWRsX25hbWUpLCBOb25lLCB3aW4zMi5TaGxPYmouU0hHRlBfVFlQRV9DVVJSRU5ULCBidWYpCiAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgICAgIGtlcm5lbCA9IHdpbjMyLktlcm5lbDMyLklOU1RBTkNFCiAgICAgICAgaWYga2VybmVsLkdldFNob3J0UGF0aE5hbWUoZGlyLCBidWYsIGJ1Zl9zaXplKToKICAgICAgICAgICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgcmV0dXJuIGRpcgoKaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbjMyY29tLnNoZWxsCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAogICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uc3VuLmpuYQogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfam5hCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKIy0tLS0gc2VsZiB0ZXN0IGNvZGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcHBuYW1lID0gIk15QXBwIgogICAgYXBwYXV0aG9yID0gIk15Q29tcGFueSIKCiAgICBwcm9wcyA9ICgidXNlcl9kYXRhX2RpciIsCiAgICAgICAgICAgICAidXNlcl9jb25maWdfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NhY2hlX2RpciIsCiAgICAgICAgICAgICAidXNlcl9zdGF0ZV9kaXIiLAogICAgICAgICAgICAgInVzZXJfbG9nX2RpciIsCiAgICAgICAgICAgICAic2l0ZV9kYXRhX2RpciIsCiAgICAgICAgICAgICAic2l0ZV9jb25maWdfZGlyIikKCiAgICBwcmludCgiLS0gYXBwIGRpcnMgJXMgLS0iICUgX192ZXJzaW9uX18pCgogICAgcHJpbnQoIi0tIGFwcCBkaXJzICh3aXRoIG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uPSIxLjAiKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRoIGRpc2FibGVkICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3I9RmFsc2UpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKUEsDBBQAAAAAAAAAIQA8KVjG0AIAANACAABRAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KCl9fdGl0bGVfXyA9ICJwYWNrYWdpbmciCl9fc3VtbWFyeV9fID0gIkNvcmUgdXRpbGl0aWVzIGZvciBQeXRob24gcGFja2FnZXMiCl9fdXJpX18gPSAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGFja2FnaW5nIgoKX192ZXJzaW9uX18gPSAiMTYuOCIKCl9fYXV0aG9yX18gPSAiRG9uYWxkIFN0dWZmdCBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMiCl9fZW1haWxfXyA9ICJkb25hbGRAc3R1ZmZ0LmlvIgoKX19saWNlbnNlX18gPSAiQlNEIG9yIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIKX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgMjAxNC0yMDE2ICVzIiAlIF9fYXV0aG9yX18KUEsDBBQAAAAAAAAAIQCBdpbKAQIAAAECAABQAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpmcm9tIC5fX2Fib3V0X18gaW1wb3J0ICgKICAgIF9fYXV0aG9yX18sIF9fY29weXJpZ2h0X18sIF9fZW1haWxfXywgX19saWNlbnNlX18sIF9fc3VtbWFyeV9fLCBfX3RpdGxlX18sCiAgICBfX3VyaV9fLCBfX3ZlcnNpb25fXwopCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQpQSwMEFAAAAAAAAAAhAOZpSuNcAwAAXAMAAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN5cwoKClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCiMgZmxha2U4OiBub3FhCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiCiAgICBDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuCiAgICAiIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQpQSwMEFAAAAAAAAAAhAPr9pBKIBQAAiAUAAFMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCgpjbGFzcyBJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gTmVnYXRpdmVJbmZpbml0eQoKSW5maW5pdHkgPSBJbmZpbml0eSgpCgoKY2xhc3MgTmVnYXRpdmVJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIi1JbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEluZmluaXR5CgpOZWdhdGl2ZUluZmluaXR5ID0gTmVnYXRpdmVJbmZpbml0eSgpClBLAwQUAAAAAAAAACEAMPgT3DggAAA4IAAATwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgUGFyc2VFeGNlcHRpb24sIFBhcnNlUmVzdWx0cywgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgR3JvdXAsIEZvcndhcmQsIFF1b3RlZFN0cmluZwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBTcGVjaWZpZXIsIEludmFsaWRTcGVjaWZpZXIKCgpfX2FsbF9fID0gWwogICAgIkludmFsaWRNYXJrZXIiLCAiVW5kZWZpbmVkQ29tcGFyaXNvbiIsICJVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUiLAogICAgIk1hcmtlciIsICJkZWZhdWx0X2Vudmlyb25tZW50IiwKXQoKCmNsYXNzIEludmFsaWRNYXJrZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgbWFya2VyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRDb21wYXJpc29uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgdmFsdWUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAiIiIKCgpjbGFzcyBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEEgbmFtZSB3YXMgYXR0ZW1wdGVkIHRvIGJlIHVzZWQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbnNpZGUgb2YgdGhlCiAgICBlbnZpcm9ubWVudC4KICAgICIiIgoKCmNsYXNzIE5vZGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi52YWx1ZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9KT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpKQoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIFZhcmlhYmxlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKCmNsYXNzIFZhbHVlKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuICciezB9IicuZm9ybWF0KHNlbGYpCgoKY2xhc3MgT3AoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKVkFSSUFCTEUgPSAoCiAgICBMKCJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfAogICAgTCgiaW1wbGVtZW50YXRpb25fbmFtZSIpIHwKICAgIEwoInB5dGhvbl9mdWxsX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9yZWxlYXNlIikgfAogICAgTCgicGxhdGZvcm1fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX21hY2hpbmUiKSB8CiAgICBMKCJwbGF0Zm9ybV9zeXN0ZW0iKSB8CiAgICBMKCJweXRob25fdmVyc2lvbiIpIHwKICAgIEwoInN5c19wbGF0Zm9ybSIpIHwKICAgIEwoIm9zX25hbWUiKSB8CiAgICBMKCJvcy5uYW1lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJzeXMucGxhdGZvcm0iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnZlcnNpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLm1hY2hpbmUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyB1bmRvY3VtZW50ZWQgc2V0dXB0b29scyBsZWdhY3kKICAgIEwoImV4dHJhIikKKQpBTElBU0VTID0gewogICAgJ29zLm5hbWUnOiAnb3NfbmFtZScsCiAgICAnc3lzLnBsYXRmb3JtJzogJ3N5c19wbGF0Zm9ybScsCiAgICAncGxhdGZvcm0udmVyc2lvbic6ICdwbGF0Zm9ybV92ZXJzaW9uJywKICAgICdwbGF0Zm9ybS5tYWNoaW5lJzogJ3BsYXRmb3JtX21hY2hpbmUnLAogICAgJ3BsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nLAogICAgJ3B5dGhvbl9pbXBsZW1lbnRhdGlvbic6ICdwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24nCn0KVkFSSUFCTEUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhcmlhYmxlKEFMSUFTRVMuZ2V0KHRbMF0sIHRbMF0pKSkKClZFUlNJT05fQ01QID0gKAogICAgTCgiPT09IikgfAogICAgTCgiPT0iKSB8CiAgICBMKCI+PSIpIHwKICAgIEwoIjw9IikgfAogICAgTCgiIT0iKSB8CiAgICBMKCJ+PSIpIHwKICAgIEwoIj4iKSB8CiAgICBMKCI8IikKKQoKTUFSS0VSX09QID0gVkVSU0lPTl9DTVAgfCBMKCJub3QgaW4iKSB8IEwoImluIikKTUFSS0VSX09QLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBPcCh0WzBdKSkKCk1BUktFUl9WQUxVRSA9IFF1b3RlZFN0cmluZygiJyIpIHwgUXVvdGVkU3RyaW5nKCciJykKTUFSS0VSX1ZBTFVFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYWx1ZSh0WzBdKSkKCkJPT0xPUCA9IEwoImFuZCIpIHwgTCgib3IiKQoKTUFSS0VSX1ZBUiA9IFZBUklBQkxFIHwgTUFSS0VSX1ZBTFVFCgpNQVJLRVJfSVRFTSA9IEdyb3VwKE1BUktFUl9WQVIgKyBNQVJLRVJfT1AgKyBNQVJLRVJfVkFSKQpNQVJLRVJfSVRFTS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdHVwbGUodFswXSkpCgpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQoKTUFSS0VSX0VYUFIgPSBGb3J3YXJkKCkKTUFSS0VSX0FUT00gPSBNQVJLRVJfSVRFTSB8IEdyb3VwKExQQVJFTiArIE1BUktFUl9FWFBSICsgUlBBUkVOKQpNQVJLRVJfRVhQUiA8PCBNQVJLRVJfQVRPTSArIFplcm9Pck1vcmUoQk9PTE9QICsgTUFSS0VSX0VYUFIpCgpNQVJLRVIgPSBzdHJpbmdTdGFydCArIE1BUktFUl9FWFBSICsgc3RyaW5nRW5kCgoKZGVmIF9jb2VyY2VfcGFyc2VfcmVzdWx0KHJlc3VsdHMpOgogICAgaWYgaXNpbnN0YW5jZShyZXN1bHRzLCBQYXJzZVJlc3VsdHMpOgogICAgICAgIHJldHVybiBbX2NvZXJjZV9wYXJzZV9yZXN1bHQoaSkgZm9yIGkgaW4gcmVzdWx0c10KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCgpkZWYgX2Zvcm1hdF9tYXJrZXIobWFya2VyLCBmaXJzdD1UcnVlKToKICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICMgU29tZXRpbWVzIHdlIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSBbWy4uLl1dIHdoaWNoIGlzIGEgc2luZ2xlIGl0ZW0gbGlzdAogICAgIyB3aGVyZSB0aGUgc2luZ2xlIGl0ZW0gaXMgaXRzZWxmIGl0J3Mgb3duIGxpc3QuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHNraXAKICAgICMgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBleHRyYW5lb3VzICgpIG9uIHRoZQogICAgIyBvdXRzaWRlLgogICAgaWYgKGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KSBhbmQgbGVuKG1hcmtlcikgPT0gMSBhbmQKICAgICAgICAgICAgaXNpbnN0YW5jZShtYXJrZXJbMF0sIChsaXN0LCB0dXBsZSkpKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIobWFya2VyWzBdKQoKICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICBpbm5lciA9IChfZm9ybWF0X21hcmtlcihtLCBmaXJzdD1GYWxzZSkgZm9yIG0gaW4gbWFya2VyKQogICAgICAgIGlmIGZpcnN0OgogICAgICAgICAgICByZXR1cm4gIiAiLmpvaW4oaW5uZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIoIiArICIgIi5qb2luKGlubmVyKSArICIpIgogICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgIHJldHVybiAiICIuam9pbihbbS5zZXJpYWxpemUoKSBmb3IgbSBpbiBtYXJrZXJdKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFya2VyCgoKX29wZXJhdG9ycyA9IHsKICAgICJpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIGluIHJocywKICAgICJub3QgaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBub3QgaW4gcmhzLAogICAgIjwiOiBvcGVyYXRvci5sdCwKICAgICI8PSI6IG9wZXJhdG9yLmxlLAogICAgIj09Ijogb3BlcmF0b3IuZXEsCiAgICAiIT0iOiBvcGVyYXRvci5uZSwKICAgICI+PSI6IG9wZXJhdG9yLmdlLAogICAgIj4iOiBvcGVyYXRvci5ndCwKfQoKCmRlZiBfZXZhbF9vcChsaHMsIG9wLCByaHMpOgogICAgdHJ5OgogICAgICAgIHNwZWMgPSBTcGVjaWZpZXIoIiIuam9pbihbb3Auc2VyaWFsaXplKCksIHJoc10pKQogICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByZXR1cm4gc3BlYy5jb250YWlucyhsaHMpCgogICAgb3BlciA9IF9vcGVyYXRvcnMuZ2V0KG9wLnNlcmlhbGl6ZSgpKQogICAgaWYgb3BlciBpcyBOb25lOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZENvbXBhcmlzb24oCiAgICAgICAgICAgICJVbmRlZmluZWQgezAhcn0gb24gezEhcn0gYW5kIHsyIXJ9LiIuZm9ybWF0KG9wLCBsaHMsIHJocykKICAgICAgICApCgogICAgcmV0dXJuIG9wZXIobGhzLCByaHMpCgoKX3VuZGVmaW5lZCA9IG9iamVjdCgpCgoKZGVmIF9nZXRfZW52KGVudmlyb25tZW50LCBuYW1lKToKICAgIHZhbHVlID0gZW52aXJvbm1lbnQuZ2V0KG5hbWUsIF91bmRlZmluZWQpCgogICAgaWYgdmFsdWUgaXMgX3VuZGVmaW5lZDoKICAgICAgICByYWlzZSBVbmRlZmluZWRFbnZpcm9ubWVudE5hbWUoCiAgICAgICAgICAgICJ7MCFyfSBkb2VzIG5vdCBleGlzdCBpbiBldmFsdWF0aW9uIGVudmlyb25tZW50LiIuZm9ybWF0KG5hbWUpCiAgICAgICAgKQoKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBfZXZhbHVhdGVfbWFya2VycyhtYXJrZXJzLCBlbnZpcm9ubWVudCk6CiAgICBncm91cHMgPSBbW11dCgogICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG1hcmtlciwgKGxpc3QsIHR1cGxlLCBzdHJpbmdfdHlwZXMpKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlciwgZW52aXJvbm1lbnQpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICAgICAgbGhzLCBvcCwgcmhzID0gbWFya2VyCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxocywgVmFyaWFibGUpOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIGxocy52YWx1ZSkKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IHJocy52YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGhzX3ZhbHVlID0gbGhzLnZhbHVlCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgcmhzLnZhbHVlKQoKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWxfb3AobGhzX3ZhbHVlLCBvcCwgcmhzX3ZhbHVlKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgbWFya2VyIGluIFsiYW5kIiwgIm9yIl0KICAgICAgICAgICAgaWYgbWFya2VyID09ICJvciI6CiAgICAgICAgICAgICAgICBncm91cHMuYXBwZW5kKFtdKQoKICAgIHJldHVybiBhbnkoYWxsKGl0ZW0pIGZvciBpdGVtIGluIGdyb3VwcykKCgpkZWYgZm9ybWF0X2Z1bGxfdmVyc2lvbihpbmZvKToKICAgIHZlcnNpb24gPSAnezAubWFqb3J9LnswLm1pbm9yfS57MC5taWNyb30nLmZvcm1hdChpbmZvKQogICAga2luZCA9IGluZm8ucmVsZWFzZWxldmVsCiAgICBpZiBraW5kICE9ICdmaW5hbCc6CiAgICAgICAgdmVyc2lvbiArPSBraW5kWzBdICsgc3RyKGluZm8uc2VyaWFsKQogICAgcmV0dXJuIHZlcnNpb24KCgpkZWYgZGVmYXVsdF9lbnZpcm9ubWVudCgpOgogICAgaWYgaGFzYXR0cihzeXMsICdpbXBsZW1lbnRhdGlvbicpOgogICAgICAgIGl2ZXIgPSBmb3JtYXRfZnVsbF92ZXJzaW9uKHN5cy5pbXBsZW1lbnRhdGlvbi52ZXJzaW9uKQogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSBzeXMuaW1wbGVtZW50YXRpb24ubmFtZQogICAgZWxzZToKICAgICAgICBpdmVyID0gJzAnCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9ICcnCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wbGVtZW50YXRpb25fbmFtZSI6IGltcGxlbWVudGF0aW9uX25hbWUsCiAgICAgICAgImltcGxlbWVudGF0aW9uX3ZlcnNpb24iOiBpdmVyLAogICAgICAgICJvc19uYW1lIjogb3MubmFtZSwKICAgICAgICAicGxhdGZvcm1fbWFjaGluZSI6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAicGxhdGZvcm1fcmVsZWFzZSI6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAicGxhdGZvcm1fc3lzdGVtIjogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgInBsYXRmb3JtX3ZlcnNpb24iOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgInB5dGhvbl9mdWxsX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICAicHl0aG9uX3ZlcnNpb24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpWzozXSwKICAgICAgICAic3lzX3BsYXRmb3JtIjogc3lzLnBsYXRmb3JtLAogICAgfQoKCmNsYXNzIE1hcmtlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fbWFya2VycyA9IF9jb2VyY2VfcGFyc2VfcmVzdWx0KE1BUktFUi5wYXJzZVN0cmluZyhtYXJrZXIpKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJfc3RyID0gIkludmFsaWQgbWFya2VyOiB7MCFyfSwgcGFyc2UgZXJyb3IgYXQgezEhcn0iLmZvcm1hdCgKICAgICAgICAgICAgICAgIG1hcmtlciwgbWFya2VyW2UubG9jOmUubG9jICsgOF0pCiAgICAgICAgICAgIHJhaXNlIEludmFsaWRNYXJrZXIoZXJyX3N0cikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gX2Zvcm1hdF9tYXJrZXIoc2VsZi5fbWFya2VycykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TWFya2VyKHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpCgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIGVudmlyb25tZW50PU5vbmUpOgogICAgICAgICIiIkV2YWx1YXRlIGEgbWFya2VyLgoKICAgICAgICBSZXR1cm4gdGhlIGJvb2xlYW4gZnJvbSBldmFsdWF0aW5nIHRoZSBnaXZlbiBtYXJrZXIgYWdhaW5zdCB0aGUKICAgICAgICBlbnZpcm9ubWVudC4gZW52aXJvbm1lbnQgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gb3ZlcnJpZGUgYWxsIG9yCiAgICAgICAgcGFydCBvZiB0aGUgZGV0ZXJtaW5lZCBlbnZpcm9ubWVudC4KCiAgICAgICAgVGhlIGVudmlyb25tZW50IGlzIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBQeXRob24gcHJvY2Vzcy4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50ID0gZGVmYXVsdF9lbnZpcm9ubWVudCgpCiAgICAgICAgaWYgZW52aXJvbm1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQudXBkYXRlKGVudmlyb25tZW50KQoKICAgICAgICByZXR1cm4gX2V2YWx1YXRlX21hcmtlcnMoc2VsZi5fbWFya2VycywgY3VycmVudF9lbnZpcm9ubWVudCkKUEsDBBQAAAAAAAAAIQClhh3bAxEAAAMRAABUAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLCBvcmlnaW5hbFRleHRGb3IsIFBhcnNlRXhjZXB0aW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHInW14gXSsnKSgidXJsIikKVVJMID0gKEFUICsgVVJJKQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLAogICAgICAgICAgICAgICAgICAgICAgIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZSkoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAnJykKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEVSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQRVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IFwKICAgIE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50LCBwYXJzZSBlcnJvciBhdCBcInswIXJ9XCIiLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2M6ZS5sb2MgKyA4XSkpCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAHxFg4x5bQAAeW0AAFIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGFiYwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMsIHdpdGhfbWV0YWNsYXNzCmZyb20gLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIExlZ2FjeVZlcnNpb24sIHBhcnNlCgoKY2xhc3MgSW52YWxpZFNwZWNpZmllcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBzcGVjaWZpZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIEJhc2VTcGVjaWZpZXIod2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIG9iamVjdCkpOgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHN0ciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4gVGhpcwogICAgICAgIHNob3VsZCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgU3BlY2lmaWVyIGl0c2VsZi4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBub3QgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYW4gaXRlcmFibGUgb2YgaXRlbXMgYW5kIGZpbHRlcnMgdGhlbSBzbyB0aGF0IG9ubHkgaXRlbXMgd2hpY2gKICAgICAgICBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllciBhcmUgYWxsb3dlZCBpbiBpdC4KICAgICAgICAiIiIKCgpjbGFzcyBfSW5kaXZpZHVhbFNwZWNpZmllcihCYXNlU3BlY2lmaWVyKToKCiAgICBfb3BlcmF0b3JzID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlYz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2goc3BlYykKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRTcGVjaWZpZXIoIkludmFsaWQgc3BlY2lmaWVyOiAnezB9JyIuZm9ybWF0KHNwZWMpKQoKICAgICAgICBzZWxmLl9zcGVjID0gKAogICAgICAgICAgICBtYXRjaC5ncm91cCgib3BlcmF0b3IiKS5zdHJpcCgpLAogICAgICAgICAgICBtYXRjaC5ncm91cCgidmVyc2lvbiIpLnN0cmlwKCksCiAgICAgICAgKQoKICAgICAgICAjIFN0b3JlIHdoZXRoZXIgb3Igbm90IHRoaXMgU3BlY2lmaWVyIHNob3VsZCBhY2NlcHQgcHJlcmVsZWFzZXMKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn17Mn0pPiIuZm9ybWF0KAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgc3RyKHNlbGYpLAogICAgICAgICAgICBwcmUsCiAgICAgICAgKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoKnNlbGYuX3NwZWMpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWMpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyA9PSBvdGhlci5fc3BlYwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgIT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX2dldF9vcGVyYXRvcihzZWxmLCBvcCk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9jb21wYXJlX3swfSIuZm9ybWF0KHNlbGYuX29wZXJhdG9yc1tvcF0pKQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcGVyYXRvcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHByZXJlbGVhc2VzIGFyZSB0byBiZSBhbGxvd2VkIG9yIG5vdC4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBOb3JtYWxpemUgaXRlbSB0byBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiwgdGhpcyBhbGxvd3MgdXMgdG8gaGF2ZQogICAgICAgICMgYSBzaG9ydGN1dCBmb3IgYGAiMi4wIiBpbiBTcGVjaWZpZXIoIj49MiIpCiAgICAgICAgaXRlbSA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzdXBwb3J0aW5nIHByZXJlbGVhc2VzIGluIHRoaXMgc3BlY2lmaWVyCiAgICAgICAgIyBvciBub3QsIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHByZXJlbGVhc2VzIHRoYW4gd2UgY2FuIHNob3J0IGNpcmN1aXQKICAgICAgICAjIGxvZ2ljIGlmIHRoaXMgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2VzLgogICAgICAgIGlmIGl0ZW0uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBBY3R1YWxseSBkbyB0aGUgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIGlzIGNvbnRhaW5lZAogICAgICAgICMgd2l0aGluIHRoaXMgU3BlY2lmaWVyIG9yIG5vdC4KICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKHNlbGYub3BlcmF0b3IpKGl0ZW0sIHNlbGYudmVyc2lvbikKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICB5aWVsZGVkID0gRmFsc2UKICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgIGt3ID0geyJwcmVyZWxlYXNlcyI6IHByZXJlbGVhc2VzIGlmIHByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGVsc2UgVHJ1ZX0KCiAgICAgICAgIyBBdHRlbXB0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgYW5kIGlmIGFueSBvZgogICAgICAgICMgdGhlbSBtYXRjaCwgeWllbGQgdGhlbS4KICAgICAgICBmb3IgdmVyc2lvbiBpbiBpdGVyYWJsZToKICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgICAgICAgICAgaWYgc2VsZi5jb250YWlucyhwYXJzZWRfdmVyc2lvbiwgKiprdyk6CiAgICAgICAgICAgICAgICAjIElmIG91ciB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgYW5kIHdlIHdlcmUgbm90IHNldCB0byBhbGxvdwogICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgdGhlbiB3ZSdsbCBzdG9yZSBpdCBmb3IgbGF0ZXIgaW5jYXNlIG5vdGhpbmcKICAgICAgICAgICAgICAgICMgZWxzZSBtYXRjaGVzIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICAgICAgICAgaWYgKHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAocHJlcmVsZWFzZXMgb3Igc2VsZi5wcmVyZWxlYXNlcykpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgIyBFaXRoZXIgdGhpcyBpcyBub3QgYSBwcmVyZWxlYXNlLCBvciB3ZSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAjIGFjY2VwdGluZyBwcmVyZWxlYXNlcyBmcm9tIHRoZSBiZWdpbmluZy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgaXRlcmF0ZWQgb3ZlciBldmVyeXRoaW5nLCBkZXRlcm1pbmUgaWYgd2UndmUgeWllbGRlZAogICAgICAgICMgYW55IHZhbHVlcywgYW5kIGlmIHdlIGhhdmUgbm90IGFuZCB3ZSBoYXZlIGFueSBwcmVyZWxlYXNlcyBzdG9yZWQgdXAKICAgICAgICAjIHRoZW4gd2Ugd2lsbCBnbyBhaGVhZCBhbmQgeWllbGQgdGhlIHByZXJlbGVhc2VzLgogICAgICAgIGlmIG5vdCB5aWVsZGVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgoKY2xhc3MgTGVnYWN5U3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+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+lAQAApQEAAE0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCByZQoKCl9jYW5vbmljYWxpemVfcmVnZXggPSByZS5jb21waWxlKHIiWy1fLl0rIikKCgpkZWYgY2Fub25pY2FsaXplX25hbWUobmFtZSk6CiAgICAjIFRoaXMgaXMgdGFrZW4gZnJvbSBQRVAgNTAzLgogICAgcmV0dXJuIF9jYW5vbmljYWxpemVfcmVnZXguc3ViKCItIiwgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAA7vxqEkLQAAJC0AAE8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWwogICAgInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iCl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLAogICAgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdLAopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZSgKICAgIHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UsCikKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLCAicHJldmlldyI6ICJjIiwgIi0iOiAiZmluYWwtIiwgInJjIjogImMiLCAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsCiAgICAgICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24ucG9zdFsxXSkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLmRldlsxXSkpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKAogICAgICAgICAgICAgICAgIit7MH0iLmZvcm1hdCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkpCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzdHIoc2VsZikKICAgICAgICBpZiAiKyIgaW4gdmVyc2lvbl9zdHJpbmc6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZy5zcGxpdCgiKyIsIDEpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLmRldiBvciBzZWxmLl92ZXJzaW9uLnByZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLnBvc3QpCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KAogICAgICAgICAgICBpdGVydG9vbHMuZHJvcHdoaWxlKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggPT0gMCwKICAgICAgICAgICAgICAgIHJldmVyc2VkKHJlbGVhc2UpLAogICAgICAgICAgICApCiAgICAgICAgKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoCiAgICAgICAgICAgIChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWwKICAgICAgICApCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQBmD4Sxd4oDAHeKAwBHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHkjIG1vZHVsZSBweXBhcnNpbmcucHkNCiMNCiMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMTggIFBhdWwgVC4gTWNHdWlyZQ0KIw0KIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCiMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlDQojICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcNCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8NCiMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvDQojIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiMNCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQojDQojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULg0KIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQ0KIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiMNCg0KX19kb2NfXyA9IFwNCiIiIg0KcHlwYXJzaW5nIG1vZHVsZSAtIENsYXNzZXMgYW5kIG1ldGhvZHMgdG8gZGVmaW5lIGFuZCBleGVjdXRlIHBhcnNpbmcgZ3JhbW1hcnMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGlzIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2ltcGxlIGdyYW1tYXJzLA0KdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQ0KZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzeW50YXggZm9yIGRlZmluaW5nIGdyYW1tYXJzIG9yIG1hdGNoaW5nIGV4cHJlc3Npb25zIC0gdGhlIHBhcnNpbmcgbW9kdWxlDQpwcm92aWRlcyBhIGxpYnJhcnkgb2YgY2xhc3NlcyB0aGF0IHlvdSB1c2UgdG8gY29uc3RydWN0IHRoZSBncmFtbWFyIGRpcmVjdGx5IGluIFB5dGhvbi4NCg0KSGVyZSBpcyBhIHByb2dyYW0gdG8gcGFyc2UgIkhlbGxvLCBXb3JsZCEiIChvciBhbnkgZ3JlZXRpbmcgb2YgdGhlIGZvcm0gDQpDeyI8c2FsdXRhdGlvbj4sIDxhZGRyZXNzZWU+ISJ9KSwgYnVpbHQgdXAgdXNpbmcgTHtXb3JkfSwgTHtMaXRlcmFsfSwgYW5kIEx7QW5kfSBlbGVtZW50cyANCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvDQpMe0xpdGVyYWx9IGV4cHJlc3Npb25zKTo6DQoNCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzDQoNCiAgICAjIGRlZmluZSBncmFtbWFyIG9mIGEgZ3JlZXRpbmcNCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KDQogICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCg0KVGhlIHByb2dyYW0gb3V0cHV0cyB0aGUgZm9sbG93aW5nOjoNCg0KICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KDQpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQ0KY2xhc3MgbmFtZXMsIGFuZCB0aGUgdXNlIG9mICcrJywgJ3wnIGFuZCAnXicgb3BlcmF0b3JzLg0KDQpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4NCm9iamVjdCB3aXRoIG5hbWVkIGF0dHJpYnV0ZXMuDQoNClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOg0KIC0gZXh0cmEgb3IgbWlzc2luZyB3aGl0ZXNwYWNlICh0aGUgYWJvdmUgcHJvZ3JhbSB3aWxsIGFsc28gaGFuZGxlICJIZWxsbyxXb3JsZCEiLCAiSGVsbG8gICwgIFdvcmxkICAhIiwgZXRjLikNCiAtIHF1b3RlZCBzdHJpbmdzDQogLSBlbWJlZGRlZCBjb21tZW50cw0KDQoNCkdldHRpbmcgU3RhcnRlZCAtDQotLS0tLS0tLS0tLS0tLS0tLQ0KVmlzaXQgdGhlIGNsYXNzZXMgTHtQYXJzZXJFbGVtZW50fSBhbmQgTHtQYXJzZVJlc3VsdHN9IHRvIHNlZSB0aGUgYmFzZSBjbGFzc2VzIHRoYXQgbW9zdCBvdGhlciBweXBhcnNpbmcNCmNsYXNzZXMgaW5oZXJpdCBmcm9tLiBVc2UgdGhlIGRvY3N0cmluZ3MgZm9yIGV4YW1wbGVzIG9mIGhvdyB0bzoNCiAtIGNvbnN0cnVjdCBsaXRlcmFsIG1hdGNoIGV4cHJlc3Npb25zIGZyb20gTHtMaXRlcmFsfSBhbmQgTHtDYXNlbGVzc0xpdGVyYWx9IGNsYXNzZXMNCiAtIGNvbnN0cnVjdCBjaGFyYWN0ZXIgd29yZC1ncm91cCBleHByZXNzaW9ucyB1c2luZyB0aGUgTHtXb3JkfSBjbGFzcw0KIC0gc2VlIGhvdyB0byBjcmVhdGUgcmVwZXRpdGl2ZSBleHByZXNzaW9ucyB1c2luZyBMe1plcm9Pck1vcmV9IGFuZCBMe09uZU9yTW9yZX0gY2xhc3Nlcw0KIC0gdXNlIEx7JysnPEFuZD59LCBMeyd8JzxNYXRjaEZpcnN0Pn0sIEx7J14nPE9yPn0sIGFuZCBMeycmJzxFYWNoPn0gb3BlcmF0b3JzIHRvIGNvbWJpbmUgc2ltcGxlIGV4cHJlc3Npb25zIGludG8gbW9yZSBjb21wbGV4IG9uZXMNCiAtIGFzc29jaWF0ZSBuYW1lcyB3aXRoIHlvdXIgcGFyc2VkIHJlc3VsdHMgdXNpbmcgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfQ0KIC0gZmluZCBzb21lIGhlbHBmdWwgZXhwcmVzc2lvbiBzaG9ydC1jdXRzIGxpa2UgTHtkZWxpbWl0ZWRMaXN0fSBhbmQgTHtvbmVPZn0NCiAtIGZpbmQgbW9yZSB1c2VmdWwgY29tbW9uIGV4cHJlc3Npb25zIGluIHRoZSBMe3B5cGFyc2luZ19jb21tb259IG5hbWVzcGFjZSBjbGFzcw0KIiIiDQoNCl9fdmVyc2lvbl9fID0gIjIuMi4xIg0KX192ZXJzaW9uVGltZV9fID0gIjE4IFNlcCAyMDE4IDAwOjQ5IFVUQyINCl9fYXV0aG9yX18gPSAiUGF1bCBNY0d1aXJlIDxwdG1jZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ig0KDQppbXBvcnQgc3RyaW5nDQpmcm9tIHdlYWtyZWYgaW1wb3J0IHJlZiBhcyB3a3JlZg0KaW1wb3J0IGNvcHkNCmltcG9ydCBzeXMNCmltcG9ydCB3YXJuaW5ncw0KaW1wb3J0IHJlDQppbXBvcnQgc3JlX2NvbnN0YW50cw0KaW1wb3J0IGNvbGxlY3Rpb25zDQppbXBvcnQgcHByaW50DQppbXBvcnQgdHJhY2ViYWNrDQppbXBvcnQgdHlwZXMNCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lDQoNCnRyeToNCiAgICBmcm9tIF90aHJlYWQgaW1wb3J0IFJMb2NrDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrDQoNCnRyeToNCiAgICAjIFB5dGhvbiAzDQogICAgZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEl0ZXJhYmxlDQogICAgZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IE11dGFibGVNYXBwaW5nDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgIyBQeXRob24gMi43DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgSXRlcmFibGUNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZw0KDQp0cnk6DQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgdHJ5Og0KICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgICAgIF9PcmRlcmVkRGljdCA9IE5vbmUNCg0KI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQ0KDQpfX2FsbF9fID0gWw0KJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLA0KJ0ZvbGxvd2VkQnknLCAnRm9yd2FyZCcsICdHb1RvQ29sdW1uJywgJ0dyb3VwJywgJ0tleXdvcmQnLCAnTGluZUVuZCcsICdMaW5lU3RhcnQnLCAnTGl0ZXJhbCcsDQonTWF0Y2hGaXJzdCcsICdOb01hdGNoJywgJ05vdEFueScsICdPbmVPck1vcmUnLCAnT25seU9uY2UnLCAnT3B0aW9uYWwnLCAnT3InLA0KJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywNCidQYXJzZVJlc3VsdHMnLCAnUGFyc2VTeW50YXhFeGNlcHRpb24nLCAnUGFyc2VyRWxlbWVudCcsICdRdW90ZWRTdHJpbmcnLCAnUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbicsDQonUmVnZXgnLCAnU2tpcFRvJywgJ1N0cmluZ0VuZCcsICdTdHJpbmdTdGFydCcsICdTdXBwcmVzcycsICdUb2tlbicsICdUb2tlbkNvbnZlcnRlcicsIA0KJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsDQonYWxwaGFudW1zJywgJ2FscGhhcycsICdhbHBoYXM4Yml0JywgJ2FueUNsb3NlVGFnJywgJ2FueU9wZW5UYWcnLCAnY1N0eWxlQ29tbWVudCcsICdjb2wnLA0KJ2NvbW1hU2VwYXJhdGVkTGlzdCcsICdjb21tb25IVE1MRW50aXR5JywgJ2NvdW50ZWRBcnJheScsICdjcHBTdHlsZUNvbW1lbnQnLCAnZGJsUXVvdGVkU3RyaW5nJywNCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsDQonaHRtbENvbW1lbnQnLCAnamF2YVN0eWxlQ29tbWVudCcsICdsaW5lJywgJ2xpbmVFbmQnLCAnbGluZVN0YXJ0JywgJ2xpbmVubycsDQonbWFrZUhUTUxUYWdzJywgJ21ha2VYTUxUYWdzJywgJ21hdGNoT25seUF0Q29sJywgJ21hdGNoUHJldmlvdXNFeHByJywgJ21hdGNoUHJldmlvdXNMaXRlcmFsJywNCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLA0KJ3B1bmM4Yml0JywgJ3B5dGhvblN0eWxlQ29tbWVudCcsICdxdW90ZWRTdHJpbmcnLCAncmVtb3ZlUXVvdGVzJywgJ3JlcGxhY2VIVE1MRW50aXR5JywgDQoncmVwbGFjZVdpdGgnLCAncmVzdE9mTGluZScsICdzZ2xRdW90ZWRTdHJpbmcnLCAnc3JhbmdlJywgJ3N0cmluZ0VuZCcsDQonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywNCidpbmRlbnRlZEJsb2NrJywgJ29yaWdpbmFsVGV4dEZvcicsICd1bmdyb3VwJywgJ2luZml4Tm90YXRpb24nLCdsb2NhdGVkRXhwcicsICd3aXRoQ2xhc3MnLA0KJ0Nsb3NlTWF0Y2gnLCAndG9rZW5NYXAnLCAncHlwYXJzaW5nX2NvbW1vbicsDQpdDQoNCnN5c3RlbV92ZXJzaW9uID0gdHVwbGUoc3lzLnZlcnNpb25faW5mbylbOjNdDQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMw0KaWYgUFlfMzoNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhzaXplDQogICAgYmFzZXN0cmluZyA9IHN0cg0KICAgIHVuaWNociA9IGNocg0KICAgIF91c3RyID0gc3RyDQoNCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbc3VtLCBsZW4sIHNvcnRlZCwgcmV2ZXJzZWQsIGxpc3QsIHR1cGxlLCBzZXQsIGFueSwgYWxsLCBtaW4sIG1heF0NCg0KZWxzZToNCiAgICBfTUFYX0lOVCA9IHN5cy5tYXhpbnQNCiAgICByYW5nZSA9IHhyYW5nZQ0KDQogICAgZGVmIF91c3RyKG9iaik6DQogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMNCiAgICAgICAgICAgc3RyKG9iaikuIElmIHRoYXQgZmFpbHMgd2l0aCBhIFVuaWNvZGVFbmNvZGVFcnJvciwgdGhlbiBpdCB0cmllcyB1bmljb2RlKG9iaikuIEl0DQogICAgICAgICAgIHRoZW4gPCByZXR1cm5zIHRoZSB1bmljb2RlIG9iamVjdCB8IGVuY29kZXMgaXQgd2l0aCB0aGUgZGVmYXVsdCBlbmNvZGluZyB8IC4uLiA+Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosdW5pY29kZSk6DQogICAgICAgICAgICByZXR1cm4gb2JqDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgIyBJZiB0aGlzIHdvcmtzLCB0aGVuIF91c3RyKG9iaikgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBzdHIob2JqKSwgc28NCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuDQogICAgICAgICAgICByZXR1cm4gc3RyKG9iaikNCg0KICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOg0KICAgICAgICAgICAgIyBFbHNlIGVuY29kZSBpdA0KICAgICAgICAgICAgcmV0ID0gdW5pY29kZShvYmopLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICd4bWxjaGFycmVmcmVwbGFjZScpDQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgocicmI1xkKzsnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pDQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQ0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdDQogICAgaW1wb3J0IF9fYnVpbHRpbl9fDQogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNpbmdsZUFyZ0J1aWx0aW5zLmFwcGVuZChnZXRhdHRyKF9fYnVpbHRpbl9fLGZuYW1lKSkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIA0KX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkNCiANCmRlZiBfeG1sX2VzY2FwZShkYXRhKToNCiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIg0KDQogICAgIyBhbXBlcnNhbmQgbXVzdCBiZSByZXBsYWNlZCBmaXJzdA0KICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnDQogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpDQogICAgZm9yIGZyb21fLHRvXyBpbiB6aXAoZnJvbV9zeW1ib2xzLCB0b19zeW1ib2xzKToNCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQ0KICAgIHJldHVybiBkYXRhDQoNCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToNCiAgICBwYXNzDQoNCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQ0KbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5Ig0KaGV4bnVtcyAgICA9IG51bXMgKyAiQUJDREVGYWJjZGVmIg0KYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMNCl9ic2xhc2ggICAgPSBjaHIoOTIpDQpwcmludGFibGVzID0gIiIuam9pbihjIGZvciBjIGluIHN0cmluZy5wcmludGFibGUgaWYgYyBub3QgaW4gc3RyaW5nLndoaXRlc3BhY2UpDQoNCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgcGFyc2luZyBydW50aW1lIGV4Y2VwdGlvbnMiIiINCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBzdHIsIGxvYz0wLCBtc2c9Tm9uZSwgZWxlbT1Ob25lICk6DQogICAgICAgIHNlbGYubG9jID0gbG9jDQogICAgICAgIGlmIG1zZyBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBwc3RyDQogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBtc2cNCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHINCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQ0KICAgICAgICBzZWxmLmFyZ3MgPSAocHN0ciwgbG9jLCBtc2cpDQoNCiAgICBAY2xhc3NtZXRob2QNCiAgICBkZWYgX2Zyb21fZXhjZXB0aW9uKGNscywgcGUpOg0KICAgICAgICAiIiINCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gDQogICAgICAgIGZyb20gYW5vdGhlciAtIGF2b2lkcyBoYXZpbmcgX19pbml0X18gc2lnbmF0dXJlIGNvbmZsaWN0cyBhbW9uZyBzdWJjbGFzc2VzDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOg0KICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgICAgICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSBpbiAoImNvbCIsICJjb2x1bW4iKSApOg0KICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmUoIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXA0KICAgICAgICAgICAgICAgICggc2VsZi5tc2csIHNlbGYubG9jLCBzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4gKQ0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCiAgICBkZWYgbWFya0lucHV0bGluZSggc2VsZiwgbWFya2VyU3RyaW5nID0gIj4hPCIgKToNCiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzDQogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4NCiAgICAgICAgIiIiDQogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lDQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxDQogICAgICAgIGlmIG1hcmtlclN0cmluZzoNCiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkNCiAgICAgICAgcmV0dXJuIGxpbmVfc3RyLnN0cmlwKCkNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkNCg0KY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiINCiAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2UgZXhwcmVzc2lvbnMgZG9uJ3QgbWF0Y2ggY2xhc3M7DQogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpDQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgIHByaW50KHBlKQ0KICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQ0KICAgICAgICAgICAgDQogICAgcHJpbnRzOjoNCiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgY29sdW1uOiAxDQogICAgIiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50DQogICAgICAgaXMgZm91bmQ7IHN0b3BzIGFsbCBwYXJzaW5nIGltbWVkaWF0ZWx5IiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZVN5bnRheEV4Y2VwdGlvbihQYXJzZUZhdGFsRXhjZXB0aW9uKToNCiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4NCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCANCiAgICAgICBpbW1lZGlhdGVseSBiZWNhdXNlIGFuIHVuYmFja3RyYWNrYWJsZSBzeW50YXggZXJyb3IgaGFzIGJlZW4gZm91bmQiIiINCiAgICBwYXNzDQoNCiN+IGNsYXNzIFJlcGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQ0KICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6DQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIGlucHV0IHN0cmluZywgYW5kL29yDQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uDQogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlDQogICAgICAgI34gZXhjZXB0aW9uIGluIGEgcGFyc2UgYWN0aW9uIHRvIGNhdXNlIHB5cGFyc2luZyB0byB1c2UgdGhlIG5ldyBzdHJpbmcvbG9jYXRpb24uDQogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLg0KICAgICAgICN+ICIiIg0KICAgICN+IGRlZiBfX2luaXRfKCBzZWxmLCBuZXdzdHJpbmcsIHJlc3RhcnRMb2MgKToNCiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcNCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYw0KDQpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UNCg0KY2xhc3MgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQob2JqZWN0KToNCiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6DQogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQ0KICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGkpOg0KICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0NCiAgICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIHJldHVybiByZXByKHNlbGYudHVwWzBdKQ0KICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToNCiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkNCg0KY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6DQogICAgIiIiDQogICAgU3RydWN0dXJlZCBwYXJzZSByZXN1bHRzLCB0byBwcm92aWRlIG11bHRpcGxlIG1lYW5zIG9mIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGE6DQogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkNCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pDQogICAgICAgLSBieSBhdHRyaWJ1dGUgKEN7cmVzdWx0cy48cmVzdWx0c05hbWU+fSAtIHNlZSBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQoNCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQoNCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6DQogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkNCiAgICAgICAgdGVzdCgibGlzdChyZXN1bHQpIikNCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikNCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikNCiAgICAgICAgdGVzdCgicmVzdWx0LmRheSIpDQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kdW1wKCkiLCBzdHIpDQogICAgcHJpbnRzOjoNCiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICByZXN1bHRbMF0gLT4gJzE5OTknDQogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInDQogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJw0KICAgICAgICAnbW9udGgnIGluIHJlc3VsdCAtPiBUcnVlDQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UNCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgLSBkYXk6IDMxDQogICAgICAgIC0gbW9udGg6IDEyDQogICAgICAgIC0geWVhcjogMTk5OQ0KICAgICIiIg0KICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToNCiAgICAgICAgICAgIHJldHVybiB0b2tsaXN0DQogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykNCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gcmV0b2JqDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6DQogICAgICAgICAgICBzZWxmLl9fZG9pbml0ID0gRmFsc2UNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QNCiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsDQogICAgICAgICAgICBpZiB0b2tsaXN0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gdG9rbGlzdFs6XQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0NCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpDQoNCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToNCiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoNCiAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lc1tuYW1lXSA9IDANCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbIHRva2xpc3QgXQ0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rbGlzdC5jb3B5KCksMCkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXS5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3RbMF0NCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdA0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3RbaV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtpXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkNCg0KICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbdl0NCiAgICAgICAgICAgIHN1YiA9IHZbMF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3Rba10gPSB2DQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodiwwKV0NCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHN1Yi5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQoNCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0NCg0KICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOg0KICAgICAgICAgICAgICAgIGlmIGkgPCAwOg0KICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuDQogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkNCiAgICAgICAgICAgICMgZ2V0IHJlbW92ZWQgaW5kaWNlcw0KICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQ0KICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkNCiAgICAgICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6DQogICAgICAgICAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rZGljdFtpXQ0KDQogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOg0KICAgICAgICByZXR1cm4gayBpbiBzZWxmLl9fdG9rZGljdA0KDQogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKTogcmV0dXJuICggbm90IG5vdCBzZWxmLl9fdG9rbGlzdCApDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX3JldmVyc2VkX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0Wzo6LTFdICkNCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0Lml0ZXJrZXlzKCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQ0KDQogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KICAgICAgICAgICAgDQogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCg0KICAgIGlmIFBZXzM6DQogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgZWxzZToNCiAgICAgICAgaXRlcmtleXMgPSBfaXRlcmtleXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcnZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcml0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBkZWYga2V5cyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkNCg0KICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlcyAoYXMgYSBsaXN0IG9mIHR1cGxlcyBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpDQoNCiAgICBkZWYgaGFza2V5cyggc2VsZiApOg0KICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcNCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiDQogICAgICAgIHJldHVybiBib29sKHNlbGYuX190b2tkaWN0KQ0KICAgICAgICANCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4NCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubw0KICAgICAgICBhcmd1bWVudCBvciBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSBDe2xpc3R9IHNlbWFudGljcw0KICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIA0KICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9DQogICAgICAgIHNlbWFudGljcyBhbmQgcG9wIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYW55IGRlZmluZWQgDQogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIA0KICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKDApDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCg0KICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90DQogICAgICAgICAgICAjIHJlbW92ZWQgZnJvbSBsaXN0IGZvcm0gb2YgcmVzdWx0cykNCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpDQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgLSBMQUJFTDogQUFCDQoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IGFyZ3M6DQogICAgICAgICAgICBhcmdzID0gWy0xXQ0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOg0KICAgICAgICAgICAgaWYgayA9PSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInBvcCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBrKQ0KICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdIGluIHNlbGYpOg0KICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdDQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgZGVsIHNlbGZbaW5kZXhdDQogICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWZhdWx0dmFsdWUgPSBhcmdzWzFdDQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlDQoNCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdFZhbHVlPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8NCiAgICAgICAgc3VjaCBuYW1lLCB0aGVuIHJldHVybnMgdGhlIGdpdmVuIEN7ZGVmYXVsdFZhbHVlfSBvciBDe05vbmV9IGlmIG5vDQogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuDQoNCiAgICAgICAgU2ltaWxhciB0byBDe2RpY3QuZ2V0KCl9Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiKSkgIyAtPiBOb25lDQogICAgICAgICIiIg0KICAgICAgICBpZiBrZXkgaW4gc2VsZjoNCiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUNCg0KICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgbG9jYXRpb24gaW5kZXggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4NCiAgICAgICAgDQogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQoMCwgbG9jbikNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0Lmluc2VydChpbmRleCwgaW5zU3RyKQ0KICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBpdGVtICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQNCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzdW0obWFwKGludCwgdG9rZW5zKSkpDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuYXBwZW5kKGl0ZW0pDQoNCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGFwcGVuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbWF0Y2hlZCBzdHJpbmdzLCB0byBtYWtlIGEgcGFsaW5kcm9tZQ0KICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpDQogICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odG9rZW5zKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zZXEsIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXENCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0LmV4dGVuZChpdGVtc2VxKQ0KDQogICAgZGVmIGNsZWFyKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbOl0NCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBuYW1lICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgDQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Rva2RpY3Q6DQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gIiINCg0KICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICByZXQgPSBzZWxmLmNvcHkoKQ0KICAgICAgICByZXQgKz0gb3RoZXINCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6DQogICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3Rva2xpc3QpDQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0DQogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgIG90aGVyZGljdGl0ZW1zID0gWyhrLCBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2WzBdLGFkZG9mZnNldCh2WzFdKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdDQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOg0KICAgICAgICAgICAgICAgIHNlbGZba10gPSB2DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KICAgICAgICAgICAgDQogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdA0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCkgYW5kIG90aGVyID09IDA6DQogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluDQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdA0KICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KICAgICAgICANCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJw0KDQogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9fdG9rbGlzdDoNCiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSggaXRlbSwgUGFyc2VSZXN1bHRzICk6DQogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIF91c3RyKGl0ZW0pICkNCiAgICAgICAgcmV0dXJuIG91dA0KDQogICAgZGVmIGFzTGlzdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICByZXN1bHQgPSBwYXR0LnBhcnNlU3RyaW5nKCJzbGRraiBsc2RraiBzbGRraiIpDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdA0KICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2xpc3QpLCByZXN1bHRfbGlzdCkgIyAtPiA8Y2xhc3MgJ2xpc3QnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0NCg0KICAgIGRlZiBhc0RpY3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIG5hbWVkIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgZGljdGlvbmFyeS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0X2RpY3QgPSByZXN1bHQuYXNEaWN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQ0KDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIGEgUGFyc2VSZXN1bHRzIHN1cHBvcnRzIGRpY3QtbGlrZSBhY2Nlc3MsIHNvbWV0aW1lIHlvdSBqdXN0IG5lZWQgdG8gaGF2ZSBhIGRpY3QNCiAgICAgICAgICAgIGltcG9ydCBqc29uDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUNCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LmFzRGljdCgpKSkgIyAtPiB7Im1vbnRoIjogIjMxIiwgImRheSI6ICIxOTk5IiwgInllYXIiOiAiMTIifQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgUFlfMzoNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZW1zDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMNCiAgICAgICAgICAgIA0KICAgICAgICBkZWYgdG9JdGVtKG9iaik6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBvYmouaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b0l0ZW0odikgZm9yIHYgaW4gb2JqXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqDQogICAgICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpDQogICAgICAgIHJldC5fX3BhcmVudCA9IHNlbGYuX19wYXJlbnQNCiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIG5sID0gIlxuIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZsaXN0KQ0KICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiDQoNCiAgICAgICAgIyBjb2xsYXBzZSBvdXQgaW5kZW50cyBpZiBmb3JtYXR0aW5nIGlzIG5vdCBkZXNpcmVkDQogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6DQogICAgICAgICAgICBpbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmV4dExldmVsSW5kZW50ID0gIiINCiAgICAgICAgICAgIG5sID0gIiINCg0KICAgICAgICBzZWxmVGFnID0gTm9uZQ0KICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUNCg0KICAgICAgICBpZiBub3Qgc2VsZlRhZzoNCiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQ0KDQogICAgICAgIGZvciBpLHJlcyBpbiBlbnVtZXJhdGUoc2VsZi5fX3Rva2xpc3QpOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChuYW1lZEl0ZW1zW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQNCiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lDQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldDQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoNCiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gIklURU0iDQogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQ0KICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0NCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPC8iLCBzZWxmVGFnLCAiPiIgXQ0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgX19sb29rdXAoc2VsZixzdWIpOg0KICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0Og0KICAgICAgICAgICAgICAgIGlmIHN1YiBpcyB2Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaw0KICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGdldE5hbWUoc2VsZik6DQogICAgICAgIHIiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0cyBuYW1lIGZvciB0aGlzIHRva2VuIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHNldmVyYWwgDQogICAgICAgIGRpZmZlcmVudCBleHByZXNzaW9ucyBtaWdodCBtYXRjaCBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgc3NuX2V4cHIgPSBSZWdleChyIlxkXGRcZC1cZFxkLVxkXGRcZFxkIikNCiAgICAgICAgICAgIGhvdXNlX251bWJlcl9leHByID0gU3VwcHJlc3MoJyMnKSArIFdvcmQobnVtcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgdXNlcl9kYXRhID0gKEdyb3VwKGhvdXNlX251bWJlcl9leHByKSgiaG91c2VfbnVtYmVyIikgDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKHNzbl9leHByKSgic3NuIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoaW50ZWdlcikoImFnZSIpKQ0KICAgICAgICAgICAgdXNlcl9pbmZvID0gT25lT3JNb3JlKHVzZXJfZGF0YSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9pbmZvLnBhcnNlU3RyaW5nKCIyMiAxMTEtMjItMzMzMyAjMjIxQiIpDQogICAgICAgICAgICBmb3IgaXRlbSBpbiByZXN1bHQ6DQogICAgICAgICAgICAgICAgcHJpbnQoaXRlbS5nZXROYW1lKCksICc6JywgaXRlbVswXSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIGFnZSA6IDIyDQogICAgICAgICAgICBzc24gOiAxMTEtMjItMzMzMw0KICAgICAgICAgICAgaG91c2VfbnVtYmVyIDogMjIxQg0KICAgICAgICAiIiINCiAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUNCiAgICAgICAgZWxpZiBzZWxmLl9fcGFyZW50Og0KICAgICAgICAgICAgcGFyID0gc2VsZi5fX3BhcmVudCgpDQogICAgICAgICAgICBpZiBwYXI6DQogICAgICAgICAgICAgICAgcmV0dXJuIHBhci5fX2xvb2t1cChzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICBlbGlmIChsZW4oc2VsZikgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIGxlbihzZWxmLl9fdG9rZGljdCkgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC52YWx1ZXMoKSkpWzBdWzFdIGluICgwLC0xKSk6DQogICAgICAgICAgICByZXR1cm4gbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LmtleXMoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGR1bXAoc2VsZiwgaW5kZW50PScnLCBkZXB0aD0wLCBmdWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgRGlhZ25vc3RpYyBtZXRob2QgZm9yIGxpc3Rpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBhIEN7UGFyc2VSZXN1bHRzfS4NCiAgICAgICAgQWNjZXB0cyBhbiBvcHRpb25hbCBDe2luZGVudH0gYXJndW1lbnQgc28gdGhhdCB0aGlzIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQNCiAgICAgICAgaW4gYSBuZXN0ZWQgZGlzcGxheSBvZiBvdGhlciBkYXRhLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10NCiAgICAgICAgICAgIC0gZGF5OiAxOTk5DQogICAgICAgICAgICAtIG1vbnRoOiAzMQ0KICAgICAgICAgICAgLSB5ZWFyOiAxMg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgTkwgPSAnXG4nDQogICAgICAgIG91dC5hcHBlbmQoIGluZGVudCtfdXN0cihzZWxmLmFzTGlzdCgpKSApDQogICAgICAgIGlmIGZ1bGw6DQogICAgICAgICAgICBpZiBzZWxmLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZCgoc3RyKGspLCB2KSBmb3Igayx2IGluIHNlbGYuaXRlbXMoKSkNCiAgICAgICAgICAgICAgICBmb3Igayx2IGluIGl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKE5MKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCAiJXMlcy0gJXM6ICIgJSAoaW5kZW50LCgnICAnKmRlcHRoKSwgaykgKQ0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggdi5kdW1wKGluZGVudCxkZXB0aCsxKSApDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoX3VzdHIodikpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlcHIodikpDQogICAgICAgICAgICBlbGlmIGFueShpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cykgZm9yIHZ2IGluIHNlbGYpOg0KICAgICAgICAgICAgICAgIHYgPSBzZWxmDQogICAgICAgICAgICAgICAgZm9yIGksdnYgaW4gZW51bWVyYXRlKHYpOg0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSx2di5kdW1wKGluZGVudCxkZXB0aCsxKSApKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksX3VzdHIodnYpKSkNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgcHByaW50KHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBQcmV0dHktcHJpbnRlciBmb3IgcGFyc2VkIHJlc3VsdHMgYXMgYSBsaXN0LCB1c2luZyB0aGUgQ3twcHJpbnR9IG1vZHVsZS4NCiAgICAgICAgQWNjZXB0cyBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmdzIGFzIGRlZmluZWQgZm9yIHRoZSANCiAgICAgICAgQ3twcHJpbnQucHByaW50fSBtZXRob2QuIChVe2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3BwcmludC5odG1sI3BwcmludC5wcHJpbnR9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZnVuYyA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtIHwgR3JvdXAoJygnICsgZnVuYyArICcpJykNCiAgICAgICAgICAgIGZ1bmMgPDw9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgICAgICByZXN1bHQgPSBmdW5jLnBhcnNlU3RyaW5nKCJmbmEgYSxiLChmbmIgYyxkLDIwMCksMTAwIikNCiAgICAgICAgICAgIHJlc3VsdC5wcHJpbnQod2lkdGg9NDApDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ2ZuYScsDQogICAgICAgICAgICAgWydhJywNCiAgICAgICAgICAgICAgJ2InLA0KICAgICAgICAgICAgICBbJygnLCAnZm5iJywgWydjJywgJ2QnLCAnMjAwJ10sICcpJ10sDQogICAgICAgICAgICAgICcxMDAnXV0NCiAgICAgICAgIiIiDQogICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5hc0xpc3QoKSwgKmFyZ3MsICoqa3dhcmdzKQ0KDQogICAgIyBhZGQgc3VwcG9ydCBmb3IgcGlja2xlIHByb3RvY29sDQogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICggc2VsZi5fX3Rva2xpc3QsDQogICAgICAgICAgICAgICAgICggc2VsZi5fX3Rva2RpY3QuY29weSgpLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYuX19wYXJlbnQoKSBvciBOb25lLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19uYW1lICkgKQ0KDQogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLHN0YXRlKToNCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBzdGF0ZVswXQ0KICAgICAgICAoc2VsZi5fX3Rva2RpY3QsDQogICAgICAgICBwYXIsDQogICAgICAgICBpbkFjY3VtTmFtZXMsDQogICAgICAgICBzZWxmLl9fbmFtZSkgPSBzdGF0ZVsxXQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZShpbkFjY3VtTmFtZXMpDQogICAgICAgIGlmIHBhciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSB3a3JlZihwYXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KDQogICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3QsIHNlbGYuX19uYW1lLCBzZWxmLl9fYXNMaXN0LCBzZWxmLl9fbW9kYWwNCg0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKGRpcih0eXBlKHNlbGYpKSArIGxpc3Qoc2VsZi5rZXlzKCkpKQ0KDQpNdXRhYmxlTWFwcGluZy5yZWdpc3RlcihQYXJzZVJlc3VsdHMpDQoNCmRlZiBjb2wgKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgY29sdW1uIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGNvbHVtbiBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHMgPSBzdHJnDQogICAgcmV0dXJuIDEgaWYgMDxsb2M8bGVuKHMpIGFuZCBzW2xvYy0xXSA9PSAnXG4nIGVsc2UgbG9jIC0gcy5yZmluZCgiXG4iLCAwLCBsb2MpDQoNCmRlZiBsaW5lbm8obG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBsaW5lIG51bWJlciB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBsaW5lIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcmV0dXJuIHN0cmcuY291bnQoIlxuIiwwLGxvYykgKyAxDQoNCmRlZiBsaW5lKCBsb2MsIHN0cmcgKToNCiAgICAiIiJSZXR1cm5zIHRoZSBsaW5lIG9mIHRleHQgY29udGFpbmluZyBsb2Mgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICAgICAgIiIiDQogICAgbGFzdENSID0gc3RyZy5yZmluZCgiXG4iLCAwLCBsb2MpDQogICAgbmV4dENSID0gc3RyZy5maW5kKCJcbiIsIGxvYykNCiAgICBpZiBuZXh0Q1IgPj0gMDoNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6bmV4dENSXQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOl0NCg0KZGVmIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciApOg0KICAgIHByaW50ICgoIk1hdGNoICIgKyBfdXN0cihleHByKSArICIgYXQgbG9jICIgKyBfdXN0cihsb2MpICsgIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkpDQoNCmRlZiBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIHN0YXJ0bG9jLCBlbmRsb2MsIGV4cHIsIHRva3MgKToNCiAgICBwcmludCAoIk1hdGNoZWQgIiArIF91c3RyKGV4cHIpICsgIiAtPiAiICsgc3RyKHRva3MuYXNMaXN0KCkpKQ0KDQpkZWYgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciwgZXhjICk6DQogICAgcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIgKyBfdXN0cihleGMpKQ0KDQpkZWYgbnVsbERlYnVnQWN0aW9uKCphcmdzKToNCiAgICAiIiInRG8tbm90aGluZycgZGVidWcgYWN0aW9uLCB0byBzdXBwcmVzcyBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBwYXJzaW5nLiIiIg0KICAgIHBhc3MNCg0KIyBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLnggLSBub25sb2NhbCBpcyB0b3hpYyB0byBQeXRob24gMiBpbnN0YWxscw0KI34gJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KI34gZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Myk6DQogICAgI34gaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgI34gcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgICN+IGxpbWl0ID0gMA0KICAgICN+IGZvdW5kQXJpdHkgPSBGYWxzZQ0KICAgICN+IGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgI34gbm9ubG9jYWwgbGltaXQsZm91bmRBcml0eQ0KICAgICAgICAjfiB3aGlsZSAxOg0KICAgICAgICAgICAgI34gdHJ5Og0KICAgICAgICAgICAgICAgICN+IHJldCA9IGZ1bmMoKmFyZ3NbbGltaXQ6XSkNCiAgICAgICAgICAgICAgICAjfiBmb3VuZEFyaXR5ID0gVHJ1ZQ0KICAgICAgICAgICAgICAgICN+IHJldHVybiByZXQNCiAgICAgICAgICAgICN+IGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgI34gaWYgbGltaXQgPT0gbWF4YXJncyBvciBmb3VuZEFyaXR5Og0KICAgICAgICAgICAgICAgICAgICAjfiByYWlzZQ0KICAgICAgICAgICAgICAgICN+IGxpbWl0ICs9IDENCiAgICAgICAgICAgICAgICAjfiBjb250aW51ZQ0KICAgICN+IHJldHVybiB3cmFwcGVyDQoNCiMgdGhpcyB2ZXJzaW9uIGlzIFB5dGhvbiAyLngtMy54IGNyb3NzLWNvbXBhdGlibGUNCidkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCmRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTIpOg0KICAgIGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICBsaW1pdCA9IFswXQ0KICAgIGZvdW5kQXJpdHkgPSBbRmFsc2VdDQogICAgDQogICAgIyB0cmFjZWJhY2sgcmV0dXJuIGRhdGEgc3RydWN0dXJlIGNoYW5nZWQgaW4gUHkzLjUgLSBub3JtYWxpemUgYmFjayB0byBwbGFpbiB0dXBsZXMNCiAgICBpZiBzeXN0ZW1fdmVyc2lvbls6Ml0gPj0gKDMsNSk6DQogICAgICAgIGRlZiBleHRyYWN0X3N0YWNrKGxpbWl0PTApOg0KICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBQeXRob24gMy41LjAgLSBleHRyYSBkZWVwIGNhbGwgc3RhY2sgYnkgMQ0KICAgICAgICAgICAgb2Zmc2V0ID0gLTMgaWYgc3lzdGVtX3ZlcnNpb24gPT0gKDMsNSwwKSBlbHNlIC0yDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sobGltaXQ9LW9mZnNldCtsaW1pdC0xKVtvZmZzZXRdDQogICAgICAgICAgICByZXR1cm4gW2ZyYW1lX3N1bW1hcnlbOjJdXQ0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6DQogICAgICAgICAgICBmcmFtZXMgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gZnJhbWVzWy0xXQ0KICAgICAgICAgICAgcmV0dXJuIFtmcmFtZV9zdW1tYXJ5WzoyXV0NCiAgICBlbHNlOg0KICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sNCiAgICAgICAgZXh0cmFjdF90YiA9IHRyYWNlYmFjay5leHRyYWN0X3RiDQogICAgDQogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gDQogICAgIyB1c2VyJ3MgcGFyc2UgYWN0aW9uICdmdW5jJywgc28gdGhhdCB3ZSBkb24ndCBpbmN1ciBjYWxsIHBlbmFsdHkgYXQgcGFyc2UgdGltZQ0KICAgIA0KICAgIExJTkVfRElGRiA9IDYNCiAgICAjIElGIEFOWSBDT0RFIENIQU5HRVMsIEVWRU4gSlVTVCBDT01NRU5UUyBPUiBCTEFOSyBMSU5FUywgQkVUV0VFTiBUSEUgTkVYVCBMSU5FIEFORCANCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQ0KICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdDQogICAgcGFfY2FsbF9saW5lX3N5bnRoID0gKHRoaXNfbGluZVswXSwgdGhpc19saW5lWzFdK0xJTkVfRElGRikNCg0KICAgIGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pDQogICAgICAgICAgICAgICAgZm91bmRBcml0eVswXSA9IFRydWUNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICMgcmUtcmFpc2UgVHlwZUVycm9ycyBpZiB0aGV5IGRpZCBub3QgY29tZSBmcm9tIG91ciBhcml0eSB0ZXN0aW5nDQogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4dHJhY3RfdGIodGIsIGxpbWl0PTIpWy0xXVs6Ml0gPT0gcGFfY2FsbF9saW5lX3N5bnRoOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGINCg0KICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6DQogICAgICAgICAgICAgICAgICAgIGxpbWl0WzBdICs9IDENCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQNCiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiB3cmFwcGVyDQoNCmNsYXNzIFBhcnNlckVsZW1lbnQob2JqZWN0KToNCiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIg0KICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciINCiAgICB2ZXJib3NlX3N0YWNrdHJhY2UgPSBGYWxzZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCBjaGFycyApOg0KICAgICAgICByIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZicsICdnaGknLCAnamtsJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LnNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIiBcdCIpDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMgPSBjaGFycw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBpbmxpbmVMaXRlcmFsc1VzaW5nKGNscyk6DQogICAgICAgICIiIg0KICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCg0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8gU3VwcHJlc3MNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gY2xzDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KCkNCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQ0KICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbA0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlICMgdXNlZCB3aGVuIGNoZWNraW5nIGZvciBsZWZ0LXJlY3Vyc2lvbg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiIg0KICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zDQogICAgICAgIHNlbGYucmUgPSBOb25lDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgTWFrZSBhIGNvcHkgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9LiAgVXNlZnVsIGZvciBkZWZpbmluZyBkaWZmZXJlbnQgcGFyc2UgYWN0aW9ucw0KICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQ0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0NCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlcigpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICIiIg0KICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQ0KICAgICAgICBjcHkucGFyc2VBY3Rpb24gPSBzZWxmLnBhcnNlQWN0aW9uWzpdDQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0NCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6DQogICAgICAgICAgICBjcHkud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICByZXR1cm4gY3B5DQoNCiAgICBkZWYgc2V0TmFtZSggc2VsZiwgbmFtZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOg0KICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlDQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLg0KICAgICAgICBOT1RFOiB0aGlzIHJldHVybnMgYSAqY29weSogb2YgdGhlIG9yaWdpbmFsIEN7UGFyc2VyRWxlbWVudH0gb2JqZWN0Ow0KICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbg0KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4NCg0KICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwNCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIA0KICAgICAgICBzZWUgTHtJe19fY2FsbF9ffTxfX2NhbGxfXz59Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCg0KICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAiIiINCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpDQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToNCiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotMV0NCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUNCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUNCiAgICAgICAgbmV3c2VsZi5tb2RhbFJlc3VsdHMgPSBub3QgbGlzdEFsbE1hdGNoZXMNCiAgICAgICAgcmV0dXJuIG5ld3NlbGYNCg0KICAgIGRlZiBzZXRCcmVhayhzZWxmLGJyZWFrRmxhZyA9IFRydWUpOg0KICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzDQogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8NCiAgICAgICAgICAgZGlzYWJsZS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGJyZWFrRmxhZzoNCiAgICAgICAgICAgIF9wYXJzZU1ldGhvZCA9IHNlbGYuX3BhcnNlDQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOg0KICAgICAgICAgICAgICAgIGltcG9ydCBwZGINCiAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkNCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApDQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kDQogICAgICAgICAgICBzZWxmLl9wYXJzZSA9IGJyZWFrZXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6DQogICAgICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZS5fb3JpZ2luYWxQYXJzZU1ldGhvZA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG9uZSBvciBtb3JlIGFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHN1Y2Nlc3NmdWxseSBtYXRjaGluZyBwYXJzZSBlbGVtZW50IGRlZmluaXRpb24uDQogICAgICAgIFBhcnNlIGFjdGlvbiBmbiBpcyBhIGNhbGxhYmxlIG1ldGhvZCB3aXRoIDAtMyBhcmd1bWVudHMsIGNhbGxlZCBhcyBDe2ZuKHMsbG9jLHRva3MpfSwNCiAgICAgICAgQ3tmbihsb2MsdG9rcyl9LCBDe2ZuKHRva3MpfSwgb3IganVzdCBDe2ZuKCl9LCB3aGVyZToNCiAgICAgICAgIC0gcyAgID0gdGhlIG9yaWdpbmFsIHN0cmluZyBiZWluZyBwYXJzZWQgKHNlZSBub3RlIGJlbG93KQ0KICAgICAgICAgLSBsb2MgPSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdGNoaW5nIHN1YnN0cmluZw0KICAgICAgICAgLSB0b2tzID0gYSBsaXN0IG9mIHRoZSBtYXRjaGVkIHRva2VucywgcGFja2FnZWQgYXMgYSBDe0x7UGFyc2VSZXN1bHRzfX0gb2JqZWN0DQogICAgICAgIElmIHRoZSBmdW5jdGlvbnMgaW4gZm5zIG1vZGlmeSB0aGUgdG9rZW5zLCB0aGV5IGNhbiByZXR1cm4gdGhlbSBhcyB0aGUgcmV0dXJuDQogICAgICAgIHZhbHVlIGZyb20gZm4sIGFuZCB0aGUgbW9kaWZpZWQgbGlzdCBvZiB0b2tlbnMgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbC4NCiAgICAgICAgT3RoZXJ3aXNlLCBmbiBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUuDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIGNhbGxEdXJpbmdUcnkgPSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGUgaWYgcGFyc2UgYWN0aW9uIHNob3VsZCBiZSBydW4gZHVyaW5nIGxvb2thaGVhZHMgYW5kIGFsdGVybmF0ZSB0ZXN0aW5nDQoNCiAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICAgICAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgICAgICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICAgICAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICAgICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQogICAgICAgICAgICAjIHVzZSBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0byBpbnRzIGF0IHBhcnNlIHRpbWUNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICAjIG5vdGUgdGhhdCBpbnRlZ2VyIGZpZWxkcyBhcmUgbm93IGludHMsIG5vdCBzdHJpbmdzDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsxOTk5LCAnLycsIDEyLCAnLycsIDMxXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkUGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgb25lIG9yIG1vcmUgcGFyc2UgYWN0aW9ucyB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59Lg0KICAgICAgICANCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uICs9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6DQogICAgICAgICIiIkFkZCBhIGJvb2xlYW4gcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSANCiAgICAgICAgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59IGZvciBmdW5jdGlvbiBjYWxsIHNpZ25hdHVyZXMuIFVubGlrZSBDe3NldFBhcnNlQWN0aW9ufSwgDQogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uDQogICAgICAgICAtIGZhdGFsICAgPSBpZiBUcnVlLCB3aWxsIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5OyBvdGhlcndpc2Ugd2lsbCByYWlzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIHllYXJfaW50ID0gaW50ZWdlci5jb3B5KCkNCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSB5ZWFyX2ludCArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAiIiINCiAgICAgICAgbXNnID0ga3dhcmdzLmdldCgibWVzc2FnZSIsICJmYWlsZWQgdXNlci1kZWZpbmVkIGNvbmRpdGlvbiIpDQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgIGZvciBmbiBpbiBmbnM6DQogICAgICAgICAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfdHlwZShzLGwsbXNnKQ0KICAgICAgICAgICAgc2VsZi5wYXJzZUFjdGlvbi5hcHBlbmQocGEpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToNCiAgICAgICAgIiIiRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIGlmIHBhcnNpbmcgZmFpbHMgYXQgdGhpcyBleHByZXNzaW9uLg0KICAgICAgICAgICBGYWlsIGFjdG9uIGZuIGlzIGEgY2FsbGFibGUgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYXJndW1lbnRzDQogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToNCiAgICAgICAgICAgIC0gcyA9IHN0cmluZyBiZWluZyBwYXJzZWQNCiAgICAgICAgICAgIC0gbG9jID0gbG9jYXRpb24gd2hlcmUgZXhwcmVzc2lvbiBtYXRjaCB3YXMgYXR0ZW1wdGVkIGFuZCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkDQogICAgICAgICAgICAtIGVyciA9IHRoZSBleGNlcHRpb24gdGhyb3duDQogICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vIHZhbHVlLiAgSXQgbWF5IHRocm93IEN7THtQYXJzZUZhdGFsRXhjZXB0aW9ufX0NCiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IGZuDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX3NraXBJZ25vcmFibGVzKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6DQogICAgICAgICAgICBleHByc0ZvdW5kID0gRmFsc2UNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jLGR1bW15ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQoNCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToNCiAgICAgICAgICAgIHd0ID0gc2VsZi53aGl0ZUNoYXJzDQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0Og0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgZGVidWdnaW5nID0gKCBzZWxmLmRlYnVnICkgI2FuZCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoIixzZWxmLCJhdCBsb2MiLGxvYywiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzBdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQ0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpDQogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z0FjdGlvbnNbMl06DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxBY3Rpb24oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICB0b2tlbnNTdGFydCA9IHByZWxvYw0KICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIHByZWxvYyA+PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KDQogICAgICAgIHRva2VucyA9IHNlbGYucG9zdFBhcnNlKCBpbnN0cmluZywgbG9jLCB0b2tlbnMgKQ0KDQogICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLCBzZWxmLnJlc3VsdHNOYW1lLCBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0LCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgIGlmIHNlbGYucGFyc2VBY3Rpb24gYW5kIChkb0FjdGlvbnMgb3Igc2VsZi5jYWxsRHVyaW5nVHJ5KToNCiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgI34gcHJpbnQgIkV4Y2VwdGlvbiByYWlzZWQgaW4gdXNlciBwYXJzZSBhY3Rpb246IiwgZXJyDQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1syXSApOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoZWQiLHNlbGYsIi0+IixyZXRUb2tlbnMuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zDQoNCiAgICBkZWYgdHJ5UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQ0KICAgICAgICBleGNlcHQgUGFyc2VGYXRhbEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICANCiAgICBkZWYgY2FuUGFyc2VOZXh0KHNlbGYsIGluc3RyaW5nLCBsb2MpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KDQogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQoNCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBkZWYgY2FjaGVfbGVuKHNlbGYpOg0KICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgIGlmIF9PcmRlcmVkRGljdCBpcyBub3QgTm9uZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0gX09yZGVyZWREaWN0KCkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4oY2FjaGUpID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3BpdGVtKEZhbHNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgIGVsc2U6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4oa2V5X2ZpZm8pID4gc2l6ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcChrZXlfZmlmby5wb3BsZWZ0KCksIE5vbmUpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihjYWNoZSkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLl9fbGVuX18gPSB0eXBlcy5NZXRob2RUeXBlKGNhY2hlX2xlbiwgc2VsZikNCg0KICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMNCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsDQogICAgcGFja3JhdF9jYWNoZV9sb2NrID0gUkxvY2soKQ0KICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0NCg0KICAgICMgdGhpcyBtZXRob2QgZ2V0cyByZXBlYXRlZGx5IGNhbGxlZCBkdXJpbmcgYmFja3RyYWNraW5nIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIC0NCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uDQogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgSElULCBNSVNTID0gMCwgMQ0KICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpDQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6DQogICAgICAgICAgICBjYWNoZSA9IFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZQ0KICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQ0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tNSVNTXSArPSAxDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxDQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRXhjZXB0aW9uKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUNCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpDQoNCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHJlc2V0Q2FjaGUoKToNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzWzpdID0gWzBdICogbGVuKFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0cykNCg0KICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToNCiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuDQogICAgICAgICAgIFJlcGVhdGVkIHBhcnNlIGF0dGVtcHRzIGF0IHRoZSBzYW1lIHN0cmluZyBsb2NhdGlvbiAod2hpY2ggaGFwcGVucw0KICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsDQogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YNCiAgICAgICAgICAgYm90aCB2YWxpZCByZXN1bHRzIGFuZCBwYXJzaW5nIGV4Y2VwdGlvbnMuDQogICAgICAgICAgIA0KICAgICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgICAgLSBjYWNoZV9zaXplX2xpbWl0IC0gKGRlZmF1bHQ9Q3sxMjh9KSAtIGlmIGFuIGludGVnZXIgdmFsdWUgaXMgcHJvdmlkZWQNCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4NCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbA0KICAgICAgICAgICAgICBiZSBlZmZlY3RpdmVseSBkaXNhYmxlZC4NCiAgICAgICAgICAgIA0KICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdA0KICAgICAgICAgICBoYXZlIHNpZGUtZWZmZWN0cy4gIEZvciB0aGlzIHJlYXNvbiwgcGFja3JhdCBwYXJzaW5nIGlzIGRpc2FibGVkIHdoZW4NCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyDQogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZg0KICAgICAgICAgICB5b3VyIHByb2dyYW0gdXNlcyBDe3BzeWNvfSB0byAiY29tcGlsZSBhcyB5b3UgZ28iLCB5b3UgbXVzdCBjYWxsDQogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLA0KICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5DQogICAgICAgICAgIGFmdGVyIGltcG9ydGluZyBweXBhcnNpbmcuDQogICAgICAgICAgIA0KICAgICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICAgIGltcG9ydCBweXBhcnNpbmcNCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkOg0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fVW5ib3VuZGVkQ2FjaGUoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhcnNlID0gUGFyc2VyRWxlbWVudC5fcGFyc2VDYWNoZQ0KDQogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLg0KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlDQogICAgICAgIGV4cHJlc3Npb24gaGFzIGJlZW4gYnVpbHQuDQoNCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlDQogICAgICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZW4gc2V0IEN7cGFyc2VBbGx9IHRvIFRydWUgKGVxdWl2YWxlbnQgdG8gZW5kaW5nDQogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLg0KDQogICAgICAgIE5vdGU6IEN7cGFyc2VTdHJpbmd9IGltcGxpY2l0bHkgY2FsbHMgQ3tleHBhbmR0YWJzKCl9IG9uIHRoZSBpbnB1dCBzdHJpbmcsDQogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4NCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZA0KICAgICAgICB0aGUgZ3JhbW1hciB1c2VzIHBhcnNlIGFjdGlvbnMgdGhhdCB1c2UgdGhlIEN7bG9jfSBhcmd1bWVudCB0byBpbmRleCBpbnRvIHRoZQ0KICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQNCiAgICAgICAgc3RyaW5nIGJ5Og0KICAgICAgICAgLSBjYWxsaW5nIEN7cGFyc2VXaXRoVGFic30gb24geW91ciBncmFtbWFyIGJlZm9yZSBjYWxsaW5nIEN7cGFyc2VTdHJpbmd9DQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkNCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZA0KICAgICAgICAgICByZWZlcmVuY2UgdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcGFyc2UgYWN0aW9uJ3MgQ3tzfSBhcmd1bWVudA0KICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nDQogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddDQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScsIHBhcnNlQWxsPVRydWUpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgZW5kIG9mIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBpbnN0cmluZy5leHBhbmR0YWJzKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQ0KICAgICAgICAgICAgaWYgcGFyc2VBbGw6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkNCiAgICAgICAgICAgICAgICBzZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5zDQoNCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIFNjYW4gdGhlIGlucHV0IHN0cmluZyBmb3IgZXhwcmVzc2lvbiBtYXRjaGVzLiAgRWFjaCBtYXRjaCB3aWxsIHJldHVybiB0aGUNCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmDQogICAgICAgIEN7b3ZlcmxhcH0gaXMgc3BlY2lmaWVkLCB0aGVuIG92ZXJsYXBwaW5nIG1hdGNoZXMgd2lsbCBiZSByZXBvcnRlZC4NCg0KICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nDQogICAgICAgIGJlaW5nIHBhcnNlZC4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGFyc2luZw0KICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciDQogICAgICAgICAgICBwcmludChzb3VyY2UpDQogICAgICAgICAgICBmb3IgdG9rZW5zLHN0YXJ0LGVuZCBpbiBXb3JkKGFscGhhcykuc2NhblN0cmluZyhzb3VyY2UpOg0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICANCiAgICAgICAgICAgIHNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4Nw0KICAgICAgICAgICAgXl5eXl4NCiAgICAgICAgICAgIHNsZGpmDQogICAgICAgICAgICAgICAgICAgIF5eXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgbHNkamprZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGRramYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBsb2MgPSAwDQogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlDQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBtYXRjaGVzID0gMA0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3aGlsZSBsb2MgPD0gaW5zdHJsZW4gYW5kIG1hdGNoZXMgPCBtYXhNYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgIG5leHRMb2MsdG9rZW5zID0gcGFyc2VGbiggaW5zdHJpbmcsIHByZWxvYywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5zLCBwcmVsb2MsIG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRsb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgdHJhbnNmb3JtU3RyaW5nKCBzZWxmLCBpbnN0cmluZyApOg0KICAgICAgICAiIiINCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5DQogICAgICAgIGJlIHJldHVybmVkIGZyb20gYSBwYXJzZSBhY3Rpb24uICBUbyB1c2UgQ3t0cmFuc2Zvcm1TdHJpbmd9LCBkZWZpbmUgYSBncmFtbWFyIGFuZA0KICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4NCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLA0KICAgICAgICBhbmQgcmVwbGFjZSB0aGUgbWF0Y2hlZCB0ZXh0IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgbG9naWMgaW4gdGhlIHBhcnNlDQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrLg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbGFzdEUgPSAwDQogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8NCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggaW5zdHJpbmdbbGFzdEU6c10gKQ0KICAgICAgICAgICAgICAgIGlmIHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQuYXNMaXN0KCkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdA0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGxhc3RFID0gZQ0KICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0cmluZ1tsYXN0RTpdKQ0KICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dDQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6DQogICAgICAgICIiIg0KICAgICAgICBBbm90aGVyIGV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCBzaW1wbGlmeWluZyB0aGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgZm91bmQNCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMNCiAgICAgICAgICAgIGNhcF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkNCg0KICAgICAgICAgICAgIyB0aGUgc3VtKCkgYnVpbHRpbiBjYW4gYmUgdXNlZCB0byBtZXJnZSByZXN1bHRzIGludG8gYSBzaW5nbGUgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICAgICAgcHJpbnQoc3VtKGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbWydNb3JlJ10sIFsnSXJvbiddLCBbJ0xlYWQnXSwgWydHb2xkJ10sIFsnSSddLCBbJ0VsZWN0cmljaXR5J11dDQogICAgICAgICAgICBbJ01vcmUnLCAnSXJvbicsICdMZWFkJywgJ0dvbGQnLCAnSScsICdFbGVjdHJpY2l0eSddDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdCBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZywgbWF4TWF0Y2hlcyApIF0pDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzcGxpdChzZWxmLCBpbnN0cmluZywgbWF4c3BsaXQ9X01BWF9JTlQsIGluY2x1ZGVTZXBhcmF0b3JzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEdlbmVyYXRvciBtZXRob2QgdG8gc3BsaXQgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGV4cHJlc3Npb24gYXMgYSBzZXBhcmF0b3IuDQogICAgICAgIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbCBDe21heHNwbGl0fSBhcmd1bWVudCwgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHM7DQogICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgQ3tpbmNsdWRlU2VwYXJhdG9yc30gYXJndW1lbnQgKGRlZmF1bHQ9Q3tGYWxzZX0pLCBpZiB0aGUgc2VwYXJhdGluZw0KICAgICAgICBtYXRjaGluZyB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc3BsaXQgcmVzdWx0cy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6OiAgICAgICAgDQogICAgICAgICAgICBwdW5jID0gb25lT2YobGlzdCgiLiw7Oi8tIT8iKSkNCiAgICAgICAgICAgIHByaW50KGxpc3QocHVuYy5zcGxpdCgiVGhpcywgdGhpcz8sIHRoaXMgc2VudGVuY2UsIGlzIGJhZGx5IHB1bmN0dWF0ZWQhIikpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydUaGlzJywgJyB0aGlzJywgJycsICcgdGhpcyBzZW50ZW5jZScsICcgaXMgYmFkbHkgcHVuY3R1YXRlZCcsICcnXQ0KICAgICAgICAiIiINCiAgICAgICAgc3BsaXRzID0gMA0KICAgICAgICBsYXN0ID0gMA0KICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKGluc3RyaW5nLCBtYXhNYXRjaGVzPW1heHNwbGl0KToNCiAgICAgICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6c10NCiAgICAgICAgICAgIGlmIGluY2x1ZGVTZXBhcmF0b3JzOg0KICAgICAgICAgICAgICAgIHlpZWxkIHRbMF0NCiAgICAgICAgICAgIGxhc3QgPSBlDQogICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6XQ0KDQogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtBbmR9fS4gQWRkaW5nIHN0cmluZ3MgdG8gYSBQYXJzZXJFbGVtZW50DQogICAgICAgIGNvbnZlcnRzIHRoZW0gdG8gTHtMaXRlcmFsfXMgYnkgZGVmYXVsdC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCiAgICAgICAgICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgICAgICAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQoNCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yLCByZXR1cm5zIEN7THtBbmR9fSB3aXRoIGVycm9yIHN0b3ANCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBzZWxmICsgQW5kLl9FcnJvclN0b3AoKSArIG90aGVyDQoNCiAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIC0gc2VsZg0KDQogICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAqIG9wZXJhdG9yLCBhbGxvd3MgdXNlIG9mIEN7ZXhwciAqIDN9IGluIHBsYWNlIG9mDQogICAgICAgIEN7ZXhwciArIGV4cHIgKyBleHByfS4gIEV4cHJlc3Npb25zIG1heSBhbHNvIG1lIG11bHRpcGxpZWQgYnkgYSAyLWludGVnZXINCiAgICAgICAgdHVwbGUsIHNpbWlsYXIgdG8gQ3t7bWluLG1heH19IG11bHRpcGxpZXJzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUdXBsZXMNCiAgICAgICAgbWF5IGFsc28gaW5jbHVkZSBDe05vbmV9IGFzIGluOg0KICAgICAgICAgLSBDe2V4cHIqKG4sTm9uZSl9IG9yIEN7ZXhwcioobiwpfSBpcyBlcXVpdmFsZW50DQogICAgICAgICAgICAgIHRvIEN7ZXhwcipuICsgTHtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgImF0IGxlYXN0IG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsbil9IGlzIGVxdWl2YWxlbnQgdG8gQ3tleHByKigwLG4pfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiMCB0byBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgIC0gQ3tleHByKigxLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtPbmVPck1vcmV9KGV4cHIpfQ0KDQogICAgICAgIE5vdGUgdGhhdCBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZg0KICAgICAgICBtb3JlIHRoYW4gbiBleHBycyBleGlzdCBpbiB0aGUgaW5wdXQgc3RyZWFtOyB0aGF0IGlzLA0KICAgICAgICBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IGVuZm9yY2UgYSBtYXhpbXVtIG51bWJlciBvZiBleHByDQogICAgICAgIG9jY3VycmVuY2VzLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBkZXNpcmVkLCB0aGVuIHdyaXRlDQogICAgICAgIEN7ZXhwciooTm9uZSxuKSArIH5leHByfQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpOg0KICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIsMA0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsdHVwbGUpOg0KICAgICAgICAgICAgb3RoZXIgPSAob3RoZXIgKyAoTm9uZSwgTm9uZSkpWzoyXQ0KICAgICAgICAgICAgaWYgb3RoZXJbMF0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBvdGhlciA9ICgwLCBvdGhlclsxXSkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgb3RoZXJbMV0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAwOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbmVPck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZipvdGhlclswXSArIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBpc2luc3RhbmNlKG90aGVyWzFdLGludCk6DQogICAgICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXINCiAgICAgICAgICAgICAgICBvcHRFbGVtZW50cyAtPSBtaW5FbGVtZW50cw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICgnJXMnLCclcycpIG9iamVjdHMiLCB0eXBlKG90aGVyWzBdKSx0eXBlKG90aGVyWzFdKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgJyVzJyBvYmplY3RzIiwgdHlwZShvdGhlcikpDQoNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgbmVnYXRpdmUgdmFsdWUiKQ0KICAgICAgICBpZiBvcHRFbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWNvbmQgdHVwbGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGZpcnN0IHR1cGxlIHZhbHVlIikNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gb3B0RWxlbWVudHMgPT0gMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IDAgb3IgKDAsMCkiKQ0KDQogICAgICAgIGlmIChvcHRFbGVtZW50cyk6DQogICAgICAgICAgICBkZWYgbWFrZU9wdGlvbmFsTGlzdChuKToNCiAgICAgICAgICAgICAgICBpZiBuPjE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChuLTEpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmKQ0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHM6DQogICAgICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VsZiArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICByZXQgPSBzZWxmDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmLl9fbXVsX18ob3RoZXIpDQoNCiAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7TWF0Y2hGaXJzdH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3Jvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciB8IHNlbGYNCg0KICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7T3J9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE9yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcnhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciBeIHNlbGYNCg0KICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7RWFjaH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gRWFjaCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgJiBzZWxmDQoNCiAgICBkZWYgX19pbnZlcnRfXyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe05vdEFueX19DQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gTm90QW55KCBzZWxmICkNCg0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBuYW1lPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgU2hvcnRjdXQgZm9yIEN7THtzZXRSZXN1bHRzTmFtZX19LCB3aXRoIEN7bGlzdEFsbE1hdGNoZXM9RmFsc2V9Lg0KICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBnaXZlbiB3aXRoIGEgdHJhaWxpbmcgQ3snKid9IGNoYXJhY3RlciwgdGhlbiBDe2xpc3RBbGxNYXRjaGVzfSB3aWxsIGJlDQogICAgICAgIHBhc3NlZCBhcyBDe1RydWV9Lg0KICAgICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBvbWl0dGVkLCBzYW1lIGFzIGNhbGxpbmcgQ3tMe2NvcHl9fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgdGhlc2UgYXJlIGVxdWl2YWxlbnQNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpLnNldFJlc3VsdHNOYW1lKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKS5zZXRSZXN1bHRzTmFtZSgic29jc2Vjbm8iKQ0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpKCJzb2NzZWNubyIpICAgICAgICAgICAgIA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFJlc3VsdHNOYW1lKG5hbWUpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgU3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fTsgdXNlZnVsIHRvIGtlZXAgcHVuY3R1YXRpb24gZnJvbQ0KICAgICAgICBjbHV0dGVyaW5nIHVwIHJldHVybmVkIG91dHB1dC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBTdXBwcmVzcyggc2VsZiApDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBEaXNhYmxlcyB0aGUgc2tpcHBpbmcgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlDQogICAgICAgIEN7UGFyc2VyRWxlbWVudH0ncyBkZWZpbmVkIHBhdHRlcm4uICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5DQogICAgICAgIHRoZSBweXBhcnNpbmcgbW9kdWxlLCBidXQgbWF5IGJlIG5lZWRlZCBpbiBzb21lIHdoaXRlc3BhY2Utc2Vuc2l0aXZlIGdyYW1tYXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLCBjaGFycyApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IGNoYXJzDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwYXJzZVdpdGhUYWJzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciB0byBleHBhbmQgQ3s8VEFCPn1zIHRvIHNwYWNlcyBiZWZvcmUgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLg0KICAgICAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ3twYXJzZVN0cmluZ30gd2hlbiB0aGUgaW5wdXQgZ3JhbW1hciBjb250YWlucyBlbGVtZW50cyB0aGF0DQogICAgICAgIG1hdGNoIEN7PFRBQj59IGNoYXJhY3RlcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBleHByZXNzaW9uIHRvIGJlIGlnbm9yZWQgKGUuZy4sIGNvbW1lbnRzKSB3aGlsZSBkb2luZyBwYXR0ZXJuDQogICAgICAgIG1hdGNoaW5nOyBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHksIHRvIGRlZmluZSBtdWx0aXBsZSBjb21tZW50IG9yIG90aGVyDQogICAgICAgIGlnbm9yYWJsZSBwYXR0ZXJucy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcGF0dC5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonLCAnbHNramQnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBvdGhlciA9IFN1cHByZXNzKG90aGVyKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZCggU3VwcHJlc3MoIG90aGVyLmNvcHkoKSApICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Z0FjdGlvbnMoIHNlbGYsIHN0YXJ0QWN0aW9uLCBzdWNjZXNzQWN0aW9uLCBleGNlcHRpb25BY3Rpb24gKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoc3RhcnRBY3Rpb24gb3IgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQWN0aW9uIG9yIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25BY3Rpb24gb3IgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbikNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Zyggc2VsZiwgZmxhZz1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgU2V0IEN7ZmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXROYW1lKCJhbHBoYXdvcmQiKQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgibnVtd29yZCIpDQogICAgICAgICAgICB0ZXJtID0gd2QgfCBpbnRlZ2VyDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHdkDQogICAgICAgICAgICB3ZC5zZXREZWJ1ZygpDQoNCiAgICAgICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiYWJjIDEyMyB4eXogODkwIikNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDAoMSwxKQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWydhYmMnXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAzKDEsNCkNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgNygxLDgpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ3h5eiddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDExKDEsMTIpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxMiksIChsaW5lOjEsIGNvbDoxMykNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTUoMSwxNikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDE1KSwgKGxpbmU6MSwgY29sOjE2KQ0KDQogICAgICAgIFRoZSBvdXRwdXQgc2hvd24gaXMgdGhhdCBwcm9kdWNlZCBieSB0aGUgZGVmYXVsdCBkZWJ1ZyBhY3Rpb25zIC0gY3VzdG9tIGRlYnVnIGFjdGlvbnMgY2FuIGJlDQogICAgICAgIHNwZWNpZmllZCB1c2luZyBMe3NldERlYnVnQWN0aW9uc30uIFByaW9yIHRvIGF0dGVtcHRpbmcNCiAgICAgICAgdG8gbWF0Y2ggdGhlIEN7d2R9IGV4cHJlc3Npb24sIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBDeyJNYXRjaCA8ZXhwcm5hbWU+IGF0IGxvYyA8bj4oPGxpbmU+LDxjb2w+KSJ9DQogICAgICAgIGlzIHNob3duLiBUaGVuIGlmIHRoZSBwYXJzZSBzdWNjZWVkcywgYSBDeyJNYXRjaGVkIn0gbWVzc2FnZSBpcyBzaG93biwgb3IgYW4gQ3siRXhjZXB0aW9uIHJhaXNlZCJ9DQogICAgICAgIG1lc3NhZ2UgaXMgc2hvd24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIEx7c2V0TmFtZX0gdG8gYXNzaWduIGEgaHVtYW4tcmVhZGFibGUgbmFtZSB0byB0aGUgZXhwcmVzc2lvbiwNCiAgICAgICAgd2hpY2ggbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLSBmb3IgaW5zdGFuY2UsIHRoZSBkZWZhdWx0DQogICAgICAgIG5hbWUgY3JlYXRlZCBmb3IgdGhlIEN7V29yZH0gZXhwcmVzc2lvbiB3aXRob3V0IGNhbGxpbmcgQ3tzZXROYW1lfSBpcyBDeyJXOihBQkNELi4uKSJ9Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgZmxhZzoNCiAgICAgICAgICAgIHNlbGYuc2V0RGVidWdBY3Rpb25zKCBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLCBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHBhc3MNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2hlY2sgZGVmaW5lZCBleHByZXNzaW9ucyBmb3IgdmFsaWQgc3RydWN0dXJlLCBjaGVjayBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIGRlZmluaXRpb25zLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIHBhcnNlRmlsZSggc2VsZiwgZmlsZV9vcl9maWxlbmFtZSwgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gdGhlIGdpdmVuIGZpbGUgb3IgZmlsZW5hbWUuDQogICAgICAgIElmIGEgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIChpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QpLA0KICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgb3BlbmVkLCByZWFkLCBhbmQgY2xvc2VkIGJlZm9yZSBwYXJzaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGZpbGVfb3JfZmlsZW5hbWUucmVhZCgpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlX29yX2ZpbGVuYW1lLCAiciIpIGFzIGY6DQogICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlU3RyaW5nKGZpbGVfY29udGVudHMsIHBhcnNlQWxsKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBQYXJzZXJFbGVtZW50KToNCiAgICAgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyIG9yIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoZXMob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VyRWxlbWVudCxzZWxmKT09b3RoZXINCg0KICAgIGRlZiBfX25lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgX19oYXNoX18oc2VsZik6DQogICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQ0KDQogICAgZGVmIF9fcmVxX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyDQoNCiAgICBkZWYgX19ybmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBtYXRjaGVzKHNlbGYsIHRlc3RTdHJpbmcsIHBhcnNlQWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgTWV0aG9kIGZvciBxdWljayB0ZXN0aW5nIG9mIGEgcGFyc2VyIGFnYWluc3QgYSB0ZXN0IHN0cmluZy4gR29vZCBmb3Igc2ltcGxlIA0KICAgICAgICBpbmxpbmUgbWljcm90ZXN0cyBvZiBzdWIgZXhwcmVzc2lvbnMgd2hpbGUgYnVpbGRpbmcgdXAgbGFyZ2VyIHBhcnNlci4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RTdHJpbmcgLSB0byB0ZXN0IGFnYWluc3QgdGhpcyBleHByZXNzaW9uIGZvciBhIG1hdGNoDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzDQogICAgICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBleHByID0gV29yZChudW1zKQ0KICAgICAgICAgICAgYXNzZXJ0IGV4cHIubWF0Y2hlcygiMTAwIikNCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucGFyc2VTdHJpbmcoX3VzdHIodGVzdFN0cmluZyksIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICAgICAgICAgIA0KICAgIGRlZiBydW5UZXN0cyhzZWxmLCB0ZXN0cywgcGFyc2VBbGw9VHJ1ZSwgY29tbWVudD0nIycsIGZ1bGxEdW1wPVRydWUsIHByaW50UmVzdWx0cz1UcnVlLCBmYWlsdXJlVGVzdHM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiBhIHNlcmllcyBvZiB0ZXN0IHN0cmluZ3MsIHNob3dpbmcgZWFjaA0KICAgICAgICB0ZXN0LCB0aGUgcGFyc2VkIHJlc3VsdHMgb3Igd2hlcmUgdGhlIHBhcnNlIGZhaWxlZC4gUXVpY2sgYW5kIGVhc3kgd2F5IHRvDQogICAgICAgIHJ1biBhIHBhcnNlIGV4cHJlc3Npb24gYWdhaW5zdCBhIGxpc3Qgb2Ygc2FtcGxlIHN0cmluZ3MuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0cyAtIGEgbGlzdCBvZiBzZXBhcmF0ZSB0ZXN0IHN0cmluZ3MsIG9yIGEgbXVsdGlsaW5lIHN0cmluZyBvZiB0ZXN0IHN0cmluZ3MNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMgICAgICAgICAgIA0KICAgICAgICAgLSBjb21tZW50IC0gKGRlZmF1bHQ9Q3snIyd9KSAtIGV4cHJlc3Npb24gZm9yIGluZGljYXRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGhlIHRlc3QgDQogICAgICAgICAgICAgIHN0cmluZzsgcGFzcyBOb25lIHRvIGRpc2FibGUgY29tbWVudCBmaWx0ZXJpbmcNCiAgICAgICAgIC0gZnVsbER1bXAgLSAoZGVmYXVsdD1De1RydWV9KSAtIGR1bXAgcmVzdWx0cyBhcyBsaXN0IGZvbGxvd2VkIGJ5IHJlc3VsdHMgbmFtZXMgaW4gbmVzdGVkIG91dGxpbmU7DQogICAgICAgICAgICAgIGlmIEZhbHNlLCBvbmx5IGR1bXAgbmVzdGVkIGxpc3QNCiAgICAgICAgIC0gcHJpbnRSZXN1bHRzIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgcHJpbnRzIHRlc3Qgb3V0cHV0IHRvIHN0ZG91dA0KICAgICAgICAgLSBmYWlsdXJlVGVzdHMgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGVzIGlmIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHBhcnNpbmcNCg0KICAgICAgICBSZXR1cm5zOiBhIChzdWNjZXNzLCByZXN1bHRzKSB0dXBsZSwgd2hlcmUgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdGVzdHMgc3VjY2VlZGVkDQogICAgICAgIChvciBmYWlsZWQgaWYgQ3tmYWlsdXJlVGVzdHN9IGlzIFRydWUpLCBhbmQgdGhlIHJlc3VsdHMgY29udGFpbiBhIGxpc3Qgb2YgbGluZXMgb2YgZWFjaCANCiAgICAgICAgdGVzdCdzIG91dHB1dA0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBudW1iZXJfZXhwciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyLmNvcHkoKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgICAgICAxMDANCiAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgICAgICAtMTAwDQogICAgICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAgICAgJycnKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgICcnJywgZmFpbHVyZVRlc3RzPVRydWUpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIFsxMDBdDQoNCiAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDMpLCAobGluZToxLCBjb2w6NCkNCg0KICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIHtyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24gfCByZWFsIG51bWJlciB8IHNpZ25lZCBpbnRlZ2VyfSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCg0KICAgICAgICAgICAgU3VjY2Vzcw0KDQogICAgICAgIEVhY2ggdGVzdCBzdHJpbmcgbXVzdCBiZSBvbiBhIHNpbmdsZSBsaW5lLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGEgc3RyaW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUNCiAgICAgICAgbGluZXMsIGNyZWF0ZSBhIHRlc3QgbGlrZSB0aGlzOjoNCg0KICAgICAgICAgICAgZXhwci5ydW5UZXN0KHIidGhpcyBpcyBhIHRlc3RcXG4gb2Ygc3RyaW5ncyB0aGF0IHNwYW5zIFxcbiAzIGxpbmVzIikNCiAgICAgICAgDQogICAgICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHJhdyBzdHJpbmcgbGl0ZXJhbCwgeW91IG11c3QgaW5jbHVkZSB0aGUgbGVhZGluZyAncicuKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6DQogICAgICAgICAgICB0ZXN0cyA9IGxpc3QobWFwKHN0ci5zdHJpcCwgdGVzdHMucnN0cmlwKCkuc3BsaXRsaW5lcygpKSkNCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tZW50LCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGNvbW1lbnQgPSBMaXRlcmFsKGNvbW1lbnQpDQogICAgICAgIGFsbFJlc3VsdHMgPSBbXQ0KICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgIHN1Y2Nlc3MgPSBUcnVlDQogICAgICAgIGZvciB0IGluIHRlc3RzOg0KICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC5tYXRjaGVzKHQsIEZhbHNlKSBvciBjb21tZW50cyBhbmQgbm90IHQ6DQogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBvdXQgPSBbJ1xuJy5qb2luKGNvbW1lbnRzKSwgdF0NCiAgICAgICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKHInXG4nLCdcbicpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJzZVN0cmluZyh0LCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlc3VsdC5kdW1wKGZ1bGw9ZnVsbER1bXApKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgIGZhdGFsID0gIihGQVRBTCkiIGlmIGlzaW5zdGFuY2UocGUsIFBhcnNlRmF0YWxFeGNlcHRpb24pIGVsc2UgIiINCiAgICAgICAgICAgICAgICBpZiAnXG4nIGluIHQ6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQobGluZShwZS5sb2MsIHQpKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJyooY29sKHBlLmxvYyx0KS0xKSArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKnBlLmxvYyArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUw6ICIgKyBzdHIocGUpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBwZQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTC1FWENFUFRJT046ICIgKyBzdHIoZXhjKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhjDQoNCiAgICAgICAgICAgIGlmIHByaW50UmVzdWx0czoNCiAgICAgICAgICAgICAgICBpZiBmdWxsRHVtcDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnJykNCiAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4ob3V0KSkNCg0KICAgICAgICAgICAgYWxsUmVzdWx0cy5hcHBlbmQoKHQsIHJlc3VsdCkpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc3VjY2VzcywgYWxsUmVzdWx0cw0KDQogICAgICAgIA0KY2xhc3MgVG9rZW4oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3QgQ3tQYXJzZXJFbGVtZW50fSBzdWJjbGFzcywgZm9yIGRlZmluaW5nIGF0b21pYyBtYXRjaGluZyBwYXR0ZXJucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoVG9rZW4sc2VsZikuX19pbml0X18oIHNhdmVsaXN0PUZhbHNlICkNCg0KDQpjbGFzcyBFbXB0eShUb2tlbik6DQogICAgIiIiDQogICAgQW4gZW1wdHkgdG9rZW4sIHdpbGwgYWx3YXlzIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihFbXB0eSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJFbXB0eSINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KDQpjbGFzcyBOb01hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHRva2VuIHRoYXQgd2lsbCBuZXZlciBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTm9NYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJOb01hdGNoIg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJVbm1hdGNoYWJsZSB0b2tlbiINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIExpdGVyYWwoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWhmb29ibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGEnKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICJibGFoIg0KICAgIA0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0xpdGVyYWx9Lg0KICAgIA0KICAgIEZvciBrZXl3b3JkIG1hdGNoaW5nIChmb3JjZSB3b3JkIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hdGNoZWQgc3RyaW5nKSwNCiAgICB1c2UgTHtLZXl3b3JkfSBvciBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBMaXRlcmFsOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEVtcHR5DQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIF91c3RyKHNlbGYubWF0Y2gpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGEgKmxvdCoNCiAgICAjIGlmIHRoaXMgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoIHN0cmluZyAgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbWF0Y2hlcywNCiAgICAjIHNob3J0LWNpcmN1aXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgYW5kIGF2b2lkIGNhbGxpbmcgc3RhcnRzd2l0aA0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KX0wgPSBMaXRlcmFsDQpQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBMaXRlcmFsDQoNCmNsYXNzIEtleXdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEga2V5d29yZCwgdGhhdCBpcywgaXQgbXVzdCBiZQ0KICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyLiAgQ29tcGFyZSB3aXRoIEN7THtMaXRlcmFsfX06DQogICAgIC0gQ3tMaXRlcmFsKCJpZiIpfSB3aWxsIG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWZBbmRPbmx5SWYnfS4NCiAgICAgLSBDe0tleXdvcmQoImlmIil9IHdpbGwgbm90OyBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZiB4PTEnfSwgb3IgQ3snaWYoeT09MiknfQ0KICAgIEFjY2VwdHMgdHdvIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUga2V5d29yZCBzdHJpbmc6DQogICAgIC0gQ3tpZGVudENoYXJzfSBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzLA0KICAgICAgICAgIGRlZmF1bHRpbmcgdG8gYWxsIGFscGhhbnVtZXJpY3MgKyAiXyIgYW5kICIkIg0KICAgICAtIEN7Y2FzZWxlc3N9IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCBkZWZhdWx0IGlzIEN7RmFsc2V9Lg0KICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydCIpICAjIC0+IFsnc3RhcnQnXQ0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydGluZyIpICAjIC0+IEV4Y2VwdGlvbg0KDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gYWxwaGFudW1zKyJfJCINCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSwgY2FzZWxlc3M9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoS2V5d29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGlkZW50Q2hhcnMgaXMgTm9uZToNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIEtleXdvcmQ7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgc2VsZi5tYXRjaA0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmNhc2VsZXNzID0gY2FzZWxlc3MNCiAgICAgICAgaWYgY2FzZWxlc3M6DQogICAgICAgICAgICBzZWxmLmNhc2VsZXNzbWF0Y2ggPSBtYXRjaFN0cmluZy51cHBlcigpDQogICAgICAgICAgICBpZGVudENoYXJzID0gaWRlbnRDaGFycy51cHBlcigpDQogICAgICAgIHNlbGYuaWRlbnRDaGFycyA9IHNldChpZGVudENoYXJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5jYXNlbGVzczoNCiAgICAgICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGMgPSBzdXBlcihLZXl3b3JkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBjLmlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICByZXR1cm4gYw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0S2V5d29yZENoYXJzKCBjaGFycyApOg0KICAgICAgICAiIiJPdmVycmlkZXMgdGhlIGRlZmF1bHQgS2V5d29yZCBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBjaGFycw0KDQpjbGFzcyBDYXNlbGVzc0xpdGVyYWwoTGl0ZXJhbCk6DQogICAgIiIiDQogICAgVG9rZW4gdG8gbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBpZ25vcmluZyBjYXNlIG9mIGxldHRlcnMuDQogICAgTm90ZTogdGhlIG1hdGNoZWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgY2FzZSBvZiB0aGUgZ2l2ZW4NCiAgICBtYXRjaCBzdHJpbmcsIE5PVCB0aGUgY2FzZSBvZiB0aGUgaW5wdXQgdGV4dC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NMaXRlcmFsKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzS2V5d29yZH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZy51cHBlcigpICkNCiAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZGVmaW5pbmcgbGl0ZXJhbC4NCiAgICAgICAgc2VsZi5yZXR1cm5TdHJpbmcgPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm5hbWUgPSAiJyVzJyIgJSBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLm1hdGNoOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2FzZWxlc3NLZXl3b3JkKEtleXdvcmQpOg0KICAgICIiIg0KICAgIENhc2VsZXNzIHZlcnNpb24gb2YgTHtLZXl3b3JkfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NLZXl3b3JkKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NMaXRlcmFsfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzS2V5d29yZCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnMsIGNhc2VsZXNzPVRydWUgKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDbG9zZU1hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHZhcmlhdGlvbiBvbiBMe0xpdGVyYWx9IHdoaWNoIG1hdGNoZXMgImNsb3NlIiBtYXRjaGVzLCB0aGF0IGlzLCANCiAgICBzdHJpbmdzIHdpdGggYXQgbW9zdCAnbicgbWlzbWF0Y2hpbmcgY2hhcmFjdGVycy4gQ3tDbG9zZU1hdGNofSB0YWtlcyBwYXJhbWV0ZXJzOg0KICAgICAtIEN7bWF0Y2hfc3RyaW5nfSAtIHN0cmluZyB0byBiZSBtYXRjaGVkDQogICAgIC0gQ3ttYXhNaXNtYXRjaGVzfSAtIChDe2RlZmF1bHQ9MX0pIG1heGltdW0gbnVtYmVyIG9mIG1pc21hdGNoZXMgYWxsb3dlZCB0byBjb3VudCBhcyBhIG1hdGNoDQogICAgDQogICAgVGhlIHJlc3VsdHMgZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugd2lsbCBjb250YWluIHRoZSBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9sbG93aW5nIG5hbWVkIHJlc3VsdHM6DQogICAgIC0gQ3ttaXNtYXRjaGVzfSAtIGEgbGlzdCBvZiB0aGUgcG9zaXRpb25zIHdpdGhpbiB0aGUgbWF0Y2hfc3RyaW5nIHdoZXJlIG1pc21hdGNoZXMgd2VyZSBmb3VuZA0KICAgICAtIEN7b3JpZ2luYWx9IC0gdGhlIG9yaWdpbmFsIG1hdGNoX3N0cmluZyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgaW5wdXQgc3RyaW5nDQogICAgDQogICAgSWYgQ3ttaXNtYXRjaGVzfSBpcyBhbiBlbXB0eSBsaXN0LCB0aGVuIHRoZSBtYXRjaCB3YXMgYW4gZXhhY3QgbWF0Y2guDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICdBVENBVENHQUFUR0dBJyAod2l0aCB1cCB0byAxIG1pc21hdGNoZXMpIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAjIGV4YWN0IG1hdGNoDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVRHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVRHR0EnXSwgeydtaXNtYXRjaGVzJzogW1tdXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KDQogICAgICAgICMgY2xvc2UgbWF0Y2ggYWxsb3dpbmcgdXAgdG8gMiBtaXNtYXRjaGVzDQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIiwgbWF4TWlzbWF0Y2hlcz0yKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiAoWydBVENBWENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbNCwgOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hdGNoX3N0cmluZywgbWF4TWlzbWF0Y2hlcz0xKToNCiAgICAgICAgc3VwZXIoQ2xvc2VNYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1hdGNoX3N0cmluZyA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1heE1pc21hdGNoZXMgPSBtYXhNaXNtYXRjaGVzDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICVyICh3aXRoIHVwIHRvICVkIG1pc21hdGNoZXMpIiAlIChzZWxmLm1hdGNoX3N0cmluZywgc2VsZi5tYXhNaXNtYXRjaGVzKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIGxlbihzZWxmLm1hdGNoX3N0cmluZykNCg0KICAgICAgICBpZiBtYXhsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBtYXRjaF9zdHJpbmcgPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nbG9jID0gMA0KICAgICAgICAgICAgbWlzbWF0Y2hlcyA9IFtdDQogICAgICAgICAgICBtYXhNaXNtYXRjaGVzID0gc2VsZi5tYXhNaXNtYXRjaGVzDQoNCiAgICAgICAgICAgIGZvciBtYXRjaF9zdHJpbmdsb2Msc19tIGluIGVudW1lcmF0ZSh6aXAoaW5zdHJpbmdbbG9jOm1heGxvY10sIHNlbGYubWF0Y2hfc3RyaW5nKSk6DQogICAgICAgICAgICAgICAgc3JjLG1hdCA9IHNfbQ0KICAgICAgICAgICAgICAgIGlmIHNyYyAhPSBtYXQ6DQogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKG1hdGNoX3N0cmluZ2xvYykNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1pc21hdGNoZXMpID4gbWF4TWlzbWF0Y2hlczoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyA9IG1hdGNoX3N0cmluZ2xvYyArIDENCiAgICAgICAgICAgICAgICByZXN1bHRzID0gUGFyc2VSZXN1bHRzKFtpbnN0cmluZ1tzdGFydDpsb2NdXSkNCiAgICAgICAgICAgICAgICByZXN1bHRzWydvcmlnaW5hbCddID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgICAgICByZXN1bHRzWydtaXNtYXRjaGVzJ10gPSBtaXNtYXRjaGVzDQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0cw0KDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIFdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBhbGxvd2VkIGNoYXJhY3RlciBzZXRzLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgYWxsb3dlZCBpbml0aWFsIGNoYXJhY3RlcnMsDQogICAgYW4gb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5pbmcgYWxsb3dlZCBib2R5IGNoYXJhY3RlcnMgKGlmIG9taXR0ZWQsDQogICAgZGVmYXVsdHMgdG8gdGhlIGluaXRpYWwgY2hhcmFjdGVyIHNldCksIGFuZCBhbiBvcHRpb25hbCBtaW5pbXVtLA0KICAgIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4gQW4gb3B0aW9uYWwNCiAgICBDe2V4Y2x1ZGVDaGFyc30gcGFyYW1ldGVyIGNhbiBsaXN0IGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBmb3VuZCBpbiANCiAgICB0aGUgaW5wdXQgQ3tib2R5Q2hhcnN9IHN0cmluZzsgdXNlZnVsIHRvIGRlZmluZSBhIHdvcmQgb2YgYWxsIHByaW50YWJsZXMNCiAgICBleGNlcHQgZm9yIG9uZSBvciB0d28gY2hhcmFjdGVycywgZm9yIGluc3RhbmNlLg0KICAgIA0KICAgIEx7c3JhbmdlfSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGN1c3RvbSBjaGFyYWN0ZXIgc2V0IHN0cmluZ3MgZm9yIGRlZmluaW5nIA0KICAgIEN7V29yZH0gZXhwcmVzc2lvbnMsIHVzaW5nIHJhbmdlIG5vdGF0aW9uIGZyb20gcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBzZXRzLg0KICAgIA0KICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gdXNlIEN7V29yZH0gdG8gbWF0Y2ggYSBzcGVjaWZpYyBsaXRlcmFsIHN0cmluZywgYXMgaW4gDQogICAgQ3tXb3JkKCJBZGRyZXNzIil9LiBSZW1lbWJlciB0aGF0IEN7V29yZH0gdXNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHRvIGRlZmluZQ0KICAgIEl7c2V0c30gb2YgbWF0Y2hhYmxlIGNoYXJhY3RlcnMuIFRoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCAiQWRkIiwgIkFBQSIsDQogICAgImRBcmVkIiwgb3IgYW55IG90aGVyIHdvcmQgbWFkZSB1cCBvZiB0aGUgY2hhcmFjdGVycyAnQScsICdkJywgJ3InLCAnZScsIGFuZCAncycuDQogICAgVG8gbWF0Y2ggYW4gZXhhY3QgbGl0ZXJhbCBzdHJpbmcsIHVzZSBMe0xpdGVyYWx9IG9yIEx7S2V5d29yZH0uDQoNCiAgICBweXBhcnNpbmcgaW5jbHVkZXMgaGVscGVyIHN0cmluZ3MgZm9yIGJ1aWxkaW5nIFdvcmRzOg0KICAgICAtIEx7YWxwaGFzfQ0KICAgICAtIEx7bnVtc30NCiAgICAgLSBMe2FscGhhbnVtc30NCiAgICAgLSBMe2hleG51bXN9DQogICAgIC0gTHthbHBoYXM4Yml0fSAoYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBhY2NlbnRlZCwgdGlsZGVkLCB1bWxhdXRlZCwgZXRjLikNCiAgICAgLSBMe3B1bmM4Yml0fSAobm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gY3VycmVuY3ksIHN5bWJvbHMsIHN1cGVyc2NyaXB0cywgZGlhY3JpdGljYWxzLCBldGMuKQ0KICAgICAtIEx7cHJpbnRhYmxlc30gKGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIpDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBhIHdvcmQgY29tcG9zZWQgb2YgZGlnaXRzDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpICMgZXF1aXZhbGVudCB0byBXb3JkKCIwMTIzNDU2Nzg5Iikgb3IgV29yZChzcmFuZ2UoIjAtOSIpKQ0KICAgICAgICANCiAgICAgICAgIyBhIHdvcmQgd2l0aCBhIGxlYWRpbmcgY2FwaXRhbCwgYW5kIHplcm8gb3IgbW9yZSBsb3dlcmNhc2UNCiAgICAgICAgY2FwaXRhbF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQoNCiAgICAgICAgIyBob3N0bmFtZXMgYXJlIGFscGhhbnVtZXJpYywgd2l0aCBsZWFkaW5nIGFscGhhLCBhbmQgJy0nDQogICAgICAgIGhvc3RuYW1lID0gV29yZChhbHBoYXMsIGFscGhhbnVtcysnLScpDQogICAgICAgIA0KICAgICAgICAjIHJvbWFuIG51bWVyYWwgKG5vdCBhIHN0cmljdCBwYXJzZXIsIGFjY2VwdHMgaW52YWxpZCBtaXggb2YgY2hhcmFjdGVycykNCiAgICAgICAgcm9tYW4gPSBXb3JkKCJJVlhMQ0RNIikNCiAgICAgICAgDQogICAgICAgICMgYW55IHN0cmluZyBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBleGNlcHQgZm9yICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0iLCIpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBpbml0Q2hhcnMsIGJvZHlDaGFycz1Ob25lLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAsIGFzS2V5d29yZD1GYWxzZSwgZXhjbHVkZUNoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoV29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGV4Y2x1ZGVDaGFyczoNCiAgICAgICAgICAgIGluaXRDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBpbml0Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICAgICAgaWYgYm9keUNoYXJzOg0KICAgICAgICAgICAgICAgIGJvZHlDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBib2R5Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICBzZWxmLmluaXRDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgc2VsZi5pbml0Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KICAgICAgICBpZiBib2R5Q2hhcnMgOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gYm9keUNoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChib2R5Q2hhcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGluaXRDaGFycykNCg0KICAgICAgICBzZWxmLm1heFNwZWNpZmllZCA9IG1heCA+IDANCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChXb3JkKCkpIGlmIHplcm8tbGVuZ3RoIHdvcmQgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuYXNLZXl3b3JkID0gYXNLZXl3b3JkDQoNCiAgICAgICAgaWYgJyAnIG5vdCBpbiBzZWxmLmluaXRDaGFyc09yaWcrc2VsZi5ib2R5Q2hhcnNPcmlnIGFuZCAobWluPT0xIGFuZCBtYXg9PTAgYW5kIGV4YWN0PT0wKToNCiAgICAgICAgICAgIGlmIHNlbGYuYm9keUNoYXJzT3JpZyA9PSBzZWxmLmluaXRDaGFyc09yaWc6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdKyIgJSBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZykNCiAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaW5pdENoYXJzT3JpZykgPT0gMToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIiVzWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXVslc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSByIlxiIitzZWxmLnJlU3RyaW5nK3IiXGIiDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoIHNlbGYucmVTdHJpbmcgKQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5yZToNCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5pbml0Q2hhcnMpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGJvZHljaGFycyA9IHNlbGYuYm9keUNoYXJzDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGluc3RybGVuICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBGYWxzZQ0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYubWF4U3BlY2lmaWVkIGFuZCBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICBpZiAoc3RhcnQ+MCBhbmQgaW5zdHJpbmdbc3RhcnQtMV0gaW4gYm9keWNoYXJzKSBvciAobG9jPGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFycyk6DQogICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQoNCiAgICAgICAgaWYgdGhyb3dFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoV29yZCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KDQogICAgICAgICAgICBkZWYgY2hhcnNBc1N0cihzKToNCiAgICAgICAgICAgICAgICBpZiBsZW4ocyk+NDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbOjRdKyIuLi4iDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMNCg0KICAgICAgICAgICAgaWYgKCBzZWxmLmluaXRDaGFyc09yaWcgIT0gc2VsZi5ib2R5Q2hhcnNPcmlnICk6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzLCVzKSIgJSAoIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKSwgY2hhcnNBc1N0cihzZWxmLmJvZHlDaGFyc09yaWcpICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzKSIgJSBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZykNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUmVnZXgoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IG1hdGNoIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuDQogICAgSWYgdGhlIGdpdmVuIHJlZ2V4IGNvbnRhaW5zIG5hbWVkIGdyb3VwcyAoZGVmaW5lZCB1c2luZyBDeyg/UDxuYW1lPi4uLil9KSwgdGhlc2Ugd2lsbCBiZSBwcmVzZXJ2ZWQgYXMgDQogICAgbmFtZWQgcGFyc2UgcmVzdWx0cy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsbnVtID0gUmVnZXgociJbKy1dP1xkK1wuXGQqIikNCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQ0KICAgICAgICAjIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjczOTkvaG93LWRvLXlvdS1tYXRjaC1vbmx5LXZhbGlkLXJvbWFuLW51bWVyYWxzLXdpdGgtYS1yZWd1bGFyLWV4cHJlc3Npb24NCiAgICAgICAgcm9tYW4gPSBSZWdleChyIk17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KSIpDQogICAgIiIiDQogICAgY29tcGlsZWRSRXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoIltBLVpdIikpDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToNCiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiINCiAgICAgICAgc3VwZXIoUmVnZXgsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBpZiBub3QgcGF0dGVybjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gUmVnZXg7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdHRlcm4sIFJlZ2V4LmNvbXBpbGVkUkV0eXBlKToNCiAgICAgICAgICAgIHNlbGYucmUgPSBwYXR0ZXJuDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc3RyKHBhdHRlcm4pDQogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MNCiAgICAgICAgICAgIA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVnZXggbWF5IG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aCBhIHN0cmluZyBvciBhIGNvbXBpbGVkIFJFIG9iamVjdCIpDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQ0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMocmVzdWx0Lmdyb3VwKCkpDQogICAgICAgIGlmIGQ6DQogICAgICAgICAgICBmb3IgayBpbiBkOg0KICAgICAgICAgICAgICAgIHJldFtrXSA9IGRba10NCiAgICAgICAgcmV0dXJuIGxvYyxyZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJSZTooJXMpIiAlIHJlcHIoc2VsZi5wYXR0ZXJuKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBRdW90ZWRTdHJpbmcoVG9rZW4pOg0KICAgIHIiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLg0KICAgIA0KICAgIERlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nDQogICAgICAgIC0gZXNjQ2hhciAtIGNoYXJhY3RlciB0byBlc2NhcGUgcXVvdGVzLCB0eXBpY2FsbHkgYmFja3NsYXNoIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gZXNjUXVvdGUgLSBzcGVjaWFsIHF1b3RlIHNlcXVlbmNlIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCBxdW90ZSBzdHJpbmcgKHN1Y2ggYXMgU1FMJ3MgIiIgdG8gZXNjYXBlIGFuIGVtYmVkZGVkICIpIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQ0KICAgICAgICAtIHVucXVvdGVSZXN1bHRzIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoZWQgdGV4dCBzaG91bGQgYmUgdW5xdW90ZWQgKGRlZmF1bHQ9Q3tUcnVlfSkNCiAgICAgICAgLSBlbmRRdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgZW5kIG9mIHRoZSBxdW90ZSBkZWxpbWl0ZWQgc3RyaW5nIChkZWZhdWx0PUN7Tm9uZX0gPT4gc2FtZSBhcyBxdW90ZUNoYXIpDQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQ0KICAgICAgICBwcmludChxcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSIgc2xkamYnKSkNCiAgICAgICAgY29tcGxleF9xcyA9IFF1b3RlZFN0cmluZygne3snLCBlbmRRdW90ZUNoYXI9J319JykNCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpDQogICAgICAgIHNxbF9xcyA9IFF1b3RlZFN0cmluZygnIicsIGVzY1F1b3RlPSciIicpDQogICAgICAgIHByaW50KHNxbF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICIiZW1iZWRkZWQiIiBxdW90ZXMiIHNsZGpmJykpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUnXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgInF1b3RlIiddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBxdW90ZUNoYXIsIGVzY0NoYXI9Tm9uZSwgZXNjUXVvdGU9Tm9uZSwgbXVsdGlsaW5lPUZhbHNlLCB1bnF1b3RlUmVzdWx0cz1UcnVlLCBlbmRRdW90ZUNoYXI9Tm9uZSwgY29udmVydFdoaXRlc3BhY2VFc2NhcGVzPVRydWUpOg0KICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQ0KDQogICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gcXVvdGUgY2hhcnMgLSB3b250IHdvcmsgYW55d2F5DQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgIGlmIG5vdCBxdW90ZUNoYXI6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJxdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIGlmIGVuZFF1b3RlQ2hhciBpcyBOb25lOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJlbmRRdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBzZWxmLnF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBzZWxmLnF1b3RlQ2hhckxlbiA9IGxlbihxdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0NCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXINCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXJMZW4gPSBsZW4oZW5kUXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyDQogICAgICAgIHNlbGYuZXNjUXVvdGUgPSBlc2NRdW90ZQ0KICAgICAgICBzZWxmLnVucXVvdGVSZXN1bHRzID0gdW5xdW90ZVJlc3VsdHMNCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMNCg0KICAgICAgICBpZiBtdWx0aWxpbmU6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lcyVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IDANCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzXG5cciVzXScgJSBcDQogICAgICAgICAgICAgICAgKCByZS5lc2NhcGUoc2VsZi5xdW90ZUNoYXIpLA0KICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksDQogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQ0KICAgICAgICBpZiBsZW4oc2VsZi5lbmRRdW90ZUNoYXIpID4gMToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoDQogICAgICAgICAgICAgICAgJ3woPzonICsgJyl8KD86Jy5qb2luKCIlc1teJXNdIiAlIChyZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXJbOmldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhcltpXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICBpZiBlc2NRdW90ZToNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpDQogICAgICAgIGlmIGVzY0NoYXI6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzLiknICUgcmUuZXNjYXBlKGVzY0NoYXIpKQ0KICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIg0KICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInKSolcycgJSByZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXIpKQ0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgc2VsZi5wYXR0ZXJuLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlDQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmVzdWx0ID0gaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0UXVvdGVDaGFyIGFuZCBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykgb3IgTm9uZQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIHJldCA9IHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoNCg0KICAgICAgICAgICAgIyBzdHJpcCBvZmYgcXVvdGVzDQogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQ0KDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCxiYXNlc3RyaW5nKToNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlDQogICAgICAgICAgICAgICAgaWYgJ1xcJyBpbiByZXQgYW5kIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzOg0KICAgICAgICAgICAgICAgICAgICB3c19tYXAgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xuJyA6ICdcbicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xmJyA6ICdcZicsDQogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZm9yIHdzbGl0LHdzY2hhciBpbiB3c19tYXAuaXRlbXMoKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBjaGFyYWN0ZXJzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZS5zdWIoc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4sIHIiXGc8MT4iLCByZXQpDQoNCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY1F1b3RlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZShzZWxmLmVzY1F1b3RlLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gbG9jLCByZXQNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAicXVvdGVkIHN0cmluZywgc3RhcnRpbmcgd2l0aCAlcyBlbmRpbmcgd2l0aCAlcyIgJSAoc2VsZi5xdW90ZUNoYXIsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBDaGFyc05vdEluKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgY2hhcmFjdGVycyBJe25vdH0gaW4gYSBnaXZlbiBzZXQgKHdpbGwNCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBkaXNhbGxvd2VkIGNoYXJhY3RlcnMsIGFuZCBhbiBvcHRpb25hbA0KICAgIG1pbmltdW0sIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGRlZmluZSBhIGNvbW1hLXNlcGFyYXRlZC12YWx1ZSBhcyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBDaGFyc05vdEluKCcsJykNCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnZGtscycsICdsc2RramYnLCAnczEyIDM0JywgJ0AhIycsICcyMTMnXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbm90Q2hhcnMsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCApOg0KICAgICAgICBzdXBlcihDaGFyc05vdEluLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYubm90Q2hhcnMgPSBub3RDaGFycw0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKENoYXJzTm90SW4oKSkgaWYgemVyby1sZW5ndGggY2hhciBncm91cCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9ICggc2VsZi5taW5MZW4gPT0gMCApDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1tsb2NdIGluIHNlbGYubm90Q2hhcnM6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBub3RjaGFycyA9IHNlbGYubm90Q2hhcnMNCiAgICAgICAgbWF4bGVuID0gbWluKCBzdGFydCtzZWxmLm1heExlbiwgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXA0KICAgICAgICAgICAgICAoaW5zdHJpbmdbbG9jXSBub3QgaW4gbm90Y2hhcnMpOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKENoYXJzTm90SW4sIHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgaWYgbGVuKHNlbGYubm90Q2hhcnMpID4gNDoNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzLi4uKSIgJSBzZWxmLm5vdENoYXJzWzo0XQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzKSIgJSBzZWxmLm5vdENoYXJzDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBXaGl0ZShUb2tlbik6DQogICAgIiIiDQogICAgU3BlY2lhbCBtYXRjaGluZyBjbGFzcyBmb3IgbWF0Y2hpbmcgd2hpdGVzcGFjZS4gIE5vcm1hbGx5LCB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQNCiAgICBieSBweXBhcnNpbmcgZ3JhbW1hcnMuICBUaGlzIGNsYXNzIGlzIGluY2x1ZGVkIHdoZW4gc29tZSB3aGl0ZXNwYWNlIHN0cnVjdHVyZXMNCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUNCiAgICBtYXRjaGVkOyBkZWZhdWx0IGlzIEN7IiBcXHRcXHJcXG4ifS4gIEFsc28gdGFrZXMgb3B0aW9uYWwgQ3ttaW59LCBDe21heH0sIGFuZCBDe2V4YWN0fSBhcmd1bWVudHMsDQogICAgYXMgZGVmaW5lZCBmb3IgdGhlIEN7THtXb3JkfX0gY2xhc3MuDQogICAgIiIiDQogICAgd2hpdGVTdHJzID0gew0KICAgICAgICAiICIgOiAiPFNQQz4iLA0KICAgICAgICAiXHQiOiAiPFRBQj4iLA0KICAgICAgICAiXG4iOiAiPExGPiIsDQogICAgICAgICJcciI6ICI8Q1I+IiwNCiAgICAgICAgIlxmIjogIjxGRj4iLA0KICAgICAgICB9DQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzPSIgXHRcclxuIiwgbWluPTEsIG1heD0wLCBleGFjdD0wKToNCiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoV2hpdGUgPSB3cw0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggIiIuam9pbihjIGZvciBjIGluIHNlbGYud2hpdGVDaGFycyBpZiBjIG5vdCBpbiBzZWxmLm1hdGNoV2hpdGUpICkNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLm5hbWUgPSAoIiIuam9pbihXaGl0ZS53aGl0ZVN0cnNbY10gZm9yIGMgaW4gc2VsZi5tYXRjaFdoaXRlKSkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLm1hdGNoV2hpdGUpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gc2VsZi5tYXRjaFdoaXRlOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQoNCmNsYXNzIF9Qb3NpdGlvblRva2VuKFRva2VuKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoX1Bvc2l0aW9uVG9rZW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWU9c2VsZi5fX2NsYXNzX18uX19uYW1lX18NCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIGNvbHVtbiBvZiBpbnB1dCB0ZXh0OyB1c2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgY29sbm8gKToNCiAgICAgICAgc3VwZXIoR29Ub0NvbHVtbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuY29sID0gY29sbm8NCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXS5pc3NwYWNlKCkgYW5kIGNvbCggbG9jLCBpbnN0cmluZyApICE9IHNlbGYuY29sIDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkNCiAgICAgICAgaWYgdGhpc2NvbCA+IHNlbGYuY29sOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsICJUZXh0IG5vdCBpbiBleHBlY3RlZCBjb2x1bW4iLCBzZWxmICkNCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sDQogICAgICAgIHJldCA9IGluc3RyaW5nWyBsb2M6IG5ld2xvYyBdDQogICAgICAgIHJldHVybiBuZXdsb2MsIHJldA0KDQoNCmNsYXNzIExpbmVTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgDQogICAgICAgIHRlc3QgPSAnJydcDQogICAgICAgIEFBQSB0aGlzIGxpbmUNCiAgICAgICAgQUFBIGFuZCB0aGlzIGxpbmUNCiAgICAgICAgICBBQUEgYnV0IG5vdCB0aGlzIG9uZQ0KICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUNCiAgICAgICAgJycnDQoNCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6DQogICAgICAgICAgICBwcmludCh0KQ0KICAgIA0KICAgIFByaW50czo6DQogICAgICAgIFsnQUFBJywgJyB0aGlzIGxpbmUnXQ0KICAgICAgICBbJ0FBQScsICcgYW5kIHRoaXMgbGluZSddICAgIA0KDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBjb2wobG9jLCBpbnN0cmluZykgPT0gMToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBMaW5lRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZUVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMucmVwbGFjZSgiXG4iLCIiKSApDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICBpZiBpbnN0cmluZ1tsb2NdID09ICJcbiI6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYysxLCAiXG4iDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFN0cmluZ1N0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgIyBzZWUgaWYgZW50aXJlIHN0cmluZyB1cCB0byBoZXJlIGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgaWdub3JlYWJsZXMNCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBTdHJpbmdFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgPCBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsaWYgbG9jID4gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgV29yZFN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgcHJlY2VkZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyAhPSAwOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvYy0xXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvY10gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZEVuZChhbHBoYW51bXMpfS4gQ3tXb3JkRW5kfSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGVuZCBvZg0KICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6DQogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBpZiBpbnN0cmxlbj4wIGFuZCBsb2M8aW5zdHJsZW46DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSBpbiBzZWxmLndvcmRDaGFycyBvcg0KICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIFBhcnNlRXhwcmVzc2lvbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBQYXJzZXJFbGVtZW50LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIF9nZW5lcmF0b3JUeXBlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwcnMsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSggZXhwcnMsIEl0ZXJhYmxlICk6DQogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsDQogICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShleHByLCBiYXNlc3RyaW5nKSBmb3IgZXhwciBpbiBleHBycyk6DQogICAgICAgICAgICAgICAgZXhwcnMgPSBtYXAoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBleHBycykNCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApDQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIGV4cHJzIF0NCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIkV4dGVuZHMgQ3tsZWF2ZVdoaXRlc3BhY2V9IGRlZmluZWQgaW4gYmFzZSBjbGFzcywgYW5kIGFsc28gaW52b2tlcyBDe2xlYXZlV2hpdGVzcGFjZX0gb24NCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwcnMgPSBbIGUuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnMgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHBycykgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQoNCiAgICAgICAgIyBjb2xsYXBzZSBuZXN0ZWQgQW5kJ3Mgb2YgdGhlIGZvcm0gQW5kKCBBbmQoIEFuZCggYSxiKSwgYyksIGQpIHRvIEFuZCggYSxiLGMsZCApDQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MNCiAgICAgICAgIyAobGlrZXdpc2UgZm9yIE9yJ3MgYW5kIE1hdGNoRmlyc3QncykNCiAgICAgICAgaWYgKCBsZW4oc2VsZi5leHBycykgPT0gMiApOg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gb3RoZXIuZXhwcnNbOl0gKyBbIHNlbGYuZXhwcnNbMV0gXQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1stMV0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQ0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yDQoNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIF91c3RyKHNlbGYpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc2V0UmVzdWx0c05hbWUobmFtZSxsaXN0QWxsTWF0Y2hlcykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KICAgICAgICANCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLmNvcHkoKQ0KICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10NCiAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCBpbiB0aGUgZ2l2ZW4gb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snKyd9IG9wZXJhdG9yLg0KICAgIE1heSBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyctJ30gb3BlcmF0b3IsIHdoaWNoIHdpbGwgc3VwcHJlc3MgYmFja3RyYWNraW5nLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQoNCiAgICAgICAgZXhwciA9IEFuZChbaW50ZWdlcigiaWQiKSxuYW1lX2V4cHIoIm5hbWUiKSxpbnRlZ2VyKCJhZ2UiKV0pDQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoNCiAgICAgICAgZXhwciA9IGludGVnZXIoImlkIikgKyBuYW1lX2V4cHIoIm5hbWUiKSArIGludGVnZXIoImFnZSIpDQogICAgIiIiDQoNCiAgICBjbGFzcyBfRXJyb3JTdG9wKEVtcHR5KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnLScNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihBbmQsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwcnNbMF0ud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHJzWzBdLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQ0KICAgICAgICAjIHByZS1wYXJzZWQgdGhlIHN0cmluZyBhcyBwYXJ0IG9mIG91ciBBbmQgcHJlLXBhcnNpbmcNCiAgICAgICAgbG9jLCByZXN1bHRsaXN0ID0gc2VsZi5leHByc1swXS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByc1sxOl06DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEFuZC5fRXJyb3JTdG9wKToNCiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIGVycm9yU3RvcDoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZVN5bnRheEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICBwZS5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uKGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICBpZiBleHBydG9rZW5zIG9yIGV4cHJ0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2Vucw0KICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRsaXN0DQoNCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5Og0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIE9yKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBsb25nZXN0IHN0cmluZyB3aWxsIGJlIHVzZWQuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeydeJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgT3IgdXNpbmcgJ14nIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIF4gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE9yLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgbWF0Y2hlcyA9IFtdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgbG9jMiA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdA0KICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKChsb2MyLCBlKSkNCg0KICAgICAgICBpZiBtYXRjaGVzOg0KICAgICAgICAgICAgbWF0Y2hlcy5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pDQogICAgICAgICAgICBmb3IgXyxlIGluIG1hdGNoZXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCg0KICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KDQogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIF4gIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBNYXRjaEZpcnN0KFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLg0KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgbWF0Y2guDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgICMgd2F0Y2ggdGhlIG9yZGVyIG9mIGV4cHJlc3Npb25zIHRvIG1hdGNoDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBGYWlsISAtPiBbWycxMjMnXSwgWyczJ10sIFsnMTQxNiddLCBbJzc4OSddXQ0KDQogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QNCiAgICAgICAgbnVtYmVyID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkgfCBXb3JkKG51bXMpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEJldHRlciAtPiBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6DQogICAgICAgIHN1cGVyKE1hdGNoRmlyc3Qsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldCA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIHJldHVybiByZXQNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KDQogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQogICAgZGVmIF9faW9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgRWFjaChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JyYnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb2xvciA9IG9uZU9mKCJSRUQgT1JBTkdFIFlFTExPVyBHUkVFTiBCTFVFIFBVUlBMRSBCTEFDSyBXSElURSBCUk9XTiIpDQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIHNoYXBlX2F0dHIgPSAic2hhcGU6IiArIHNoYXBlX3R5cGUoInNoYXBlIikNCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQ0KICAgICAgICBjb2xvcl9hdHRyID0gImNvbG9yOiIgKyBjb2xvcigiY29sb3IiKQ0KICAgICAgICBzaXplX2F0dHIgPSAic2l6ZToiICsgaW50ZWdlcigic2l6ZSIpDQoNCiAgICAgICAgIyB1c2UgRWFjaCAodXNpbmcgb3BlcmF0b3IgJyYnKSB0byBhY2NlcHQgYXR0cmlidXRlcyBpbiBhbnkgb3JkZXIgDQogICAgICAgICMgKHNoYXBlIGFuZCBwb3NuIGFyZSByZXF1aXJlZCwgY29sb3IgYW5kIHNpemUgYXJlIG9wdGlvbmFsKQ0KICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQ0KDQogICAgICAgIHNoYXBlX3NwZWMucnVuVGVzdHMoJycnDQogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICAgICAgY29sb3I6R1JFRU4gc2l6ZToyMCBzaGFwZTpUUklBTkdMRSBwb3NuOjIwLDQwDQogICAgICAgICAgICAnJycNCiAgICAgICAgICAgICkNCiAgICBwcmludHM6Og0KICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMA0KICAgICAgICBbJ3NoYXBlOicsICdTUVVBUkUnLCAnY29sb3I6JywgJ0JMQUNLJywgJ3Bvc246JywgWycxMDAnLCAnLCcsICcxMjAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxBQ0sNCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddDQogICAgICAgICAgLSB4OiAxMDANCiAgICAgICAgICAtIHk6IDEyMA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCg0KDQogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgWydzaGFwZTonLCAnQ0lSQ0xFJywgJ3NpemU6JywgJzUwJywgJ2NvbG9yOicsICdCTFVFJywgJ3Bvc246JywgWyc1MCcsICcsJywgJzgwJ11dDQogICAgICAgIC0gY29sb3I6IEJMVUUNCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQ0KICAgICAgICAgIC0geDogNTANCiAgICAgICAgICAtIHk6IDgwDQogICAgICAgIC0gc2hhcGU6IENJUkNMRQ0KICAgICAgICAtIHNpemU6IDUwDQoNCg0KICAgICAgICBjb2xvcjogR1JFRU4gc2l6ZTogMjAgc2hhcGU6IFRSSUFOR0xFIHBvc246IDIwLDQwDQogICAgICAgIFsnY29sb3I6JywgJ0dSRUVOJywgJ3NpemU6JywgJzIwJywgJ3NoYXBlOicsICdUUklBTkdMRScsICdwb3NuOicsIFsnMjAnLCAnLCcsICc0MCddXQ0KICAgICAgICAtIGNvbG9yOiBHUkVFTg0KICAgICAgICAtIHBvc246IFsnMjAnLCAnLCcsICc0MCddDQogICAgICAgICAgLSB4OiAyMA0KICAgICAgICAgIC0geTogNDANCiAgICAgICAgLSBzaGFwZTogVFJJQU5HTEUNCiAgICAgICAgLSBzaXplOiAyMA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOg0KICAgICAgICBzdXBlcihFYWNoLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmluaXRFeHByR3JvdXBzOg0KICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpDQogICAgICAgICAgICBvcHQxID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIF0NCiAgICAgICAgICAgIG9wdDIgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBlLm1heVJldHVybkVtcHR5IGFuZCBub3QgaXNpbnN0YW5jZShlLE9wdGlvbmFsKV0NCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDINCiAgICAgICAgICAgIHNlbGYubXVsdGlvcHRpb25hbHMgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxaZXJvT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLm11bHRpcmVxdWlyZWQgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPbmVPck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0NCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgKz0gc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gRmFsc2UNCiAgICAgICAgdG1wTG9jID0gbG9jDQogICAgICAgIHRtcFJlcWQgPSBzZWxmLnJlcXVpcmVkWzpdDQogICAgICAgIHRtcE9wdCAgPSBzZWxmLm9wdGlvbmFsc1s6XQ0KICAgICAgICBtYXRjaE9yZGVyID0gW10NCg0KICAgICAgICBrZWVwTWF0Y2hpbmcgPSBUcnVlDQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoNCiAgICAgICAgICAgIHRtcEV4cHJzID0gdG1wUmVxZCArIHRtcE9wdCArIHNlbGYubXVsdGlvcHRpb25hbHMgKyBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIGZhaWxlZCA9IFtdDQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHRtcExvYyA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCB0bXBMb2MgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZChlKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpDQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gdG1wUmVxZDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlcWQucmVtb3ZlKGUpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBPcHQucmVtb3ZlKGUpDQogICAgICAgICAgICBpZiBsZW4oZmFpbGVkKSA9PSBsZW4odG1wRXhwcnMpOg0KICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlDQoNCiAgICAgICAgaWYgdG1wUmVxZDoNCiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxvYywiTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBlbGVtZW50cyAoJXMpIiAlIG1pc3NpbmcgKQ0KDQogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkDQogICAgICAgIG1hdGNoT3JkZXIgKz0gW2UgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIGFuZCBlLmV4cHIgaW4gdG1wT3B0XQ0KDQogICAgICAgIHJlc3VsdGxpc3QgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBtYXRjaE9yZGVyOg0KICAgICAgICAgICAgbG9jLHJlc3VsdHMgPSBlLl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zKQ0KICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykNCg0KICAgICAgICBmaW5hbFJlc3VsdHMgPSBzdW0ocmVzdWx0bGlzdCwgUGFyc2VSZXN1bHRzKFtdKSkNCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgJiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIFBhcnNlRWxlbWVudEVuaGFuY2UoUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZXJFbGVtZW50fSwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHByLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQ0KICAgICAgICBzZWxmLmV4cHIgPSBleHByDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IGV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IGV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IGV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQ0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoZXhwci5pZ25vcmVFeHBycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIixsb2Msc2VsZi5lcnJtc2csc2VsZikNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXhwciA9IHNlbGYuZXhwci5jb3B5KCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgaWYgc2VsZiBpbiBwYXJzZUVsZW1lbnRMaXN0Og0KICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQ0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lIGFuZCBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIEZvbGxvd2VkQnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBtYXRjaGVzIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonDQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKCJzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiB1cHBlciBsZWZ0IikucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydjb2xvcicsICdCTEFDSyddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihGb2xsb3dlZEJ5LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmLmV4cHIudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQoNCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgdG8gZGlzYWxsb3cgbWF0Y2hpbmcgd2l0aCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Tm90QW55fQ0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkNCiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBkb2VzIEl7bm90fSBtYXRjaCBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQWxzbywgQ3tOb3RBbnl9IGRvZXMgSXtub3R9IHNraXAgb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UuIEN7Tm90QW55fQ0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZSAgIyBkbyBOT1QgdXNlIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCksIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGV4cHJzDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkZvdW5kIHVud2FudGVkIHRva2VuLCAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuZXhwci5jYW5QYXJzZU5leHQoaW5zdHJpbmcsIGxvYyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIn57IiArIF91c3RyKHNlbGYuZXhwcikgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9NdWx0aXBsZU1hdGNoKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihfTXVsdGlwbGVNYXRjaCwgc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KICAgICAgICBlbmRlciA9IHN0b3BPbg0KICAgICAgICBpZiBpc2luc3RhbmNlKGVuZGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGVuZGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGVuZGVyKQ0KICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9za2lwX2lnbm9yYWJsZXMgPSBzZWxmLl9za2lwSWdub3JhYmxlcw0KICAgICAgICBjaGVja19lbmRlciA9IHNlbGYubm90X2VuZGVyIGlzIG5vdCBOb25lDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlciA9IHNlbGYubm90X2VuZGVyLnRyeVBhcnNlDQogICAgICAgIA0KICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOw0KICAgICAgICAjIGlmIHNvLCBmYWlsKQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQ0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICAgICAgICAgIGlmIGhhc0lnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBzZWxmX3NraXBfaWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jDQogICAgICAgICAgICAgICAgbG9jLCB0bXB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyArPSB0bXB0b2tlbnMNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCiAgICAgICAgDQpjbGFzcyBPbmVPck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBCTEFDSyINCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgICMgRmFpbCEgcmVhZCAnY29sb3InIGFzIGRhdGEgaW5zdGVhZCBvZiBuZXh0IGxhYmVsIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSBjb2xvciddXQ0KDQogICAgICAgICMgdXNlIHN0b3BPbiBhdHRyaWJ1dGUgZm9yIE9uZU9yTW9yZSB0byBhdm9pZCByZWFkaW5nIGxhYmVsIHN0cmluZyBhcyBwYXJ0IG9mIHRoZSBkYXRhDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQ0KICAgICAgICANCiAgICAgICAgIyBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gYXMNCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpDQogICAgIiIiDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArIF91c3RyKHNlbGYuZXhwcikgKyAifS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIHJlcGV0aXRpb24gb2YgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe09uZU9yTW9yZX0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoWmVyb09yTW9yZSxzZWxmKS5fX2luaXRfXyhleHByLCBzdG9wT249c3RvcE9uKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICANCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIF9OdWxsVG9rZW4ob2JqZWN0KToNCiAgICBkZWYgX19ib29sX18oc2VsZik6DQogICAgICAgIHJldHVybiBGYWxzZQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19zdHJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICIiDQoNCl9vcHRpb25hbE5vdE1hdGNoZWQgPSBfTnVsbFRva2VuKCkNCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIE9wdGlvbmFsIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXINCiAgICAgICAgemlwID0gQ29tYmluZShXb3JkKG51bXMsIGV4YWN0PTUpICsgT3B0aW9uYWwoJy0nICsgV29yZChudW1zLCBleGFjdD00KSkpDQogICAgICAgIHppcC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgICAgIDEyMzQ1DQogICAgICAgICAgICANCiAgICAgICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgIDEyMzQ1DQogICAgICAgIFsnMTIzNDUnXQ0KDQogICAgICAgICMgWklQKzQgZm9ybQ0KICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgIFsnMTIxMDEtMDAwMSddDQoNCiAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICA5ODc2NS0NCiAgICAgICAgICAgICBeDQogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGRlZmF1bHQ9X29wdGlvbmFsTm90TWF0Y2hlZCApOg0KICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHQNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6DQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBQYXJzZVJlc3VsdHMoWyBzZWxmLmRlZmF1bHRWYWx1ZSBdKQ0KICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gWyBzZWxmLmRlZmF1bHRWYWx1ZSBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRva2VucyA9IFtdDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBTa2lwVG8oUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZA0KICAgICAtIGluY2x1ZGUgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaWYgVHJ1ZSwgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGFsc28gcGFyc2VkIA0KICAgICAgICAgICh0aGUgc2tpcHBlZCB0ZXh0IGFuZCB0YXJnZXQgZXhwcmVzc2lvbiBhcmUgcmV0dXJuZWQgYXMgYSAyLWVsZW1lbnQgbGlzdCkuDQogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgDQogICAgICAgICAgY29tbWVudHMpIHRoYXQgbWlnaHQgY29udGFpbiBmYWxzZSBtYXRjaGVzIHRvIHRoZSB0YXJnZXQgZXhwcmVzc2lvbg0KICAgICAtIGZhaWxPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSANCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCANCiAgICAgICAgICB0aGUgU2tpcFRvIGlzIG5vdCBhIG1hdGNoDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVwb3J0ID0gJycnDQogICAgICAgICAgICBPdXRzdGFuZGluZyBJc3N1ZXMgUmVwb3J0IC0gMSBKYW4gMjAwMA0KDQogICAgICAgICAgICAgICAjIHwgU2V2ZXJpdHkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEYXlzIE9wZW4NCiAgICAgICAgICAgIC0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQ0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2DQogICAgICAgICAgICAgIDk0IHwgQ29zbWV0aWMgfCBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykgICAgICAgICB8ICAgICAgICAgMTQNCiAgICAgICAgICAgICAgNzkgfCBNaW5vciAgICB8IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzIHwgICAgICAgICA0Nw0KICAgICAgICAgICAgJycnDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIFNFUCA9IFN1cHByZXNzKCd8JykNCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUA0KICAgICAgICAjIC0gaWdub3JlIHF1b3RlZCBzdHJpbmdzLCBzbyB0aGF0IGEgJ3wnIGNoYXJhY3RlciBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoDQogICAgICAgICMgLSBwYXJzZSBhY3Rpb24gd2lsbCBjYWxsIHRva2VuLnN0cmlwKCkgZm9yIGVhY2ggbWF0Y2hlZCB0b2tlbiwgaS5lLiwgdGhlIGRlc2NyaXB0aW9uIGJvZHkNCiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQ0KICAgICAgICBzdHJpbmdfZGF0YS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIuc3RyaXApKQ0KICAgICAgICB0aWNrZXRfZXhwciA9IChpbnRlZ2VyKCJpc3N1ZV9udW0iKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJkZXNjIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyKCJkYXlzX29wZW4iKSkNCiAgICAgICAgDQogICAgICAgIGZvciB0a3QgaW4gdGlja2V0X2V4cHIuc2VhcmNoU3RyaW5nKHJlcG9ydCk6DQogICAgICAgICAgICBwcmludCB0a3QuZHVtcCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWycxMDEnLCAnQ3JpdGljYWwnLCAnSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCcsICc2J10NCiAgICAgICAgLSBkYXlzX29wZW46IDYNCiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoDQogICAgICAgIC0gaXNzdWVfbnVtOiAxMDENCiAgICAgICAgLSBzZXY6IENyaXRpY2FsDQogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10NCiAgICAgICAgLSBkYXlzX29wZW46IDE0DQogICAgICAgIC0gZGVzYzogU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpDQogICAgICAgIC0gaXNzdWVfbnVtOiA5NA0KICAgICAgICAtIHNldjogQ29zbWV0aWMNCiAgICAgICAgWyc3OScsICdNaW5vcicsICdTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cycsICc0NyddDQogICAgICAgIC0gZGF5c19vcGVuOiA0Nw0KICAgICAgICAtIGRlc2M6IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzDQogICAgICAgIC0gaXNzdWVfbnVtOiA3OQ0KICAgICAgICAtIHNldjogTWlub3INCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyLCBpbmNsdWRlPUZhbHNlLCBpZ25vcmU9Tm9uZSwgZmFpbE9uPU5vbmUgKToNCiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApDQogICAgICAgIHNlbGYuaWdub3JlRXhwciA9IGlnbm9yZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmluY2x1ZGVNYXRjaCA9IGluY2x1ZGUNCiAgICAgICAgc2VsZi5hc0xpc3QgPSBGYWxzZQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhmYWlsT24pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJObyBtYXRjaCBmb3VuZCBmb3IgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydGxvYyA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcg0KICAgICAgICBleHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgPSBzZWxmLmZhaWxPbi5jYW5QYXJzZU5leHQgaWYgc2VsZi5mYWlsT24gaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQogICAgICAgIA0KICAgICAgICB0bXBsb2MgPSBsb2MNCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0IGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYnJlYWsgaWYgZmFpbE9uIGV4cHJlc3Npb24gbWF0Y2hlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBhZHZhbmNlIHBhc3QgaWdub3JlIGV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wbG9jID0gc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlKGluc3RyaW5nLCB0bXBsb2MpDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICMgbm8gbWF0Y2gsIGFkdmFuY2UgbG9jIGluIHN0cmluZw0KICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgbWF0Y2hlZCBza2lwdG8gZXhwciwgZG9uZQ0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbA0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzDQogICAgICAgIGxvYyA9IHRtcGxvYw0KICAgICAgICBza2lwdGV4dCA9IGluc3RyaW5nW3N0YXJ0bG9jOmxvY10NCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkNCiAgICAgICAgDQogICAgICAgIGlmIHNlbGYuaW5jbHVkZU1hdGNoOg0KICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgc2tpcHJlc3VsdCArPSBtYXQNCg0KICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0DQoNCmNsYXNzIEZvcndhcmQoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBleHByZXNzaW9uIHRvIGJlIGRlZmluZWQgbGF0ZXIgLQ0KICAgIHVzZWQgZm9yIHJlY3Vyc2l2ZSBncmFtbWFycywgc3VjaCBhcyBhbGdlYnJhaWMgaW5maXggbm90YXRpb24uDQogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuDQoNCiAgICBOb3RlOiB0YWtlIGNhcmUgd2hlbiBhc3NpZ25pbmcgdG8gQ3tGb3J3YXJkfSBub3QgdG8gb3Zlcmxvb2sgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMuDQogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6Og0KICAgICAgICBmd2RFeHByIDw8IGEgfCBiIHwgYw0KICAgIHdpbGwgYWN0dWFsbHkgYmUgZXZhbHVhdGVkIGFzOjoNCiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYw0KICAgIHRoZXJlYnkgbGVhdmluZyBiIGFuZCBjIG91dCBhcyBwYXJzZWFibGUgYWx0ZXJuYXRpdmVzLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UNCiAgICBleHBsaWNpdGx5IGdyb3VwIHRoZSB2YWx1ZXMgaW5zZXJ0ZWQgaW50byB0aGUgQ3tGb3J3YXJkfTo6DQogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykNCiAgICBDb252ZXJ0aW5nIHRvIHVzZSB0aGUgJzw8PScgb3BlcmF0b3IgaW5zdGVhZCB3aWxsIGF2b2lkIHRoaXMgcHJvYmxlbS4NCg0KICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nDQogICAgQ3tGb3J3YXJkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToNCiAgICAgICAgc3VwZXIoRm9yd2FyZCxzZWxmKS5fX2luaXRfXyggb3RoZXIsIHNhdmVsaXN0PUZhbHNlICkNCg0KICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3Mob3RoZXIpDQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gc2VsZi5leHByLm1heUluZGV4RXJyb3INCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKHNlbGYuZXhwci5pZ25vcmVFeHBycykNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPDwgb3RoZXINCiAgICANCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICBpZiBzZWxmIG5vdCBpbiB2YWxpZGF0ZVRyYWNlOg0KICAgICAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKFtdKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6IC4uLiINCg0KICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMNCiAgICAgICAgc2VsZi5fcmV2ZXJ0Q2xhc3MgPSBzZWxmLl9fY2xhc3NfXw0KICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Gb3J3YXJkTm9SZWN1cnNlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBfdXN0cihzZWxmLmV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICJOb25lIg0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcw0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAiICsgcmV0U3RyaW5nDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEZvcndhcmQsc2VsZikuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXQgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHJldCA8PD0gc2VsZg0KICAgICAgICAgICAgcmV0dXJuIHJldA0KDQpjbGFzcyBfRm9yd2FyZE5vUmVjdXJzZShGb3J3YXJkKToNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIi4uLiINCg0KY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZUV4cHJlc3Npb259LCBmb3IgY29udmVydGluZyBwYXJzZWQgcmVzdWx0cy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFRva2VuQ29udmVydGVyLHNlbGYpLl9faW5pdF9fKCBleHByICkjLCBzYXZlbGlzdCApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlDQoNCmNsYXNzIENvbWJpbmUoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byBjb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgdG9rZW5zIHRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbWF0Y2hpbmcgcGF0dGVybnMgbXVzdCBhbHNvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IHN0cmluZzsNCiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCiAgICAgICAgIyB3aWxsIGFsc28gZXJyb25lb3VzbHkgbWF0Y2ggdGhlIGZvbGxvd2luZw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQoNCiAgICAgICAgcmVhbCA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10NCiAgICAgICAgIyBubyBtYXRjaCB3aGVuIHRoZXJlIGFyZSBpbnRlcm5hbCBzcGFjZXMNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGpvaW5TdHJpbmc9IiIsIGFkamFjZW50PVRydWUgKToNCiAgICAgICAgc3VwZXIoQ29tYmluZSxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZg0KICAgICAgICBpZiBhZGphY2VudDoNCiAgICAgICAgICAgIHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYuam9pblN0cmluZyA9IGpvaW5TdHJpbmcNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBzZWxmLmFkamFjZW50Og0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pZ25vcmUoc2VsZiwgb3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0VG9rcyA9IHRva2VubGlzdC5jb3B5KCkNCiAgICAgICAgZGVsIHJldFRva3NbOl0NCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWUgYW5kIHJldFRva3MuaGFza2V5cygpOg0KICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gcmV0VG9rcw0KDQpjbGFzcyBHcm91cChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgIHRlcm0gPSBpZGVudCB8IG51bQ0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCAnYScsICdiJywgJzEwMCddDQoNCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsIFsnYScsICdiJywgJzEwMCddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihHcm91cCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KDQpjbGFzcyBEaWN0KFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5Lg0KICAgIEVhY2ggZWxlbWVudCBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvbiBhcyBpdHMga2V5Lg0KICAgIFVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcgd2hlbiB0aGUgZmlyc3QgY29sdW1uIGNhbiBiZSB1c2VkIGFzIGEgaXRlbSBrZXkuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiDQogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgDQogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMNCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcw0KICAgICAgICByZXN1bHQgPSBEaWN0KE9uZU9yTW9yZShHcm91cChhdHRyX2V4cHIpKSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgYWNjZXNzIG5hbWVkIGZpZWxkcyBhcyBkaWN0IGVudHJpZXMsIG9yIG91dHB1dCBhcyBkaWN0DQogICAgICAgIHByaW50KHJlc3VsdFsnc2hhcGUnXSkgICAgICAgIA0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydzaGFwZScsICdTUVVBUkUnLCAncG9zbicsICd1cHBlciBsZWZ0JywgJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnLCAndGV4dHVyZScsICdidXJsYXAnXQ0KDQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQ0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlDQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdA0KICAgICAgICAtIHNoYXBlOiBTUVVBUkUNCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXANCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnLCAnc2hhcGUnOiAnU1FVQVJFJ30NCiAgICBTZWUgbW9yZSBleGFtcGxlcyBhdCBMe1BhcnNlUmVzdWx0c30gb2YgYWNjZXNzaW5nIGZpZWxkcyBieSByZXN1bHRzIG5hbWUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKERpY3Qsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOg0KICAgICAgICAgICAgaWYgbGVuKHRvaykgPT0gMDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWtleSA9IHRva1swXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpa2V5LGludCk6DQogICAgICAgICAgICAgICAgaWtleSA9IF91c3RyKHRva1swXSkuc3RyaXAoKQ0KICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoIiIsaSkNCiAgICAgICAgICAgIGVsaWYgbGVuKHRvayk9PTIgYW5kIG5vdCBpc2luc3RhbmNlKHRva1sxXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBkaWN0dmFsdWUgPSB0b2suY29weSgpICNQYXJzZVJlc3VsdHMoaSkNCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdDQogICAgICAgICAgICAgICAgaWYgbGVuKGRpY3R2YWx1ZSkhPSAxIG9yIChpc2luc3RhbmNlKGRpY3R2YWx1ZSxQYXJzZVJlc3VsdHMpIGFuZCBkaWN0dmFsdWUuaGFza2V5cygpKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlLGkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlWzBdLGkpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0DQoNCg0KY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciBmb3IgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2YgYSBwYXJzZWQgZXhwcmVzc2lvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzb3VyY2UgPSAiYSwgYiwgYyxkIg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICB3ZF9saXN0MSA9IHdkICsgWmVyb09yTW9yZSgnLCcgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDEucGFyc2VTdHJpbmcoc291cmNlKSkNCg0KICAgICAgICAjIG9mdGVuLCBkZWxpbWl0ZXJzIHRoYXQgYXJlIHVzZWZ1bCBkdXJpbmcgcGFyc2luZyBhcmUganVzdCBpbiB0aGUNCiAgICAgICAgIyB3YXkgYWZ0ZXJ3YXJkIC0gdXNlIFN1cHByZXNzIHRvIGtlZXAgdGhlbSBvdXQgb2YgdGhlIHBhcnNlZCBvdXRwdXQNCiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0Mi5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddDQogICAgICAgIFsnYScsICdiJywgJ2MnLCAnZCddDQogICAgKFNlZSBhbHNvIEx7ZGVsaW1pdGVkTGlzdH0uKQ0KICAgICIiIg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXR1cm4gW10NCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZg0KDQoNCmNsYXNzIE9ubHlPbmNlKG9iamVjdCk6DQogICAgIiIiDQogICAgV3JhcHBlciBmb3IgcGFyc2UgYWN0aW9ucywgdG8gZW5zdXJlIHRoZXkgYXJlIG9ubHkgY2FsbGVkIG9uY2UuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOg0KICAgICAgICBzZWxmLmNhbGxhYmxlID0gX3RyaW1fYXJpdHkobWV0aG9kQ2FsbCkNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToNCiAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOg0KICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYuY2FsbGFibGUocyxsLHQpDQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiIikNCiAgICBkZWYgcmVzZXQoc2VsZik6DQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCg0KZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6DQogICAgIiIiDQogICAgRGVjb3JhdG9yIGZvciBkZWJ1Z2dpbmcgcGFyc2UgYWN0aW9ucy4gDQogICAgDQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGlzIGNhbGxlZCwgdGhpcyBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI+PiBlbnRlcmluZyBJe21ldGhvZC1uYW1lfShsaW5lOkl7Y3VycmVudF9zb3VyY2VfbGluZX0sIEl7cGFyc2VfbG9jYXRpb259LCBJe21hdGNoZWRfdG9rZW5zfSkiLn0NCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gY29tcGxldGVzLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPDwifSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUsIG9yIGFueSBleGNlcHRpb24gdGhhdCB0aGUgcGFyc2UgYWN0aW9uIHJhaXNlZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KDQogICAgICAgIEB0cmFjZVBhcnNlQWN0aW9uDQogICAgICAgIGRlZiByZW1vdmVfZHVwbGljYXRlX2NoYXJzKHRva2Vucyk6DQogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpKQ0KDQogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykNCiAgICAgICAgcHJpbnQod2RzLnBhcnNlU3RyaW5nKCJzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZiIpKQ0KICAgIHByaW50czo6DQogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpDQogICAgICAgIDw8bGVhdmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzIChyZXQ6ICdkZmprbHMnKQ0KICAgICAgICBbJ2RmamtscyddDQogICAgIiIiDQogICAgZiA9IF90cmltX2FyaXR5KGYpDQogICAgZGVmIHooKnBhQXJncyk6DQogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXw0KICAgICAgICBzLGwsdCA9IHBhQXJnc1stMzpdDQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6DQogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYw0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPj5lbnRlcmluZyAlcyhsaW5lOiAnJXMnLCAlZCwgJXIpXG4iICUgKHRoaXNGdW5jLGxpbmUobCxzKSxsLHQpICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQ0KICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAocmV0OiAlcilcbiIgJSAodGhpc0Z1bmMscmV0KSApDQogICAgICAgIHJldHVybiByZXQNCiAgICB0cnk6DQogICAgICAgIHouX19uYW1lX18gPSBmLl9fbmFtZV9fDQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICBwYXNzDQogICAgcmV0dXJuIHoNCg0KIw0KIyBnbG9iYWwgaGVscGVycw0KIw0KZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZA0KICAgIGNvbW1lbnRzLCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIEN7Y29tYmluZT1UcnVlfSBpbiB0aGUgY29uc3RydWN0b3IuDQogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4NCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQNCiAgICBhcyBhIGxpc3Qgb2YgdG9rZW5zLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIHN1cHByZXNzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYSxiYixjYyIpICMgLT4gWydhYScsICdiYicsICdjYyddDQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddDQogICAgIiIiDQogICAgZGxOYW1lID0gX3VzdHIoZXhwcikrIiBbIitfdXN0cihkZWxpbSkrIiAiK191c3RyKGV4cHIpKyJdLi4uIg0KICAgIGlmIGNvbWJpbmU6DQogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCg0KZGVmIGNvdW50ZWRBcnJheSggZXhwciwgaW50RXhwcj1Ob25lICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4NCiAgICBUaGlzIGhlbHBlciBkZWZpbmVzIGEgcGF0dGVybiBvZiB0aGUgZm9ybTo6DQogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4NCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93Lg0KICAgIFRoZSBtYXRjaGVkIHRva2VucyByZXR1cm5zIHRoZSBhcnJheSBvZiBleHByIHRva2VucyBhcyBhIGxpc3QgLSB0aGUgbGVhZGluZyBjb3VudCB0b2tlbiBpcyBzdXBwcmVzc2VkLg0KICAgIA0KICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCg0KICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwNCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5DQogICAgICAgIGJpbmFyeUNvbnN0YW50ID0gV29yZCgnMDEnKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogaW50KHRbMF0sIDIpKQ0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCiAgICAiIiINCiAgICBhcnJheUV4cHIgPSBGb3J3YXJkKCkNCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToNCiAgICAgICAgbiA9IHRbMF0NCiAgICAgICAgYXJyYXlFeHByIDw8IChuIGFuZCBHcm91cChBbmQoW2V4cHJdKm4pKSBvciBHcm91cChlbXB0eSkpDQogICAgICAgIHJldHVybiBbXQ0KICAgIGlmIGludEV4cHIgaXMgTm9uZToNCiAgICAgICAgaW50RXhwciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6aW50KHRbMF0pKQ0KICAgIGVsc2U6DQogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQ0KICAgIGludEV4cHIuc2V0TmFtZSgiYXJyYXlMZW4iKQ0KICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQ0KDQpkZWYgX2ZsYXR0ZW4oTCk6DQogICAgcmV0ID0gW10NCiAgICBmb3IgaSBpbiBMOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6DQogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0LmFwcGVuZChpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYQ0KICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uDQogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIGlmIHQ6DQogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToNCiAgICAgICAgICAgICAgICByZXAgPDwgdFswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMNCiAgICAgICAgICAgICAgICB0ZmxhdCA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXAgPDwgRW1wdHkoKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkNCiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Ow0KICAgIHRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlZCwgc28NCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBlMiA9IGV4cHIuY29weSgpDQogICAgcmVwIDw8PSBlMg0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICBkZWYgbXVzdE1hdGNoVGhlc2VUb2tlbnMocyxsLHQpOg0KICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLDAsIiIpDQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzKToNCiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0NCiAgICBmb3IgYyBpbiByIlxeLV0iOg0KICAgICAgICBzID0gcy5yZXBsYWNlKGMsX2JzbGFzaCtjKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikNCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpDQogICAgcmV0dXJuIF91c3RyKHMpDQoNCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvDQogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsDQogICAgYnV0IHJldHVybnMgYSBDe0x7TWF0Y2hGaXJzdH19IGZvciBiZXN0IHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBzdHJzIC0gYSBzdHJpbmcgb2Ygc3BhY2UtZGVsaW1pdGVkIGxpdGVyYWxzLCBvciBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGxpdGVyYWxzDQogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MNCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgNCiAgICAgICAgICBvYmplY3Q7IG90aGVyd2lzZSwgd2lsbCBnZW5lcmF0ZSBhIEN7TWF0Y2hGaXJzdH0gb2JqZWN0IChpZiBDe2Nhc2VsZXNzPVRydWV9LCBvcg0KICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQ0KICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyDQogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtDQogICAgICAgIHByaW50KGNvbXBhcmlzb25fZXhwci5zZWFyY2hTdHJpbmcoIkIgPSAxMiAgQUE9MjMgQjw9QUEgQUE+MTIiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0NCiAgICAiIiINCiAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnVwcGVyKCkuc3RhcnRzd2l0aChhLnVwcGVyKCkpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwNCiAgICBlbHNlOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhID09IGIgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsDQoNCiAgICBzeW1ib2xzID0gW10NCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6DQogICAgICAgIHN5bWJvbHMgPSBzdHJzLnNwbGl0KCkNCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgSXRlcmFibGUpOg0KICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQ0KICAgIGVsc2U6DQogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgIGlmIG5vdCBzeW1ib2xzOg0KICAgICAgICByZXR1cm4gTm9NYXRjaCgpDQoNCiAgICBpID0gMA0KICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToNCiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQ0KICAgICAgICBmb3IgaixvdGhlciBpbiBlbnVtZXJhdGUoc3ltYm9sc1tpKzE6XSk6DQogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgc3ltYm9scy5pbnNlcnQoaSxvdGhlcikNCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpICs9IDENCg0KICAgIGlmIG5vdCBjYXNlbGVzcyBhbmQgdXNlUmVnZXg6DQogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBsZW4oc3ltYm9scyk9PWxlbigiIi5qb2luKHN5bWJvbHMpKToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggInwiLmpvaW4ocmUuZXNjYXBlKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCg0KICAgICMgbGFzdCByZXNvcnQsIGp1c3QgdXNlIE1hdGNoRmlyc3QNCiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KDQpkZWYgZGljdE9mKCBrZXksIHZhbHVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMNCiAgICBmb3IgdGhlIGtleSBhbmQgdmFsdWUuICBUYWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBDe0x7RGljdH19LCBDe0x7WmVyb09yTW9yZX19LCBhbmQgQ3tMe0dyb3VwfX0gdG9rZW5zDQogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sDQogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlDQogICAgcGF0dGVybiBjYW4gaW5jbHVkZSBuYW1lZCByZXN1bHRzLCBzbyB0aGF0IHRoZSBDe0RpY3R9IHJlc3VsdHMgY2FuIGluY2x1ZGUgbmFtZWQgdG9rZW4NCiAgICBmaWVsZHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbA0KICAgICAgICBhdHRyX3ZhbHVlID0gU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pDQoNCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0DQogICAgICAgIHJlc3VsdCA9IGRpY3RPZihhdHRyX2xhYmVsLCBhdHRyX3ZhbHVlKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pDQogICAgICAgIHByaW50KHJlc3VsdC5zaGFwZSkgICMgb2JqZWN0IGF0dHJpYnV0ZSBhY2Nlc3Mgd29ya3MgdG9vDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQ0KICAgICIiIg0KICAgIHJldHVybiBEaWN0KCBaZXJvT3JNb3JlKCBHcm91cCAoIGtleSArIHZhbHVlICkgKSApDQoNCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bw0KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8NCiAgICByZXZlcnQgc2VwYXJhdGUgdG9rZW5zIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtYXRjaGluZw0KICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIA0KICAgICAgIA0KICAgIElmIHRoZSBvcHRpb25hbCBDe2FzU3RyaW5nfSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgQ3tGYWxzZX0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIA0KICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIA0KICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgDQogICAgdGhlIGV4cHJlc3Npb24gcGFzc2VkIHRvIEN7THtvcmlnaW5hbFRleHRGb3J9fSBjb250YWlucyBleHByZXNzaW9ucyB3aXRoIGRlZmluZWQNCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UNCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiDQogICAgICAgIGZvciB0YWcgaW4gKCJiIiwiaSIpOg0KICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpDQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5zZWFyY2hTdHJpbmcoc3JjKVswXSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQ0KICAgICAgICBbJzxpPnRleHQ8L2k+J10NCiAgICAiIiINCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpDQogICAgZW5kbG9jTWFya2VyID0gbG9jTWFya2VyLmNvcHkoKQ0KICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikNCiAgICBpZiBhc1N0cmluZzoNCiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQ0KICAgIGVsc2U6DQogICAgICAgIGRlZiBleHRyYWN0VGV4dChzLGwsdCk6DQogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQ0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkNCiAgICBtYXRjaEV4cHIuaWdub3JlRXhwcnMgPSBleHByLmlnbm9yZUV4cHJzDQogICAgcmV0dXJuIG1hdGNoRXhwcg0KDQpkZWYgdW5ncm91cChleHByKTogDQogICAgIiIiDQogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4NCiAgICBpZiBhbGwgYnV0IG9uZSBhcmUgbm9uLWVtcHR5Lg0KICAgICIiIg0KICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQ0KDQpkZWYgbG9jYXRlZEV4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlY29yYXRlIGEgcmV0dXJuZWQgdG9rZW4gd2l0aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IHN0cmluZy4NCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoNCiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucw0KICAgICAtIGxvY25fZW5kID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGVuZHMNCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMNCg0KICAgIEJlIGNhcmVmdWwgaWYgdGhlIGlucHV0IHRleHQgY29udGFpbnMgQ3s8VEFCPn0gY2hhcmFjdGVycywgeW91IG1heSB3YW50IHRvIGNhbGwNCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6DQogICAgICAgICAgICBwcmludChtYXRjaCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWzAsICdsanNkZicsIDVdXQ0KICAgICAgICBbWzgsICdsa3NkampmJywgMTVdXQ0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dDQogICAgIiIiDQogICAgbG9jYXRvciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OiBsKQ0KICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpDQoNCg0KIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMNCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpDQpsaW5lU3RhcnQgICA9IExpbmVTdGFydCgpLnNldE5hbWUoImxpbmVTdGFydCIpDQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikNCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpDQpzdHJpbmdFbmQgICA9IFN0cmluZ0VuZCgpLnNldE5hbWUoInN0cmluZ0VuZCIpDQoNCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pDQpfZXNjYXBlZEhleENoYXIgPSBSZWdleChyIlxcMD9beFhdWzAtOWEtZkEtRl0rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXS5sc3RyaXAocidcMHgnKSwxNikpKQ0KX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpDQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IENoYXJzTm90SW4ocidcXScsIGV4YWN0PTEpDQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpDQpfcmVCcmFja2V0RXhwciA9IExpdGVyYWwoIlsiKSArIE9wdGlvbmFsKCJeIikuc2V0UmVzdWx0c05hbWUoIm5lZ2F0ZSIpICsgR3JvdXAoIE9uZU9yTW9yZSggX2NoYXJSYW5nZSB8IF9zaW5nbGVDaGFyICkgKS5zZXRSZXN1bHRzTmFtZSgiYm9keSIpICsgIl0iDQoNCmRlZiBzcmFuZ2Uocyk6DQogICAgciIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgZGVmaW5lIHN0cmluZyByYW5nZXMgZm9yIHVzZSBpbiBXb3JkIGNvbnN0cnVjdGlvbi4gIEJvcnJvd3MNCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6Og0KICAgICAgICBzcmFuZ2UoIlswLTldIikgICAtPiAiMDEyMzQ1Njc4OSINCiAgICAgICAgc3JhbmdlKCJbYS16XSIpICAgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ig0KICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyINCiAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncywgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGV4cGFuZGVkDQogICAgY2hhcmFjdGVyIHNldCBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuDQogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6DQogICAgIC0gYSBzaW5nbGUgY2hhcmFjdGVyDQogICAgIC0gYW4gZXNjYXBlZCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgYmFja3NsYXNoIChzdWNoIGFzIEN7XC19IG9yIEN7XF19KQ0KICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIA0KICAgICAgICAgKEN7XDB4IyN9IGlzIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgDQogICAgIC0gYW4gZXNjYXBlZCBvY3RhbCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXDAnfSAoQ3tcMDQxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKQ0KICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pDQogICAgIC0gYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAoQ3snYWVpb3V5J30sIEN7J2EtekEtWjAtOV8kJ30sIGV0Yy4pDQogICAgIiIiDQogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkNCiAgICB0cnk6DQogICAgICAgIHJldHVybiAiIi5qb2luKF9leHBhbmRlZChwYXJ0KSBmb3IgcGFydCBpbiBfcmVCcmFja2V0RXhwci5wYXJzZVN0cmluZyhzKS5ib2R5KQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIHJldHVybiAiIg0KDQpkZWYgbWF0Y2hPbmx5QXRDb2wobik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgcGFyc2UgYWN0aW9ucyB0aGF0IHJlcXVpcmUgbWF0Y2hpbmcgYXQgYSBzcGVjaWZpYw0KICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4NCiAgICAiIiINCiAgICBkZWYgdmVyaWZ5Q29sKHN0cmcsbG9jbix0b2tzKToNCiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHN0cmcsbG9jbiwibWF0Y2hlZCB0b2tlbiBub3QgYXQgY29sdW1uICVkIiAlIG4pDQogICAgcmV0dXJuIHZlcmlmeUNvbA0KDQpkZWYgcmVwbGFjZVdpdGgocmVwbFN0cik6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkNCiAgICB1c2VmdWwgd2hlbiB1c2VkIHdpdGggQ3tMe3RyYW5zZm9ybVN0cmluZzxQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZz59KCl9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIG51bSA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgbmEgPSBvbmVPZigiTi9BIE5BIikuc2V0UGFyc2VBY3Rpb24ocmVwbGFjZVdpdGgobWF0aC5uYW4pKQ0KICAgICAgICB0ZXJtID0gbmEgfCBudW0NCiAgICAgICAgDQogICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiMzI0IDIzNCBOL0EgMjM0IikgIyAtPiBbMzI0LCAyMzQsIG5hbiwgMjM0XQ0KICAgICIiIg0KICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IFtyZXBsU3RyXQ0KDQpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToNCiAgICAiIiINCiAgICBIZWxwZXIgcGFyc2UgYWN0aW9uIGZvciByZW1vdmluZyBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcXVvdGVkIHN0cmluZ3MuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBieSBkZWZhdWx0LCBxdW90YXRpb24gbWFya3MgYXJlIGluY2x1ZGVkIGluIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0NCg0KICAgICAgICAjIHVzZSByZW1vdmVRdW90ZXMgdG8gc3RyaXAgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIk5vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50Il0NCiAgICAiIiINCiAgICByZXR1cm4gdFswXVsxOi0xXQ0KDQpkZWYgdG9rZW5NYXAoZnVuYywgKmFyZ3MpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBwYXJzZSBhY3Rpb24gYnkgbWFwcGluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiBhIFBhcnNlUmVzdWx0cyBsaXN0LklmIGFueSBhZGRpdGlvbmFsIA0KICAgIGFyZ3MgYXJlIHBhc3NlZCwgdGhleSBhcmUgZm9yd2FyZGVkIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlcg0KICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQ0KICAgIHBhcnNlZCBkYXRhIHRvIGFuIGludGVnZXIgdXNpbmcgYmFzZSAxNi4NCg0KICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6DQogICAgICAgIGhleF9pbnRzID0gT25lT3JNb3JlKFdvcmQoaGV4bnVtcykpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKQ0KICAgICAgICBoZXhfaW50cy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgICAgICAnJycpDQogICAgICAgIA0KICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkNCiAgICAgICAgT25lT3JNb3JlKHVwcGVyd29yZCkucnVuVGVzdHMoJycnDQogICAgICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnRpdGxlKSkNCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnDQogICAgICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgWzAsIDE3LCAzNCwgMTcwLCAyNTUsIDEwLCAxMywgMjZdDQoNCiAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICBbJ01ZJywgJ0tJTkdET00nLCAnRk9SJywgJ0EnLCAnSE9SU0UnXQ0KDQogICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgWydOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrJ10NCiAgICAiIiINCiAgICBkZWYgcGEocyxsLHQpOg0KICAgICAgICByZXR1cm4gW2Z1bmModG9rbiwgKmFyZ3MpIGZvciB0b2tuIGluIHRdDQoNCiAgICB0cnk6DQogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpDQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiBwYQ0KDQp1cGNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLnVwY2FzZVRva2Vuc30iIiINCg0KZG93bmNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkNCiIiIihEZXByZWNhdGVkKSBIZWxwZXIgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmRvd25jYXNlVG9rZW5zfSIiIg0KICAgIA0KZGVmIF9tYWtlVGFncyh0YWdTdHIsIHhtbCk6DQogICAgIiIiSW50ZXJuYWwgaGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucywgZ2l2ZW4gYSB0YWcgbmFtZSIiIg0KICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyDQogICAgICAgIHRhZ1N0ciA9IEtleXdvcmQodGFnU3RyLCBjYXNlbGVzcz1ub3QgeG1sKQ0KICAgIGVsc2U6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHIubmFtZQ0KDQogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpDQogICAgaWYgKHhtbCk6DQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IGRibFF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lICsgU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgZWxzZToNCiAgICAgICAgcHJpbnRhYmxlc0xlc3NSQWJyYWNrID0gIiIuam9pbihjIGZvciBjIGluIHByaW50YWJsZXMgaWYgYyBub3QgaW4gIj4iKQ0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBxdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKSB8IFdvcmQocHJpbnRhYmxlc0xlc3NSQWJyYWNrKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZS5zZXRQYXJzZUFjdGlvbihkb3duY2FzZVRva2VucykgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSApKSkgKyBcDQogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpDQogICAgY2xvc2VUYWcgPSBDb21iaW5lKF9MKCI8LyIpICsgdGFnU3RyICsgIj4iKQ0KDQogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpDQogICAgY2xvc2VUYWcgPSBjbG9zZVRhZy5zZXRSZXN1bHRzTmFtZSgiZW5kIisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8LyVzPiIgJSByZXNuYW1lKQ0KICAgIG9wZW5UYWcudGFnID0gcmVzbmFtZQ0KICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUNCiAgICByZXR1cm4gb3BlblRhZywgY2xvc2VUYWcNCg0KZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIEhUTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgIyBtYWtlSFRNTFRhZ3MgcmV0dXJucyBweXBhcnNpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgYXMgYSAyLXR1cGxlDQogICAgICAgIGEsYV9lbmQgPSBtYWtlSFRNTFRhZ3MoIkEiKQ0KICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZA0KICAgICAgICANCiAgICAgICAgZm9yIGxpbmsgaW4gbGlua19leHByLnNlYXJjaFN0cmluZyh0ZXh0KToNCiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzDQogICAgICAgICAgICBwcmludChsaW5rLmxpbmtfdGV4dCwgJy0+JywgbGluay5ocmVmKQ0KICAgIHByaW50czo6DQogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tDQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBGYWxzZSApDQoNCmRlZiBtYWtlWE1MVGFncyh0YWdTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3Mgb25seSBpbiB0aGUgZ2l2ZW4gdXBwZXIvbG93ZXIgY2FzZS4NCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9DQogICAgIiIiDQogICAgcmV0dXJuIF9tYWtlVGFncyggdGFnU3RyLCBUcnVlICkNCg0KZGVmIHdpdGhBdHRyaWJ1dGUoKmFyZ3MsKiphdHRyRGljdCk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQNCiAgICB3aXRoIEN7THttYWtlWE1MVGFnc319IG9yIEN7THttYWtlSFRNTFRhZ3N9fS4gVXNlIEN7d2l0aEF0dHJpYnV0ZX0gdG8gcXVhbGlmeSBhIHN0YXJ0aW5nIHRhZw0KICAgIHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUsIHRvIGF2b2lkIGZhbHNlIG1hdGNoZXMgb24gY29tbW9uIHRhZ3Mgc3VjaCBhcw0KICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uDQoNCiAgICBDYWxsIEN7d2l0aEF0dHJpYnV0ZX0gd2l0aCBhIHNlcmllcyBvZiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcy4gU3BlY2lmeSB0aGUgbGlzdA0KICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6DQogICAgIC0ga2V5d29yZCBhcmd1bWVudHMsIGFzIGluIEN7KGFsaWduPSJyaWdodCIpfSwgb3INCiAgICAgLSBhcyBhbiBleHBsaWNpdCBkaWN0IHdpdGggQ3sqKn0gb3BlcmF0b3IsIHdoZW4gYW4gYXR0cmlidXRlIG5hbWUgaXMgYWxzbyBhIFB5dGhvbg0KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQ0KICAgICAtIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcywgYXMgaW4gKCAoIm5zMTpjbGFzcyIsICJDdXN0b21lciIpLCAoIm5zMjphbGlnbiIsInJpZ2h0IikgKQ0KICAgIEZvciBhdHRyaWJ1dGUgbmFtZXMgd2l0aCBhIG5hbWVzcGFjZSBwcmVmaXgsIHlvdSBtdXN0IHVzZSB0aGUgc2Vjb25kIGZvcm0uICBBdHRyaWJ1dGUNCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLg0KICAgICAgIA0KICAgIElmIGp1c3QgdGVzdGluZyBmb3IgQ3tjbGFzc30gKHdpdGggb3Igd2l0aG91dCBhIG5hbWVzcGFjZSksIHVzZSBDe0x7d2l0aENsYXNzfX0uDQoNCiAgICBUbyB2ZXJpZnkgdGhhdCB0aGUgYXR0cmlidXRlIGV4aXN0cywgYnV0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHZhbHVlLCBwYXNzDQogICAgQ3t3aXRoQXR0cmlidXRlLkFOWV9WQUxVRX0gYXMgdGhlIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzIGhhcyBubyB0eXBlPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KDQogICAgICAgICMgb25seSBtYXRjaCBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlIHdpdGggdmFsdWUgImdyaWQiDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPSJncmlkIikpDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgIyBjb25zdHJ1Y3QgYSBtYXRjaCB3aXRoIGFueSBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQ0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBpZiBhcmdzOg0KICAgICAgICBhdHRycyA9IGFyZ3NbOl0NCiAgICBlbHNlOg0KICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkNCiAgICBhdHRycyA9IFsoayx2KSBmb3Igayx2IGluIGF0dHJzXQ0KICAgIGRlZiBwYShzLGwsdG9rZW5zKToNCiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoNCiAgICAgICAgICAgIGlmIGF0dHJOYW1lIG5vdCBpbiB0b2tlbnM6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJubyBtYXRjaGluZyBhdHRyaWJ1dGUgIiArIGF0dHJOYW1lKQ0KICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsImF0dHJpYnV0ZSAnJXMnIGhhcyB2YWx1ZSAnJXMnLCBtdXN0IGJlICclcyciICUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJOYW1lLCB0b2tlbnNbYXR0ck5hbWVdLCBhdHRyVmFsdWUpKQ0KICAgIHJldHVybiBwYQ0Kd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgPSBvYmplY3QoKQ0KDQpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToNCiAgICAiIiINCiAgICBTaW1wbGlmaWVkIHZlcnNpb24gb2YgQ3tMe3dpdGhBdHRyaWJ1dGV9fSB3aGVuIG1hdGNoaW5nIG9uIGEgZGl2IGNsYXNzIC0gbWFkZQ0KICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyAmbHQ7ZGl2Jmd0OyBoYXMgbm8gY2xhc3M8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKCJncmlkIikpDQogICAgICAgIA0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcyh3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGNsYXNzYXR0ciA9ICIlczpjbGFzcyIgJSBuYW1lc3BhY2UgaWYgbmFtZXNwYWNlIGVsc2UgImNsYXNzIg0KICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICANCg0Kb3BBc3NvYyA9IF9Db25zdGFudHMoKQ0Kb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkNCm9wQXNzb2MuUklHSFQgPSBvYmplY3QoKQ0KDQpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgZ3JhbW1hcnMgb2YgZXhwcmVzc2lvbnMgbWFkZSB1cCBvZg0KICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yDQogICAgYmluYXJ5LCBsZWZ0LSBvciByaWdodC1hc3NvY2lhdGl2ZS4gIFBhcnNlIGFjdGlvbnMgY2FuIGFsc28gYmUgYXR0YWNoZWQNCiAgICB0byBvcGVyYXRvciBleHByZXNzaW9ucy4gVGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBhbHNvIHJlY29nbml6ZSB0aGUgdXNlIA0KICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuDQogICAgDQogICAgTm90ZTogaWYgeW91IGRlZmluZSBhIGRlZXAgb3BlcmF0b3IgbGlzdCwgeW91IG1heSBzZWUgcGVyZm9ybWFuY2UgaXNzdWVzDQogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhDQogICAgbWVjaGFuaXNtIHRvIHBvdGVudGlhbGx5IGltcHJvdmUgeW91ciBwYXJzZXIgcGVyZm9ybWFuY2UuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJhc2VFeHByIC0gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG1vc3QgYmFzaWMgZWxlbWVudCBmb3IgdGhlIG5lc3RlZA0KICAgICAtIG9wTGlzdCAtIGxpc3Qgb2YgdHVwbGVzLCBvbmUgZm9yIGVhY2ggb3BlcmF0b3IgcHJlY2VkZW5jZSBsZXZlbCBpbiB0aGUNCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQ0KICAgICAgKG9wRXhwciwgbnVtVGVybXMsIHJpZ2h0TGVmdEFzc29jLCBwYXJzZUFjdGlvbiksIHdoZXJlOg0KICAgICAgIC0gb3BFeHByIGlzIHRoZSBweXBhcnNpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9wZXJhdG9yOw0KICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7DQogICAgICAgICAgaWYgbnVtVGVybXMgaXMgMywgb3BFeHByIGlzIGEgdHVwbGUgb2YgdHdvIGV4cHJlc3Npb25zLCBmb3IgdGhlDQogICAgICAgICAgdHdvIG9wZXJhdG9ycyBzZXBhcmF0aW5nIHRoZSAzIHRlcm1zDQogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0DQogICAgICAgICAgYmUgMSwgMiwgb3IgMykNCiAgICAgICAtIHJpZ2h0TGVmdEFzc29jIGlzIHRoZSBpbmRpY2F0b3Igd2hldGhlciB0aGUgb3BlcmF0b3IgaXMNCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQNCiAgICAgICAgICBjb25zdGFudHMgQ3tvcEFzc29jLlJJR0hUfSBhbmQgQ3tvcEFzc29jLkxFRlR9Lg0KICAgICAgIC0gcGFyc2VBY3Rpb24gaXMgdGhlIHBhcnNlIGFjdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgNCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQ0KICAgICAgICAgIHBhcnNlIGFjdGlvbiB0dXBsZSBtZW1iZXIgbWF5IGJlIG9taXR0ZWQpOyBpZiB0aGUgcGFyc2UgYWN0aW9uDQogICAgICAgICAgaXMgcGFzc2VkIGEgdHVwbGUgb3IgbGlzdCBvZiBmdW5jdGlvbnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0bw0KICAgICAgICAgIGNhbGxpbmcgQ3tzZXRQYXJzZUFjdGlvbigqZm4pfSAoTHtQYXJzZXJFbGVtZW50LnNldFBhcnNlQWN0aW9ufSkNCiAgICAgLSBscGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgbGVmdC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcoJyl9KQ0KICAgICAtIHJwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyByaWdodC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcpJyl9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgc2ltcGxlIGV4YW1wbGUgb2YgZm91ci1mdW5jdGlvbiBhcml0aG1ldGljIHdpdGggaW50cyBhbmQgdmFyaWFibGUgbmFtZXMNCiAgICAgICAgaW50ZWdlciA9IHB5cGFyc2luZ19jb21tb24uc2lnbmVkX2ludGVnZXINCiAgICAgICAgdmFybmFtZSA9IHB5cGFyc2luZ19jb21tb24uaWRlbnRpZmllciANCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIgPSBpbmZpeE5vdGF0aW9uKGludGVnZXIgfCB2YXJuYW1lLA0KICAgICAgICAgICAgWw0KICAgICAgICAgICAgKCctJywgMSwgb3BBc3NvYy5SSUdIVCksDQogICAgICAgICAgICAob25lT2YoJyogLycpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgKG9uZU9mKCcrIC0nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIF0pDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgNSszKjYNCiAgICAgICAgICAgICg1KzMpKjYNCiAgICAgICAgICAgIC0yLS0xMQ0KICAgICAgICAgICAgJycnLCBmdWxsRHVtcD1GYWxzZSkNCiAgICBwcmludHM6Og0KICAgICAgICA1KzMqNg0KICAgICAgICBbWzUsICcrJywgWzMsICcqJywgNl1dXQ0KDQogICAgICAgICg1KzMpKjYNCiAgICAgICAgW1tbNSwgJysnLCAzXSwgJyonLCA2XV0NCg0KICAgICAgICAtMi0tMTENCiAgICAgICAgW1tbJy0nLCAyXSwgJy0nLCBbJy0nLCAxMV1dXQ0KICAgICIiIg0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGxhc3RFeHByID0gYmFzZUV4cHIgfCAoIGxwYXIgKyByZXQgKyBycGFyICkNCiAgICBmb3IgaSxvcGVyRGVmIGluIGVudW1lcmF0ZShvcExpc3QpOg0KICAgICAgICBvcEV4cHIsYXJpdHkscmlnaHRMZWZ0QXNzb2MscGEgPSAob3BlckRlZiArIChOb25lLCkpWzo0XQ0KICAgICAgICB0ZXJtTmFtZSA9ICIlcyB0ZXJtIiAlIG9wRXhwciBpZiBhcml0eSA8IDMgZWxzZSAiJXMlcyB0ZXJtIiAlIG9wRXhwcg0KICAgICAgICBpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgaWYgb3BFeHByIGlzIE5vbmUgb3IgbGVuKG9wRXhwcikgIT0gMjoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBudW10ZXJtcz0zLCBvcEV4cHIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3Qgb2YgdHdvIGV4cHJlc3Npb25zIikNCiAgICAgICAgICAgIG9wRXhwcjEsIG9wRXhwcjIgPSBvcEV4cHINCiAgICAgICAgdGhpc0V4cHIgPSBGb3J3YXJkKCkuc2V0TmFtZSh0ZXJtTmFtZSkNCiAgICAgICAgaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5MRUZUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIGxhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgbGFzdEV4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwcitsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUobGFzdEV4cHIpICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuUklHSFQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgICMgdHJ5IHRvIGF2b2lkIExSIHdpdGggdGhpcyBleHRyYSB0ZXN0DQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3BFeHByLCBPcHRpb25hbCk6DQogICAgICAgICAgICAgICAgICAgIG9wRXhwciA9IE9wdGlvbmFsKG9wRXhwcikNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KG9wRXhwci5leHByICsgdGhpc0V4cHIpICsgR3JvdXAoIG9wRXhwciArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGluZGljYXRlIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdml0eSIpDQogICAgICAgIGlmIHBhOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYSwgKHR1cGxlLCBsaXN0KSk6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKCpwYSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKHBhKQ0KICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApDQogICAgICAgIGxhc3RFeHByID0gdGhpc0V4cHINCiAgICByZXQgPDw9IGxhc3RFeHByDQogICAgcmV0dXJuIHJldA0KDQpvcGVyYXRvclByZWNlZGVuY2UgPSBpbmZpeE5vdGF0aW9uDQoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiDQoNCmRibFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIpDQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/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+TGluZUVuZCgpICsgV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9JywnKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpDQogICAgY29tbWFfc2VwYXJhdGVkX2xpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWEgc2VwYXJhdGVkIGxpc3QiKQ0KICAgICIiIlByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiIiIg0KDQogICAgdXBjYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4iIiINCg0KICAgIGRvd25jYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKSkNCiAgICAiIiJQYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4iIiINCg0KDQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOg0KDQogICAgc2VsZWN0VG9rZW4gICAgPSBDYXNlbGVzc0xpdGVyYWwoInNlbGVjdCIpDQogICAgZnJvbVRva2VuICAgICAgPSBDYXNlbGVzc0xpdGVyYWwoImZyb20iKQ0KDQogICAgaWRlbnQgICAgICAgICAgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zICsgIl8kIikNCg0KICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICBjb2x1bW5OYW1lTGlzdCA9IEdyb3VwKGRlbGltaXRlZExpc3QoY29sdW1uTmFtZSkpLnNldE5hbWUoImNvbHVtbnMiKQ0KICAgIGNvbHVtblNwZWMgICAgID0gKCcqJyB8IGNvbHVtbk5hbWVMaXN0KQ0KDQogICAgdGFibGVOYW1lICAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIHRhYmxlTmFtZUxpc3QgID0gR3JvdXAoZGVsaW1pdGVkTGlzdCh0YWJsZU5hbWUpKS5zZXROYW1lKCJ0YWJsZXMiKQ0KICAgIA0KICAgIHNpbXBsZVNRTCAgICAgID0gc2VsZWN0VG9rZW4oImNvbW1hbmQiKSArIGNvbHVtblNwZWMoImNvbHVtbnMiKSArIGZyb21Ub2tlbiArIHRhYmxlTmFtZUxpc3QoInRhYmxlcyIpDQoNCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcNCiAgICBzaW1wbGVTUUwucnVuVGVzdHMoIiIiDQogICAgICAgICMgJyonIGFzIGNvbHVtbiBsaXN0IGFuZCBkb3R0ZWQgdGFibGUgbmFtZQ0KICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQ0KDQogICAgICAgICMgY2FzZWxlc3MgbWF0Y2ggb24gIlNFTEVDVCIsIGFuZCBjYXN0cyBiYWNrIHRvICJzZWxlY3QiDQogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQw0KDQogICAgICAgICMgbGlzdCBvZiBjb2x1bW4gbmFtZXMsIGFuZCBtaXhlZCBjYXNlIFNFTEVDVCBrZXl3b3JkDQogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBtdWx0aXBsZSB0YWJsZXMNCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyDQoNCiAgICAgICAgIyBpbnZhbGlkIFNFTEVDVCBrZXl3b3JkIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgaW5jb21wbGV0ZSBjb21tYW5kIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0DQoNCiAgICAgICAgIyBpbnZhbGlkIGNvbHVtbiBuYW1lIC0gc2hvdWxkIGZhaWwNCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsDQoNCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQNCiAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICAtMTAwDQogICAgICAgICsxMDANCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICA2LjAyZTIzDQogICAgICAgIDFlLTEyDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoIiIiDQogICAgICAgIDEwMA0KICAgICAgICBGRg0KICAgICAgICAiIiIpDQoNCiAgICBpbXBvcnQgdXVpZA0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiINCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICIiIikNClBLAwQUAAAAAAAAACEAmVhNWpJ1AACSdQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAPOd8sHCCQAAwgkAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHlpbXBvcnQgc3lzCgoKY2xhc3MgVmVuZG9ySW1wb3J0ZXI6CiAgICAiIiIKICAgIEEgUEVQIDMwMiBtZXRhIHBhdGggaW1wb3J0ZXIgZm9yIGZpbmRpbmcgb3B0aW9uYWxseS12ZW5kb3JlZAogICAgb3Igb3RoZXJ3aXNlIG5hdHVyYWxseS1pbnN0YWxsZWQgcGFja2FnZXMgZnJvbSByb290X25hbWUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9uYW1lLCB2ZW5kb3JlZF9uYW1lcz0oKSwgdmVuZG9yX3BrZz1Ob25lKToKICAgICAgICBzZWxmLnJvb3RfbmFtZSA9IHJvb3RfbmFtZQogICAgICAgIHNlbGYudmVuZG9yZWRfbmFtZXMgPSBzZXQodmVuZG9yZWRfbmFtZXMpCiAgICAgICAgc2VsZi52ZW5kb3JfcGtnID0gdmVuZG9yX3BrZyBvciByb290X25hbWUucmVwbGFjZSgnZXh0ZXJuJywgJ192ZW5kb3InKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNlYXJjaF9wYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlYXJjaCBmaXJzdCB0aGUgdmVuZG9yIHBhY2thZ2UgdGhlbiBhcyBhIG5hdHVyYWwgcGFja2FnZS4KICAgICAgICAiIiIKICAgICAgICB5aWVsZCBzZWxmLnZlbmRvcl9wa2cgKyAnLicKICAgICAgICB5aWVsZCAnJwoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc2VsZiB3aGVuIGZ1bGxuYW1lIHN0YXJ0cyB3aXRoIHJvb3RfbmFtZSBhbmQgdGhlCiAgICAgICAgdGFyZ2V0IG1vZHVsZSBpcyBvbmUgdmVuZG9yZWQgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgYW55KG1hcCh0YXJnZXQuc3RhcnRzd2l0aCwgc2VsZi52ZW5kb3JlZF9uYW1lcykpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZSBvdmVyIHRoZSBzZWFyY2ggcGF0aCB0byBsb2NhdGUgYW5kIGxvYWQgZnVsbG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGZvciBwcmVmaXggaW4gc2VsZi5zZWFyY2hfcGF0aDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXh0YW50ID0gcHJlZml4ICsgdGFyZ2V0CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKGV4dGFudCkKICAgICAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgICAgICAgICAgIyBteXN0ZXJpb3VzIGhhY2s6CiAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHRhbnQgcGFja2FnZS9tb2R1bGUKICAgICAgICAgICAgICAgICMgb24gbGF0ZXIgUHl0aG9uIHZlcnNpb25zIHRvIGNhdXNlIHJlbGF0aXZlIGltcG9ydHMKICAgICAgICAgICAgICAgICMgaW4gdGhlIHZlbmRvciBwYWNrYWdlIHRvIHJlc29sdmUgdGhlIHNhbWUgbW9kdWxlcwogICAgICAgICAgICAgICAgIyBhcyB0aG9zZSBnb2luZyB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgICAgICAgICBpZiBwcmVmaXggYW5kIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMyk6CiAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHJldHVybiBtb2QKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgIlRoZSAne3RhcmdldH0nIHBhY2thZ2UgaXMgcmVxdWlyZWQ7ICIKICAgICAgICAgICAgICAgICJub3JtYWxseSB0aGlzIGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ugc28gaWYgeW91IGdldCAiCiAgICAgICAgICAgICAgICAidGhpcyB3YXJuaW5nLCBjb25zdWx0IHRoZSBwYWNrYWdlciBvZiB5b3VyICIKICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb24uIi5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBpbnN0YWxsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhpcyBpbXBvcnRlciBpbnRvIHN5cy5tZXRhX3BhdGggaWYgbm90IGFscmVhZHkgcHJlc2VudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChzZWxmKQoKCm5hbWVzID0gJ3BhY2thZ2luZycsICdweXBhcnNpbmcnLCAnc2l4JywgJ2FwcGRpcnMnClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEAi8CSRi4CAAAuAgAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlpbXBvcnQgb3MKaW1wb3J0IGVycm5vCmltcG9ydCBzeXMKCmZyb20gLmV4dGVybiBpbXBvcnQgc2l4CgoKZGVmIF9tYWtlZGlyc18zMShwYXRoLCBleGlzdF9vaz1GYWxzZSk6CiAgICB0cnk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICBpZiBub3QgZXhpc3Rfb2sgb3IgZXhjLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgcmFpc2UKCgojIHJlbHkgb24gY29tcGF0aWJpbGl0eSBiZWhhdmlvciB1bnRpbCBtb2RlIGNvbnNpZGVyYXRpb25zCiMgIGFuZCBleGlzdHNfb2sgY29uc2lkZXJhdGlvbnMgYXJlIGRpc2VudGFuZ2xlZC4KIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9wdWxsLzEwODMjaXNzdWVjb21tZW50LTMxNTE2ODY2MwpuZWVkc19tYWtlZGlycyA9ICgKICAgIHNpeC5QWTIgb3IKICAgICgzLCA0KSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDQsIDEpCikKbWFrZWRpcnMgPSBfbWFrZWRpcnNfMzEgaWYgbmVlZHNfbWFrZWRpcnMgZWxzZSBvcy5tYWtlZGlycwpQSwMEFAAAAAAAAAAhAFDXqwc2BAAANgQAAEgAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL0xJQ0VOU0VDb3B5cmlnaHQgKEMpIDIwMTYgSmFzb24gUiBDb29tYnMgPGphcmFjb0BqYXJhY28uY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KUEsDBBQAAAAAAAAAIQAxkN6geA4AAHgOAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9NRVRBREFUQU1ldGFkYXRhLVZlcnNpb246IDIuMQpOYW1lOiBzZXR1cHRvb2xzClZlcnNpb246IDQ0LjAuMApTdW1tYXJ5OiBFYXNpbHkgZG93bmxvYWQsIGJ1aWxkLCBpbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcwpIb21lLXBhZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMKQXV0aG9yOiBQeXRob24gUGFja2FnaW5nIEF1dGhvcml0eQpBdXRob3ItZW1haWw6IGRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZwpMaWNlbnNlOiBVTktOT1dOClByb2plY3QtVVJMOiBEb2N1bWVudGF0aW9uLCBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vCktleXdvcmRzOiBDUEFOIFB5UEkgZGlzdHV0aWxzIGVnZ3MgcGFja2FnZSBtYW5hZ2VtZW50ClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZQpDbGFzc2lmaWVyOiBPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNQpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOApDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmcKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24KQ2xhc3NpZmllcjogVG9waWMgOjogVXRpbGl0aWVzClJlcXVpcmVzLVB5dGhvbjogIT0zLjAuKiwhPTMuMS4qLCE9My4yLiosIT0zLjMuKiwhPTMuNC4qLD49Mi43CkRlc2NyaXB0aW9uLUNvbnRlbnQtVHlwZTogdGV4dC94LXJzdDsgY2hhcnNldD1VVEYtOApQcm92aWRlcy1FeHRyYTogY2VydHMKUmVxdWlyZXMtRGlzdDogY2VydGlmaSAoPT0yMDE2LjkuMjYpIDsgZXh0cmEgPT0gJ2NlcnRzJwpQcm92aWRlcy1FeHRyYTogc3NsClJlcXVpcmVzLURpc3Q6IHdpbmNlcnRzdG9yZSAoPT0wLjIpIDsgKHN5c19wbGF0Zm9ybSA9PSAid2luMzIiKSBhbmQgZXh0cmEgPT0gJ3NzbCcKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3Yvc2V0dXB0b29scy5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9yZWFkdGhlZG9jcy9zZXR1cHRvb2xzL2xhdGVzdC5zdmcKICAgIDp0YXJnZXQ6IGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pbwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1MaW51eCUyMENJJmxvZ289dHJhdmlzJmxvZ29Db2xvcj13aGl0ZQogICA6dGFyZ2V0OiBodHRwczovL3RyYXZpcy1jaS5vcmcvcHlwYS9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9V2luZG93cyUyMENJJmxvZ289YXBwdmV5b3ImbG9nb0NvbG9yPXdoaXRlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvcHlwYS9zZXR1cHRvb2xzL2JyYW5jaC9tYXN0ZXIKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9jb2RlY292L2MvZ2l0aHViL3B5cGEvc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xvZ289Y29kZWNvdiZsb2dvQ29sb3I9d2hpdGUKICAgOnRhcmdldDogaHR0cHM6Ly9jb2RlY292LmlvL2doL3B5cGEvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL3RpZGVsaWZ0LmNvbS9iYWRnZXMvZ2l0aHViL3B5cGEvc2V0dXB0b29scz9zdHlsZT1mbGF0CiAgIDp0YXJnZXQ6IGh0dHBzOi8vdGlkZWxpZnQuY29tL3N1YnNjcmlwdGlvbi9wa2cvcHlwaS1zZXR1cHRvb2xzP3V0bV9zb3VyY2U9cHlwaS1zZXR1cHRvb2xzJnV0bV9tZWRpdW09cmVhZG1lCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS9weXZlcnNpb25zL3NldHVwdG9vbHMuc3ZnCgpTZWUgdGhlIGBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfIGluIHRoZSBQeXRob24gUGFja2FnaW5nClVzZXIncyBHdWlkZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGluc3RhbGxpbmcsIHVwZ3JhZGluZywgYW5kIHVuaW5zdGFsbGluZwpTZXR1cHRvb2xzLgoKUXVlc3Rpb25zIGFuZCBjb21tZW50cyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gdGhlIGBkaXN0dXRpbHMtc2lnCm1haWxpbmcgbGlzdCA8aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvZGlzdHV0aWxzLXNpZy8+YF8uCkJ1ZyByZXBvcnRzIGFuZCBlc3BlY2lhbGx5IHRlc3RlZCBwYXRjaGVzIG1heSBiZQpzdWJtaXR0ZWQgZGlyZWN0bHkgdG8gdGhlIGBidWcgdHJhY2tlcgo8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXM+YF8uCgpUbyByZXBvcnQgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LCBwbGVhc2UgdXNlIHRoZQpgVGlkZWxpZnQgc2VjdXJpdHkgY29udGFjdCA8aHR0cHM6Ly90aWRlbGlmdC5jb20vc2VjdXJpdHk+YF8uClRpZGVsaWZ0IHdpbGwgY29vcmRpbmF0ZSB0aGUgZml4IGFuZCBkaXNjbG9zdXJlLgoKCkZvciBFbnRlcnByaXNlCj09PT09PT09PT09PT09CgpBdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgVGlkZWxpZnQgU3Vic2NyaXB0aW9uLgoKU2V0dXB0b29scyBhbmQgdGhlIG1haW50YWluZXJzIG9mIHRob3VzYW5kcyBvZiBvdGhlciBwYWNrYWdlcyBhcmUgd29ya2luZyB3aXRoIFRpZGVsaWZ0IHRvIGRlbGl2ZXIgb25lIGVudGVycHJpc2Ugc3Vic2NyaXB0aW9uIHRoYXQgY292ZXJzIGFsbCBvZiB0aGUgb3BlbiBzb3VyY2UgeW91IHVzZS4KCmBMZWFybiBtb3JlIDxodHRwczovL3RpZGVsaWZ0LmNvbS9zdWJzY3JpcHRpb24vcGtnL3B5cGktc2V0dXB0b29scz91dG1fc291cmNlPXB5cGktc2V0dXB0b29scyZ1dG1fbWVkaXVtPXJlZmVycmFsJnV0bV9jYW1wYWlnbj1naXRodWI+YF8uCgpDb2RlIG9mIENvbmR1Y3QKPT09PT09PT09PT09PT09CgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgc2V0dXB0b29scyBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywKY2hhdCByb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZQpgUHlQQSBDb2RlIG9mIENvbmR1Y3QgPGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8+YF8uCgoKUEsDBBQAAAAAAAAAIQBzz4mFKCMAACgjAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9SRUNPUkRlYXN5X2luc3RhbGwucHksc2hhMjU2PU1EQzl2dDVBeERzWFg1cWNLbEJ6MlRuVzZUcHV2X0FvYm5maENKOVgzUE0sMTI2CnBrZ19yZXNvdXJjZXMvX19pbml0X18ucHksc2hhMjU2PTBJc3N4WFBuYURLcFlaUnJhOEltZTBKRzRod29zUWxqSXRHRDBibklrR2ssMTA4MzQ5CnBrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weSxzaGEyNTY9LVdRMGU0YzNSR19hY2Rod0MzZ0xpWGhQX2xnNEc1cTdYWWtaa1FnMGd4VSw1NTgKcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDAKcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHksc2hhMjU2PU1pZXZVRXV2M2xfbVFJU0g1U0Ywc2hEa19CTmhISHpZaUFQclQzSVRONEksMjQ3MDEKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9dG1ycC1sdS1xTzFpNzVaeklONUExMm5LUlJEMUNtNFZway01TFI5cmltcywyMzIwNTUKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OApwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSxzaGEyNTY9emtjQ1BUTl82VGNMVzBOcmxnMDE3Ni1SMVFRX1dWUFRtOHN6MVI0LUhqTSw3MjAKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5LHNoYTI1Nj1WaV9BMHJBUWVIYlUtYTlYMHR0MXlRbTlScWtnUWJEU3h6Unc4V2xVOWtBLDg2MApwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj1SSW1FQ0o0Y193VGxhVFlZd1pZTEhFaWViRE1hQUptSzFvUEFSaHcxVDVvLDE0MTYKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj11RWNCQnRHdnpxbHRnbkFycWI5YzRScmNJblhlekRMb3MxNHpiQkhoV0pvLDgyNDgKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHksc2hhMjU2PVNpa0wyVXluYnNUMHF0WTlsdHFuZ25kaGFfc2ZvMHc2WEdGaEFob1NvYVEsNDM1NQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHksc2hhMjU2PVNBTVJlcnpPM2ZLMklrRlpDYVprdXdaYUxfRUdxSE5PejRwbmk0dmhuTjAsMjgwMjUKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjEKcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5LHNoYTI1Nj1Pd0dueFlmcjJnaE56WXg1OXFXSUJrckszU25CNm4tWmZkMVhhTHBubk0wLDExNTU2CnBrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj1jSGlFZkh1TG1tNnJzNVZlX3p0QmZNSTdMcjMxdnNzLUQ0d2txRjV4emxJLDI0OTgKc2V0dXB0b29scy9fX2luaXRfXy5weSxzaGEyNTY9V0JwQ2NuMmx2ZGNrb3RhYmVhZTFUVFlvblBPY2dDSUYzcmFEMnpSV3pCYyw3MjgzCnNldHVwdG9vbHMvX2RlcHJlY2F0aW9uX3dhcm5pbmcucHksc2hhMjU2PWpVOS1kdGZ2NmNLbXRRSk9YTjhuUDFtbTdnT053NWtLRXRpUHRid25aeUksMjE4CnNldHVwdG9vbHMvX2ltcC5weSxzaGEyNTY9amxvc2xPa3hyVEtib2JnZW1mUDk0WUlJMG5ocWlKekUxYlJtQ1RaMWE1SSwyMjIzCnNldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5LHNoYTI1Nj1rdzhJYl9sS2pDY25QS05iUzdoOEh6dFJWSzBkNVJhY1Uzcl9LUmRWbm1NLDY1OTIKc2V0dXB0b29scy9idWlsZF9tZXRhLnB5LHNoYTI1Nj0tOU5tajlZZGJXNHpYM1Rzc1BKWmhzRU5yVGE0Znczazg2Sm0xY2RLTWlrLDk1OTcKc2V0dXB0b29scy9jbGktMzIuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2CnNldHVwdG9vbHMvY2xpLTY0LmV4ZSxzaGEyNTY9S0xBQnU1cHlybm9rSkN2NnNralhaNkdzWGV5WUhHY3FPVVQzb0hJM1hwbyw3NDc1MgpzZXR1cHRvb2xzL2NsaS5leGUsc2hhMjU2PWRmRXVvdk1ObkEySExhM2pSZk1QVmk1dGs0UjdhbENicFR2dXh0Q3l3MFksNjU1MzYKc2V0dXB0b29scy9jb25maWcucHksc2hhMjU2PTZTQjJPWTNxY29vT0ptR19yc0tfczBwS0Jzb3JCbERwZk1KVXl6alFJR2ssMjA1NzUKc2V0dXB0b29scy9kZXBfdXRpbC5weSxzaGEyNTY9ZmdpeHZDMVI3c0gzcjEza3R5ZjdOMEZBTG9xRVhMMWNCYXJtTnBTRW9XZyw5MzUKc2V0dXB0b29scy9kZXBlbmRzLnB5LHNoYTI1Nj1xdDJSV2xsQXJSdmhubThseHN5UnBjdGhFWllwNEdIUWdSRWwxcTBMa0Z3LDU1MTcKc2V0dXB0b29scy9kaXN0LnB5LHNoYTI1Nj1odjVJVGZQalFiazhlQ01LV0tSc1ZVSFF2d1ZnNGVjbkJ0ckl5a3RVLVFFLDQ5ODU3CnNldHVwdG9vbHMvZXJyb3JzLnB5LHNoYTI1Nj1NVk9jdjM4MUhOU2FqRGdFVVd6T1E0SjZCNUJIQ0JNU2pIZmFXY0V3QTFvLDUyNApzZXR1cHRvb2xzL2V4dGVuc2lvbi5weSxzaGEyNTY9dWM2bkhJLU14d21OQ05QYlVpQm55YlN5cWhwSnFqYmh2T1EtZW1kdnRfRSwxNzI5CnNldHVwdG9vbHMvZ2xvYi5weSxzaGEyNTY9bzc1Y0hyT3hZc3ZuODU0dGhTeEUweDlrOEpyS0R1aFBfclJYbFZCMDBRNCw1MDg0CnNldHVwdG9vbHMvZ3VpLTMyLmV4ZSxzaGEyNTY9WEJyMGJITUE2SHB6MnM5czlCempsLVB3WGZhOW5INGllMHJGbjRWMmtXQSw2NTUzNgpzZXR1cHRvb2xzL2d1aS02NC5leGUsc2hhMjU2PWFZS01oWDFJSkxuNFVMSGdXWDBzRTB5UkVVdDZCM1RFSGZfak93NnlOeUUsNzUyNjQKc2V0dXB0b29scy9ndWkuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2CnNldHVwdG9vbHMvaW5zdGFsbGVyLnB5LHNoYTI1Nj1UQ0ZSb25SbzAxSTc5em8tdWNmM1ltaGo4VGVuUGxtaE1pak45MTZhYUpzLDUzMzcKc2V0dXB0b29scy9sYXVuY2gucHksc2hhMjU2PXNkN2Vqd2hCb2NDRHhfd0c5cklzME9hWjhIdG1tRlU4WkM2SVJfUzBMdmcsNzg3CnNldHVwdG9vbHMvbGliMnRvM19leC5weSxzaGEyNTY9dDVlMTJoYlIycGk5VjRleldEVEI0Sk0tQUlTVW5HT2ttY25ZSGVrM3hqZywyMDEzCnNldHVwdG9vbHMvbW9ua2V5LnB5LHNoYTI1Nj1GR2M5ZmZmaDdnQXhNTEZtSnMyRFdfT1lXcEJqa2RiTlMybjE0VUFLNE5BLDUyNjQKc2V0dXB0b29scy9tc3ZjLnB5LHNoYTI1Nj04YmFKNmFZZ0NBNFRSZFdRUWkxODVxQjlkblU4RmFQNHdncGJtZDdWT0RzLDQ2NzUxCnNldHVwdG9vbHMvbmFtZXNwYWNlcy5weSxzaGEyNTY9RjBOcmJ2OEtDVDJPck83cndhMDNvbTRONEdaS0FsbmNlLXJyLWNnRFFhOCwzMTk5CnNldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSxzaGEyNTY9NnBiLUIxUE90SHlMeWNBYmtERVRrNGZPLVF2OF9zWS1yalRYaFVPb2g2ayw0MDYwNQpzZXR1cHRvb2xzL3B5Mjdjb21wYXQucHksc2hhMjU2PXR2bWVyMFRuLXdrX0p1bW1Da29NMjJVSWpwakwtQVE4dVVpT2FxVHM4c0ksMTQ5NgpzZXR1cHRvb2xzL3B5MzFjb21wYXQucHksc2hhMjU2PWgycnRaZ2hPZndvR1lkOHNRMC1hdWFLaUYzVGNMM3FYMGJYM1Zlc3NxY0UsODM4CnNldHVwdG9vbHMvcHkzM2NvbXBhdC5weSxzaGEyNTY9U01GOVo4d25HaWNUT2tVMXVSTndaX2t6NVpfYmoyOVBVQmJxZHFlZU5zYywxMzMwCnNldHVwdG9vbHMvcHkzNGNvbXBhdC5weSxzaGEyNTY9S1lPZDZ5YlJ4akJXOE5KbVlEOHRfVXl5Vm15c3BwRlhxSHBGTGRzbEdYVSwyNDUKc2V0dXB0b29scy9zYW5kYm94LnB5LHNoYTI1Nj05VWJ3ZkVMNVFZNDM2b01JMUx0RldvaGhvWi1VendIdkd5WmpVSF9xaGt3LDE0Mjc2CnNldHVwdG9vbHMvc2NyaXB0IChkZXYpLnRtcGwsc2hhMjU2PVJVelF6Q1FVYVh0d2RMdFlIV1liSVFtT2FFUzVCcnFxMUZ2VUFfdHUtNUksMjE4CnNldHVwdG9vbHMvc2NyaXB0LnRtcGwsc2hhMjU2PVdHVHQ1cGllek8yN2MtRGJ4Nmw1UTRUM0ZmMjBBNXo3ODcyaHYzYUFoWVksMTM4CnNldHVwdG9vbHMvc2l0ZS1wYXRjaC5weSxzaGEyNTY9T3Vta0lITXVvU2VuUlNXMTM4MmtLV0kxVkF3eE5FODZFNVc4aURkMzRGWSwyMzAyCnNldHVwdG9vbHMvc3NsX3N1cHBvcnQucHksc2hhMjU2PW5MalBVQkJ3N1JUVHg2TzRSSlo1ZUFNR2dqSkc4YmVpRGJrRlhEWnBMdU0sODQ5MwpzZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHksc2hhMjU2PU5PaVpfNWhENzJBNnctNHdWajhhd0hGTTNuNTFLbXcxSWNfdngxNVhGcXcsOTk2CnNldHVwdG9vbHMvdmVyc2lvbi5weSxzaGEyNTY9b2dfY3VaUWIwUUk2dWtLWkZmWldQbHIxSGdKQlBQbjJ2TzJtX2JJOVpURSwxNDQKc2V0dXB0b29scy93aGVlbC5weSxzaGEyNTY9emN0LVNFajVfTG9IZzZYRUx0MmNWUmR1bHNVRU5lbkNkUzFla003VGxaQSw4NDU1CnNldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5LHNoYTI1Nj01R3JmcVNQMi1kTEdKb1pUcTJnNmRDS2t5UXh4YTJuNUlRaVhsSkNvWUVFLDcxNApzZXR1cHRvb2xzL192ZW5kb3IvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMApzZXR1cHRvb2xzL192ZW5kb3Ivb3JkZXJlZF9zZXQucHksc2hhMjU2PWRiYUNjczI3ZHlOOWduTVdHRjVuQV9CclZuNlEtTnJqS1lKcFY5X2ZnQnMsMTUxMzAKc2V0dXB0b29scy9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9dG1ycC1sdS1xTzFpNzVaeklONUExMm5LUlJEMUNtNFZway01TFI5cmltcywyMzIwNTUKc2V0dXB0b29scy9fdmVuZG9yL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OApzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSxzaGEyNTY9Q3B1TVN5aDFWN2FkdzhRTWpXS2tZM0x0ZHFSVWtSWDRNZ0o2bkY0c3RNMCw3NDQKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9NmVuYnA1WGdSZmpCanNJOS1ibjAwSGpIZjVUSDIxUERNT0trSlc4eHctdyw1NjIKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5LHNoYTI1Nj1VZ2RtLXFjbmVTY2hXMjVKcnRNSUtnVXhmRUVCY0NBejZXckVlWGVxejlvLDg2NQpzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj1wVmQ5MFhjWFJHd3BaUkJfcWRGdVZFaWJoQ0hwWF9iTDV6WXI5LU4wbWM4LDE0MTYKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj0tbWVGbDlGcjlWOHJGNVJkdXpnZXR0NUVISzl3QllSVXFzc0FWMnBqMGx3LDgyNjgKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHksc2hhMjU2PTNkd0lKZWt0OFJSR0NVYmd4WDhyZWVBYmdtWllqYjB3Y0NSdG1INjNreEksNDc0MgpzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHksc2hhMjU2PTBaelFwY1VudnJRNkxqUi1tUVJMek1yOEc2aGRSdi1tWTBWU2ZfYW1GdEksMjc3NzgKc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy90YWdzLnB5LHNoYTI1Nj1FUExYaE82R1REN19vaVdFTzFVMGwwUGtmUjhSX3hpdnBNREhYbnNUbHRzLDEyOTMzCnNldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHksc2hhMjU2PVZhVEMwRWk3ek8yeGw5QVJpV216MllGTEZ0ODlQdXVoTGJBbFhNeUFHbXMsMTUyMApzZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHksc2hhMjU2PU5wZHduYjhPSGVkal8yTDg2eWlVcXNjdWpiN3dfaTVnbVNLMVBoT0FGemcsMTE5NzgKc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5LHNoYTI1Nj1RQ0F1QTl3aG5xOEJub2MwYkJhUzZMd19LQVVPMERpSFlaUVhFTU5uNWhnLDU2OApzZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHksc2hhMjU2PUtqcEUwc3pfU0RJSHYzZnBaY0lRSy1zQ2tKei1TckM2R211ZzZiOU5rYzgsMjQyNgpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5LHNoYTI1Nj1ubmZWOEFoOElSQ19JZnY1TG9hOUZkeEw2Nk1WYnlEWHd5LWZvUDgxMHpNLDE4MTg1CnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHksc2hhMjU2PUI3bDBUbnpDR2ItMG5MbG02clMwMGpXTGtvakFTd1ZtZGhXMnc1UXpfQWssMTUwOApzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weSxzaGEyNTY9XzZkejNscEIxdFkyMDBMeEtQTE03cWd3VENjZU9NZ2FXRkYtalcyLXBtMCw2MzcKc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHksc2hhMjU2PWJROWFCci01WlNPLTlmR3NHc0RMejBtbm5GdGVIVVpuZnRWTGtodkhEcTAsNDQ4NApzZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5LHNoYTI1Nj1JYjQyWVVHa3NCc3dtMm1MNXhtUVBGNk5lVEE2SGNxcnZBdEVnRkN2MzJBLDEzMDE5CnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weSxzaGEyNTY9eVd5WWFhUzlGM285SmJJY3puMDY0QTVnMUM1X1VpS1JEeEdhVHFZYnRMRSw5NTk2CnNldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5LHNoYTI1Nj1NUWxuR1M2dVAxOWVySzJKQ05PeVFZb1l5cXVrM1BBRHJxcnJpbnFxTHRBLDgxODQKc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weSxzaGEyNTY9NXQ2a09mcmRnQUxULVAzb2dzczZQRjlrLUxleWVzdWV5Y3VrM2RVeVpuSSw5NjAKc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weSxzaGEyNTY9clFmWUdqUW9obWY1cWJJRFptUVZlcHhadDdlREwydFhILUo5bFJSdHpFUSw4NzU0NApzZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHksc2hhMjU2PXc3M0VkeFlTT2syZ3NhQWlIR0wyZFpyQ2xkb1BpdVJyMmVUZnFjRnZDZHMsMjU1NzAKc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHksc2hhMjU2PThkb014ZVFFRG9LNEVjbzBtTzJXbFhYenpwOVFuc0dKUTdaN3lXa1pQRzgsNDcwNQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSxzaGEyNTY9Yk1nZUllUmlYelE0REFHUFYxMzI4a2Nqd1FqSGpPV1U0Rm5nQVdMVjc4USwyMjAzCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSxzaGEyNTY9cjVOdWFzYVN4dm1JcmpnWk5qMzhJcS0xVUpHMW8xbXM3Q3VIcTZNQ1RiUSwzODYyCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHksc2hhMjU2PVVEMHJFWjY4NjFtVFloSWR6Y3NxS25VbDhQb3pvY1hXbDlWQlExVlRXbmMsMjQzOQpzZXR1cHRvb2xzL2NvbW1hbmQvbGF1bmNoZXIgbWFuaWZlc3QueG1sLHNoYTI1Nj14bExialdyQjAxdEtDMC1obFZrT0traVNQYnpNbWwyZU9QdEpfdWNDbmJFLDYyOApzZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weSxzaGEyNTY9U3pqWmNPeEY3emRGVVQ0N1p2Mm43QU0zSDhrb0R5c18wT3BTLW45Z0lmYyw0OTg2CnNldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weSxzaGEyNTY9a2szRHhYQ2I1bFhUdnFuaGZ3eDJnNnE3aXdiVW1nVHlYVUNhQm9vQk9Vayw0NjgKc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weSxzaGEyNTY9Y281QzFFa0k3UDBHR1Q2VHF6LVQyU0lqMkxCSlRaWFlFTHBtYW82ZDRLUSwyMTY0CnNldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSxzaGEyNTY9emE3UUNCY1FpbUtLcmlXY29DY2JoeFBqVXozMGdTQjc0enVUTDQ3eHBQNCw2NTgKc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5LHNoYTI1Nj1JTDFMZXBEMmg4cUdLT0ZKM3JyUVZiak5IX1E2VmlENDBsMFFBRHI0TUVVLDgwODgKc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weSxzaGEyNTY9TlRXRHl4LWdqREYtdHhmNGRPNTc3czdMT3pIVm9LUjBNcTMzckZ4YVJyOCw1MDg1CnNldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5LHNoYTI1Nj11MmtYbmdJSWRTWXF0dndGbEhpTjZJeWUxSUI0VFU2dWFkQjJ1aVYxc3p3LDk2MDIKc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weSxzaGEyNTY9WFQzWUZWZllQQW1BNXFoR2cwZXVsdVU5OGZ0eFJVVy1QektjT0RNTHhVcyw0NjIKc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5LHNoYTI1Nj1vWGlHcGxNX2NVS0x3RTRDV1d3OThSekN1ZkF1OHRCaE1DOTdHZWdGY21zLDczMTEKc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PTRxOWd0U2hCMVhGUDZDaXNsdHN5UHF0Y2ZUTzZaTTlMdTFRQmwzbC1xbW8sMjUxNApzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vTElDRU5TRSxzaGEyNTY9d3lvNnc1V3ZZeUh2MG92blBRYWdEdzIycTRoOUhDSFVfc1JoS05JRmJWbywxMDc4CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9NRVRBREFUQSxzaGEyNTY9UTU2VW1mNFZqOEpYM0U0c3RQbHRuRFFyWkRxbXdRY1VRUE5tYm9POUhyMCwzNzA0CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9XSEVFTCxzaGEyNTY9OHpOWVpid1FTWG9COUlmWE9qUGZlTnd2QXNBTEFqZmZnazI3RnF2Q1dibywxMTAKc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0LHNoYTI1Nj1IbGtDRmtvSzVUYlo1RU1MYkxLWWhMY1lfRTMxa0JXRDhUcVcyRWdtYXRRLDIzOQpzZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dCxzaGEyNTY9ZndvZ2taZWFrSWZ4TU5Xb2c3a3hjc2Jqd25NQU1rcENwUXY4eDFaalE3MCwzMjA2CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0LHNoYTI1Nj0ySFVYVlZ3QTRQZmYxeGdURnIzR3NUWFhLYVBhTzZ2bEc2b05KXzR1NFRnLDM4CnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby96aXAtc2FmZSxzaGEyNTY9QWJwSEdjZ0xiLWtSc0pHbndGRWt0azd1enBaT0NjQlk3NC1ZQmRyS1ZHcywxCnNldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9SRUNPUkQsLApQSwMEFAAAAAAAAAAhAKrgRvZuAAAAbgAAAEYAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzMuNikKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhADfZX93vAAAA7wAAAFUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0aHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS9jL2NlcnRpZmkvY2VydGlmaS0yMDE2LjkuMjYudGFyLmd6I21kNT1iYWE4MWU5NTFhMjk5NTg1NjM2ODlkODY4ZWYxMDY0ZApodHRwczovL2ZpbGVzLnB5dGhvbmhvc3RlZC5vcmcvcGFja2FnZXMvc291cmNlL3cvd2luY2VydHN0b3JlL3dpbmNlcnRzdG9yZS0wLjIuemlwI21kNT1hZTcyOGYyZjAwNzE4NTY0OGQwYzdhODY3OWIzNjFlMgpQSwMEFAAAAAAAAAAhAKx1HwiGDAAAhgwAAFEAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KZWFzeV9pbnN0YWxsLTMuOCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKYmRpc3RfcnBtID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0KYmRpc3Rfd2luaW5zdCA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QKYnVpbGRfY2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9jbGliOmJ1aWxkX2NsaWIKYnVpbGRfZXh0ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQKYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKZGlzdF9pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwKZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86ZWdnX2luZm8KaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwKaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KaW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKaW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKc2V0b3B0ID0gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdDpzZXRvcHQKdGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKdXBsb2FkX2RvY3MgPSBzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkX2RvY3M6dXBsb2FkX2RvY3MKCltkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZGVwZW5kZW5jeV9saW5rcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZWFnZXJfcmVzb3VyY2VzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpleHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKaW5zdGFsbF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcApwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCnBhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzCnB5dGhvbl9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIKc2V0dXBfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnRlc3RfbG9hZGVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9ydW5uZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKdGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdXNlXzJ0bzMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKdXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnVzZV8ydG8zX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKemlwX3NhZmUgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKCltlZ2dfaW5mby53cml0ZXJzXQpQS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbwpkZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmRlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQplYWdlcl9yZXNvdXJjZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZW50cnlfcG9pbnRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9lbnRyaWVzCm5hbWVzcGFjZV9wYWNrYWdlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpyZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCnRvcF9sZXZlbC50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfdG9wbGV2ZWxfbmFtZXMKCltzZXR1cHRvb2xzLmZpbmFsaXplX2Rpc3RyaWJ1dGlvbl9vcHRpb25zXQoydG8zX2RvY3Rlc3RzID0gc2V0dXB0b29scy5kaXN0OkRpc3RyaWJ1dGlvbi5fZmluYWxpemVfMnRvM19kb2N0ZXN0cwpmZWF0dXJlcyA9IHNldHVwdG9vbHMuZGlzdDpEaXN0cmlidXRpb24uX2ZpbmFsaXplX2ZlYXR1cmVfb3B0cwprZXl3b3JkcyA9IHNldHVwdG9vbHMuZGlzdDpEaXN0cmlidXRpb24uX2ZpbmFsaXplX3NldHVwX2tleXdvcmRzCnBhcmVudF9maW5hbGl6ZSA9IHNldHVwdG9vbHMuZGlzdDpfRGlzdHJpYnV0aW9uLmZpbmFsaXplX29wdGlvbnMKCltzZXR1cHRvb2xzLmluc3RhbGxhdGlvbl0KZWdnc2VjdXRhYmxlID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDpib290c3RyYXAKClBLAwQUAAAAAAAAACEAMFwBkSYAAAAmAAAATgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dGVhc3lfaW5zdGFsbApwa2dfcmVzb3VyY2VzCnNldHVwdG9vbHMKUEsDBBQAAAAAAAAAIQCTBtcyAQAAAAEAAABJAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby96aXAtc2FmZQpQSwMEFAAAAAAAAAAhANHA3+pzHAAAcxwAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fX2luaXRfXy5weSIiIkV4dGVuc2lvbnMgdG8gdGhlICdkaXN0dXRpbHMnIGZvciBsYXJnZSBvciBjb21wbGV4IGRpc3RyaWJ1dGlvbnMiIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKaW1wb3J0IHJlCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKCmZyb20gLl9kZXByZWNhdGlvbl93YXJuaW5nIGltcG9ydCBTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeCBpbXBvcnQgUFkzLCBzdHJpbmdfdHlwZXMKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlciwgbWFwCgppbXBvcnQgc2V0dXB0b29scy52ZXJzaW9uCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgpmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBGZWF0dXJlCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gLiBpbXBvcnQgbW9ua2V5CgpfX21ldGFjbGFzc19fID0gdHlwZQoKCl9fYWxsX18gPSBbCiAgICAnc2V0dXAnLCAnRGlzdHJpYnV0aW9uJywgJ0ZlYXR1cmUnLCAnQ29tbWFuZCcsICdFeHRlbnNpb24nLCAnUmVxdWlyZScsCiAgICAnU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZycsCiAgICAnZmluZF9wYWNrYWdlcycKXQoKaWYgUFkzOgogIF9fYWxsX18uYXBwZW5kKCdmaW5kX25hbWVzcGFjZV9wYWNrYWdlcycpCgpfX3ZlcnNpb25fXyA9IHNldHVwdG9vbHMudmVyc2lvbi5fX3ZlcnNpb25fXwoKYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiMgSWYgd2UgcnVuIDJ0bzMgb24gLnB5IGZpbGVzLCBzaG91bGQgd2UgYWxzbyBjb252ZXJ0IGRvY3N0cmluZ3M/CiMgRGVmYXVsdDogeWVzOyBhc3N1bWUgdGhhdCB3ZSBjYW4gZGV0ZWN0IGRvY3Rlc3RzIHJlbGlhYmx5CnJ1bl8ydG8zX29uX2RvY3Rlc3RzID0gVHJ1ZQojIFN0YW5kYXJkIHBhY2thZ2UgbmFtZXMgZm9yIGZpeGVyIHBhY2thZ2VzCmxpYjJ0bzNfZml4ZXJfcGFja2FnZXMgPSBbJ2xpYjJ0bzMuZml4ZXMnXQoKCmNsYXNzIFBhY2thZ2VGaW5kZXI6CiAgICAiIiIKICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeQogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZmluZChjbHMsIHdoZXJlPScuJywgZXhjbHVkZT0oKSwgaW5jbHVkZT0oJyonLCkpOgogICAgICAgICIiIlJldHVybiBhIGxpc3QgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gZGlyZWN0b3J5ICd3aGVyZScKCiAgICAgICAgJ3doZXJlJyBpcyB0aGUgcm9vdCBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBiZSBzZWFyY2hlZCBmb3IgcGFja2FnZXMuICBJdAogICAgICAgIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhICJjcm9zcy1wbGF0Zm9ybSIgKGkuZS4gVVJMLXN0eWxlKSBwYXRoOyBpdCB3aWxsCiAgICAgICAgYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbCBwYXRoIHN5bnRheC4KCiAgICAgICAgJ2V4Y2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlOyAnKicgY2FuIGJlIHVzZWQKICAgICAgICBhcyBhIHdpbGRjYXJkIGluIHRoZSBuYW1lcywgc3VjaCB0aGF0ICdmb28uKicgd2lsbCBleGNsdWRlIGFsbAogICAgICAgIHN1YnBhY2thZ2VzIG9mICdmb28nIChidXQgbm90ICdmb28nIGl0c2VsZikuCgogICAgICAgICdpbmNsdWRlJyBpcyBhIHNlcXVlbmNlIG9mIHBhY2thZ2UgbmFtZXMgdG8gaW5jbHVkZS4gIElmIGl0J3MKICAgICAgICBzcGVjaWZpZWQsIG9ubHkgdGhlIG5hbWVkIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICBJZiBpdCdzIG5vdAogICAgICAgIHNwZWNpZmllZCwgYWxsIGZvdW5kIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICAnaW5jbHVkZScgY2FuIGNvbnRhaW4KICAgICAgICBzaGVsbCBzdHlsZSB3aWxkY2FyZCBwYXR0ZXJucyBqdXN0IGxpa2UgJ2V4Y2x1ZGUnLgogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gbGlzdChjbHMuX2ZpbmRfcGFja2FnZXNfaXRlcigKICAgICAgICAgICAgY29udmVydF9wYXRoKHdoZXJlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoJ2V6X3NldHVwJywgJypfX3B5Y2FjaGVfXycsICpleGNsdWRlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoKmluY2x1ZGUpKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZmluZF9wYWNrYWdlc19pdGVyKGNscywgd2hlcmUsIGV4Y2x1ZGUsIGluY2x1ZGUpOgogICAgICAgICIiIgogICAgICAgIEFsbCB0aGUgcGFja2FnZXMgZm91bmQgaW4gJ3doZXJlJyB0aGF0IHBhc3MgdGhlICdpbmNsdWRlJyBmaWx0ZXIsIGJ1dAogICAgICAgIG5vdCB0aGUgJ2V4Y2x1ZGUnIGZpbHRlci4KICAgICAgICAiIiIKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayh3aGVyZSwgZm9sbG93bGlua3M9VHJ1ZSk6CiAgICAgICAgICAgICMgQ29weSBkaXJzIHRvIGl0ZXJhdGUgb3ZlciBpdCwgdGhlbiBlbXB0eSBkaXJzLgogICAgICAgICAgICBhbGxfZGlycyA9IGRpcnNbOl0KICAgICAgICAgICAgZGlyc1s6XSA9IFtdCgogICAgICAgICAgICBmb3IgZGlyIGluIGFsbF9kaXJzOgogICAgICAgICAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGRpcikKICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKGZ1bGxfcGF0aCwgd2hlcmUpCiAgICAgICAgICAgICAgICBwYWNrYWdlID0gcmVsX3BhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy4nKQoKICAgICAgICAgICAgICAgICMgU2tpcCBkaXJlY3RvcnkgdHJlZXMgdGhhdCBhcmUgbm90IHZhbGlkIHBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiAoJy4nIGluIGRpciBvciBub3QgY2xzLl9sb29rc19saWtlX3BhY2thZ2UoZnVsbF9wYXRoKSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFNob3VsZCB0aGlzIHBhY2thZ2UgYmUgaW5jbHVkZWQ/CiAgICAgICAgICAgICAgICBpZiBpbmNsdWRlKHBhY2thZ2UpIGFuZCBub3QgZXhjbHVkZShwYWNrYWdlKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYWNrYWdlCgogICAgICAgICAgICAgICAgIyBLZWVwIHNlYXJjaGluZyBzdWJkaXJlY3RvcmllcywgYXMgdGhlcmUgbWF5IGJlIG1vcmUgcGFja2FnZXMKICAgICAgICAgICAgICAgICMgZG93biB0aGVyZSwgZXZlbiBpZiB0aGUgcGFyZW50IHdhcyBleGNsdWRlZC4KICAgICAgICAgICAgICAgIGRpcnMuYXBwZW5kKGRpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICAiIiJEb2VzIGEgZGlyZWN0b3J5IGxvb2sgbGlrZSBhIHBhY2thZ2U/IiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnX19pbml0X18ucHknKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX2ZpbHRlcigqcGF0dGVybnMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbGlzdCBvZiBwYXR0ZXJucywgcmV0dXJuIGEgY2FsbGFibGUgdGhhdCB3aWxsIGJlIHRydWUgb25seSBpZgogICAgICAgIHRoZSBpbnB1dCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxhbWJkYSBuYW1lOiBhbnkoZm5tYXRjaGNhc2UobmFtZSwgcGF0PXBhdCkgZm9yIHBhdCBpbiBwYXR0ZXJucykKCgpjbGFzcyBQRVA0MjBQYWNrYWdlRmluZGVyKFBhY2thZ2VGaW5kZXIpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb29rc19saWtlX3BhY2thZ2UocGF0aCk6CiAgICAgICAgcmV0dXJuIFRydWUKCgpmaW5kX3BhY2thZ2VzID0gUGFja2FnZUZpbmRlci5maW5kCgppZiBQWTM6CiAgZmluZF9uYW1lc3BhY2VfcGFja2FnZXMgPSBQRVA0MjBQYWNrYWdlRmluZGVyLmZpbmQKCgpkZWYgX2luc3RhbGxfc2V0dXBfcmVxdWlyZXMoYXR0cnMpOgogICAgIyBOb3RlOiBkbyBub3QgdXNlIGBzZXR1cHRvb2xzLkRpc3RyaWJ1dGlvbmAgZGlyZWN0bHksIGFzCiAgICAjIG91ciBQRVAgNTE3IGJhY2tlbmQgcGF0Y2ggYGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbmAuCiAgICBkaXN0ID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uKGRpY3QoCiAgICAgICAgKGssIHYpIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCkKICAgICAgICBpZiBrIGluICgnZGVwZW5kZW5jeV9saW5rcycsICdzZXR1cF9yZXF1aXJlcycpCiAgICApKQogICAgIyBIb25vciBzZXR1cC5jZmcncyBvcHRpb25zLgogICAgZGlzdC5wYXJzZV9jb25maWdfZmlsZXMoaWdub3JlX29wdGlvbl9lcnJvcnM9VHJ1ZSkKICAgIGlmIGRpc3Quc2V0dXBfcmVxdWlyZXM6CiAgICAgICAgZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3Quc2V0dXBfcmVxdWlyZXMpCgoKZGVmIHNldHVwKCoqYXR0cnMpOgogICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbnkgcmVxdWlyZW1lbnRzIG5lZWRlZCB0byBpbnRlcnByZXQgJ2F0dHJzJy4KICAgIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKQogICAgcmV0dXJuIGRpc3R1dGlscy5jb3JlLnNldHVwKCoqYXR0cnMpCgpzZXR1cC5fX2RvY19fID0gZGlzdHV0aWxzLmNvcmUuc2V0dXAuX19kb2NfXwoKCl9Db21tYW5kID0gbW9ua2V5LmdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuQ29tbWFuZCkKCgpjbGFzcyBDb21tYW5kKF9Db21tYW5kKToKICAgIF9fZG9jX18gPSBfQ29tbWFuZC5fX2RvY19fCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0LCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZm9yIGRpc3QsIHVwZGF0aW5nCiAgICAgICAgdmFycyhzZWxmKSB3aXRoIGFueSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgX0NvbW1hbmQuX19pbml0X18oc2VsZiwgZGlzdCkKICAgICAgICB2YXJzKHNlbGYpLnVwZGF0ZShrdykKCiAgICBkZWYgX2Vuc3VyZV9zdHJpbmdsaWtlKHNlbGYsIG9wdGlvbiwgd2hhdCwgZGVmYXVsdD1Ob25lKToKICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIG9wdGlvbikKICAgICAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHRpb24sIGRlZmF1bHQpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWwsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCInJXMnIG11c3QgYmUgYSAlcyAoZ290IGAlc2ApIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChvcHRpb24sIHdoYXQsIHZhbCkpCiAgICAgICAgcmV0dXJuIHZhbAoKICAgIGRlZiBlbnN1cmVfc3RyaW5nX2xpc3Qoc2VsZiwgb3B0aW9uKToKICAgICAgICByIiIiRW5zdXJlIHRoYXQgJ29wdGlvbicgaXMgYSBsaXN0IG9mIHN0cmluZ3MuICBJZiAnb3B0aW9uJyBpcwogICAgICAgIGN1cnJlbnRseSBhIHN0cmluZywgd2Ugc3BsaXQgaXQgZWl0aGVyIG9uIC8sXHMqLyBvciAvXHMrLywgc28KICAgICAgICAiZm9vIGJhciBiYXoiLCAiZm9vLGJhcixiYXoiLCBhbmQgImZvbywgICBiYXIgYmF6IiBhbGwgYmVjb21lCiAgICAgICAgWyJmb28iLCAiYmFyIiwgImJheiJdLgogICAgICAgICIiIgogICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0aW9uKQogICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdGlvbiwgcmUuc3BsaXQocicsXHMqfFxzKycsIHZhbCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpOgogICAgICAgICAgICAgICAgb2sgPSBhbGwoaXNpbnN0YW5jZSh2LCBzdHJpbmdfdHlwZXMpIGZvciB2IGluIHZhbCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9rID0gRmFsc2UKICAgICAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIgogICAgICAgICAgICAgICAgICAgICAgJSAob3B0aW9uLCB2YWwpKQoKICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCwgKiprdyk6CiAgICAgICAgY21kID0gX0NvbW1hbmQucmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQogICAgICAgIHZhcnMoY21kKS51cGRhdGUoa3cpCiAgICAgICAgcmV0dXJuIGNtZAoKCmRlZiBfZmluZF9hbGxfc2ltcGxlKHBhdGgpOgogICAgIiIiCiAgICBGaW5kIGFsbCBmaWxlcyB1bmRlciAncGF0aCcKICAgICIiIgogICAgcmVzdWx0cyA9ICgKICAgICAgICBvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZSkKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoLCBmb2xsb3dsaW5rcz1UcnVlKQogICAgICAgIGZvciBmaWxlIGluIGZpbGVzCiAgICApCiAgICByZXR1cm4gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCByZXN1bHRzKQoKCmRlZiBmaW5kYWxsKGRpcj1vcy5jdXJkaXIpOgogICAgIiIiCiAgICBGaW5kIGFsbCBmaWxlcyB1bmRlciAnZGlyJyBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIGZ1bGwgZmlsZW5hbWVzLgogICAgVW5sZXNzIGRpciBpcyAnLicsIHJldHVybiBmdWxsIGZpbGVuYW1lcyB3aXRoIGRpciBwcmVwZW5kZWQuCiAgICAiIiIKICAgIGZpbGVzID0gX2ZpbmRfYWxsX3NpbXBsZShkaXIpCiAgICBpZiBkaXIgPT0gb3MuY3VyZGlyOgogICAgICAgIG1ha2VfcmVsID0gZnVuY3Rvb2xzLnBhcnRpYWwob3MucGF0aC5yZWxwYXRoLCBzdGFydD1kaXIpCiAgICAgICAgZmlsZXMgPSBtYXAobWFrZV9yZWwsIGZpbGVzKQogICAgcmV0dXJuIGxpc3QoZmlsZXMpCgoKIyBBcHBseSBtb25rZXkgcGF0Y2hlcwptb25rZXkucGF0Y2hfYWxsKCkKUEsDBBQAAAAAAAAAIQAOrBJK2gAAANoAAABHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX2RlcHJlY2F0aW9uX3dhcm5pbmcucHljbGFzcyBTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nKFdhcm5pbmcpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciB3YXJuaW5nIGRlcHJlY2F0aW9ucyBpbiBgYHNldHVwdG9vbHNgYAoKICAgIFRoaXMgY2xhc3MgaXMgbm90IGRlcml2ZWQgZnJvbSBgYERlcHJlY2F0aW9uV2FybmluZ2BgLCBhbmQgYXMgc3VjaCBpcwogICAgdmlzaWJsZSBieSBkZWZhdWx0LgogICAgIiIiClBLAwQUAAAAAAAAACEAWxREjq8IAACvCAAANwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19pbXAucHkiIiIKUmUtaW1wbGVtZW50YXRpb24gb2YgZmluZF9tb2R1bGUgYW5kIGdldF9mcm96ZW5fb2JqZWN0CmZyb20gdGhlIGRlcHJlY2F0ZWQgaW1wIG1vZHVsZS4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IGltcG9ydGxpYi51dGlsCmltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5Cgpmcm9tIC5weTM0Y29tcGF0IGltcG9ydCBtb2R1bGVfZnJvbV9zcGVjCgoKUFlfU09VUkNFID0gMQpQWV9DT01QSUxFRCA9IDIKQ19FWFRFTlNJT04gPSAzCkNfQlVJTFRJTiA9IDYKUFlfRlJPWkVOID0gNwoKCmRlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgogICAgIiIiSnVzdCBsaWtlICdpbXAuZmluZF9tb2R1bGUoKScsIGJ1dCB3aXRoIHBhY2thZ2Ugc3VwcG9ydCIiIgogICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhtb2R1bGUsIHBhdGhzKQogICAgaWYgc3BlYyBpcyBOb25lOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVzIiAlIG1vZHVsZSkKICAgIGlmIG5vdCBzcGVjLmhhc19sb2NhdGlvbiBhbmQgaGFzYXR0cihzcGVjLCAnc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMnKToKICAgICAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2xvYWRlcignX19pbml0X18ucHknLCBzcGVjLmxvYWRlcikKCiAgICBraW5kID0gLTEKICAgIGZpbGUgPSBOb25lCiAgICBzdGF0aWMgPSBpc2luc3RhbmNlKHNwZWMubG9hZGVyLCB0eXBlKQogICAgaWYgc3BlYy5vcmlnaW4gPT0gJ2Zyb3plbicgb3Igc3RhdGljIGFuZCBpc3N1YmNsYXNzKAogICAgICAgICAgICBzcGVjLmxvYWRlciwgaW1wb3J0bGliLm1hY2hpbmVyeS5Gcm96ZW5JbXBvcnRlcik6CiAgICAgICAga2luZCA9IFBZX0ZST1pFTgogICAgICAgIHBhdGggPSBOb25lICAjIGltcCBjb21wYWJpbHR5CiAgICAgICAgc3VmZml4ID0gbW9kZSA9ICcnICAjIGltcCBjb21wYWJpbGl0eQogICAgZWxpZiBzcGVjLm9yaWdpbiA9PSAnYnVpbHQtaW4nIG9yIHN0YXRpYyBhbmQgaXNzdWJjbGFzcygKICAgICAgICAgICAgc3BlYy5sb2FkZXIsIGltcG9ydGxpYi5tYWNoaW5lcnkuQnVpbHRpbkltcG9ydGVyKToKICAgICAgICBraW5kID0gQ19CVUlMVElOCiAgICAgICAgcGF0aCA9IE5vbmUgICMgaW1wIGNvbXBhYmlsdHkKICAgICAgICBzdWZmaXggPSBtb2RlID0gJycgICMgaW1wIGNvbXBhYmlsaXR5CiAgICBlbGlmIHNwZWMuaGFzX2xvY2F0aW9uOgogICAgICAgIHBhdGggPSBzcGVjLm9yaWdpbgogICAgICAgIHN1ZmZpeCA9IG9zLnBhdGguc3BsaXRleHQocGF0aClbMV0KICAgICAgICBtb2RlID0gJ3InIGlmIHN1ZmZpeCBpbiBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFUyBlbHNlICdyYicKCiAgICAgICAgaWYgc3VmZml4IGluIGltcG9ydGxpYi5tYWNoaW5lcnkuU09VUkNFX1NVRkZJWEVTOgogICAgICAgICAgICBraW5kID0gUFlfU09VUkNFCiAgICAgICAgZWxpZiBzdWZmaXggaW4gaW1wb3J0bGliLm1hY2hpbmVyeS5CWVRFQ09ERV9TVUZGSVhFUzoKICAgICAgICAgICAga2luZCA9IFBZX0NPTVBJTEVECiAgICAgICAgZWxpZiBzdWZmaXggaW4gaW1wb3J0bGliLm1hY2hpbmVyeS5FWFRFTlNJT05fU1VGRklYRVM6CiAgICAgICAgICAgIGtpbmQgPSBDX0VYVEVOU0lPTgoKICAgICAgICBpZiBraW5kIGluIHtQWV9TT1VSQ0UsIFBZX0NPTVBJTEVEfToKICAgICAgICAgICAgZmlsZSA9IG9wZW4ocGF0aCwgbW9kZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IE5vbmUKICAgICAgICBzdWZmaXggPSBtb2RlID0gJycKCiAgICByZXR1cm4gZmlsZSwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkKCgpkZWYgZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlLCBwYXRocz1Ob25lKToKICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobW9kdWxlLCBwYXRocykKICAgIGlmIG5vdCBzcGVjOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVzIiAlIG1vZHVsZSkKICAgIHJldHVybiBzcGVjLmxvYWRlci5nZXRfY29kZShtb2R1bGUpCgoKZGVmIGdldF9tb2R1bGUobW9kdWxlLCBwYXRocywgaW5mbyk6CiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG1vZHVsZSwgcGF0aHMpCiAgICBpZiBub3Qgc3BlYzoKICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlcyIgJSBtb2R1bGUpCiAgICByZXR1cm4gbW9kdWxlX2Zyb21fc3BlYyhzcGVjKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBEwyoDGjsAABo7AABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9vcmRlcmVkX3NldC5weSIiIgpBbiBPcmRlcmVkU2V0IGlzIGEgY3VzdG9tIE11dGFibGVTZXQgdGhhdCByZW1lbWJlcnMgaXRzIG9yZGVyLCBzbyB0aGF0IGV2ZXJ5CmVudHJ5IGhhcyBhbiBpbmRleCB0aGF0IGNhbiBiZSBsb29rZWQgdXAuCgpCYXNlZCBvbiBhIHJlY2lwZSBvcmlnaW5hbGx5IHBvc3RlZCB0byBBY3RpdmVTdGF0ZSBSZWNpcGVzIGJ5IFJheW1vbmQgSGV0dGlnZXIsCmFuZCByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiIiIgppbXBvcnQgaXRlcnRvb2xzIGFzIGl0CmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgp0cnk6CiAgICAjIFB5dGhvbiAzCiAgICBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTXV0YWJsZVNldCwgU2VxdWVuY2UKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBQeXRob24gMi43CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlU2V0LCBTZXF1ZW5jZQoKU0xJQ0VfQUxMID0gc2xpY2UoTm9uZSkKX192ZXJzaW9uX18gPSAiMy4xIgoKCmRlZiBpc19pdGVyYWJsZShvYmopOgogICAgIiIiCiAgICBBcmUgd2UgYmVpbmcgYXNrZWQgdG8gbG9vayB1cCBhIGxpc3Qgb2YgdGhpbmdzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIHRoaW5nPwogICAgV2UgY2hlY2sgZm9yIHRoZSBgX19pdGVyX19gIGF0dHJpYnV0ZSBzbyB0aGF0IHRoaXMgY2FuIGNvdmVyIHR5cGVzIHRoYXQKICAgIGRvbid0IGhhdmUgdG8gYmUga25vd24gYnkgdGhpcyBtb2R1bGUsIHN1Y2ggYXMgTnVtUHkgYXJyYXlzLgoKICAgIFN0cmluZ3MsIGhvd2V2ZXIsIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGF0b21pYyB2YWx1ZXMgdG8gbG9vayB1cCwgbm90CiAgICBpdGVyYWJsZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHR1cGxlcywgc2luY2UgdGhleSBhcmUgaW1tdXRhYmxlIGFuZCB0aGVyZWZvcmUKICAgIHZhbGlkIGVudHJpZXMuCgogICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhlIFB5dGhvbiAyIGB1bmljb2RlYCB0eXBlLCBiZWNhdXNlIGl0IGRvZXNuJ3QKICAgIGhhdmUgYW4gYF9faXRlcl9fYCBhdHRyaWJ1dGUgYW55d2F5LgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIGhhc2F0dHIob2JqLCAiX19pdGVyX18iKQogICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShvYmosIHN0cikKICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uob2JqLCB0dXBsZSkKICAgICkKCgpjbGFzcyBPcmRlcmVkU2V0KE11dGFibGVTZXQsIFNlcXVlbmNlKToKICAgICIiIgogICAgQW4gT3JkZXJlZFNldCBpcyBhIGN1c3RvbSBNdXRhYmxlU2V0IHRoYXQgcmVtZW1iZXJzIGl0cyBvcmRlciwgc28gdGhhdAogICAgZXZlcnkgZW50cnkgaGFzIGFuIGluZGV4IHRoYXQgY2FuIGJlIGxvb2tlZCB1cC4KCiAgICBFeGFtcGxlOgogICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAxLCAyLCAzLCAyXSkKICAgICAgICBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZT1Ob25lKToKICAgICAgICBzZWxmLml0ZW1zID0gW10KICAgICAgICBzZWxmLm1hcCA9IHt9CiAgICAgICAgaWYgaXRlcmFibGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYgfD0gaXRlcmFibGUKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBvcmRlcmVkIHNldAoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gbGVuKE9yZGVyZWRTZXQoW10pKQogICAgICAgICAgICAwCiAgICAgICAgICAgID4+PiBsZW4oT3JkZXJlZFNldChbMSwgMl0pKQogICAgICAgICAgICAyCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXguCgogICAgICAgIElmIGBpbmRleGAgaXMgYSBzbGljZSwgeW91IHdpbGwgZ2V0IGJhY2sgdGhhdCBzbGljZSBvZiBpdGVtcywgYXMgYQogICAgICAgIG5ldyBPcmRlcmVkU2V0LgoKICAgICAgICBJZiBgaW5kZXhgIGlzIGEgbGlzdCBvciBhIHNpbWlsYXIgaXRlcmFibGUsIHlvdSdsbCBnZXQgYSBsaXN0IG9mCiAgICAgICAgaXRlbXMgY29ycmVzcG9uZGluZyB0byB0aG9zZSBpbmRpY2VzLiBUaGlzIGlzIHNpbWlsYXIgdG8gTnVtUHkncwogICAgICAgICJmYW5jeSBpbmRleGluZyIuIFRoZSByZXN1bHQgaXMgbm90IGFuIE9yZGVyZWRTZXQgYmVjYXVzZSB5b3UgbWF5IGFzawogICAgICAgIGZvciBkdXBsaWNhdGUgaW5kaWNlcywgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgc2hvdWxkIGJlCiAgICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhc2tlZCBmb3IuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0WzFdCiAgICAgICAgICAgIDIKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBzbGljZSkgYW5kIGluZGV4ID09IFNMSUNFX0FMTDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpCiAgICAgICAgZWxpZiBpc19pdGVyYWJsZShpbmRleCk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pdGVtc1tpXSBmb3IgaSBpbiBpbmRleF0KICAgICAgICBlbGlmIGhhc2F0dHIoaW5kZXgsICJfX2luZGV4X18iKSBvciBpc2luc3RhbmNlKGluZGV4LCBzbGljZSk6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuaXRlbXNbaW5kZXhdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBsaXN0KToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhyZXN1bHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb24ndCBrbm93IGhvdyB0byBpbmRleCBhbiBPcmRlcmVkU2V0IGJ5ICVyIiAlIGluZGV4KQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG9iamVjdC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG90aGVyID0gdGhpcy5jb3B5KCkKICAgICAgICAgICAgPj4+IHRoaXMgPT0gb3RoZXIKICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICA+Pj4gdGhpcyBpcyBvdGhlcgogICAgICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgaWYgbGVuKHNlbGYpID09IDA6CiAgICAgICAgICAgICMgVGhlIHN0YXRlIGNhbid0IGJlIGFuIGVtcHR5IGxpc3QuCiAgICAgICAgICAgICMgV2UgbmVlZCB0byByZXR1cm4gYSB0cnV0aHkgdmFsdWUsIG9yIGVsc2UgX19zZXRzdGF0ZV9fIHdvbid0IGJlIHJ1bi4KICAgICAgICAgICAgIwogICAgICAgICAgICAjIFRoaXMgY291bGQgaGF2ZSBiZWVuIGRvbmUgbW9yZSBncmFjZWZ1bGx5IGJ5IGFsd2F5cyBwdXR0aW5nIHRoZSBzdGF0ZQogICAgICAgICAgICAjIGluIGEgdHVwbGUsIGJ1dCB0aGlzIHdheSBpcyBiYWNrd2FyZHMtIGFuZCBmb3J3YXJkcy0gY29tcGF0aWJsZSB3aXRoCiAgICAgICAgICAgICMgcHJldmlvdXMgdmVyc2lvbnMgb2YgT3JkZXJlZFNldC4KICAgICAgICAgICAgcmV0dXJuIChOb25lLCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgIGlmIHN0YXRlID09IChOb25lLCk6CiAgICAgICAgICAgIHNlbGYuX19pbml0X18oW10pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX2luaXRfXyhzdGF0ZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBpZiB0aGUgaXRlbSBpcyBpbiB0aGlzIG9yZGVyZWQgc2V0CgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiAxIGluIE9yZGVyZWRTZXQoWzEsIDMsIDJdKQogICAgICAgICAgICBUcnVlCiAgICAgICAgICAgID4+PiA1IGluIE9yZGVyZWRTZXQoWzEsIDMsIDJdKQogICAgICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5tYXAKCiAgICBkZWYgYWRkKHNlbGYsIGtleSk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGBrZXlgIGFzIGFuIGl0ZW0gdG8gdGhpcyBPcmRlcmVkU2V0LCB0aGVuIHJldHVybiBpdHMgaW5kZXguCgogICAgICAgIElmIGBrZXlgIGlzIGFscmVhZHkgaW4gdGhlIE9yZGVyZWRTZXQsIHJldHVybiB0aGUgaW5kZXggaXQgYWxyZWFkeQogICAgICAgIGhhZC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KCkKICAgICAgICAgICAgPj4+IG9zZXQuYXBwZW5kKDMpCiAgICAgICAgICAgIDAKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzNdKQogICAgICAgICIiIgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5tYXA6CiAgICAgICAgICAgIHNlbGYubWFwW2tleV0gPSBsZW4oc2VsZi5pdGVtcykKICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoa2V5KQogICAgICAgIHJldHVybiBzZWxmLm1hcFtrZXldCgogICAgYXBwZW5kID0gYWRkCgogICAgZGVmIHVwZGF0ZShzZWxmLCBzZXF1ZW5jZSk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoZSBzZXQgd2l0aCB0aGUgZ2l2ZW4gaXRlcmFibGUgc2VxdWVuY2UsIHRoZW4gcmV0dXJuIHRoZSBpbmRleAogICAgICAgIG9mIHRoZSBsYXN0IGVsZW1lbnQgaW5zZXJ0ZWQuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBvc2V0ID0gT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LnVwZGF0ZShbMywgMSwgNSwgMSwgNF0pCiAgICAgICAgICAgIDQKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDIsIDMsIDUsIDRdKQogICAgICAgICIiIgogICAgICAgIGl0ZW1faW5kZXggPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZXF1ZW5jZToKICAgICAgICAgICAgICAgIGl0ZW1faW5kZXggPSBzZWxmLmFkZChpdGVtKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQXJndW1lbnQgbmVlZHMgdG8gYmUgYW4gaXRlcmFibGUsIGdvdCAlcyIgJSB0eXBlKHNlcXVlbmNlKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGl0ZW1faW5kZXgKCiAgICBkZWYgaW5kZXgoc2VsZiwga2V5KToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gZW50cnksIHJhaXNpbmcgYW4gSW5kZXhFcnJvciBpZiBpdCdzIG5vdAogICAgICAgIHByZXNlbnQuCgogICAgICAgIGBrZXlgIGNhbiBiZSBhbiBpdGVyYWJsZSBvZiBlbnRyaWVzIHRoYXQgaXMgbm90IGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlCiAgICAgICAgdGhpcyByZXR1cm5zIGEgbGlzdCBvZiBpbmRpY2VzLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC5pbmRleCgyKQogICAgICAgICAgICAxCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNfaXRlcmFibGUoa2V5KToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluZGV4KHN1YmtleSkgZm9yIHN1YmtleSBpbiBrZXldCiAgICAgICAgcmV0dXJuIHNlbGYubWFwW2tleV0KCiAgICAjIFByb3ZpZGUgc29tZSBjb21wYXRpYmlsaXR5IHdpdGggcGQuSW5kZXgKICAgIGdldF9sb2MgPSBpbmRleAogICAgZ2V0X2luZGV4ZXIgPSBpbmRleAoKICAgIGRlZiBwb3Aoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQuCgogICAgICAgIFJhaXNlcyBLZXlFcnJvciBpZiB0aGUgc2V0IGlzIGVtcHR5LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gb3NldC5wb3AoKQogICAgICAgICAgICAzCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXRlbXM6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJTZXQgaXMgZW1wdHkiKQoKICAgICAgICBlbGVtID0gc2VsZi5pdGVtc1stMV0KICAgICAgICBkZWwgc2VsZi5pdGVtc1stMV0KICAgICAgICBkZWwgc2VsZi5tYXBbZWxlbV0KICAgICAgICByZXR1cm4gZWxlbQoKICAgIGRlZiBkaXNjYXJkKHNlbGYsIGtleSk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGFuIGVsZW1lbnQuICBEbyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGFic2VudC4KCiAgICAgICAgVGhlIE11dGFibGVTZXQgbWl4aW4gdXNlcyB0aGlzIHRvIGltcGxlbWVudCB0aGUgLnJlbW92ZSgpIG1ldGhvZCwgd2hpY2gKICAgICAgICAqZG9lcyogcmFpc2UgYW4gZXJyb3Igd2hlbiBhc2tlZCB0byByZW1vdmUgYSBub24tZXhpc3RlbnQgaXRlbS4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IG9zZXQgPSBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAgICAgPj4+IG9zZXQuZGlzY2FyZCgyKQogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LmRpc2NhcmQoMikKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDNdKQogICAgICAgICIiIgogICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICBpID0gc2VsZi5tYXBba2V5XQogICAgICAgICAgICBkZWwgc2VsZi5pdGVtc1tpXQogICAgICAgICAgICBkZWwgc2VsZi5tYXBba2V5XQogICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLm1hcC5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdiA+PSBpOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWFwW2tdID0gdiAtIDEKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoaXMgT3JkZXJlZFNldC4KICAgICAgICAiIiIKICAgICAgICBkZWwgc2VsZi5pdGVtc1s6XQogICAgICAgIHNlbGYubWFwLmNsZWFyKCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IGxpc3QoaXRlcihPcmRlcmVkU2V0KFsxLCAyLCAzXSkpKQogICAgICAgICAgICBbMSwgMiwgM10KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXRlcihzZWxmLml0ZW1zKQoKICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IGxpc3QocmV2ZXJzZWQoT3JkZXJlZFNldChbMSwgMiwgM10pKSkKICAgICAgICAgICAgWzMsIDIsIDFdCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHJldmVyc2VkKHNlbGYuaXRlbXMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByZXR1cm4gIiVzKCkiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGxpc3Qoc2VsZikpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb250YWluZXJzIGhhdmUgdGhlIHNhbWUgaXRlbXMuIElmIGBvdGhlcmAgaXMgYQogICAgICAgIFNlcXVlbmNlLCB0aGVuIG9yZGVyIGlzIGNoZWNrZWQsIG90aGVyd2lzZSBpdCBpcyBpZ25vcmVkLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQoWzEsIDMsIDJdKQogICAgICAgICAgICA+Pj4gb3NldCA9PSBbMSwgMywgMl0KICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICA+Pj4gb3NldCA9PSBbMSwgMiwgM10KICAgICAgICAgICAgRmFsc2UKICAgICAgICAgICAgPj4+IG9zZXQgPT0gWzIsIDNdCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgICAgID4+PiBvc2V0ID09IE9yZGVyZWRTZXQoWzMsIDIsIDFdKQogICAgICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgICMgSW4gUHl0aG9uIDIgZGVxdWUgaXMgbm90IGEgU2VxdWVuY2UsIHNvIHRyZWF0IGl0IGFzIG9uZSBmb3IKICAgICAgICAjIGNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCBQeXRob24gMy4KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCAoU2VxdWVuY2UsIGRlcXVlKSk6CiAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGlzIE9yZGVyZWRTZXQgY29udGFpbnMgdGhlIHNhbWUgZWxlbWVudHMsIGluIHRoZQogICAgICAgICAgICAjIHNhbWUgb3JkZXIsIGFzIHRoZSBvdGhlciBvYmplY3QuCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpID09IGxpc3Qob3RoZXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvdGhlcl9hc19zZXQgPSBzZXQob3RoZXIpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIyBJZiBgb3RoZXJgIGNhbid0IGJlIGNvbnZlcnRlZCBpbnRvIGEgc2V0LCBpdCdzIG5vdCBlcXVhbC4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNldChzZWxmKSA9PSBvdGhlcl9hc19zZXQKCiAgICBkZWYgdW5pb24oc2VsZiwgKnNldHMpOgogICAgICAgICIiIgogICAgICAgIENvbWJpbmVzIGFsbCB1bmlxdWUgaXRlbXMuCiAgICAgICAgRWFjaCBpdGVtcyBvcmRlciBpcyBkZWZpbmVkIGJ5IGl0cyBmaXJzdCBhcHBlYXJhbmNlLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQudW5pb24oT3JkZXJlZFNldChbMywgMSwgNCwgMSwgNV0pLCBbMSwgM10sIFsyLCAwXSkKICAgICAgICAgICAgPj4+IHByaW50KG9zZXQpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzMsIDEsIDQsIDUsIDIsIDBdKQogICAgICAgICAgICA+Pj4gb3NldC51bmlvbihbOCwgOV0pCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzMsIDEsIDQsIDUsIDIsIDAsIDgsIDldKQogICAgICAgICAgICA+Pj4gb3NldCB8IHsxMH0KICAgICAgICAgICAgT3JkZXJlZFNldChbMywgMSwgNCwgNSwgMiwgMCwgMTBdKQogICAgICAgICIiIgogICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fIGlmIGlzaW5zdGFuY2Uoc2VsZiwgT3JkZXJlZFNldCkgZWxzZSBPcmRlcmVkU2V0CiAgICAgICAgY29udGFpbmVycyA9IG1hcChsaXN0LCBpdC5jaGFpbihbc2VsZl0sIHNldHMpKQogICAgICAgIGl0ZW1zID0gaXQuY2hhaW4uZnJvbV9pdGVyYWJsZShjb250YWluZXJzKQogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgICMgdGhlIHBhcmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGlzIGJhY2t3YXJkcwogICAgICAgIHJldHVybiBzZWxmLmludGVyc2VjdGlvbihvdGhlcikKCiAgICBkZWYgaW50ZXJzZWN0aW9uKHNlbGYsICpzZXRzKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGVsZW1lbnRzIGluIGNvbW1vbiBiZXR3ZWVuIGFsbCBzZXRzLiBPcmRlciBpcyBkZWZpbmVkIG9ubHkKICAgICAgICBieSB0aGUgZmlyc3Qgc2V0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gb3NldCA9IE9yZGVyZWRTZXQuaW50ZXJzZWN0aW9uKE9yZGVyZWRTZXQoWzAsIDEsIDIsIDNdKSwgWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gcHJpbnQob3NldCkKICAgICAgICAgICAgT3JkZXJlZFNldChbMSwgMiwgM10pCiAgICAgICAgICAgID4+PiBvc2V0LmludGVyc2VjdGlvbihbMiwgNCwgNV0sIFsxLCAyLCAzLCA0XSkKICAgICAgICAgICAgT3JkZXJlZFNldChbMl0pCiAgICAgICAgICAgID4+PiBvc2V0LmludGVyc2VjdGlvbigpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICIiIgogICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fIGlmIGlzaW5zdGFuY2Uoc2VsZiwgT3JkZXJlZFNldCkgZWxzZSBPcmRlcmVkU2V0CiAgICAgICAgaWYgc2V0czoKICAgICAgICAgICAgY29tbW9uID0gc2V0LmludGVyc2VjdGlvbigqbWFwKHNldCwgc2V0cykpCiAgICAgICAgICAgIGl0ZW1zID0gKGl0ZW0gZm9yIGl0ZW0gaW4gc2VsZiBpZiBpdGVtIGluIGNvbW1vbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpdGVtcyA9IHNlbGYKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBkaWZmZXJlbmNlKHNlbGYsICpzZXRzKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGlzIHNldCBidXQgbm90IHRoZSBvdGhlcnMuCgogICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuZGlmZmVyZW5jZShPcmRlcmVkU2V0KFsyXSkpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDNdKQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmRpZmZlcmVuY2UoT3JkZXJlZFNldChbMl0pLCBPcmRlcmVkU2V0KFszXSkpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzFdKQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pIC0gT3JkZXJlZFNldChbMl0pCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDNdKQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgM10pLmRpZmZlcmVuY2UoKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAyLCAzXSkKICAgICAgICAiIiIKICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXwogICAgICAgIGlmIHNldHM6CiAgICAgICAgICAgIG90aGVyID0gc2V0LnVuaW9uKCptYXAoc2V0LCBzZXRzKSkKICAgICAgICAgICAgaXRlbXMgPSAoaXRlbSBmb3IgaXRlbSBpbiBzZWxmIGlmIGl0ZW0gbm90IGluIG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGl0ZW1zID0gc2VsZgogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIGlzc3Vic2V0KHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IE9yZGVyZWRTZXQoWzEsIDIsIDNdKS5pc3N1YnNldCh7MSwgMn0pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuaXNzdWJzZXQoezEsIDIsIDMsIDR9KQogICAgICAgICAgICBUcnVlCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCAyLCAzXSkuaXNzdWJzZXQoezEsIDQsIDMsIDV9KQogICAgICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIGlmIGxlbihzZWxmKSA+IGxlbihvdGhlcik6ICAjIEZhc3QgY2hlY2sgZm9yIG9idmlvdXMgY2FzZXMKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGFsbChpdGVtIGluIG90aGVyIGZvciBpdGVtIGluIHNlbGYpCgogICAgZGVmIGlzc3VwZXJzZXQoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMl0pLmlzc3VwZXJzZXQoWzEsIDIsIDNdKQogICAgICAgICAgICBGYWxzZQogICAgICAgICAgICA+Pj4gT3JkZXJlZFNldChbMSwgMiwgMywgNF0pLmlzc3VwZXJzZXQoezEsIDIsIDN9KQogICAgICAgICAgICBUcnVlCiAgICAgICAgICAgID4+PiBPcmRlcmVkU2V0KFsxLCA0LCAzLCA1XSkuaXNzdXBlcnNldCh7MSwgMiwgM30pCiAgICAgICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKHNlbGYpIDwgbGVuKG90aGVyKTogICMgRmFzdCBjaGVjayBmb3Igb2J2aW91cyBjYXNlcwogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gYWxsKGl0ZW0gaW4gc2VsZiBmb3IgaXRlbSBpbiBvdGhlcikKCiAgICBkZWYgc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIE9yZGVyZWRTZXRzIGFzIGEgbmV3IHNldC4KICAgICAgICBUaGF0IGlzLCB0aGUgbmV3IHNldCB3aWxsIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkKICAgICAgICBvbmUgb2YgdGhlIHNldHMuCgogICAgICAgIFRoZWlyIG9yZGVyIHdpbGwgYmUgcHJlc2VydmVkLCB3aXRoIGVsZW1lbnRzIGZyb20gYHNlbGZgIHByZWNlZGluZwogICAgICAgIGVsZW1lbnRzIGZyb20gYG90aGVyYC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCA0LCAzLCA1LCA3XSkKICAgICAgICAgICAgPj4+IG90aGVyID0gT3JkZXJlZFNldChbOSwgNywgMSwgMywgMl0pCiAgICAgICAgICAgID4+PiB0aGlzLnN5bW1ldHJpY19kaWZmZXJlbmNlKG90aGVyKQogICAgICAgICAgICBPcmRlcmVkU2V0KFs0LCA1LCA5LCAyXSkKICAgICAgICAiIiIKICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXyBpZiBpc2luc3RhbmNlKHNlbGYsIE9yZGVyZWRTZXQpIGVsc2UgT3JkZXJlZFNldAogICAgICAgIGRpZmYxID0gY2xzKHNlbGYpLmRpZmZlcmVuY2Uob3RoZXIpCiAgICAgICAgZGlmZjIgPSBjbHMob3RoZXIpLmRpZmZlcmVuY2Uoc2VsZikKICAgICAgICByZXR1cm4gZGlmZjEudW5pb24oZGlmZjIpCgogICAgZGVmIF91cGRhdGVfaXRlbXMoc2VsZiwgaXRlbXMpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2UgdGhlICdpdGVtcycgbGlzdCBvZiB0aGlzIE9yZGVyZWRTZXQgd2l0aCBhIG5ldyBvbmUsIHVwZGF0aW5nCiAgICAgICAgc2VsZi5tYXAgYWNjb3JkaW5nbHkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5pdGVtcyA9IGl0ZW1zCiAgICAgICAgc2VsZi5tYXAgPSB7aXRlbTogaWR4IGZvciAoaWR4LCBpdGVtKSBpbiBlbnVtZXJhdGUoaXRlbXMpfQoKICAgIGRlZiBkaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCAqc2V0cyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIHRoaXMgT3JkZXJlZFNldCB0byByZW1vdmUgaXRlbXMgZnJvbSBvbmUgb3IgbW9yZSBvdGhlciBzZXRzLgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDIsIDNdKQogICAgICAgICAgICA+Pj4gdGhpcy5kaWZmZXJlbmNlX3VwZGF0ZShPcmRlcmVkU2V0KFsyLCA0XSkpCiAgICAgICAgICAgID4+PiBwcmludCh0aGlzKQogICAgICAgICAgICBPcmRlcmVkU2V0KFsxLCAzXSkKCiAgICAgICAgICAgID4+PiB0aGlzID0gT3JkZXJlZFNldChbMSwgMiwgMywgNCwgNV0pCiAgICAgICAgICAgID4+PiB0aGlzLmRpZmZlcmVuY2VfdXBkYXRlKE9yZGVyZWRTZXQoWzIsIDRdKSwgT3JkZXJlZFNldChbMSwgNCwgNl0pKQogICAgICAgICAgICA+Pj4gcHJpbnQodGhpcykKICAgICAgICAgICAgT3JkZXJlZFNldChbMywgNV0pCiAgICAgICAgIiIiCiAgICAgICAgaXRlbXNfdG9fcmVtb3ZlID0gc2V0KCkKICAgICAgICBmb3Igb3RoZXIgaW4gc2V0czoKICAgICAgICAgICAgaXRlbXNfdG9fcmVtb3ZlIHw9IHNldChvdGhlcikKICAgICAgICBzZWxmLl91cGRhdGVfaXRlbXMoW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5pdGVtcyBpZiBpdGVtIG5vdCBpbiBpdGVtc190b19yZW1vdmVdKQoKICAgIGRlZiBpbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhpcyBPcmRlcmVkU2V0IHRvIGtlZXAgb25seSBpdGVtcyBpbiBhbm90aGVyIHNldCwgcHJlc2VydmluZwogICAgICAgIHRoZWlyIG9yZGVyIGluIHRoaXMgc2V0LgoKICAgICAgICBFeGFtcGxlOgogICAgICAgICAgICA+Pj4gdGhpcyA9IE9yZGVyZWRTZXQoWzEsIDQsIDMsIDUsIDddKQogICAgICAgICAgICA+Pj4gb3RoZXIgPSBPcmRlcmVkU2V0KFs5LCA3LCAxLCAzLCAyXSkKICAgICAgICAgICAgPj4+IHRoaXMuaW50ZXJzZWN0aW9uX3VwZGF0ZShvdGhlcikKICAgICAgICAgICAgPj4+IHByaW50KHRoaXMpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzEsIDMsIDddKQogICAgICAgICIiIgogICAgICAgIG90aGVyID0gc2V0KG90aGVyKQogICAgICAgIHNlbGYuX3VwZGF0ZV9pdGVtcyhbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zIGlmIGl0ZW0gaW4gb3RoZXJdKQoKICAgIGRlZiBzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSB0aGlzIE9yZGVyZWRTZXQgdG8gcmVtb3ZlIGl0ZW1zIGZyb20gYW5vdGhlciBzZXQsIHRoZW4KICAgICAgICBhZGQgaXRlbXMgZnJvbSB0aGUgb3RoZXIgc2V0IHRoYXQgd2VyZSBub3QgcHJlc2VudCBpbiB0aGlzIHNldC4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgPj4+IHRoaXMgPSBPcmRlcmVkU2V0KFsxLCA0LCAzLCA1LCA3XSkKICAgICAgICAgICAgPj4+IG90aGVyID0gT3JkZXJlZFNldChbOSwgNywgMSwgMywgMl0pCiAgICAgICAgICAgID4+PiB0aGlzLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcikKICAgICAgICAgICAgPj4+IHByaW50KHRoaXMpCiAgICAgICAgICAgIE9yZGVyZWRTZXQoWzQsIDUsIDksIDJdKQogICAgICAgICIiIgogICAgICAgIGl0ZW1zX3RvX2FkZCA9IFtpdGVtIGZvciBpdGVtIGluIG90aGVyIGlmIGl0ZW0gbm90IGluIHNlbGZdCiAgICAgICAgaXRlbXNfdG9fcmVtb3ZlID0gc2V0KG90aGVyKQogICAgICAgIHNlbGYuX3VwZGF0ZV9pdGVtcygKICAgICAgICAgICAgW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5pdGVtcyBpZiBpdGVtIG5vdCBpbiBpdGVtc190b19yZW1vdmVdICsgaXRlbXNfdG9fYWRkCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAIrXf9DoAgAA6AIAAE4AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsCiAgICAiX19zdW1tYXJ5X18iLAogICAgIl9fdXJpX18iLAogICAgIl9fdmVyc2lvbl9fIiwKICAgICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLAogICAgIl9fbGljZW5zZV9fIiwKICAgICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxOS4yIgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTkgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAGUbEUQyAgAAMgIAAE0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmZyb20gLl9fYWJvdXRfXyBpbXBvcnQgKAogICAgX19hdXRob3JfXywKICAgIF9fY29weXJpZ2h0X18sCiAgICBfX2VtYWlsX18sCiAgICBfX2xpY2Vuc2VfXywKICAgIF9fc3VtbWFyeV9fLAogICAgX190aXRsZV9fLAogICAgX191cmlfXywKICAgIF9fdmVyc2lvbl9fLAopCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsCiAgICAiX19zdW1tYXJ5X18iLAogICAgIl9fdXJpX18iLAogICAgIl9fdmVyc2lvbl9fIiwKICAgICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLAogICAgIl9fbGljZW5zZV9fIiwKICAgICJfX2NvcHlyaWdodF9fIiwKXQpQSwMEFAAAAAAAAAAhAGaK2uNhAwAAYQMAAEwAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN5cwoKClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCiMgZmxha2U4OiBub3FhCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSAoc3RyLCkKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IChiYXNlc3RyaW5nLCkKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCgogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICJ0ZW1wb3JhcnlfY2xhc3MiLCAoKSwge30pClBLAwQUAAAAAAAAACEAa48clYgFAACIBQAAUAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJJbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW5maW5pdHkKCgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBJbmZpbml0eQoKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQAvOeKyTCAAAEwgAABMAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBQYXJzZUV4Y2VwdGlvbiwgUGFyc2VSZXN1bHRzLCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBHcm91cCwgRm9yd2FyZCwgUXVvdGVkU3RyaW5nCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllciwgSW52YWxpZFNwZWNpZmllcgoKCl9fYWxsX18gPSBbCiAgICAiSW52YWxpZE1hcmtlciIsCiAgICAiVW5kZWZpbmVkQ29tcGFyaXNvbiIsCiAgICAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLAogICAgImRlZmF1bHRfZW52aXJvbm1lbnQiLApdCgoKY2xhc3MgSW52YWxpZE1hcmtlcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBtYXJrZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZENvbXBhcmlzb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSB2YWx1ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZShWYWx1ZUVycm9yKToKICAgICIiIgogICAgQSBuYW1lIHdhcyBhdHRlbXB0ZWQgdG8gYmUgdXNlZCB0aGF0IGRvZXMgbm90IGV4aXN0IGluc2lkZSBvZiB0aGUKICAgIGVudmlyb25tZW50LgogICAgIiIiCgoKY2xhc3MgTm9kZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKCmNsYXNzIFZhbHVlKE5vZGUpOgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gJyJ7MH0iJy5mb3JtYXQoc2VsZikKCgpjbGFzcyBPcChOb2RlKToKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpCiAgICB8IEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpCiAgICB8IEwoImltcGxlbWVudGF0aW9uX25hbWUiKQogICAgfCBMKCJweXRob25fZnVsbF92ZXJzaW9uIikKICAgIHwgTCgicGxhdGZvcm1fcmVsZWFzZSIpCiAgICB8IEwoInBsYXRmb3JtX3ZlcnNpb24iKQogICAgfCBMKCJwbGF0Zm9ybV9tYWNoaW5lIikKICAgIHwgTCgicGxhdGZvcm1fc3lzdGVtIikKICAgIHwgTCgicHl0aG9uX3ZlcnNpb24iKQogICAgfCBMKCJzeXNfcGxhdGZvcm0iKQogICAgfCBMKCJvc19uYW1lIikKICAgIHwgTCgib3MubmFtZSIpCiAgICB8IEwoInN5cy5wbGF0Zm9ybSIpICAjIFBFUC0zNDUKICAgIHwgTCgicGxhdGZvcm0udmVyc2lvbiIpICAjIFBFUC0zNDUKICAgIHwgTCgicGxhdGZvcm0ubWFjaGluZSIpICAjIFBFUC0zNDUKICAgIHwgTCgicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIikgICMgUEVQLTM0NQogICAgfCBMKCJweXRob25faW1wbGVtZW50YXRpb24iKSAgIyBQRVAtMzQ1CiAgICB8IEwoImV4dHJhIikgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CikKQUxJQVNFUyA9IHsKICAgICJvcy5uYW1lIjogIm9zX25hbWUiLAogICAgInN5cy5wbGF0Zm9ybSI6ICJzeXNfcGxhdGZvcm0iLAogICAgInBsYXRmb3JtLnZlcnNpb24iOiAicGxhdGZvcm1fdmVyc2lvbiIsCiAgICAicGxhdGZvcm0ubWFjaGluZSI6ICJwbGF0Zm9ybV9tYWNoaW5lIiwKICAgICJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iOiAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIiwKICAgICJweXRob25faW1wbGVtZW50YXRpb24iOiAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIiwKfQpWQVJJQUJMRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFyaWFibGUoQUxJQVNFUy5nZXQodFswXSwgdFswXSkpKQoKVkVSU0lPTl9DTVAgPSAoCiAgICBMKCI9PT0iKSB8IEwoIj09IikgfCBMKCI+PSIpIHwgTCgiPD0iKSB8IEwoIiE9IikgfCBMKCJ+PSIpIHwgTCgiPiIpIHwgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmICgKICAgICAgICBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkKICAgICAgICBhbmQgbGVuKG1hcmtlcikgPT0gMQogICAgICAgIGFuZCBpc2luc3RhbmNlKG1hcmtlclswXSwgKGxpc3QsIHR1cGxlKSkKICAgICk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gInswLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Ii5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAiZmluYWwiOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAiaW1wbGVtZW50YXRpb24iKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICIwIgogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAiIgoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogIi4iLmpvaW4ocGxhdGZvcm0ucHl0aG9uX3ZlcnNpb25fdHVwbGUoKVs6Ml0pLAogICAgICAgICJzeXNfcGxhdGZvcm0iOiBzeXMucGxhdGZvcm0sCiAgICB9CgoKY2xhc3MgTWFya2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYyA6IGUubG9jICsgOF0KICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEAOPpXXIYSAACGEgAAUQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gc2V0dXB0b29scy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyIlteIF0rIikoInVybCIpClVSTCA9IEFUICsgVVJJCgpFWFRSQVNfTElTVCA9IEVYVFJBICsgWmVyb09yTW9yZShDT01NQSArIEVYVFJBKQpFWFRSQVMgPSAoTEJSQUNLRVQgKyBPcHRpb25hbChFWFRSQVNfTElTVCkgKyBSQlJBQ0tFVCkoImV4dHJhcyIpCgpWRVJTSU9OX1BFUDQ0MCA9IFJlZ2V4KFNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKVkVSU0lPTl9MRUdBQ1kgPSBSZWdleChMZWdhY3lTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgpWRVJTSU9OX09ORSA9IFZFUlNJT05fUEVQNDQwIF4gVkVSU0lPTl9MRUdBQ1kKVkVSU0lPTl9NQU5ZID0gQ29tYmluZSgKICAgIFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwgam9pblN0cmluZz0iLCIsIGFkamFjZW50PUZhbHNlCikoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAiIikKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0IDogdC5fb3JpZ2luYWxfZW5kXSkKKQpNQVJLRVJfU0VQQVJBVE9SID0gU0VNSUNPTE9OCk1BUktFUiA9IE1BUktFUl9TRVBBUkFUT1IgKyBNQVJLRVJfRVhQUgoKVkVSU0lPTl9BTkRfTUFSS0VSID0gVkVSU0lPTl9TUEVDICsgT3B0aW9uYWwoTUFSS0VSKQpVUkxfQU5EX01BUktFUiA9IFVSTCArIE9wdGlvbmFsKE1BUktFUikKCk5BTUVEX1JFUVVJUkVNRU5UID0gTkFNRSArIE9wdGlvbmFsKEVYVFJBUykgKyAoVVJMX0FORF9NQVJLRVIgfCBWRVJTSU9OX0FORF9NQVJLRVIpCgpSRVFVSVJFTUVOVCA9IHN0cmluZ1N0YXJ0ICsgTkFNRURfUkVRVUlSRU1FTlQgKyBzdHJpbmdFbmQKIyBzZXR1cHRvb2xzLmV4dGVybi5weXBhcnNpbmcgaXNuJ3QgdGhyZWFkIHNhZmUgZHVyaW5nIGluaXRpYWxpemF0aW9uLCBzbyB3ZSBkbyBpdCBlYWdlcmx5LCBzZWUKIyBpc3N1ZSAjMTA0ClJFUVVJUkVNRU5ULnBhcnNlU3RyaW5nKCJ4W10iKQoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAnUGFyc2UgZXJyb3IgYXQgInswIXJ9IjogezF9Jy5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jIDogZS5sb2MgKyA4XSwgZS5tc2cKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBwYXJzZWRfdXJsLnNjaGVtZSA9PSAiZmlsZSI6CiAgICAgICAgICAgICAgICBpZiB1cmxwYXJzZS51cmx1bnBhcnNlKHBhcnNlZF91cmwpICE9IHJlcS51cmw6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIGVsaWYgbm90IChwYXJzZWRfdXJsLnNjaGVtZSBhbmQgcGFyc2VkX3VybC5uZXRsb2MpIG9yICgKICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoIkludmFsaWQgVVJMOiB7MH0iLmZvcm1hdChyZXEudXJsKSkKICAgICAgICAgICAgc2VsZi51cmwgPSByZXEudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmwgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYXMgPSBzZXQocmVxLmV4dHJhcy5hc0xpc3QoKSBpZiByZXEuZXh0cmFzIGVsc2UgW10pCiAgICAgICAgc2VsZi5zcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQocmVxLnNwZWNpZmllcikKICAgICAgICBzZWxmLm1hcmtlciA9IHJlcS5tYXJrZXIgaWYgcmVxLm1hcmtlciBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtzZWxmLm5hbWVdCgogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIlt7MH1dIi5mb3JtYXQoIiwiLmpvaW4oc29ydGVkKHNlbGYuZXh0cmFzKSkpKQoKICAgICAgICBpZiBzZWxmLnNwZWNpZmllcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihzZWxmLnNwZWNpZmllcikpCgogICAgICAgIGlmIHNlbGYudXJsOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIkAgezB9Ii5mb3JtYXQoc2VsZi51cmwpKQogICAgICAgICAgICBpZiBzZWxmLm1hcmtlcjoKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiICIpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQDyiEbTgmwAAIJsAABPAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHN0ciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4gVGhpcwogICAgICAgIHNob3VsZCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgU3BlY2lmaWVyIGl0c2VsZi4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBub3QgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYW4gaXRlcmFibGUgb2YgaXRlbXMgYW5kIGZpbHRlcnMgdGhlbSBzbyB0aGF0IG9ubHkgaXRlbXMgd2hpY2gKICAgICAgICBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllciBhcmUgYWxsb3dlZCBpbiBpdC4KICAgICAgICAiIiIKCgpjbGFzcyBfSW5kaXZpZHVhbFNwZWNpZmllcihCYXNlU3BlY2lmaWVyKToKCiAgICBfb3BlcmF0b3JzID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlYz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2goc3BlYykKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRTcGVjaWZpZXIoIkludmFsaWQgc3BlY2lmaWVyOiAnezB9JyIuZm9ybWF0KHNwZWMpKQoKICAgICAgICBzZWxmLl9zcGVjID0gKG1hdGNoLmdyb3VwKCJvcGVyYXRvciIpLnN0cmlwKCksIG1hdGNoLmdyb3VwKCJ2ZXJzaW9uIikuc3RyaXAoKSkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdCgqc2VsZi5fc3BlYykKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlYykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjID09IG90aGVyLl9zcGVjCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyAhPSBvdGhlci5fc3BlYwoKICAgIGRlZiBfZ2V0X29wZXJhdG9yKHNlbGYsIG9wKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2NvbXBhcmVfezB9Ii5mb3JtYXQoc2VsZi5fb3BlcmF0b3JzW29wXSkpCgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2UodmVyc2lvbikKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wZXJhdG9yKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgcHJlcmVsZWFzZXMgYXJlIHRvIGJlIGFsbG93ZWQgb3Igbm90LgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIE5vcm1hbGl6ZSBpdGVtIHRvIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uLCB0aGlzIGFsbG93cyB1cyB0byBoYXZlCiAgICAgICAgIyBhIHNob3J0Y3V0IGZvciBgYCIyLjAiIGluIFNwZWNpZmllcigiPj0yIikKICAgICAgICBpdGVtID0gc2VsZi5fY29lcmNlX3ZlcnNpb24oaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGJlIHN1cHBvcnRpbmcgcHJlcmVsZWFzZXMgaW4gdGhpcyBzcGVjaWZpZXIKICAgICAgICAjIG9yIG5vdCwgaWYgd2UgZG8gbm90IHN1cHBvcnQgcHJlcmVsZWFzZXMgdGhhbiB3ZSBjYW4gc2hvcnQgY2lyY3VpdAogICAgICAgICMgbG9naWMgaWYgdGhpcyB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgaXRlbS5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEFjdHVhbGx5IGRvIHRoZSBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiB0aGlzIGl0ZW0gaXMgY29udGFpbmVkCiAgICAgICAgIyB3aXRoaW4gdGhpcyBTcGVjaWZpZXIgb3Igbm90LgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfb3BlcmF0b3Ioc2VsZi5vcGVyYXRvcikoaXRlbSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIHlpZWxkZWQgPSBGYWxzZQogICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAga3cgPSB7InByZXJlbGVhc2VzIjogcHJlcmVsZWFzZXMgaWYgcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgZWxzZSBUcnVlfQoKICAgICAgICAjIEF0dGVtcHQgdG8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBhbmQgaWYgYW55IG9mCiAgICAgICAgIyB0aGVtIG1hdGNoLCB5aWVsZCB0aGVtLgogICAgICAgIGZvciB2ZXJzaW9uIGluIGl0ZXJhYmxlOgogICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHZlcnNpb24pCgogICAgICAgICAgICBpZiBzZWxmLmNvbnRhaW5zKHBhcnNlZF92ZXJzaW9uLCAqKmt3KToKICAgICAgICAgICAgICAgICMgSWYgb3VyIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlLCBhbmQgd2Ugd2VyZSBub3Qgc2V0IHRvIGFsbG93CiAgICAgICAgICAgICAgICAjIHByZXJlbGVhc2VzLCB0aGVuIHdlJ2xsIHN0b3JlIGl0IGZvciBsYXRlciBpbmNhc2Ugbm90aGluZwogICAgICAgICAgICAgICAgIyBlbHNlIG1hdGNoZXMgdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QgKAogICAgICAgICAgICAgICAgICAgIHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIEVpdGhlciB0aGlzIGlzIG5vdCBhIHByZXJlbGVhc2UsIG9yIHdlIHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICMgYWNjZXB0aW5nIHByZXJlbGVhc2VzIGZyb20gdGhlIGJlZ2lubmluZy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgaXRlcmF0ZWQgb3ZlciBldmVyeXRoaW5nLCBkZXRlcm1pbmUgaWYgd2UndmUgeWllbGRlZAogICAgICAgICMgYW55IHZhbHVlcywgYW5kIGlmIHdlIGhhdmUgbm90IGFuZCB3ZSBoYXZlIGFueSBwcmVyZWxlYXNlcyBzdG9yZWQgdXAKICAgICAgICAjIHRoZW4gd2Ugd2lsbCBnbyBhaGVhZCBhbmQgeWllbGQgdGhlIHByZXJlbGVhc2VzLgogICAgICAgIGlmIG5vdCB5aWVsZGVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgoKY2xhc3MgTGVnYWN5U3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4oPT18IT18PD18Pj18PHw+KSkKICAgICAgICBccyoKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgW14sO1xzKV0qICMgU2luY2UgdGhpcyBpcyBhICJsZWdhY3kiIHNwZWNpZmllciwgYW5kIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBjYW4gYmUganVzdCBhYm91dCBhbnl0aGluZywgd2UgbWF0Y2ggZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgIyBleGNlcHQgZm9yIHdoaXRlc3BhY2UsIGEgc2VtaS1jb2xvbiBmb3IgbWFya2VyIHN1cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAjIGEgY2xvc2luZyBwYXJlbiBzaW5jZSB2ZXJzaW9ucyBjYW4gYmUgZW5jbG9zZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICMgdGhlbSwgYW5kIGEgY29tbWEgc2luY2UgaXQncyBhIHZlcnNpb24gc2VwYXJhdG9yLgogICAgICAgICkKICAgICAgICAiIiIKCiAgICBfcmVnZXggPSByZS5jb21waWxlKHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgIH0KCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gTGVnYWN5VmVyc2lvbihzdHIodmVyc2lvbikpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSAhPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID4gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCgpkZWYgX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlKGZuKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZm4pCiAgICBkZWYgd3JhcHBlZChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvc3BlY3RpdmUsIFZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gZm4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpCgogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPih+PXw9PXwhPXw8PXw+PXw8fD58PT09KSkKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBpZGVudGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIGFuIGVzY2FwZSBoYXRjaCB0aGF0IHdpbGwKICAgICAgICAgICAgICAgICMgZG8gYW4gZXhhY3Qgc3RyaW5nIG1hdGNoIG9mIHRoZSB2ZXJzaW9uIHlvdSB3aXNoIHRvIGluc3RhbGwuCiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBub3QgYmUgcGFyc2VkIGJ5IFBFUCA0NDAgYW5kIHdlIGNhbm5vdCBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICMgYW55IHNlbWFudGljIG1lYW5pbmcgZnJvbSBpdC4gVGhpcyBvcGVyYXRvciBpcyBkaXNjb3VyYWdlZAogICAgICAgICAgICAgICAgIyBidXQgaW5jbHVkZWQgZW50aXJlbHkgYXMgYW4gZXNjYXBlIGhhdGNoLgogICAgICAgICAgICAgICAgKD88PT09PSkgICMgT25seSBtYXRjaCBmb3IgdGhlIGlkZW50aXR5IG9wZXJhdG9yCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIFteXHNdKiAgICAjIFdlIGp1c3QgbWF0Y2ggZXZlcnl0aGluZywgZXhjZXB0IGZvciB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciBzdHJpY3QgaWRlbnRpdHkuCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGFsbG93IGZvciB3aWxkIGNhcmQgYW5kIGxvY2FsCiAgICAgICAgICAgICAgICAjIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBzbyB3ZSBoYXZlIHRvIGRlZmluZSB0aGVzZSB0d28KICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNlcGFyYXRlbHkgdG8gZW5hYmxlIHRoYXQuCiAgICAgICAgICAgICAgICAoPzw9PT18IT0pICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciBlcXVhbHMgYW5kIG5vdCBlcXVhbHMKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KCiAgICAgICAgICAgICAgICAjIFlvdSBjYW5ub3QgdXNlIGEgd2lsZCBjYXJkIGFuZCBhIGRldiBvciBsb2NhbCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAjIHRvZ2V0aGVyIHNvIGdyb3VwIHRoZW0gd2l0aCBhIHwgYW5kIG1ha2UgdGhlbSBvcHRpb25hbC4KICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86XCtbYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKik/ICMgbG9jYWwKICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgXC5cKiAgIyBXaWxkIGNhcmQgc3ludGF4IG9mIC4qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBjb21wYXRpYmxlIG9wZXJhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBkaWdpdHMgaW4gdGhlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgICAgICg/PD1+PSkgICAgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBjb21wYXRpYmxlIG9wZXJhdG9yCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSsgICAjIHJlbGVhc2UgIChXZSBoYXZlIGEgKyBpbnN0ZWFkIG9mIGEgKikKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgQWxsIG90aGVyIG9wZXJhdG9ycyBvbmx5IGFsbG93IGEgc3ViIHNldCBvZiB3aGF0IHRoZQogICAgICAgICAgICAgICAgIyAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBkby4gU3BlY2lmaWNhbGx5IHRoZXkgZG8gbm90IGFsbG93CiAgICAgICAgICAgICAgICAjIGxvY2FsIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBub3IgZG8gdGhleSBhbGxvdyB0aGUgcHJlZml4CiAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIHdpbGQgY2FyZHMuCiAgICAgICAgICAgICAgICAoPzwhPT18IT18fj0pICAgICAgICAgIyBXZSBoYXZlIHNwZWNpYWwgY2FzZXMgZm9yIHRoZXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbWF0Y2ggaGVyZS4KCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICAiIiIKCiAgICBfcmVnZXggPSByZS5jb21waWxlKHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAifj0iOiAiY29tcGF0aWJsZSIsCiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICAgICAgIj09PSI6ICJhcmJpdHJhcnkiLAogICAgfQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9jb21wYXRpYmxlKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbXBhdGlibGUgcmVsZWFzZXMgaGF2ZSBhbiBlcXVpdmFsZW50IGNvbWJpbmF0aW9uIG9mID49IGFuZCA9PS4gVGhhdAogICAgICAgICMgaXMgdGhhdCB+PTIuMiBpcyBlcXVpdmFsZW50IHRvID49Mi4yLD09Mi4qLiBUaGlzIGFsbG93cyB1cyB0bwogICAgICAgICMgaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlIG90aGVyIHNwZWNpZmllcnMgaW5zdGVhZCBvZgogICAgICAgICMgaW1wbGVtZW50aW5nIGl0IG91cnNlbHZlcy4gVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyBjb25zdHJ1Y3QKICAgICAgICAjIHRoZSBvdGhlciBzcGVjaWZpZXJzLgoKICAgICAgICAjIFdlIHdhbnQgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgdmVyc2lvbiwgYnV0IHdlIHdhbnQgdG8KICAgICAgICAjIGlnbm9yZSBwb3N0IGFuZCBkZXYgcmVsZWFzZXMgYW5kIHdlIHdhbnQgdG8gdHJlYXQgdGhlIHByZS1yZWxlYXNlIGFzCiAgICAgICAgIyBpdCdzIG93biBzZXBhcmF0ZSBzZWdtZW50LgogICAgICAgIHByZWZpeCA9ICIuIi5qb2luKAogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgaXRlcnRvb2xzLnRha2V3aGlsZSgKICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogKG5vdCB4LnN0YXJ0c3dpdGgoInBvc3QiKSBhbmQgbm90IHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcigiPj0iKShwcm9zcGVjdGl2ZSwgc3BlYykgYW5kIHNlbGYuX2dldF9vcGVyYXRvcigiPT0iKSgKICAgICAgICAgICAgcHJvc3BlY3RpdmUsIHByZWZpeAogICAgICAgICkKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgV2UgbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBwcmVmaXggbWF0Y2hpbmcKICAgICAgICBpZiBzcGVjLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIHByZWZpeCBtYXRjaGluZyB3ZSB3YW50IHRvIGlnbm9yZSBsb2NhbCBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQogICAgICAgICAgICAjIFNwbGl0IHRoZSBzcGVjIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0CiAgICAgICAgICAgICMgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgc3BlYyA9IF92ZXJzaW9uX3NwbGl0KHNwZWNbOi0yXSkgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyAuKgoKICAgICAgICAgICAgIyBTcGxpdCB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZQogICAgICAgICAgICAjIGlzIGFuIGltcGxpY2l0IGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBfdmVyc2lvbl9zcGxpdChzdHIocHJvc3BlY3RpdmUpKQoKICAgICAgICAgICAgIyBTaG9ydGVuIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc3BlYwogICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVyIGlzIGEgcHJlZml4IG9mIHRoZQogICAgICAgICAgICAjIHByb3NwZWN0aXZlIHZlcnNpb24gb3Igbm90LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IHByb3NwZWN0aXZlWzogbGVuKHNwZWMpXQoKICAgICAgICAgICAgIyBQYWQgb3V0IG91ciB0d28gc2lkZXMgd2l0aCB6ZXJvcyBzbyB0aGF0IHRoZXkgYm90aCBlcXVhbCB0aGUgc2FtZQogICAgICAgICAgICAjIGxlbmd0aC4KICAgICAgICAgICAgc3BlYywgcHJvc3BlY3RpdmUgPSBfcGFkX3ZlcnNpb24oc3BlYywgcHJvc3BlY3RpdmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHN0cmluZyBpbnRvIGEgVmVyc2lvbgogICAgICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAgICAgIyBJZiB0aGUgc3BlY2lmaWVyIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBzZWdtZW50LCB0aGVuIHdlIHdhbnQgdG8KICAgICAgICAgICAgIyBhY3QgYXMgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gYWxzbyBkb2VzIG5vdCBoYXZlIGEgbG9jYWwKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBpZiBub3Qgc3BlYy5sb2NhbDoKICAgICAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzcGVjCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9jb21wYXJlX2VxdWFsKHByb3NwZWN0aXZlLCBzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA8IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHByZS1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdCBwcmUtcmVsZWFzZQogICAgICAgICMgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyIChlLmcuIDwzLjEgc2hvdWxkCiAgICAgICAgIyBub3QgbWF0Y2ggMy4xLmRldjAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4wLmRldjApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3ByZXJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgbGVzcyB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUgc2FtZQogICAgICAgICMgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlID4gc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcG9zdC1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdAogICAgICAgICMgcG9zdC1yZWxlYXNlIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllcgogICAgICAgICMgKGUuZy4gPjMuMSBzaG91bGQgbm90IG1hdGNoIDMuMC5wb3N0MCwgYnV0IHNob3VsZCBtYXRjaCAzLjIucG9zdDApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3Bvc3RyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wb3N0cmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgRW5zdXJlIHRoYXQgd2UgZG8gbm90IGFsbG93IGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUgdmVyc2lvbiBtZW50aW9uZWQKICAgICAgICAjIGluIHRoZSBzcGVjaWZpZXIsIHdoaWNoIGlzIHRlY2huaWNhbGx5IGdyZWF0ZXIgdGhhbiwgdG8gbWF0Y2guCiAgICAgICAgaWYgcHJvc3BlY3RpdmUubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUKICAgICAgICAjIHNhbWUgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfY29tcGFyZV9hcmJpdHJhcnkoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBzdHIocHJvc3BlY3RpdmUpLmxvd2VyKCkgPT0gc3RyKHNwZWMpLmxvd2VyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHByZXJlbGVhc2VzIHNldCBmb3IgdGhpcywgdGhlbiB3ZSdsbCBqdXN0CiAgICAgICAgIyBibGluZGx5IHVzZSB0aGF0LgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBMb29rIGF0IGFsbCBvZiBvdXIgc3BlY2lmaWVycyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGluY2x1c2l2ZQogICAgICAgICMgb3BlcmF0b3JzLCBhbmQgaWYgdGhleSBhcmUgaWYgdGhleSBhcmUgaW5jbHVkaW5nIGFuIGV4cGxpY2l0CiAgICAgICAgIyBwcmVyZWxlYXNlLgogICAgICAgIG9wZXJhdG9yLCB2ZXJzaW9uID0gc2VsZi5fc3BlYwogICAgICAgIGlmIG9wZXJhdG9yIGluIFsiPT0iLCAiPj0iLCAiPD0iLCAifj0iLCAiPT09Il06CiAgICAgICAgICAgICMgVGhlID09IHNwZWNpZmllciBjYW4gaW5jbHVkZSBhIHRyYWlsaW5nIC4qLCBpZiBpdCBkb2VzIHdlCiAgICAgICAgICAgICMgd2FudCB0byByZW1vdmUgYmVmb3JlIHBhcnNpbmcuCiAgICAgICAgICAgIGlmIG9wZXJhdG9yID09ICI9PSIgYW5kIHZlcnNpb24uZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6LTJdCgogICAgICAgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uLCBhbmQgaWYgaXQgaXMgYSBwcmUtcmVsZWFzZSB0aGFuIHRoaXMKICAgICAgICAgICAgIyBzcGVjaWZpZXIgYWxsb3dzIHByZS1yZWxlYXNlcy4KICAgICAgICAgICAgaWYgcGFyc2UodmVyc2lvbikuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKCl9wcmVmaXhfcmVnZXggPSByZS5jb21waWxlKHIiXihbMC05XSspKCg/OmF8YnxjfHJjKVswLTldKykkIikKCgpkZWYgX3ZlcnNpb25fc3BsaXQodmVyc2lvbik6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gdmVyc2lvbi5zcGxpdCgiLiIpOgogICAgICAgIG1hdGNoID0gX3ByZWZpeF9yZWdleC5zZWFyY2goaXRlbSkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChtYXRjaC5ncm91cHMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9wYWRfdmVyc2lvbihsZWZ0LCByaWdodCk6CiAgICBsZWZ0X3NwbGl0LCByaWdodF9zcGxpdCA9IFtdLCBbXQoKICAgICMgR2V0IHRoZSByZWxlYXNlIHNlZ21lbnQgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCBsZWZ0KSkpCiAgICByaWdodF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgcmlnaHQpKSkKCiAgICAjIEdldCB0aGUgcmVzdCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxlZnRbbGVuKGxlZnRfc3BsaXRbMF0pIDpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSkgOl0pCgogICAgIyBJbnNlcnQgb3VyIHBhZGRpbmcKICAgIGxlZnRfc3BsaXQuaW5zZXJ0KDEsIFsiMCJdICogbWF4KDAsIGxlbihyaWdodF9zcGxpdFswXSkgLSBsZW4obGVmdF9zcGxpdFswXSkpKQogICAgcmlnaHRfc3BsaXQuaW5zZXJ0KDEsIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpKQoKICAgIHJldHVybiAobGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwgbGlzdChpdGVydG9vbHMuY2hhaW4oKnJpZ2h0X3NwbGl0KSkpCgoKY2xhc3MgU3BlY2lmaWVyU2V0KEJhc2VTcGVjaWZpZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwocy5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSB3YW50IHRvIHdyYXAgb3VyIGl0ZXJhYmxlIGluIHRoZQogICAgICAgICMgZmlsdGVyIG1ldGhvZCBmb3IgZWFjaCBvbmUsIHRoaXMgd2lsbCBhY3QgYXMgYSBsb2dpY2FsIEFORCBhbW9uZ3N0CiAgICAgICAgIyBlYWNoIHNwZWNpZmllci4KICAgICAgICBpZiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5fc3BlY3M6CiAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IHNwZWMuZmlsdGVyKGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1ib29sKHByZXJlbGVhc2VzKSkKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlCiAgICAgICAgIyBJZiB3ZSBkbyBub3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSByb3VnaCBmaWx0ZXIKICAgICAgICAjIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBhbnkgcHJlLXJlbGVhc2VzLCB1bmxlc3MgdGhlcmUgYXJlIG5vIGZpbmFsCiAgICAgICAgIyByZWxlYXNlcywgYW5kIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBMZWdhY3lWZXJzaW9uIGluIGdlbmVyYWwuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgd2Ugc29tZSBraW5kIG9mIFZlcnNpb24gY2xhc3MgZm9yIHRoaXMgaXRlbS4KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZShpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IGl0ZW0KCiAgICAgICAgICAgICAgICAjIEZpbHRlciBvdXQgYW55IGl0ZW0gd2hpY2ggaXMgcGFyc2VkIGFzIGEgTGVnYWN5VmVyc2lvbgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFN0b3JlIGFueSBpdGVtIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgZm9yIGxhdGVyIHVubGVzcyB3ZSd2ZQogICAgICAgICAgICAgICAgIyBhbHJlYWR5IGZvdW5kIGEgZmluYWwgdmVyc2lvbiBvciB3ZSBhcmUgYWNjZXB0aW5nIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKGl0ZW0pCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGZvdW5kIG5vIGl0ZW1zIGV4Y2VwdCBmb3IgcHJlLXJlbGVhc2VzLCB0aGVuIHdlJ2xsIGdvCiAgICAgICAgICAgICMgYWhlYWQgYW5kIHVzZSB0aGUgcHJlLXJlbGVhc2VzCiAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXMgYW5kIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRfcHJlcmVsZWFzZXMKCiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAPP2h/+FMgAAhTIAAEkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy90YWdzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZGlzdHV0aWxzLnV0aWwKCnRyeToKICAgIGZyb20gaW1wb3J0bGliLm1hY2hpbmVyeSBpbXBvcnQgRVhURU5TSU9OX1NVRkZJWEVTCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgaW1wb3J0IGltcAoKICAgIEVYVEVOU0lPTl9TVUZGSVhFUyA9IFt4WzBdIGZvciB4IGluIGltcC5nZXRfc3VmZml4ZXMoKV0KICAgIGRlbCBpbXAKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBzeXNjb25maWcKaW1wb3J0IHdhcm5pbmdzCgoKSU5URVJQUkVURVJfU0hPUlRfTkFNRVMgPSB7CiAgICAicHl0aG9uIjogInB5IiwgICMgR2VuZXJpYy4KICAgICJjcHl0aG9uIjogImNwIiwKICAgICJweXB5IjogInBwIiwKICAgICJpcm9ucHl0aG9uIjogImlwIiwKICAgICJqeXRob24iOiAiankiLAp9CgoKXzMyX0JJVF9JTlRFUlBSRVRFUiA9IHN5cy5tYXhzaXplIDw9IDIgKiogMzIKCgpjbGFzcyBUYWcob2JqZWN0KToKCiAgICBfX3Nsb3RzX18gPSBbIl9pbnRlcnByZXRlciIsICJfYWJpIiwgIl9wbGF0Zm9ybSJdCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGludGVycHJldGVyLCBhYmksIHBsYXRmb3JtKToKICAgICAgICBzZWxmLl9pbnRlcnByZXRlciA9IGludGVycHJldGVyLmxvd2VyKCkKICAgICAgICBzZWxmLl9hYmkgPSBhYmkubG93ZXIoKQogICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0ubG93ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGludGVycHJldGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pbnRlcnByZXRlcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFiaShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fYWJpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGxhdGZvcm0oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgKHNlbGYucGxhdGZvcm0gPT0gb3RoZXIucGxhdGZvcm0pCiAgICAgICAgICAgIGFuZCAoc2VsZi5hYmkgPT0gb3RoZXIuYWJpKQogICAgICAgICAgICBhbmQgKHNlbGYuaW50ZXJwcmV0ZXIgPT0gb3RoZXIuaW50ZXJwcmV0ZXIpCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5faW50ZXJwcmV0ZXIsIHNlbGYuX2FiaSwgc2VsZi5fcGxhdGZvcm0pKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAie30te30te30iLmZvcm1hdChzZWxmLl9pbnRlcnByZXRlciwgc2VsZi5fYWJpLCBzZWxmLl9wbGF0Zm9ybSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8e3NlbGZ9IEAge3NlbGZfaWR9PiIuZm9ybWF0KHNlbGY9c2VsZiwgc2VsZl9pZD1pZChzZWxmKSkKCgpkZWYgcGFyc2VfdGFnKHRhZyk6CiAgICB0YWdzID0gc2V0KCkKICAgIGludGVycHJldGVycywgYWJpcywgcGxhdGZvcm1zID0gdGFnLnNwbGl0KCItIikKICAgIGZvciBpbnRlcnByZXRlciBpbiBpbnRlcnByZXRlcnMuc3BsaXQoIi4iKToKICAgICAgICBmb3IgYWJpIGluIGFiaXMuc3BsaXQoIi4iKToKICAgICAgICAgICAgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXMuc3BsaXQoIi4iKToKICAgICAgICAgICAgICAgIHRhZ3MuYWRkKFRhZyhpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybV8pKQogICAgcmV0dXJuIGZyb3plbnNldCh0YWdzKQoKCmRlZiBfbm9ybWFsaXplX3N0cmluZyhzdHJpbmcpOgogICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCIuIiwgIl8iKS5yZXBsYWNlKCItIiwgIl8iKQoKCmRlZiBfY3B5dGhvbl9pbnRlcnByZXRlcihweV92ZXJzaW9uKToKICAgICMgVE9ETzogSXMgdXNpbmcgcHlfdmVyc2lvbl9ub2RvdCBmb3IgaW50ZXJwcmV0ZXIgdmVyc2lvbiBjcml0aWNhbD8KICAgIHJldHVybiAiY3B7bWFqb3J9e21pbm9yfSIuZm9ybWF0KG1ham9yPXB5X3ZlcnNpb25bMF0sIG1pbm9yPXB5X3ZlcnNpb25bMV0pCgoKZGVmIF9jcHl0aG9uX2FiaXMocHlfdmVyc2lvbik6CiAgICBhYmlzID0gW10KICAgIHZlcnNpb24gPSAie317fSIuZm9ybWF0KCpweV92ZXJzaW9uWzoyXSkKICAgIGRlYnVnID0gcHltYWxsb2MgPSB1Y3M0ID0gIiIKICAgIHdpdGhfZGVidWcgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlB5X0RFQlVHIikKICAgIGhhc19yZWZjb3VudCA9IGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpCiAgICAjIFdpbmRvd3MgZG9lc24ndCBzZXQgUHlfREVCVUcsIHNvIGNoZWNraW5nIGZvciBzdXBwb3J0IG9mIGRlYnVnLWNvbXBpbGVkCiAgICAjIGV4dGVuc2lvbiBtb2R1bGVzIGlzIHRoZSBiZXN0IG9wdGlvbi4KICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8zMzgzI2lzc3VlY29tbWVudC0xNzMyNjc2OTIKICAgIGhhc19leHQgPSAiX2QucHlkIiBpbiBFWFRFTlNJT05fU1VGRklYRVMKICAgIGlmIHdpdGhfZGVidWcgb3IgKHdpdGhfZGVidWcgaXMgTm9uZSBhbmQgKGhhc19yZWZjb3VudCBvciBoYXNfZXh0KSk6CiAgICAgICAgZGVidWcgPSAiZCIKICAgIGlmIHB5X3ZlcnNpb24gPCAoMywgOCk6CiAgICAgICAgd2l0aF9weW1hbGxvYyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiV0lUSF9QWU1BTExPQyIpCiAgICAgICAgaWYgd2l0aF9weW1hbGxvYyBvciB3aXRoX3B5bWFsbG9jIGlzIE5vbmU6CiAgICAgICAgICAgIHB5bWFsbG9jID0gIm0iCiAgICAgICAgaWYgcHlfdmVyc2lvbiA8ICgzLCAzKToKICAgICAgICAgICAgdW5pY29kZV9zaXplID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJQeV9VTklDT0RFX1NJWkUiKQogICAgICAgICAgICBpZiB1bmljb2RlX3NpemUgPT0gNCBvciAoCiAgICAgICAgICAgICAgICB1bmljb2RlX3NpemUgaXMgTm9uZSBhbmQgc3lzLm1heHVuaWNvZGUgPT0gMHgxMEZGRkYKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHVjczQgPSAidSIKICAgIGVsaWYgZGVidWc6CiAgICAgICAgIyBEZWJ1ZyBidWlsZHMgY2FuIGFsc28gbG9hZCAibm9ybWFsIiBleHRlbnNpb24gbW9kdWxlcy4KICAgICAgICAjIFdlIGNhbiBhbHNvIGFzc3VtZSBubyBVQ1MtNCBvciBweW1hbGxvYyByZXF1aXJlbWVudC4KICAgICAgICBhYmlzLmFwcGVuZCgiY3B7dmVyc2lvbn0iLmZvcm1hdCh2ZXJzaW9uPXZlcnNpb24pKQogICAgYWJpcy5pbnNlcnQoCiAgICAgICAgMCwKICAgICAgICAiY3B7dmVyc2lvbn17ZGVidWd9e3B5bWFsbG9jfXt1Y3M0fSIuZm9ybWF0KAogICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24sIGRlYnVnPWRlYnVnLCBweW1hbGxvYz1weW1hbGxvYywgdWNzND11Y3M0CiAgICAgICAgKSwKICAgICkKICAgIHJldHVybiBhYmlzCgoKZGVmIF9jcHl0aG9uX3RhZ3MocHlfdmVyc2lvbiwgaW50ZXJwcmV0ZXIsIGFiaXMsIHBsYXRmb3Jtcyk6CiAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgZm9yIHBsYXRmb3JtXyBpbiBwbGF0Zm9ybXM6CiAgICAgICAgICAgIHlpZWxkIFRhZyhpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybV8pCiAgICBmb3IgdGFnIGluIChUYWcoaW50ZXJwcmV0ZXIsICJhYmkzIiwgcGxhdGZvcm1fKSBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnCiAgICBmb3IgdGFnIGluIChUYWcoaW50ZXJwcmV0ZXIsICJub25lIiwgcGxhdGZvcm1fKSBmb3IgcGxhdGZvcm1fIGluIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnCiAgICAjIFBFUCAzODQgd2FzIGZpcnN0IGltcGxlbWVudGVkIGluIFB5dGhvbiAzLjIuCiAgICBmb3IgbWlub3JfdmVyc2lvbiBpbiByYW5nZShweV92ZXJzaW9uWzFdIC0gMSwgMSwgLTEpOgogICAgICAgIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zOgogICAgICAgICAgICBpbnRlcnByZXRlciA9ICJjcHttYWpvcn17bWlub3J9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYWpvcj1weV92ZXJzaW9uWzBdLCBtaW5vcj1taW5vcl92ZXJzaW9uCiAgICAgICAgICAgICkKICAgICAgICAgICAgeWllbGQgVGFnKGludGVycHJldGVyLCAiYWJpMyIsIHBsYXRmb3JtXykKCgpkZWYgX3B5cHlfaW50ZXJwcmV0ZXIoKToKICAgIHJldHVybiAicHB7cHlfbWFqb3J9e3B5cHlfbWFqb3J9e3B5cHlfbWlub3J9Ii5mb3JtYXQoCiAgICAgICAgcHlfbWFqb3I9c3lzLnZlcnNpb25faW5mb1swXSwKICAgICAgICBweXB5X21ham9yPXN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICBweXB5X21pbm9yPXN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vciwKICAgICkKCgpkZWYgX2dlbmVyaWNfYWJpKCk6CiAgICBhYmkgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlNPQUJJIikKICAgIGlmIGFiaToKICAgICAgICByZXR1cm4gX25vcm1hbGl6ZV9zdHJpbmcoYWJpKQogICAgZWxzZToKICAgICAgICByZXR1cm4gIm5vbmUiCgoKZGVmIF9weXB5X3RhZ3MocHlfdmVyc2lvbiwgaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm1zKToKICAgIGZvciB0YWcgaW4gKFRhZyhpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybSkgZm9yIHBsYXRmb3JtIGluIHBsYXRmb3Jtcyk6CiAgICAgICAgeWllbGQgdGFnCiAgICBmb3IgdGFnIGluIChUYWcoaW50ZXJwcmV0ZXIsICJub25lIiwgcGxhdGZvcm0pIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwoKCmRlZiBfZ2VuZXJpY190YWdzKGludGVycHJldGVyLCBweV92ZXJzaW9uLCBhYmksIHBsYXRmb3Jtcyk6CiAgICBmb3IgdGFnIGluIChUYWcoaW50ZXJwcmV0ZXIsIGFiaSwgcGxhdGZvcm0pIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXMpOgogICAgICAgIHlpZWxkIHRhZwogICAgaWYgYWJpICE9ICJub25lIjoKICAgICAgICB0YWdzID0gKFRhZyhpbnRlcnByZXRlciwgIm5vbmUiLCBwbGF0Zm9ybV8pIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zKQogICAgICAgIGZvciB0YWcgaW4gdGFnczoKICAgICAgICAgICAgeWllbGQgdGFnCgoKZGVmIF9weV9pbnRlcnByZXRlcl9yYW5nZShweV92ZXJzaW9uKToKICAgICIiIgogICAgWWllbGQgUHl0aG9uIHZlcnNpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIuCgogICAgQWZ0ZXIgdGhlIGxhdGVzdCB2ZXJzaW9uLCB0aGUgbWFqb3Itb25seSB2ZXJzaW9uIHdpbGwgYmUgeWllbGRlZCwgYW5kIHRoZW4KICAgIGFsbCBmb2xsb3dpbmcgdmVyc2lvbnMgdXAgdG8gJ2VuZCcuCiAgICAiIiIKICAgIHlpZWxkICJweXttYWpvcn17bWlub3J9Ii5mb3JtYXQobWFqb3I9cHlfdmVyc2lvblswXSwgbWlub3I9cHlfdmVyc2lvblsxXSkKICAgIHlpZWxkICJweXttYWpvcn0iLmZvcm1hdChtYWpvcj1weV92ZXJzaW9uWzBdKQogICAgZm9yIG1pbm9yIGluIHJhbmdlKHB5X3ZlcnNpb25bMV0gLSAxLCAtMSwgLTEpOgogICAgICAgIHlpZWxkICJweXttYWpvcn17bWlub3J9Ii5mb3JtYXQobWFqb3I9cHlfdmVyc2lvblswXSwgbWlub3I9bWlub3IpCgoKZGVmIF9pbmRlcGVuZGVudF90YWdzKGludGVycHJldGVyLCBweV92ZXJzaW9uLCBwbGF0Zm9ybXMpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHNlcXVlbmNlIG9mIHRhZ3MgdGhhdCBhcmUgY29uc2lzdGVudCBhY3Jvc3MgaW1wbGVtZW50YXRpb25zLgoKICAgIFRoZSB0YWdzIGNvbnNpc3Qgb2Y6CiAgICAtIHB5Ki1ub25lLTxwbGF0Zm9ybT4KICAgIC0gPGludGVycHJldGVyPi1ub25lLWFueQogICAgLSBweSotbm9uZS1hbnkKICAgICIiIgogICAgZm9yIHZlcnNpb24gaW4gX3B5X2ludGVycHJldGVyX3JhbmdlKHB5X3ZlcnNpb24pOgogICAgICAgIGZvciBwbGF0Zm9ybV8gaW4gcGxhdGZvcm1zOgogICAgICAgICAgICB5aWVsZCBUYWcodmVyc2lvbiwgIm5vbmUiLCBwbGF0Zm9ybV8pCiAgICB5aWVsZCBUYWcoaW50ZXJwcmV0ZXIsICJub25lIiwgImFueSIpCiAgICBmb3IgdmVyc2lvbiBpbiBfcHlfaW50ZXJwcmV0ZXJfcmFuZ2UocHlfdmVyc2lvbik6CiAgICAgICAgeWllbGQgVGFnKHZlcnNpb24sICJub25lIiwgImFueSIpCgoKZGVmIF9tYWNfYXJjaChhcmNoLCBpc18zMmJpdD1fMzJfQklUX0lOVEVSUFJFVEVSKToKICAgIGlmIG5vdCBpc18zMmJpdDoKICAgICAgICByZXR1cm4gYXJjaAoKICAgIGlmIGFyY2guc3RhcnRzd2l0aCgicHBjIik6CiAgICAgICAgcmV0dXJuICJwcGMiCgogICAgcmV0dXJuICJpMzg2IgoKCmRlZiBfbWFjX2JpbmFyeV9mb3JtYXRzKHZlcnNpb24sIGNwdV9hcmNoKToKICAgIGZvcm1hdHMgPSBbY3B1X2FyY2hdCiAgICBpZiBjcHVfYXJjaCA9PSAieDg2XzY0IjoKICAgICAgICBpZiB2ZXJzaW9uIDwgKDEwLCA0KToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZm9ybWF0cy5leHRlbmQoWyJpbnRlbCIsICJmYXQ2NCIsICJmYXQzMiJdKQoKICAgIGVsaWYgY3B1X2FyY2ggPT0gImkzODYiOgogICAgICAgIGlmIHZlcnNpb24gPCAoMTAsIDQpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBmb3JtYXRzLmV4dGVuZChbImludGVsIiwgImZhdDMyIiwgImZhdCJdKQoKICAgIGVsaWYgY3B1X2FyY2ggPT0gInBwYzY0IjoKICAgICAgICAjIFRPRE86IE5lZWQgdG8gY2FyZSBhYm91dCAzMi1iaXQgUFBDIGZvciBwcGM2NCB0aHJvdWdoIDEwLjI/CiAgICAgICAgaWYgdmVyc2lvbiA+ICgxMCwgNSkgb3IgdmVyc2lvbiA8ICgxMCwgNCk6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGZvcm1hdHMuYXBwZW5kKCJmYXQ2NCIpCgogICAgZWxpZiBjcHVfYXJjaCA9PSAicHBjIjoKICAgICAgICBpZiB2ZXJzaW9uID4gKDEwLCA2KToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZm9ybWF0cy5leHRlbmQoWyJmYXQzMiIsICJmYXQiXSkKCiAgICBmb3JtYXRzLmFwcGVuZCgidW5pdmVyc2FsIikKICAgIHJldHVybiBmb3JtYXRzCgoKZGVmIF9tYWNfcGxhdGZvcm1zKHZlcnNpb249Tm9uZSwgYXJjaD1Ob25lKToKICAgIHZlcnNpb25fc3RyLCBfLCBjcHVfYXJjaCA9IHBsYXRmb3JtLm1hY192ZXIoKQogICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgIHZlcnNpb24gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uX3N0ci5zcGxpdCgiLiIpWzoyXSkpCiAgICBpZiBhcmNoIGlzIE5vbmU6CiAgICAgICAgYXJjaCA9IF9tYWNfYXJjaChjcHVfYXJjaCkKICAgIHBsYXRmb3JtcyA9IFtdCiAgICBmb3IgbWlub3JfdmVyc2lvbiBpbiByYW5nZSh2ZXJzaW9uWzFdLCAtMSwgLTEpOgogICAgICAgIGNvbXBhdF92ZXJzaW9uID0gdmVyc2lvblswXSwgbWlub3JfdmVyc2lvbgogICAgICAgIGJpbmFyeV9mb3JtYXRzID0gX21hY19iaW5hcnlfZm9ybWF0cyhjb21wYXRfdmVyc2lvbiwgYXJjaCkKICAgICAgICBmb3IgYmluYXJ5X2Zvcm1hdCBpbiBiaW5hcnlfZm9ybWF0czoKICAgICAgICAgICAgcGxhdGZvcm1zLmFwcGVuZCgKICAgICAgICAgICAgICAgICJtYWNvc3hfe21ham9yfV97bWlub3J9X3tiaW5hcnlfZm9ybWF0fSIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIG1ham9yPWNvbXBhdF92ZXJzaW9uWzBdLAogICAgICAgICAgICAgICAgICAgIG1pbm9yPWNvbXBhdF92ZXJzaW9uWzFdLAogICAgICAgICAgICAgICAgICAgIGJpbmFyeV9mb3JtYXQ9YmluYXJ5X2Zvcm1hdCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgcmV0dXJuIHBsYXRmb3JtcwoKCiMgRnJvbSBQRVAgNTEzLgpkZWYgX2lzX21hbnlsaW51eF9jb21wYXRpYmxlKG5hbWUsIGdsaWJjX3ZlcnNpb24pOgogICAgIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgX21hbnlsaW51eCBtb2R1bGUuCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9tYW55bGludXgKCiAgICAgICAgcmV0dXJuIGJvb2woZ2V0YXR0cihfbWFueWxpbnV4LCBuYW1lICsgIl9jb21wYXRpYmxlIikpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgIyBGYWxsIHRocm91Z2ggdG8gaGV1cmlzdGljIGNoZWNrIGJlbG93LgogICAgICAgIHBhc3MKCiAgICByZXR1cm4gX2hhdmVfY29tcGF0aWJsZV9nbGliYygqZ2xpYmNfdmVyc2lvbikKCgpkZWYgX2dsaWJjX3ZlcnNpb25fc3RyaW5nKCk6CiAgICAjIFJldHVybnMgZ2xpYmMgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUgaWYgbm90IHVzaW5nIGdsaWJjLgogICAgaW1wb3J0IGN0eXBlcwoKICAgICMgY3R5cGVzLkNETEwoTm9uZSkgaW50ZXJuYWxseSBjYWxscyBkbG9wZW4oTlVMTCksIGFuZCBhcyB0aGUgZGxvcGVuCiAgICAjIG1hbnBhZ2Ugc2F5cywgIklmIGZpbGVuYW1lIGlzIE5VTEwsIHRoZW4gdGhlIHJldHVybmVkIGhhbmRsZSBpcyBmb3IgdGhlCiAgICAjIG1haW4gcHJvZ3JhbSIuIFRoaXMgd2F5IHdlIGNhbiBsZXQgdGhlIGxpbmtlciBkbyB0aGUgd29yayB0byBmaWd1cmUgb3V0CiAgICAjIHdoaWNoIGxpYmMgb3VyIHByb2Nlc3MgaXMgYWN0dWFsbHkgdXNpbmcuCiAgICBwcm9jZXNzX25hbWVzcGFjZSA9IGN0eXBlcy5DRExMKE5vbmUpCiAgICB0cnk6CiAgICAgICAgZ251X2dldF9saWJjX3ZlcnNpb24gPSBwcm9jZXNzX25hbWVzcGFjZS5nbnVfZ2V0X2xpYmNfdmVyc2lvbgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgU3ltYm9sIGRvZXNuJ3QgZXhpc3QgLT4gdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGxpbmtlZCB0bwogICAgICAgICMgZ2xpYmMuCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIENhbGwgZ251X2dldF9saWJjX3ZlcnNpb24sIHdoaWNoIHJldHVybnMgYSBzdHJpbmcgbGlrZSAiMi41IgogICAgZ251X2dldF9saWJjX3ZlcnNpb24ucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogICAgdmVyc2lvbl9zdHIgPSBnbnVfZ2V0X2xpYmNfdmVyc2lvbigpCiAgICAjIHB5MiAvIHB5MyBjb21wYXRpYmlsaXR5OgogICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbl9zdHIsIHN0cik6CiAgICAgICAgdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0ci5kZWNvZGUoImFzY2lpIikKCiAgICByZXR1cm4gdmVyc2lvbl9zdHIKCgojIFNlcGFyYXRlZCBvdXQgZnJvbSBoYXZlX2NvbXBhdGlibGVfZ2xpYmMgZm9yIGVhc2llciB1bml0IHRlc3RpbmcuCmRlZiBfY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgIyBQYXJzZSBzdHJpbmcgYW5kIGNoZWNrIGFnYWluc3QgcmVxdWVzdGVkIHZlcnNpb24uCiAgICAjCiAgICAjIFdlIHVzZSBhIHJlZ2V4cCBpbnN0ZWFkIG9mIHN0ci5zcGxpdCBiZWNhdXNlIHdlIHdhbnQgdG8gZGlzY2FyZCBhbnkKICAgICMgcmFuZG9tIGp1bmsgdGhhdCBtaWdodCBjb21lIGFmdGVyIHRoZSBtaW5vciB2ZXJzaW9uIC0tIHRoaXMgbWlnaHQgaGFwcGVuCiAgICAjIGluIHBhdGNoZWQvZm9ya2VkIHZlcnNpb25zIG9mIGdsaWJjIChlLmcuIExpbmFybydzIHZlcnNpb24gb2YgZ2xpYmMKICAgICMgdXNlcyB2ZXJzaW9uIHN0cmluZ3MgbGlrZSAiMi4yMC0yMDE0LjExIikuIFNlZSBnaC0zNTg4LgogICAgbSA9IHJlLm1hdGNoKHIiKD9QPG1ham9yPlswLTldKylcLig/UDxtaW5vcj5bMC05XSspIiwgdmVyc2lvbl9zdHIpCiAgICBpZiBub3QgbToKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiRXhwZWN0ZWQgZ2xpYmMgdmVyc2lvbiB3aXRoIDIgY29tcG9uZW50cyBtYWpvci5taW5vciwiCiAgICAgICAgICAgICIgZ290OiAlcyIgJSB2ZXJzaW9uX3N0ciwKICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsCiAgICAgICAgKQogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuICgKICAgICAgICBpbnQobS5ncm91cCgibWFqb3IiKSkgPT0gcmVxdWlyZWRfbWFqb3IKICAgICAgICBhbmQgaW50KG0uZ3JvdXAoIm1pbm9yIikpID49IG1pbmltdW1fbWlub3IKICAgICkKCgpkZWYgX2hhdmVfY29tcGF0aWJsZV9nbGliYyhyZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICB2ZXJzaW9uX3N0ciA9IF9nbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiB2ZXJzaW9uX3N0ciBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIF9jaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcikKCgpkZWYgX2xpbnV4X3BsYXRmb3Jtcyhpc18zMmJpdD1fMzJfQklUX0lOVEVSUFJFVEVSKToKICAgIGxpbnV4ID0gX25vcm1hbGl6ZV9zdHJpbmcoZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkpCiAgICBpZiBsaW51eCA9PSAibGludXhfeDg2XzY0IiBhbmQgaXNfMzJiaXQ6CiAgICAgICAgbGludXggPSAibGludXhfaTY4NiIKICAgIG1hbnlsaW51eF9zdXBwb3J0ID0gKAogICAgICAgICgibWFueWxpbnV4MjAxNCIsICgyLCAxNykpLCAgIyBDZW50T1MgNyB3LyBnbGliYyAyLjE3IChQRVAgNTk5KQogICAgICAgICgibWFueWxpbnV4MjAxMCIsICgyLCAxMikpLCAgIyBDZW50T1MgNiB3LyBnbGliYyAyLjEyIChQRVAgNTcxKQogICAgICAgICgibWFueWxpbnV4MSIsICgyLCA1KSksICAjIENlbnRPUyA1IHcvIGdsaWJjIDIuNSAoUEVQIDUxMykKICAgICkKICAgIG1hbnlsaW51eF9zdXBwb3J0X2l0ZXIgPSBpdGVyKG1hbnlsaW51eF9zdXBwb3J0KQogICAgZm9yIG5hbWUsIGdsaWJjX3ZlcnNpb24gaW4gbWFueWxpbnV4X3N1cHBvcnRfaXRlcjoKICAgICAgICBpZiBfaXNfbWFueWxpbnV4X2NvbXBhdGlibGUobmFtZSwgZ2xpYmNfdmVyc2lvbik6CiAgICAgICAgICAgIHBsYXRmb3JtcyA9IFtsaW51eC5yZXBsYWNlKCJsaW51eCIsIG5hbWUpXQogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICBwbGF0Zm9ybXMgPSBbXQogICAgIyBTdXBwb3J0IGZvciBhIGxhdGVyIG1hbnlsaW51eCBpbXBsaWVzIHN1cHBvcnQgZm9yIGFuIGVhcmxpZXIgdmVyc2lvbi4KICAgIHBsYXRmb3JtcyArPSBbbGludXgucmVwbGFjZSgibGludXgiLCBuYW1lKSBmb3IgbmFtZSwgXyBpbiBtYW55bGludXhfc3VwcG9ydF9pdGVyXQogICAgcGxhdGZvcm1zLmFwcGVuZChsaW51eCkKICAgIHJldHVybiBwbGF0Zm9ybXMKCgpkZWYgX2dlbmVyaWNfcGxhdGZvcm1zKCk6CiAgICBwbGF0Zm9ybSA9IF9ub3JtYWxpemVfc3RyaW5nKGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpKQogICAgcmV0dXJuIFtwbGF0Zm9ybV0KCgpkZWYgX2ludGVycHJldGVyX25hbWUoKToKICAgIG5hbWUgPSBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKS5sb3dlcigpCiAgICByZXR1cm4gSU5URVJQUkVURVJfU0hPUlRfTkFNRVMuZ2V0KG5hbWUpIG9yIG5hbWUKCgpkZWYgX2dlbmVyaWNfaW50ZXJwcmV0ZXIobmFtZSwgcHlfdmVyc2lvbik6CiAgICB2ZXJzaW9uID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCB2ZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSAiIi5qb2luKG1hcChzdHIsIHB5X3ZlcnNpb25bOjJdKSkKICAgIHJldHVybiAie25hbWV9e3ZlcnNpb259Ii5mb3JtYXQobmFtZT1uYW1lLCB2ZXJzaW9uPXZlcnNpb24pCgoKZGVmIHN5c190YWdzKCk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIHNlcXVlbmNlIG9mIHRhZyB0cmlwbGVzIGZvciB0aGUgcnVubmluZyBpbnRlcnByZXRlci4KCiAgICBUaGUgb3JkZXIgb2YgdGhlIHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIHByaW9yaXR5IG9yZGVyIGZvciB0aGUKICAgIGludGVycHJldGVyLCBmcm9tIG1vc3QgdG8gbGVhc3QgaW1wb3J0YW50LgogICAgIiIiCiAgICBweV92ZXJzaW9uID0gc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgIGludGVycHJldGVyX25hbWUgPSBfaW50ZXJwcmV0ZXJfbmFtZSgpCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAiRGFyd2luIjoKICAgICAgICBwbGF0Zm9ybXMgPSBfbWFjX3BsYXRmb3JtcygpCiAgICBlbGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICJMaW51eCI6CiAgICAgICAgcGxhdGZvcm1zID0gX2xpbnV4X3BsYXRmb3JtcygpCiAgICBlbHNlOgogICAgICAgIHBsYXRmb3JtcyA9IF9nZW5lcmljX3BsYXRmb3JtcygpCgogICAgaWYgaW50ZXJwcmV0ZXJfbmFtZSA9PSAiY3AiOgogICAgICAgIGludGVycHJldGVyID0gX2NweXRob25faW50ZXJwcmV0ZXIocHlfdmVyc2lvbikKICAgICAgICBhYmlzID0gX2NweXRob25fYWJpcyhweV92ZXJzaW9uKQogICAgICAgIGZvciB0YWcgaW4gX2NweXRob25fdGFncyhweV92ZXJzaW9uLCBpbnRlcnByZXRlciwgYWJpcywgcGxhdGZvcm1zKToKICAgICAgICAgICAgeWllbGQgdGFnCiAgICBlbGlmIGludGVycHJldGVyX25hbWUgPT0gInBwIjoKICAgICAgICBpbnRlcnByZXRlciA9IF9weXB5X2ludGVycHJldGVyKCkKICAgICAgICBhYmkgPSBfZ2VuZXJpY19hYmkoKQogICAgICAgIGZvciB0YWcgaW4gX3B5cHlfdGFncyhweV92ZXJzaW9uLCBpbnRlcnByZXRlciwgYWJpLCBwbGF0Zm9ybXMpOgogICAgICAgICAgICB5aWVsZCB0YWcKICAgIGVsc2U6CiAgICAgICAgaW50ZXJwcmV0ZXIgPSBfZ2VuZXJpY19pbnRlcnByZXRlcihpbnRlcnByZXRlcl9uYW1lLCBweV92ZXJzaW9uKQogICAgICAgIGFiaSA9IF9nZW5lcmljX2FiaSgpCiAgICAgICAgZm9yIHRhZyBpbiBfZ2VuZXJpY190YWdzKGludGVycHJldGVyLCBweV92ZXJzaW9uLCBhYmksIHBsYXRmb3Jtcyk6CiAgICAgICAgICAgIHlpZWxkIHRhZwogICAgZm9yIHRhZyBpbiBfaW5kZXBlbmRlbnRfdGFncyhpbnRlcnByZXRlciwgcHlfdmVyc2lvbiwgcGxhdGZvcm1zKToKICAgICAgICB5aWVsZCB0YWcKUEsDBBQAAAAAAAAAIQBhPa2d8AUAAPAFAABKAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCmZyb20gLnZlcnNpb24gaW1wb3J0IEludmFsaWRWZXJzaW9uLCBWZXJzaW9uCgoKX2Nhbm9uaWNhbGl6ZV9yZWdleCA9IHJlLmNvbXBpbGUociJbLV8uXSsiKQoKCmRlZiBjYW5vbmljYWxpemVfbmFtZShuYW1lKToKICAgICMgVGhpcyBpcyB0YWtlbiBmcm9tIFBFUCA1MDMuCiAgICByZXR1cm4gX2Nhbm9uaWNhbGl6ZV9yZWdleC5zdWIoIi0iLCBuYW1lKS5sb3dlcigpCgoKZGVmIGNhbm9uaWNhbGl6ZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBWZXJzaW9uLl9fc3RyX18sIGJ1dCBoYXMgb25lIHN1YnRsZSBkaWZmZXJlbmNlcwogICAgd2l0aCB0aGUgd2F5IGl0IGhhbmRsZXMgdGhlIHJlbGVhc2Ugc2VnbWVudC4KICAgICIiIgoKICAgIHRyeToKICAgICAgICB2ZXJzaW9uID0gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgICMgTGVnYWN5IHZlcnNpb25zIGNhbm5vdCBiZSBub3JtYWxpemVkCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBwYXJ0cyA9IFtdCgogICAgIyBFcG9jaAogICAgaWYgdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHZlcnNpb24uZXBvY2gpKQoKICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAjIE5COiBUaGlzIHN0cmlwcyB0cmFpbGluZyAnLjAncyB0byBub3JtYWxpemUKICAgIHBhcnRzLmFwcGVuZChyZS5zdWIociIoXC4wKSskIiwgIiIsICIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiB2ZXJzaW9uLnJlbGVhc2UpKSkKCiAgICAjIFByZS1yZWxlYXNlCiAgICBpZiB2ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gdmVyc2lvbi5wcmUpKQoKICAgICMgUG9zdC1yZWxlYXNlCiAgICBpZiB2ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHZlcnNpb24ucG9zdCkpCgogICAgIyBEZXZlbG9wbWVudCByZWxlYXNlCiAgICBpZiB2ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdCh2ZXJzaW9uLmRldikpCgogICAgIyBMb2NhbCB2ZXJzaW9uIHNlZ21lbnQKICAgIGlmIHZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcGFydHMuYXBwZW5kKCIrezB9Ii5mb3JtYXQodmVyc2lvbi5sb2NhbCkpCgogICAgcmV0dXJuICIiLmpvaW4ocGFydHMpClBLAwQUAAAAAAAAACEA8TNy68ouAADKLgAATAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9zdHJ1Y3R1cmVzIGltcG9ydCBJbmZpbml0eQoKCl9fYWxsX18gPSBbInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iXQoKCl9WZXJzaW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgICJfVmVyc2lvbiIsIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXQopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKF9CYXNlVmVyc2lvbik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBlcG9jaChzZWxmKToKICAgICAgICByZXR1cm4gLTEKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgcG9zdChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRldihzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19kZXZyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKCl9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUgPSByZS5jb21waWxlKHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UpCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwKICAgICJwcmV2aWV3IjogImMiLAogICAgIi0iOiAiZmluYWwtIiwKICAgICJyYyI6ICJjIiwKICAgICJkZXYiOiAiQCIsCn0KCgpkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICBmb3IgcGFydCBpbiBfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgIHBhcnQgPSBfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwLmdldChwYXJ0LCBwYXJ0KQoKICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICIuIjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgcGFydFs6MV0gaW4gIjAxMjM0NTY3ODkiOgogICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCAiKiIgKyBwYXJ0CgogICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICB5aWVsZCAiKmZpbmFsIgoKCmRlZiBfbGVnYWN5X2NtcGtleSh2ZXJzaW9uKToKICAgICMgV2UgaGFyZGNvZGUgYW4gZXBvY2ggb2YgLTEgaGVyZS4gQSBQRVAgNDQwIHZlcnNpb24gY2FuIG9ubHkgaGF2ZSBhIGVwb2NoCiAgICAjIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgcHV0IHRoZSBMZWdhY3lWZXJzaW9uLAogICAgIyB3aGljaCB1c2VzIHRoZSBkZWZhY3RvIHN0YW5kYXJkIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYnkgc2V0dXB0b29scywKICAgICMgYXMgYmVmb3JlIGFsbCBQRVAgNDQwIHZlcnNpb25zLgogICAgZXBvY2ggPSAtMQoKICAgICMgVGhpcyBzY2hlbWUgaXMgdGFrZW4gZnJvbSBwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24gc2V0dXB0b29scyBwcmlvciB0bwogICAgIyBpdCdzIGFkb3B0aW9uIG9mIHRoZSBwYWNrYWdpbmcgbGlicmFyeS4KICAgIHBhcnRzID0gW10KICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHZlcnNpb24ubG93ZXIoKSk6CiAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCIqIik6CiAgICAgICAgICAgICMgcmVtb3ZlICItIiBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICBpZiBwYXJ0IDwgIipmaW5hbCI6CiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIqZmluYWwtIjoKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIjAwMDAwMDAwIjoKICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgcGFydHMgPSB0dXBsZShwYXJ0cykKCiAgICByZXR1cm4gZXBvY2gsIHBhcnRzCgoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUociJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24obWF0Y2guZ3JvdXAoInByZV9sIiksIG1hdGNoLmdyb3VwKCJwcmVfbiIpKSwKICAgICAgICAgICAgcG9zdD1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9sIiksIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKQogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKG1hdGNoLmdyb3VwKCJkZXZfbCIpLCBtYXRjaC5ncm91cCgiZGV2X24iKSksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLnBvc3QpKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5kZXYpKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiK3swfSIuZm9ybWF0KHNlbGYubG9jYWwpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlcG9jaChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbi5lcG9jaAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24ucmVsZWFzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbi5wcmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwb3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uLnBvc3RbMV0gaWYgc2VsZi5fdmVyc2lvbi5wb3N0IGVsc2UgTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRldihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbi5kZXZbMV0gaWYgc2VsZi5fdmVyc2lvbi5kZXYgZWxzZSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbDoKICAgICAgICAgICAgcmV0dXJuICIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLmxvY2FsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kZXYgaXMgbm90IE5vbmUgb3Igc2VsZi5wcmUgaXMgbm90IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wb3N0IGlzIG5vdCBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZGV2cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kZXYgaXMgbm90IE5vbmUKCgpkZWYgX3BhcnNlX2xldHRlcl92ZXJzaW9uKGxldHRlciwgbnVtYmVyKToKICAgIGlmIGxldHRlcjoKICAgICAgICAjIFdlIGNvbnNpZGVyIHRoZXJlIHRvIGJlIGFuIGltcGxpY2l0IDAgaW4gYSBwcmUtcmVsZWFzZSBpZiB0aGVyZSBpcwogICAgICAgICMgbm90IGEgbnVtZXJhbCBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgaWYgbnVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIG51bWJlciA9IDAKCiAgICAgICAgIyBXZSBub3JtYWxpemUgYW55IGxldHRlcnMgdG8gdGhlaXIgbG93ZXIgY2FzZSBmb3JtCiAgICAgICAgbGV0dGVyID0gbGV0dGVyLmxvd2VyKCkKCiAgICAgICAgIyBXZSBjb25zaWRlciBzb21lIHdvcmRzIHRvIGJlIGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2Ygb3RoZXIgd29yZHMgYW5kCiAgICAgICAgIyBpbiB0aG9zZSBjYXNlcyB3ZSB3YW50IHRvIG5vcm1hbGl6ZSB0aGUgc3BlbGxpbmdzIHRvIG91ciBwcmVmZXJyZWQKICAgICAgICAjIHNwZWxsaW5nLgogICAgICAgIGlmIGxldHRlciA9PSAiYWxwaGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYSIKICAgICAgICBlbGlmIGxldHRlciA9PSAiYmV0YSI6CiAgICAgICAgICAgIGxldHRlciA9ICJiIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsiYyIsICJwcmUiLCAicHJldmlldyJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicmMiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJyZXYiLCAiciJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKICAgIGlmIG5vdCBsZXR0ZXIgYW5kIG51bWJlcjoKICAgICAgICAjIFdlIGFzc3VtZSBpZiB3ZSBhcmUgZ2l2ZW4gYSBudW1iZXIsIGJ1dCB3ZSBhcmUgbm90IGdpdmVuIGEgbGV0dGVyCiAgICAgICAgIyB0aGVuIHRoaXMgaXMgdXNpbmcgdGhlIGltcGxpY2l0IHBvc3QgcmVsZWFzZSBzeW50YXggKGUuZy4gMS4wLTEpCiAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCgoKX2xvY2FsX3ZlcnNpb25fc2VwYXJhdG9ycyA9IHJlLmNvbXBpbGUociJbXC5fLV0iKQoKCmRlZiBfcGFyc2VfbG9jYWxfdmVyc2lvbihsb2NhbCk6CiAgICAiIiIKICAgIFRha2VzIGEgc3RyaW5nIGxpa2UgYWJjLjEudHdlbHZlIGFuZCB0dXJucyBpdCBpbnRvICgiYWJjIiwgMSwgInR3ZWx2ZSIpLgogICAgIiIiCiAgICBpZiBsb2NhbCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gdHVwbGUoCiAgICAgICAgICAgIHBhcnQubG93ZXIoKSBpZiBub3QgcGFydC5pc2RpZ2l0KCkgZWxzZSBpbnQocGFydCkKICAgICAgICAgICAgZm9yIHBhcnQgaW4gX2xvY2FsX3ZlcnNpb25fc2VwYXJhdG9ycy5zcGxpdChsb2NhbCkKICAgICAgICApCgoKZGVmIF9jbXBrZXkoZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbCk6CiAgICAjIFdoZW4gd2UgY29tcGFyZSBhIHJlbGVhc2UgdmVyc2lvbiwgd2Ugd2FudCB0byBjb21wYXJlIGl0IHdpdGggYWxsIG9mIHRoZQogICAgIyB0cmFpbGluZyB6ZXJvcyByZW1vdmVkLiBTbyB3ZSdsbCB1c2UgYSByZXZlcnNlIHRoZSBsaXN0LCBkcm9wIGFsbCB0aGUgbm93CiAgICAjIGxlYWRpbmcgemVyb3MgdW50aWwgd2UgY29tZSB0byBzb21ldGhpbmcgbm9uIHplcm8sIHRoZW4gdGFrZSB0aGUgcmVzdAogICAgIyByZS1yZXZlcnNlIGl0IGJhY2sgaW50byB0aGUgY29ycmVjdCBvcmRlciBhbmQgbWFrZSBpdCBhIHR1cGxlIGFuZCB1c2UKICAgICMgdGhhdCBmb3Igb3VyIHNvcnRpbmcga2V5LgogICAgcmVsZWFzZSA9IHR1cGxlKAogICAgICAgIHJldmVyc2VkKGxpc3QoaXRlcnRvb2xzLmRyb3B3aGlsZShsYW1iZGEgeDogeCA9PSAwLCByZXZlcnNlZChyZWxlYXNlKSkpKQogICAgKQoKICAgICMgV2UgbmVlZCB0byAidHJpY2siIHRoZSBzb3J0aW5nIGFsZ29yaXRobSB0byBwdXQgMS4wLmRldjAgYmVmb3JlIDEuMGEwLgogICAgIyBXZSdsbCBkbyB0aGlzIGJ5IGFidXNpbmcgdGhlIHByZSBzZWdtZW50LCBidXQgd2UgX29ubHlfIHdhbnQgdG8gZG8gdGhpcwogICAgIyBpZiB0aGVyZSBpcyBub3QgYSBwcmUgb3IgYSBwb3N0IHNlZ21lbnQuIElmIHdlIGhhdmUgb25lIG9mIHRob3NlIHRoZW4KICAgICMgdGhlIG5vcm1hbCBzb3J0aW5nIHJ1bGVzIHdpbGwgaGFuZGxlIHRoaXMgY2FzZSBjb3JyZWN0bHkuCiAgICBpZiBwcmUgaXMgTm9uZSBhbmQgcG9zdCBpcyBOb25lIGFuZCBkZXYgaXMgbm90IE5vbmU6CiAgICAgICAgcHJlID0gLUluZmluaXR5CiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwcmUtcmVsZWFzZSAoZXhjZXB0IGFzIG5vdGVkIGFib3ZlKSBzaG91bGQgc29ydCBhZnRlcgogICAgIyB0aG9zZSB3aXRoIG9uZS4KICAgIGVsaWYgcHJlIGlzIE5vbmU6CiAgICAgICAgcHJlID0gSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwb3N0IHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgaWYgcG9zdCBpcyBOb25lOgogICAgICAgIHBvc3QgPSAtSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBkZXZlbG9wbWVudCBzZWdtZW50IHNob3VsZCBzb3J0IGFmdGVyIHRob3NlIHdpdGggb25lLgogICAgaWYgZGV2IGlzIE5vbmU6CiAgICAgICAgZGV2ID0gSW5maW5pdHkKCiAgICBpZiBsb2NhbCBpcyBOb25lOgogICAgICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGxvY2FsIHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgICAgIGxvY2FsID0gLUluZmluaXR5CiAgICBlbHNlOgogICAgICAgICMgVmVyc2lvbnMgd2l0aCBhIGxvY2FsIHNlZ21lbnQgbmVlZCB0aGF0IHNlZ21lbnQgcGFyc2VkIHRvIGltcGxlbWVudAogICAgICAgICMgdGhlIHNvcnRpbmcgcnVsZXMgaW4gUEVQNDQwLgogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgYmVmb3JlIG51bWVyaWMgc2VnbWVudHMKICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGxleGljb2dyYXBoaWNhbGx5CiAgICAgICAgIyAtIE51bWVyaWMgc2VnbWVudHMgc29ydCBudW1lcmljYWxseQogICAgICAgICMgLSBTaG9ydGVyIHZlcnNpb25zIHNvcnQgYmVmb3JlIGxvbmdlciB2ZXJzaW9ucyB3aGVuIHRoZSBwcmVmaXhlcwogICAgICAgICMgICBtYXRjaCBleGFjdGx5CiAgICAgICAgbG9jYWwgPSB0dXBsZSgoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpIGZvciBpIGluIGxvY2FsKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAZg+EsXeKAwB3igMARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcHlwYXJzaW5nLnB5IyBtb2R1bGUgcHlwYXJzaW5nLnB5DQojDQojIENvcHlyaWdodCAoYykgMjAwMy0yMDE4ICBQYXVsIFQuIE1jR3VpcmUNCiMNCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQojIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwNCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQojIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KIyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQojDQojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KIw0KIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GDQojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4NCiMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCiMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwNCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUNCiMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQojDQoNCl9fZG9jX18gPSBcDQoiIiINCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywNCnZzLiB0aGUgdHJhZGl0aW9uYWwgbGV4L3lhY2MgYXBwcm9hY2gsIG9yIHRoZSB1c2Ugb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFdpdGggcHlwYXJzaW5nLCB5b3UNCmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQ0KcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uDQoNCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIA0KQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgDQooTHsnKyc8UGFyc2VyRWxlbWVudC5fX2FkZF9fPn0gb3BlcmF0b3IgZ2l2ZXMgTHtBbmR9IGV4cHJlc3Npb25zLCBzdHJpbmdzIGFyZSBhdXRvLWNvbnZlcnRlZCB0bw0KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6Og0KDQogICAgZnJvbSBweXBhcnNpbmcgaW1wb3J0IFdvcmQsIGFscGhhcw0KDQogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nDQogICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCg0KICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQoNClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6DQoNCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCg0KVGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBpcyBxdWl0ZSByZWFkYWJsZSwgb3dpbmcgdG8gdGhlIHNlbGYtZXhwbGFuYXRvcnkNCmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4NCg0KVGhlIEx7UGFyc2VSZXN1bHRzfSBvYmplY3QgcmV0dXJuZWQgZnJvbSBMe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc8UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGNhbiBiZSBhY2Nlc3NlZCBhcyBhIG5lc3RlZCBsaXN0LCBhIGRpY3Rpb25hcnksIG9yIGFuDQpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLg0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBoYW5kbGVzIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgYXJlIHR5cGljYWxseSB2ZXhpbmcgd2hlbiB3cml0aW5nIHRleHQgcGFyc2VyczoNCiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pDQogLSBxdW90ZWQgc3RyaW5ncw0KIC0gZW1iZWRkZWQgY29tbWVudHMNCg0KDQpHZXR0aW5nIFN0YXJ0ZWQgLQ0KLS0tLS0tLS0tLS0tLS0tLS0NClZpc2l0IHRoZSBjbGFzc2VzIEx7UGFyc2VyRWxlbWVudH0gYW5kIEx7UGFyc2VSZXN1bHRzfSB0byBzZWUgdGhlIGJhc2UgY2xhc3NlcyB0aGF0IG1vc3Qgb3RoZXIgcHlwYXJzaW5nDQpjbGFzc2VzIGluaGVyaXQgZnJvbS4gVXNlIHRoZSBkb2NzdHJpbmdzIGZvciBleGFtcGxlcyBvZiBob3cgdG86DQogLSBjb25zdHJ1Y3QgbGl0ZXJhbCBtYXRjaCBleHByZXNzaW9ucyBmcm9tIEx7TGl0ZXJhbH0gYW5kIEx7Q2FzZWxlc3NMaXRlcmFsfSBjbGFzc2VzDQogLSBjb25zdHJ1Y3QgY2hhcmFjdGVyIHdvcmQtZ3JvdXAgZXhwcmVzc2lvbnMgdXNpbmcgdGhlIEx7V29yZH0gY2xhc3MNCiAtIHNlZSBob3cgdG8gY3JlYXRlIHJlcGV0aXRpdmUgZXhwcmVzc2lvbnMgdXNpbmcgTHtaZXJvT3JNb3JlfSBhbmQgTHtPbmVPck1vcmV9IGNsYXNzZXMNCiAtIHVzZSBMeycrJzxBbmQ+fSwgTHsnfCc8TWF0Y2hGaXJzdD59LCBMeydeJzxPcj59LCBhbmQgTHsnJic8RWFjaD59IG9wZXJhdG9ycyB0byBjb21iaW5lIHNpbXBsZSBleHByZXNzaW9ucyBpbnRvIG1vcmUgY29tcGxleCBvbmVzDQogLSBhc3NvY2lhdGUgbmFtZXMgd2l0aCB5b3VyIHBhcnNlZCByZXN1bHRzIHVzaW5nIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0NCiAtIGZpbmQgc29tZSBoZWxwZnVsIGV4cHJlc3Npb24gc2hvcnQtY3V0cyBsaWtlIEx7ZGVsaW1pdGVkTGlzdH0gYW5kIEx7b25lT2Z9DQogLSBmaW5kIG1vcmUgdXNlZnVsIGNvbW1vbiBleHByZXNzaW9ucyBpbiB0aGUgTHtweXBhcnNpbmdfY29tbW9ufSBuYW1lc3BhY2UgY2xhc3MNCiIiIg0KDQpfX3ZlcnNpb25fXyA9ICIyLjIuMSINCl9fdmVyc2lvblRpbWVfXyA9ICIxOCBTZXAgMjAxOCAwMDo0OSBVVEMiDQpfX2F1dGhvcl9fID0gIlBhdWwgTWNHdWlyZSA8cHRtY2dAdXNlcnMuc291cmNlZm9yZ2UubmV0PiINCg0KaW1wb3J0IHN0cmluZw0KZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYgYXMgd2tyZWYNCmltcG9ydCBjb3B5DQppbXBvcnQgc3lzDQppbXBvcnQgd2FybmluZ3MNCmltcG9ydCByZQ0KaW1wb3J0IHNyZV9jb25zdGFudHMNCmltcG9ydCBjb2xsZWN0aW9ucw0KaW1wb3J0IHBwcmludA0KaW1wb3J0IHRyYWNlYmFjaw0KaW1wb3J0IHR5cGVzDQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQ0KDQp0cnk6DQogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jaw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jaw0KDQp0cnk6DQogICAgIyBQeXRob24gMw0KICAgIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBJdGVyYWJsZQ0KICAgIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNdXRhYmxlTWFwcGluZw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICMgUHl0aG9uIDIuNw0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IEl0ZXJhYmxlDQogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcNCg0KdHJ5Og0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHRyeToNCiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQogICAgZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lDQoNCiN+IHN5cy5zdGRlcnIud3JpdGUoICJ0ZXN0aW5nIHB5cGFyc2luZyBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iICUgKF9fdmVyc2lvbl9fLF9fdmVyc2lvblRpbWVfXyApICkNCg0KX19hbGxfXyA9IFsNCidBbmQnLCAnQ2FzZWxlc3NLZXl3b3JkJywgJ0Nhc2VsZXNzTGl0ZXJhbCcsICdDaGFyc05vdEluJywgJ0NvbWJpbmUnLCAnRGljdCcsICdFYWNoJywgJ0VtcHR5JywNCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLA0KJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywNCidQYXJzZUJhc2VFeGNlcHRpb24nLCAnUGFyc2VFbGVtZW50RW5oYW5jZScsICdQYXJzZUV4Y2VwdGlvbicsICdQYXJzZUV4cHJlc3Npb24nLCAnUGFyc2VGYXRhbEV4Y2VwdGlvbicsDQonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLA0KJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCANCidXaGl0ZScsICdXb3JkJywgJ1dvcmRFbmQnLCAnV29yZFN0YXJ0JywgJ1plcm9Pck1vcmUnLA0KJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywNCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsDQonZGJsU2xhc2hDb21tZW50JywgJ2RlbGltaXRlZExpc3QnLCAnZGljdE9mJywgJ2Rvd25jYXNlVG9rZW5zJywgJ2VtcHR5JywgJ2hleG51bXMnLA0KJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLA0KJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsDQonbmVzdGVkRXhwcicsICdudWxsRGVidWdBY3Rpb24nLCAnbnVtcycsICdvbmVPZicsICdvcEFzc29jJywgJ29wZXJhdG9yUHJlY2VkZW5jZScsICdwcmludGFibGVzJywNCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIA0KJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLA0KJ3N0cmluZ1N0YXJ0JywgJ3RyYWNlUGFyc2VBY3Rpb24nLCAndW5pY29kZVN0cmluZycsICd1cGNhc2VUb2tlbnMnLCAnd2l0aEF0dHJpYnV0ZScsDQonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywNCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLA0KXQ0KDQpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQ0KUFlfMyA9IHN5c3RlbV92ZXJzaW9uWzBdID09IDMNCmlmIFBZXzM6DQogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQ0KICAgIGJhc2VzdHJpbmcgPSBzdHINCiAgICB1bmljaHIgPSBjaHINCiAgICBfdXN0ciA9IHN0cg0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdDQoNCmVsc2U6DQogICAgX01BWF9JTlQgPSBzeXMubWF4aW50DQogICAgcmFuZ2UgPSB4cmFuZ2UNCg0KICAgIGRlZiBfdXN0cihvYmopOg0KICAgICAgICAiIiJEcm9wLWluIHJlcGxhY2VtZW50IGZvciBzdHIob2JqKSB0aGF0IHRyaWVzIHRvIGJlIFVuaWNvZGUgZnJpZW5kbHkuIEl0IGZpcnN0IHRyaWVzDQogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdA0KICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOg0KICAgICAgICAgICAgcmV0dXJuIG9iag0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvDQogICAgICAgICAgICAjIGl0IHdvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlLg0KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopDQoNCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoNCiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQNCiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZiA9IFJlZ2V4KHInJiNcZCs7JykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6ICdcXHUnICsgaGV4KGludCh0WzBdWzI6LTFdKSlbMjpdKQ0KICAgICAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWYudHJhbnNmb3JtU3RyaW5nKHJldCkNCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0b2xlcmFudCBvZiBQeXRob24gdmVyc2lvbiwgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbXQ0KICAgIGltcG9ydCBfX2J1aWx0aW5fXw0KICAgIGZvciBmbmFtZSBpbiAic3VtIGxlbiBzb3J0ZWQgcmV2ZXJzZWQgbGlzdCB0dXBsZSBzZXQgYW55IGFsbCBtaW4gbWF4Ii5zcGxpdCgpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzaW5nbGVBcmdCdWlsdGlucy5hcHBlbmQoZ2V0YXR0cihfX2J1aWx0aW5fXyxmbmFtZSkpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICANCl9nZW5lcmF0b3JUeXBlID0gdHlwZSgoeSBmb3IgeSBpbiByYW5nZSgxKSkpDQogDQpkZWYgX3htbF9lc2NhcGUoZGF0YSk6DQogICAgIiIiRXNjYXBlICYsIDwsID4sICIsICcsIGV0Yy4gaW4gYSBzdHJpbmcgb2YgZGF0YS4iIiINCg0KICAgICMgYW1wZXJzYW5kIG11c3QgYmUgcmVwbGFjZWQgZmlyc3QNCiAgICBmcm9tX3N5bWJvbHMgPSAnJj48IlwnJw0KICAgIHRvX3N5bWJvbHMgPSAoJyYnK3MrJzsnIGZvciBzIGluICJhbXAgZ3QgbHQgcXVvdCBhcG9zIi5zcGxpdCgpKQ0KICAgIGZvciBmcm9tXyx0b18gaW4gemlwKGZyb21fc3ltYm9scywgdG9fc3ltYm9scyk6DQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoZnJvbV8sIHRvXykNCiAgICByZXR1cm4gZGF0YQ0KDQpjbGFzcyBfQ29uc3RhbnRzKG9iamVjdCk6DQogICAgcGFzcw0KDQphbHBoYXMgICAgID0gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIHN0cmluZy5hc2NpaV9sb3dlcmNhc2UNCm51bXMgICAgICAgPSAiMDEyMzQ1Njc4OSINCmhleG51bXMgICAgPSBudW1zICsgIkFCQ0RFRmFiY2RlZiINCmFscGhhbnVtcyAgPSBhbHBoYXMgKyBudW1zDQpfYnNsYXNoICAgID0gY2hyKDkyKQ0KcHJpbnRhYmxlcyA9ICIiLmpvaW4oYyBmb3IgYyBpbiBzdHJpbmcucHJpbnRhYmxlIGlmIGMgbm90IGluIHN0cmluZy53aGl0ZXNwYWNlKQ0KDQpjbGFzcyBQYXJzZUJhc2VFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJiYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIHBhcnNpbmcgcnVudGltZSBleGNlcHRpb25zIiIiDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwc3RyLCBsb2M9MCwgbXNnPU5vbmUsIGVsZW09Tm9uZSApOg0KICAgICAgICBzZWxmLmxvYyA9IGxvYw0KICAgICAgICBpZiBtc2cgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gcHN0cg0KICAgICAgICAgICAgc2VsZi5wc3RyID0gIiINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gbXNnDQogICAgICAgICAgICBzZWxmLnBzdHIgPSBwc3RyDQogICAgICAgIHNlbGYucGFyc2VyRWxlbWVudCA9IGVsZW0NCiAgICAgICAgc2VsZi5hcmdzID0gKHBzdHIsIGxvYywgbXNnKQ0KDQogICAgQGNsYXNzbWV0aG9kDQogICAgZGVmIF9mcm9tX2V4Y2VwdGlvbihjbHMsIHBlKToNCiAgICAgICAgIiIiDQogICAgICAgIGludGVybmFsIGZhY3RvcnkgbWV0aG9kIHRvIHNpbXBsaWZ5IGNyZWF0aW5nIG9uZSB0eXBlIG9mIFBhcnNlRXhjZXB0aW9uIA0KICAgICAgICBmcm9tIGFub3RoZXIgLSBhdm9pZHMgaGF2aW5nIF9faW5pdF9fIHNpZ25hdHVyZSBjb25mbGljdHMgYW1vbmcgc3ViY2xhc3Nlcw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIGNscyhwZS5wc3RyLCBwZS5sb2MsIHBlLm1zZywgcGUucGFyc2VyRWxlbWVudCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgYW5hbWUgKToNCiAgICAgICAgIiIic3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgICAgICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgaWYoIGFuYW1lID09ICJsaW5lbm8iICk6DQogICAgICAgICAgICByZXR1cm4gbGluZW5vKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgaW4gKCJjb2wiLCAiY29sdW1uIikgKToNCiAgICAgICAgICAgIHJldHVybiBjb2woIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSA9PSAibGluZSIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGFuYW1lKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIlcyAoYXQgY2hhciAlZCksIChsaW5lOiVkLCBjb2w6JWQpIiAlIFwNCiAgICAgICAgICAgICAgICAoIHNlbGYubXNnLCBzZWxmLmxvYywgc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uICkNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQogICAgZGVmIG1hcmtJbnB1dGxpbmUoIHNlbGYsIG1hcmtlclN0cmluZyA9ICI+ITwiICk6DQogICAgICAgICIiIkV4dHJhY3RzIHRoZSBleGNlcHRpb24gbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGFuZCBtYXJrcw0KICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGV4Y2VwdGlvbiB3aXRoIGEgc3BlY2lhbCBzeW1ib2wuDQogICAgICAgICIiIg0KICAgICAgICBsaW5lX3N0ciA9IHNlbGYubGluZQ0KICAgICAgICBsaW5lX2NvbHVtbiA9IHNlbGYuY29sdW1uIC0gMQ0KICAgICAgICBpZiBtYXJrZXJTdHJpbmc6DQogICAgICAgICAgICBsaW5lX3N0ciA9ICIiLmpvaW4oKGxpbmVfc3RyWzpsaW5lX2NvbHVtbl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0cmluZywgbGluZV9zdHJbbGluZV9jb2x1bW46XSkpDQogICAgICAgIHJldHVybiBsaW5lX3N0ci5zdHJpcCgpDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAibGluZW5vIGNvbCBsaW5lIi5zcGxpdCgpICsgZGlyKHR5cGUoc2VsZikpDQoNCmNsYXNzIFBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIiDQogICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHBhcnNlIGV4cHJlc3Npb25zIGRvbid0IG1hdGNoIGNsYXNzOw0KICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKQ0KICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICBwcmludChwZSkNCiAgICAgICAgICAgIHByaW50KCJjb2x1bW46IHt9Ii5mb3JtYXQocGUuY29sKSkNCiAgICAgICAgICAgIA0KICAgIHByaW50czo6DQogICAgICAgRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgIGNvbHVtbjogMQ0KICAgICIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VGYXRhbEV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiInVzZXItdGhyb3dhYmxlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBpbmNvbnNpc3RlbnQgcGFyc2UgY29udGVudA0KICAgICAgIGlzIGZvdW5kOyBzdG9wcyBhbGwgcGFyc2luZyBpbW1lZGlhdGVseSIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VTeW50YXhFeGNlcHRpb24oUGFyc2VGYXRhbEV4Y2VwdGlvbik6DQogICAgIiIianVzdCBsaWtlIEx7UGFyc2VGYXRhbEV4Y2VwdGlvbn0sIGJ1dCB0aHJvd24gaW50ZXJuYWxseSB3aGVuIGFuDQogICAgICAgTHtFcnJvclN0b3A8QW5kLl9FcnJvclN0b3A+fSAoJy0nIG9wZXJhdG9yKSBpbmRpY2F0ZXMgdGhhdCBwYXJzaW5nIGlzIHRvIHN0b3AgDQogICAgICAgaW1tZWRpYXRlbHkgYmVjYXVzZSBhbiB1bmJhY2t0cmFja2FibGUgc3ludGF4IGVycm9yIGhhcyBiZWVuIGZvdW5kIiIiDQogICAgcGFzcw0KDQojfiBjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgI34gIiIiRXhwZXJpbWVudGFsIGNsYXNzIC0gcGFyc2UgYWN0aW9ucyBjYW4gcmFpc2UgdGhpcyBleGNlcHRpb24gdG8gY2F1c2UNCiAgICAgICAjfiBweXBhcnNpbmcgdG8gcmVwYXJzZSB0aGUgaW5wdXQgc3RyaW5nOg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBpbnB1dCBzdHJpbmcsIGFuZC9vcg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBzdGFydCBsb2NhdGlvbg0KICAgICAgICN+IFNldCB0aGUgdmFsdWVzIG9mIHRoZSBSZXBhcnNlRXhjZXB0aW9uIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJhaXNlIHRoZQ0KICAgICAgICN+IGV4Y2VwdGlvbiBpbiBhIHBhcnNlIGFjdGlvbiB0byBjYXVzZSBweXBhcnNpbmcgdG8gdXNlIHRoZSBuZXcgc3RyaW5nL2xvY2F0aW9uLg0KICAgICAgICN+IFNldHRpbmcgdGhlIHZhbHVlcyBhcyBOb25lIGNhdXNlcyBubyBjaGFuZ2UgdG8gYmUgbWFkZS4NCiAgICAgICAjfiAiIiINCiAgICAjfiBkZWYgX19pbml0Xyggc2VsZiwgbmV3c3RyaW5nLCByZXN0YXJ0TG9jICk6DQogICAgICAgICN+IHNlbGYubmV3UGFyc2VUZXh0ID0gbmV3c3RyaW5nDQogICAgICAgICN+IHNlbGYucmVwYXJzZUxvYyA9IHJlc3RhcnRMb2MNCg0KY2xhc3MgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImV4Y2VwdGlvbiB0aHJvd24gYnkgTHtQYXJzZXJFbGVtZW50LnZhbGlkYXRlfSBpZiB0aGUgZ3JhbW1hciBjb3VsZCBiZSBpbXByb3Blcmx5IHJlY3Vyc2l2ZSIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzZWxmLnBhcnNlRWxlbWVudFRyYWNlID0gcGFyc2VFbGVtZW50TGlzdA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICJSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uOiAlcyIgJSBzZWxmLnBhcnNlRWxlbWVudFRyYWNlDQoNCmNsYXNzIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KG9iamVjdCk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYscDEscDIpOg0KICAgICAgICBzZWxmLnR1cCA9IChwMSxwMikNCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpKToNCiAgICAgICAgcmV0dXJuIHNlbGYudHVwW2ldDQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gcmVwcihzZWxmLnR1cFswXSkNCiAgICBkZWYgc2V0T2Zmc2V0KHNlbGYsaSk6DQogICAgICAgIHNlbGYudHVwID0gKHNlbGYudHVwWzBdLGkpDQoNCmNsYXNzIFBhcnNlUmVzdWx0cyhvYmplY3QpOg0KICAgICIiIg0KICAgIFN0cnVjdHVyZWQgcGFyc2UgcmVzdWx0cywgdG8gcHJvdmlkZSBtdWx0aXBsZSBtZWFucyBvZiBhY2Nlc3MgdG8gdGhlIHBhcnNlZCBkYXRhOg0KICAgICAgIC0gYXMgYSBsaXN0IChDe2xlbihyZXN1bHRzKX0pDQogICAgICAgLSBieSBsaXN0IGluZGV4IChDe3Jlc3VsdHNbMF0sIHJlc3VsdHNbMV19LCBldGMuKQ0KICAgICAgIC0gYnkgYXR0cmlidXRlIChDe3Jlc3VsdHMuPHJlc3VsdHNOYW1lPn0gLSBzZWUgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgIyBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KDQogICAgICAgICMgcGFyc2VTdHJpbmcgcmV0dXJucyBhIFBhcnNlUmVzdWx0cyBvYmplY3QNCiAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KDQogICAgICAgIGRlZiB0ZXN0KHMsIGZuPXJlcHIpOg0KICAgICAgICAgICAgcHJpbnQoIiVzIC0+ICVzIiAlIChzLCBmbihldmFsKHMpKSkpDQogICAgICAgIHRlc3QoImxpc3QocmVzdWx0KSIpDQogICAgICAgIHRlc3QoInJlc3VsdFswXSIpDQogICAgICAgIHRlc3QoInJlc3VsdFsnbW9udGgnXSIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kYXkiKQ0KICAgICAgICB0ZXN0KCInbW9udGgnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoIidtaW51dGVzJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZHVtcCgpIiwgc3RyKQ0KICAgIHByaW50czo6DQogICAgICAgIGxpc3QocmVzdWx0KSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgcmVzdWx0WzBdIC0+ICcxOTk5Jw0KICAgICAgICByZXN1bHRbJ21vbnRoJ10gLT4gJzEyJw0KICAgICAgICByZXN1bHQuZGF5IC0+ICczMScNCiAgICAgICAgJ21vbnRoJyBpbiByZXN1bHQgLT4gVHJ1ZQ0KICAgICAgICAnbWludXRlcycgaW4gcmVzdWx0IC0+IEZhbHNlDQogICAgICAgIHJlc3VsdC5kdW1wKCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIC0gZGF5OiAzMQ0KICAgICAgICAtIG1vbnRoOiAxMg0KICAgICAgICAtIHllYXI6IDE5OTkNCiAgICAiIiINCiAgICBkZWYgX19uZXdfXyhjbHMsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGNscyk6DQogICAgICAgICAgICByZXR1cm4gdG9rbGlzdA0KICAgICAgICByZXRvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpDQogICAgICAgIHJldG9iai5fX2RvaW5pdCA9IFRydWUNCiAgICAgICAgcmV0dXJuIHJldG9iag0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBzZWxmLl9fZG9pbml0Og0KICAgICAgICAgICAgc2VsZi5fX2RvaW5pdCA9IEZhbHNlDQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgICAgICBzZWxmLl9fYXNMaXN0ID0gYXNMaXN0DQogICAgICAgICAgICBzZWxmLl9fbW9kYWwgPSBtb2RhbA0KICAgICAgICAgICAgaWYgdG9rbGlzdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBsaXN0KToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHRva2xpc3RbOl0NCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBfZ2VuZXJhdG9yVHlwZSk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBsaXN0KHRva2xpc3QpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gW3Rva2xpc3RdDQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdCA9IGRpY3QoKQ0KDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5hbWU6DQogICAgICAgICAgICBpZiBub3QgbW9kYWw6DQogICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXNbbmFtZV0gPSAwDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsaW50KToNCiAgICAgICAgICAgICAgICBuYW1lID0gX3VzdHIobmFtZSkgIyB3aWxsIGFsd2F5cyByZXR1cm4gYSBzdHIsIGJ1dCB1c2UgX3VzdHIgZm9yIGNvbnNpc3RlbmN5DQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0b2tsaXN0LCAodHlwZShOb25lKSwgYmFzZXN0cmluZywgbGlzdCkpIGFuZCB0b2tsaXN0IGluIChOb25lLCcnLFtdKSk6DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICAgICB0b2tsaXN0ID0gWyB0b2tsaXN0IF0NCiAgICAgICAgICAgICAgICBpZiBhc0xpc3Q6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva2xpc3QuY29weSgpLDApDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoUGFyc2VSZXN1bHRzKHRva2xpc3RbMF0pLDApDQogICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0uX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0WzBdDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsVHlwZUVycm9yLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3QNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBpLCAoaW50LHNsaWNlKSApOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0W2ldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBpIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbaV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W2ldIF0pDQoNCiAgICBkZWYgX19zZXRpdGVtX18oIHNlbGYsIGssIHYsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHYsX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW3ZdDQogICAgICAgICAgICBzdWIgPSB2WzBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShrLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0W2tdID0gdg0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW19QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHYsMCldDQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzdWIuX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KDQogICAgZGVmIF9fZGVsaXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSwoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBteWxlbiA9IGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0W2ldDQoNCiAgICAgICAgICAgICMgY29udmVydCBpbnQgdG8gc2xpY2UNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgaW50KToNCiAgICAgICAgICAgICAgICBpZiBpIDwgMDoNCiAgICAgICAgICAgICAgICAgICAgaSArPSBteWxlbg0KICAgICAgICAgICAgICAgIGkgPSBzbGljZShpLCBpKzEpDQogICAgICAgICAgICAjIGdldCByZW1vdmVkIGluZGljZXMNCiAgICAgICAgICAgIHJlbW92ZWQgPSBsaXN0KHJhbmdlKCppLmluZGljZXMobXlsZW4pKSkNCiAgICAgICAgICAgIHJlbW92ZWQucmV2ZXJzZSgpDQogICAgICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgICAgICBmb3IgaiBpbiByZW1vdmVkOg0KICAgICAgICAgICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uIC0gKHBvc2l0aW9uID4gaikpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2RpY3RbaV0NCg0KICAgIGRlZiBfX2NvbnRhaW5zX18oIHNlbGYsIGsgKToNCiAgICAgICAgcmV0dXJuIGsgaW4gc2VsZi5fX3Rva2RpY3QNCg0KICAgIGRlZiBfX2xlbl9fKCBzZWxmICk6IHJldHVybiBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19ib29sX18oc2VsZik6IHJldHVybiAoIG5vdCBub3Qgc2VsZi5fX3Rva2xpc3QgKQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19pdGVyX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19yZXZlcnNlZF9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdFs6Oi0xXSApDQogICAgZGVmIF9pdGVya2V5cyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX190b2tkaWN0LCAiaXRlcmtleXMiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdC5pdGVya2V5cygpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9fdG9rZGljdCkNCg0KICAgIGRlZiBfaXRlcnZhbHVlcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKHNlbGZba10gZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCiAgICAgICAgICAgIA0KICAgIGRlZiBfaXRlcml0ZW1zKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoKGssIHNlbGZba10pIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQoNCiAgICBpZiBQWV8zOg0KICAgICAgICBrZXlzID0gX2l0ZXJrZXlzICAgICAgIA0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICB2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgIGVsc2U6DQogICAgICAgIGl0ZXJrZXlzID0gX2l0ZXJrZXlzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJ2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgZGVmIGtleXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpDQoNCiAgICAgICAgZGVmIHZhbHVlcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBpdGVtcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZXMgKGFzIGEgbGlzdCBvZiB0dXBsZXMgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQ0KDQogICAgZGVmIGhhc2tleXMoIHNlbGYgKToNCiAgICAgICAgIiIiU2luY2Uga2V5cygpIHJldHVybnMgYW4gaXRlcmF0b3IsIHRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgaW4gYnlwYXNzaW5nDQogICAgICAgICAgIGNvZGUgdGhhdCBsb29rcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbnkgZGVmaW5lZCByZXN1bHRzIG5hbWVzLiIiIg0KICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fdG9rZGljdCkNCiAgICAgICAgDQogICAgZGVmIHBvcCggc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFJlbW92ZXMgYW5kIHJldHVybnMgaXRlbSBhdCBzcGVjaWZpZWQgaW5kZXggKGRlZmF1bHQ9Q3tsYXN0fSkuDQogICAgICAgIFN1cHBvcnRzIGJvdGggQ3tsaXN0fSBhbmQgQ3tkaWN0fSBzZW1hbnRpY3MgZm9yIEN7cG9wKCl9LiBJZiBwYXNzZWQgbm8NCiAgICAgICAgYXJndW1lbnQgb3IgYW4gaW50ZWdlciBhcmd1bWVudCwgaXQgd2lsbCB1c2UgQ3tsaXN0fSBzZW1hbnRpY3MNCiAgICAgICAgYW5kIHBvcCB0b2tlbnMgZnJvbSB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLiBJZiBwYXNzZWQgYSANCiAgICAgICAgbm9uLWludGVnZXIgYXJndW1lbnQgKG1vc3QgbGlrZWx5IGEgc3RyaW5nKSwgaXQgd2lsbCB1c2UgQ3tkaWN0fQ0KICAgICAgICBzZW1hbnRpY3MgYW5kIHBvcCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGFueSBkZWZpbmVkIA0KICAgICAgICByZXN1bHRzIG5hbWVzLiBBIHNlY29uZCBkZWZhdWx0IHJldHVybiB2YWx1ZSBhcmd1bWVudCBpcyANCiAgICAgICAgc3VwcG9ydGVkLCBqdXN0IGFzIGluIEN7ZGljdC5wb3AoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkZWYgcmVtb3ZlX2ZpcnN0KHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgwKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX2ZpcnN0KS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgbGFiZWwgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHBhdHQgPSBsYWJlbCgiTEFCRUwiKSArIE9uZU9yTW9yZShXb3JkKG51bXMpKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQoNCiAgICAgICAgICAgICMgVXNlIHBvcCgpIGluIGEgcGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBuYW1lZCByZXN1bHQgKG5vdGUgdGhhdCBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG5vdA0KICAgICAgICAgICAgIyByZW1vdmVkIGZyb20gbGlzdCBmb3JtIG9mIHJlc3VsdHMpDQogICAgICAgICAgICBkZWYgcmVtb3ZlX0xBQkVMKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgiTEFCRUwiKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCiAgICAgICAgICAgIHBhdHQuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX0xBQkVMKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIC0gTEFCRUw6IEFBQg0KDQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBhcmdzOg0KICAgICAgICAgICAgYXJncyA9IFstMV0NCiAgICAgICAgZm9yIGssdiBpbiBrd2FyZ3MuaXRlbXMoKToNCiAgICAgICAgICAgIGlmIGsgPT0gJ2RlZmF1bHQnOg0KICAgICAgICAgICAgICAgIGFyZ3MgPSAoYXJnc1swXSwgdikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwb3AoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgaykNCiAgICAgICAgaWYgKGlzaW5zdGFuY2UoYXJnc1swXSwgaW50KSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSA9PSAxIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSBpbiBzZWxmKToNCiAgICAgICAgICAgIGluZGV4ID0gYXJnc1swXQ0KICAgICAgICAgICAgcmV0ID0gc2VsZltpbmRleF0NCiAgICAgICAgICAgIGRlbCBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVmYXVsdHZhbHVlID0gYXJnc1sxXQ0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZQ0KDQogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHRWYWx1ZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgbmFtZWQgcmVzdWx0IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXksIG9yIGlmIHRoZXJlIGlzIG5vDQogICAgICAgIHN1Y2ggbmFtZSwgdGhlbiByZXR1cm5zIHRoZSBnaXZlbiBDe2RlZmF1bHRWYWx1ZX0gb3IgQ3tOb25lfSBpZiBubw0KICAgICAgICBDe2RlZmF1bHRWYWx1ZX0gaXMgc3BlY2lmaWVkLg0KDQogICAgICAgIFNpbWlsYXIgdG8gQ3tkaWN0LmdldCgpfS4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgieWVhciIpKSAjIC0+ICcxOTk5Jw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIsICJub3Qgc3BlY2lmaWVkIikpICMgLT4gJ25vdCBzcGVjaWZpZWQnDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIikpICMgLT4gTm9uZQ0KICAgICAgICAiIiINCiAgICAgICAgaWYga2V5IGluIHNlbGY6DQogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlDQoNCiAgICBkZWYgaW5zZXJ0KCBzZWxmLCBpbmRleCwgaW5zU3RyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuDQogICAgICAgIA0KICAgICAgICBTaW1pbGFyIHRvIEN7bGlzdC5pbnNlcnQoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gaW5zZXJ0IHRoZSBwYXJzZSBsb2NhdGlvbiBpbiB0aGUgZnJvbnQgb2YgdGhlIHBhcnNlZCByZXN1bHRzDQogICAgICAgICAgICBkZWYgaW5zZXJ0X2xvY24obG9jbiwgdG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuaW5zZXJ0KDAsIGxvY24pDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oaW5zZXJ0X2xvY24pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbMCwgJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5pbnNlcnQoaW5kZXgsIGluc1N0cikNCiAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uICsgKHBvc2l0aW9uID4gaW5kZXgpKQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgaXRlbSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNpbmdsZSBlbGVtZW50IHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIHBhcnNlZCBpbnRlZ2VycywgYW5kIGFkZCBpdCB0byB0aGUgZW5kDQogICAgICAgICAgICBkZWYgYXBwZW5kX3N1bSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoc3VtKG1hcChpbnQsIHRva2VucykpKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGFwcGVuZF9zdW0pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMScsIDQ0NF0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0LmFwcGVuZChpdGVtKQ0KDQogICAgZGVmIGV4dGVuZCggc2VsZiwgaXRlbXNlcSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNlcXVlbmNlIG9mIGVsZW1lbnRzIHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBhcHBlbmQgdGhlIHJldmVyc2Ugb2YgdGhlIG1hdGNoZWQgc3RyaW5ncywgdG8gbWFrZSBhIHBhbGluZHJvbWUNCiAgICAgICAgICAgIGRlZiBtYWtlX3BhbGluZHJvbWUodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHJldmVyc2VkKFt0Wzo6LTFdIGZvciB0IGluIHRva2Vuc10pKQ0KICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHRva2VucykNCiAgICAgICAgICAgIHByaW50KHBhdHQuYWRkUGFyc2VBY3Rpb24obWFrZV9wYWxpbmRyb21lKS5wYXJzZVN0cmluZygibHNrZGogc2Rsa2pmIGxrc2QiKSkgIyAtPiAnbHNrZGpzZGxramZsa3NkZHNrbGZqa2xkc2pka3NsJw0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtc2VxLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc2VsZiArPSBpdGVtc2VxDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdC5leHRlbmQoaXRlbXNlcSkNCg0KICAgIGRlZiBjbGVhciggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2xlYXIgYWxsIGVsZW1lbnRzIGFuZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0WzpdDQogICAgICAgIHNlbGYuX190b2tkaWN0LmNsZWFyKCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgbmFtZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQ0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIA0KICAgICAgICBpZiBuYW1lIGluIHNlbGYuX190b2tkaWN0Og0KICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W25hbWVdWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtuYW1lXSBdKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuICIiDQoNCiAgICBkZWYgX19hZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgcmV0ID0gc2VsZi5jb3B5KCkNCiAgICAgICAgcmV0ICs9IG90aGVyDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX2lhZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgb3RoZXIuX190b2tkaWN0Og0KICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX190b2tsaXN0KQ0KICAgICAgICAgICAgYWRkb2Zmc2V0ID0gbGFtYmRhIGE6IG9mZnNldCBpZiBhPDAgZWxzZSBhK29mZnNldA0KICAgICAgICAgICAgb3RoZXJpdGVtcyA9IG90aGVyLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICBvdGhlcmRpY3RpdGVtcyA9IFsoaywgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodlswXSxhZGRvZmZzZXQodlsxXSkpICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrLHZsaXN0KSBpbiBvdGhlcml0ZW1zIGZvciB2IGluIHZsaXN0XQ0KICAgICAgICAgICAgZm9yIGssdiBpbiBvdGhlcmRpY3RpdGVtczoNCiAgICAgICAgICAgICAgICBzZWxmW2tdID0gdg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodlswXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICB2WzBdLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCiAgICAgICAgICAgIA0KICAgICAgICBzZWxmLl9fdG9rbGlzdCArPSBvdGhlci5fX3Rva2xpc3QNCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKCBvdGhlci5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpIGFuZCBvdGhlciA9PSAwOg0KICAgICAgICAgICAgIyB1c2VmdWwgZm9yIG1lcmdpbmcgbWFueSBQYXJzZVJlc3VsdHMgdXNpbmcgc3VtKCkgYnVpbHRpbg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgVHlwZUVycm9yIC0gc28gYmUgaXQNCiAgICAgICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiKCVzLCAlcykiICUgKCByZXByKCBzZWxmLl9fdG9rbGlzdCApLCByZXByKCBzZWxmLl9fdG9rZGljdCApICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAnWycgKyAnLCAnLmpvaW4oX3VzdHIoaSkgaWYgaXNpbnN0YW5jZShpLCBQYXJzZVJlc3VsdHMpIGVsc2UgcmVwcihpKSBmb3IgaSBpbiBzZWxmLl9fdG9rbGlzdCkgKyAnXScNCg0KICAgIGRlZiBfYXNTdHJpbmdMaXN0KCBzZWxmLCBzZXA9JycgKToNCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fX3Rva2xpc3Q6DQogICAgICAgICAgICBpZiBvdXQgYW5kIHNlcDoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHNlcCkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoIGl0ZW0sIFBhcnNlUmVzdWx0cyApOg0KICAgICAgICAgICAgICAgIG91dCArPSBpdGVtLl9hc1N0cmluZ0xpc3QoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBfdXN0cihpdGVtKSApDQogICAgICAgIHJldHVybiBvdXQNCg0KICAgIGRlZiBhc0xpc3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgbGlzdCBvZiBtYXRjaGluZyB0b2tlbnMsIGFsbCBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gcGF0dC5wYXJzZVN0cmluZygic2xka2ogbHNka2ogc2xka2oiKQ0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCB0aGUgcmVzdWx0IHByaW50cyBpbiBzdHJpbmctbGlrZSBmb3JtLCBpdCBpcyBhY3R1YWxseSBhIHB5cGFyc2luZyBQYXJzZVJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVzdWx0KSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFVzZSBhc0xpc3QoKSB0byBjcmVhdGUgYW4gYWN0dWFsIGxpc3QNCiAgICAgICAgICAgIHJlc3VsdF9saXN0ID0gcmVzdWx0LmFzTGlzdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9saXN0KSwgcmVzdWx0X2xpc3QpICMgLT4gPGNsYXNzICdsaXN0Jz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gW3Jlcy5hc0xpc3QoKSBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpIGVsc2UgcmVzIGZvciByZXMgaW4gc2VsZi5fX3Rva2xpc3RdDQoNCiAgICBkZWYgYXNEaWN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBuYW1lZCBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGRpY3Rpb25hcnkuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXByKHJlc3VsdCkpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gKFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXSwgeydkYXknOiBbKCcxOTk5JywgNCldLCAneWVhcic6IFsoJzEyJywgMCldLCAnbW9udGgnOiBbKCczMScsIDIpXX0pDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdF9kaWN0ID0gcmVzdWx0LmFzRGljdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9kaWN0KSwgcmVwcihyZXN1bHRfZGljdCkpICMgLT4gPGNsYXNzICdkaWN0Jz4geydkYXknOiAnMTk5OScsICd5ZWFyJzogJzEyJywgJ21vbnRoJzogJzMxJ30NCg0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCBhIFBhcnNlUmVzdWx0cyBzdXBwb3J0cyBkaWN0LWxpa2UgYWNjZXNzLCBzb21ldGltZSB5b3UganVzdCBuZWVkIHRvIGhhdmUgYSBkaWN0DQogICAgICAgICAgICBpbXBvcnQganNvbg0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpKSAjIC0+IEV4Y2VwdGlvbjogVHlwZUVycm9yOiAuLi4gaXMgbm90IEpTT04gc2VyaWFsaXphYmxlDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdC5hc0RpY3QoKSkpICMgLT4geyJtb250aCI6ICIzMSIsICJkYXkiOiAiMTk5OSIsICJ5ZWFyIjogIjEyIn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIFBZXzM6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVtcw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlcml0ZW1zDQogICAgICAgICAgICANCiAgICAgICAgZGVmIHRvSXRlbShvYmopOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgb2JqLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hc0RpY3QoKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9JdGVtKHYpIGZvciB2IGluIG9ial0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIG9iag0KICAgICAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gZGljdCgoayx0b0l0ZW0odikpIGZvciBrLHYgaW4gaXRlbV9mbigpKQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgYSBuZXcgY29weSBvZiBhIEN7UGFyc2VSZXN1bHRzfSBvYmplY3QuDQogICAgICAgICIiIg0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMoIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgcmV0Ll9fdG9rZGljdCA9IHNlbGYuX190b2tkaWN0LmNvcHkoKQ0KICAgICAgICByZXQuX19wYXJlbnQgPSBzZWxmLl9fcGFyZW50DQogICAgICAgIHJldC5fX2FjY3VtTmFtZXMudXBkYXRlKCBzZWxmLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldC5fX25hbWUgPSBzZWxmLl9fbmFtZQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgYXNYTUwoIHNlbGYsIGRvY3RhZz1Ob25lLCBuYW1lZEl0ZW1zT25seT1GYWxzZSwgaW5kZW50PSIiLCBmb3JtYXR0ZWQ9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgKERlcHJlY2F0ZWQpIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgWE1MLiBUYWdzIGFyZSBjcmVhdGVkIGZvciB0b2tlbnMgYW5kIGxpc3RzIHRoYXQgaGF2ZSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBubCA9ICJcbiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbmFtZWRJdGVtcyA9IGRpY3QoKHZbMV0saykgZm9yIChrLHZsaXN0KSBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiB2bGlzdCkNCiAgICAgICAgbmV4dExldmVsSW5kZW50ID0gaW5kZW50ICsgIiAgIg0KDQogICAgICAgICMgY29sbGFwc2Ugb3V0IGluZGVudHMgaWYgZm9ybWF0dGluZyBpcyBub3QgZGVzaXJlZA0KICAgICAgICBpZiBub3QgZm9ybWF0dGVkOg0KICAgICAgICAgICAgaW5kZW50ID0gIiINCiAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCA9ICIiDQogICAgICAgICAgICBubCA9ICIiDQoNCiAgICAgICAgc2VsZlRhZyA9IE5vbmUNCiAgICAgICAgaWYgZG9jdGFnIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZlRhZyA9IGRvY3RhZw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9IHNlbGYuX19uYW1lDQoNCiAgICAgICAgaWYgbm90IHNlbGZUYWc6DQogICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9ICJJVEVNIg0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8Iiwgc2VsZlRhZywgIj4iIF0NCg0KICAgICAgICBmb3IgaSxyZXMgaW4gZW51bWVyYXRlKHNlbGYuX190b2tsaXN0KToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwobmFtZWRJdGVtc1tpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGluZGl2aWR1YWwgdG9rZW4sIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWUgZm9yIGl0DQogICAgICAgICAgICAgICAgcmVzVGFnID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gbmFtZWRJdGVtc1tpXQ0KICAgICAgICAgICAgICAgIGlmIG5vdCByZXNUYWc6DQogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9ICJJVEVNIg0KICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0ID0gX3htbF9lc2NhcGUoX3VzdHIocmVzKSkNCiAgICAgICAgICAgICAgICBvdXQgKz0gWyBubCwgbmV4dExldmVsSW5kZW50LCAiPCIsIHJlc1RhZywgIj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQm9keVRleHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC8iLCByZXNUYWcsICI+IiBdDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwvIiwgc2VsZlRhZywgIj4iIF0NCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIF9fbG9va3VwKHNlbGYsc3ViKToNCiAgICAgICAgZm9yIGssdmxpc3QgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciB2LGxvYyBpbiB2bGlzdDoNCiAgICAgICAgICAgICAgICBpZiBzdWIgaXMgdjoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsNCiAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBnZXROYW1lKHNlbGYpOg0KICAgICAgICByIiIiDQogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIA0KICAgICAgICBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgbWlnaHQgbWF0Y2ggYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIHNzbl9leHByID0gUmVnZXgociJcZFxkXGQtXGRcZC1cZFxkXGRcZCIpDQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIHVzZXJfZGF0YSA9IChHcm91cChob3VzZV9udW1iZXJfZXhwcikoImhvdXNlX251bWJlciIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChzc25fZXhwcikoInNzbiIpDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkNCiAgICAgICAgICAgIHVzZXJfaW5mbyA9IE9uZU9yTW9yZSh1c2VyX2RhdGEpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQ0KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcmVzdWx0Og0KICAgICAgICAgICAgICAgIHByaW50KGl0ZW0uZ2V0TmFtZSgpLCAnOicsIGl0ZW1bMF0pDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBhZ2UgOiAyMg0KICAgICAgICAgICAgc3NuIDogMTExLTIyLTMzMzMNCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUINCiAgICAgICAgIiIiDQogICAgICAgIGlmIHNlbGYuX19uYW1lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lDQogICAgICAgIGVsaWYgc2VsZi5fX3BhcmVudDoNCiAgICAgICAgICAgIHBhciA9IHNlbGYuX19wYXJlbnQoKQ0KICAgICAgICAgICAgaWYgcGFyOg0KICAgICAgICAgICAgICAgIHJldHVybiBwYXIuX19sb29rdXAoc2VsZikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgZWxpZiAobGVuKHNlbGYpID09IDEgYW5kDQogICAgICAgICAgICAgICBsZW4oc2VsZi5fX3Rva2RpY3QpID09IDEgYW5kDQogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOg0KICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC5rZXlzKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBkdW1wKHNlbGYsIGluZGVudD0nJywgZGVwdGg9MCwgZnVsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIERpYWdub3N0aWMgbWV0aG9kIGZvciBsaXN0aW5nIG91dCB0aGUgY29udGVudHMgb2YgYSBDe1BhcnNlUmVzdWx0c30uDQogICAgICAgIEFjY2VwdHMgYW4gb3B0aW9uYWwgQ3tpbmRlbnR9IGFyZ3VtZW50IHNvIHRoYXQgdGhpcyBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkDQogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddDQogICAgICAgICAgICAtIGRheTogMTk5OQ0KICAgICAgICAgICAgLSBtb250aDogMzENCiAgICAgICAgICAgIC0geWVhcjogMTINCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIE5MID0gJ1xuJw0KICAgICAgICBvdXQuYXBwZW5kKCBpbmRlbnQrX3VzdHIoc2VsZi5hc0xpc3QoKSkgKQ0KICAgICAgICBpZiBmdWxsOg0KICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoKHN0cihrKSwgdikgZm9yIGssdiBpbiBzZWxmLml0ZW1zKCkpDQogICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtczoNCiAgICAgICAgICAgICAgICAgICAgaWYgb3V0Og0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChOTCkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggIiVzJXMtICVzOiAiICUgKGluZGVudCwoJyAgJypkZXB0aCksIGspICkNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIHYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKF91c3RyKHYpKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQ0KICAgICAgICAgICAgZWxpZiBhbnkoaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpIGZvciB2diBpbiBzZWxmKToNCiAgICAgICAgICAgICAgICB2ID0gc2VsZg0KICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksdnYuZHVtcChpbmRlbnQsZGVwdGgrMSkgKSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLF91c3RyKHZ2KSkpDQogICAgICAgICAgICANCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIHBwcmludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUHJldHR5LXByaW50ZXIgZm9yIHBhcnNlZCByZXN1bHRzIGFzIGEgbGlzdCwgdXNpbmcgdGhlIEN7cHByaW50fSBtb2R1bGUuDQogICAgICAgIEFjY2VwdHMgYWRkaXRpb25hbCBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJncyBhcyBkZWZpbmVkIGZvciB0aGUgDQogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykNCiAgICAgICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGZ1bmMgPSBGb3J3YXJkKCkNCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpDQogICAgICAgICAgICBmdW5jIDw8PSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5wYXJzZVN0cmluZygiZm5hIGEsYiwoZm5iIGMsZCwyMDApLDEwMCIpDQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydmbmEnLA0KICAgICAgICAgICAgIFsnYScsDQogICAgICAgICAgICAgICdiJywNCiAgICAgICAgICAgICAgWycoJywgJ2ZuYicsIFsnYycsICdkJywgJzIwMCddLCAnKSddLA0KICAgICAgICAgICAgICAnMTAwJ11dDQogICAgICAgICIiIg0KICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuYXNMaXN0KCksICphcmdzLCAqKmt3YXJncykNCg0KICAgICMgYWRkIHN1cHBvcnQgZm9yIHBpY2tsZSBwcm90b2NvbA0KICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6DQogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LA0KICAgICAgICAgICAgICAgICAoIHNlbGYuX190b2tkaWN0LmNvcHkoKSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fcGFyZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9fcGFyZW50KCkgb3IgTm9uZSwNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywNCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSApICkNCg0KICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6DQogICAgICAgIHNlbGYuX190b2tsaXN0ID0gc3RhdGVbMF0NCiAgICAgICAgKHNlbGYuX190b2tkaWN0LA0KICAgICAgICAgcGFyLA0KICAgICAgICAgaW5BY2N1bU5hbWVzLA0KICAgICAgICAgc2VsZi5fX25hbWUpID0gc3RhdGVbMV0NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoaW5BY2N1bU5hbWVzKQ0KICAgICAgICBpZiBwYXIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCg0KICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0LCBzZWxmLl9fbmFtZSwgc2VsZi5fX2FzTGlzdCwgc2VsZi5fX21vZGFsDQoNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIChkaXIodHlwZShzZWxmKSkgKyBsaXN0KHNlbGYua2V5cygpKSkNCg0KTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoUGFyc2VSZXN1bHRzKQ0KDQpkZWYgY29sIChsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGNvbHVtbiB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICBzID0gc3RyZw0KICAgIHJldHVybiAxIGlmIDA8bG9jPGxlbihzKSBhbmQgc1tsb2MtMV0gPT0gJ1xuJyBlbHNlIGxvYyAtIHMucmZpbmQoIlxuIiwgMCwgbG9jKQ0KDQpkZWYgbGluZW5vKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHJldHVybiBzdHJnLmNvdW50KCJcbiIsMCxsb2MpICsgMQ0KDQpkZWYgbGluZSggbG9jLCBzdHJnICk6DQogICAgIiIiUmV0dXJucyB0aGUgbGluZSBvZiB0ZXh0IGNvbnRhaW5pbmcgbG9jIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgICAgICIiIg0KICAgIGxhc3RDUiA9IHN0cmcucmZpbmQoIlxuIiwgMCwgbG9jKQ0KICAgIG5leHRDUiA9IHN0cmcuZmluZCgiXG4iLCBsb2MpDQogICAgaWYgbmV4dENSID49IDA6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOm5leHRDUl0NCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdDQoNCmRlZiBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIgKToNCiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQ0KDQpkZWYgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24oIGluc3RyaW5nLCBzdGFydGxvYywgZW5kbG9jLCBleHByLCB0b2tzICk6DQogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkNCg0KZGVmIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24oIGluc3RyaW5nLCBsb2MsIGV4cHIsIGV4YyApOg0KICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkNCg0KZGVmIG51bGxEZWJ1Z0FjdGlvbigqYXJncyk6DQogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiINCiAgICBwYXNzDQoNCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMNCiN+ICdkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCiN+IGRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTMpOg0KICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgICN+IHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICAjfiBsaW1pdCA9IDANCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UNCiAgICAjfiBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgICN+IG5vbmxvY2FsIGxpbWl0LGZvdW5kQXJpdHkNCiAgICAgICAgI34gd2hpbGUgMToNCiAgICAgICAgICAgICN+IHRyeToNCiAgICAgICAgICAgICAgICAjfiByZXQgPSBmdW5jKCphcmdzW2xpbWl0Ol0pDQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUNCiAgICAgICAgICAgICAgICAjfiByZXR1cm4gcmV0DQogICAgICAgICAgICAjfiBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToNCiAgICAgICAgICAgICAgICAgICAgI34gcmFpc2UNCiAgICAgICAgICAgICAgICAjfiBsaW1pdCArPSAxDQogICAgICAgICAgICAgICAgI34gY29udGludWUNCiAgICAjfiByZXR1cm4gd3JhcHBlcg0KDQojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlDQonZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQpkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0yKToNCiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgbGltaXQgPSBbMF0NCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQ0KICAgIA0KICAgICMgdHJhY2ViYWNrIHJldHVybiBkYXRhIHN0cnVjdHVyZSBjaGFuZ2VkIGluIFB5My41IC0gbm9ybWFsaXplIGJhY2sgdG8gcGxhaW4gdHVwbGVzDQogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOg0KICAgICAgICBkZWYgZXh0cmFjdF9zdGFjayhsaW1pdD0wKToNCiAgICAgICAgICAgICMgc3BlY2lhbCBoYW5kbGluZyBmb3IgUHl0aG9uIDMuNS4wIC0gZXh0cmEgZGVlcCBjYWxsIHN0YWNrIGJ5IDENCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMg0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGxpbWl0PS1vZmZzZXQrbGltaXQtMSlbb2Zmc2V0XQ0KICAgICAgICAgICAgcmV0dXJuIFtmcmFtZV9zdW1tYXJ5WzoyXV0NCiAgICAgICAgZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0PTApOg0KICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQ0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0NCiAgICAgICAgICAgIHJldHVybiBbZnJhbWVfc3VtbWFyeVs6Ml1dDQogICAgZWxzZToNCiAgICAgICAgZXh0cmFjdF9zdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrDQogICAgICAgIGV4dHJhY3RfdGIgPSB0cmFjZWJhY2suZXh0cmFjdF90Yg0KICAgIA0KICAgICMgc3ludGhlc2l6ZSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrIGF0IHRoZSBjYWxsIHRvIA0KICAgICMgdXNlcidzIHBhcnNlIGFjdGlvbiAnZnVuYycsIHNvIHRoYXQgd2UgZG9uJ3QgaW5jdXIgY2FsbCBwZW5hbHR5IGF0IHBhcnNlIHRpbWUNCiAgICANCiAgICBMSU5FX0RJRkYgPSA2DQogICAgIyBJRiBBTlkgQ09ERSBDSEFOR0VTLCBFVkVOIEpVU1QgQ09NTUVOVFMgT1IgQkxBTksgTElORVMsIEJFVFdFRU4gVEhFIE5FWFQgTElORSBBTkQgDQogICAgIyBUSEUgQ0FMTCBUTyBGVU5DIElOU0lERSBXUkFQUEVSLCBMSU5FX0RJRkYgTVVTVCBCRSBNT0RJRklFRCEhISENCiAgICB0aGlzX2xpbmUgPSBleHRyYWN0X3N0YWNrKGxpbWl0PTIpWy0xXQ0KICAgIHBhX2NhbGxfbGluZV9zeW50aCA9ICh0aGlzX2xpbmVbMF0sIHRoaXNfbGluZVsxXStMSU5FX0RJRkYpDQoNCiAgICBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZnVuYygqYXJnc1tsaW1pdFswXTpdKQ0KICAgICAgICAgICAgICAgIGZvdW5kQXJpdHlbMF0gPSBUcnVlDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjIHJlLXJhaXNlIFR5cGVFcnJvcnMgaWYgdGhleSBkaWQgbm90IGNvbWUgZnJvbSBvdXIgYXJpdHkgdGVzdGluZw0KICAgICAgICAgICAgICAgIGlmIGZvdW5kQXJpdHlbMF06DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVstMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRyYWN0X3RiKHRiLCBsaW1pdD0yKVstMV1bOjJdID09IHBhX2NhbGxfbGluZV9zeW50aDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHRiDQoNCiAgICAgICAgICAgICAgICBpZiBsaW1pdFswXSA8PSBtYXhhcmdzOg0KICAgICAgICAgICAgICAgICAgICBsaW1pdFswXSArPSAxDQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICMgY29weSBmdW5jIG5hbWUgdG8gd3JhcHBlciBmb3Igc2Vuc2libGUgZGVidWcgb3V0cHV0DQogICAgZnVuY19uYW1lID0gIjxwYXJzZSBhY3Rpb24+Ig0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gd3JhcHBlcg0KDQpjbGFzcyBQYXJzZXJFbGVtZW50KG9iamVjdCk6DQogICAgIiIiQWJzdHJhY3QgYmFzZSBsZXZlbCBwYXJzZXIgZWxlbWVudCBjbGFzcy4iIiINCiAgICBERUZBVUxUX1dISVRFX0NIQVJTID0gIiBcblx0XHIiDQogICAgdmVyYm9zZV9zdGFja3RyYWNlID0gRmFsc2UNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycyggY2hhcnMgKToNCiAgICAgICAgciIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMgYXJlIHNwYWNlLCA8VEFCPiBhbmQgbmV3bGluZQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJ2prbCddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgY2hhbmdlIHRvIGp1c3QgdHJlYXQgbmV3bGluZSBhcyBzaWduaWZpY2FudA0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5zZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCIgXHQiKQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTID0gY2hhcnMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgaW5saW5lTGl0ZXJhbHNVc2luZyhjbHMpOg0KICAgICAgICAiIiINCiAgICAgICAgU2V0IGNsYXNzIHRvIGJlIHVzZWQgZm9yIGluY2x1c2lvbiBvZiBzdHJpbmcgbGl0ZXJhbHMgaW50byBhIHBhcnNlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IGxpdGVyYWwgY2xhc3MgdXNlZCBpcyBMaXRlcmFsDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQoNCiAgICAgICAgICAgICMgY2hhbmdlIHRvIFN1cHByZXNzDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LmlubGluZUxpdGVyYWxzVXNpbmcoU3VwcHJlc3MpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJzEyJywgJzMxJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IGNscw0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdCgpDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IE5vbmUNCiAgICAgICAgI34gc2VsZi5uYW1lID0gIjx1bmtub3duPiIgICMgZG9uJ3QgZGVmaW5lIHNlbGYubmFtZSwgbGV0IHN1YmNsYXNzZXMgdHJ5L2V4Y2VwdCB1cGNhbGwNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLnJlc3VsdHNOYW1lID0gTm9uZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzYXZlbGlzdA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBUcnVlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZSAjIHVzZWQgd2hlbiBjaGVja2luZyBmb3IgbGVmdC1yZWN1cnNpb24NCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IEZhbHNlDQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMgPSBsaXN0KCkNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBUcnVlICMgdXNlZCB0byBvcHRpbWl6ZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBhZHZhbmNlIHBhcnNlIGluZGV4DQogICAgICAgIHNlbGYuZXJybXNnID0gIiINCiAgICAgICAgc2VsZi5tb2RhbFJlc3VsdHMgPSBUcnVlICMgdXNlZCB0byBtYXJrIHJlc3VsdHMgbmFtZXMgYXMgbW9kYWwgKHJlcG9ydCBvbmx5IGxhc3QpIG9yIGN1bXVsYXRpdmUgKGxpc3QgYWxsKQ0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9ICggTm9uZSwgTm9uZSwgTm9uZSApICNjdXN0b20gZGVidWcgYWN0aW9ucw0KICAgICAgICBzZWxmLnJlID0gTm9uZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUgIyB1c2VkIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxscyB0byBwcmVQYXJzZQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBGYWxzZQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ha2UgYSBjb3B5IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fS4gIFVzZWZ1bCBmb3IgZGVmaW5pbmcgZGlmZmVyZW50IHBhcnNlIGFjdGlvbnMNCiAgICAgICAgZm9yIHRoZSBzYW1lIHBhcnNpbmcgcGF0dGVybiwgdXNpbmcgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZSBlbGVtZW50Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgaW50ZWdlcksgPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KSArIFN1cHByZXNzKCJLIikNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKGludGVnZXJLIHwgaW50ZWdlck0gfCBpbnRlZ2VyKS5wYXJzZVN0cmluZygiNUsgMTAwIDY0MEsgMjU2TSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWzUxMjAsIDEwMCwgNjU1MzYwLCAyNjg0MzU0NTZdDQogICAgICAgIEVxdWl2YWxlbnQgZm9ybSBvZiBDe2V4cHIuY29weSgpfSBpcyBqdXN0IEN7ZXhwcigpfTo6DQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAiIiINCiAgICAgICAgY3B5ID0gY29weS5jb3B5KCBzZWxmICkNCiAgICAgICAgY3B5LnBhcnNlQWN0aW9uID0gc2VsZi5wYXJzZUFjdGlvbls6XQ0KICAgICAgICBjcHkuaWdub3JlRXhwcnMgPSBzZWxmLmlnbm9yZUV4cHJzWzpdDQogICAgICAgIGlmIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzOg0KICAgICAgICAgICAgY3B5LndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGNweQ0KDQogICAgZGVmIHNldE5hbWUoIHNlbGYsIG5hbWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciB0aGlzIGV4cHJlc3Npb24sIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGNsZWFyZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQobnVtcykucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJleGNlcHRpb24iKToNCiAgICAgICAgICAgIHNlbGYuZXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgcmVmZXJlbmNpbmcgbWF0Y2hpbmcgdG9rZW5zIGFzIGEgbmVzdGVkIGF0dHJpYnV0ZQ0KICAgICAgICBvZiB0aGUgcmV0dXJuZWQgcGFyc2UgcmVzdWx0cy4NCiAgICAgICAgTk9URTogdGhpcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBvcmlnaW5hbCBDe1BhcnNlckVsZW1lbnR9IG9iamVjdDsNCiAgICAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZSBhIGJhc2ljIGVsZW1lbnQsIHN1Y2ggYXMgYW4NCiAgICAgICAgaW50ZWdlciwgYW5kIHJlZmVyZW5jZSBpdCBpbiBtdWx0aXBsZSBwbGFjZXMgd2l0aCBkaWZmZXJlbnQgbmFtZXMuDQoNCiAgICAgICAgWW91IGNhbiBhbHNvIHNldCByZXN1bHRzIG5hbWVzIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsDQogICAgICAgIEN7ZXhwcigibmFtZSIpfSBpbiBwbGFjZSBvZiBDe2V4cHIuc2V0UmVzdWx0c05hbWUoIm5hbWUiKX0gLSANCiAgICAgICAgc2VlIEx7SXtfX2NhbGxfX308X19jYWxsX18+fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQoNCiAgICAgICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgIiIiDQogICAgICAgIG5ld3NlbGYgPSBzZWxmLmNvcHkoKQ0KICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCIqIik6DQogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTFdDQogICAgICAgICAgICBsaXN0QWxsTWF0Y2hlcz1UcnVlDQogICAgICAgIG5ld3NlbGYucmVzdWx0c05hbWUgPSBuYW1lDQogICAgICAgIG5ld3NlbGYubW9kYWxSZXN1bHRzID0gbm90IGxpc3RBbGxNYXRjaGVzDQogICAgICAgIHJldHVybiBuZXdzZWxmDQoNCiAgICBkZWYgc2V0QnJlYWsoc2VsZixicmVha0ZsYWcgPSBUcnVlKToNCiAgICAgICAgIiIiTWV0aG9kIHRvIGludm9rZSB0aGUgUHl0aG9uIHBkYiBkZWJ1Z2dlciB3aGVuIHRoaXMgZWxlbWVudCBpcw0KICAgICAgICAgICBhYm91dCB0byBiZSBwYXJzZWQuIFNldCBDe2JyZWFrRmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvDQogICAgICAgICAgIGRpc2FibGUuDQogICAgICAgICIiIg0KICAgICAgICBpZiBicmVha0ZsYWc6DQogICAgICAgICAgICBfcGFyc2VNZXRob2QgPSBzZWxmLl9wYXJzZQ0KICAgICAgICAgICAgZGVmIGJyZWFrZXIoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlKToNCiAgICAgICAgICAgICAgICBpbXBvcnQgcGRiDQogICAgICAgICAgICAgICAgcGRiLnNldF90cmFjZSgpDQogICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJzZU1ldGhvZCggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UgKQ0KICAgICAgICAgICAgYnJlYWtlci5fb3JpZ2luYWxQYXJzZU1ldGhvZCA9IF9wYXJzZU1ldGhvZA0KICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBicmVha2VyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcnNlLCJfb3JpZ2luYWxQYXJzZU1ldGhvZCIpOg0KICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2UuX29yaWdpbmFsUGFyc2VNZXRob2QNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBvbmUgb3IgbW9yZSBhY3Rpb25zIHRvIHBlcmZvcm0gd2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgcGFyc2UgZWxlbWVudCBkZWZpbml0aW9uLg0KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sDQogICAgICAgIEN7Zm4obG9jLHRva3MpfSwgQ3tmbih0b2tzKX0sIG9yIGp1c3QgQ3tmbigpfSwgd2hlcmU6DQogICAgICAgICAtIHMgICA9IHRoZSBvcmlnaW5hbCBzdHJpbmcgYmVpbmcgcGFyc2VkIChzZWUgbm90ZSBiZWxvdykNCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcNCiAgICAgICAgIC0gdG9rcyA9IGEgbGlzdCBvZiB0aGUgbWF0Y2hlZCB0b2tlbnMsIHBhY2thZ2VkIGFzIGEgQ3tMe1BhcnNlUmVzdWx0c319IG9iamVjdA0KICAgICAgICBJZiB0aGUgZnVuY3Rpb25zIGluIGZucyBtb2RpZnkgdGhlIHRva2VucywgdGhleSBjYW4gcmV0dXJuIHRoZW0gYXMgdGhlIHJldHVybg0KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuDQogICAgICAgIE90aGVyd2lzZSwgZm4gZG9lcyBub3QgbmVlZCB0byByZXR1cm4gYW55IHZhbHVlLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBjYWxsRHVyaW5nVHJ5ID0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlIGlmIHBhcnNlIGFjdGlvbiBzaG91bGQgYmUgcnVuIGR1cmluZyBsb29rYWhlYWRzIGFuZCBhbHRlcm5hdGUgdGVzdGluZw0KDQogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgICAgICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgICAgICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCg0KICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgIyBub3RlIHRoYXQgaW50ZWdlciBmaWVsZHMgYXJlIG5vdyBpbnRzLCBub3Qgc3RyaW5ncw0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbMTk5OSwgJy8nLCAxMiwgJy8nLCAzMV0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0ga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGFkZFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIG9uZSBvciBtb3JlIHBhcnNlIGFjdGlvbnMgdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4NCiAgICAgICAgDQogICAgICAgIFNlZSBleGFtcGxlcyBpbiBMe0l7Y29weX08Y29weT59Lg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRDb25kaXRpb24oc2VsZiwgKmZucywgKiprd2FyZ3MpOg0KICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgDQogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIA0KICAgICAgICBmdW5jdGlvbnMgcGFzc2VkIHRvIEN7YWRkQ29uZGl0aW9ufSBuZWVkIHRvIHJldHVybiBib29sZWFuIHN1Y2Nlc3MvZmFpbCBvZiB0aGUgY29uZGl0aW9uLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBtZXNzYWdlID0gZGVmaW5lIGEgY3VzdG9tIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgcmFpc2VkIGV4Y2VwdGlvbg0KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpDQogICAgICAgICAgICB5ZWFyX2ludC5hZGRDb25kaXRpb24obGFtYmRhIHRva3M6IHRva3NbMF0gPj0gMjAwMCwgbWVzc2FnZT0iT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIikNCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IEV4Y2VwdGlvbjogT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQ0KICAgICAgICBleGNfdHlwZSA9IFBhcnNlRmF0YWxFeGNlcHRpb24gaWYga3dhcmdzLmdldCgiZmF0YWwiLCBGYWxzZSkgZWxzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICBmb3IgZm4gaW4gZm5zOg0KICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgICAgICAgICBpZiBub3QgYm9vbChfdHJpbV9hcml0eShmbikocyxsLHQpKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykNCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldEZhaWxBY3Rpb24oIHNlbGYsIGZuICk6DQogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4NCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cw0KICAgICAgICAgICBDe2ZuKHMsbG9jLGV4cHIsZXJyKX0gd2hlcmU6DQogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkDQogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkDQogICAgICAgICAgICAtIGV4cHIgPSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB0aGF0IGZhaWxlZA0KICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bg0KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19DQogICAgICAgICAgIGlmIGl0IGlzIGRlc2lyZWQgdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5LiIiIg0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbg0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBleHByc0ZvdW5kOg0KICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KDQogICAgICAgIGlmIHNlbGYuc2tpcFdoaXRlc3BhY2U6DQogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycw0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiB3dDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgX3BhcnNlTm9DYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmcgb3Igc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzBdKCBpbnN0cmluZywgbG9jLCBzZWxmICkNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAjfiBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiwgZXJyKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIGlmIHNlbGYubWF5SW5kZXhFcnJvciBvciBwcmVsb2MgPj0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCg0KICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkNCg0KICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6DQogICAgICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaGVkIixzZWxmLCItPiIscmV0VG9rZW5zLmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzFdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMV0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgbG9jLCBzZWxmLCByZXRUb2tlbnMgKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldFRva2Vucw0KDQogICAgZGVmIHRyeVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPUZhbHNlIClbMF0NCiAgICAgICAgZXhjZXB0IFBhcnNlRmF0YWxFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgDQogICAgZGVmIGNhblBhcnNlTmV4dChzZWxmLCBpbnN0cmluZywgbG9jKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi50cnlQYXJzZShpbnN0cmluZywgbG9jKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCg0KICAgIGNsYXNzIF9VbmJvdW5kZWRDYWNoZShvYmplY3QpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZik6DQogICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KDQogICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZGVmIGNhY2hlX2xlbihzZWxmKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGNhY2hlKQ0KDQogICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9waXRlbShGYWxzZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICBlbHNlOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgICAgIGtleV9maWZvID0gY29sbGVjdGlvbnMuZGVxdWUoW10sIHNpemUpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKGtleV9maWZvKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5hcHBlbmQoa2V5KQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIGRlZiBjYWNoZV9sZW4oc2VsZik6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsZW4oY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5fX2xlbl9fID0gdHlwZXMuTWV0aG9kVHlwZShjYWNoZV9sZW4sIHNlbGYpDQoNCiAgICAjIGFyZ3VtZW50IGNhY2hlIGZvciBvcHRpbWl6aW5nIHJlcGVhdGVkIGNhbGxzIHdoZW4gYmFja3RyYWNraW5nIHRocm91Z2ggcmVjdXJzaXZlIGV4cHJlc3Npb25zDQogICAgcGFja3JhdF9jYWNoZSA9IHt9ICMgdGhpcyBpcyBzZXQgbGF0ZXIgYnkgZW5hYmxlZFBhY2tyYXQoKTsgdGhpcyBpcyBoZXJlIHNvIHRoYXQgcmVzZXRDYWNoZSgpIGRvZXNuJ3QgZmFpbA0KICAgIHBhY2tyYXRfY2FjaGVfbG9jayA9IFJMb2NrKCkNCiAgICBwYWNrcmF0X2NhY2hlX3N0YXRzID0gWzAsIDBdDQoNCiAgICAjIHRoaXMgbWV0aG9kIGdldHMgcmVwZWF0ZWRseSBjYWxsZWQgZHVyaW5nIGJhY2t0cmFja2luZyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyAtDQogICAgIyB3ZSBjYW4gY2FjaGUgdGhlc2UgYXJndW1lbnRzIGFuZCBzYXZlIG91cnNlbHZlcyB0aGUgdHJvdWJsZSBvZiByZS1wYXJzaW5nIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbg0KICAgIGRlZiBfcGFyc2VDYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIEhJVCwgTUlTUyA9IDAsIDENCiAgICAgICAgbG9va3VwID0gKHNlbGYsIGluc3RyaW5nLCBsb2MsIGNhbGxQcmVQYXJzZSwgZG9BY3Rpb25zKQ0KICAgICAgICB3aXRoIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9sb2NrOg0KICAgICAgICAgICAgY2FjaGUgPSBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUNCiAgICAgICAgICAgIHZhbHVlID0gY2FjaGUuZ2V0KGxvb2t1cCkNCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIGNhY2hlLm5vdF9pbl9jYWNoZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbTUlTU10gKz0gMQ0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9wYXJzZU5vQ2FjaGUoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiwgd2l0aG91dCB0aGUgdHJhY2ViYWNrDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsIHBlLl9fY2xhc3NfXygqcGUuYXJncykpDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW0hJVF0gKz0gMQ0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEV4Y2VwdGlvbik6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlDQogICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKQ0KDQogICAgX3BhcnNlID0gX3BhcnNlTm9DYWNoZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiByZXNldENhY2hlKCk6DQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZS5jbGVhcigpDQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1s6XSA9IFswXSAqIGxlbihQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHMpDQoNCiAgICBfcGFja3JhdEVuYWJsZWQgPSBGYWxzZQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgZW5hYmxlUGFja3JhdChjYWNoZV9zaXplX2xpbWl0PTEyOCk6DQogICAgICAgICIiIkVuYWJsZXMgInBhY2tyYXQiIHBhcnNpbmcsIHdoaWNoIGFkZHMgbWVtb2l6aW5nIHRvIHRoZSBwYXJzaW5nIGxvZ2ljLg0KICAgICAgICAgICBSZXBlYXRlZCBwYXJzZSBhdHRlbXB0cyBhdCB0aGUgc2FtZSBzdHJpbmcgbG9jYXRpb24gKHdoaWNoIGhhcHBlbnMNCiAgICAgICAgICAgb2Z0ZW4gaW4gbWFueSBjb21wbGV4IGdyYW1tYXJzKSBjYW4gaW1tZWRpYXRlbHkgcmV0dXJuIGEgY2FjaGVkIHZhbHVlLA0KICAgICAgICAgICBpbnN0ZWFkIG9mIHJlLWV4ZWN1dGluZyBwYXJzaW5nL3ZhbGlkYXRpbmcgY29kZS4gIE1lbW9pemluZyBpcyBkb25lIG9mDQogICAgICAgICAgIGJvdGggdmFsaWQgcmVzdWx0cyBhbmQgcGFyc2luZyBleGNlcHRpb25zLg0KICAgICAgICAgICANCiAgICAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgICAgIC0gY2FjaGVfc2l6ZV9saW1pdCAtIChkZWZhdWx0PUN7MTI4fSkgLSBpZiBhbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkDQogICAgICAgICAgICAgIHdpbGwgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBhY2tyYXQgY2FjaGU7IGlmIE5vbmUgaXMgcGFzc2VkLCB0aGVuDQogICAgICAgICAgICAgIHRoZSBjYWNoZSBzaXplIHdpbGwgYmUgdW5ib3VuZGVkOyBpZiAwIGlzIHBhc3NlZCwgdGhlIGNhY2hlIHdpbGwNCiAgICAgICAgICAgICAgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQuDQogICAgICAgICAgICANCiAgICAgICAgICAgVGhpcyBzcGVlZHVwIG1heSBicmVhayBleGlzdGluZyBwcm9ncmFtcyB0aGF0IHVzZSBwYXJzZSBhY3Rpb25zIHRoYXQNCiAgICAgICAgICAgaGF2ZSBzaWRlLWVmZmVjdHMuICBGb3IgdGhpcyByZWFzb24sIHBhY2tyYXQgcGFyc2luZyBpcyBkaXNhYmxlZCB3aGVuDQogICAgICAgICAgIHlvdSBmaXJzdCBpbXBvcnQgcHlwYXJzaW5nLiAgVG8gYWN0aXZhdGUgdGhlIHBhY2tyYXQgZmVhdHVyZSwgeW91cg0KICAgICAgICAgICBwcm9ncmFtIG11c3QgY2FsbCB0aGUgY2xhc3MgbWV0aG9kIEN7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCl9LiAgSWYNCiAgICAgICAgICAgeW91ciBwcm9ncmFtIHVzZXMgQ3twc3ljb30gdG8gImNvbXBpbGUgYXMgeW91IGdvIiwgeW91IG11c3QgY2FsbA0KICAgICAgICAgICBDe2VuYWJsZVBhY2tyYXR9IGJlZm9yZSBjYWxsaW5nIEN7cHN5Y28uZnVsbCgpfS4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywNCiAgICAgICAgICAgUHl0aG9uIHdpbGwgY3Jhc2guICBGb3IgYmVzdCByZXN1bHRzLCBjYWxsIEN7ZW5hYmxlUGFja3JhdCgpfSBpbW1lZGlhdGVseQ0KICAgICAgICAgICBhZnRlciBpbXBvcnRpbmcgcHlwYXJzaW5nLg0KICAgICAgICAgICANCiAgICAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAgICBpbXBvcnQgcHlwYXJzaW5nDQogICAgICAgICAgICAgICBweXBhcnNpbmcuUGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCkNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgY2FjaGVfc2l6ZV9saW1pdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX1VuYm91bmRlZENhY2hlKCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fRmlmb0NhY2hlKGNhY2hlX3NpemVfbGltaXQpDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYXJzZSA9IFBhcnNlckVsZW1lbnQuX3BhcnNlQ2FjaGUNCg0KICAgIGRlZiBwYXJzZVN0cmluZyggc2VsZiwgaW5zdHJpbmcsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy4NCiAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIGNsaWVudCBjb2RlLCBvbmNlIHRoZSBjb21wbGV0ZQ0KICAgICAgICBleHByZXNzaW9uIGhhcyBiZWVuIGJ1aWx0Lg0KDQogICAgICAgIElmIHlvdSB3YW50IHRoZSBncmFtbWFyIHRvIHJlcXVpcmUgdGhhdCB0aGUgZW50aXJlIGlucHV0IHN0cmluZyBiZQ0KICAgICAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGVuIHNldCBDe3BhcnNlQWxsfSB0byBUcnVlIChlcXVpdmFsZW50IHRvIGVuZGluZw0KICAgICAgICB0aGUgZ3JhbW1hciB3aXRoIEN7THtTdHJpbmdFbmQoKX19KS4NCg0KICAgICAgICBOb3RlOiBDe3BhcnNlU3RyaW5nfSBpbXBsaWNpdGx5IGNhbGxzIEN7ZXhwYW5kdGFicygpfSBvbiB0aGUgaW5wdXQgc3RyaW5nLA0KICAgICAgICBpbiBvcmRlciB0byByZXBvcnQgcHJvcGVyIGNvbHVtbiBudW1iZXJzIGluIHBhcnNlIGFjdGlvbnMuDQogICAgICAgIElmIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgdGFicyBhbmQNCiAgICAgICAgdGhlIGdyYW1tYXIgdXNlcyBwYXJzZSBhY3Rpb25zIHRoYXQgdXNlIHRoZSBDe2xvY30gYXJndW1lbnQgdG8gaW5kZXggaW50byB0aGUNCiAgICAgICAgc3RyaW5nIGJlaW5nIHBhcnNlZCwgeW91IGNhbiBlbnN1cmUgeW91IGhhdmUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGlucHV0DQogICAgICAgIHN0cmluZyBieToNCiAgICAgICAgIC0gY2FsbGluZyBDe3BhcnNlV2l0aFRhYnN9IG9uIHlvdXIgZ3JhbW1hciBiZWZvcmUgY2FsbGluZyBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICAgICAoc2VlIEx7SXtwYXJzZVdpdGhUYWJzfTxwYXJzZVdpdGhUYWJzPn0pDQogICAgICAgICAtIGRlZmluZSB5b3VyIHBhcnNlIGFjdGlvbiB1c2luZyB0aGUgZnVsbCBDeyhzLGxvYyx0b2tzKX0gc2lnbmF0dXJlLCBhbmQNCiAgICAgICAgICAgcmVmZXJlbmNlIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHBhcnNlIGFjdGlvbidzIEN7c30gYXJndW1lbnQNCiAgICAgICAgIC0gZXhwbGljdGx5IGV4cGFuZCB0aGUgdGFicyBpbiB5b3VyIGlucHV0IHN0cmluZyBiZWZvcmUgY2FsbGluZw0KICAgICAgICAgICBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScpICAjIC0+IFsnYWFhYWEnXQ0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnLCBwYXJzZUFsbD1UcnVlKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGVuZCBvZiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgICAgICAjfiBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gaW5zdHJpbmcuZXhwYW5kdGFicygpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCAwICkNCiAgICAgICAgICAgIGlmIHBhcnNlQWxsOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIHNlID0gRW1wdHkoKSArIFN0cmluZ0VuZCgpDQogICAgICAgICAgICAgICAgc2UuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KDQogICAgZGVmIHNjYW5TdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5ULCBvdmVybGFwPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBTY2FuIHRoZSBpbnB1dCBzdHJpbmcgZm9yIGV4cHJlc3Npb24gbWF0Y2hlcy4gIEVhY2ggbWF0Y2ggd2lsbCByZXR1cm4gdGhlDQogICAgICAgIG1hdGNoaW5nIHRva2Vucywgc3RhcnQgbG9jYXRpb24sIGFuZCBlbmQgbG9jYXRpb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzY2FubmluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuICBJZg0KICAgICAgICBDe292ZXJsYXB9IGlzIHNwZWNpZmllZCwgdGhlbiBvdmVybGFwcGluZyBtYXRjaGVzIHdpbGwgYmUgcmVwb3J0ZWQuDQoNCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucyBhcmUgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gdGhlIHN0cmluZw0KICAgICAgICBiZWluZyBwYXJzZWQuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhcnNpbmcNCiAgICAgICAgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIHRhYnMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBzb3VyY2UgPSAic2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3Ig0KICAgICAgICAgICAgcHJpbnQoc291cmNlKQ0KICAgICAgICAgICAgZm9yIHRva2VucyxzdGFydCxlbmQgaW4gV29yZChhbHBoYXMpLnNjYW5TdHJpbmcoc291cmNlKToNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyAnXicqKGVuZC1zdGFydCkpDQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgdG9rZW5zWzBdKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgDQogICAgICAgICAgICBzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODcNCiAgICAgICAgICAgIF5eXl5eDQogICAgICAgICAgICBzbGRqZg0KICAgICAgICAgICAgICAgICAgICBeXl5eXl5eDQogICAgICAgICAgICAgICAgICAgIGxzZGpqa2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xka2pmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxranNmZA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gX3VzdHIoaW5zdHJpbmcpLmV4cGFuZHRhYnMoKQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbG9jID0gMA0KICAgICAgICBwcmVwYXJzZUZuID0gc2VsZi5wcmVQYXJzZQ0KICAgICAgICBwYXJzZUZuID0gc2VsZi5fcGFyc2UNCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgbWF0Y2hlcyA9IDANCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2hpbGUgbG9jIDw9IGluc3RybGVuIGFuZCBtYXRjaGVzIDwgbWF4TWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICBuZXh0TG9jLHRva2VucyA9IHBhcnNlRm4oIGluc3RyaW5nLCBwcmVsb2MsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGlmIG5leHRMb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VucywgcHJlbG9jLCBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdmVybGFwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0bG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHRyYW5zZm9ybVN0cmluZyggc2VsZiwgaW5zdHJpbmcgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCB0byBtb2RpZnkgbWF0Y2hpbmcgdGV4dCB3aXRoIG1vZGlmaWVkIHRva2VucyB0aGF0IG1heQ0KICAgICAgICBiZSByZXR1cm5lZCBmcm9tIGEgcGFyc2UgYWN0aW9uLiAgVG8gdXNlIEN7dHJhbnNmb3JtU3RyaW5nfSwgZGVmaW5lIGEgZ3JhbW1hciBhbmQNCiAgICAgICAgYXR0YWNoIGEgcGFyc2UgYWN0aW9uIHRvIGl0IHRoYXQgbW9kaWZpZXMgdGhlIHJldHVybmVkIHRva2VuIGxpc3QuDQogICAgICAgIEludm9raW5nIEN7dHJhbnNmb3JtU3RyaW5nKCl9IG9uIGEgdGFyZ2V0IHN0cmluZyB3aWxsIHRoZW4gc2NhbiBmb3IgbWF0Y2hlcywNCiAgICAgICAgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgdGV4dCBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gdGhlIGxvZ2ljIGluIHRoZSBwYXJzZQ0KICAgICAgICBhY3Rpb24uICBDe3RyYW5zZm9ybVN0cmluZygpfSByZXR1cm5zIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgd2Quc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0udGl0bGUoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQod2QudHJhbnNmb3JtU3RyaW5nKCJub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrLiIpKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yay4NCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGxhc3RFID0gMA0KICAgICAgICAjIGZvcmNlIHByZXNlcnZhdGlvbiBvZiA8VEFCPnMsIHRvIG1pbmltaXplIHVud2FudGVkIHRyYW5zZm9ybWF0aW9uIG9mIHN0cmluZywgYW5kIHRvDQogICAgICAgICMga2VlcCBzdHJpbmcgbG9jcyBzdHJhaWdodCBiZXR3ZWVuIHRyYW5zZm9ybVN0cmluZyBhbmQgc2NhblN0cmluZw0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZyApOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIGluc3RyaW5nW2xhc3RFOnNdICkNCiAgICAgICAgICAgICAgICBpZiB0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0LmFzTGlzdCgpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LGxpc3QpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBsYXN0RSA9IGUNCiAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdHJpbmdbbGFzdEU6XSkNCiAgICAgICAgICAgIG91dCA9IFtvIGZvciBvIGluIG91dCBpZiBvXQ0KICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obWFwKF91c3RyLF9mbGF0dGVuKG91dCkpKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc2VhcmNoU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCApOg0KICAgICAgICAiIiINCiAgICAgICAgQW5vdGhlciBleHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgc2ltcGxpZnlpbmcgdGhlIGFjY2VzcyB0byB0aGUgdG9rZW5zIGZvdW5kDQogICAgICAgIHRvIG1hdGNoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2VhcmNoaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBhIGNhcGl0YWxpemVkIHdvcmQgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzDQogICAgICAgICAgICBjYXBfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpDQoNCiAgICAgICAgICAgICMgdGhlIHN1bSgpIGJ1aWx0aW4gY2FuIGJlIHVzZWQgdG8gbWVyZ2UgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIFBhcnNlUmVzdWx0cyBvYmplY3QNCiAgICAgICAgICAgIHByaW50KHN1bShjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW1snTW9yZSddLCBbJ0lyb24nXSwgWydMZWFkJ10sIFsnR29sZCddLCBbJ0knXSwgWydFbGVjdHJpY2l0eSddXQ0KICAgICAgICAgICAgWydNb3JlJywgJ0lyb24nLCAnTGVhZCcsICdHb2xkJywgJ0knLCAnRWxlY3RyaWNpdHknXQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHQgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcsIG1heE1hdGNoZXMgKSBdKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBHZW5lcmF0b3IgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBleHByZXNzaW9uIGFzIGEgc2VwYXJhdG9yLg0KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOw0KICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIEN7aW5jbHVkZVNlcGFyYXRvcnN9IGFyZ3VtZW50IChkZWZhdWx0PUN7RmFsc2V9KSwgaWYgdGhlIHNlcGFyYXRpbmcNCiAgICAgICAgbWF0Y2hpbmcgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNwbGl0IHJlc3VsdHMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjogICAgICAgIA0KICAgICAgICAgICAgcHVuYyA9IG9uZU9mKGxpc3QoIi4sOzovLSE/IikpDQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnVGhpcycsICcgdGhpcycsICcnLCAnIHRoaXMgc2VudGVuY2UnLCAnIGlzIGJhZGx5IHB1bmN0dWF0ZWQnLCAnJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNwbGl0cyA9IDANCiAgICAgICAgbGFzdCA9IDANCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6DQogICAgICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0OnNdDQogICAgICAgICAgICBpZiBpbmNsdWRlU2VwYXJhdG9yczoNCiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdDQogICAgICAgICAgICBsYXN0ID0gZQ0KICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0Ol0NCg0KICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudA0KICAgICAgICBjb252ZXJ0cyB0aGVtIHRvIEx7TGl0ZXJhbH1zIGJ5IGRlZmF1bHQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQogICAgICAgICAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KDQogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciwgcmV0dXJucyBDe0x7QW5kfX0gd2l0aCBlcnJvciBzdG9wDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZiArIEFuZC5fRXJyb3JTdG9wKCkgKyBvdGhlcg0KDQogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYNCg0KICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKiBvcGVyYXRvciwgYWxsb3dzIHVzZSBvZiBDe2V4cHIgKiAzfSBpbiBwbGFjZSBvZg0KICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyDQogICAgICAgIHR1cGxlLCBzaW1pbGFyIHRvIEN7e21pbixtYXh9fSBtdWx0aXBsaWVycyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVHVwbGVzDQogICAgICAgIG1heSBhbHNvIGluY2x1ZGUgQ3tOb25lfSBhcyBpbjoNCiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudA0KICAgICAgICAgICAgICB0byBDe2V4cHIqbiArIEx7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAgICAgIChyZWFkIGFzICJhdCBsZWFzdCBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgIjAgdG8gbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7WmVyb09yTW9yZX0oZXhwcil9DQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0NCg0KICAgICAgICBOb3RlIHRoYXQgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYNCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywNCiAgICAgICAgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCBlbmZvcmNlIGEgbWF4aW11bSBudW1iZXIgb2YgZXhwcg0KICAgICAgICBvY2N1cnJlbmNlcy4gIElmIHRoaXMgYmVoYXZpb3IgaXMgZGVzaXJlZCwgdGhlbiB3cml0ZQ0KICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KToNCiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDANCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLHR1cGxlKToNCiAgICAgICAgICAgIG90aGVyID0gKG90aGVyICsgKE5vbmUsIE5vbmUpKVs6Ml0NCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgb3RoZXIgPSAoMCwgb3RoZXJbMV0pDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIG90aGVyWzFdIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYqb3RoZXJbMF0gKyBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOg0KICAgICAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyDQogICAgICAgICAgICAgICAgb3B0RWxlbWVudHMgLT0gbWluRWxlbWVudHMNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAoJyVzJywnJXMnKSBvYmplY3RzIiwgdHlwZShvdGhlclswXSksdHlwZShvdGhlclsxXSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQ0KDQogICAgICAgIGlmIG1pbkVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikNCiAgICAgICAgaWYgb3B0RWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2Vjb25kIHR1cGxlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBmaXJzdCB0dXBsZSB2YWx1ZSIpDQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSAwIG9yICgwLDApIikNCg0KICAgICAgICBpZiAob3B0RWxlbWVudHMpOg0KICAgICAgICAgICAgZGVmIG1ha2VPcHRpb25hbExpc3Qobik6DQogICAgICAgICAgICAgICAgaWYgbj4xOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZikNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOg0KICAgICAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6DQogICAgICAgICAgICAgICAgcmV0ID0gc2VsZg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQ0KDQogICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciAtIHJldHVybnMgQ3tMe01hdGNoRmlyc3R9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmDQoNCiAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe09yfX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3J4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmDQoNCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0VhY2h9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZg0KDQogICAgZGVmIF9faW52ZXJ0X18oIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIH4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtOb3RBbnl9fQ0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApDQoNCiAgICBkZWYgX19jYWxsX18oc2VsZiwgbmFtZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFNob3J0Y3V0IGZvciBDe0x7c2V0UmVzdWx0c05hbWV9fSwgd2l0aCBDe2xpc3RBbGxNYXRjaGVzPUZhbHNlfS4NCiAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQ0KICAgICAgICBwYXNzZWQgYXMgQ3tUcnVlfS4NCiAgICAgICAgICAgDQogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50DQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKS5zZXRSZXN1bHRzTmFtZSgibmFtZSIpICsgV29yZChudW1zKyItIikuc2V0UmVzdWx0c05hbWUoInNvY3NlY25vIikNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKSgic29jc2Vjbm8iKSAgICAgICAgICAgICANCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRSZXN1bHRzTmFtZShuYW1lKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFN1cHByZXNzZXMgdGhlIG91dHB1dCBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH07IHVzZWZ1bCB0byBrZWVwIHB1bmN0dWF0aW9uIGZyb20NCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gU3VwcHJlc3MoIHNlbGYgKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQ0KICAgICAgICBDe1BhcnNlckVsZW1lbnR9J3MgZGVmaW5lZCBwYXR0ZXJuLiAgVGhpcyBpcyBub3JtYWxseSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQ0KICAgICAgICB0aGUgcHlwYXJzaW5nIG1vZHVsZSwgYnV0IG1heSBiZSBuZWVkZWQgaW4gc29tZSB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBncmFtbWFycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFdoaXRlc3BhY2VDaGFycyggc2VsZiwgY2hhcnMgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgcGFyc2VXaXRoVGFicyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4NCiAgICAgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEN7cGFyc2VTdHJpbmd9IHdoZW4gdGhlIGlucHV0IGdyYW1tYXIgY29udGFpbnMgZWxlbWVudHMgdGhhdA0KICAgICAgICBtYXRjaCBDezxUQUI+fSBjaGFyYWN0ZXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybg0KICAgICAgICBtYXRjaGluZzsgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCB0byBkZWZpbmUgbXVsdGlwbGUgY29tbWVudCBvciBvdGhlcg0KICAgICAgICBpZ25vcmFibGUgcGF0dGVybnMuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddDQogICAgICAgICAgICANCiAgICAgICAgICAgIHBhdHQuaWdub3JlKGNTdHlsZUNvbW1lbnQpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKHN0YXJ0QWN0aW9uIG9yIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbiBvciBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pDQogICAgICAgIHNlbGYuZGVidWcgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0RGVidWcoIHNlbGYsIGZsYWc9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgIFNldCBDe2ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0byBkaXNhYmxlLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0TmFtZSgiYWxwaGF3b3JkIikNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoIm51bXdvcmQiKQ0KICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcg0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHR1cm4gb24gZGVidWdnaW5nIGZvciB3ZA0KICAgICAgICAgICAgd2Quc2V0RGVidWcoKQ0KDQogICAgICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoImFiYyAxMjMgeHl6IDg5MCIpDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAwKDEsMSkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMygxLDQpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWyd4eXonXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxMSgxLDEyKQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDE1KDEsMTYpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxNSksIChsaW5lOjEsIGNvbDoxNikNCg0KICAgICAgICBUaGUgb3V0cHV0IHNob3duIGlzIHRoYXQgcHJvZHVjZWQgYnkgdGhlIGRlZmF1bHQgZGVidWcgYWN0aW9ucyAtIGN1c3RvbSBkZWJ1ZyBhY3Rpb25zIGNhbiBiZQ0KICAgICAgICBzcGVjaWZpZWQgdXNpbmcgTHtzZXREZWJ1Z0FjdGlvbnN9LiBQcmlvciB0byBhdHRlbXB0aW5nDQogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQ0KICAgICAgICBpcyBzaG93bi4gVGhlbiBpZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGEgQ3siTWF0Y2hlZCJ9IG1lc3NhZ2UgaXMgc2hvd24sIG9yIGFuIEN7IkV4Y2VwdGlvbiByYWlzZWQifQ0KICAgICAgICBtZXNzYWdlIGlzIHNob3duLiBBbHNvIG5vdGUgdGhlIHVzZSBvZiBMe3NldE5hbWV9IHRvIGFzc2lnbiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgdG8gdGhlIGV4cHJlc3Npb24sDQogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdA0KICAgICAgICBuYW1lIGNyZWF0ZWQgZm9yIHRoZSBDe1dvcmR9IGV4cHJlc3Npb24gd2l0aG91dCBjYWxsaW5nIEN7c2V0TmFtZX0gaXMgQ3siVzooQUJDRC4uLikifS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGZsYWc6DQogICAgICAgICAgICBzZWxmLnNldERlYnVnQWN0aW9ucyggX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLCBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBwYXNzDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgIiIiDQogICAgICAgIENoZWNrIGRlZmluZWQgZXhwcmVzc2lvbnMgZm9yIHZhbGlkIHN0cnVjdHVyZSwgY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCg0KICAgIGRlZiBwYXJzZUZpbGUoIHNlbGYsIGZpbGVfb3JfZmlsZW5hbWUsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIHRoZSBnaXZlbiBmaWxlIG9yIGZpbGVuYW1lLg0KICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIHNwZWNpZmllZCAoaW5zdGVhZCBvZiBhIGZpbGUgb2JqZWN0KSwNCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQ0KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgInIiKSBhcyBmOg0KICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVN0cmluZyhmaWxlX2NvbnRlbnRzLCBwYXJzZUFsbCkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUGFyc2VyRWxlbWVudCk6DQogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzKG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlckVsZW1lbnQsc2VsZik9PW90aGVyDQoNCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIF9faGFzaF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkNCg0KICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlcg0KDQogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ldGhvZCBmb3IgcXVpY2sgdGVzdGluZyBvZiBhIHBhcnNlciBhZ2FpbnN0IGEgdGVzdCBzdHJpbmcuIEdvb2QgZm9yIHNpbXBsZSANCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaA0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cw0KICAgICAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZXhwciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGFzc2VydCBleHByLm1hdGNoZXMoIjEwMCIpDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnBhcnNlU3RyaW5nKF91c3RyKHRlc3RTdHJpbmcpLCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgICAgICAgICANCiAgICBkZWYgcnVuVGVzdHMoc2VsZiwgdGVzdHMsIHBhcnNlQWxsPVRydWUsIGNvbW1lbnQ9JyMnLCBmdWxsRHVtcD1UcnVlLCBwcmludFJlc3VsdHM9VHJ1ZSwgZmFpbHVyZVRlc3RzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gNCiAgICAgICAgdGVzdCwgdGhlIHBhcnNlZCByZXN1bHRzIG9yIHdoZXJlIHRoZSBwYXJzZSBmYWlsZWQuIFF1aWNrIGFuZCBlYXN5IHdheSB0bw0KICAgICAgICBydW4gYSBwYXJzZSBleHByZXNzaW9uIGFnYWluc3QgYSBsaXN0IG9mIHNhbXBsZSBzdHJpbmdzLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdHMgLSBhIGxpc3Qgb2Ygc2VwYXJhdGUgdGVzdCBzdHJpbmdzLCBvciBhIG11bHRpbGluZSBzdHJpbmcgb2YgdGVzdCBzdHJpbmdzDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICANCiAgICAgICAgIC0gY29tbWVudCAtIChkZWZhdWx0PUN7JyMnfSkgLSBleHByZXNzaW9uIGZvciBpbmRpY2F0aW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZSB0ZXN0IA0KICAgICAgICAgICAgICBzdHJpbmc7IHBhc3MgTm9uZSB0byBkaXNhYmxlIGNvbW1lbnQgZmlsdGVyaW5nDQogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOw0KICAgICAgICAgICAgICBpZiBGYWxzZSwgb25seSBkdW1wIG5lc3RlZCBsaXN0DQogICAgICAgICAtIHByaW50UmVzdWx0cyAtIChkZWZhdWx0PUN7VHJ1ZX0pIHByaW50cyB0ZXN0IG91dHB1dCB0byBzdGRvdXQNCiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nDQoNCiAgICAgICAgUmV0dXJuczogYSAoc3VjY2VzcywgcmVzdWx0cykgdHVwbGUsIHdoZXJlIHN1Y2Nlc3MgaW5kaWNhdGVzIHRoYXQgYWxsIHRlc3RzIHN1Y2NlZWRlZA0KICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggDQogICAgICAgIHRlc3QncyBvdXRwdXQNCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgbnVtYmVyX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlci5jb3B5KCkNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgICAgICcnJykNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICAnJycsIGZhaWx1cmVUZXN0cz1UcnVlKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICBbMTAwXQ0KDQogICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgIFstMTAwXQ0KDQogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICAgICBTdWNjZXNzDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyDQogICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciAzKSwgKGxpbmU6MSwgY29sOjQpDQoNCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicNCiAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgMy4xNC4xNTkNCiAgICAgICAgICAgICAgICBeDQogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA0KSwgKGxpbmU6MSwgY29sOjUpDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCg0KICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlDQogICAgICAgIGxpbmVzLCBjcmVhdGUgYSB0ZXN0IGxpa2UgdGhpczo6DQoNCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpDQogICAgICAgIA0KICAgICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSByYXcgc3RyaW5nIGxpdGVyYWwsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGxlYWRpbmcgJ3InLikNCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdHMsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgdGVzdHMgPSBsaXN0KG1hcChzdHIuc3RyaXAsIHRlc3RzLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBjb21tZW50ID0gTGl0ZXJhbChjb21tZW50KQ0KICAgICAgICBhbGxSZXN1bHRzID0gW10NCiAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICBzdWNjZXNzID0gVHJ1ZQ0KICAgICAgICBmb3IgdCBpbiB0ZXN0czoNCiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBub3QgdDoNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgb3V0ID0gWydcbicuam9pbihjb21tZW50cyksIHRdDQogICAgICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZShyJ1xuJywnXG4nKQ0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXN1bHQuZHVtcChmdWxsPWZ1bGxEdW1wKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICBmYXRhbCA9ICIoRkFUQUwpIiBpZiBpc2luc3RhbmNlKHBlLCBQYXJzZUZhdGFsRXhjZXB0aW9uKSBlbHNlICIiDQogICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiB0Og0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqKGNvbChwZS5sb2MsdCktMSkgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMOiAiICsgc3RyKHBlKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUwtRVhDRVBUSU9OOiAiICsgc3RyKGV4YykpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4Yw0KDQogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6DQogICAgICAgICAgICAgICAgaWYgZnVsbER1bXA6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJycpDQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpDQoNCiAgICAgICAgICAgIGFsbFJlc3VsdHMuYXBwZW5kKCh0LCByZXN1bHQpKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MsIGFsbFJlc3VsdHMNCg0KICAgICAgICANCmNsYXNzIFRva2VuKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApDQoNCg0KY2xhc3MgRW1wdHkoVG9rZW4pOg0KICAgICIiIg0KICAgIEFuIGVtcHR5IHRva2VuLCB3aWxsIGFsd2F5cyBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoRW1wdHksc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCg0KY2xhc3MgTm9NYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB0b2tlbiB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKE5vTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSAiTm9NYXRjaCINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiVW5tYXRjaGFibGUgdG9rZW4iDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBMaXRlcmFsKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZy4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoZm9vYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCINCiAgICANCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NMaXRlcmFsfS4NCiAgICANCiAgICBGb3Iga2V5d29yZCBtYXRjaGluZyAoZm9yY2Ugd29yZCBicmVhayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXRjaGVkIHN0cmluZyksDQogICAgdXNlIEx7S2V5d29yZH0gb3IgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoTGl0ZXJhbCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gTGl0ZXJhbDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBFbXB0eQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBfdXN0cihzZWxmLm1hdGNoKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhICpsb3QqDQogICAgIyBpZiB0aGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaCBzdHJpbmcgIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG1hdGNoZXMsDQogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgNCiAgICAjfiBAcHJvZmlsZQ0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCl9MID0gTGl0ZXJhbA0KUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gTGl0ZXJhbA0KDQpjbGFzcyBLZXl3b3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUNCiAgICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlci4gIENvbXBhcmUgd2l0aCBDe0x7TGl0ZXJhbH19Og0KICAgICAtIEN7TGl0ZXJhbCgiaWYiKX0gd2lsbCBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmQW5kT25seUlmJ30uDQogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30NCiAgICBBY2NlcHRzIHR3byBvcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGtleXdvcmQgc3RyaW5nOg0KICAgICAtIEN7aWRlbnRDaGFyc30gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycywNCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCINCiAgICAgLSBDe2Nhc2VsZXNzfSBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgZGVmYXVsdCBpcyBDe0ZhbHNlfS4NCiAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnQiKSAgIyAtPiBbJ3N0YXJ0J10NCiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnRpbmciKSAgIyAtPiBFeGNlcHRpb24NCg0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0tleXdvcmR9Lg0KICAgICIiIg0KICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUsIGNhc2VsZXNzPUZhbHNlICk6DQogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBpZGVudENoYXJzIGlzIE5vbmU6DQogICAgICAgICAgICBpZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBLZXl3b3JkOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIHNlbGYubWF0Y2gNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5jYXNlbGVzcyA9IGNhc2VsZXNzDQogICAgICAgIGlmIGNhc2VsZXNzOg0KICAgICAgICAgICAgc2VsZi5jYXNlbGVzc21hdGNoID0gbWF0Y2hTdHJpbmcudXBwZXIoKQ0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IGlkZW50Q2hhcnMudXBwZXIoKQ0KICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6DQogICAgICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBjID0gc3VwZXIoS2V5d29yZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdEtleXdvcmRDaGFycyggY2hhcnMgKToNCiAgICAgICAgIiIiT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IEtleXdvcmQgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gY2hhcnMNCg0KY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOg0KICAgICIiIg0KICAgIFRva2VuIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZywgaWdub3JpbmcgY2FzZSBvZiBsZXR0ZXJzLg0KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuDQogICAgbWF0Y2ggc3RyaW5nLCBOT1QgdGhlIGNhc2Ugb2YgdGhlIGlucHV0IHRleHQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzTGl0ZXJhbCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApDQogICAgICAgICMgUHJlc2VydmUgdGhlIGRlZmluaW5nIGxpdGVyYWwuDQogICAgICAgIHNlbGYucmV0dXJuU3RyaW5nID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5tYXRjaDoNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5yZXR1cm5TdHJpbmcNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENhc2VsZXNzS2V5d29yZChLZXl3b3JkKToNCiAgICAiIiINCiAgICBDYXNlbGVzcyB2ZXJzaW9uIG9mIEx7S2V5d29yZH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzS2V5d29yZCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2xvc2VNYXRjaChUb2tlbik6DQogICAgIiIiDQogICAgQSB2YXJpYXRpb24gb24gTHtMaXRlcmFsfSB3aGljaCBtYXRjaGVzICJjbG9zZSIgbWF0Y2hlcywgdGhhdCBpcywgDQogICAgc3RyaW5ncyB3aXRoIGF0IG1vc3QgJ24nIG1pc21hdGNoaW5nIGNoYXJhY3RlcnMuIEN7Q2xvc2VNYXRjaH0gdGFrZXMgcGFyYW1ldGVyczoNCiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZA0KICAgICAtIEN7bWF4TWlzbWF0Y2hlc30gLSAoQ3tkZWZhdWx0PTF9KSBtYXhpbXVtIG51bWJlciBvZiBtaXNtYXRjaGVzIGFsbG93ZWQgdG8gY291bnQgYXMgYSBtYXRjaA0KICAgIA0KICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOg0KICAgICAtIEN7bWlzbWF0Y2hlc30gLSBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG1hdGNoX3N0cmluZyB3aGVyZSBtaXNtYXRjaGVzIHdlcmUgZm91bmQNCiAgICAgLSBDe29yaWdpbmFsfSAtIHRoZSBvcmlnaW5hbCBtYXRjaF9zdHJpbmcgdXNlZCB0byBjb21wYXJlIGFnYWluc3QgdGhlIGlucHV0IHN0cmluZw0KICAgIA0KICAgIElmIEN7bWlzbWF0Y2hlc30gaXMgYW4gZW1wdHkgbGlzdCwgdGhlbiB0aGUgbWF0Y2ggd2FzIGFuIGV4YWN0IG1hdGNoLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgIyBleGFjdCBtYXRjaA0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCg0KICAgICAgICAjIGNsb3NlIG1hdGNoIGFsbG93aW5nIHVwIHRvIDIgbWlzbWF0Y2hlcw0KICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVhDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzQsIDldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6DQogICAgICAgIHN1cGVyKENsb3NlTWF0Y2gsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm5hbWUgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcNCiAgICAgICAgc2VsZi5tYXhNaXNtYXRjaGVzID0gbWF4TWlzbWF0Y2hlcw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAlciAod2l0aCB1cCB0byAlZCBtaXNtYXRjaGVzKSIgJSAoc2VsZi5tYXRjaF9zdHJpbmcsIHNlbGYubWF4TWlzbWF0Y2hlcykNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpDQoNCiAgICAgICAgaWYgbWF4bG9jIDw9IGluc3RybGVuOg0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZ2xvYyA9IDANCiAgICAgICAgICAgIG1pc21hdGNoZXMgPSBbXQ0KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcw0KDQogICAgICAgICAgICBmb3IgbWF0Y2hfc3RyaW5nbG9jLHNfbSBpbiBlbnVtZXJhdGUoemlwKGluc3RyaW5nW2xvYzptYXhsb2NdLCBzZWxmLm1hdGNoX3N0cmluZykpOg0KICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20NCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gbWF0Og0KICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZChtYXRjaF9zdHJpbmdsb2MpDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxDQogICAgICAgICAgICAgICAgcmVzdWx0cyA9IFBhcnNlUmVzdWx0cyhbaW5zdHJpbmdbc3RhcnQ6bG9jXV0pDQogICAgICAgICAgICAgICAgcmVzdWx0c1snb3JpZ2luYWwnXSA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcw0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdHMNCg0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KDQpjbGFzcyBXb3JkKFRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgd29yZHMgY29tcG9zZWQgb2YgYWxsb3dlZCBjaGFyYWN0ZXIgc2V0cy4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLA0KICAgIGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGFsbG93ZWQgYm9keSBjaGFyYWN0ZXJzIChpZiBvbWl0dGVkLA0KICAgIGRlZmF1bHRzIHRvIHRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQpLCBhbmQgYW4gb3B0aW9uYWwgbWluaW11bSwNCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uIEFuIG9wdGlvbmFsDQogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gDQogICAgdGhlIGlucHV0IEN7Ym9keUNoYXJzfSBzdHJpbmc7IHVzZWZ1bCB0byBkZWZpbmUgYSB3b3JkIG9mIGFsbCBwcmludGFibGVzDQogICAgZXhjZXB0IGZvciBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGZvciBpbnN0YW5jZS4NCiAgICANCiAgICBMe3NyYW5nZX0gaXMgdXNlZnVsIGZvciBkZWZpbmluZyBjdXN0b20gY2hhcmFjdGVyIHNldCBzdHJpbmdzIGZvciBkZWZpbmluZyANCiAgICBDe1dvcmR9IGV4cHJlc3Npb25zLCB1c2luZyByYW5nZSBub3RhdGlvbiBmcm9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgc2V0cy4NCiAgICANCiAgICBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHVzZSBDe1dvcmR9IHRvIG1hdGNoIGEgc3BlY2lmaWMgbGl0ZXJhbCBzdHJpbmcsIGFzIGluIA0KICAgIEN7V29yZCgiQWRkcmVzcyIpfS4gUmVtZW1iZXIgdGhhdCBDe1dvcmR9IHVzZXMgdGhlIHN0cmluZyBhcmd1bWVudCB0byBkZWZpbmUNCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLA0KICAgICJkQXJlZCIsIG9yIGFueSBvdGhlciB3b3JkIG1hZGUgdXAgb2YgdGhlIGNoYXJhY3RlcnMgJ0EnLCAnZCcsICdyJywgJ2UnLCBhbmQgJ3MnLg0KICAgIFRvIG1hdGNoIGFuIGV4YWN0IGxpdGVyYWwgc3RyaW5nLCB1c2UgTHtMaXRlcmFsfSBvciBMe0tleXdvcmR9Lg0KDQogICAgcHlwYXJzaW5nIGluY2x1ZGVzIGhlbHBlciBzdHJpbmdzIGZvciBidWlsZGluZyBXb3JkczoNCiAgICAgLSBMe2FscGhhc30NCiAgICAgLSBMe251bXN9DQogICAgIC0gTHthbHBoYW51bXN9DQogICAgIC0gTHtoZXhudW1zfQ0KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pDQogICAgIC0gTHtwdW5jOGJpdH0gKG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGN1cnJlbmN5LCBzeW1ib2xzLCBzdXBlcnNjcmlwdHMsIGRpYWNyaXRpY2FscywgZXRjLikNCiAgICAgLSBMe3ByaW50YWJsZXN9IChhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyKQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYSB3b3JkIGNvbXBvc2VkIG9mIGRpZ2l0cw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkNCiAgICAgICAgDQogICAgICAgICMgYSB3b3JkIHdpdGggYSBsZWFkaW5nIGNhcGl0YWwsIGFuZCB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlDQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KDQogICAgICAgICMgaG9zdG5hbWVzIGFyZSBhbHBoYW51bWVyaWMsIHdpdGggbGVhZGluZyBhbHBoYSwgYW5kICctJw0KICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQ0KICAgICAgICANCiAgICAgICAgIyByb21hbiBudW1lcmFsIChub3QgYSBzdHJpY3QgcGFyc2VyLCBhY2NlcHRzIGludmFsaWQgbWl4IG9mIGNoYXJhY3RlcnMpDQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpDQogICAgICAgIA0KICAgICAgICAjIGFueSBzdHJpbmcgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycywgZXhjZXB0IGZvciAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW5pdENoYXJzLCBib2R5Q2hhcnM9Tm9uZSwgbWluPTEsIG1heD0wLCBleGFjdD0wLCBhc0tleXdvcmQ9RmFsc2UsIGV4Y2x1ZGVDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBpZiBleGNsdWRlQ2hhcnM6DQogICAgICAgICAgICBpbml0Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gaW5pdENoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoNCiAgICAgICAgICAgICAgICBib2R5Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gYm9keUNoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykNCiAgICAgICAgc2VsZi5pbml0Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykNCiAgICAgICAgaWYgYm9keUNoYXJzIDoNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGJvZHlDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gaW5pdENoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpDQoNCiAgICAgICAgc2VsZi5tYXhTcGVjaWZpZWQgPSBtYXggPiAwDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoV29yZCgpKSBpZiB6ZXJvLWxlbmd0aCB3b3JkIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZA0KDQogICAgICAgIGlmICcgJyBub3QgaW4gc2VsZi5pbml0Q2hhcnNPcmlnK3NlbGYuYm9keUNoYXJzT3JpZyBhbmQgKG1pbj09MSBhbmQgbWF4PT0wIGFuZCBleGFjdD09MCk6DQogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXSsiICUgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpDQogICAgICAgICAgICBlbGlmIGxlbihzZWxmLmluaXRDaGFyc09yaWcpID09IDE6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlLmVzY2FwZShzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc11bJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gciJcYiIrc2VsZi5yZVN0cmluZytyIlxiIg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKCBzZWxmLnJlU3RyaW5nICkNCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYucmU6DQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYuaW5pdENoYXJzKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBib2R5Y2hhcnMgPSBzZWxmLmJvZHlDaGFycw0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBpbnN0cmxlbiApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHRocm93RXhjZXB0aW9uID0gRmFsc2UNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLm1heFNwZWNpZmllZCBhbmQgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgaWYgKHN0YXJ0PjAgYW5kIGluc3RyaW5nW3N0YXJ0LTFdIGluIGJvZHljaGFycykgb3IgKGxvYzxpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnMpOg0KICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KDQogICAgICAgIGlmIHRocm93RXhjZXB0aW9uOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCg0KICAgICAgICAgICAgZGVmIGNoYXJzQXNTdHIocyk6DQogICAgICAgICAgICAgICAgaWYgbGVuKHMpPjQ6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzDQoNCiAgICAgICAgICAgIGlmICggc2VsZi5pbml0Q2hhcnNPcmlnICE9IHNlbGYuYm9keUNoYXJzT3JpZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcywlcykiICUgKCBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZyksIGNoYXJzQXNTdHIoc2VsZi5ib2R5Q2hhcnNPcmlnKSApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcykiICUgY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFJlZ2V4KFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIGZvcm0gcmVjb2duaXplZCBieSB0aGUgaW5idWlsdCBQeXRob24gcmUgbW9kdWxlLg0KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIA0KICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpDQogICAgICAgIGRhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZD8pLSg/UDxkYXk+XGRcZD8pJykNCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uDQogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQ0KICAgICIiIg0KICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6DQogICAgICAgICIiIlRoZSBwYXJhbWV0ZXJzIEN7cGF0dGVybn0gYW5kIEN7ZmxhZ3N9IGFyZSBwYXNzZWQgdG8gdGhlIEN7cmUuY29tcGlsZSgpfSBmdW5jdGlvbiBhcy1pcy4gU2VlIHRoZSBQeXRob24gQ3tyZX0gbW9kdWxlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgYWNjZXB0YWJsZSBwYXR0ZXJucyBhbmQgZmxhZ3MuIiIiDQogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHBhdHRlcm4sDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6DQogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gXA0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQ0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQogICAgICAgICAgICANCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIGQgPSByZXN1bHQuZ3JvdXBkaWN0KCkNCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQ0KICAgICAgICBpZiBkOg0KICAgICAgICAgICAgZm9yIGsgaW4gZDoNCiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdDQogICAgICAgIHJldHVybiBsb2MscmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVnZXgsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgZGVsaW1pdGVkIGJ5IHF1b3RpbmcgY2hhcmFjdGVycy4NCiAgICANCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOg0KICAgICAgICAtIHF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBxdW90ZSBkZWxpbWl0aW5nIHN0cmluZw0KICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIG11bHRpbGluZSAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHF1b3RlcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAoZGVmYXVsdD1De0ZhbHNlfSkNCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pDQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQ0KICAgICAgICAtIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyAtIGNvbnZlcnQgZXNjYXBlZCB3aGl0ZXNwYWNlIChDeydcdCd9LCBDeydcbid9LCBldGMuKSB0byBhY3R1YWwgd2hpdGVzcGFjZSAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHFzID0gUXVvdGVkU3RyaW5nKCciJykNCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpDQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpDQogICAgICAgIHByaW50KGNvbXBsZXhfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiB7e1RoaXMgaXMgdGhlICJxdW90ZSJ9fSBzbGRqZicpKQ0KICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQ0KICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiZW1iZWRkZWQiIHF1b3RlcyddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToNCiAgICAgICAgc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQ0KICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICBpZiBub3QgcXVvdGVDaGFyOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIG5vdCBlbmRRdW90ZUNoYXI6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmZpcnN0UXVvdGVDaGFyID0gcXVvdGVDaGFyWzBdDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5lc2NDaGFyID0gZXNjQ2hhcg0KICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUNCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzDQogICAgICAgIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzID0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzDQoNCiAgICAgICAgaWYgbXVsdGlsaW5lOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKA0KICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZW5kUXVvdGVDaGFyKS0xLDAsLTEpKSArICcpJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgaWYgZXNjUXVvdGU6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzKScgJSByZS5lc2NhcGUoZXNjUXVvdGUpKQ0KICAgICAgICBpZiBlc2NDaGFyOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkNCiAgICAgICAgICAgIHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuID0gcmUuZXNjYXBlKHNlbGYuZXNjQ2hhcikrIiguKSINCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIHNlbGYudW5xdW90ZVJlc3VsdHM6DQoNCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3Rlcw0KICAgICAgICAgICAgcmV0ID0gcmV0W3NlbGYucXVvdGVDaGFyTGVuOi1zZWxmLmVuZFF1b3RlQ2hhckxlbl0NCg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgd2hpdGVzcGFjZQ0KICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoNCiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcidcdCcgOiAnXHQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidccicgOiAnXHInLA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZSh3c2xpdCwgd3NjaGFyKQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjQ2hhcjoNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCByIlxnPDE+IiwgcmV0KQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgcXVvdGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgQ2hhcnNOb3RJbihUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsDQogICAgaW5jbHVkZSB3aGl0ZXNwYWNlIGluIG1hdGNoZWQgY2hhcmFjdGVycyBpZiBub3QgbGlzdGVkIGluIHRoZSBwcm92aWRlZCBleGNsdXNpb24gc2V0IC0gc2VlIGV4YW1wbGUpLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwNCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpDQogICAgICAgIHByaW50KGRlbGltaXRlZExpc3QoY3N2X3ZhbHVlKS5wYXJzZVN0cmluZygiZGtscyxsc2RramYsczEyIDM0LEAhIywyMTMiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToNCiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMNCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzDQogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsZW4gYW5kIFwNCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycw0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgV2hpdGUoVG9rZW4pOg0KICAgICIiIg0KICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkDQogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzDQogICAgYXJlIHNpZ25pZmljYW50LiAgRGVmaW5lIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGJlDQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLA0KICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLg0KICAgICIiIg0KICAgIHdoaXRlU3RycyA9IHsNCiAgICAgICAgIiAiIDogIjxTUEM+IiwNCiAgICAgICAgIlx0IjogIjxUQUI+IiwNCiAgICAgICAgIlxuIjogIjxMRj4iLA0KICAgICAgICAiXHIiOiAiPENSPiIsDQogICAgICAgICJcZiI6ICI8RkY+IiwNCiAgICAgICAgfQ0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6DQogICAgICAgIHN1cGVyKFdoaXRlLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KDQpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCmNsYXNzIEdvVG9Db2x1bW4oX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6DQogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmNvbCA9IGNvbG5vDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgY29sKGxvYyxpbnN0cmluZykgIT0gc2VsZi5jb2w6DQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdGhpc2NvbCA9IGNvbCggbG9jLCBpbnN0cmluZyApDQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApDQogICAgICAgIG5ld2xvYyA9IGxvYyArIHNlbGYuY29sIC0gdGhpc2NvbA0KICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQ0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQNCg0KDQpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgIA0KICAgICAgICB0ZXN0ID0gJycnXA0KICAgICAgICBBQUEgdGhpcyBsaW5lDQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lDQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUNCiAgICAgICAgQiBBQUEgYW5kIGRlZmluaXRlbHkgbm90IHRoaXMgb25lDQogICAgICAgICcnJw0KDQogICAgICAgIGZvciB0IGluIChMaW5lU3RhcnQoKSArICdBQUEnICsgcmVzdE9mTGluZSkuc2VhcmNoU3RyaW5nKHRlc3QpOg0KICAgICAgICAgICAgcHJpbnQodCkNCiAgICANCiAgICBQcmludHM6Og0KICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10NCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICANCg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYzxsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzDQogICAgICAgICAgICBpZiBsb2MgIT0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIDAgKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ0VuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZFN0YXJ0KGFscGhhbnVtcyl9LiBDe1dvcmRTdGFydH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFdvcmRFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGVuZCBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBlbmQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIGV4cHJzICkgXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBJdGVyYWJsZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICAgICAgIyBpZiBzZXF1ZW5jZSBvZiBzdHJpbmdzIHByb3ZpZGVkLCB3cmFwIHdpdGggTGl0ZXJhbA0KICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOg0KICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpDQogICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdCggZXhwcnMgKQ0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gRmFsc2UNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICByZXR1cm4gc2VsZi5leHByc1tpXQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoIG90aGVyICkNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uDQogICAgICAgICAgIGFsbCBjb250YWluZWQgZXhwcmVzc2lvbnMuIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQ0KICAgICAgICAjIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBwYXJzZSBhY3Rpb25zIG9yIHJlc3VsdHNOYW1lcyBvbiB0aGUgbmVzdGVkIEFuZCdzDQogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpDQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1swXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gc2VsZi5leHByc1s6LTFdICsgb3RoZXIuZXhwcnNbOl0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCiAgICAgICAgDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkNCiAgICAgICAgcmV0LmV4cHJzID0gW2UuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnNdDQogICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgQW5kKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4NCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBuYW1lX2V4cHIgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KDQogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQ0KICAgICAgICAjIG1vcmUgZWFzaWx5IHdyaXR0ZW4gYXM6DQogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQ0KICAgICIiIg0KDQogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAgICAgc3VwZXIoQW5kLl9FcnJvclN0b3Asc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQ0KICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nDQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgICMgcGFzcyBGYWxzZSBhcyBsYXN0IGFyZyB0byBfcGFyc2UgZm9yIGZpcnN0IGVsZW1lbnQsIHNpbmNlIHdlIGFscmVhZHkNCiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nDQogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVycm9yU3RvcCA9IEZhbHNlDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6DQogICAgICAgICAgICAgICAgZXJyb3JTdG9wID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBlcnJvclN0b3A6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24uX2Zyb21fZXhjZXB0aW9uKHBlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICByZXN1bHRsaXN0ICs9IGV4cHJ0b2tlbnMNCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdA0KDQogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI0FuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQogICAgICAgICAgICBpZiBub3QgZS5tYXlSZXR1cm5FbXB0eToNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIG1hdGNoZXMgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIHNhdmUgbWF0Y2ggYW1vbmcgYWxsIG1hdGNoZXMsIHRvIHJldHJ5IGxvbmdlc3QgdG8gc2hvcnRlc3QNCiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpDQoNCiAgICAgICAgaWYgbWF0Y2hlczoNCiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQ0KICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQoNCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCg0KICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snfCd9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE1hdGNoRmlyc3QgdXNpbmcgJ3wnIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIHwgQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0NCg0KICAgICAgICAjIHB1dCBtb3JlIHNlbGVjdGl2ZSBleHByZXNzaW9uIGZpcnN0DQogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCg0KICAgICAgICAjIG9ubHkgZ290IGhlcmUgaWYgbm8gZXhwcmVzc2lvbiBtYXRjaGVkLCByYWlzZSBleGNlcHRpb24gZm9yIG1hdGNoIHRoYXQgbWFkZSBpdCB0aGUgZnVydGhlc3QNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgfCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCwgYnV0IGluIGFueSBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQ0KICAgICAgICBzaGFwZV90eXBlID0gb25lT2YoIlNRVUFSRSBDSVJDTEUgVFJJQU5HTEUgU1RBUiBIRVhBR09OIE9DVEFHT04iKQ0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpDQogICAgICAgIHBvc25fYXR0ciA9ICJwb3NuOiIgKyBHcm91cChpbnRlZ2VyKCJ4IikgKyAnLCcgKyBpbnRlZ2VyKCJ5IikpKCJwb3NuIikNCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikNCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQ0KDQogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIA0KICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkNCiAgICAgICAgc2hhcGVfc3BlYyA9IHNoYXBlX2F0dHIgJiBwb3NuX2F0dHIgJiBPcHRpb25hbChjb2xvcl9hdHRyKSAmIE9wdGlvbmFsKHNpemVfYXR0cikNCg0KICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MA0KICAgICAgICAgICAgJycnDQogICAgICAgICAgICApDQogICAgcHJpbnRzOjoNCiAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dDQogICAgICAgIC0gY29sb3I6IEJMQUNLDQogICAgICAgIC0gcG9zbjogWycxMDAnLCAnLCcsICcxMjAnXQ0KICAgICAgICAgIC0geDogMTAwDQogICAgICAgICAgLSB5OiAxMjANCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQoNCg0KICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQ0KICAgICAgICAtIGNvbG9yOiBCTFVFDQogICAgICAgIC0gcG9zbjogWyc1MCcsICcsJywgJzgwJ10NCiAgICAgICAgICAtIHg6IDUwDQogICAgICAgICAgLSB5OiA4MA0KICAgICAgICAtIHNoYXBlOiBDSVJDTEUNCiAgICAgICAgLSBzaXplOiA1MA0KDQoNCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MA0KICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0NCiAgICAgICAgLSBjb2xvcjogR1JFRU4NCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQ0KICAgICAgICAgIC0geDogMjANCiAgICAgICAgICAtIHk6IDQwDQogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFDQogICAgICAgIC0gc2l6ZTogMjANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoNCiAgICAgICAgICAgIHNlbGYub3B0MW1hcCA9IGRpY3QoKGlkKGUuZXhwciksZSkgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpKQ0KICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdDQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldDQogICAgICAgICAgICBzZWxmLm9wdGlvbmFscyA9IG9wdDEgKyBvcHQyDQogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgbm90IGlzaW5zdGFuY2UoZSwoT3B0aW9uYWwsWmVyb09yTW9yZSxPbmVPck1vcmUpKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlDQogICAgICAgIHRtcExvYyA9IGxvYw0KICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQ0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0NCiAgICAgICAgbWF0Y2hPcmRlciA9IFtdDQoNCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBrZWVwTWF0Y2hpbmc6DQogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBmYWlsZWQgPSBbXQ0KICAgICAgICAgICAgZm9yIGUgaW4gdG1wRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaE9yZGVyLmFwcGVuZChzZWxmLm9wdDFtYXAuZ2V0KGlkKGUpLGUpKQ0KICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGUgaW4gdG1wT3B0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQ0KICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToNCiAgICAgICAgICAgICAgICBrZWVwTWF0Y2hpbmcgPSBGYWxzZQ0KDQogICAgICAgIGlmIHRtcFJlcWQ6DQogICAgICAgICAgICBtaXNzaW5nID0gIiwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHRtcFJlcWQpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkNCg0KICAgICAgICAjIGFkZCBhbnkgdW5tYXRjaGVkIE9wdGlvbmFscywgaW4gY2FzZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZA0KICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0NCg0KICAgICAgICByZXN1bHRsaXN0ID0gW10NCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoNCiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykNCiAgICAgICAgICAgIHJlc3VsdGxpc3QuYXBwZW5kKHJlc3VsdHMpDQoNCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpDQogICAgICAgIHJldHVybiBsb2MsIGZpbmFsUmVzdWx0cw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIFRva2VuKToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoTGl0ZXJhbChleHByKSkNCiAgICAgICAgc2VsZi5leHByID0gZXhwcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIGlmIGV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3INCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QNCiAgICAgICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gZXhwci5jYWxsUHJlcGFyc2UNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoNCiAgICAgICAgICAgIHJhaXNlIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oIHBhcnNlRWxlbWVudExpc3QrW3NlbGZdICkNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHByKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Rm9sbG93ZWRCeX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQ3tGb2xsb3dlZEJ5fSBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHVzZSBGb2xsb3dlZEJ5IHRvIG1hdGNoIGEgbGFiZWwgb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhICc6Jw0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBOb3RBbnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0NCiAgICBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4gIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgJ34nIG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihOb3RBbnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZW5kZXIgPSBzdG9wT24NCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikNCiAgICAgICAgc2VsZi5ub3RfZW5kZXIgPSB+ZW5kZXIgaWYgZW5kZXIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmX2V4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMNCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQ0KICAgICAgICANCiAgICAgICAgIyBtdXN0IGJlIGF0IGxlYXN0IG9uZSAoYnV0IGZpcnN0IHNlZSBpZiB3ZSBhcmUgdGhlIHN0b3BPbiBzZW50aW5lbDsNCiAgICAgICAgIyBpZiBzbywgZmFpbCkNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGhhc0lnbm9yZUV4cHJzID0gKG5vdCBub3Qgc2VsZi5pZ25vcmVFeHBycykNCiAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGlmIHRtcHRva2VucyBvciB0bXB0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQogICAgICAgIA0KY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBSZXBldGl0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIG9uZSBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0NCg0KICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgIyBCZXR0ZXIgLT4gW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnQkxBQ0snXV0NCiAgICAgICAgDQogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzDQogICAgICAgIChhdHRyX2V4cHIgKiAoMSwpKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKQ0KICAgICIiIg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBaZXJvT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9DQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFplcm9Pck1vcmUsIHNlbGYpLnBhcnNlSW1wbChpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6DQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gRmFsc2UNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9fc3RyX18oc2VsZik6DQogICAgICAgIHJldHVybiAiIg0KDQpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpDQpjbGFzcyBPcHRpb25hbChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIGRlZmF1bHQgKG9wdGlvbmFsKSAtIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcHRpb25hbCBleHByZXNzaW9uIGlzIG5vdCBmb3VuZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIFVTIHBvc3RhbCBjb2RlIGNhbiBiZSBhIDUtZGlnaXQgemlwLCBwbHVzIG9wdGlvbmFsIDQtZGlnaXQgcXVhbGlmaWVyDQogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQ0KICAgICAgICB6aXAucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgICAgICAxMjM0NQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAxMjM0NQ0KICAgICAgICBbJzEyMzQ1J10NCg0KICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICBbJzEyMTAxLTAwMDEnXQ0KDQogICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAgXg0KICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA1KSwgKGxpbmU6MSwgY29sOjYpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToNCiAgICAgICAgc3VwZXIoT3B0aW9uYWwsc2VsZikuX19pbml0X18oIGV4cHIsIHNhdmVsaXN0PUZhbHNlICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0DQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdFZhbHVlIGlzIG5vdCBfb3B0aW9uYWxOb3RNYXRjaGVkOg0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3NlbGYuZXhwci5yZXN1bHRzTmFtZV0gPSBzZWxmLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQ0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBza2lwcGluZyBvdmVyIGFsbCB1bmRlZmluZWQgdGV4dCB1bnRpbCB0aGUgbWF0Y2hlZCBleHByZXNzaW9uIGlzIGZvdW5kLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gdGFyZ2V0IGV4cHJlc3Npb24gbWFya2luZyB0aGUgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHNraXBwZWQNCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCANCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLg0KICAgICAtIGlnbm9yZSAtIChkZWZhdWx0PUN7Tm9uZX0pIHVzZWQgdG8gZGVmaW5lIGdyYW1tYXJzICh0eXBpY2FsbHkgcXVvdGVkIHN0cmluZ3MgYW5kIA0KICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24NCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgDQogICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNraXBwZWQgdGVzdDsgaWYgZm91bmQgYmVmb3JlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBmb3VuZCwgDQogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlcG9ydCA9ICcnJw0KICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDANCg0KICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuDQogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0NCiAgICAgICAgICAgICAxMDEgfCBDcml0aWNhbCB8IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2ggICAgICAgICAgICAgICAgIHwgICAgICAgICAgNg0KICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0DQogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcNCiAgICAgICAgICAgICcnJw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpDQogICAgICAgICMgdXNlIFNraXBUbyB0byBzaW1wbHkgbWF0Y2ggZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgbmV4dCBTRVANCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaA0KICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5DQogICAgICAgIHN0cmluZ19kYXRhID0gU2tpcFRvKFNFUCwgaWdub3JlPXF1b3RlZFN0cmluZykNCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkNCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgic2V2IikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpDQogICAgICAgIA0KICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOg0KICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddDQogICAgICAgIC0gZGF5c19vcGVuOiA2DQogICAgICAgIC0gZGVzYzogSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaA0KICAgICAgICAtIGlzc3VlX251bTogMTAxDQogICAgICAgIC0gc2V2OiBDcml0aWNhbA0KICAgICAgICBbJzk0JywgJ0Nvc21ldGljJywgIlNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSIsICcxNCddDQogICAgICAgIC0gZGF5c19vcGVuOiAxNA0KICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQ0KICAgICAgICAtIGlzc3VlX251bTogOTQNCiAgICAgICAgLSBzZXY6IENvc21ldGljDQogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNDcNCiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cw0KICAgICAgICAtIGlzc3VlX251bTogNzkNCiAgICAgICAgLSBzZXY6IE1pbm9yDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6DQogICAgICAgIHN1cGVyKCBTa2lwVG8sIHNlbGYgKS5fX2luaXRfXyggb3RoZXIgKQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlDQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UNCiAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsT24sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBmYWlsT24NCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnRsb2MgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGV4cHIgPSBzZWxmLmV4cHINCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgPSBzZWxmLmlnbm9yZUV4cHIudHJ5UGFyc2UgaWYgc2VsZi5pZ25vcmVFeHByIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICANCiAgICAgICAgdG1wbG9jID0gbG9jDQogICAgICAgIHdoaWxlIHRtcGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQoaW5zdHJpbmcsIHRtcGxvYyk6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucw0KICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGV4cHJfcGFyc2UoaW5zdHJpbmcsIHRtcGxvYywgZG9BY3Rpb25zPUZhbHNlLCBjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcNCiAgICAgICAgICAgICAgICB0bXBsb2MgKz0gMQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nIHdpdGhvdXQgbWF0Y2hpbmcgc2tpcHRvIGV4cHIsIGZhaWwNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICMgYnVpbGQgdXAgcmV0dXJuIHZhbHVlcw0KICAgICAgICBsb2MgPSB0bXBsb2MNCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdDQogICAgICAgIHNraXByZXN1bHQgPSBQYXJzZVJlc3VsdHMoc2tpcHRleHQpDQogICAgICAgIA0KICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoNCiAgICAgICAgICAgIGxvYywgbWF0ID0gZXhwcl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zLGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0DQoNCiAgICAgICAgcmV0dXJuIGxvYywgc2tpcHJlc3VsdA0KDQpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0NCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLg0KICAgIFdoZW4gdGhlIGV4cHJlc3Npb24gaXMga25vd24sIGl0IGlzIGFzc2lnbmVkIHRvIHRoZSBDe0ZvcndhcmR9IHZhcmlhYmxlIHVzaW5nIHRoZSAnPDwnIG9wZXJhdG9yLg0KDQogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLg0KICAgIFNwZWNpZmljYWxseSwgJ3wnIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnPDwnLCBzbyB0aGF0OjoNCiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMNCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6DQogICAgICAgIChmd2RFeHByIDw8IGEpIHwgYiB8IGMNCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91DQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06Og0KICAgICAgICBmd2RFeHByIDw8IChhIHwgYiB8IGMpDQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uDQoNCiAgICBTZWUgTHtQYXJzZVJlc3VsdHMucHByaW50fSBmb3IgYW4gZXhhbXBsZSBvZiBhIHJlY3Vyc2l2ZSBwYXJzZXIgY3JlYXRlZCB1c2luZw0KICAgIEN7Rm9yd2FyZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlcj1Ob25lICk6DQogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApDQoNCiAgICBkZWYgX19sc2hpZnRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQ0KICAgICAgICBzZWxmLmV4cHIgPSBvdGhlcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBzZWxmLmV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpDQogICAgICAgIHJldHVybiBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyDQogICAgDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToNCiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iDQoNCiAgICAgICAgIyBzdHViYmVkIG91dCBmb3Igbm93IC0gY3JlYXRlcyBhd2Z1bCBtZW1vcnkgYW5kIHBlcmYgaXNzdWVzDQogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18NCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSINCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gc2VsZi5fcmV2ZXJ0Q2xhc3MNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZw0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpDQogICAgICAgICAgICByZXQgPDw9IHNlbGYNCiAgICAgICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6DQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIuLi4iDQoNCmNsYXNzIFRva2VuQ29udmVydGVyKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBGYWxzZQ0KDQpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuDQogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7DQogICAgdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBDeydhZGphY2VudD1GYWxzZSd9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsID0gV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KDQogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMuMTQxNiddDQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6DQogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICAjIHN1cHByZXNzIHdoaXRlc3BhY2Utc3RyaXBwaW5nIGluIGNvbnRhaW5lZCBwYXJzZSBleHByZXNzaW9ucywgYnV0IHJlLWVuYWJsZSBpdCBvbiB0aGUgQ29tYmluZSBpdHNlbGYNCiAgICAgICAgaWYgYWRqYWNlbnQ6DQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuYWRqYWNlbnQgPSBhZGphY2VudA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgc2VsZi5hZGphY2VudDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIENvbWJpbmUsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpDQogICAgICAgIGRlbCByZXRUb2tzWzpdDQogICAgICAgIHJldFRva3MgKz0gUGFyc2VSZXN1bHRzKFsgIiIuam9pbih0b2tlbmxpc3QuX2FzU3RyaW5nTGlzdChzZWxmLmpvaW5TdHJpbmcpKSBdLCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cykNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToNCiAgICAgICAgICAgIHJldHVybiBbIHJldFRva3MgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHJldFRva3MNCg0KY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gdGhlIG1hdGNoZWQgdG9rZW5zIGFzIGEgbGlzdCAtIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHRva2VucyBvZiBDe0x7WmVyb09yTW9yZX19IGFuZCBDe0x7T25lT3JNb3JlfX0gZXhwcmVzc2lvbnMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0NCiAgICAgICAgZnVuYyA9IGlkZW50ICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQ0KDQogICAgICAgIGZ1bmMgPSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCg0KY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiBhIHJlcGV0aXRpdmUgZXhwcmVzc2lvbiBhcyBhIGxpc3QsIGJ1dCBhbHNvIGFzIGEgZGljdGlvbmFyeS4NCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4NCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICAjIHByaW50IGF0dHJpYnV0ZXMgYXMgcGxhaW4gZ3JvdXBzDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgaW5zdGVhZCBvZiBPbmVPck1vcmUoZXhwciksIHBhcnNlIHVzaW5nIERpY3QoT25lT3JNb3JlKEdyb3VwKGV4cHIpKSkgLSBEaWN0IHdpbGwgYXV0by1hc3NpZ24gbmFtZXMNCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdA0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICANCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10NCg0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9DQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUodG9rZW5saXN0KToNCiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlrZXkgPSB0b2tbMF0NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOg0KICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIGxlbih0b2spPT0xOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpDQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tbMV0saSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpDQogICAgICAgICAgICAgICAgZGVsIGRpY3R2YWx1ZVswXQ0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWU6DQogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQoNCmNsYXNzIFN1cHByZXNzKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCINCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQoNCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlDQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0DQogICAgICAgIHdkX2xpc3QyID0gd2QgKyBaZXJvT3JNb3JlKFN1cHByZXNzKCcsJykgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2EnLCAnLCcsICdiJywgJywnLCAnYycsICcsJywgJ2QnXQ0KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQ0KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikNCiAgICAiIiINCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFtdDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KDQpjbGFzcyBPbmx5T25jZShvYmplY3QpOg0KICAgICIiIg0KICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RDYWxsKToNCiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpDQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCiAgICBkZWYgX19jYWxsX18oc2VsZixzLGwsdCk6DQogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoNCiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQ0KICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpDQogICAgZGVmIHJlc2V0KHNlbGYpOg0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQoNCmRlZiB0cmFjZVBhcnNlQWN0aW9uKGYpOg0KICAgICIiIg0KICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIA0KICAgIA0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59DQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCg0KICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbg0KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOg0KICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc29ydGVkKHNldCgnJy5qb2luKHRva2VucykpKSkNCg0KICAgICAgICB3ZHMgPSBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMpDQogICAgICAgIHByaW50KHdkcy5wYXJzZVN0cmluZygic2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYiKSkNCiAgICBwcmludHM6Og0KICAgICAgICA+PmVudGVyaW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMobGluZTogJ3Nsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmJywgMCwgKFsnc2xrZGpzJywgJ3NsZCcsICdzbGRkJywgJ3NkbGYnLCAnc2RsamYnXSwge30pKQ0KICAgICAgICA8PGxlYXZpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyAocmV0OiAnZGZqa2xzJykNCiAgICAgICAgWydkZmprbHMnXQ0KICAgICIiIg0KICAgIGYgPSBfdHJpbV9hcml0eShmKQ0KICAgIGRlZiB6KCpwYUFyZ3MpOg0KICAgICAgICB0aGlzRnVuYyA9IGYuX19uYW1lX18NCiAgICAgICAgcyxsLHQgPSBwYUFyZ3NbLTM6XQ0KICAgICAgICBpZiBsZW4ocGFBcmdzKT4zOg0KICAgICAgICAgICAgdGhpc0Z1bmMgPSBwYUFyZ3NbMF0uX19jbGFzc19fLl9fbmFtZV9fICsgJy4nICsgdGhpc0Z1bmMNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIj4+ZW50ZXJpbmcgJXMobGluZTogJyVzJywgJWQsICVyKVxuIiAlICh0aGlzRnVuYyxsaW5lKGwscyksbCx0KSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldCA9IGYoKnBhQXJncykNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChleGNlcHRpb246ICVzKVxuIiAlICh0aGlzRnVuYyxleGMpICkNCiAgICAgICAgICAgIHJhaXNlDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKHJldDogJXIpXG4iICUgKHRoaXNGdW5jLHJldCkgKQ0KICAgICAgICByZXR1cm4gcmV0DQogICAgdHJ5Og0KICAgICAgICB6Ll9fbmFtZV9fID0gZi5fX25hbWVfXw0KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgcGFzcw0KICAgIHJldHVybiB6DQoNCiMNCiMgZ2xvYmFsIGhlbHBlcnMNCiMNCmRlZiBkZWxpbWl0ZWRMaXN0KCBleHByLCBkZWxpbT0iLCIsIGNvbWJpbmU9RmFsc2UgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgZGVsaW1pdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgLSB0aGUgZGVsaW1pdGVyIGRlZmF1bHRzIHRvICcsJy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbGlzdCBlbGVtZW50cyBhbmQgZGVsaW1pdGVycyBjYW4gaGF2ZSBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlLCBhbmQNCiAgICBjb21tZW50cywgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBDe2NvbWJpbmU9VHJ1ZX0gaW4gdGhlIGNvbnN0cnVjdG9yLg0KICAgIElmIEN7Y29tYmluZX0gaXMgc2V0IHRvIEN7VHJ1ZX0sIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuDQogICAgc3RyaW5nLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkDQogICAgYXMgYSBsaXN0IG9mIHRva2Vucywgd2l0aCB0aGUgZGVsaW1pdGVycyBzdXBwcmVzc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWEsYmIsY2MiKSAjIC0+IFsnYWEnLCAnYmInLCAnY2MnXQ0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoaGV4bnVtcyksIGRlbGltPSc6JywgY29tYmluZT1UcnVlKS5wYXJzZVN0cmluZygiQUE6QkI6Q0M6REQ6RUUiKSAjIC0+IFsnQUE6QkI6Q0M6REQ6RUUnXQ0KICAgICIiIg0KICAgIGRsTmFtZSA9IF91c3RyKGV4cHIpKyIgWyIrX3VzdHIoZGVsaW0pKyIgIitfdXN0cihleHByKSsiXS4uLiINCiAgICBpZiBjb21iaW5lOg0KICAgICAgICByZXR1cm4gQ29tYmluZSggZXhwciArIFplcm9Pck1vcmUoIGRlbGltICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuICggZXhwciArIFplcm9Pck1vcmUoIFN1cHByZXNzKCBkZWxpbSApICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQoNCmRlZiBjb3VudGVkQXJyYXkoIGV4cHIsIGludEV4cHI9Tm9uZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBjb3VudGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMuDQogICAgVGhpcyBoZWxwZXIgZGVmaW5lcyBhIHBhdHRlcm4gb2YgdGhlIGZvcm06Og0KICAgICAgICBpbnRlZ2VyIGV4cHIgZXhwciBleHByLi4uDQogICAgd2hlcmUgdGhlIGxlYWRpbmcgaW50ZWdlciB0ZWxscyBob3cgbWFueSBleHByIGV4cHJlc3Npb25zIGZvbGxvdy4NCiAgICBUaGUgbWF0Y2hlZCB0b2tlbnMgcmV0dXJucyB0aGUgYXJyYXkgb2YgZXhwciB0b2tlbnMgYXMgYSBsaXN0IC0gdGhlIGxlYWRpbmcgY291bnQgdG9rZW4gaXMgc3VwcHJlc3NlZC4NCiAgICANCiAgICBJZiBDe2ludEV4cHJ9IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlcyBhbiBpbnRlZ2VyIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCcyIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQoNCiAgICAgICAgIyBpbiB0aGlzIHBhcnNlciwgdGhlIGxlYWRpbmcgaW50ZWdlciB2YWx1ZSBpcyBnaXZlbiBpbiBiaW5hcnksDQogICAgICAgICMgJzEwJyBpbmRpY2F0aW5nIHRoYXQgMiB2YWx1ZXMgYXJlIGluIHRoZSBhcnJheQ0KICAgICAgICBiaW5hcnlDb25zdGFudCA9IFdvcmQoJzAxJykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6IGludCh0WzBdLCAyKSkNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSwgaW50RXhwcj1iaW5hcnlDb25zdGFudCkucGFyc2VTdHJpbmcoJzEwIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQogICAgIiIiDQogICAgYXJyYXlFeHByID0gRm9yd2FyZCgpDQogICAgZGVmIGNvdW50RmllbGRQYXJzZUFjdGlvbihzLGwsdCk6DQogICAgICAgIG4gPSB0WzBdDQogICAgICAgIGFycmF5RXhwciA8PCAobiBhbmQgR3JvdXAoQW5kKFtleHByXSpuKSkgb3IgR3JvdXAoZW1wdHkpKQ0KICAgICAgICByZXR1cm4gW10NCiAgICBpZiBpbnRFeHByIGlzIE5vbmU6DQogICAgICAgIGludEV4cHIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OmludCh0WzBdKSkNCiAgICBlbHNlOg0KICAgICAgICBpbnRFeHByID0gaW50RXhwci5jb3B5KCkNCiAgICBpbnRFeHByLnNldE5hbWUoImFycmF5TGVuIikNCiAgICBpbnRFeHByLmFkZFBhcnNlQWN0aW9uKGNvdW50RmllbGRQYXJzZUFjdGlvbiwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJldHVybiAoIGludEV4cHIgKyBhcnJheUV4cHIgKS5zZXROYW1lKCcobGVuKSAnICsgX3VzdHIoZXhwcikgKyAnLi4uJykNCg0KZGVmIF9mbGF0dGVuKEwpOg0KICAgIHJldCA9IFtdDQogICAgZm9yIGkgaW4gTDoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLGxpc3QpOg0KICAgICAgICAgICAgcmV0LmV4dGVuZChfZmxhdHRlbihpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldC5hcHBlbmQoaSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBtYXRjaFByZXZpb3VzTGl0ZXJhbChleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0xpdGVyYWwoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGENCiAgICBwcmV2aW91cyBsaXRlcmFsLCB3aWxsIGFsc28gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Lg0KICAgIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHVzZSBDe21hdGNoUHJldmlvdXNFeHByfS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBpZiB0Og0KICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6DQogICAgICAgICAgICAgICAgcmVwIDw8IHRbMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBmbGF0dGVuIHQgdG9rZW5zDQogICAgICAgICAgICAgICAgdGZsYXQgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgICAgIHJlcCA8PCBBbmQoTGl0ZXJhbCh0dCkgZm9yIHR0IGluIHRmbGF0KQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmVwIDw8IEVtcHR5KCkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBtYXRjaFByZXZpb3VzRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0V4cHIoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGJ5DQogICAgZXhwcmVzc2lvbnMsIHdpbGwgSXtub3R9IG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifTsNCiAgICB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZWQsIHNvDQogICAgQ3siMSJ9IGlzIGNvbXBhcmVkIHdpdGggQ3siMTAifS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZTIgPSBleHByLmNvcHkoKQ0KICAgIHJlcCA8PD0gZTINCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIG1hdGNoVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgZGVmIG11c3RNYXRjaFRoZXNlVG9rZW5zKHMsbCx0KToNCiAgICAgICAgICAgIHRoZXNlVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmICB0aGVzZVRva2VucyAhPSBtYXRjaFRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIiwwLCIiKQ0KICAgICAgICByZXAuc2V0UGFyc2VBY3Rpb24oIG11c3RNYXRjaFRoZXNlVG9rZW5zLCBjYWxsRHVyaW5nVHJ5PVRydWUgKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMocyk6DQogICAgI34gIGVzY2FwZSB0aGVzZSBjaGFyczogXi1dDQogICAgZm9yIGMgaW4gciJcXi1dIjoNCiAgICAgICAgcyA9IHMucmVwbGFjZShjLF9ic2xhc2grYykNCiAgICBzID0gcy5yZXBsYWNlKCJcbiIsciJcbiIpDQogICAgcyA9IHMucmVwbGFjZSgiXHQiLHIiXHQiKQ0KICAgIHJldHVybiBfdXN0cihzKQ0KDQpkZWYgb25lT2YoIHN0cnMsIGNhc2VsZXNzPUZhbHNlLCB1c2VSZWdleD1UcnVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHF1aWNrbHkgZGVmaW5lIGEgc2V0IG9mIGFsdGVybmF0aXZlIExpdGVyYWxzLCBhbmQgbWFrZXMgc3VyZSB0byBkbw0KICAgIGxvbmdlc3QtZmlyc3QgdGVzdGluZyB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IG9yZGVyLA0KICAgIGJ1dCByZXR1cm5zIGEgQ3tMe01hdGNoRmlyc3R9fSBmb3IgYmVzdCBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gc3RycyAtIGEgc3RyaW5nIG9mIHNwYWNlLWRlbGltaXRlZCBsaXRlcmFscywgb3IgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBsaXRlcmFscw0KICAgICAtIGNhc2VsZXNzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIC0gdHJlYXQgYWxsIGxpdGVyYWxzIGFzIGNhc2VsZXNzDQogICAgIC0gdXNlUmVnZXggLSAoZGVmYXVsdD1De1RydWV9KSAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2lsbCBnZW5lcmF0ZSBhIFJlZ2V4DQogICAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UsIHdpbGwgZ2VuZXJhdGUgYSBDe01hdGNoRmlyc3R9IG9iamVjdCAoaWYgQ3tjYXNlbGVzcz1UcnVlfSwgb3INCiAgICAgICAgICBpZiBjcmVhdGluZyBhIEN7UmVnZXh9IHJhaXNlcyBhbiBleGNlcHRpb24pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29tcF9vcGVyID0gb25lT2YoIjwgPSA+IDw9ID49ICE9IikNCiAgICAgICAgdmFyID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IHZhciB8IG51bWJlcg0KICAgICAgICBjb21wYXJpc29uX2V4cHIgPSB0ZXJtICsgY29tcF9vcGVyICsgdGVybQ0KICAgICAgICBwcmludChjb21wYXJpc29uX2V4cHIuc2VhcmNoU3RyaW5nKCJCID0gMTIgIEFBPTIzIEI8PUFBIEFBPjEyIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snQicsICc9JywgJzEyJ10sIFsnQUEnLCAnPScsICcyMyddLCBbJ0InLCAnPD0nLCAnQUEnXSwgWydBQScsICc+JywgJzEyJ11dDQogICAgIiIiDQogICAgaWYgY2FzZWxlc3M6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEudXBwZXIoKSA9PSBiLnVwcGVyKCkgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi51cHBlcigpLnN0YXJ0c3dpdGgoYS51cHBlcigpKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gQ2FzZWxlc3NMaXRlcmFsDQogICAgZWxzZToNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYSA9PSBiICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIuc3RhcnRzd2l0aChhKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gTGl0ZXJhbA0KDQogICAgc3ltYm9scyA9IFtdDQogICAgaWYgaXNpbnN0YW5jZShzdHJzLGJhc2VzdHJpbmcpOg0KICAgICAgICBzeW1ib2xzID0gc3Rycy5zcGxpdCgpDQogICAgZWxpZiBpc2luc3RhbmNlKHN0cnMsIEl0ZXJhYmxlKToNCiAgICAgICAgc3ltYm9scyA9IGxpc3Qoc3RycykNCiAgICBlbHNlOg0KICAgICAgICB3YXJuaW5ncy53YXJuKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9uZU9mLCBleHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUiLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICBpZiBub3Qgc3ltYm9sczoNCiAgICAgICAgcmV0dXJuIE5vTWF0Y2goKQ0KDQogICAgaSA9IDANCiAgICB3aGlsZSBpIDwgbGVuKHN5bWJvbHMpLTE6DQogICAgICAgIGN1ciA9IHN5bWJvbHNbaV0NCiAgICAgICAgZm9yIGosb3RoZXIgaW4gZW51bWVyYXRlKHN5bWJvbHNbaSsxOl0pOg0KICAgICAgICAgICAgaWYgKCBpc2VxdWFsKG90aGVyLCBjdXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsaWYgKCBtYXNrcyhjdXIsIG90aGVyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIHN5bWJvbHMuaW5zZXJ0KGksb3RoZXIpDQogICAgICAgICAgICAgICAgY3VyID0gb3RoZXINCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaSArPSAxDQoNCiAgICBpZiBub3QgY2FzZWxlc3MgYW5kIHVzZVJlZ2V4Og0KICAgICAgICAjfiBwcmludCAoc3RycywiLT4iLCAifCIuam9pbiggWyBfZXNjYXBlUmVnZXhDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9sc10gKSkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgbGVuKHN5bWJvbHMpPT1sZW4oIiIuam9pbihzeW1ib2xzKSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAiWyVzXSIgJSAiIi5qb2luKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJ8Ii5qb2luKHJlLmVzY2FwZShzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJFeGNlcHRpb24gY3JlYXRpbmcgUmVnZXggZm9yIG9uZU9mLCBidWlsZGluZyBNYXRjaEZpcnN0IiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQoNCiAgICAjIGxhc3QgcmVzb3J0LCBqdXN0IHVzZSBNYXRjaEZpcnN0DQogICAgcmV0dXJuIE1hdGNoRmlyc3QocGFyc2VFbGVtZW50Q2xhc3Moc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCg0KZGVmIGRpY3RPZigga2V5LCB2YWx1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgYW5kIGNsZWFybHkgZGVmaW5lIGEgZGljdGlvbmFyeSBieSBzcGVjaWZ5aW5nIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zDQogICAgZm9yIHRoZSBrZXkgYW5kIHZhbHVlLiAgVGFrZXMgY2FyZSBvZiBkZWZpbmluZyB0aGUgQ3tMe0RpY3R9fSwgQ3tMe1plcm9Pck1vcmV9fSwgYW5kIEN7THtHcm91cH19IHRva2Vucw0KICAgIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGUga2V5IHBhdHRlcm4gY2FuIGluY2x1ZGUgZGVsaW1pdGluZyBtYXJrZXJzIG9yIHB1bmN0dWF0aW9uLA0KICAgIGFzIGxvbmcgYXMgdGhleSBhcmUgc3VwcHJlc3NlZCwgdGhlcmVieSBsZWF2aW5nIHRoZSBzaWduaWZpY2FudCBrZXkgdGV4dC4gIFRoZSB2YWx1ZQ0KICAgIHBhdHRlcm4gY2FuIGluY2x1ZGUgbmFtZWQgcmVzdWx0cywgc28gdGhhdCB0aGUgQ3tEaWN0fSByZXN1bHRzIGNhbiBpbmNsdWRlIG5hbWVkIHRva2VuDQogICAgZmllbGRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICBhdHRyX2xhYmVsID0gbGFiZWwNCiAgICAgICAgYXR0cl92YWx1ZSA9IFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKQ0KDQogICAgICAgICMgc2ltaWxhciB0byBEaWN0LCBidXQgc2ltcGxlciBjYWxsIGZvcm1hdA0KICAgICAgICByZXN1bHQgPSBkaWN0T2YoYXR0cl9sYWJlbCwgYXR0cl92YWx1ZSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKQ0KICAgICAgICBwcmludChyZXN1bHQuc2hhcGUpICAjIG9iamVjdCBhdHRyaWJ1dGUgYWNjZXNzIHdvcmtzIHRvbw0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdzaGFwZSc6ICdTUVVBUkUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJ30NCiAgICAiIiINCiAgICByZXR1cm4gRGljdCggWmVyb09yTW9yZSggR3JvdXAgKCBrZXkgKyB2YWx1ZSApICkgKQ0KDQpkZWYgb3JpZ2luYWxUZXh0Rm9yKGV4cHIsIGFzU3RyaW5nPVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsLCB1bnRva2VuaXplZCB0ZXh0IGZvciBhIGdpdmVuIGV4cHJlc3Npb24uICBVc2VmdWwgdG8NCiAgICByZXN0b3JlIHRoZSBwYXJzZWQgZmllbGRzIG9mIGFuIEhUTUwgc3RhcnQgdGFnIGludG8gdGhlIHJhdyB0YWcgdGV4dCBpdHNlbGYsIG9yIHRvDQogICAgcmV2ZXJ0IHNlcGFyYXRlIHRva2VucyB3aXRoIGludGVydmVuaW5nIHdoaXRlc3BhY2UgYmFjayB0byB0aGUgb3JpZ2luYWwgbWF0Y2hpbmcNCiAgICBpbnB1dCB0ZXh0LiBCeSBkZWZhdWx0LCByZXR1cm5zIGFzdHJpbmcgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyc2VkIHRleHQuICANCiAgICAgICANCiAgICBJZiB0aGUgb3B0aW9uYWwgQ3thc1N0cmluZ30gYXJndW1lbnQgaXMgcGFzc2VkIGFzIEN7RmFsc2V9LCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYSANCiAgICBDe0x7UGFyc2VSZXN1bHRzfX0gY29udGFpbmluZyBhbnkgcmVzdWx0cyBuYW1lcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBtYXRjaGVkLCBhbmQgYSANCiAgICBzaW5nbGUgdG9rZW4gY29udGFpbmluZyB0aGUgb3JpZ2luYWwgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZy4gIFNvIGlmIA0KICAgIHRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDe0x7b3JpZ2luYWxUZXh0Rm9yfX0gY29udGFpbnMgZXhwcmVzc2lvbnMgd2l0aCBkZWZpbmVkDQogICAgcmVzdWx0cyBuYW1lcywgeW91IG11c3Qgc2V0IEN7YXNTdHJpbmd9IHRvIEN7RmFsc2V9IGlmIHlvdSB3YW50IHRvIHByZXNlcnZlIHRob3NlDQogICAgcmVzdWx0cyBuYW1lIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzcmMgPSAidGhpcyBpcyB0ZXN0IDxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4gbm9ybWFsIHRleHQgIg0KICAgICAgICBmb3IgdGFnIGluICgiYiIsImkiKToNCiAgICAgICAgICAgIG9wZW5lcixjbG9zZXIgPSBtYWtlSFRNTFRhZ3ModGFnKQ0KICAgICAgICAgICAgcGF0dCA9IG9yaWdpbmFsVGV4dEZvcihvcGVuZXIgKyBTa2lwVG8oY2xvc2VyKSArIGNsb3NlcikNCiAgICAgICAgICAgIHByaW50KHBhdHQuc2VhcmNoU3RyaW5nKHNyYylbMF0pDQogICAgcHJpbnRzOjoNCiAgICAgICAgWyc8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+J10NCiAgICAgICAgWyc8aT50ZXh0PC9pPiddDQogICAgIiIiDQogICAgbG9jTWFya2VyID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsb2MsdDogbG9jKQ0KICAgIGVuZGxvY01hcmtlciA9IGxvY01hcmtlci5jb3B5KCkNCiAgICBlbmRsb2NNYXJrZXIuY2FsbFByZXBhcnNlID0gRmFsc2UNCiAgICBtYXRjaEV4cHIgPSBsb2NNYXJrZXIoIl9vcmlnaW5hbF9zdGFydCIpICsgZXhwciArIGVuZGxvY01hcmtlcigiX29yaWdpbmFsX2VuZCIpDQogICAgaWYgYXNTdHJpbmc6DQogICAgICAgIGV4dHJhY3RUZXh0ID0gbGFtYmRhIHMsbCx0OiBzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0NCiAgICBlbHNlOg0KICAgICAgICBkZWYgZXh0cmFjdFRleHQocyxsLHQpOg0KICAgICAgICAgICAgdFs6XSA9IFtzW3QucG9wKCdfb3JpZ2luYWxfc3RhcnQnKTp0LnBvcCgnX29yaWdpbmFsX2VuZCcpXV0NCiAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oZXh0cmFjdFRleHQpDQogICAgbWF0Y2hFeHByLmlnbm9yZUV4cHJzID0gZXhwci5pZ25vcmVFeHBycw0KICAgIHJldHVybiBtYXRjaEV4cHINCg0KZGVmIHVuZ3JvdXAoZXhwcik6IA0KICAgICIiIg0KICAgIEhlbHBlciB0byB1bmRvIHB5cGFyc2luZydzIGRlZmF1bHQgZ3JvdXBpbmcgb2YgQW5kIGV4cHJlc3Npb25zLCBldmVuDQogICAgaWYgYWxsIGJ1dCBvbmUgYXJlIG5vbi1lbXB0eS4NCiAgICAiIiINCiAgICByZXR1cm4gVG9rZW5Db252ZXJ0ZXIoZXhwcikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXSkNCg0KZGVmIGxvY2F0ZWRFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWNvcmF0ZSBhIHJldHVybmVkIHRva2VuIHdpdGggaXRzIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgVGhpcyBoZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHMgbmFtZXM6DQogICAgIC0gbG9jbl9zdGFydCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBiZWdpbnMNCiAgICAgLSBsb2NuX2VuZCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBlbmRzDQogICAgIC0gdmFsdWUgPSB0aGUgYWN0dWFsIHBhcnNlZCByZXN1bHRzDQoNCiAgICBCZSBjYXJlZnVsIGlmIHRoZSBpbnB1dCB0ZXh0IGNvbnRhaW5zIEN7PFRBQj59IGNoYXJhY3RlcnMsIHlvdSBtYXkgd2FudCB0byBjYWxsDQogICAgQ3tMe1BhcnNlckVsZW1lbnQucGFyc2VXaXRoVGFic319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgZm9yIG1hdGNoIGluIGxvY2F0ZWRFeHByKHdkKS5zZWFyY2hTdHJpbmcoImxqc2RmMTIzbGtzZGpqZjEyM2xra2pqMTIyMiIpOg0KICAgICAgICAgICAgcHJpbnQobWF0Y2gpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1swLCAnbGpzZGYnLCA1XV0NCiAgICAgICAgW1s4LCAnbGtzZGpqZicsIDE1XV0NCiAgICAgICAgW1sxOCwgJ2xra2pqJywgMjNdXQ0KICAgICIiIg0KICAgIGxvY2F0b3IgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDogbCkNCiAgICByZXR1cm4gR3JvdXAobG9jYXRvcigibG9jbl9zdGFydCIpICsgZXhwcigidmFsdWUiKSArIGxvY2F0b3IuY29weSgpLmxlYXZlV2hpdGVzcGFjZSgpKCJsb2NuX2VuZCIpKQ0KDQoNCiMgY29udmVuaWVuY2UgY29uc3RhbnRzIGZvciBwb3NpdGlvbmFsIGV4cHJlc3Npb25zDQplbXB0eSAgICAgICA9IEVtcHR5KCkuc2V0TmFtZSgiZW1wdHkiKQ0KbGluZVN0YXJ0ICAgPSBMaW5lU3RhcnQoKS5zZXROYW1lKCJsaW5lU3RhcnQiKQ0KbGluZUVuZCAgICAgPSBMaW5lRW5kKCkuc2V0TmFtZSgibGluZUVuZCIpDQpzdHJpbmdTdGFydCA9IFN0cmluZ1N0YXJ0KCkuc2V0TmFtZSgic3RyaW5nU3RhcnQiKQ0Kc3RyaW5nRW5kICAgPSBTdHJpbmdFbmQoKS5zZXROYW1lKCJzdHJpbmdFbmQiKQ0KDQpfZXNjYXBlZFB1bmMgPSBXb3JkKCBfYnNsYXNoLCByIlxbXS0qLiQrXj8oKX4gIiwgZXhhY3Q9MiApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdWzFdKQ0KX2VzY2FwZWRIZXhDaGFyID0gUmVnZXgociJcXDA/W3hYXVswLTlhLWZBLUZdKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF0ubHN0cmlwKHInXDB4JyksMTYpKSkNCl9lc2NhcGVkT2N0Q2hhciA9IFJlZ2V4KHIiXFwwWzAtN10rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXVsxOl0sOCkpKQ0KX3NpbmdsZUNoYXIgPSBfZXNjYXBlZFB1bmMgfCBfZXNjYXBlZEhleENoYXIgfCBfZXNjYXBlZE9jdENoYXIgfCBDaGFyc05vdEluKHInXF0nLCBleGFjdD0xKQ0KX2NoYXJSYW5nZSA9IEdyb3VwKF9zaW5nbGVDaGFyICsgU3VwcHJlc3MoIi0iKSArIF9zaW5nbGVDaGFyKQ0KX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIg0KDQpkZWYgc3JhbmdlKHMpOg0KICAgIHIiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzDQogICAgc3ludGF4IGZyb20gcmVnZXhwICdbXScgc3RyaW5nIHJhbmdlIGRlZmluaXRpb25zOjoNCiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiDQogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiINCiAgICAgICAgc3JhbmdlKCJbYS16JF9dIikgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JF8iDQogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZA0KICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIFRoZSB2YWx1ZXMgZW5jbG9zZWQgaW4gdGhlIFtdJ3MgbWF5IGJlOg0KICAgICAtIGEgc2luZ2xlIGNoYXJhY3Rlcg0KICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkNCiAgICAgLSBhbiBlc2NhcGVkIGhleCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXHgnfSAoQ3tceDIxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKSANCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIA0KICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikNCiAgICAgLSBhIHJhbmdlIG9mIGFueSBvZiB0aGUgYWJvdmUsIHNlcGFyYXRlZCBieSBhIGRhc2ggKEN7J2Eteid9LCBldGMuKQ0KICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQ0KICAgICIiIg0KICAgIF9leHBhbmRlZCA9IGxhbWJkYSBwOiBwIGlmIG5vdCBpc2luc3RhbmNlKHAsUGFyc2VSZXN1bHRzKSBlbHNlICcnLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIHJhbmdlKG9yZChwWzBdKSxvcmQocFsxXSkrMSkpDQogICAgdHJ5Og0KICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICByZXR1cm4gIiINCg0KZGVmIG1hdGNoT25seUF0Q29sKG4pOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMNCiAgICBjb2x1bW4gaW4gdGhlIGlucHV0IHRleHQuDQogICAgIiIiDQogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6DQogICAgICAgIGlmIGNvbChsb2NuLHN0cmcpICE9IG46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQ0KICAgIHJldHVybiB2ZXJpZnlDb2wNCg0KZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbW1vbiBwYXJzZSBhY3Rpb25zIHRoYXQgc2ltcGx5IHJldHVybiBhIGxpdGVyYWwgdmFsdWUuICBFc3BlY2lhbGx5DQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkNCiAgICAgICAgdGVybSA9IG5hIHwgbnVtDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0NCiAgICAiIiINCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0NCg0KZGVmIHJlbW92ZVF1b3RlcyhzLGwsdCk6DQogICAgIiIiDQogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyJdDQoNCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5zZXRQYXJzZUFjdGlvbihyZW1vdmVRdW90ZXMpDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdDQogICAgIiIiDQogICAgcmV0dXJuIHRbMF1bMTotMV0NCg0KZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCANCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXINCiAgICB0aGUgdG9rZW4sIGFzIGluIEN7aGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKX0sIHdoaWNoIHdpbGwgY29udmVydCB0aGUNCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuDQoNCiAgICBFeGFtcGxlIChjb21wYXJlIHRoZSBsYXN0IHRvIGV4YW1wbGUgaW4gTHtQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZ306Og0KICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkNCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnDQogICAgICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICAgICAgJycnKQ0KICAgICAgICANCiAgICAgICAgdXBwZXJ3b3JkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci51cHBlcikpDQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpDQogICAgICAgIE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQ0KDQogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10NCg0KICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddDQogICAgIiIiDQogICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQ0KDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHBhLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gcGENCg0KdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiDQoNCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiINCiAgICANCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOg0KICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiINCiAgICBpZiBpc2luc3RhbmNlKHRhZ1N0cixiYXNlc3RyaW5nKToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cg0KICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkNCiAgICBlbHNlOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUNCg0KICAgIHRhZ0F0dHJOYW1lID0gV29yZChhbHBoYXMsYWxwaGFudW1zKyJfLToiKQ0KICAgIGlmICh4bWwpOg0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGVsc2U6DQogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikNCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikNCg0KICAgIG9wZW5UYWcgPSBvcGVuVGFnLnNldFJlc3VsdHNOYW1lKCJzdGFydCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPCVzPiIgJSByZXNuYW1lKQ0KICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkNCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUNCiAgICBjbG9zZVRhZy50YWcgPSByZXNuYW1lDQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnDQoNCmRlZiBtYWtlSFRNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZSwgYXR0cmlidXRlcyB3aXRoIG5hbWVzcGFjZXMgYW5kIHdpdGggcXVvdGVkIG9yIHVucXVvdGVkIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQ0KICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikNCiAgICAgICAgbGlua19leHByID0gYSArIFNraXBUbyhhX2VuZCkoImxpbmtfdGV4dCIpICsgYV9lbmQNCiAgICAgICAgDQogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6DQogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgaW4gdGhlIDxBPiB0YWcgKGxpa2UgImhyZWYiIHNob3duIGhlcmUpIGFyZSBhbHNvIGFjY2Vzc2libGUgYXMgbmFtZWQgcmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikNCiAgICBwcmludHM6Og0KICAgICAgICBweXBhcnNpbmcgLT4gaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQ0KDQpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBYTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7bWFrZUhUTUxUYWdzfQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApDQoNCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjcmVhdGUgYSB2YWxpZGF0aW5nIHBhcnNlIGFjdGlvbiB0byBiZSB1c2VkIHdpdGggc3RhcnQgdGFncyBjcmVhdGVkDQogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcNCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMNCiAgICBDezxURD59IG9yIEN7PERJVj59Lg0KDQogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QNCiAgICBvZiBmaWx0ZXIgYXR0cmlidXRlcyBuYW1lcyBhbmQgdmFsdWVzIGFzOg0KICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yDQogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24NCiAgICAgICAgICByZXNlcnZlZCB3b3JkLCBhcyBpbiBDeyoqeyJjbGFzcyI6IkN1c3RvbWVyIiwgImFsaWduIjoicmlnaHQifX0NCiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkNCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlDQogICAgbmFtZXMgYXJlIG1hdGNoZWQgaW5zZW5zaXRpdmUgdG8gdXBwZXIvbG93ZXIgY2FzZS4NCiAgICAgICANCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319Lg0KDQogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcw0KICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCg0KICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIg0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQ0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUNCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgaWYgYXJnczoNCiAgICAgICAgYXR0cnMgPSBhcmdzWzpdDQogICAgZWxzZToNCiAgICAgICAgYXR0cnMgPSBhdHRyRGljdC5pdGVtcygpDQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10NCiAgICBkZWYgcGEocyxsLHRva2Vucyk6DQogICAgICAgIGZvciBhdHRyTmFtZSxhdHRyVmFsdWUgaW4gYXR0cnM6DQogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkNCiAgICAgICAgICAgIGlmIGF0dHJWYWx1ZSAhPSB3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSBhbmQgdG9rZW5zW2F0dHJOYW1lXSAhPSBhdHRyVmFsdWU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkNCiAgICByZXR1cm4gcGENCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkNCg0KZGVmIHdpdGhDbGFzcyhjbGFzc25hbWUsIG5hbWVzcGFjZT0nJyk6DQogICAgIiIiDQogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUNCiAgICBkaWZmaWN1bHQgYmVjYXVzZSBDe2NsYXNzfSBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQ0KICAgICAgICANCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyINCiAgICByZXR1cm4gd2l0aEF0dHJpYnV0ZSgqKntjbGFzc2F0dHIgOiBjbGFzc25hbWV9KSAgICAgICAgDQoNCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkNCm9wQXNzb2MuTEVGVCA9IG9iamVjdCgpDQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkNCg0KZGVmIGluZml4Tm90YXRpb24oIGJhc2VFeHByLCBvcExpc3QsIGxwYXI9U3VwcHJlc3MoJygnKSwgcnBhcj1TdXBwcmVzcygnKScpICk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YNCiAgICBvcGVyYXRvcnMgd29ya2luZyBpbiBhIHByZWNlZGVuY2UgaGllcmFyY2h5LiAgT3BlcmF0b3JzIG1heSBiZSB1bmFyeSBvcg0KICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkDQogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSANCiAgICBvZiBwYXJlbnRoZXNlcyB0byBvdmVycmlkZSBvcGVyYXRvciBwcmVjZWRlbmNlcyAoc2VlIGV4YW1wbGUgYmVsb3cpLg0KICAgIA0KICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3Vlcw0KICAgIHdoZW4gdXNpbmcgaW5maXhOb3RhdGlvbi4gU2VlIEx7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0fSBmb3IgYQ0KICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQNCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlDQogICAgICBleHByZXNzaW9uIGdyYW1tYXI7IGVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0NCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToNCiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsNCiAgICAgICAgICBtYXkgYWxzbyBiZSBhIHN0cmluZywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBMaXRlcmFsOw0KICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQ0KICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcw0KICAgICAgIC0gbnVtVGVybXMgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBmb3IgdGhpcyBvcGVyYXRvciAobXVzdA0KICAgICAgICAgIGJlIDEsIDIsIG9yIDMpDQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzDQogICAgICAgICAgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2ZSwgdXNpbmcgdGhlIHB5cGFyc2luZy1kZWZpbmVkDQogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4NCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoDQogICAgICAgICAgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhpcyBvcGVyYXRvciBleHByZXNzaW9uICh0aGUNCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKTsgaWYgdGhlIHBhcnNlIGFjdGlvbg0KICAgICAgICAgIGlzIHBhc3NlZCBhIHR1cGxlIG9yIGxpc3Qgb2YgZnVuY3Rpb25zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8NCiAgICAgICAgICBjYWxsaW5nIEN7c2V0UGFyc2VBY3Rpb24oKmZuKX0gKEx7UGFyc2VyRWxlbWVudC5zZXRQYXJzZUFjdGlvbn0pDQogICAgIC0gbHBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGxlZnQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKCcpfSkNCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzDQogICAgICAgIGludGVnZXIgPSBweXBhcnNpbmdfY29tbW9uLnNpZ25lZF9pbnRlZ2VyDQogICAgICAgIHZhcm5hbWUgPSBweXBhcnNpbmdfY29tbW9uLmlkZW50aWZpZXIgDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByID0gaW5maXhOb3RhdGlvbihpbnRlZ2VyIHwgdmFybmFtZSwNCiAgICAgICAgICAgIFsNCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLA0KICAgICAgICAgICAgKG9uZU9mKCcqIC8nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIChvbmVPZignKyAtJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICBdKQ0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIDUrMyo2DQogICAgICAgICAgICAoNSszKSo2DQogICAgICAgICAgICAtMi0tMTENCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpDQogICAgcHJpbnRzOjoNCiAgICAgICAgNSszKjYNCiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0NCg0KICAgICAgICAoNSszKSo2DQogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dDQoNCiAgICAgICAgLTItLTExDQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0NCiAgICAiIiINCiAgICByZXQgPSBGb3J3YXJkKCkNCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApDQogICAgZm9yIGksb3BlckRlZiBpbiBlbnVtZXJhdGUob3BMaXN0KToNCiAgICAgICAgb3BFeHByLGFyaXR5LHJpZ2h0TGVmdEFzc29jLHBhID0gKG9wZXJEZWYgKyAoTm9uZSwpKVs6NF0NCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHINCiAgICAgICAgaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgIGlmIG9wRXhwciBpcyBOb25lIG9yIGxlbihvcEV4cHIpICE9IDI6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpDQogICAgICAgICAgICBvcEV4cHIxLCBvcEV4cHIyID0gb3BFeHByDQogICAgICAgIHRoaXNFeHByID0gRm9yd2FyZCgpLnNldE5hbWUodGVybU5hbWUpDQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyBsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIGxhc3RFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIrbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKGxhc3RFeHByKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLlJJR0hUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdA0KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wRXhwciwgT3B0aW9uYWwpOg0KICAgICAgICAgICAgICAgICAgICBvcEV4cHIgPSBPcHRpb25hbChvcEV4cHIpDQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCB0aGlzRXhwciApICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQ0KICAgICAgICBpZiBwYToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGEsICh0dXBsZSwgbGlzdCkpOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbigqcGEpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihwYSkNCiAgICAgICAgdGhpc0V4cHIgPDw9ICggbWF0Y2hFeHByLnNldE5hbWUodGVybU5hbWUpIHwgbGFzdEV4cHIgKQ0KICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByDQogICAgcmV0IDw8PSBsYXN0RXhwcg0KICAgIHJldHVybiByZXQNCg0Kb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbg0KIiIiKERlcHJlY2F0ZWQpIEZvcm1lciBuYW1lIG9mIEN7THtpbmZpeE5vdGF0aW9ufX0sIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIiIg0KDQpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQ0Kc2dsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIikNCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfA0KICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpDQp1bmljb2RlU3RyaW5nID0gQ29tYmluZShfTCgndScpICsgcXVvdGVkU3RyaW5nLmNvcHkoKSkuc2V0TmFtZSgidW5pY29kZSBzdHJpbmcgbGl0ZXJhbCIpDQoNCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZw0KICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjbG9zZXIgLSBjbG9zaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIpIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pDQoNCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQNCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMNCiAgICBhcyBhIGxpc3Qgb2Ygc2VwYXJhdGUgdmFsdWVzLg0KDQogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluDQogICAgb3BlbmluZyBvciBjbG9zaW5nIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgb3BlbmluZw0KICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50DQogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4NCiAgICBUaGUgZGVmYXVsdCBpcyBMe3F1b3RlZFN0cmluZ30sIGJ1dCBpZiBubyBleHByZXNzaW9ucyBhcmUgdG8gYmUgaWdub3JlZCwNCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpDQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQ0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykNCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXINCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkNCiAgICAgICAgTFBBUixSUEFSID0gbWFwKFN1cHByZXNzLCAiKCkiKQ0KDQogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQ0KDQogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSANCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikNCiAgICAgICAgICAgICAgICAgICAgICArIExQQVIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KGFyZyksIFtdKSgiYXJncyIpICsgUlBBUiANCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQ0KICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICANCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycNCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgDQogICAgICAgICAgICAgICAgcmV0dXJuICh4JTIpOyANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGludCBkZWNfdG9faGV4KGNoYXIgaGNoYXIpIHsgDQogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOw0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9DQogICAgICAgICcnJw0KICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6DQogICAgICAgICAgICBwcmludCgiJShuYW1lKXMgKCUodHlwZSlzKSBhcmdzOiAlKGFyZ3MpcyIgJSBmdW5jKQ0KDQogICAgcHJpbnRzOjoNCiAgICAgICAgaXNfb2RkIChpbnQpIGFyZ3M6IFtbJ2ludCcsICd4J11dDQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQ0KICAgICIiIg0KICAgIGlmIG9wZW5lciA9PSBjbG9zZXI6DQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQ0KICAgIGlmIGNvbnRlbnQgaXMgTm9uZToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvcGVuZXIsYmFzZXN0cmluZykgYW5kIGlzaW5zdGFuY2UoY2xvc2VyLGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICBlbHNlOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzDQogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0DQogICAgICAgICAgICBpcyByZXBlYXRlZCB3aXRoaW4gdGhlIGluZGVudGVkIGJsb2NrDQogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjaw0KICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyDQogICAgICAgICAgICBzaG91bGQgc2hhcmUgYSBjb21tb24gaW5kZW50U3RhY2spDQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlDQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cw0KICAgICAgICAgICAgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhID0gJycnDQogICAgICAgIGRlZiBBKHopOg0KICAgICAgICAgIEExDQogICAgICAgICAgQiA9IDEwMA0KICAgICAgICAgIEcgPSBBMg0KICAgICAgICAgIEEyDQogICAgICAgICAgQTMNCiAgICAgICAgQg0KICAgICAgICBkZWYgQkIoYSxiLGMpOg0KICAgICAgICAgIEJCMQ0KICAgICAgICAgIGRlZiBCQkEoKToNCiAgICAgICAgICAgIGJiYTENCiAgICAgICAgICAgIGJiYTINCiAgICAgICAgICAgIGJiYTMNCiAgICAgICAgQw0KICAgICAgICBEDQogICAgICAgIGRlZiBzcGFtKHgseSk6DQogICAgICAgICAgICAgZGVmIGVnZ3Moeik6DQogICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgJycnDQoNCg0KICAgICAgICBpbmRlbnRTdGFjayA9IFsxXQ0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpDQoNCiAgICAgICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpDQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spDQogICAgICAgIGZ1bmNEZWYgPSBHcm91cCggZnVuY0RlY2wgKyBmdW5jX2JvZHkgKQ0KDQogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQ0KICAgICAgICBmdW5jQ2FsbCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiKCIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHJ2YWx1ZSkpICsgIikiKQ0KICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpDQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQ0KICAgICAgICBzdG10IDw8ICggZnVuY0RlZiB8IGFzc2lnbm1lbnQgfCBpZGVudGlmaWVyICkNCg0KICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQ0KDQogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpDQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ2RlZicsDQogICAgICAgICAgJ0EnLA0KICAgICAgICAgIFsnKCcsICd6JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLA0KICAgICAgICAgJ0InLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdCQicsDQogICAgICAgICAgWycoJywgJ2EnLCAnYicsICdjJywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sDQogICAgICAgICAnQycsDQogICAgICAgICAnRCcsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ3NwYW0nLA0KICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbW1snZGVmJywgJ2VnZ3MnLCBbJygnLCAneicsICcpJ10sICc6JywgW1sncGFzcyddXV1dXV1dIA0KICAgICIiIg0KICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToNCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBzdWJlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYW4gdW5pbmRlbnQiKQ0KICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQ0KDQogICAgTkwgPSBPbmVPck1vcmUoTGluZUVuZCgpLnNldFdoaXRlc3BhY2VDaGFycygiXHQgIikuc3VwcHJlc3MoKSkNCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQ0KICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQ0KICAgIFVOREVOVCA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tVbmluZGVudCkuc2V0TmFtZSgnVU5JTkRFTlQnKQ0KICAgIGlmIGluZGVudDoNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAjfiBGb2xsb3dlZEJ5KGJsb2NrU3RhdGVtZW50RXhwcikgKw0KICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpDQogICAgZWxzZToNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApDQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQ0KICAgIHJldHVybiBzbUV4cHIuc2V0TmFtZSgnaW5kZW50ZWQgYmxvY2snKQ0KDQphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQ0KcHVuYzhiaXQgPSBzcmFuZ2UociJbXDB4YTEtXDB4YmZcMHhkN1wweGY3XSIpDQoNCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkNCl9odG1sRW50aXR5TWFwID0gZGljdCh6aXAoImd0IGx0IGFtcCBuYnNwIHF1b3QgYXBvcyIuc3BsaXQoKSwnPjwmICJcJycpKQ0KY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikNCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToNCiAgICAiIiJIZWxwZXIgcGFyc2VyIGFjdGlvbiB0byByZXBsYWNlIGNvbW1vbiBIVE1MIGVudGl0aWVzIHdpdGggdGhlaXIgc3BlY2lhbCBjaGFyYWN0ZXJzIiIiDQogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkNCg0KIyBpdCdzIGVhc3kgdG8gZ2V0IHRoZXNlIGNvbW1lbnQgc3RydWN0dXJlcyB3cm9uZyAtIHRoZXkncmUgdmVyeSBjb21tb24sIHNvIG1heSBhcyB3ZWxsIG1ha2UgdGhlbSBhdmFpbGFibGUNCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iDQoNCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59Ig0KDQpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpDQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8vIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIGVpdGhlciBmb3JtIEN7THtjU3R5bGVDb21tZW50fX0gb3IgQ3tMe2RibFNsYXNoQ29tbWVudH19Ig0KDQpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50DQoiU2FtZSBhcyBDe0x7Y3BwU3R5bGVDb21tZW50fX0iDQoNCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3sjIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBXb3JkKCIgXHQiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpDQoiIiIoRGVwcmVjYXRlZCkgUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuDQogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIg0KDQojIHNvbWUgb3RoZXIgdXNlZnVsIGV4cHJlc3Npb25zIC0gdXNpbmcgbG93ZXItY2FzZSBjbGFzcyBuYW1lIHNpbmNlIHdlIGFyZSByZWFsbHkgdXNpbmcgdGhpcyBhcyBhIG5hbWVzcGFjZQ0KY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoNCiAgICAiIiINCiAgICBIZXJlIGFyZSBzb21lIGNvbW1vbiBsb3ctbGV2ZWwgZXhwcmVzc2lvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIGp1bXAtc3RhcnRpbmcgcGFyc2VyIGRldmVsb3BtZW50Og0KICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pDQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59DQogICAgIC0gbmV0d29yayBhZGRyZXNzZXMgKEx7TUFDPG1hY19hZGRyZXNzPn0sIEx7SVB2NDxpcHY0X2FkZHJlc3M+fSwgTHtJUHY2PGlwdjZfYWRkcmVzcz59KQ0KICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0NCiAgICAgLSBMe1VVSUQ8dXVpZD59DQogICAgIC0gTHtjb21tYS1zZXBhcmF0ZWQgbGlzdDxjb21tYV9zZXBhcmF0ZWRfbGlzdD59DQogICAgUGFyc2UgYWN0aW9uczoNCiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0Zsb2F0fX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0NCiAgICAgLSBDe0x7c3RyaXBIVE1MVGFnc319DQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319DQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgRkYNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgICAgICAxDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgIDEtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgaW1wb3J0IHV1aWQNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdXVpZA0KICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgIDEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMC4wXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgMTAwDQogICAgICAgIFsyNTZdDQoNCiAgICAgICAgRkYNCiAgICAgICAgWzI1NV0NCg0KICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAxDQogICAgICAgIFsxXQ0KDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgIDEtMy80DQogICAgICAgIFsxLjc1XQ0KDQogICAgICAgICMgdXVpZA0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQ0KICAgICIiIg0KDQogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQNCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBudW1iZXJzIHRvIFB5dGhvbiBmbG9hdA0KICAgICIiIg0KDQogICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgaGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldE5hbWUoImhleCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LDE2KSkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIHNpZ25lZF9pbnRlZ2VyID0gUmVnZXgocidbKy1dP1xkKycpLnNldE5hbWUoInNpZ25lZCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBmcmFjdGlvbiA9IChzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSArICcvJyArIHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpKS5zZXROYW1lKCJmcmFjdGlvbiIpDQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiINCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkNCg0KICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpDQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiINCiAgICBtaXhlZF9pbnRlZ2VyLmFkZFBhcnNlQWN0aW9uKHN1bSkNCg0KICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3B0aW9uYWwgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZw0KICAgIG51bWJlciA9IChzY2lfcmVhbCB8IHJlYWwgfCBzaWduZWRfaW50ZWdlcikuc3RyZWFtbGluZSgpDQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIg0KDQogICAgZm51bWJlciA9IFJlZ2V4KHInWystXT9cZCtcLj9cZCooW2VFXVsrLV0/XGQrKT8nKS5zZXROYW1lKCJmbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiINCiAgICANCiAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKS5zZXROYW1lKCJpZGVudGlmaWVyIikNCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiINCiAgICANCiAgICBpcHY0X2FkZHJlc3MgPSBSZWdleChyJygyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkoXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKXszfScpLnNldE5hbWUoIklQdjQgYWRkcmVzcyIpDQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiDQoNCiAgICBfaXB2Nl9wYXJ0ID0gUmVnZXgocidbMC05YS1mQS1GXXsxLDR9Jykuc2V0TmFtZSgiaGV4X2ludGVnZXIiKQ0KICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MuYWRkQ29uZGl0aW9uKGxhbWJkYSB0OiBzdW0oMSBmb3IgdHQgaW4gdCBpZiBweXBhcnNpbmdfY29tbW9uLl9pcHY2X3BhcnQubWF0Y2hlcyh0dCkpIDwgOCkNCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikNCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpDQogICAgIklQdjYgYWRkcmVzcyAobG9uZywgc2hvcnQsIG9yIG1peGVkIGZvcm0pIg0KICAgIA0KICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQ0KICAgICJNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eCAobWF5IGFsc28gaGF2ZSAnLScgb3IgJy4nIGRlbGltaXRlcnMpIg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRlKGZtdD0iJVktJW0tJWQiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpDQogICAgICAgICAgICBkYXRlX2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRlKCkpDQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRlKDE5OTksIDEyLCAzMSldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZXRpbWUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRldGltZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWRUJUg6JU06JVMuJWYifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGR0X2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZXRpbWUuY29weSgpDQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkNCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpDQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiDQoNCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQ0KICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iDQoNCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQ0KICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIg0KDQogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzdHJpcEhUTUxUYWdzKHMsIGwsIHRva2Vucyk6DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCANCiAgICAgICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQ0KICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIHB5cGFyc2luZ19jb21tb24uX2h0bWxfc3RyaXBwZXIudHJhbnNmb3JtU3RyaW5nKHRva2Vuc1swXSkNCg0KICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPcHRpb25hbCggV2hpdGUoIiBcdCIpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikNCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiINCg0KICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiDQoNCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiDQoNCg0KaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoNCg0KICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQ0KICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikNCg0KICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpDQoNCiAgICBjb2x1bW5OYW1lICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikNCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkNCg0KICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikNCiAgICANCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQ0KDQogICAgIyBkZW1vIHJ1blRlc3RzIG1ldGhvZCwgaW5jbHVkaW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRlc3Qgc3RyaW5nDQogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIg0KICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUNCiAgICAgICAgc2VsZWN0ICogZnJvbSBTWVMuWFlaWlkNCg0KICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0Ig0KICAgICAgICBTRUxFQ1QgKiBmcm9tIFhZWlpZLCBBQkMNCg0KICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZA0KICAgICAgICBTZWxlY3QgQUEsQkIsQ0MgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgbXVsdGlwbGUgdGFibGVzDQogICAgICAgIFNlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwsIFRhYmxlMg0KDQogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFhlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdA0KDQogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdCBeXl4gZnJveCBTeXMuZHVhbA0KDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgRkYNCiAgICAgICAgIiIiKQ0KDQogICAgaW1wb3J0IHV1aWQNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoIiIiDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAiIiIpDQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAAD4AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQClh2VRwBkAAMAZAAA/AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5IiIiVXRpbGl0aWVzIGZvciBleHRyYWN0aW5nIGNvbW1vbiBhcmNoaXZlIGZvcm1hdHMiIiIKCmltcG9ydCB6aXBmaWxlCmltcG9ydCB0YXJmaWxlCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IGNvbnRleHRsaWIKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBlbnN1cmVfZGlyZWN0b3J5CgpfX2FsbF9fID0gWwogICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKICAgICJVbnJlY29nbml6ZWRGb3JtYXQiLCAiZXh0cmFjdGlvbl9kcml2ZXJzIiwgInVucGFja19kaXJlY3RvcnkiLApdCgoKY2xhc3MgVW5yZWNvZ25pemVkRm9ybWF0KERpc3R1dGlsc0Vycm9yKToKICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCgoKZGVmIGRlZmF1bHRfZmlsdGVyKHNyYywgZHN0KToKICAgICIiIlRoZSBkZWZhdWx0IHByb2dyZXNzL2ZpbHRlciBjYWxsYmFjazsgcmV0dXJucyBUcnVlIGZvciBhbGwgZmlsZXMiIiIKICAgIHJldHVybiBkc3QKCgpkZWYgdW5wYWNrX2FyY2hpdmUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIsCiAgICAgICAgZHJpdmVycz1Ob25lKToKICAgICIiIlVucGFjayBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAsIG9yIHJhaXNlIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAKCiAgICBgcHJvZ3Jlc3NfZmlsdGVyYCBpcyBhIGZ1bmN0aW9uIHRha2luZyB0d28gYXJndW1lbnRzOiBhIHNvdXJjZSBwYXRoCiAgICBpbnRlcm5hbCB0byB0aGUgYXJjaGl2ZSAoJy8nLXNlcGFyYXRlZCksIGFuZCBhIGZpbGVzeXN0ZW0gcGF0aCB3aGVyZSBpdAogICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCiAgICAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluKSwgb3IgZWxzZSBgYE5vbmVgYCB0byBza2lwCiAgICB0aGF0IGZpbGUgb3IgZGlyZWN0b3J5LiAgVGhlIGNhbGxiYWNrIGNhbiB0aHVzIGJlIHVzZWQgdG8gcmVwb3J0IG9uIHRoZQogICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKICAgIGFsdGVyIHRoZWlyIGV4dHJhY3Rpb24gcGF0aHMuCgogICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKICAgIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgZnVuY3Rpb24gKG1pbnVzIHRoZSBgZHJpdmVyc2AgYXJndW1lbnQpLCB0aGF0IHJhaXNlCiAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgZGVzaWduYXRlZAogICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKICAgIGRvZXMgbm90IHJhaXNlIGFuIGVycm9yLCBvciB1bnRpbCBhbGwgYXJlIGV4aGF1c3RlZCAoaW4gd2hpY2ggY2FzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpcyByYWlzZWQpLiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgYSBzZXF1ZW5jZSBvZgogICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAogICAgbWVhbnMgdGhhdCBgYHVucGFja196aXBmaWxlYGAgYW5kIGBgdW5wYWNrX3RhcmZpbGVgYCB3aWxsIGJlIHRyaWVkLCBpbiB0aGF0CiAgICBvcmRlci4KICAgICIiIgogICAgZm9yIGRyaXZlciBpbiBkcml2ZXJzIG9yIGV4dHJhY3Rpb25fZHJpdmVyczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKICAgICAgICBleGNlcHQgVW5yZWNvZ25pemVkRm9ybWF0OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCiAgICAgICAgICAgICJOb3QgYSByZWNvZ25pemVkIGFyY2hpdmUgdHlwZTogJXMiICUgZmlsZW5hbWUKICAgICAgICApCgoKZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiIlVucGFjayIgYSBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lIGludGVyZmFjZSBhcyBmb3IgYXJjaGl2ZXMKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQogICAgIiIiCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgZmlsZW5hbWUpCgogICAgcGF0aHMgPSB7CiAgICAgICAgZmlsZW5hbWU6ICgnJywgZXh0cmFjdF9kaXIpLAogICAgfQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZmlsZW5hbWUpOgogICAgICAgIHNyYywgZHN0ID0gcGF0aHNbYmFzZV0KICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZCldID0gc3JjICsgZCArICcvJywgb3MucGF0aC5qb2luKGRzdCwgZCkKICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGRzdCwgZikKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKHNyYyArIGYsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZmlsZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGJhc2UsIGYpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShmLCB0YXJnZXQpCiAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCgoKZGVmIHVucGFja196aXBmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB6aXBmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCgogICAgaWYgbm90IHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSk6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSB6aXAgZmlsZSIgJSAoZmlsZW5hbWUsKSkKCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkgYXMgejoKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCgogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lLnNwbGl0KCcvJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQogICAgICAgICAgICB0YXJnZXQgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgdGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBmaWxlCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgICAgIGRhdGEgPSB6LnJlYWQoaW5mby5maWxlbmFtZSkKICAgICAgICAgICAgICAgIHdpdGggb3Blbih0YXJnZXQsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICB1bml4X2F0dHJpYnV0ZXMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgaWYgdW5peF9hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0LCB1bml4X2F0dHJpYnV0ZXMpCgoKZGVmIHVucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIlVucGFjayB0YXIvdGFyLmd6L3Rhci5iejIgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB0YXJmaWxlIChhcyBkZXRlcm1pbmVkCiAgICBieSBgYHRhcmZpbGUub3BlbigpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgogICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdGFyb2JqID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQogICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiJXMgaXMgbm90IGEgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdGFyIGZpbGUiICUgKGZpbGVuYW1lLCkKICAgICAgICApCiAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyh0YXJvYmopOgogICAgICAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQogICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZQogICAgICAgIGZvciBtZW1iZXIgaW4gdGFyb2JqOgogICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBhbmQgJy4uJyBub3QgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgcHJlbGltX2RzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKCiAgICAgICAgICAgICAgICAjIHJlc29sdmUgYW55IGxpbmtzIGFuZCB0byBleHRyYWN0IHRoZSBsaW5rIHRhcmdldHMgYXMgbm9ybWFsCiAgICAgICAgICAgICAgICAjIGZpbGVzCiAgICAgICAgICAgICAgICB3aGlsZSBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNsbmsoKSBvciBtZW1iZXIuaXNzeW0oKSk6CiAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBtZW1iZXIubGlua25hbWUKICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IHBvc2l4cGF0aC5kaXJuYW1lKG1lbWJlci5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5qb2luKGJhc2UsIGxpbmtwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aChsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICBtZW1iZXIgPSB0YXJvYmouX2dldG1lbWJlcihsaW5rcGF0aCkKCiAgICAgICAgICAgICAgICBpZiBtZW1iZXIgaXMgbm90IE5vbmUgYW5kIChtZW1iZXIuaXNmaWxlKCkgb3IgbWVtYmVyLmlzZGlyKCkpOgogICAgICAgICAgICAgICAgICAgIGZpbmFsX2RzdCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCBwcmVsaW1fZHN0KQogICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmluYWxfZHN0LmVuZHN3aXRoKG9zLnNlcCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBmaW5hbF9kc3RbOi0xXQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBVZ2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLCBmaW5hbF9kc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB0YXJmaWxlLkV4dHJhY3RFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hvd24vY2htb2QvbWtmaWZvL21rbm9kZS9tYWtlZGV2IGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBUcnVlCgoKZXh0cmFjdGlvbl9kcml2ZXJzID0gdW5wYWNrX2RpcmVjdG9yeSwgdW5wYWNrX3ppcGZpbGUsIHVucGFja190YXJmaWxlClBLAwQUAAAAAAAAACEAxrWyY30lAAB9JQAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHkiIiJBIFBFUCA1MTcgaW50ZXJmYWNlIHRvIHNldHVwdG9vbHMKClByZXZpb3VzbHksIHdoZW4gYSB1c2VyIG9yIGEgY29tbWFuZCBsaW5lIHRvb2wgKGxldCdzIGNhbGwgaXQgYSAiZnJvbnRlbmQiKQpuZWVkZWQgdG8gbWFrZSBhIHJlcXVlc3Qgb2Ygc2V0dXB0b29scyB0byB0YWtlIGEgY2VydGFpbiBhY3Rpb24sIGZvcgpleGFtcGxlLCBnZW5lcmF0aW5nIGEgbGlzdCBvZiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzLCB0aGUgZnJvbnRlbmQgd291bGQKd291bGQgY2FsbCAic2V0dXAucHkgZWdnX2luZm8iIG9yICJzZXR1cC5weSBiZGlzdF93aGVlbCIgb24gdGhlIGNvbW1hbmQgbGluZS4KClBFUCA1MTcgZGVmaW5lcyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgaW50ZXJmYWNpbmcgd2l0aCBzZXR1cHRvb2xzLiBSYXRoZXIKdGhhbiBjYWxsaW5nICJzZXR1cC5weSIgZGlyZWN0bHksIHRoZSBmcm9udGVuZCBzaG91bGQ6CgogIDEuIFNldCB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgc2V0dXAucHkgZmlsZQogIDIuIEltcG9ydCB0aGlzIG1vZHVsZSBpbnRvIGEgc2FmZSBweXRob24gaW50ZXJwcmV0ZXIgKG9uZSBpbiB3aGljaAogICAgIHNldHVwdG9vbHMgY2FuIHBvdGVudGlhbGx5IHNldCBnbG9iYWwgdmFyaWFibGVzIG9yIGNyYXNoIGhhcmQpLgogIDMuIENhbGwgb25lIG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBQRVAgNTE3LgoKV2hhdCBlYWNoIGZ1bmN0aW9uIGRvZXMgaXMgZGVmaW5lZCBpbiBQRVAgNTE3LiBIb3dldmVyLCBoZXJlIGlzIGEgImNhc3VhbCIKZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb25zICh0aGlzIGRlZmluaXRpb24gc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gZm9yCmJ1ZyByZXBvcnRzIG9yIEFQSSBzdGFiaWxpdHkpOgoKICAtIGBidWlsZF93aGVlbGA6IGJ1aWxkIGEgd2hlZWwgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKICAtIGBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYGluc3RhbGxfcmVxdWlyZXNgCiAgLSBgYnVpbGRfc2Rpc3RgOiBidWlsZCBhbiBzZGlzdCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAoKQWdhaW4sIHRoaXMgaXMgbm90IGEgZm9ybWFsIGRlZmluaXRpb24hIEp1c3QgYSAidGFzdGUiIG9mIHRoZSBtb2R1bGUuCiIiIgoKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0b2tlbml6ZQppbXBvcnQgc2h1dGlsCmltcG9ydCBjb250ZXh0bGliCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgZGlzdHV0aWxzCmZyb20gc2V0dXB0b29scy5weTMxY29tcGF0IGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfcmVxdWlyZW1lbnRzCmZyb20gcGtnX3Jlc291cmNlcy5weTMxY29tcGF0IGltcG9ydCBtYWtlZGlycwoKX19hbGxfXyA9IFsnZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdCcsCiAgICAgICAgICAgJ2dldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWwnLAogICAgICAgICAgICdwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbCcsCiAgICAgICAgICAgJ2J1aWxkX3doZWVsJywKICAgICAgICAgICAnYnVpbGRfc2Rpc3QnLAogICAgICAgICAgICdfX2xlZ2FjeV9fJywKICAgICAgICAgICAnU2V0dXBSZXF1aXJlbWVudHNFcnJvciddCgpjbGFzcyBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKEJhc2VFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHNlbGYuc3BlY2lmaWVycyA9IHNwZWNpZmllcnMKCgpjbGFzcyBEaXN0cmlidXRpb24oc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbik6CiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICBzcGVjaWZpZXJfbGlzdCA9IGxpc3QobWFwKHN0ciwgcGFyc2VfcmVxdWlyZW1lbnRzKHNwZWNpZmllcnMpKSkKCiAgICAgICAgcmFpc2UgU2V0dXBSZXF1aXJlbWVudHNFcnJvcihzcGVjaWZpZXJfbGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcGF0Y2goY2xzKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlCiAgICAgICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uIHdpdGggdGhpcyBjbGFzcwogICAgICAgIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBjb250ZXh0LgogICAgICAgICIiIgogICAgICAgIG9yaWcgPSBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24KICAgICAgICBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24gPSBjbHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gb3JpZwoKCmRlZiBfdG9fc3RyKHMpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgZmlsZW5hbWUgdG8gYSBzdHJpbmcgKG9uIFB5dGhvbiAyLCBleHBsaWNpdGx5CiAgICBhIGJ5dGUgc3RyaW5nLCBub3QgVW5pY29kZSkgYXMgZGlzdHV0aWxzIGNoZWNrcyBmb3IgdGhlCiAgICBleGFjdCB0eXBlIHN0ci4KICAgICIiIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBub3QgaXNpbnN0YW5jZShzLCBzdHIpOgogICAgICAgICMgQXNzdW1lIGl0J3MgVW5pY29kZSwgYXMgdGhhdCdzIHdoYXQgdGhlIFBFUCBzYXlzCiAgICAgICAgIyBzaG91bGQgYmUgcHJvdmlkZWQuCiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgIHJldHVybiBzCgoKZGVmIF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGFfZGlyKToKICAgIHJldHVybiBbbmFtZSBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKGFfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihhX2RpciwgbmFtZSkpXQoKCmRlZiBfZmlsZV93aXRoX2V4dGVuc2lvbihkaXJlY3RvcnksIGV4dGVuc2lvbik6CiAgICBtYXRjaGluZyA9ICgKICAgICAgICBmIGZvciBmIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KQogICAgICAgIGlmIGYuZW5kc3dpdGgoZXh0ZW5zaW9uKQogICAgKQogICAgZmlsZSwgPSBtYXRjaGluZwogICAgcmV0dXJuIGZpbGUKCgpkZWYgX29wZW5fc2V0dXBfc2NyaXB0KHNldHVwX3NjcmlwdCk6CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBfc2NyaXB0KToKICAgICAgICAjIFN1cHBseSBhIGRlZmF1bHQgc2V0dXAucHkKICAgICAgICByZXR1cm4gaW8uU3RyaW5nSU8odSJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwOyBzZXR1cCgpIikKCiAgICByZXR1cm4gZ2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKShzZXR1cF9zY3JpcHQpCgoKY2xhc3MgX0J1aWxkTWV0YUJhY2tlbmQob2JqZWN0KToKCiAgICBkZWYgX2ZpeF9jb25maWcoc2VsZiwgY29uZmlnX3NldHRpbmdzKToKICAgICAgICBjb25maWdfc2V0dGluZ3MgPSBjb25maWdfc2V0dGluZ3Mgb3Ige30KICAgICAgICBjb25maWdfc2V0dGluZ3Muc2V0ZGVmYXVsdCgnLS1nbG9iYWwtb3B0aW9uJywgW10pCiAgICAgICAgcmV0dXJuIGNvbmZpZ19zZXR0aW5ncwoKICAgIGRlZiBfZ2V0X2J1aWxkX3JlcXVpcmVzKHNlbGYsIGNvbmZpZ19zZXR0aW5ncywgcmVxdWlyZW1lbnRzKToKICAgICAgICBjb25maWdfc2V0dGluZ3MgPSBzZWxmLl9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKCiAgICAgICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2VnZ19pbmZvJ10gKyBcCiAgICAgICAgICAgIGNvbmZpZ19zZXR0aW5nc1siLS1nbG9iYWwtb3B0aW9uIl0KICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggRGlzdHJpYnV0aW9uLnBhdGNoKCk6CiAgICAgICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cCgpCiAgICAgICAgZXhjZXB0IFNldHVwUmVxdWlyZW1lbnRzRXJyb3IgYXMgZToKICAgICAgICAgICAgcmVxdWlyZW1lbnRzICs9IGUuc3BlY2lmaWVycwoKICAgICAgICByZXR1cm4gcmVxdWlyZW1lbnRzCgogICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQ9J3NldHVwLnB5Jyk6CiAgICAgICAgIyBOb3RlIHRoYXQgd2UgY2FuIHJldXNlIG91ciBidWlsZCBkaXJlY3RvcnkgYmV0d2VlbiBjYWxscwogICAgICAgICMgQ29ycmVjdG5lc3MgY29tZXMgZmlyc3QsIHRoZW4gb3B0aW1pemF0aW9uIGxhdGVyCiAgICAgICAgX19maWxlX18gPSBzZXR1cF9zY3JpcHQKICAgICAgICBfX25hbWVfXyA9ICdfX21haW5fXycKCiAgICAgICAgd2l0aCBfb3Blbl9zZXR1cF9zY3JpcHQoX19maWxlX18pIGFzIGY6CiAgICAgICAgICAgIGNvZGUgPSBmLnJlYWQoKS5yZXBsYWNlKHInXHJcbicsIHInXG4nKQoKICAgICAgICBleGVjKGNvbXBpbGUoY29kZSwgX19maWxlX18sICdleGVjJyksIGxvY2FscygpKQoKICAgIGRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsKHNlbGYsIGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgICAgICBjb25maWdfc2V0dGluZ3MgPSBzZWxmLl9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncywgcmVxdWlyZW1lbnRzPVsnd2hlZWwnXSkKCiAgICBkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdChzZWxmLCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICAgICAgY29uZmlnX3NldHRpbmdzID0gc2VsZi5fZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MsIHJlcXVpcmVtZW50cz1bXSkKCiAgICBkZWYgcHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWwoc2VsZiwgbWV0YWRhdGFfZGlyZWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgICAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZGlzdF9pbmZvJywgJy0tZWdnLWJhc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b19zdHIobWV0YWRhdGFfZGlyZWN0b3J5KV0KICAgICAgICBzZWxmLnJ1bl9zZXR1cCgpCgogICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBtZXRhZGF0YV9kaXJlY3RvcnkKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBkaXN0X2luZm9zID0gW2YgZm9yIGYgaW4gb3MubGlzdGRpcihkaXN0X2luZm9fZGlyZWN0b3J5KQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoJy5kaXN0LWluZm8nKV0KCiAgICAgICAgICAgIGlmIChsZW4oZGlzdF9pbmZvcykgPT0gMCBhbmQKICAgICAgICAgICAgICAgIGxlbihfZ2V0X2ltbWVkaWF0ZV9zdWJkaXJlY3RvcmllcyhkaXN0X2luZm9fZGlyZWN0b3J5KSkgPT0gMSk6CgogICAgICAgICAgICAgICAgZGlzdF9pbmZvX2RpcmVjdG9yeSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5LCBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpWzBdKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGFzc2VydCBsZW4oZGlzdF9pbmZvcykgPT0gMQogICAgICAgICAgICBicmVhawoKICAgICAgICAjIFBFUCA1MTcgcmVxdWlyZXMgdGhhdCB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICMgbWV0YWRhdGFfZGlyZWN0b3J5LiBUbyBjb21wbHksIHdlIE1VU1QgY29weSB0aGUgZGlyZWN0b3J5IHRvIHRoZSByb290CiAgICAgICAgaWYgZGlzdF9pbmZvX2RpcmVjdG9yeSAhPSBtZXRhZGF0YV9kaXJlY3Rvcnk6CiAgICAgICAgICAgIHNodXRpbC5tb3ZlKAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3RfaW5mb19kaXJlY3RvcnksIGRpc3RfaW5mb3NbMF0pLAogICAgICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5KQogICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpc3RfaW5mb19kaXJlY3RvcnksIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKCiAgICAgICAgcmV0dXJuIGRpc3RfaW5mb3NbMF0KCiAgICBkZWYgX2J1aWxkX3dpdGhfdGVtcF9kaXIoc2VsZiwgc2V0dXBfY29tbWFuZCwgcmVzdWx0X2V4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3MpOgogICAgICAgIGNvbmZpZ19zZXR0aW5ncyA9IHNlbGYuX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgICAgIHJlc3VsdF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgocmVzdWx0X2RpcmVjdG9yeSkKCiAgICAgICAgIyBCdWlsZCBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHRoZW4gY29weSB0byB0aGUgdGFyZ2V0LgogICAgICAgIG1ha2VkaXJzKHJlc3VsdF9kaXJlY3RvcnksIGV4aXN0X29rPVRydWUpCiAgICAgICAgd2l0aCBUZW1wb3JhcnlEaXJlY3RvcnkoZGlyPXJlc3VsdF9kaXJlY3RvcnkpIGFzIHRtcF9kaXN0X2RpcjoKICAgICAgICAgICAgc3lzLmFyZ3YgPSAoc3lzLmFyZ3ZbOjFdICsgc2V0dXBfY29tbWFuZCArCiAgICAgICAgICAgICAgICAgICAgICAgIFsnLS1kaXN0LWRpcicsIHRtcF9kaXN0X2Rpcl0gKwogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdKQogICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cCgpCgogICAgICAgICAgICByZXN1bHRfYmFzZW5hbWUgPSBfZmlsZV93aXRoX2V4dGVuc2lvbih0bXBfZGlzdF9kaXIsIHJlc3VsdF9leHRlbnNpb24pCiAgICAgICAgICAgIHJlc3VsdF9wYXRoID0gb3MucGF0aC5qb2luKHJlc3VsdF9kaXJlY3RvcnksIHJlc3VsdF9iYXNlbmFtZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVzdWx0X3BhdGgpOgogICAgICAgICAgICAgICAgIyBvcy5yZW5hbWUgd2lsbCBmYWlsIG92ZXJ3cml0aW5nIG9uIG5vbi1Vbml4LgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHJlc3VsdF9wYXRoKQogICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKHRtcF9kaXN0X2RpciwgcmVzdWx0X2Jhc2VuYW1lKSwgcmVzdWx0X3BhdGgpCgogICAgICAgIHJldHVybiByZXN1bHRfYmFzZW5hbWUKCgogICAgZGVmIGJ1aWxkX3doZWVsKHNlbGYsIHdoZWVsX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9idWlsZF93aXRoX3RlbXBfZGlyKFsnYmRpc3Rfd2hlZWwnXSwgJy53aGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzKQoKICAgIGRlZiBidWlsZF9zZGlzdChzZWxmLCBzZGlzdF9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRfd2l0aF90ZW1wX2RpcihbJ3NkaXN0JywgJy0tZm9ybWF0cycsICdnenRhciddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcudGFyLmd6Jywgc2Rpc3RfZGlyZWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19zZXR0aW5ncykKCgpjbGFzcyBfQnVpbGRNZXRhTGVnYWN5QmFja2VuZChfQnVpbGRNZXRhQmFja2VuZCk6CiAgICAiIiJDb21wYXRpYmlsaXR5IGJhY2tlbmQgZm9yIHNldHVwdG9vbHMKCiAgICBUaGlzIGlzIGEgdmVyc2lvbiBvZiBzZXR1cHRvb2xzLmJ1aWxkX21ldGEgdGhhdCBlbmRlYXZvcnMgdG8gbWFpbnRhaW4gYmFja3dhcmRzCiAgICBjb21wYXRpYmlsaXR5IHdpdGggcHJlLVBFUCA1MTcgbW9kZXMgb2YgaW52b2NhdGlvbi4gSXQgZXhpc3RzIGFzIGEgdGVtcG9yYXJ5CiAgICBicmlkZ2UgYmV0d2VlbiB0aGUgb2xkIHBhY2thZ2luZyBtZWNoYW5pc20gYW5kIHRoZSBuZXcgcGFja2FnaW5nIG1lY2hhbmlzbSwKICAgIGFuZCB3aWxsIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZC4KICAgICIiIgogICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQ9J3NldHVwLnB5Jyk6CiAgICAgICAgIyBJbiBvcmRlciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggc2NyaXB0cyBhc3N1bWluZyB0aGF0CiAgICAgICAgIyB0aGUgc2V0dXAucHkgc2NyaXB0IGlzIGluIGEgZGlyZWN0b3J5IG9uIHRoZSBQWVRIT05QQVRILCBpbmplY3QKICAgICAgICAjICcnIGludG8gc3lzLnBhdGguIChweXBhL3NldHVwdG9vbHMjMTY0MikKICAgICAgICBzeXNfcGF0aCA9IGxpc3Qoc3lzLnBhdGgpICAgICAgICAgICAjIFNhdmUgdGhlIG9yaWdpbmFsIHBhdGgKCiAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc2V0dXBfc2NyaXB0KSkKICAgICAgICBpZiBzY3JpcHRfZGlyIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNjcmlwdF9kaXIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwZXIoX0J1aWxkTWV0YUxlZ2FjeUJhY2tlbmQsCiAgICAgICAgICAgICAgICAgIHNlbGYpLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQ9c2V0dXBfc2NyaXB0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICMgV2hpbGUgUEVQIDUxNyBmcm9udGVuZHMgc2hvdWxkIGJlIGNhbGxpbmcgZWFjaCBob29rIGluIGEgZnJlc2gKICAgICAgICAgICAgIyBzdWJwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQgKGFuZCB0aHVzIGl0IHNob3VsZCBub3QgYmUKICAgICAgICAgICAgIyBzdHJpY3RseSBuZWNlc3NhcnkgdG8gcmVzdG9yZSB0aGUgb2xkIHN5cy5wYXRoKSwgd2UnbGwgcmVzdG9yZQogICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBwYXRoIHNvIHRoYXQgdGhlIHBhdGggbWFuaXB1bGF0aW9uIGRvZXMgbm90IHBlcnNpc3QKICAgICAgICAgICAgIyB3aXRoaW4gdGhlIGhvb2sgYWZ0ZXIgcnVuX3NldHVwIGlzIGNhbGxlZC4KICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBzeXNfcGF0aAoKIyBUaGUgcHJpbWFyeSBiYWNrZW5kCl9CQUNL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xwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///opDwAAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOjnOgAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6F44AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Nc3AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugeCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6D0gAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoDiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6OkfAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fogDcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+Oso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AImFROX//4qFJ+X//4TAD4VnAQAAiguLtSjl//8zwID5Cg+UwImFIOX//4sGA8eDeDgAdBWKUDSIVfSITfWDYDgAagKNRfRQ60sPvsFQ6Nfs//9ZhcB0OouNNOX//yvLA00QM8BAO8gPhqUBAABqAo2FQOX//1NQ6DwoAACDxAyD+P8PhLEEAABD/4VE5f//6xtqAVONhUDl//9Q6BgoAACDxAyD+P8PhI0EAAAzwFBQagWNTfRRagGNjUDl//9RUP+1HOX//0P/hUTl////FbDgQACL8IX2D4RcBAAAagCNhTzl//9QVo1F9FCLhSjl//+LAP80B/8VmOBAAIXAD4QpBAAAi4VE5f//i40w5f//A8E5tTzl//+JhTjl//8PjBUEAACDvSDl//8AD4TNAAAAagCNhTzl//9QagGNRfRQi4Uo5f//iwDGRfQN/zQH/xWY4EAAhcAPhNADAACDvTzl//8BD4zPAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJZoP+Cg+UwUNDg4VE5f//Aom1QOX//4mNIOX//zwBdAQ8AnVS/7VA5f//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/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRToFrf//8cACQAAAOget///iTDrP/+1QOX//+git///Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6Na2///HABwAAADo3rb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7oaJ7//8nDahBo6PdAAOjotv//i0UIg/j+dRvoorb//4MgAOiHtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIeh5tv//iTjoX7b//8cACQAAAFdXV1dX6Oe1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbo/LX//8cACQAAAOgEtv//iTiDTeT/x0X8/v///+gJAAAAi0Xk6Gi2///D/3UI6IMkAABZw2oQaAj4QADoDLb//4tFCIP4/nUT6LO1///HAAkAAACDyP/pqgAAADPbO8N8CDsFkCpBAHIa6JK1///HAAkAAABTU1NTU+gatf//g8QU69CLyMH5BY08jaAqQQCL8IPmH8Hm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g+wQ/3UIjU3w6CGW////dSiNTfD/dST/dSD/dRz/dRj/dRT/dRD/dQzoKPz//4PEIIB9/AB0B4tN+INhcP3Jw4v/VYvsUVGhgBJBADPFiUX8oYgpQQBTVjPbV4v5O8N1Oo1F+FAz9kZWaGTqQABW/xX44EAAhcB0CIk1iClBAOs0/xVc4EAAg/h4dQpqAlijiClBAOsFoYgpQQCD+AIPhM8AAAA7ww+ExwAAAIP4AQ+F6AAAAIld+DldGHUIiweLQASJRRiLNezgQAAzwDldIFNT/3UQD5XA/3UMjQTFAQAAAFD/dRj/1ov4O/sPhKsAAAB+PIH/8P//f3c0jUQ/CD0ABAAAdxPo0h8AAIvEO8N0HMcAzMwAAOsRUOhQ4P//WTvDdAnHAN3dAACDwAiL2IXbdGmNBD9QagBT6N6Q//+DxAxXU/91EP91DGoB/3UY/9aFwHQR/3UUUFP/dQj/FfjgQACJRfhT6Mn6//+LRfhZ63Uz9jldHHUIiweLQBSJRRw5XRh1CIsHi0AEiUUY/3Uc6EEdAABZg/j/dQQzwOtHO0UYdB5TU41NEFH/dQxQ/3UY6GkdAACL8IPEGDvzdNyJdQz/dRT/dRD/dQz/dQj/dRz/FfTgQACL+DvzdAdW6Oav//9Zi8eNZexfXluLTfwzzegolP//ycOL/1WL7IPsEP91CI1N8OgilP///3UkjU3w/3Ug/3Uc/3UY/3UU/3UQ/3UM6Bb+//+DxByAffwAdAeLTfiDYXD9ycOL/1WL7FaLdQiF9g+EgQEAAP92BOh2r////3YI6G6v////dgzoZq////92EOher////3YU6Fav////dhjoTq////826Eev////diDoP6////92JOg3r////3Yo6C+v////dizoJ6////92MOgfr////3Y06Bev////dhzoD6////92OOgHr////3Y86P+u//+DxED/dkDo9K7///92ROjsrv///3ZI6OSu////dkzo3K7///92UOjUrv///3ZU6Myu////dljoxK7///92XOi8rv///3Zg6LSu////dmTorK7///92aOikrv///3Zs6Jyu////dnDolK7///92dOiMrv///3Z46ISu////dnzofK7//4PEQP+2gAAAAOhurv///7aEAAAA6GOu////togAAADoWK7///+2jAAAAOhNrv///7aQAAAA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GCBBAOshV1D/dQjoOfr//4PEDIXAdQ2LBooEBzw9dB2EwHQZg8YEiwaFwHXZi8YrBRggQQDB+AL32F5dw4vGKwUYIEEAwfgC6/CL/1WL7FFXi/gzwIvPhf90RjkHdAmDwQRAgzkAdfdWQGoEUOi5gv//i/BZWYl1/IX2dRhqCehqav//6w5Q6GMCAACJBoPGBIPHBFmLB4XAdeshBotF/F5fycOL/1WL7IPsFItFCFMz24ld9DvDdR3o8H///1NTU1NTxwAWAAAA6Hh///+DxBSDyP/rblaLMFeJdfw783RTaj1W6BcDAACL+FlZiX3sO/t0QDv3dDwzwDhfAQ+UwIlF+KEYIEEAOwUcIEEAdQroNf///6MYIEEAO8N1YDldDHQkOR0gIEEAdBzoM/n//4XAdErodX///8cAFgAAAIPI/19eW8nDOV34D4WYAQAAagToj4H//1mjGCBBADvDdN6JGDkdICBBAHUTagTodIH//1mjICBBADvDdMOJGIs1GCBBAIl18DvzdLQrffz/dfzoYv7//4v4O/tZfFI5HnROjTS+/zbobIL//1k5Xfh1G4tF/IkGi0UIiRjpggAAAItGBIkGi0XwR400uDkedfCB/////z9zamoEV/81GCBBAOjfgf//g8QMO8N0VetOOV34D4XiAAAAO/t9AvffjUcCO8cPjDb///89////Pw+DK////1BqBP81GCBBAOijgf//g8QMO8MPhBL///+LVfyNDLiJEYlZBItNCIkZoxggQQA5XQx0eIt1/GoBVujIrP//QFlAUOjQgP//i/hZWTv7dFxWVuiwrP//QFlAUFfo8dX//4PEDIXAdA1TU1NTU+iZfP//g8QUi034i8crxgNF7IgYQPfZG8n30SPIUVf/FSjhQACFwHUPg030/+j8ff//xwAqAAAAV+hZgf//WTld+HQO/3X86EuB//+LRQhZiRiLRfTpaP7///91/Og1gf//i0UIWYkYM8DpU/7//4v/VYvsUzPbOV0IdQQzwOtBVlf/dQjoEKz//4vwRlboqbD//4v4WVk7+3Qi/3UIVlfoQNX//4PEDIXAdA1TU1NTU+joe///g8QUi8frAjPAX15bXcOL/1WL7IPsEFP/dRCNTfDoI2X//4tFCDPbO8N1KOhIff//U1NTU1PHABYAAADo0Hz//4PEFDhd/HQHi0X4g2Bw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Q0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAA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AAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAADQNwAAIGkAABCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANcYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAMz///8AAAAA/v///6klQAC9JUAAAAAAAP7///8AAAAAjP///wAAAAD+////PDVAAEA1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA4zpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACxO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAADs9QAAAAAAAAAAAAAc9QAD+////AAAAANT///8AAAAA/v///wAAAADAPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPM/QAAAAAAA/v///wAAAADU////AAAAAP7///8dQUAAOUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAtR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPtKQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAa05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACtUEAA/v///wAAAAC8UEAA/v///wAAAADY////AAAAAP7///8AAAAAb1JAAP7///8AAAAAe1JAAP7///8AAAAA1P///wAAAAD+////AAAAADVZQAAAAAAA/v///wAAAADY////AAAAAP7////bWkAA71pAAAAAAAD+////AAAAANj///8AAAAA/v///y1bQAAxW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAIheQAAAAAAA/v///wAAAADQ////AAAAAP7///8YX0AAL19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAApakAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAPnlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABOgUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAC+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAJJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC9l0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAFShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAy6VAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRp0AAAAAAAAAAAADNpkAA/v///wAAAADQ////AAAAAP7///8AAAAATK5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABowkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAAvKQABU+QAAAAAAAAAAAAAOAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPoAALD6AADG+gAA3PoAAO76AAAG+wAAHPsAADT7AABM+wAAYPsAAGj7AAB6+wAAiPsAAJr7AACs+wAAvPsAAMr7AADc+wAA9PsAAAj8AAAc/AAAOPwAAFb8AABq/AAAevwAAIb8AACS/AAAnvwAALb8AADO/AAA2PwAAOT8AAD2/AAABP0AABD9AAAe/QAAKP0AADj9AABO/QAAWv0AAGr9AACS/QAArP0AAMT9AADe/QAA9P0AAA7+AAAc/gAAKv4AAET+AABU/gAAav4AAIT+AACQ/gAAnv4AAK7+AAC+/gAA0P4AAOT+AAD0/gAACv8AABr/AAAs/wAAPv8AAFD/AABi/wAAbv8AAHz/AACM/wAAov8AALL/AADC/wAA0P8AAOL/AAD0/wAAHAABACgAAQA4AAEASgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAPAJHZXRTdGFydHVwSW5mb0EAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdl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b2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAAAAAAAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAAAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAAAAAAAAAAAAAAAAAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgAAAAAAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAAAAAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAAAAAAHQAAwAQAAAAAAAAAAAAAAJYAAMAEAAAAAAAAAAAAAACNAADACAAAAAAAAAAAAAAAjgAAwAgAAAAAAAAAAAAAAI8AAMAIAAAAAAAAAAAAAACQAADACAAAAAAAAAAAAAAAkQAAwAgAAAAAAAAAAAAAAJIAAMAIAAAAAAAAAAAAAACTAADACAAAAAAAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA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cm9jZXNzAACrAUdldEN1cnJlbnRQcm9jZXNzAEwEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAjBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDQAklzRGVidWdnZXJQcmVzZW50AJ8DUnRsVmlydHVhbFVud2luZAAAmANSdGxMb29rdXBGdW5jdGlvbkVudHJ5AACRA1J0bENhcHR1cmVDb250ZXh0AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBdAUdldENQSW5mbwBUAUdldEFDUAAAFAJHZXRPRU1DUAAA2gJJc1ZhbGlkQ29kZVBhZ2UA1wBFbmNvZGVQb2ludGVyALkARGVjb2RlUG9pbnRlcgBAAUZsc0dldFZhbHVlAEEBRmxzU2V0VmFsdWUAPwFGbHNGcmVlAPgDU2V0TGFzdEVycm9yAACvAUdldEN1cnJlbnRUaHJlYWRJZAAAPgFGbHNBbGxvYwAAmwRXcml0ZUZpbGUA8AJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMEBR2V0RW52aXJvbm1lbnRTdHJpbmdzAE0BRnJlZUVudmlyb25tZW50U3RyaW5nc1cAiARXaWRlQ2hhclRvTXVsdGlCeXRlAMMBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqgJIZWFwU2V0SW5mb3JtYXRpb24AAKQCSGVhcENyZWF0ZQAAUwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAArAFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAqQJIZWFwUmVBbGxvYwCFAUdldENvbnNvbGVDUAAAlwFHZXRDb25zb2xlTW9kZQAAQwFGbHVzaEZpbGVCdWZmZXJzAADgAkxDTWFwU3RyaW5nQQAAGQNNdWx0aUJ5dGVUb1dpZGVDaGFyAOICTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADsA1NldEZpbGVQb2ludGVyAACrAkhl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AAAYBwAADAAAAAwAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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jfD9//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/AAAAiziNWASNBDuJReS+AAgAADv+fAKL/sdF4AEAAADrW2pAaiDo5wUAAFlZhcB0VotN4I0MjaAqQQCJAYMFkCpBACCNkAAIAADrKsZABACDCP/GQAUKg2AIAIBgJIDGQCUKxkAmCoNgOADGQDQAg8BAixED1jvCctL/ReA5PZAqQQB8nesGiz2QKkEAg2XgAIX/fm2L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AIXAD4RgAgAAM8k5jSDl//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//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Py1///HAAkAAADoBLb//4k4g03k/8dF/P7////oCQAAAItF5Ohotv//w/91COiDJAAAWcNqEGgI+EAA6Ay2//+LRQiD+P51E+iztf//xwAJAAAAg8j/6aoA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AIvwOV30dAn/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//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bv//i/iDxAyJffw7+w+ErQAAAGh09EAAVlfoa8P//4PEDIXAdA1TU1NTU+gTav//g8QU/3UIVlfo2MH//4PEDIXAdA1TU1NTU+j1af//g8QUjXcCi30I6wo783QEO8Z2Aovwg03w/2ouVuhoCwAAWVmFwHQsU/91/OgUCgAAWVmFwA+F7AAAAP91EP91DP91/Ohg/v//g8QMiUXw6dMAAAD/dfzolpn//4vwg8YFagFW6Jpt//+DxAyJRfg7w3UIg8j/6b0AAAD/dfxWUOi4wv//g8QMhcB0DVNTU1NT6GBp//+DxBT/dfzoUZn//4v4A334Wejaav//iwCJReyLRfgr9wPwx0X07B9BAItF9P8wVlfocsL//4PEDIXAdA1TU1NTU+gaaf//g8QUU/91+OhdCQAAWVmFwHQPg230BIF99OAfQQB9xOse6IRq////dRCLTez/dQyJCP91+OiU/f//g8QMiUXw/3X46Mxt//+LfQhZOX38dAn/dfzou23//1mLRfBeX1vJw4v/VYvsg+wYU1ZXM9tqAVNT/3UIiV3wiV306JbG//+JRegjwoPEEIlV7IP4/3RZagJTU/91COh6xv//i8gjyoPEEIP5/3RBi3UMi30QK/Ab+g+IxgAAAH8IO/MPhrwAAAC7ABAAAFNqCP8VNOFAAFD/FWTgQACJRfyFwHUX6Mdp///HAAwAAADovGn//4sAX15bycNoAIAAAP91COiKAQAAWVmJRfiF/3wKfwQ783IEi8PrAovGUP91/P91COisq///g8QMg/j/dDaZK/Ab+ngGf9OF9nfPi3Xw/3X4/3UI6EYBAABZWf91/GoA/xU04UAAUP8VYOBAADPb6YYAAADoV2n//4M4BXUL6Dpp///HAA0AAACDzv+JdfTrvTv7f3F8BDvzc2tT/3UQ/3UM/3UI6H/F//8jwoPEEIP4/w+ERP////91COib1v//WVD/FTDhQAD32BvA99hImYlF8CPCiVX0g/j/dSno22j//8cADQAAAOjjaP//i/D/FVzgQACJBot18CN19IP+/w+E9v7//1P/dez/dej/dQjoFMX//yPCg8QQg/j/D4TZ/v//M8Dp2f7//4v/VYvsVot1CFboItb//1mD+P91EOh5aP//xwAJAAAAg8j/601X/3UQagD/dQxQ/xUA4UAAi/iD//91CP8VXOBAAOsCM8CFwHQMUOhpaP//WYPI/+sbi8bB+AWLBIWgKkEAg+YfweYGjUQwBIAg/YvHX15dw4v/VYvsU4tdDFaLdQiLxsH4BY0UhaAqQQCLAoPmH8HmBo0MMIpBJALAVw+2eQQPvsCB54AAAADR+IH7AEAAAHRQgfsAgAAAdEKB+wAAAQB0JoH7AAACAHQegfsAAAQAdT2ASQSAiwqNTDEkihGA4oGAygGIEesngEkEgIsKjUwxJIoRgOKCgMoC6+iAYQR/6w2ASQSAiwqNTDEkgCGAhf9fXlt1B7gAgAAAXcP32BvAJQDAAAAFAEAAAF3Di/9Vi+yLRQhWM/Y7xnUd6E5n//9WVlZWVscAFgAAAOjWZv//g8QUahZY6wqLDWQqQQCJCDPAXl3Di/9Vi+yD7GiLRQhTM9tXiV30iF3/O8N0FYP4AXQQfhaD+AN+CYP4BHUMxkX/AYtFEIlF8Os46AFn//+JGOjnZv//U1NTU1PHABYAAADob2b//4PEFIPI/+muAQAAQDgYdfuNSAE4GXQFxgAgi8E4GHXrVmpEXlaNRZhTUOhkSv//iXWYizWQKkEAg8QMO/N0K41G/4vIi9DB+QWLDI2gKkEAg+IfweIGOFwRBHUGTkg783XgO/MPjEABAACB/jIzAAAPgzQBAACLxmvABYPABGaJRcoPt8BqAVDox2j//1lZiUXMO8MPhBABAAA784kwi0XMjUgEjXwwBIld+H45i0X4i9CD4B/B+gXB4AYDBJWgKkEAilAE9sIQdQiIEYsAiQfrBYgZgw///0X4QYPHBDl1+HzKi0XMOF3/dCyNSAQz0o1EMASD/gN9BIv+6wNqA187130MiBmDCP9CQYPABOvkx0X0CAAAAOjOZf//iRiNRdxQjUWYUFP/dRT/dfRqAVNT/3Xw/3UM/xUM4EAAi/D/FVzgQAD/dcyL+OjxaP//WTvzdQlX6KNl//9Z61iDfQgCdQZT6DRS//+LNQjhQAA5XQh1HWr//3Xc/xUI4EAAjUXsUP913P8VBOBAAItd7OsGg30IBHUH/3Xc/9brA4td3P914P/Wi8PrDugoZf//xwAMAAAAg8j/Xl9bycOL/1WL7IPsQKGAEkEAM8WJRfyLTQyLRQhTVle+ePRAAI198KWlZqWJTdSLTRAz24lN4ItNFKRqAolFyIv4iwCJTeiJXdyJXeyJXcRe6xBQ6DKT//+DxwSNdAYBiwdZO8N17GoBVol1zOgqZ///i3XgWVmJBjvDdSOLReiJGOiYZP//xwAMAAAA6KBk///HAAgAAACDyP/pLwMAAI1F8FCNRexTUOi82v//g8QMO8N0FIP4FnVxU1NTU1Poy2L//4PEFOtijUXwUOi5kv//i/hHR1mJfdA5Xex0Dv917Oikkv//A/hZiX3Qi0XUO8N0T2oCi/CLAF/rEFDoiJL//4PGBI18BwGLBlk7w3XsoTwgQQA7w3VD6O2P//+jPCBBADvDdTWLdeD/NoNN3P/oUmf//4tF6IkeWYkY6WUCAACLReiJGIt9yIsHizY7ww+F8QAAAEbpVQEAAIld5DgYdCiKCIvwgPk9dB9W6BiS//9Zi03kjUwBAaE8IEEAjTQIiU3kig46y3Xci03kiU3Y6ys4WAF0LYB4Ajp1J4B4Az11IYPABFDo3ZH//1mLTdiNRAEFiw08IEEAiUXYA8GAOD10zotF2CtF5It11AP4iX3A6x+NRfBQ6KyR//9QjUXwUP826BcFAACDxBCFwHRNg8YEOR513QN90GoBV+iYZf//i3XgWVmLTeiJATvDD4Uy/////zboa2b//1mJHuj6Yv//xwAMAAAA6AJj//+DTdz/xwAIAAAA6WkBAADHRcQBAAAA67RQi8YrxgNFzFBW6H+6//+DxAyFwHQNU1NTU1PoJ2H//4PEFP836BmR//+NdAYBg8cE6zZQi0XgiwArxgNFzFBW6Em6//+DxAyFwHQNU1NTU1Po8WD//4PEFP836OOQ//8D8IPHBMYGIEZZiwc7w3XDi0XoiF7/iB6LMDld1A+EzQAAAIt92ItF5IvPK8hRiw08IEEAA8hRVuj2uv//K33kg8QMA/eLfdTrNotFwItN6P83K8YDAVBW6NG5//+DxAyFwHQNU1NTU1PoeWD//4PEFP836GuQ//9ZjXQGAYPHBDkfdcY5XcR1Z4t90I1F8FBXVuiXuf//g8QMhcB0DVNTU1NT6D9g//+DxBRoYONAAFdW6AK4//+DxAyFwHQNU1NTU1PoH2D//4PEFDld7HQe/3XsV1bo37f//4PEDIXAdA1TU1NTU+j8X///g8QUA/c783QMi0XoOzB1A4geRogeoTwgQQA7w3QHUOjRZP//WYkdPCBBADld7HQJ/3Xs6L1k//9Zi0Xci038X14zzVvoAUn//8nDi/9Vi+xWM/Y5dQh1JOhCYf//iTDoKGH//1ZWVlZWxwAWAAAA6LBg//+DxBRqFljrVfdFDPn///910/91CP8VOOFAAIP4/3UW/xVc4EAAUOgTYf//WejnYP//iwDrKKgQdSKoAXQe9kUMAnQY6ONg///HAAUAAADoxWD//8cADQAAAOvRM8BeXcOL/1WL7IPsFFP/dRAz241N7Ild/OhsSP//i00IO8t1KOiTYP//U1NTU1PHABYAAADoG2D//4PEFDhd+HQHi0X0g2Bw/TPA63FWi3XwOV4IdRn/dQxR6GoCAABZWThd+HRXi030g2Fw/etOV4oRD7bCD7b49kQ3HQR0IUGKETrTdBUPtvrB4AgLxzlFDHUVjUH/iUX86w05XfzrAzlFDHUDiU38QTrTdcNfOF34dAeLRfSDYHD9i0X8XlvJw4v/VYvsagD/dQz/dQjoMv///4PEDF3Di/9Vi+yD7BRTM9s5XRB1BzPA6ZoBAAD/dRSNTezokEf//4tF8DlYCHUm/3UQ/3UM/3UI6MfU//+DxAw4XfgPhG0BAACLTfSDYXD96WEBAABXi30IO/t0BTldDHUu6INf//9TU1NTU8cAFgAAAOgLX///g8QUOF34dAeLRfSDYHD9uP///3/pJQEAAFZmD7YP/00QD7fJD7bRR/ZEAh0EiU38dEOKFzrTdQWJXfzrWMHhCGYPttJmC8oPt8lmi/FHiU38ZjtwEHIMZjtwEncGZgNwFOs2ZjtwFnIwZjtwGHcqZgNwGuskD7dV/I0MAvZBHRB0DWYPtokdAQAAD7fJ6wMPt8qJTfxmi3X8i00MZg+2Cf9FDA+3yQ+20fZEAh0EiU38dEWLVQyKEjrTdQWJXfzrV8HhCGYPttJmC8r/RQwPt8mJTfxmO0gQcgxmO0gSdwZmA0gU6zZmO0gWcjBmO0gYdypmA0ga6yQPt1X8jQwC9kEdEHQNZg+2iR0BAAAPt8nrAw+3yolN/GaLTfxmO851IWY783QJOV0QD4Xr/v//OF34dAeLRfSDYHD9M8BeX1vJwxvAg+ACSDhd+HTwi030g2Fw/evni/9Vi+xqAP91EP91DP91COgj/v//g8QQXcPMzMzMzMzMzMzMzMzMzMxVi+xXi30IM8CDyf/yroPBAffZg+8BikUM/fKug8cBOAd0BDPA6wKLx/xfycMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPoAALD6AADG+gAA3PoAAO76AAAG+wAAHPsAADT7AABM+wAAYPsAAGj7AAB6+wAAiPsAAJr7AACs+wAAvPsAAMr7AADc+wAA9PsAAAj8AAAc/AAAOPwAAFb8AABq/AAAevwAAIb8AACS/AAAnvwAALb8AADO/AAA2PwAAOT8AAD2/AAABP0AABD9AAAe/QAAKP0AADj9AABO/QAAWv0AAGr9AACS/QAArP0AAMT9AADe/QAA9P0AAA7+AAAc/gAAKv4AAET+AABU/gAAav4AAIT+AACQ/gAAnv4AAK7+AAC+/gAA0P4AAOT+AAD0/gAACv8AABr/AAAs/wAAPv8AAFD/AABi/wAAbv8AAHz/AACM/wAAov8AALL/AADC/wAA0P8AAOL/AAD0/wAAHAABACgAAQA4AAEASgABAAAAAAAAAAAAAAAAAAAAAADnGEAAskFAADRLQADOWEAA0F9AAAAAAAAAAAAAu6xAAJgZQAAAAAAAAAAAAAAAAAAAAAAAZmFpbGVkIHRvIGdldCBleGl0IGNvZGUgZnJvbSBwcm9jZXNzLgoAAGZhaWxlZCB0byBjcmVhdGUgcHJvY2Vzcy4KAAAgJXMAJXMAAENvdWxkIG5vdCBleGVjICVzAAAAQ2Fubm90IGZpbmQgUHl0aG9uIGV4ZWN1dGFibGUgJXMKAAAAIyFweXRob24uZXhlAAAAACMhAABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weQAAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAg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eXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAA0DcAACBpAAAQmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////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/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAAC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ICAgIGJkaXN0LmZvcm1hdF9jb21tYW5kWydlZ2cnXSA9ICgnYmRpc3RfZWdnJywgIlB5dGhvbiAuZWdnIGZpbGUiKQogICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRzLmFwcGVuZCgnZWdnJykKCmRlbCBiZGlzdCwgc3lzClBLAwQUAAAAAAAAACEAUPgj8noJAAB6CQAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHlmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKCgpkZWYgc2hxdW90ZShhcmcpOgogICAgIiIiUXVvdGUgYW4gYXJndW1lbnQgZm9yIGxhdGVyIHBhcnNpbmcgYnkgc2hsZXguc3BsaXQoKSIiIgogICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKICAgICAgICBpZiBjIGluIGFyZzoKICAgICAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgaWYgYXJnLnNwbGl0KCkgIT0gW2FyZ106CiAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQogICAgcmV0dXJuIGFyZwoKCmNsYXNzIGFsaWFzKG9wdGlvbl9iYXNlKToKICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgoKICAgIGRlc2NyaXB0aW9uID0gImRlZmluZSBhIHNob3J0Y3V0IHRvIGludm9rZSBvbmUgb3IgbW9yZSBjb21tYW5kcyIKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSBhbGlhcycpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yZW1vdmUgYW5kIGxlbihzZWxmLmFyZ3MpICE9IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGFsaWFzIG5hbWUpIHdoZW4gIgogICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgogICAgICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBhbGlhc2VzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcHJpbnQoIkNvbW1hbmQgQWxpYXNlcyIpCiAgICAgICAgICAgIHByaW50KCItLS0tLS0tLS0tLS0tLS0iKQogICAgICAgICAgICBmb3IgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlbGlmIGxlbihzZWxmLmFyZ3MpID09IDE6CiAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncwogICAgICAgICAgICBpZiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBOb25lCiAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKICAgICAgICAgICAgICAgIHByaW50KCJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFsaWFzID0gc2VsZi5hcmdzWzBdCiAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSwgc2VsZi5hcmdzWzE6XSkpCgogICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHsnYWxpYXNlcyc6IHthbGlhczogY29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCgoKZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKICAgIHNvdXJjZSwgY29tbWFuZCA9IGFsaWFzZXNbbmFtZV0KICAgIGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnZ2xvYmFsJyk6CiAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgndXNlcicpOgogICAgICAgIHNvdXJjZSA9ICctLXVzZXItY29uZmlnICcKICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgogICAgICAgIHNvdXJjZSA9ICcnCiAgICBlbHNlOgogICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQogICAgcmV0dXJuIHNvdXJjZSArIG5hbWUgKyAnICcgKyBjb21tYW5kClBLAwQUAAAAAAAAACEAnGw5MAlHAAAJRwAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZwoKQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IHJlbW92ZV90cmVlLCBta3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBtYXJzaGFsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24sIGVuc3VyZV9kaXJlY3RvcnkKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnRyeVBvaW50CmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgp0cnk6CiAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGF0aCwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcGF0aCgicHVyZWxpYiIpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWIsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3B5dGhvbl9saWIoRmFsc2UpCgoKZGVmIHN0cmlwX21vZHVsZShmaWxlbmFtZSk6CiAgICBpZiAnLicgaW4gZmlsZW5hbWU6CiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVswXQogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi02XQogICAgcmV0dXJuIGZpbGVuYW1lCgoKZGVmIHNvcnRlZF93YWxrKGRpcik6CiAgICAiIiJEbyBvcy53YWxrIGluIGEgcmVwcm9kdWNpYmxlIHdheSwKICAgIGluZGVwZW5kZW50IG9mIGluZGV0ZXJtaW5pc3RpYyBmaWxlc3lzdGVtIHJlYWRkaXIgb3JkZXIKICAgICIiIgogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZGlyKToKICAgICAgICBkaXJzLnNvcnQoKQogICAgICAgIGZpbGVzLnNvcnQoKQogICAgICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCgoKZGVmIHdyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSk6CiAgICBfc3R1Yl90ZW1wbGF0ZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBkZWYgX19ib290c3RyYXBfXygpOgogICAgICAgICAgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXywgX19maWxlX18KICAgICAgICAgICAgaW1wb3J0IHN5cywgcGtnX3Jlc291cmNlcywgaW1wCiAgICAgICAgICAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywgJXIpCiAgICAgICAgICAgIF9fbG9hZGVyX18gPSBOb25lOyBkZWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXwogICAgICAgICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKQogICAgICAgIF9fYm9vdHN0cmFwX18oKQogICAgICAgICIiIikubHN0cmlwKCkKICAgIHdpdGggb3BlbihweWZpbGUsICd3JykgYXMgZjoKICAgICAgICBmLndyaXRlKF9zdHViX3RlbXBsYXRlICUgcmVzb3VyY2UpCgoKY2xhc3MgYmRpc3RfZWdnKENvbW1hbmQpOgogICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGFuIFwiZWdnXCIgZGlzdHJpYnV0aW9uIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2JkaXN0LWRpcj0nLCAnYicsCiAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCiAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLCAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9idWlsZF9wbGF0Zm9ybSgpKSwKICAgICAgICAoJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJywgTm9uZSwKICAgICAgICAgInJlbW92ZSBhbGwgLnB5IGZpbGVzIGZyb20gdGhlIGdlbmVyYXRlZCBlZ2ciKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCiAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAogICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCiAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAnZXhjbHVkZS1zb3VyY2UtZmlsZXMnCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBOb25lCiAgICAgICAgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlcyA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBlaV9jbWQgPSBzZWxmLmVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVpX2NtZC5lZ2dfaW5mbwoKICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQogICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnZWdnJykKCiAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQoKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCgogICAgICAgIGlmIHNlbGYuZWdnX291dHB1dCBpcyBOb25lOgoKICAgICAgICAgICAgIyBDb21wdXRlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZWdnCiAgICAgICAgICAgIGJhc2VuYW1lID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCiAgICAgICAgICAgICAgICBnZXRfcHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpIGFuZCBzZWxmLnBsYXRfbmFtZQogICAgICAgICAgICApLmVnZ19uYW1lKCkKCiAgICAgICAgICAgIHNlbGYuZWdnX291dHB1dCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBiYXNlbmFtZSArICcuZWdnJykKCiAgICBkZWYgZG9faW5zdGFsbF9kYXRhKHNlbGYpOgogICAgICAgICMgSGFjayBmb3IgcGFja2FnZXMgdGhhdCBpbnN0YWxsIGRhdGEgdG8gaW5zdGFsbCdzIC0taW5zdGFsbC1saWIKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmluc3RhbGxfbGliID0gc2VsZi5iZGlzdF9kaXIKCiAgICAgICAgc2l0ZV9wYWNrYWdlcyA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChfZ2V0X3B1cmVsaWIoKSkpCiAgICAgICAgb2xkLCBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcywgW10KCiAgICAgICAgZm9yIGl0ZW0gaW4gb2xkOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHR1cGxlKSBhbmQgbGVuKGl0ZW0pID09IDI6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGl0ZW1bMF0pOgogICAgICAgICAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChpdGVtWzBdKQogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBvcy5wYXRoLm5vcm1jYXNlKHJlYWxwYXRoKQogICAgICAgICAgICAgICAgICAgIGlmIG5vcm1hbGl6ZWQgPT0gc2l0ZV9wYWNrYWdlcyBvciBub3JtYWxpemVkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfcGFja2FnZXMgKyBvcy5zZXAKICAgICAgICAgICAgICAgICAgICApOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVhbHBhdGhbbGVuKHNpdGVfcGFja2FnZXMpICsgMTpdLCBpdGVtWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIGVsc2U6IHJhaXNlID8/PwogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLmFwcGVuZChpdGVtKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHBhY2thZ2UgZGF0YSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9kYXRhJywgZm9yY2U9MCwgcm9vdD1Ob25lKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBvbGQKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtzZWxmLmVnZ19vdXRwdXRdCgogICAgZGVmIGNhbGxfY29tbWFuZChzZWxmLCBjbWRuYW1lLCAqKmt3KToKICAgICAgICAiIiJJbnZva2UgcmVpbml0aWFsaXplZCBjb21tYW5kIGBjbWRuYW1lYCB3aXRoIGtleXdvcmQgYXJncyIiIgogICAgICAgIGZvciBkaXJuYW1lIGluIElOU1RBTExfRElSRUNUT1JZX0FUVFJTOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGRpcm5hbWUsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ3NraXBfYnVpbGQnLCBzZWxmLnNraXBfYnVpbGQpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnZHJ5X3J1bicsIHNlbGYuZHJ5X3J1bikKICAgICAgICBjbWQgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKGNtZG5hbWUsICoqa3cpCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRuYW1lKQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgR2VuZXJhdGUgbWV0YWRhdGEgZmlyc3QKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgIyBXZSBydW4gaW5zdGFsbF9saWIgYmVmb3JlIGluc3RhbGxfZGF0YSwgYmVjYXVzZSBzb21lIGRhdGEgaGFja3MKICAgICAgICAjIHB1bGwgdGhlaXIgZGF0YSBwYXRoIGZyb20gdGhlIGluc3RhbGxfbGliIGNvbW1hbmQuCiAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgbGlicmFyeSBjb2RlIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAgaW5zdGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBvbGRfcm9vdCA9IGluc3RjbWQucm9vdAogICAgICAgIGluc3RjbWQucm9vdCA9IE5vbmUKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKSBhbmQgbm90IHNlbGYuc2tpcF9idWlsZDoKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfY2xpYicpCiAgICAgICAgY21kID0gc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfbGliJywgd2Fybl9kaXI9MCkKICAgICAgICBpbnN0Y21kLnJvb3QgPSBvbGRfcm9vdAoKICAgICAgICBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMgPSBzZWxmLmdldF9leHRfb3V0cHV0cygpCiAgICAgICAgc2VsZi5zdHVicyA9IFtdCiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgZm9yIChwLCBleHRfbmFtZSkgaW4gZW51bWVyYXRlKGV4dF9vdXRwdXRzKToKICAgICAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXh0X25hbWUpCiAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2Rpciwgc3RyaXBfbW9kdWxlKGZpbGVuYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnB5JykKICAgICAgICAgICAgc2VsZi5zdHVicy5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIiwgZXh0X25hbWUpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICB3cml0ZV9zdHViKG9zLnBhdGguYmFzZW5hbWUoZXh0X25hbWUpLCBweWZpbGUpCiAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgZXh0X291dHB1dHNbcF0gPSBleHRfbmFtZS5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKICAgICAgICBpZiB0b19jb21waWxlOgogICAgICAgICAgICBjbWQuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKICAgICAgICAgICAgc2VsZi5kb19pbnN0YWxsX2RhdGEoKQoKICAgICAgICAjIE1ha2UgdGhlIEVHRy1JTkZPIGRpcmVjdG9yeQogICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCAnRUdHLUlORk8nKQogICAgICAgIHNlbGYubWtwYXRoKGVnZ19pbmZvKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CiAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdzY3JpcHRzJykKICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgc2NyaXB0cyB0byAlcyIsIHNjcmlwdF9kaXIpCiAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnLCBpbnN0YWxsX2Rpcj1zY3JpcHRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19lcD0xKQoKICAgICAgICBzZWxmLmNvcHlfbWV0YWRhdGFfdG8oZWdnX2luZm8pCiAgICAgICAgbmF0aXZlX2xpYnMgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICJuYXRpdmVfbGlicy50eHQiKQogICAgICAgIGlmIGFsbF9vdXRwdXRzOgogICAgICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShuYXRpdmVfbGlicykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZSA9IG9wZW4obmF0aXZlX2xpYnMsICd3dCcpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJy5qb2luKGFsbF9vdXRwdXRzKSkKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nKQogICAgICAgICAgICAgICAgbGlic19maWxlLmNsb3NlKCkKICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hdGl2ZV9saWJzKToKICAgICAgICAgICAgbG9nLmluZm8oInJlbW92aW5nICVzIiwgbmF0aXZlX2xpYnMpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmF0aXZlX2xpYnMpCgogICAgICAgIHdyaXRlX3NhZmV0eV9mbGFnKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCAnRUdHLUlORk8nKSwgc2VsZi56aXBfc2FmZSgpCiAgICAgICAgKQoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgJ2RlcGVuZHMudHh0JykpOgogICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIHdpbGwgbm90IGJlIHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCiAgICAgICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzOgogICAgICAgICAgICBzZWxmLnphcF9weWZpbGVzKCkKCiAgICAgICAgIyBNYWtlIHRoZSBhcmNoaXZlCiAgICAgICAgbWFrZV96aXBmaWxlKHNlbGYuZWdnX291dHB1dCwgYXJjaGl2ZV9yb290LCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIG1vZGU9c2VsZi5nZW5faGVhZGVyKCkpCiAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgogICAgICAgICAgICByZW1vdmVfdHJlZShzZWxmLmJkaXN0X2RpciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCgogICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcwogICAgICAgIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pLmFwcGVuZCgKICAgICAgICAgICAgKCdiZGlzdF9lZ2cnLCBnZXRfcHl0aG9uX3ZlcnNpb24oKSwgc2VsZi5lZ2dfb3V0cHV0KSkKCiAgICBkZWYgemFwX3B5ZmlsZXMoc2VsZik6CiAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nIC5weSBmaWxlcyBmcm9tIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiB3YWxrX2VnZyhzZWxmLmJkaXN0X2Rpcik6CiAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBuYW1lKQoKICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgJXMiLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQoKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJ19fcHljYWNoZV9fJyk6CiAgICAgICAgICAgICAgICAgICAgcGF0aF9vbGQgPSBwYXRoCgogICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSByJyg/UDxuYW1lPi4rKVwuKD9QPG1hZ2ljPlteLl0rKVwucHljJwogICAgICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChwYXR0ZXJuLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHBhdGhfbmV3ID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBvcy5wYXJkaXIsIG0uZ3JvdXAoJ25hbWUnKSArICcucHljJykKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgIlJlbmFtaW5nIGZpbGUgZnJvbSBbJXNdIHRvIFslc10iCiAgICAgICAgICAgICAgICAgICAgICAgICUgKHBhdGhfb2xkLCBwYXRoX25ldykpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aF9uZXcpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUocGF0aF9vbGQsIHBhdGhfbmV3KQoKICAgIGRlZiB6aXBfc2FmZShzZWxmKToKICAgICAgICBzYWZlID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2FmZQogICAgICAgIGxvZy53YXJuKCJ6aXBfc2FmZSBmbGFnIG5vdCBzZXQ7IGFuYWx5emluZyBhcmNoaXZlIGNvbnRlbnRzLi4uIikKICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCgogICAgZGVmIGdlbl9oZWFkZXIoc2VsZik6CiAgICAgICAgZXBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoc2VsZi5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzIG9yICcnKQogICAgICAgIGVwID0gZXBtLmdldCgnc2V0dXB0b29scy5pbnN0YWxsYXRpb24nLCB7fSkuZ2V0KCdlZ2dzZWN1dGFibGUnKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAndycgICMgbm90IGFuIGVnZ3NlY3V0YWJsZSwgZG8gaXQgdGhlIHVzdWFsIHdheS4KCiAgICAgICAgaWYgbm90IGVwLmF0dHJzIG9yIGVwLmV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJlZ2dzZWN1dGFibGUgZW50cnkgcG9pbnQgKCVyKSBjYW5ub3QgaGF2ZSAnZXh0cmFzJyAiCiAgICAgICAgICAgICAgICAib3IgcmVmZXIgdG8gYSBtb2R1bGUiICUgKGVwLCkKICAgICAgICAgICAgKQoKICAgICAgICBweXZlciA9ICd7fS57fScuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKQogICAgICAgIHBrZyA9IGVwLm1vZHVsZV9uYW1lCiAgICAgICAgZnVsbCA9ICcuJy5qb2luKGVwLmF0dHJzKQogICAgICAgIGJhc2UgPSBlcC5hdHRyc1swXQogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmVnZ19vdXRwdXQpCgogICAgICAgIGhlYWRlciA9ICgKICAgICAgICAgICAgIiMhL2Jpbi9zaFxuIgogICAgICAgICAgICAnaWYgWyBgYmFzZW5hbWUgJDBgID0gIiUoYmFzZW5hbWUpcyIgXVxuJwogICAgICAgICAgICAndGhlbiBleGVjIHB5dGhvbiUocHl2ZXIpcyAtYyAiJwogICAgICAgICAgICAiaW1wb3J0IHN5cywgb3M7IHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJyQwJykpOyAiCiAgICAgICAgICAgICJmcm9tICUocGtnKXMgaW1wb3J0ICUoYmFzZSlzOyBzeXMuZXhpdCglKGZ1bGwpcygpKSIKICAgICAgICAgICAgJyIgIiRAIlxuJwogICAgICAgICAgICAnZWxzZVxuJwogICAgICAgICAgICAnICBlY2hvICQwIGlzIG5vdCB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGlzIGVnZyBmaWxlLlxuJwogICAgICAgICAgICAnICBlY2hvIFBsZWFzZSByZW5hbWUgaXQgYmFjayB0byAlKGJhc2VuYW1lKXMgYW5kIHRyeSBhZ2Fpbi5cbicKICAgICAgICAgICAgJyAgZXhlYyBmYWxzZVxuJwogICAgICAgICAgICAnZmlcbicKICAgICAgICApICUgbG9jYWxzKCkKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmVnZ19vdXRwdXQpLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5lZ2dfb3V0cHV0LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoaGVhZGVyKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICByZXR1cm4gJ2EnCgogICAgZGVmIGNvcHlfbWV0YWRhdGFfdG8oc2VsZiwgdGFyZ2V0X2Rpcik6CiAgICAgICAgIkNvcHkgbWV0YWRhdGEgKGVnZyBpbmZvKSB0byB0aGUgdGFyZ2V0X2RpciIKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgcGF0aCAoc28gdGhhdCBhIGZvcndhcmQtc2xhc2ggaW4gZWdnX2luZm8gd2lsbAogICAgICAgICMgbWF0Y2ggdXNpbmcgc3RhcnRzd2l0aCBiZWxvdykKICAgICAgICBub3JtX2VnZ19pbmZvID0gb3MucGF0aC5ub3JtcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihub3JtX2VnZ19pbmZvLCAnJykKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2RpciwgcGF0aFtsZW4ocHJlZml4KTpdKQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLCB0YXJnZXQpCgogICAgZGVmIGdldF9leHRfb3V0cHV0cyhzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgoKICAgICAgICBhbGxfb3V0cHV0cyA9IFtdCiAgICAgICAgZXh0X291dHB1dHMgPSBbXQoKICAgICAgICBwYXRocyA9IHtzZWxmLmJkaXN0X2RpcjogJyd9CiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQocGF0aHNbYmFzZV0gKyBmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CiAgICAgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpXSA9IChwYXRoc1tiYXNlXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICcvJykKCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS5zdGFydHN3aXRoKCdkbC0nKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIGZpbGVuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKCiAgICAgICAgcmV0dXJuIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cwoKCk5BVElWRV9FWFRFTlNJT05TID0gZGljdC5mcm9ta2V5cygnLmRsbCAuc28gLmR5bGliIC5weWQnLnNwbGl0KCkpCgoKZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgIiIiV2FsayBhbiB1bnBhY2tlZCBlZ2cncyBjb250ZW50cywgc2tpcHBpbmcgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSIiIgogICAgd2Fsa2VyID0gc29ydGVkX3dhbGsoZWdnX2RpcikKICAgIGJhc2UsIGRpcnMsIGZpbGVzID0gbmV4dCh3YWxrZXIpCiAgICBpZiAnRUdHLUlORk8nIGluIGRpcnM6CiAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCiAgICBmb3IgYmRmIGluIHdhbGtlcjoKICAgICAgICB5aWVsZCBiZGYKCgpkZWYgYW5hbHl6ZV9lZ2coZWdnX2Rpciwgc3R1YnMpOgogICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTwogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihlZ2dfZGlyLCAnRUdHLUlORk8nLCBmbikpOgogICAgICAgICAgICByZXR1cm4gZmxhZwogICAgaWYgbm90IGNhbl9zY2FuKCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzYWZlID0gVHJ1ZQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKSBvciBuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzY2FuLCBldmVuIGlmIHdlIGFscmVhZHkga25vdyB3ZSdyZSBub3Qgc2FmZQogICAgICAgICAgICAgICAgc2FmZSA9IHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKSBhbmQgc2FmZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgd3JpdGVfc2FmZXR5X2ZsYWcoZWdnX2Rpciwgc2FmZSk6CiAgICAjIFdyaXRlIG9yIHJlbW92ZSB6aXAgc2FmZXR5IGZsYWcgZmlsZShzKQogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgaWYgc2FmZSBpcyBOb25lIG9yIGJvb2woc2FmZSkgIT0gZmxhZzoKICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICBlbGlmIHNhZmUgaXMgbm90IE5vbmUgYW5kIGJvb2woc2FmZSkgPT0gZmxhZzoKICAgICAgICAgICAgZiA9IG9wZW4oZm4sICd3dCcpCiAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi5jbG9zZSgpCgoKc2FmZXR5X2ZsYWdzID0gewogICAgVHJ1ZTogJ3ppcC1zYWZlJywKICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKfQoKCmRlZiBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicyk6CiAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgoKICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCiAgICBpZiBmaWxlbmFtZVs6LTFdIGluIHN0dWJzOgogICAgICAgIHJldHVybiBUcnVlICAjIEV4dGVuc2lvbiBtb2R1bGUKICAgIHBrZyA9IGJhc2VbbGVuKGVnZ19kaXIpICsgMTpdLnJlcGxhY2Uob3Muc2VwLCAnLicpCiAgICBtb2R1bGUgPSBwa2cgKyAocGtnIGFuZCAnLicgb3IgJycpICsgb3MucGF0aC5zcGxpdGV4dChuYW1lKVswXQogICAgaWYgc2l4LlBZMjoKICAgICAgICBza2lwID0gOCAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDcpOgogICAgICAgIHNraXAgPSAxMiAgIyBza2lwIG1hZ2ljICYgZGF0ZSAmIGZpbGUgc2l6ZQogICAgZWxzZToKICAgICAgICBza2lwID0gMTYgICMgc2tpcCBtYWdpYyAmIHJlc2VydmVkPyAmIGRhdGUgJiBmaWxlIHNpemUKICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncmInKQogICAgZi5yZWFkKHNraXApCiAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICBmLmNsb3NlKCkKICAgIHNhZmUgPSBUcnVlCiAgICBzeW1ib2xzID0gZGljdC5mcm9ta2V5cyhpdGVyX3N5bWJvbHMoY29kZSkpCiAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgcmVmZXJlbmNlcyAlcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIGlmICdpbnNwZWN0JyBpbiBzeW1ib2xzOgogICAgICAgIGZvciBiYWQgaW4gWwogICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJwogICAgICAgICAgICAnZ2V0c291cmNlbGluZXMnLCAnZmluZHNvdXJjZScsICdnZXRjb21tZW50cycsICdnZXRmcmFtZWluZm8nLAogICAgICAgICAgICAnZ2V0aW5uZXJmcmFtZXMnLCAnZ2V0b3V0ZXJmcmFtZXMnLCAnc3RhY2snLCAndHJhY2UnCiAgICAgICAgXToKICAgICAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSBNQVkgYmUgdXNpbmcgaW5zcGVjdC4lcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICByZXR1cm4gc2FmZQoKCmRlZiBpdGVyX3N5bWJvbHMoY29kZSk6CiAgICAiIiJZaWVsZCBuYW1lcyBhbmQgc3RyaW5ncyB1c2VkIGJ5IGBjb2RlYCBhbmQgaXRzIG5lc3RlZCBjb2RlIG9iamVjdHMiIiIKICAgIGZvciBuYW1lIGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgeWllbGQgbmFtZQogICAgZm9yIGNvbnN0IGluIGNvZGUuY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB5aWVsZCBjb25zdAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCwgQ29kZVR5cGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgogICAgICAgICAgICAgICAgeWllbGQgbmFtZQoKCmRlZiBjYW5fc2NhbigpOgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICAjIENQeXRob24sIFB5UHksIGV0Yy4KICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nLndhcm4oIlVuYWJsZSB0byBhbmFseXplIGNvbXBpbGVkIGNvZGUgb24gdGhpcyBwbGF0Zm9ybS4iKQogICAgbG9nLndhcm4oIlBsZWFzZSBhc2sgdGhlIGF1dGhvciB0byBpbmNsdWRlIGEgJ3ppcF9zYWZlJyIKICAgICAgICAgICAgICIgc2V0dGluZyAoZWl0aGVyIFRydWUgb3IgRmFsc2UpIGluIHRoZSBwYWNrYWdlJ3Mgc2V0dXAucHkiKQoKCiMgQXR0cmlidXRlIG5hbWVzIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252aW5jZWQgdG8KIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CgpJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUyA9IFsKICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJwpdCgoKZGVmIG1ha2VfemlwZmlsZSh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBtb2RlPSd3Jyk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4gIFRoZSBvdXRwdXQKICAgIHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZSAiemlwZmlsZSIKICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCiAgICBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzIGF2YWlsYWJsZSwKICAgIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAgICAiIiIKICAgIGltcG9ydCB6aXBmaWxlCgogICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgIGRlZiB2aXNpdCh6LCBkaXJuYW1lLCBuYW1lcyk6CiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpICsgMTpdCiAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyAnJXMnIiwgcCkKCiAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0RFRkxBVEVEIGlmIGNvbXByZXNzIGVsc2UgemlwZmlsZS5aSVBfU1RPUkVECiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgbW9kZSwgY29tcHJlc3Npb249Y29tcHJlc3Npb24pCiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoeiwgZGlybmFtZSwgZmlsZXMpCiAgICAgICAgei5jbG9zZSgpCiAgICBlbHNlOgogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KE5vbmUsIGRpcm5hbWUsIGZpbGVzKQogICAgcmV0dXJuIHppcF9maWxlbmFtZQpQSwMEFAAAAAAAAAAhAOvSdBbkBQAA5AUAAEQAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9ycG0gYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3JwbShvcmlnLmJkaXN0X3JwbSk6CiAgICAiIiIKICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJkaXN0X3JwbSBiZWhhdmlvciB0byBkbyB0aGUgZm9sbG93aW5nOgoKICAgIDEuIFJ1biBlZ2dfaW5mbyB0byBlbnN1cmUgdGhlIG5hbWUgYW5kIHZlcnNpb24gYXJlIHByb3Blcmx5IGNhbGN1bGF0ZWQuCiAgICAyLiBBbHdheXMgcnVuICdpbnN0YWxsJyB1c2luZyAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCB0bwogICAgICAgZGlzYWJsZSBlZ2dzIGluIFJQTSBkaXN0cmlidXRpb25zLgogICAgMy4gUmVwbGFjZSBkYXNoIHdpdGggdW5kZXJzY29yZSBpbiB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciBiZXR0ZXIgUlBNCiAgICAgICBjb21wYXRpYmlsaXR5LgogICAgIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIGVuc3VyZSBkaXN0cm8gbmFtZSBpcyB1cC10by1kYXRlCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICBvcmlnLmJkaXN0X3JwbS5ydW4oc2VsZikKCiAgICBkZWYgX21ha2Vfc3BlY19maWxlKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgcnBtdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnLScsICdfJykKICAgICAgICBzcGVjID0gb3JpZy5iZGlzdF9ycG0uX21ha2Vfc3BlY19maWxlKHNlbGYpCiAgICAgICAgbGluZTIzID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgdmVyc2lvbgogICAgICAgIGxpbmUyNCA9ICclZGVmaW5lIHZlcnNpb24gJyArIHJwbXZlcnNpb24KICAgICAgICBzcGVjID0gWwogICAgICAgICAgICBsaW5lLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3ZlcnNpb259LnRhciIsCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsICIsCiAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCAiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICIlc2V0dXAiLAogICAgICAgICAgICAgICAgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IgogICAgICAgICAgICApLnJlcGxhY2UobGluZTIzLCBsaW5lMjQpCiAgICAgICAgICAgIGZvciBsaW5lIGluIHNwZWMKICAgICAgICBdCiAgICAgICAgaW5zZXJ0X2xvYyA9IHNwZWMuaW5kZXgobGluZTI0KSArIDEKICAgICAgICB1bm1hbmdsZWRfdmVyc2lvbiA9ICIlZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICIgKyB2ZXJzaW9uCiAgICAgICAgc3BlYy5pbnNlcnQoaW5zZXJ0X2xvYywgdW5tYW5nbGVkX3ZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNwZWMKUEsDBBQAAAAAAAAAIQAgjHUUfQIAAH0CAABIAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QgYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3dpbmluc3Qob3JpZy5iZGlzdF93aW5pbnN0KToKICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCk6CiAgICAgICAgIiIiCiAgICAgICAgU3VwcGxlbWVudCByZWluaXRpYWxpemVfY29tbWFuZCB0byB3b3JrIGFyb3VuZAogICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDgxOQogICAgICAgICIiIgogICAgICAgIGNtZCA9IHNlbGYuZGlzdHJpYnV0aW9uLnJlaW5pdGlhbGl6ZV9jb21tYW5kKAogICAgICAgICAgICBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgaWYgY29tbWFuZCBpbiAoJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInKToKICAgICAgICAgICAgY21kLmluc3RhbGxfbGliID0gTm9uZQogICAgICAgIHJldHVybiBjbWQKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcmlnLmJkaXN0X3dpbmluc3QucnVuKHNlbGYpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5faXNfcnVubmluZyA9IEZhbHNlClBLAwQUAAAAAAAAACEAJxqNG4QRAACEEQAARQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliIGFzIG9yaWcKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBzZXR1cHRvb2xzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9wYWlyd2lzZV9ncm91cAoKCmNsYXNzIGJ1aWxkX2NsaWIob3JpZy5idWlsZF9jbGliKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVpbGRfY2xpYiBiZWhhdmlvdXIgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBJbXBsZW1lbnQgYSBydWRpbWVudGFyeSB0aW1lc3RhbXAtYmFzZWQgZGVwZW5kZW5jeSBzeXN0ZW0KICAgICAgIHNvICdjb21waWxlKCknIGRvZXNuJ3QgcnVuIGV2ZXJ5IHRpbWUuCiAgICAyLiBBZGQgbW9yZSBrZXlzIHRvIHRoZSAnYnVpbGRfaW5mbycgZGljdGlvbmFyeToKICAgICAgICAqIG9ial9kZXBzIC0gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggb2JqZWN0IGNvbXBpbGVkLgogICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBhIGtleQogICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBzb3VyY2UgZmlsZW5hbWUgdG8gYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4gVXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KICAgICAgICAqIGNmbGFncyAgIC0gc3BlY2lmeSBhIGxpc3Qgb2YgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvCiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21waWxlci4KICAgICIiIgoKICAgIGRlZiBidWlsZF9saWJyYXJpZXMoc2VsZiwgbGlicmFyaWVzKToKICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBsaWJyYXJpZXM6CiAgICAgICAgICAgIHNvdXJjZXMgPSBidWlsZF9pbmZvLmdldCgnc291cmNlcycpCiAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiICUgbGliX25hbWUpCiAgICAgICAgICAgIHNvdXJjZXMgPSBsaXN0KHNvdXJjZXMpCgogICAgICAgICAgICBsb2cuaW5mbygiYnVpbGRpbmcgJyVzJyBsaWJyYXJ5IiwgbGliX25hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHRoZSBjb3JyZWN0IHR5cGUuCiAgICAgICAgICAgICMgb2JqX2RlcHMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvZiBrZXlzIGFzIHNvdXJjZXMKICAgICAgICAgICAgIyBhbmQgYSBsaXN0L3R1cGxlIG9mIGZpbGVzIHRoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIG9ial9kZXBzID0gYnVpbGRfaW5mby5nZXQoJ29ial9kZXBzJywgZGljdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvYmpfZGVwcywgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IFtdCgogICAgICAgICAgICAjIEdldCB0aGUgZ2xvYmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhlICcnIGtleS4KICAgICAgICAgICAgIyBUaGVzZSB3aWxsIGdvIGludG8gZXZlcnkgc291cmNlJ3MgZGVwZW5kZW5jeSBsaXN0LgogICAgICAgICAgICBnbG9iYWxfZGVwcyA9IG9ial9kZXBzLmdldCgnJywgbGlzdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShnbG9iYWxfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IHRvIGJlIHVzZWQgYnkgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKICAgICAgICAgICAgIyBlYWNoIHNvdXJjZSB3aWxsIGJlIGF1dG8tYWRkZWQgdG8gaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgogICAgICAgICAgICAgICAgc3JjX2RlcHMgPSBbc291cmNlXQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGdsb2JhbF9kZXBzKQogICAgICAgICAgICAgICAgZXh0cmFfZGVwcyA9IG9ial9kZXBzLmdldChzb3VyY2UsIGxpc3QoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChleHRyYV9kZXBzKQogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFwcGVuZChzcmNfZGVwcykKCiAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMgPSBzZWxmLmNvbXBpbGVyLm9iamVjdF9maWxlbmFtZXMoCiAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKGRlcGVuZGVuY2llcywgZXhwZWN0ZWRfb2JqZWN0cykgIT0gKFtdLCBbXSk6CiAgICAgICAgICAgICAgICAjIEZpcnN0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcnkKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5LiAgKFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBwdXR0aW5nIG9iamVjdAogICAgICAgICAgICAgICAgIyBmaWxlcyBpbiBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkuKQogICAgICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCiAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBidWlsZF9pbmZvLmdldCgnaW5jbHVkZV9kaXJzJykKICAgICAgICAgICAgICAgIGNmbGFncyA9IGJ1aWxkX2luZm8uZ2V0KCdjZmxhZ3MnKQogICAgICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPWNmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIE5vdyAibGluayIgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciBpbnRvIGEgc3RhdGljIGxpYnJhcnkuCiAgICAgICAgICAgICMgKE9uIFVuaXggYXQgbGVhc3QsIHRoaXMgaXNuJ3QgcmVhbGx5IGxpbmtpbmcgLS0gaXQganVzdAogICAgICAgICAgICAjIGJ1aWxkcyBhbiBhcmNoaXZlLiAgV2hhdGV2ZXIuKQogICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgbGliX25hbWUsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX2NsaWIsCiAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQCNKP1w2zIAANsyAABEAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaXRlcnRvb2xzCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2R1X2J1aWxkX2V4dApmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IGNvcHlfZmlsZQpmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgpmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlciwgZ2V0X2NvbmZpZ192YXIKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgpmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaWYgc2l4LlBZMjoKICAgIGltcG9ydCBpbXAKCiAgICBFWFRFTlNJT05fU1VGRklYRVMgPSBbcyBmb3IgcywgXywgdHAgaW4gaW1wLmdldF9zdWZmaXhlcygpIGlmIHRwID09IGltcC5DX0VYVEVOU0lPTl0KZWxzZToKICAgIGZyb20gaW1wb3J0bGliLm1hY2hpbmVyeSBpbXBvcnQgRVhURU5TSU9OX1NVRkZJWEVTCgp0cnk6CiAgICAjIEF0dGVtcHQgdG8gdXNlIEN5dGhvbiBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9ucywgaWYgYXZhaWxhYmxlCiAgICBmcm9tIEN5dGhvbi5EaXN0dXRpbHMuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2J1aWxkX2V4dAogICAgIyBBZGRpdGlvbmFsbHksIGFzc2VydCB0aGF0IHRoZSBjb21waWxlciBtb2R1bGUgd2lsbCBsb2FkCiAgICAjIGFsc28uIFJlZiAjMTIyOS4KICAgIF9faW1wb3J0X18oJ0N5dGhvbi5Db21waWxlci5NYWluJykKZXhjZXB0IEltcG9ydEVycm9yOgogICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKCiMgbWFrZSBzdXJlIF9jb25maWdfdmFycyBpcyBpbml0aWFsaXplZApnZXRfY29uZmlnX3ZhcigiTERTSEFSRUQiKQpmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IF9jb25maWdfdmFycyBhcyBfQ09ORklHX1ZBUlMKCgpkZWYgX2N1c3RvbWl6ZV9jb21waWxlcl9mb3Jfc2hsaWIoY29tcGlsZXIpOgogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICMgYnVpbGRpbmcgLmR5bGliIHJlcXVpcmVzIGFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3Mgb24gT1NYOyBoZXJlIHdlCiAgICAgICAgIyB0ZW1wb3JhcmlseSBzdWJzdGl0dXRlIHRoZSBweWNvbmZpZy5oIHZhcmlhYmxlcyBzbyB0aGF0IGRpc3R1dGlscycKICAgICAgICAjICdjdXN0b21pemVfY29tcGlsZXInIHVzZXMgdGhlbSBiZWZvcmUgd2UgYnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgICAgdG1wID0gX0NPTkZJR19WQVJTLmNvcHkoKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyBYWFggSGVscCEgIEkgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGV0aGVyIHRoZXNlIGFyZSByaWdodC4uLgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ0xEU0hBUkVEJ10gPSAoCiAgICAgICAgICAgICAgICAiZ2NjIC1XbCwteCAtZHluYW1pY2xpYiAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIikKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydDQ1NIQVJFRCddID0gIiAtZHluYW1pY2xpYiIKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydTTyddID0gIi5keWxpYiIKICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIF9DT05GSUdfVkFSUy5jbGVhcigpCiAgICAgICAgICAgIF9DT05GSUdfVkFSUy51cGRhdGUodG1wKQogICAgZWxzZToKICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCgoKaGF2ZV9ydGxkID0gRmFsc2UKdXNlX3N0dWJzID0gRmFsc2UKbGlidHlwZSA9ICdzaGFyZWQnCgppZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICB1c2Vfc3R1YnMgPSBUcnVlCmVsaWYgb3MubmFtZSAhPSAnbnQnOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBkbAogICAgICAgIHVzZV9zdHVicyA9IGhhdmVfcnRsZCA9IGhhc2F0dHIoZGwsICdSVExEX05PVycpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKaWZfZGwgPSBsYW1iZGEgczogcyBpZiBoYXZlX3J0bGQgZWxzZSAnJwoKCmRlZiBnZXRfYWJpM19zdWZmaXgoKToKICAgICIiIlJldHVybiB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGFuIGFiaTMtY29tcGxpYW50IEV4dGVuc2lvbigpIiIiCiAgICBmb3Igc3VmZml4IGluIEVYVEVOU0lPTl9TVUZGSVhFUzoKICAgICAgICBpZiAnLmFiaTMnIGluIHN1ZmZpeDogICMgVW5peAogICAgICAgICAgICByZXR1cm4gc3VmZml4CiAgICAgICAgZWxpZiBzdWZmaXggPT0gJy5weWQnOiAgIyBXaW5kb3dzCiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKCgpjbGFzcyBidWlsZF9leHQoX2J1aWxkX2V4dCk6CiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCiAgICAgICAgb2xkX2lucGxhY2UsIHNlbGYuaW5wbGFjZSA9IHNlbGYuaW5wbGFjZSwgMAogICAgICAgIF9idWlsZF9leHQucnVuKHNlbGYpCiAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKICAgICAgICBpZiBvbGRfaW5wbGFjZToKICAgICAgICAgICAgc2VsZi5jb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKCkKCiAgICBkZWYgY29weV9leHRlbnNpb25zX3RvX3NvdXJjZShzZWxmKToKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbOi0xXSkKICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBidWlsZF9weS5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgc3JjX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkKCiAgICAgICAgICAgICMgQWx3YXlzIGNvcHksIGV2ZW4gaWYgc291cmNlIGlzIG9sZGVyIHRoYW4gZGVzdGluYXRpb24sIHRvIGVuc3VyZQogICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKICAgICAgICAgICAgIyB1c2VkLgogICAgICAgICAgICBjb3B5X2ZpbGUoCiAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAogICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIocGFja2FnZV9kaXIgb3Igb3MuY3VyZGlyLCBleHQsIFRydWUpCgogICAgZGVmIGdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gX2J1aWxkX2V4dC5nZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKQogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYuZXh0X21hcDoKICAgICAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQogICAgICAgICAgICB1c2VfYWJpMyA9ICgKICAgICAgICAgICAgICAgIHNpeC5QWTMKICAgICAgICAgICAgICAgIGFuZCBnZXRhdHRyKGV4dCwgJ3B5X2xpbWl0ZWRfYXBpJykKICAgICAgICAgICAgICAgIGFuZCBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHVzZV9hYmkzOgogICAgICAgICAgICAgICAgc29fZXh0ID0gZ2V0X2NvbmZpZ192YXIoJ0VYVF9TVUZGSVgnKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LWxlbihzb19leHQpXQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSArIGdldF9hYmkzX3N1ZmZpeCgpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbiwgbGlidHlwZSkKICAgICAgICAgICAgZWxpZiB1c2Vfc3R1YnMgYW5kIGV4dC5fbGlua3NfdG9fZHluYW1pYzoKICAgICAgICAgICAgICAgIGQsIGZuID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZCwgJ2RsLScgKyBmbikKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5zaGxpYl9jb21waWxlciA9IE5vbmUKICAgICAgICBzZWxmLnNobGlicyA9IFtdCiAgICAgICAgc2VsZi5leHRfbWFwID0ge30KCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBzZWxmLmV4dGVuc2lvbnMgb3IgW10KICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCiAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpXQogICAgICAgIGlmIHNlbGYuc2hsaWJzOgogICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZXh0Ll9mdWxsX25hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGZ1bGxuYW1lID0gZXh0Ll9mdWxsX25hbWUKICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAoKICAgICAgICAgICAgIyBkaXN0dXRpbHMgMy4xIHdpbGwgYWxzbyBhc2sgZm9yIG1vZHVsZSBuYW1lcwogICAgICAgICAgICAjIFhYWCB3aGF0IHRvIGRvIHdpdGggY29uZmxpY3RzPwogICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWUuc3BsaXQoJy4nKVstMV1dID0gZXh0CgogICAgICAgICAgICBsdGQgPSBzZWxmLnNobGlicyBhbmQgc2VsZi5saW5rc190b19keW5hbWljKGV4dCkgb3IgRmFsc2UKICAgICAgICAgICAgbnMgPSBsdGQgYW5kIHVzZV9zdHVicyBhbmQgbm90IGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KQogICAgICAgICAgICBleHQuX2xpbmtzX3RvX2R5bmFtaWMgPSBsdGQKICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbnMKICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgbGliZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgZmlsZW5hbWUpKQogICAgICAgICAgICBpZiBsdGQgYW5kIGxpYmRpciBub3QgaW4gZXh0LmxpYnJhcnlfZGlyczoKICAgICAgICAgICAgICAgIGV4dC5saWJyYXJ5X2RpcnMuYXBwZW5kKGxpYmRpcikKICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgogICAgICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZChvcy5jdXJkaXIpCgogICAgZGVmIHNldHVwX3NobGliX2NvbXBpbGVyKHNlbGYpOgogICAgICAgIGNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlciA9IG5ld19jb21waWxlcigKICAgICAgICAgICAgY29tcGlsZXI9c2VsZi5jb21waWxlciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPXNlbGYuZm9yY2UKICAgICAgICApCiAgICAgICAgX2N1c3RvbWl6ZV9jb21waWxlcl9mb3Jfc2hsaWIoY29tcGlsZXIpCgogICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfaW5jbHVkZV9kaXJzKHNlbGYuaW5jbHVkZV9kaXJzKQogICAgICAgIGlmIHNlbGYuZGVmaW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcwogICAgICAgICAgICBmb3IgKG5hbWUsIHZhbHVlKSBpbiBzZWxmLmRlZmluZToKICAgICAgICAgICAgICAgIGNvbXBpbGVyLmRlZmluZV9tYWNybyhuYW1lLCB2YWx1ZSkKICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi51bmRlZjoKICAgICAgICAgICAgICAgIGNvbXBpbGVyLnVuZGVmaW5lX21hY3JvKG1hY3JvKQogICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyaWVzKHNlbGYubGlicmFyaWVzKQogICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyeV9kaXJzKHNlbGYubGlicmFyeV9kaXJzKQogICAgICAgIGlmIHNlbGYucnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9ydW50aW1lX2xpYnJhcnlfZGlycyhzZWxmLnJwYXRoKQogICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfbGlua19vYmplY3RzKHNlbGYubGlua19vYmplY3RzKQoKICAgICAgICAjIGhhY2sgc28gZGlzdHV0aWxzJyBidWlsZF9leHRlbnNpb24oKSBidWlsZHMgYSBsaWJyYXJ5IGluc3RlYWQKICAgICAgICBjb21waWxlci5saW5rX3NoYXJlZF9vYmplY3QgPSBsaW5rX3NoYXJlZF9vYmplY3QuX19nZXRfXyhjb21waWxlcikKCiAgICBkZWYgZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICByZXR1cm4gZXh0LmV4cG9ydF9zeW1ib2xzCiAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCkKCiAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAgICAgICAgZXh0Ll9jb252ZXJ0X3B5eF9zb3VyY2VzX3RvX2xhbmcoKQogICAgICAgIF9jb21waWxlciA9IHNlbGYuY29tcGlsZXIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyCiAgICAgICAgICAgIF9idWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCkKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgogICAgICAgICAgICAgICAgY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykuYnVpbGRfbGliCiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIoY21kLCBleHQpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IF9jb21waWxlcgoKICAgIGRlZiBsaW5rc190b19keW5hbWljKHNlbGYsIGV4dCk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4dCcgbGlua3MgdG8gYSBkeW5hbWljIGxpYiBpbiB0aGUgc2FtZSBwYWNrYWdlIiIiCiAgICAgICAgIyBYWFggdGhpcyBzaG91bGQgY2hlY2sgdG8gZW5zdXJlIHRoZSBsaWIgaXMgYWN0dWFsbHkgYmVpbmcgYnVpbHQKICAgICAgICAjIFhYWCBhcyBkeW5hbWljLCBhbmQgbm90IGp1c3QgdXNpbmcgYSBsb2NhbGx5LWZvdW5kIHZlcnNpb24gb3IgYQogICAgICAgICMgWFhYIHN0YXRpYy1jb21waWxlZCB2ZXJzaW9uCiAgICAgICAgbGlibmFtZXMgPSBkaWN0LmZyb21rZXlzKFtsaWIuX2Z1bGxfbmFtZSBmb3IgbGliIGluIHNlbGYuc2hsaWJzXSkKICAgICAgICBwa2cgPSAnLicuam9pbihleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpWzotMV0gKyBbJyddKQogICAgICAgIHJldHVybiBhbnkocGtnICsgbGlibmFtZSBpbiBsaWJuYW1lcyBmb3IgbGlibmFtZSBpbiBleHQubGlicmFyaWVzKQoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfb3V0cHV0cyhzZWxmKSArIHNlbGYuX19nZXRfc3R1YnNfb3V0cHV0cygpCgogICAgZGVmIF9fZ2V0X3N0dWJzX291dHB1dHMoc2VsZik6CiAgICAgICAgIyBhc3NlbWJsZSB0aGUgYmFzZSBuYW1lIGZvciBlYWNoIGV4dGVuc2lvbiB0aGF0IG5lZWRzIGEgc3R1YgogICAgICAgIG5zX2V4dF9iYXNlcyA9ICgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkKICAgICAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViCiAgICAgICAgKQogICAgICAgICMgcGFpciBlYWNoIGJhc2Ugd2l0aCB0aGUgZXh0ZW5zaW9uCiAgICAgICAgcGFpcnMgPSBpdGVydG9vbHMucHJvZHVjdChuc19leHRfYmFzZXMsIHNlbGYuX19nZXRfb3V0cHV0X2V4dGVuc2lvbnMoKSkKICAgICAgICByZXR1cm4gbGlzdChiYXNlICsgZm5leHQgZm9yIGJhc2UsIGZuZXh0IGluIHBhaXJzKQoKICAgIGRlZiBfX2dldF9vdXRwdXRfZXh0ZW5zaW9ucyhzZWxmKToKICAgICAgICB5aWVsZCAnLnB5JwogICAgICAgIHlpZWxkICcucHljJwogICAgICAgIGlmIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLm9wdGltaXplOgogICAgICAgICAgICB5aWVsZCAnLnB5bycKCiAgICBkZWYgd3JpdGVfc3R1YihzZWxmLCBvdXRwdXRfZGlyLCBleHQsIGNvbXBpbGU9RmFsc2UpOgogICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyB0byAlcyIsIGV4dC5fZnVsbF9uYW1lLAogICAgICAgICAgICAgICAgIG91dHB1dF9kaXIpCiAgICAgICAgc3R1Yl9maWxlID0gKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkgKwogICAgICAgICAgICAgICAgICAgICAnLnB5JykKICAgICAgICBpZiBjb21waWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHViX2ZpbGUgKyAiIGFscmVhZHkgZXhpc3RzISBQbGVhc2UgZGVsZXRlLiIpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZiA9IG9wZW4oc3R1Yl9maWxlLCAndycpCiAgICAgICAgICAgIGYud3JpdGUoCiAgICAgICAgICAgICAgICAnXG4nLmpvaW4oWwogICAgICAgICAgICAgICAgICAgICJkZWYgX19ib290c3RyYXBfXygpOiIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2ZpbGVfXywgX19sb2FkZXJfXyIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGltcG9ydCBzeXMsIG9zLCBwa2dfcmVzb3VyY2VzLCBpbXAiICsgaWZfZGwoIiwgZGwiKSwKICAgICAgICAgICAgICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lIgogICAgICAgICAgICAgICAgICAgICIoX19uYW1lX18sJXIpIgogICAgICAgICAgICAgICAgICAgICUgb3MucGF0aC5iYXNlbmFtZShleHQuX2ZpbGVfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fIiwKICAgICAgICAgICAgICAgICAgICAiICAgaWYgJ19fbG9hZGVyX18nIGluIGdsb2JhbHMoKToiLAogICAgICAgICAgICAgICAgICAgICIgICAgICAgZGVsIF9fbG9hZGVyX18iLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICBvbGRfZmxhZ3MgPSBzeXMuZ2V0ZGxvcGVuZmxhZ3MoKSIpLAogICAgICAgICAgICAgICAgICAgICIgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkiLAogICAgICAgICAgICAgICAgICAgICIgICB0cnk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKGRsLlJUTERfTk9XKSIpLAogICAgICAgICAgICAgICAgICAgICIgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKICAgICAgICAgICAgICAgICAgICAiICAgZmluYWxseToiLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhvbGRfZmxhZ3MpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob2xkX2RpcikiLAogICAgICAgICAgICAgICAgICAgICJfX2Jvb3RzdHJhcF9fKCkiLAogICAgICAgICAgICAgICAgICAgICIiICAjIHRlcm1pbmFsIFxuCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIGlmIGNvbXBpbGU6CiAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQoKICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT0wLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGxfbGliJykub3B0aW1pemUKICAgICAgICAgICAgaWYgb3B0aW1pemUgPiAwOgogICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT1vcHRpbWl6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKSBhbmQgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhzdHViX2ZpbGUpCgoKaWYgdXNlX3N0dWJzIG9yIG9zLm5hbWUgPT0gJ250JzoKICAgICMgQnVpbGQgc2hhcmVkIGxpYnJhcmllcwogICAgIwogICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdCgKICAgICAgICAgICAgc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCiAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAogICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwKICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CiAgICAgICAgc2VsZi5saW5rKAogICAgICAgICAgICBzZWxmLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwKICAgICAgICAgICAgb3V0cHV0X2RpciwgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAogICAgICAgICAgICBleHBvcnRfc3ltYm9scywgZGVidWcsIGV4dHJhX3ByZWFyZ3MsIGV4dHJhX3Bvc3RhcmdzLAogICAgICAgICAgICBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZwogICAgICAgICkKZWxzZToKICAgICMgQnVpbGQgc3RhdGljIGxpYnJhcmllcyBldmVyeXdoZXJlIGVsc2UKICAgIGxpYnR5cGUgPSAnc3RhdGljJwoKICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3QoCiAgICAgICAgICAgIHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsIGxpYnJhcmllcz1Ob25lLAogICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsCiAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgogICAgICAgICMgWFhYIHdlIG5lZWQgdG8gZWl0aGVyIGRpc2FsbG93IHRoZXNlIGF0dHJzIG9uIExpYnJhcnkgaW5zdGFuY2VzLAogICAgICAgICMgb3Igd2Fybi9hYm9ydCBoZXJlIGlmIHNldCwgb3Igc29tZXRoaW5nLi4uCiAgICAgICAgIyBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCiAgICAgICAgIyBleHBvcnRfc3ltYm9scz1Ob25lLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCiAgICAgICAgIyBidWlsZF90ZW1wPU5vbmUKCiAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgTm9uZSAgIyBkaXN0dXRpbHMgYnVpbGRfZXh0IGRvZXNuJ3QgcGFzcyB0aGlzCiAgICAgICAgb3V0cHV0X2RpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KG91dHB1dF9saWJuYW1lKQogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQogICAgICAgIGlmIHNlbGYubGlicmFyeV9maWxlbmFtZSgieCIpLnN0YXJ0c3dpdGgoJ2xpYicpOgogICAgICAgICAgICAjIHN0cmlwICdsaWInIHByZWZpeDsgdGhpcyBpcyBrbHVkZ3kgaWYgc29tZSBwbGF0Zm9ybSB1c2VzCiAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgcHJlZml4CiAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbMzpdCgogICAgICAgIHNlbGYuY3JlYXRlX3N0YXRpY19saWIoCiAgICAgICAgICAgIG9iamVjdHMsIGJhc2VuYW1lLCBvdXRwdXRfZGlyLCBkZWJ1ZywgdGFyZ2V0X2xhbmcKICAgICAgICApClBLAwQUAAAAAAAAACEAQEZC3HwlAAB8JQAAQwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weSBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgZm5tYXRjaAppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGlvCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBpdGVydG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIsIGZpbHRlcmZhbHNlCgp0cnk6CiAgICBmcm9tIHNldHVwdG9vbHMubGliMnRvM19leCBpbXBvcnQgTWl4aW4ydG8zCmV4Y2VwdCBJbXBvcnRFcnJvcjoKCiAgICBjbGFzcyBNaXhpbjJ0bzM6CiAgICAgICAgZGVmIHJ1bl8ydG8zKHNlbGYsIGZpbGVzLCBkb2N0ZXN0cz1UcnVlKToKICAgICAgICAgICAgImRvIG5vdGhpbmciCgoKY2xhc3MgYnVpbGRfcHkob3JpZy5idWlsZF9weSwgTWl4aW4ydG8zKToKICAgICIiIkVuaGFuY2VkICdidWlsZF9weScgY29tbWFuZCB0aGF0IGluY2x1ZGVzIGRhdGEgZmlsZXMgd2l0aCBwYWNrYWdlcwoKICAgIFRoZSBkYXRhIGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIGEgJ3BhY2thZ2VfZGF0YScgYXJndW1lbnQgdG8gJ3NldHVwKCknLgogICAgU2VlICdzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uJyBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIEFsc28sIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ2J1aWxkX3B5JyBjb21tYW5kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBib3RoCiAgICAncHlfbW9kdWxlcycgYW5kICdwYWNrYWdlcycgaW4gdGhlIHNhbWUgc2V0dXAgb3BlcmF0aW9uLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5idWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RhdGEKICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gKHNlbGYuZGlzdHJpYnV0aW9uLmV4Y2x1ZGVfcGFja2FnZV9kYXRhIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKICAgICAgICBpZiAnZGF0YV9maWxlcycgaW4gc2VsZi5fX2RpY3RfXzoKICAgICAgICAgICAgZGVsIHNlbGYuX19kaWN0X19bJ2RhdGFfZmlsZXMnXQogICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzID0gW10KICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMyA9IFtdCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiJCdWlsZCBtb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNvcHkgZGF0YSBmaWxlcyB0byBidWlsZCBkaXJlY3RvcnkiIiIKICAgICAgICBpZiBub3Qgc2VsZi5weV9tb2R1bGVzIGFuZCBub3Qgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZV9kYXRhKCkKCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgRmFsc2UpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fdXBkYXRlZF9maWxlcywgVHJ1ZSkKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX19kb2N0ZXN0c18ydG8zLCBUcnVlKQoKICAgICAgICAjIE9ubHkgY29tcGlsZSBhY3R1YWwgLnB5IGZpbGVzLCB1c2luZyBvdXIgYmFzZSBjbGFzcycgaWRlYSBvZiB3aGF0IG91cgogICAgICAgICMgb3V0cHV0IGZpbGVzIGFyZS4KICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvcmlnLmJ1aWxkX3B5LmdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MCkpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICJsYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzIgogICAgICAgIGlmIGF0dHIgPT0gJ2RhdGFfZmlsZXMnOgogICAgICAgICAgICBzZWxmLmRhdGFfZmlsZXMgPSBzZWxmLl9nZXRfZGF0YV9maWxlcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFfZmlsZXMKICAgICAgICByZXR1cm4gb3JpZy5idWlsZF9weS5fX2dldGF0dHJfXyhzZWxmLCBhdHRyKQoKICAgIGRlZiBidWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSk6CiAgICAgICAgaWYgc2l4LlBZMiBhbmQgaXNpbnN0YW5jZShwYWNrYWdlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgIyBhdm9pZCBlcnJvcnMgb24gUHl0aG9uIDIgd2hlbiB1bmljb2RlIGlzIHBhc3NlZCAoIzE5MCkKICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2Uuc3BsaXQoJy4nKQogICAgICAgIG91dGZpbGUsIGNvcGllZCA9IG9yaWcuYnVpbGRfcHkuYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSkKICAgICAgICBpZiBjb3BpZWQ6CiAgICAgICAgICAgIHNlbGYuX191cGRhdGVkX2ZpbGVzLmFwcGVuZChvdXRmaWxlKQogICAgICAgIHJldHVybiBvdXRmaWxlLCBjb3BpZWQKCiAgICBkZWYgX2dldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIGxpc3Qgb2YgJyhwYWNrYWdlLHNyY19kaXIsYnVpbGRfZGlyLGZpbGVuYW1lcyknIHR1cGxlcyIiIgogICAgICAgIHNlbGYuYW5hbHl6ZV9tYW5pZmVzdCgpCiAgICAgICAgcmV0dXJuIGxpc3QobWFwKHNlbGYuX2dldF9wa2dfZGF0YV9maWxlcywgc2VsZi5wYWNrYWdlcyBvciAoKSkpCgogICAgZGVmIF9nZXRfcGtnX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgc3JjX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCgogICAgICAgICMgQ29tcHV0ZSBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeQogICAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguam9pbigqKFtzZWxmLmJ1aWxkX2xpYl0gKyBwYWNrYWdlLnNwbGl0KCcuJykpKQoKICAgICAgICAjIFN0cmlwIGRpcmVjdG9yeSBmcm9tIGdsb2JiZWQgZmlsZW5hbWVzCiAgICAgICAgZmlsZW5hbWVzID0gWwogICAgICAgICAgICBvcy5wYXRoLnJlbHBhdGgoZmlsZSwgc3JjX2RpcikKICAgICAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5maW5kX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpcikKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzCgogICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiJSZXR1cm4gZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBwYXR0ZXJucyA9IHNlbGYuX2dldF9wbGF0Zm9ybV9wYXR0ZXJucygKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIGdsb2JzX2V4cGFuZGVkID0gbWFwKGdsb2IsIHBhdHRlcm5zKQogICAgICAgICMgZmxhdHRlbiB0aGUgZXhwYW5kZWQgZ2xvYnMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgZ2xvYnNfbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKGdsb2JzX2V4cGFuZGVkKQogICAgICAgIGdsb2JfZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2JzX21hdGNoZXMpCiAgICAgICAgZmlsZXMgPSBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMuZ2V0KHBhY2thZ2UsIFtdKSwKICAgICAgICAgICAgZ2xvYl9maWxlcywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYuZXhjbHVkZV9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKQoKICAgIGRlZiBidWlsZF9wYWNrYWdlX2RhdGEoc2VsZik6CiAgICAgICAgIiIiQ29weSBkYXRhIGZpbGVzIGludG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgb3V0ZiwgY29waWVkID0gc2VsZi5jb3B5X2ZpbGUoc3JjZmlsZSwgdGFyZ2V0KQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguYWJzcGF0aChzcmNmaWxlKQogICAgICAgICAgICAgICAgaWYgKGNvcGllZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgc3JjZmlsZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX19kb2N0ZXN0c18ydG8zLmFwcGVuZChvdXRmKQoKICAgIGRlZiBhbmFseXplX21hbmlmZXN0KHNlbGYpOgogICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMgPSBtZiA9IHt9CiAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzcmNfZGlycyA9IHt9CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CiAgICAgICAgICAgIHNyY19kaXJzW2Fzc2VydF9yZWxhdGl2ZShzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKSldID0gcGFja2FnZQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBmb3IgcGF0aCBpbiBlaV9jbWQuZmlsZWxpc3QuZmlsZXM6CiAgICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KGFzc2VydF9yZWxhdGl2ZShwYXRoKSkKICAgICAgICAgICAgcHJldiA9IE5vbmUKICAgICAgICAgICAgb2xkZiA9IGYKICAgICAgICAgICAgd2hpbGUgZCBhbmQgZCAhPSBwcmV2IGFuZCBkIG5vdCBpbiBzcmNfZGlyczoKICAgICAgICAgICAgICAgIHByZXYgPSBkCiAgICAgICAgICAgICAgICBkLCBkZiA9IG9zLnBhdGguc3BsaXQoZCkKICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZGYsIGYpCiAgICAgICAgICAgIGlmIGQgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKSBhbmQgZiA9PSBvbGRmOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIGl0J3MgYSBtb2R1bGUsIG5vdCBkYXRhCiAgICAgICAgICAgICAgICBtZi5zZXRkZWZhdWx0KHNyY19kaXJzW2RdLCBbXSkuYXBwZW5kKHBhdGgpCgogICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHBhc3MgICMgTGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyBpbiBfZ2V0X2RhdGFfZmlsZXMoKSBmdW5jdGlvbi4KCiAgICBkZWYgY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CiAgICAgICAgIiIiQ2hlY2sgbmFtZXNwYWNlIHBhY2thZ2VzJyBfX2luaXRfXyBmb3IgZGVjbGFyZV9uYW1lc3BhY2UiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaW5pdF9weSA9IG9yaWcuYnVpbGRfcHkuY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2RpcikKICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0gPSBpbml0X3B5CgogICAgICAgIGlmIG5vdCBpbml0X3B5IG9yIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIGZvciBwa2cgaW4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICBpZiBwa2cgPT0gcGFja2FnZSBvciBwa2cuc3RhcnRzd2l0aChwYWNrYWdlICsgJy4nKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICAgICAgd2l0aCBpby5vcGVuKGluaXRfcHksICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICBpZiBiJ2RlY2xhcmVfbmFtZXNwYWNlJyBub3QgaW4gY29udGVudHM6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIHBhY2thZ2UgcHJvYmxlbTogJXMgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSwgYnV0ICIKICAgICAgICAgICAgICAgICJpdHNcbl9faW5pdF9fLnB5IGRvZXMgbm90IGNhbGwgZGVjbGFyZV9uYW1lc3BhY2UoKSEgUGxlYXNlICIKICAgICAgICAgICAgICAgICdmaXggaXQuXG4oU2VlIHRoZSBzZXR1cHRvb2xzIG1hbnVhbCB1bmRlciAnCiAgICAgICAgICAgICAgICAnIk5hbWVzcGFjZSBQYWNrYWdlcyIgZm9yIGRldGFpbHMuKVxuIicgJSAocGFja2FnZSwpCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkID0ge30KICAgICAgICBvcmlnLmJ1aWxkX3B5LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQoKICAgIGRlZiBnZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSk6CiAgICAgICAgcmVzID0gb3JpZy5idWlsZF9weS5nZXRfcGFja2FnZV9kaXIoc2VsZiwgcGFja2FnZSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpc3RyaWJ1dGlvbi5zcmNfcm9vdCwgcmVzKQogICAgICAgIHJldHVybiByZXMKCiAgICBkZWYgZXhjbHVkZV9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKToKICAgICAgICAiIiJGaWx0ZXIgZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKICAgICAgICBmaWxlcyA9IGxpc3QoZmlsZXMpCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEsCiAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgIHNyY19kaXIsCiAgICAgICAgKQogICAgICAgIG1hdGNoX2dyb3VwcyA9ICgKICAgICAgICAgICAgZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdHRlcm4pCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zCiAgICAgICAgKQogICAgICAgICMgZmxhdHRlbiB0aGUgZ3JvdXBzIG9mIG1hdGNoZXMgaW50byBhbiBpdGVyYWJsZSBvZiBtYXRjaGVzCiAgICAgICAgbWF0Y2hlcyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKG1hdGNoX2dyb3VwcykKICAgICAgICBiYWQgPSBzZXQobWF0Y2hlcykKICAgICAgICBrZWVwZXJzID0gKAogICAgICAgICAgICBmbgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXMKICAgICAgICAgICAgaWYgZm4gbm90IGluIGJhZAogICAgICAgICkKICAgICAgICAjIGRpdGNoIGR1cGVzCiAgICAgICAgcmV0dXJuIGxpc3QoX3VuaXF1ZV9ldmVyc2VlbihrZWVwZXJzKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9wbGF0Zm9ybV9wYXR0ZXJucyhzcGVjLCBwYWNrYWdlLCBzcmNfZGlyKToKICAgICAgICAiIiIKICAgICAgICB5aWVsZCBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHBhdHRlcm5zIChzdWl0YWJsZSBmb3IgZ2xvYgogICAgICAgIG9yIGZuX21hdGNoKSBmcm9tIGEgZ2xvYi1iYXNlZCBzcGVjIChzdWNoIGFzCiAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgb3Igc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSkKICAgICAgICBtYXRjaGluZyBwYWNrYWdlIGluIHNyY19kaXIuCiAgICAgICAgIiIiCiAgICAgICAgcmF3X3BhdHRlcm5zID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzcGVjLmdldCgnJywgW10pLAogICAgICAgICAgICBzcGVjLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCBjb252ZXJ0X3BhdGgocGF0dGVybikpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHJhd19wYXR0ZXJucwogICAgICAgICkKCgojIGZyb20gUHl0aG9uIGRvY3MKZGVmIF91bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgc2VlbiA9IHNldCgpCiAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiBhc3NlcnRfcmVsYXRpdmUocGF0aCk6CiAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICByZXR1cm4gcGF0aAogICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCgogICAgbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEVycm9yOiBzZXR1cCBzY3JpcHQgc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGg6CgogICAgICAgICAgICAlcwoKICAgICAgICBzZXR1cCgpIGFyZ3VtZW50cyBtdXN0ICphbHdheXMqIGJlIC8tc2VwYXJhdGVkIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQogICAgICAgIHNldHVwLnB5IGRpcmVjdG9yeSwgKm5ldmVyKiBhYnNvbHV0ZSBwYXRocy4KICAgICAgICAiIiIpLmxzdHJpcCgpICUgcGF0aAogICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihtc2cpClBLAwQUAAAAAAAAACEA0M3zPfgfAAD4HwAAQgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgZ2xvYgppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmltcG9ydCBzZXR1cHRvb2xzCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCmNsYXNzIGRldmVsb3AobmFtZXNwYWNlcy5EZXZlbG9wSW5zdGFsbGVyLCBlYXN5X2luc3RhbGwpOgogICAgIiIiU2V0IHVwIHBhY2thZ2UgZm9yIGRldmVsb3BtZW50IiIiCgogICAgZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBwYWNrYWdlIGluICdkZXZlbG9wbWVudCBtb2RlJyIKCiAgICB1c2VyX29wdGlvbnMgPSBlYXN5X2luc3RhbGwudXNlcl9vcHRpb25zICsgWwogICAgICAgICgidW5pbnN0YWxsIiwgInUiLCAiVW5pbnN0YWxsIHRoaXMgc291cmNlIHBhY2thZ2UiKSwKICAgICAgICAoImVnZy1wYXRoPSIsIE5vbmUsICJTZXQgdGhlIHBhdGggdG8gYmUgdXNlZCBpbiB0aGUgLmVnZy1saW5rIGZpbGUiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBlYXN5X2luc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWyd1bmluc3RhbGwnXQoKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UgICMgb3ZlcnJpZGUgYmFzZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi51bmluc3RhbGw6CiAgICAgICAgICAgIHNlbGYubXVsdGlfdmVyc2lvbiA9IFRydWUKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbGluaygpCiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsX25hbWVzcGFjZXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoKQogICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkX29wdGlvbnMoKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51bmluc3RhbGwgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IE5vbmUKICAgICAgICBlYXN5X2luc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5zZXR1cF9wYXRoID0gTm9uZQogICAgICAgIHNlbGYuYWx3YXlzX2NvcHlfZnJvbSA9ICcuJyAgIyBhbHdheXMgY29weSBlZ2dzIGluc3RhbGxlZCBpbiBjdXJkaXIKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBlaSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgaWYgZWkuYnJva2VuX2VnZ19pbmZvOgogICAgICAgICAgICB0ZW1wbGF0ZSA9ICJQbGVhc2UgcmVuYW1lICVyIHRvICVyIGJlZm9yZSB1c2luZyAnZGV2ZWxvcCciCiAgICAgICAgICAgIGFyZ3MgPSBlaS5lZ2dfaW5mbywgZWkuYnJva2VuX2VnZ19pbmZvCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHRlbXBsYXRlICUgYXJncykKICAgICAgICBzZWxmLmFyZ3MgPSBbZWkuZWdnX25hbWVdCgogICAgICAgIGVhc3lfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5leHBhbmRfYmFzZWRpcnMoKQogICAgICAgIHNlbGYuZXhwYW5kX2RpcnMoKQogICAgICAgICMgcGljayB1cCBzZXR1cC1kaXIgLmVnZyBmaWxlcyBvbmx5OiBubyAuZWdnLWluZm8KICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguc2NhbihnbG9iLmdsb2IoJyouZWdnJykpCgogICAgICAgIGVnZ19saW5rX2ZuID0gZWkuZWdnX25hbWUgKyAnLmVnZy1saW5rJwogICAgICAgIHNlbGYuZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgZWdnX2xpbmtfZm4pCiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IGVpLmVnZ19iYXNlCiAgICAgICAgaWYgc2VsZi5lZ2dfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmVnZ19wYXRoID0gb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19iYXNlKQoKICAgICAgICB0YXJnZXQgPSBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgZWdnX3BhdGggPSBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2VsZi5lZ2dfcGF0aCkpCiAgICAgICAgaWYgZWdnX3BhdGggIT0gdGFyZ2V0OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICItLWVnZy1wYXRoIG11c3QgYmUgYSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGluc3RhbGwiCiAgICAgICAgICAgICAgICAiIGRpcmVjdG9yeSB0byAiICsgdGFyZ2V0CiAgICAgICAgICAgICkKCiAgICAgICAgIyBNYWtlIGEgZGlzdHJpYnV0aW9uIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZQogICAgICAgIHNlbGYuZGlzdCA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUGF0aE1ldGFkYXRhKHRhcmdldCwgb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19pbmZvKSksCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1laS5lZ2dfbmFtZQogICAgICAgICkKCiAgICAgICAgc2VsZi5zZXR1cF9wYXRoID0gc2VsZi5fcmVzb2x2ZV9zZXR1cF9wYXRoKAogICAgICAgICAgICBzZWxmLmVnZ19iYXNlLAogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICBzZWxmLmVnZ19wYXRoLAogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Jlc29sdmVfc2V0dXBfcGF0aChlZ2dfYmFzZSwgaW5zdGFsbF9kaXIsIGVnZ19wYXRoKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBhIHBhdGggZnJvbSBlZ2dfYmFzZSBiYWNrIHRvICcuJyB3aGVyZSB0aGUKICAgICAgICBzZXR1cCBzY3JpcHQgcmVzaWRlcyBhbmQgZW5zdXJlIHRoYXQgcGF0aCBwb2ludHMgdG8gdGhlCiAgICAgICAgc2V0dXAgcGF0aCBmcm9tICRpbnN0YWxsX2Rpci8kZWdnX3BhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF90b19zZXR1cCA9IGVnZ19iYXNlLnJlcGxhY2Uob3Muc2VwLCAnLycpLnJzdHJpcCgnLycpCiAgICAgICAgaWYgcGF0aF90b19zZXR1cCAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIHBhdGhfdG9fc2V0dXAgPSAnLi4vJyAqIChwYXRoX3RvX3NldHVwLmNvdW50KCcvJykgKyAxKQogICAgICAgIHJlc29sdmVkID0gcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgb3MucGF0aC5qb2luKGluc3RhbGxfZGlyLCBlZ2dfcGF0aCwgcGF0aF90b19zZXR1cCkKICAgICAgICApCiAgICAgICAgaWYgcmVzb2x2ZWQgIT0gcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBjb25zaXN0ZW50IHBhdGggdG8gc2V0dXAgc2NyaXB0IGZyb20iCiAgICAgICAgICAgICAgICAiIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkiLCByZXNvbHZlZCwKICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKSkKICAgICAgICByZXR1cm4gcGF0aF90b19zZXR1cAoKICAgIGRlZiBpbnN0YWxsX2Zvcl9kZXZlbG9wbWVudChzZWxmKToKICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aChicHlfY21kLmJ1aWxkX2xpYikKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucwogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdlZ2dfaW5mbycsIGVnZ19iYXNlPWJ1aWxkX3BhdGgpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgICAgICMgRml4dXAgZWdnLWxpbmsgYW5kIGVhc3ktaW5zdGFsbC5wdGgKICAgICAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgc2VsZi5kaXN0LmxvY2F0aW9uID0gYnVpbGRfcGF0aAogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLmRpc3QuX3Byb3ZpZGVyID0gcGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICBidWlsZF9wYXRoLCBlaV9jbWQuZWdnX2luZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpICAjIGVuc3VyZSB0aGF0IHRhcmdldCBkaXIgaXMgc2l0ZS1zYWZlCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCiAgICAgICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5lZ2dfbGluaywgInciKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoICsgIlxuIiArIHNlbGYuc2V0dXBfcGF0aCkKICAgICAgICAjIHBvc3Rwcm9jZXNzIHRoZSBpbnN0YWxsZWQgZGlzdHJvLCBmaXhpbmcgdXAgLnB0aCwgaW5zdGFsbGluZyBzY3JpcHRzLAogICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cwogICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0LCBub3Qgc2VsZi5ub19kZXBzKQoKICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUgPSBvcGVuKHNlbGYuZWdnX2xpbmspCiAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZWdnX2xpbmtfZmlsZV0KICAgICAgICAgICAgZWdnX2xpbmtfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgIGlmIGNvbnRlbnRzIG5vdCBpbiAoW3NlbGYuZWdnX3BhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLmVnZ19wYXRoLCBzZWxmLnNldHVwX3BhdGhdKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICAjIFhYWCBzaG91bGQgYWxzbyBjaGVjayBmb3IgZW50cnkgcG9pbnQgc2NyaXB0cyEKICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0IGlzIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpCgogICAgICAgICMgY3JlYXRlIHdyYXBwZXIgc2NyaXB0cyBpbiB0aGUgc2NyaXB0IGRpciwgcG9pbnRpbmcgdG8gZGlzdC5zY3JpcHRzCgogICAgICAgICMgbmV3LXN0eWxlLi4uCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cyBvciBbXToKICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2NyaXB0X3BhdGgpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IHN0cm0ucmVhZCgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpCgoKY2xhc3MgVmVyc2lvbmxlc3NSZXF1aXJlbWVudDoKICAgICIiIgogICAgQWRhcHQgYSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiB0byBzaW1wbHkgcmV0dXJuIHRoZSBwcm9qZWN0CiAgICBuYW1lIGFzIHRoZSAncmVxdWlyZW1lbnQnIHNvIHRoYXQgc2NyaXB0cyB3aWxsIHdvcmsgYWNyb3NzCiAgICBtdWx0aXBsZSB2ZXJzaW9ucy4KCiAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24KICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0nZm9vJywgdmVyc2lvbj0nMS4wJykKICAgID4+PiBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2Zvbz09MS4wJwogICAgPj4+IGFkYXB0ZWRfZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgID4+PiBzdHIoYWRhcHRlZF9kaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vJwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgogICAgICAgIHNlbGYuX19kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGlzdCwgbmFtZSkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvamVjdF9uYW1lClBLAwQUAAAAAAAAACEA/+j2kcADAADAAwAARAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5IiIiCkNyZWF0ZSBhIGRpc3RfaW5mbyBkaXJlY3RvcnkKQXMgZGVmaW5lZCBpbiB0aGUgd2hlZWwgc3BlY2lmaWNhdGlvbgoiIiIKCmltcG9ydCBvcwoKZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgoKY2xhc3MgZGlzdF9pbmZvKENvbW1hbmQpOgoKICAgIGRlc2NyaXB0aW9uID0gJ2NyZWF0ZSBhIC5kaXN0LWluZm8gZGlyZWN0b3J5JwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWdnX2luZm8gPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVnZ19pbmZvLmVnZ19iYXNlID0gc2VsZi5lZ2dfYmFzZQogICAgICAgIGVnZ19pbmZvLmZpbmFsaXplX29wdGlvbnMoKQogICAgICAgIGVnZ19pbmZvLnJ1bigpCiAgICAgICAgZGlzdF9pbmZvX2RpciA9IGVnZ19pbmZvLmVnZ19pbmZvWzotbGVuKCcuZWdnLWluZm8nKV0gKyAnLmRpc3QtaW5mbycKICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgJ3t9JyIuZm9ybWF0KG9zLnBhdGguYWJzcGF0aChkaXN0X2luZm9fZGlyKSkpCgogICAgICAgIGJkaXN0X3doZWVsID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0X3doZWVsJykKICAgICAgICBiZGlzdF93aGVlbC5lZ2cyZGlzdChlZ2dfaW5mby5lZ2dfaW5mbywgZGlzdF9pbmZvX2RpcikKUEsDBBQAAAAAAAAAIQBWY5pF+FUBAPhVAQBHAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkjIS91c3IvYmluL2VudiBweXRob24KIiIiCkVhc3kgSW5zdGFsbAotLS0tLS0tLS0tLS0KCkEgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgpwYWNrYWdlcy4gIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIGFjY29tcGFueWluZyBFYXN5SW5zdGFsbC50eHQKZmlsZSwgb3IgdmlzaXQgdGhlIGBFYXN5SW5zdGFsbCBob21lIHBhZ2VgX18uCgpfXyBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sCgoiIiIKCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoLCBzdWJzdF92YXJzCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzQXJnRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yLAogICAgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBJTlNUQUxMX1NDSEVNRVMsIFNDSEVNRV9LRVlTCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cyBpbXBvcnQgZmlyc3RfbGluZV9yZQpmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHJlCmltcG9ydCBzdGF0CmltcG9ydCByYW5kb20KaW1wb3J0IHRleHR3cmFwCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc2l0ZQppbXBvcnQgc3RydWN0CmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzaGxleAppbXBvcnQgaW8KCgpmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzLCBnZXRfcGF0aAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlciwgbWFwCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IHJ1bl9zZXR1cApmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgcm10cmVlX3NhZmUKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IHNldG9wdApmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQpmcm9tIHNldHVwdG9vbHMucGFja2FnZV9pbmRleCBpbXBvcnQgKAogICAgUGFja2FnZUluZGV4LCBwYXJzZV9yZXF1aXJlbWVudF9hcmcsIFVSTF9TQ0hFTUUsCikKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZywgZWdnX2luZm8KZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbApmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIHlpZWxkX2xpbmVzLCBub3JtYWxpemVfcGF0aCwgcmVzb3VyY2Vfc3RyaW5nLCBlbnN1cmVfZGlyZWN0b3J5LAogICAgZ2V0X2Rpc3RyaWJ1dGlvbiwgZmluZF9kaXN0cmlidXRpb25zLCBFbnZpcm9ubWVudCwgUmVxdWlyZW1lbnQsCiAgICBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgRWdnTWV0YWRhdGEsIFdvcmtpbmdTZXQsIERpc3RyaWJ1dGlvbk5vdEZvdW5kLAogICAgVmVyc2lvbkNvbmZsaWN0LCBERVZFTE9QX0RJU1QsCikKaW1wb3J0IHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdAoKX19tZXRhY2xhc3NfXyA9IHR5cGUKCiMgVHVybiBvbiBQRVA0NDBXYXJuaW5ncwp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZGVmYXVsdCIsIGNhdGVnb3J5PXBrZ19yZXNvdXJjZXMuUEVQNDQwV2FybmluZykKCl9fYWxsX18gPSBbCiAgICAnc2FtZWZpbGUnLCAnZWFzeV9pbnN0YWxsJywgJ1B0aERpc3RyaWJ1dGlvbnMnLCAnZXh0cmFjdF93aW5pbnN0X2NmZycsCiAgICAnbWFpbicsICdnZXRfZXhlX3ByZWZpeGVzJywKXQoKCmRlZiBpc182NGJpdCgpOgogICAgcmV0dXJuIHN0cnVjdC5jYWxjc2l6ZSgiUCIpID09IDgKCgpkZWYgc2FtZWZpbGUocDEsIHAyKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIHR3byBwYXRocyByZWZlcmVuY2UgdGhlIHNhbWUgZmlsZS4KCiAgICBBdWdtZW50cyBvcy5wYXRoLnNhbWVmaWxlIHRvIHdvcmsgb24gV2luZG93cyBhbmQKICAgIHN1cHByZXNzZXMgZXJyb3JzIGlmIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QuCiAgICAiIiIKICAgIGJvdGhfZXhpc3QgPSBvcy5wYXRoLmV4aXN0cyhwMSkgYW5kIG9zLnBhdGguZXhpc3RzKHAyKQogICAgdXNlX3NhbWVmaWxlID0gaGFzYXR0cihvcy5wYXRoLCAnc2FtZWZpbGUnKSBhbmQgYm90aF9leGlzdAogICAgaWYgdXNlX3NhbWVmaWxlOgogICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKHAxLCBwMikKICAgIG5vcm1fcDEgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDEpKQogICAgbm9ybV9wMiA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5ub3JtY2FzZShwMikpCiAgICByZXR1cm4gbm9ybV9wMSA9PSBub3JtX3AyCgoKaWYgc2l4LlBZMjoKCiAgICBkZWYgX3RvX2J5dGVzKHMpOgogICAgICAgIHJldHVybiBzCgogICAgZGVmIGlzYXNjaWkocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaXgudGV4dF90eXBlKHMsICdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCmVsc2U6CgogICAgZGVmIF90b19ieXRlcyhzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0ZjgnKQoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgpfb25lX2xpbmVyID0gbGFtYmRhIHRleHQ6IHRleHR3cmFwLmRlZGVudCh0ZXh0KS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJzsgJykKCgpjbGFzcyBlYXN5X2luc3RhbGwoQ29tbWFuZCk6CiAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKICAgIGRlc2NyaXB0aW9uID0gIkZpbmQvZ2V0L2luc3RhbGwgUHl0aG9uIHBhY2thZ2VzIgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncHJlZml4PScsIE5vbmUsICJpbnN0YWxsYXRpb24gcHJlZml4IiksCiAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCiAgICAgICAgKCJtdWx0aS12ZXJzaW9uIiwgIm0iLCAibWFrZSBhcHBzIGhhdmUgdG8gcmVxdWlyZSgpIGEgdmVyc2lvbiIpLAogICAgICAgICgidXBncmFkZSIsICJVIiwgImZvcmNlIHVwZ3JhZGUgKHNlYXJjaGVzIFB5UEkgZm9yIGxhdGVzdCB2ZXJzaW9ucykiKSwKICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKICAgICAgICAoInNjcmlwdC1kaXI9IiwgInMiLCAiaW5zdGFsbCBzY3JpcHRzIHRvIERJUiIpLAogICAgICAgICgiZXhjbHVkZS1zY3JpcHRzIiwgIngiLCAiRG9uJ3QgaW5zdGFsbCBzY3JpcHRzIiksCiAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAogICAgICAgICgiaW5kZXgtdXJsPSIsICJpIiwgImJhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IiksCiAgICAgICAgKCJmaW5kLWxpbmtzPSIsICJmIiwgImFkZGl0aW9uYWwgVVJMKHMpIHRvIHNlYXJjaCBmb3IgcGFja2FnZXMiKSwKICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCiAgICAgICAgICJkb3dubG9hZC9leHRyYWN0L2J1aWxkIGluIERJUjsga2VlcCB0aGUgcmVzdWx0cyIpLAogICAgICAgICgnb3B0aW1pemU9JywgJ08nLAogICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAogICAgICAgICgncmVjb3JkPScsIE5vbmUsCiAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKICAgICAgICAoJ2Fsd2F5cy11bnppcCcsICdaJywgImRvbid0IGluc3RhbGwgYXMgYSB6aXBmaWxlLCBubyBtYXR0ZXIgd2hhdCIpLAogICAgICAgICgnc2l0ZS1kaXJzPScsICdTJywgImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCiAgICAgICAgKCdlZGl0YWJsZScsICdlJywgIkluc3RhbGwgc3BlY2lmaWVkIHBhY2thZ2VzIGluIGVkaXRhYmxlIGZvcm0iKSwKICAgICAgICAoJ25vLWRlcHMnLCAnTicsICJkb24ndCBpbnN0YWxsIGRlcGVuZGVuY2llcyIpLAogICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCiAgICAgICAgKCdsb2NhbC1zbmFwc2hvdHMtb2snLCAnbCcsCiAgICAgICAgICJhbGxvdyBidWlsZGluZyBlZ2dzIGZyb20gbG9jYWwgY2hlY2tvdXRzIiksCiAgICAgICAgKCd2ZXJzaW9uJywgTm9uZSwgInByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiKSwKICAgICAgICAoJ25vLWZpbmQtbGlua3MnLCBOb25lLAogICAgICAgICAiRG9uJ3QgbG9hZCBmaW5kLWxpbmtzIGRlZmluZWQgaW4gcGFja2FnZXMgYmVpbmcgaW5zdGFsbGVkIikKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAnemlwLW9rJywgJ211bHRpLXZlcnNpb24nLCAnZXhjbHVkZS1zY3JpcHRzJywgJ3VwZ3JhZGUnLCAnYWx3YXlzLWNvcHknLAogICAgICAgICdlZGl0YWJsZScsCiAgICAgICAgJ25vLWRlcHMnLCAnbG9jYWwtc25hcHNob3RzLW9rJywgJ3ZlcnNpb24nCiAgICBdCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIGhlbHBfbXNnID0gImluc3RhbGwgaW4gdXNlciBzaXRlLXBhY2thZ2UgJyVzJyIgJSBzaXRlLlVTRVJfU0lURQogICAgICAgIHVzZXJfb3B0aW9ucy5hcHBlbmQoKCd1c2VyJywgTm9uZSwgaGVscF9tc2cpKQogICAgICAgIGJvb2xlYW5fb3B0aW9ucy5hcHBlbmQoJ3VzZXInKQoKICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9CiAgICBjcmVhdGVfaW5kZXggPSBQYWNrYWdlSW5kZXgKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICMgdGhlIC0tdXNlciBvcHRpb24gc2VlbXMgdG8gYmUgYW4gb3B0LWluIG9uZSwKICAgICAgICAjIHNvIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBGYWxzZS4KICAgICAgICBzZWxmLnVzZXIgPSAwCiAgICAgICAgc2VsZi56aXBfb2sgPSBzZWxmLmxvY2FsX3NuYXBzaG90c19vayA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBOb25lCiAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gTm9uZQogICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLm9wdGltaXplID0gc2VsZi5yZWNvcmQgPSBOb25lCiAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVkaXRhYmxlID0gc2VsZi5ub19kZXBzID0gc2VsZi5hbGxvd19ob3N0cyA9IE5vbmUKICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLnByZWZpeCA9IHNlbGYubm9fcmVwb3J0ID0gTm9uZQogICAgICAgIHNlbGYudmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcHVyZWxpYiA9IE5vbmUgICMgZm9yIHB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGxpYiA9IE5vbmUgICMgbm9uLXB1cmUgKGRpc3RzIHcvIGV4dGVuc2lvbnMpCiAgICAgICAgc2VsZi5pbnN0YWxsX2hlYWRlcnMgPSBOb25lICAjIGZvciBDL0MrKyBoZWFkZXJzCiAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IE5vbmUgICMgc2V0IHRvIGVpdGhlciBwdXJlbGliIG9yIHBsYXRsaWIKICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBOb25lCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcmJhc2UgPSBzaXRlLlVTRVJfQkFTRQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBzaXRlLlVTRVJfU0lURQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJzaXRlID0gTm9uZQogICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IE5vbmUKCiAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gTm9uZQogICAgICAgIHNlbGYucHRoX2ZpbGUgPSBzZWxmLmFsd2F5c19jb3B5X2Zyb20gPSBOb25lCiAgICAgICAgc2VsZi5zaXRlX2RpcnMgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IEZhbHNlCiAgICAgICAgIyBBbHdheXMgcmVhZCBlYXN5X2luc3RhbGwgb3B0aW9ucywgZXZlbiBpZiB3ZSBhcmUgc3ViY2xhc3NlZCwgb3IgaGF2ZQogICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKICAgICAgICAjIGFsd2F5cyBjb21lIGZyb20gdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZShzKScgImVhc3lfaW5zdGFsbCIKICAgICAgICAjIHNlY3Rpb24sIGV2ZW4gaWYgdGhpcyBpcyBhICJkZXZlbG9wIiBvciAiaW5zdGFsbCIgY29tbWFuZCwgb3Igc29tZQogICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgogICAgICAgIHNlbGYuX2RyeV9ydW4gPSBOb25lCiAgICAgICAgc2VsZi52ZXJib3NlID0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAogICAgICAgICAgICBzZWxmLCBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICAgICAgKQoKICAgIGRlZiBkZWxldGVfYmxvY2tlcnMoc2VsZiwgYmxvY2tlcnMpOgogICAgICAgIGV4dGFudF9ibG9ja2VycyA9ICgKICAgICAgICAgICAgZmlsZW5hbWUgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBvciBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSkKICAgICAgICApCiAgICAgICAgbGlzdChtYXAoc2VsZi5fZGVsZXRlX3BhdGgsIGV4dGFudF9ibG9ja2VycykpCgogICAgZGVmIF9kZWxldGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBwYXRoKQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlzX3RyZWUgPSBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCkKICAgICAgICByZW1vdmVyID0gcm10cmVlIGlmIGlzX3RyZWUgZWxzZSBvcy51bmxpbmsKICAgICAgICByZW1vdmVyKHBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXJfdmVyc2lvbigpOgogICAgICAgICIiIgogICAgICAgIFJlbmRlciB0aGUgU2V0dXB0b29scyB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gZGV0YWlscywgdGhlbiBleGl0LgogICAgICAgICIiIgogICAgICAgIHZlciA9ICd7fS57fScuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKQogICAgICAgIGRpc3QgPSBnZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykKICAgICAgICB0bXBsID0gJ3NldHVwdG9vbHMge2Rpc3QudmVyc2lvbn0gZnJvbSB7ZGlzdC5sb2NhdGlvbn0gKFB5dGhvbiB7dmVyfSknCiAgICAgICAgcHJpbnQodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCgpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi52ZXJzaW9uIGFuZCBzZWxmLl9yZW5kZXJfdmVyc2lvbigpCgogICAgICAgIHB5X3ZlcnNpb24gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCiAgICAgICAgcHJlZml4LCBleGVjX3ByZWZpeCA9IGdldF9jb25maWdfdmFycygncHJlZml4JywgJ2V4ZWNfcHJlZml4JykKCiAgICAgICAgc2VsZi5jb25maWdfdmFycyA9IHsKICAgICAgICAgICAgJ2Rpc3RfbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCksCiAgICAgICAgICAgICdkaXN0X3ZlcnNpb24nOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAogICAgICAgICAgICAnZGlzdF9mdWxsbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAogICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCiAgICAgICAgICAgICdweV92ZXJzaW9uX3Nob3J0JzogcHlfdmVyc2lvblswOjNdLAogICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6IHB5X3ZlcnNpb25bMF0gKyBweV92ZXJzaW9uWzJdLAogICAgICAgICAgICAnc3lzX3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAnZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKICAgICAgICAgICAgIyBPbmx5IHB5dGhvbiAzLjIrIGhhcyBhYmlmbGFncwogICAgICAgICAgICAnYWJpZmxhZ3MnOiBnZXRhdHRyKHN5cywgJ2FiaWZsYWdzJywgJycpLAogICAgICAgIH0KCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmNvbmZpZ192YXJzWyd1c2VyYmFzZSddID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJzaXRlJ10gPSBzZWxmLmluc3RhbGxfdXNlcnNpdGUKCiAgICAgICAgc2VsZi5fZml4X2luc3RhbGxfZGlyX2Zvcl91c2VyX3NpdGUoKQoKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCgogICAgICAgIHNlbGYuX2V4cGFuZCgKICAgICAgICAgICAgJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInLCAnYnVpbGRfZGlyZWN0b3J5JywKICAgICAgICAgICAgJ3NpdGVfZGlycycsCiAgICAgICAgKQogICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCiAgICAgICAgIyBzY3JpcHQgZGlyZWN0b3J5IHRvIG1hdGNoIGl0LgogICAgICAgIGlmIHNlbGYuc2NyaXB0X2RpciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCgogICAgICAgIGlmIHNlbGYubm9fZmluZF9saW5rcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm5vX2ZpbmRfbGlua3MgPSBGYWxzZQoKICAgICAgICAjIExldCBpbnN0YWxsX2RpciBnZXQgc2V0IGJ5IGluc3RhbGxfbGliIGNvbW1hbmQsIHdoaWNoIGluIHR1cm4KICAgICAgICAjIGdldHMgaXRzIGluZm8gZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kLCBhbmQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9saWInLCAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykKICAgICAgICApCiAgICAgICAgIyBMaWtld2lzZSwgc2V0IGRlZmF1bHQgc2NyaXB0X2RpciBmcm9tICdpbnN0YWxsX3NjcmlwdHMuaW5zdGFsbF9kaXInCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLCAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi51c2VyIGFuZCBzZWxmLmluc3RhbGxfcHVyZWxpYjoKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IHNlbGYuaW5zdGFsbF9wdXJlbGliCiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9zY3JpcHRzCiAgICAgICAgIyBkZWZhdWx0IC0tcmVjb3JkIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZAogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywgKCdyZWNvcmQnLCAncmVjb3JkJykpCiAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byB0aGUgaWYgc3RhdGVtZW50IGJlbG93PyBJdCdzIG5vdCB1c2VkCiAgICAgICAgIyBlbHNld2hlcmUKICAgICAgICBub3JtcGF0aCA9IG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpCiAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzID0gZ2V0X3NpdGVfZGlycygpCiAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNpdGVfZGlycyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcihzLnN0cmlwKCkpIGZvciBzIGluCiAgICAgICAgICAgICAgICBzZWxmLnNpdGVfZGlycy5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzIChpbiAtLXNpdGUtZGlycykgZG9lcyBub3QgZXhpc3QiLCBkKQogICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIGQgKyAiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBzZWxmLmluZGV4X3VybCBvciAiaHR0cHM6Ly9weXBpLm9yZy9zaW1wbGUvIgogICAgICAgIHNlbGYuc2hhZG93X3BhdGggPSBzZWxmLmFsbF9zaXRlX2RpcnNbOl0KICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHNlbGYuaW5zdGFsbF9kaXIsIG5vcm1hbGl6ZV9wYXRoKHNlbGYuc2NyaXB0X2Rpcik6CiAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguaW5zZXJ0KDAsIHBhdGhfaXRlbSkKCiAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaG9zdHMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNlbGYuYWxsb3dfaG9zdHMuc3BsaXQoJywnKV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0cyA9IFsnKiddCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IHNlbGYuY3JlYXRlX2luZGV4KAogICAgICAgICAgICAgICAgc2VsZi5pbmRleF91cmwsIHNlYXJjaF9wYXRoPXNlbGYuc2hhZG93X3BhdGgsIGhvc3RzPWhvc3RzLAogICAgICAgICAgICApCiAgICAgICAgc2VsZi5sb2NhbF9pbmRleCA9IEVudmlyb25tZW50KHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKCiAgICAgICAgaWYgc2VsZi5maW5kX2xpbmtzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBzZWxmLmZpbmRfbGlua3Muc3BsaXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCiAgICAgICAgaWYgc2VsZi5sb2NhbF9zbmFwc2hvdHNfb2s6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuX2VnZ19saW5rcyhzZWxmLnNoYWRvd19wYXRoICsgc3lzLnBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYubm9fZmluZF9saW5rczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCAoJ29wdGltaXplJywgJ29wdGltaXplJykpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5vcHRpbWl6ZSwgaW50KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IGludChzZWxmLm9wdGltaXplKQogICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCgogICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgYnVpbGQgZGlyZWN0b3J5ICgtYikgd2hlbiB1c2luZyAtLWVkaXRhYmxlIgogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCgogICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCgogICAgZGVmIF9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaXggdGhlIGluc3RhbGxfZGlyIGlmICItLXVzZXIiIHdhcyB1c2VkLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLnVzZXIgb3Igbm90IHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuY3JlYXRlX2hvbWVfcGF0aCgpCiAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3VzZXJiYXNlIGlzIE5vbmU6CiAgICAgICAgICAgIG1zZyA9ICJVc2VyIGJhc2UgZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQiCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgc2NoZW1lX25hbWUgPSBvcy5uYW1lLnJlcGxhY2UoJ3Bvc2l4JywgJ3VuaXgnKSArICdfdXNlcicKICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUoc2NoZW1lX25hbWUpCgogICAgZGVmIF9leHBhbmRfYXR0cnMoc2VsZiwgYXR0cnMpOgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBzZWxmLmNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgZGVmIGV4cGFuZF9iYXNlZGlycyhzZWxmKToKICAgICAgICAiIiJDYWxscyBgb3MucGF0aC5leHBhbmR1c2VyYCBvbiBpbnN0YWxsX2Jhc2UsIGluc3RhbGxfcGxhdGJhc2UgYW5kCiAgICAgICAgcm9vdC4iIiIKICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoWydpbnN0YWxsX2Jhc2UnLCAnaW5zdGFsbF9wbGF0YmFzZScsICdyb290J10pCgogICAgZGVmIGV4cGFuZF9kaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGwgZGlycy4iIiIKICAgICAgICBkaXJzID0gWwogICAgICAgICAgICAnaW5zdGFsbF9wdXJlbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfcGxhdGxpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2hlYWRlcnMnLAogICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywKICAgICAgICAgICAgJ2luc3RhbGxfZGF0YScsCiAgICAgICAgXQogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhkaXJzKQoKICAgIGRlZiBydW4oc2VsZiwgc2hvd19kZXByZWNhdGlvbj1UcnVlKToKICAgICAgICBpZiBzaG93X2RlcHJlY2F0aW9uOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKAogICAgICAgICAgICAgICAgIldBUk5JTkc6IFRoZSBlYXN5X2luc3RhbGwgY29tbWFuZCBpcyBkZXByZWNhdGVkICIKICAgICAgICAgICAgICAgICJhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIgogICAgICAgICAgICAgICAgLCBsb2cuV0FSTiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHNlbGYudmVyYm9zZSAhPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlOgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLmFyZ3M6CiAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzcGVjLCBub3Qgc2VsZi5ub19kZXBzKQogICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIG91dHB1dHMgPSBzZWxmLm91dHB1dHMKICAgICAgICAgICAgICAgIGlmIHNlbGYucm9vdDogICMgc3RyaXAgYW55IHBhY2thZ2UgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgcm9vdF9sZW4gPSBsZW4oc2VsZi5yb290KQogICAgICAgICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIHJhbmdlKGxlbihvdXRwdXRzKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbY291bnRlcl0gPSBvdXRwdXRzW2NvdW50ZXJdW3Jvb3RfbGVuOl0KICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBmaWxlX3V0aWwKCiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCiAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgdG8gJyVzJyIgJQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkX29wdGlvbnMoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UpCgogICAgZGVmIHBzZXVkb190ZW1wbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8tdGVtcG5hbWUgYmFzZSBpbiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCiAgICAgICAgVGhpcyBjb2RlIGlzIGludGVudGlvbmFsbHkgbmFpdmU7IGlmIGEgbWFsaWNpb3VzIHBhcnR5IGNhbiB3cml0ZSB0bwogICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHlvdSdyZSBhbHJlYWR5IGluIGRlZXAgZG9vZG9vLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwaWQgPSByYW5kb20ucmFuZGludCgwLCBzeXMubWF4c2l6ZSkKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJ0ZXN0LWVhc3ktaW5zdGFsbC0lcyIgJSBwaWQpCgogICAgZGVmIHdhcm5fZGVwcmVjYXRlZF9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgY2hlY2tfc2l0ZV9kaXIoc2VsZik6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgc2VsZi5pbnN0YWxsX2RpciBpcyAucHRoLWNhcGFibGUgZGlyLCBpZiBuZWVkZWQiIiIKCiAgICAgICAgaW5zdGRpciA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgcHRoX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5zdGRpciwgJ2Vhc3ktaW5zdGFsbC5wdGgnKQoKICAgICAgICAjIElzIGl0IGEgY29uZmlndXJlZCwgUFlUSE9OUEFUSCwgaW1wbGljaXQsIG9yIGV4cGxpY2l0IHNpdGUgZGlyPwogICAgICAgIGlzX3NpdGVfZGlyID0gaW5zdGRpciBpbiBzZWxmLmFsbF9zaXRlX2RpcnMKCiAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyIGFuZCBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICAjIE5vPyAgVGhlbiBkaXJlY3RseSB0ZXN0IHdoZXRoZXIgaXQgZG9lcyAucHRoIGZpbGUgcHJvY2Vzc2luZwogICAgICAgICAgICBpc19zaXRlX2RpciA9IHNlbGYuY2hlY2tfcHRoX3Byb2Nlc3NpbmcoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiB3cml0ZSB0byB0YXJnZXQgZGlyCiAgICAgICAgICAgIHRlc3RmaWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSArICcud3JpdGUtdGVzdCcKICAgICAgICAgICAgdGVzdF9leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyh0ZXN0ZmlsZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgdGVzdF9leGlzdHM6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQogICAgICAgICAgICAgICAgb3Blbih0ZXN0ZmlsZSwgJ3cnKS5jbG9zZSgpCiAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdGZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKCiAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyIGFuZCBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICAjIENhbid0IGluc3RhbGwgbm9uLW11bHRpIHRvIG5vbi1zaXRlIGRpcgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzZWxmLm5vX2RlZmF1bHRfdmVyc2lvbl9tc2coKSkKCiAgICAgICAgaWYgaXNfc2l0ZV9kaXI6CiAgICAgICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBQdGhEaXN0cmlidXRpb25zKHB0aF9maWxlLCBzZWxmLmFsbF9zaXRlX2RpcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUKCiAgICAgICAgaWYgaW5zdGRpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLCBfcHl0aG9ucGF0aCgpKToKICAgICAgICAgICAgIyBvbmx5IFBZVEhPTlBBVEggZGlycyBuZWVkIGEgc2l0ZS5weSwgc28gcHJldGVuZCBpdCdzIHRoZXJlCiAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKICAgICAgICBlbGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKToKICAgICAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZSAgIyBkb24ndCBuZWVkIHNpdGUucHkgaW4gdGhpcyBjYXNlCiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lICAjIGFuZCBkb24ndCBjcmVhdGUgYSAucHRoIGZpbGUKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gaW5zdGRpcgoKICAgIF9fY2FudF93cml0ZV9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgY2FuJ3QgY3JlYXRlIG9yIHJlbW92ZSBmaWxlcyBpbiBpbnN0YWxsIGRpcmVjdG9yeQoKICAgICAgICBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBhZGQgb3IgcmVtb3ZlIGZpbGVzIGluIHRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk6CgogICAgICAgICAgICAlcwoKICAgICAgICBUaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCiAgICAgICAgdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKCiAgICAgICAgICAgICVzCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9fbm90X2V4aXN0c19pZCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBUaGlzIGRpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuICBQbGVhc2UgY3JlYXRlIGl0IGFuZCB0cnkgYWdhaW4sIG9yCiAgICAgICAgY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKHVzaW5nIHRoZSAtZCBvciAtLWluc3RhbGwtZGlyCiAgICAgICAgb3B0aW9uKS4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19hY2Nlc3NfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgSWYgdGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBhIHN5c3RlbS1vd25lZCBkaXJlY3RvcnksIHlvdSBtYXkgbmVlZCB0byBzaWduIGluCiAgICAgICAgYXMgdGhlIGFkbWluaXN0cmF0b3Igb3IgInJvb3QiIGFjY291bnQuICBJZiB5b3UgZG8gbm90IGhhdmUgYWRtaW5pc3RyYXRpdmUKICAgICAgICBhY2Nlc3MgdG8gdGhpcyBtYWNoaW5lLCB5b3UgbWF5IHdpc2ggdG8gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbgogICAgICAgIGRpcmVjdG9yeSwgcHJlZmVyYWJseSBvbmUgdGhhdCBpcyBsaXN0ZWQgaW4geW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgdmFyaWFibGUuCgogICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiBvdGhlciBvcHRpb25zLCB5b3UgbWF5IHdpc2ggdG8gY29uc3VsdCB0aGUKICAgICAgICBkb2N1bWVudGF0aW9uIGF0OgoKICAgICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwKCiAgICAgICAgUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBjYW50X3dyaXRlX3RvX3RhcmdldChzZWxmKToKICAgICAgICBtc2cgPSBzZWxmLl9fY2FudF93cml0ZV9tc2cgJSAoc3lzLmV4Y19pbmZvKClbMV0sIHNlbGYuaW5zdGFsbF9kaXIsKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsX2Rpcik6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX25vdF9leGlzdHNfaWQKICAgICAgICBlbHNlOgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19hY2Nlc3NfbXNnCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQoKICAgIGRlZiBjaGVja19wdGhfcHJvY2Vzc2luZyhzZWxmKToKICAgICAgICAiIiJFbXBpcmljYWxseSB2ZXJpZnkgd2hldGhlciAucHRoIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gaW5zdC4gZGlyIiIiCiAgICAgICAgaW5zdGRpciA9IHNlbGYuaW5zdGFsbF9kaXIKICAgICAgICBsb2cuaW5mbygiQ2hlY2tpbmcgLnB0aCBmaWxlIHN1cHBvcnQgaW4gJXMiLCBpbnN0ZGlyKQogICAgICAgIHB0aF9maWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSArICIucHRoIgogICAgICAgIG9rX2ZpbGUgPSBwdGhfZmlsZSArICcub2snCiAgICAgICAgb2tfZXhpc3RzID0gb3MucGF0aC5leGlzdHMob2tfZmlsZSkKICAgICAgICB0bXBsID0gX29uZV9saW5lcigiIiIKICAgICAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgICAgIGYgPSBvcGVuKHtva19maWxlIXJ9LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoJ09LJykKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICIiIikgKyAnXG4nCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBva19leGlzdHM6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsob2tfZmlsZSkKICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShva19maWxlKQogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQubWFrZWRpcnMoZGlybmFtZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgZiA9IG9wZW4ocHRoX2ZpbGUsICd3JykKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLndyaXRlKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBmID0gTm9uZQogICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGV4ZWN1dGFibGUpCiAgICAgICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdweXRob253LmV4ZScpCiAgICAgICAgICAgICAgICAgICAgdXNlX2FsdCA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUubG93ZXIoKSA9PSAncHl0aG9uLmV4ZScgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKGFsdCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgdXNlX2FsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgcHl0aG9udy5leGUgdG8gYXZvaWQgb3BlbmluZyBhIGNvbnNvbGUgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBhbHQKCiAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KCiAgICAgICAgICAgICAgICBzcGF3bihbZXhlY3V0YWJsZSwgJy1FJywgJy1jJywgJ3Bhc3MnXSwgMCkKCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKToKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEOiAlcyBhcHBlYXJzIHRvIHN1cHBvcnQgLnB0aCBmaWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RkaXIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob2tfZmlsZSkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHRoX2ZpbGUpCiAgICAgICAgaWYgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgbG9nLndhcm4oIlRFU1QgRkFJTEVEOiAlcyBkb2VzIE5PVCBzdXBwb3J0IC5wdGggZmlsZXMiLCBpbnN0ZGlyKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgICIiIldyaXRlIGFsbCB0aGUgc2NyaXB0cyBmb3IgYGRpc3RgLCB1bmxlc3Mgc2NyaXB0cyBhcmUgZXhjbHVkZWQiIiIKICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3NjcmlwdHMgYW5kIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cy8nICsgc2NyaXB0X25hbWUpOgogICAgICAgICAgICAgICAgICAgICMgVGhlICJzY3JpcHQiIGlzIGEgZGlyZWN0b3J5LCBsaWtlbHkgYSBQeXRob24gMwogICAgICAgICAgICAgICAgICAgICMgX19weWNhY2hlX18gZGlyZWN0b3J5LCBzbyBza2lwIGl0LgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgIGRpc3QsIHNjcmlwdF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhKCdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCgogICAgZGVmIGFkZF9vdXRwdXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQocGF0aCkKCiAgICBkZWYgbm90X2VkaXRhYmxlKHNlbGYsIHNwZWMpOgogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgJXI6IHlvdSBjYW4ndCB1c2UgZmlsZW5hbWVzIG9yIFVSTHMgIgogICAgICAgICAgICAgICAgIndpdGggLS1lZGl0YWJsZSAoZXhjZXB0IHZpYSB0aGUgLS1maW5kLWxpbmtzIG9wdGlvbikuIgogICAgICAgICAgICAgICAgJSAoc3BlYywpCiAgICAgICAgICAgICkKCiAgICBkZWYgY2hlY2tfZWRpdGFibGUoc2VsZiwgc3BlYyk6CiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBjYW4ndCBkbyBhIGNoZWNrb3V0IHRoZXJlIiAlCiAgICAgICAgICAgICAgICAoc3BlYy5rZXksIHNlbGYuYnVpbGRfZGlyZWN0b3J5KQogICAgICAgICAgICApCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBfdG1wZGlyKHNlbGYpOgogICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PXUiZWFzeV9pbnN0YWxsLSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGNhc3QgdG8gc3RyIGFzIHdvcmthcm91bmQgZm9yICM3MDkgYW5kICM3MTAgYW5kICM3MTIKICAgICAgICAgICAgeWllbGQgc3RyKHRtcGRpcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyh0bXBkaXIpIGFuZCBybXRyZWUocm10cmVlX3NhZmUodG1wZGlyKSkKCiAgICBkZWYgZWFzeV9pbnN0YWxsKHNlbGYsIHNwZWMsIGRlcHM9RmFsc2UpOgogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpCgogICAgICAgIHdpdGggc2VsZi5fdG1wZGlyKCkgYXMgdG1wZGlyOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgICAgICBpZiBVUkxfU0NIRU1FKHNwZWMpOgogICAgICAgICAgICAgICAgICAgICMgSXQncyBhIHVybCwgZG93bmxvYWQgaXQgdG8gdG1wZGlyIGFuZCBwcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgICAgICAgICBkbCA9IHNlbGYucGFja2FnZV9pbmRleC5kb3dubG9hZChzcGVjLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKE5vbmUsIGRsLCB0bXBkaXIsIGRlcHMsIFRydWUpCgogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKICAgICAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHByb2Nlc3MgaXQgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBzcGVjLCB0bXBkaXIsIGRlcHMsIFRydWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKCiAgICAgICAgICAgIHNlbGYuY2hlY2tfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgZGlzdCA9IHNlbGYucGFja2FnZV9pbmRleC5mZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBzcGVjLCB0bXBkaXIsIHNlbGYudXBncmFkZSwgc2VsZi5lZGl0YWJsZSwKICAgICAgICAgICAgICAgIG5vdCBzZWxmLmFsd2F5c19jb3B5LCBzZWxmLmxvY2FsX2luZGV4CiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgbXNnID0gIkNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbiBmb3IgJXIiICUgc3BlYwogICAgICAgICAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIiAoLS1hbHdheXMtY29weSBza2lwcyBzeXN0ZW0gYW5kIGRldmVsb3BtZW50IGVnZ3MpIgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQogICAgICAgICAgICBlbGlmIGRpc3QucHJlY2VkZW5jZSA9PSBERVZFTE9QX0RJU1Q6CiAgICAgICAgICAgICAgICAjIC5lZ2ctaW5mbyBkaXN0cyBkb24ndCBuZWVkIGluc3RhbGxpbmcsIGp1c3QgcHJvY2VzcyBkZXBzCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMsICJVc2luZyIpCiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKHNwZWMsIGRpc3QubG9jYXRpb24sIHRtcGRpciwgZGVwcykKCiAgICBkZWYgaW5zdGFsbF9pdGVtKHNlbGYsIHNwZWMsIGRvd25sb2FkLCB0bXBkaXIsIGRlcHMsIGluc3RhbGxfbmVlZGVkPUZhbHNlKToKCiAgICAgICAgIyBJbnN0YWxsYXRpb24gaXMgYWxzbyBuZWVkZWQgaWYgZmlsZSBpbiB0bXBkaXIgb3IgaXMgbm90IGFuIGVnZwogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igc2VsZi5hbHdheXNfY29weQogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igb3MucGF0aC5kaXJuYW1lKGRvd25sb2FkKSA9PSB0bXBkaXIKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG5vdCBkb3dubG9hZC5lbmRzd2l0aCgnLmVnZycpCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciAoCiAgICAgICAgICAgIHNlbGYuYWx3YXlzX2NvcHlfZnJvbSBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG5vcm1hbGl6ZV9wYXRoKGRvd25sb2FkKSkgPT0KICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgoc2VsZi5hbHdheXNfY29weV9mcm9tKQogICAgICAgICkKCiAgICAgICAgaWYgc3BlYyBhbmQgbm90IGluc3RhbGxfbmVlZGVkOgogICAgICAgICAgICAjIGF0IHRoaXMgcG9pbnQsIHdlIGtub3cgaXQncyBhIGxvY2FsIC5lZ2csIHdlIGp1c3QgZG9uJ3Qga25vdyBpZgogICAgICAgICAgICAjIGl0J3MgYWxyZWFkeSBpbnN0YWxsZWQuCiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYubG9jYWxfaW5kZXhbc3BlYy5wcm9qZWN0X25hbWVdOgogICAgICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiA9PSBkb3dubG9hZDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBUcnVlICAjIGl0J3Mgbm90IGluIHRoZSBsb2NhbCBpbmRleAoKICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyAlcyIsIG9zLnBhdGguYmFzZW5hbWUoZG93bmxvYWQpKQoKICAgICAgICBpZiBpbnN0YWxsX25lZWRlZDoKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLmluc3RhbGxfZWdncyhzcGVjLCBkb3dubG9hZCwgdG1wZGlyKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdCwgZGVwcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IFtzZWxmLmVnZ19kaXN0cmlidXRpb24oZG93bmxvYWQpXQogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3RzWzBdLCBkZXBzLCAiVXNpbmciKQoKICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGlmIGRpc3QgaW4gc3BlYzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBzZWxlY3Rfc2NoZW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlNldHMgdGhlIGluc3RhbGwgZGlyZWN0b3JpZXMgYnkgYXBwbHlpbmcgdGhlIGluc3RhbGwgc2NoZW1lcy4iIiIKICAgICAgICAjIGl0J3MgdGhlIGNhbGxlcidzIHByb2JsZW0gaWYgdGhleSBzdXBwbHkgYSBiYWQgbmFtZSEKICAgICAgICBzY2hlbWUgPSBJTlNUQUxMX1NDSEVNRVNbbmFtZV0KICAgICAgICBmb3Iga2V5IGluIFNDSEVNRV9LRVlTOgogICAgICAgICAgICBhdHRybmFtZSA9ICdpbnN0YWxsXycgKyBrZXkKICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRybmFtZSkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0cm5hbWUsIHNjaGVtZVtrZXldKQoKICAgIGRlZiBwcm9jZXNzX2Rpc3RyaWJ1dGlvbihzZWxmLCByZXF1aXJlbWVudCwgZGlzdCwgZGVwcz1UcnVlLCAqaW5mbyk6CiAgICAgICAgc2VsZi51cGRhdGVfcHRoKGRpc3QpCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZChkaXN0KQogICAgICAgIGlmIGRpc3QgaW4gc2VsZi5sb2NhbF9pbmRleFtkaXN0LmtleV06CiAgICAgICAgICAgIHNlbGYubG9jYWxfaW5kZXgucmVtb3ZlKGRpc3QpCiAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5hZGQoZGlzdCkKICAgICAgICBzZWxmLmluc3RhbGxfZWdnX3NjcmlwdHMoZGlzdCkKICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0c1tkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgbG9nLmluZm8oc2VsZi5pbnN0YWxsYXRpb25fcmVwb3J0KHJlcXVpcmVtZW50LCBkaXN0LCAqaW5mbykpCiAgICAgICAgaWYgKGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpIGFuZAogICAgICAgICAgICAgICAgbm90IHNlbGYubm9fZmluZF9saW5rcyk6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGRfZmluZF9saW5rcygKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgICAgICBpZiBub3QgZGVwcyBhbmQgbm90IHNlbGYuYWx3YXlzX2NvcHk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgbm90IE5vbmUgYW5kIGRpc3Qua2V5ICE9IHJlcXVpcmVtZW50LmtleToKICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCBkaXN0KQogICAgICAgICAgICByZXR1cm4gICMgWFhYIHRoaXMgaXMgbm90IHRoZSBkaXN0cmlidXRpb24gd2Ugd2VyZSBsb29raW5nIGZvcgogICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgTm9uZSBvciBkaXN0IG5vdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgIyBpZiB3ZSB3b3VuZCB1cCB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24sIHJlc29sdmUgd2hhdCB3ZSd2ZSBnb3QKICAgICAgICAgICAgZGlzdHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgICAgICAgICByZXF1aXJlbWVudCA9IFJlcXVpcmVtZW50KHN0cihkaXN0cmVxKSkKICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkaXN0cm9zID0gV29ya2luZ1NldChbXSkucmVzb2x2ZSgKICAgICAgICAgICAgICAgIFtyZXF1aXJlbWVudF0sIHNlbGYubG9jYWxfaW5kZXgsIHNlbGYuZWFzeV9pbnN0YWxsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQgYXMgZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3RyKGUpKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3QgYXMgZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoZS5yZXBvcnQoKSkKICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5IG9yIHNlbGYuYWx3YXlzX2NvcHlfZnJvbToKICAgICAgICAgICAgIyBGb3JjZSBhbGwgdGhlIHJlbGV2YW50IGRpc3Ryb3MgdG8gYmUgY29waWVkIG9yIGFjdGl2YXRlZAogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0cm9zOgogICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBsb2cuaW5mbygiRmluaXNoZWQgcHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgcmVxdWlyZW1lbnQpCgogICAgZGVmIHNob3VsZF91bnppcChzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLnppcF9vayBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnppcF9vawogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdub3QtemlwLXNhZmUnKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBpZiBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ3ppcC1zYWZlJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIG1heWJlX21vdmUoc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3QpOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGJ1aWxkIGRpcmVjdG9yeSAlcyB3aWxsIG5vdCBiZSBrZXB0IgogICAgICAgICAgICApCiAgICAgICAgICAgIGxvZy53YXJuKG1zZywgc3BlYy5rZXksIHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzZXR1cF9iYXNlKQogICAgICAgICAgICByZXR1cm4gc2V0dXBfYmFzZQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGRpc3RfZmlsZW5hbWUpID09IHNldHVwX2Jhc2U6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGlzdF9maWxlbmFtZSkgICMgZ2V0IGl0IG91dCBvZiB0aGUgdG1wIGRpcgogICAgICAgICAgICBjb250ZW50cyA9IG9zLmxpc3RkaXIoc2V0dXBfYmFzZSkKICAgICAgICAgICAgaWYgbGVuKGNvbnRlbnRzKSA9PSAxOgogICAgICAgICAgICAgICAgZGlzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCBjb250ZW50c1swXSkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgb25seSB0aGluZyB0aGVyZSBpcyBhIGRpcmVjdG9yeSwgbW92ZSBpdCBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRzdCkKICAgICAgICBzaHV0aWwubW92ZShzZXR1cF9iYXNlLCBkc3QpCiAgICAgICAgcmV0dXJuIGRzdAoKICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc2NyaXB0czoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGFyZ3MgaW4gU2NyaXB0V3JpdGVyLmJlc3QoKS5nZXRfYXJncyhkaXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCgogICAgZGVmIGluc3RhbGxfc2NyaXB0KHNlbGYsIGRpc3QsIHNjcmlwdF9uYW1lLCBzY3JpcHRfdGV4dCwgZGV2X3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiR2VuZXJhdGUgYSBsZWdhY3kgc2NyaXB0IHdyYXBwZXIgYW5kIGluc3RhbGwgaXQiIiIKICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBpc19zY3JpcHQgPSBpc19weXRob25fc2NyaXB0KHNjcmlwdF90ZXh0LCBzY3JpcHRfbmFtZSkKCiAgICAgICAgaWYgaXNfc2NyaXB0OgogICAgICAgICAgICBib2R5ID0gc2VsZi5fbG9hZF90ZW1wbGF0ZShkZXZfcGF0aCkgJSBsb2NhbHMoKQogICAgICAgICAgICBzY3JpcHRfdGV4dCA9IFNjcmlwdFdyaXRlci5nZXRfaGVhZGVyKHNjcmlwdF90ZXh0KSArIGJvZHkKICAgICAgICBzZWxmLndyaXRlX3NjcmlwdChzY3JpcHRfbmFtZSwgX3RvX2J5dGVzKHNjcmlwdF90ZXh0KSwgJ2InKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9hZF90ZW1wbGF0ZShkZXZfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHRlbXBsYXRlIHNjcmlwdHMgaW4gdGhlIHBhY2thZ2UuIFRoaXMKICAgICAgICBmdW5jdGlvbiBsb2FkcyBvbmUgb2YgdGhlbSBhbmQgcHJlcGFyZXMgaXQgZm9yIHVzZS4KICAgICAgICAiIiIKICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xMzQgZm9yIGluZm8KICAgICAgICAjIG9uIHNjcmlwdCBmaWxlIG5hbWluZyBhbmQgZG93bnN0cmVhbSBpc3N1ZXMgd2l0aCBTVlI0CiAgICAgICAgbmFtZSA9ICdzY3JpcHQudG1wbCcKICAgICAgICBpZiBkZXZfcGF0aDoKICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLnRtcGwnLCAnIChkZXYpLnRtcGwnKQoKICAgICAgICByYXdfYnl0ZXMgPSByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBuYW1lKQogICAgICAgIHJldHVybiByYXdfYnl0ZXMuZGVjb2RlKCd1dGYtOCcpCgogICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCBibG9ja2Vycz0oKSk6CiAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgogICAgICAgIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKCAgIyBjbGVhbiB1cCBvbGQgLnB5Ly5weXcgdy9vIGEgc2NyaXB0CiAgICAgICAgICAgIFtvcy5wYXRoLmpvaW4oc2VsZi5zY3JpcHRfZGlyLCB4KSBmb3IgeCBpbiBibG9ja2Vyc10KICAgICAgICApCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMgc2NyaXB0IHRvICVzIiwgc2NyaXB0X25hbWUsIHNlbGYuc2NyaXB0X2RpcikKICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5zY3JpcHRfZGlyLCBzY3JpcHRfbmFtZSkKICAgICAgICBzZWxmLmFkZF9vdXRwdXQodGFyZ2V0KQoKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBtYXNrID0gY3VycmVudF91bWFzaygpCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKICAgICAgICAgICAgb3MudW5saW5rKHRhcmdldCkKICAgICAgICB3aXRoIG9wZW4odGFyZ2V0LCAidyIgKyBtb2RlKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQoKICAgIGRlZiBpbnN0YWxsX2VnZ3Moc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIC5lZ2cgZGlycyBvciBmaWxlcyBhcmUgYWxyZWFkeSBidWlsdCwgc28ganVzdCByZXR1cm4gdGhlbQogICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9lZ2coZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KICAgICAgICBlbGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF93aGVlbChkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQoKICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAogICAgICAgIHNldHVwX2Jhc2UgPSB0bXBkaXIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShkaXN0X2ZpbGVuYW1lKSBhbmQgbm90IGRpc3RfZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQogICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQoKICAgICAgICBpZiAoc2V0dXBfYmFzZS5zdGFydHN3aXRoKHRtcGRpcikgICMgc29tZXRoaW5nIHdlIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgIGFuZCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSBhbmQgc3BlYyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBzZWxmLm1heWJlX21vdmUoc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSkKCiAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCiAgICAgICAgc2V0dXBfc2NyaXB0ID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICdzZXR1cC5weScpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgogICAgICAgICAgICBzZXR1cHMgPSBnbG9iKG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnKicsICdzZXR1cC5weScpKQogICAgICAgICAgICBpZiBub3Qgc2V0dXBzOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSBzZXR1cCBzY3JpcHQgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgbGVuKHNldHVwcykgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIHNldHVwIHNjcmlwdHMgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCgogICAgICAgICMgTm93IHJ1biBpdCwgYW5kIHJldHVybiB0aGUgcmVzdWx0CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgbG9nLmluZm8oc2VsZi5yZXBvcnRfZWRpdGFibGUoc3BlYywgc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfYW5kX2luc3RhbGwoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKQoKICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUdHLUlORk8nKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCiAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICBkZWYgaW5zdGFsbF9lZ2coc2VsZiwgZWdnX3BhdGgsIHRtcGRpcik6CiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQoKICAgICAgICBkaXN0ID0gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGVnZ19wYXRoKQogICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKGRlc3RpbmF0aW9uLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rLAogICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHl0cmVlLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5zaG91bGRfdW56aXAoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNlbGYudW5wYWNrX2FuZF9jb21waWxlLCAiRXh0cmFjdGluZyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpc3RfaXNfemlwcGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwuY29weTIsICJDb3B5aW5nIgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiksCiAgICAgICAgICAgICAgICAgICAgKG0gKyAiICVzIHRvICVzIikgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcygKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPW5ld19kaXN0X2lzX3ppcHBlZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQoKICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgogICAgICAgICMgU2VlIGlmIGl0J3MgdmFsaWQsIGdldCBkYXRhCiAgICAgICAgY2ZnID0gZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKQogICAgICAgIGlmIGNmZyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSB2YWxpZCBkaXN0dXRpbHMgV2luZG93cyAuZXhlIiAlIGRpc3RfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZGlzdHJpYnV0aW9uIG9iamVjdCB1bnRpbCB3ZSBidWlsZCB0aGUgcmVhbCBkaXN0cm8KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBOb25lLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9Y2ZnLmdldCgnbWV0YWRhdGEnLCAnbmFtZScpLAogICAgICAgICAgICB2ZXJzaW9uPWNmZy5nZXQoJ21ldGFkYXRhJywgJ3ZlcnNpb24nKSwgcGxhdGZvcm09Z2V0X3BsYXRmb3JtKCksCiAgICAgICAgKQoKICAgICAgICAjIENvbnZlcnQgdGhlIC5leGUgdG8gYW4gdW5wYWNrZWQgZWdnCiAgICAgICAgZWdnX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBkaXN0LmVnZ19uYW1lKCkgKyAnLmVnZycpCiAgICAgICAgZGlzdC5sb2NhdGlvbiA9IGVnZ19wYXRoCiAgICAgICAgZWdnX3RtcCA9IGVnZ19wYXRoICsgJy50bXAnCiAgICAgICAgX2VnZ19pbmZvID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycpCiAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihfZWdnX2luZm8sICdQS0ctSU5GTycpCiAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgIyBtYWtlIHN1cmUgRUdHLUlORk8gZGlyIGV4aXN0cwogICAgICAgIGRpc3QuX3Byb3ZpZGVyID0gUGF0aE1ldGFkYXRhKGVnZ190bXAsIF9lZ2dfaW5mbykgICMgWFhYCiAgICAgICAgc2VsZi5leGVfdG9fZWdnKGRpc3RfZmlsZW5hbWUsIGVnZ190bXApCgogICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGtnX2luZik6CiAgICAgICAgICAgIGYgPSBvcGVuKHBrZ19pbmYsICd3JykKICAgICAgICAgICAgZi53cml0ZSgnTWV0YWRhdGEtVmVyc2lvbjogMS4wXG4nKQogICAgICAgICAgICBmb3IgaywgdiBpbiBjZmcuaXRlbXMoJ21ldGFkYXRhJyk6CiAgICAgICAgICAgICAgICBpZiBrICE9ICd0YXJnZXRfdmVyc2lvbic6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnJXM6ICVzXG4nICUgKGsucmVwbGFjZSgnXycsICctJykudGl0bGUoKSwgdikpCiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgIyBkZWxldGUgZW50cnktcG9pbnQgc2NyaXB0cyB0byBhdm9pZCBkdXBpbmcKICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyhbCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCBhcmdzWzBdKQogICAgICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuZ2V0X2FyZ3MoZGlzdCkKICAgICAgICBdKQogICAgICAgICMgQnVpbGQgLmVnZyBmaWxlIGZyb20gdG1wZGlyCiAgICAgICAgYmRpc3RfZWdnLm1ha2VfemlwZmlsZSgKICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICApCiAgICAgICAgIyBpbnN0YWxsIHRoZSAuZWdnCiAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9lZ2coZWdnX3BhdGgsIHRtcGRpcikKCiAgICBkZWYgZXhlX3RvX2VnZyhzZWxmLCBkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKToKICAgICAgICAiIiJFeHRyYWN0IGEgYmRpc3Rfd2luaW5zdCB0byB0aGUgZGlyZWN0b3JpZXMgYW4gZWdnIHdvdWxkIHVzZSIiIgogICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKICAgICAgICBwcmVmaXhlcyA9IGdldF9leGVfcHJlZml4ZXMoZGlzdF9maWxlbmFtZSkKICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICBuYXRpdmVfbGlicyA9IFtdCiAgICAgICAgdG9wX2xldmVsID0ge30KCiAgICAgICAgZGVmIHByb2Nlc3Moc3JjLCBkc3QpOgogICAgICAgICAgICBzID0gc3JjLmxvd2VyKCkKICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHByZWZpeGVzOgogICAgICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKG9sZCk6CiAgICAgICAgICAgICAgICAgICAgc3JjID0gbmV3ICsgc3JjW2xlbihvbGQpOl0KICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNyYy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGwuZW5kc3dpdGgoJy5weWQnKSBvciBkbC5lbmRzd2l0aCgnLmRsbCcpOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2xpYnMuYXBwZW5kKHNyYykKICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkICE9ICdTQ1JJUFRTLyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHN0CiAgICAgICAgICAgIGlmIG5vdCBzcmMuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCiAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgZWdnX3RtcCwgcHJvY2VzcykKICAgICAgICBzdHVicyA9IFtdCiAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKICAgICAgICAgICAgaWYgcmVzLmxvd2VyKCkuZW5kc3dpdGgoJy5weWQnKTogICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKICAgICAgICAgICAgICAgIHBhcnRzID0gcmVzLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgIHJlc291cmNlID0gcGFydHNbLTFdCiAgICAgICAgICAgICAgICBwYXJ0c1stMV0gPSBiZGlzdF9lZ2cuc3RyaXBfbW9kdWxlKHBhcnRzWy0xXSkgKyAnLnB5JwogICAgICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKGVnZ190bXAsICpwYXJ0cykKICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgICAgIHN0dWJzLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKQogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpICAjIGNvbXBpbGUgLnB5J3MKICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKSwKICAgICAgICAgICAgYmRpc3RfZWdnLmFuYWx5emVfZWdnKGVnZ190bXAsIHN0dWJzKSkgICMgd3JpdGUgemlwLXNhZmV0eSBmbGFnCgogICAgICAgIGZvciBuYW1lIGluICd0b3BfbGV2ZWwnLCAnbmF0aXZlX2xpYnMnOgogICAgICAgICAgICBpZiBsb2NhbHMoKVtuYW1lXToKICAgICAgICAgICAgICAgIHR4dCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nLCBuYW1lICsgJy50eHQnKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHR4dCk6CiAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odHh0LCAndycpCiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obG9jYWxzKClbbmFtZV0pICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgaW5zdGFsbF93aGVlbChzZWxmLCB3aGVlbF9wYXRoLCB0bXBkaXIpOgogICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWxfcGF0aCkKICAgICAgICBhc3NlcnQgd2hlZWwuaXNfY29tcGF0aWJsZSgpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgd2hlZWwuZWdnX25hbWUoKSkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGVzdGluYXRpb24pIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZGVzdGluYXRpb24pOgogICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgIlJlbW92aW5nICIgKyBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgd2hlZWwuaW5zdGFsbF9hc19lZ2csCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICgiSW5zdGFsbGluZyAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUod2hlZWxfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHVwZGF0ZV9kaXN0X2NhY2hlcyhkZXN0aW5hdGlvbiwgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1GYWxzZSkKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBfX212X3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiwgYmVmb3JlIHlvdSBjYW4KICAgICAgICBpbXBvcnQgbW9kdWxlcyBmcm9tIHRoaXMgcGFja2FnZSBpbiBhbiBhcHBsaWNhdGlvbiwgeW91IHdpbGwgbmVlZCB0bwogICAgICAgICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbCBzaW1pbGFyIHRvIG9uZSBvZgogICAgICAgIHRoZXNlIGV4YW1wbGVzLCBpbiBvcmRlciB0byBzZWxlY3QgdGhlIGRlc2lyZWQgdmVyc2lvbjoKCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXMiKSAgIyBsYXRlc3QgaW5zdGFsbGVkIHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz09JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIGV4YWN0IHZlcnNpb24KICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9faWRfd2FybmluZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCiAgICAgICAgdGhpcyB0byB3b3JrLiAgKGUuZy4gYnkgYmVpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc2NyaXB0IGRpcmVjdG9yeSwgYnkgYmVpbmcgb24KICAgICAgICBQWVRIT05QQVRILCBvciBieSBiZWluZyBhZGRlZCB0byBzeXMucGF0aCBieSB5b3VyIGNvZGUuKQogICAgICAgICIiIikKCiAgICBkZWYgaW5zdGFsbGF0aW9uX3JlcG9ydChzZWxmLCByZXEsIGRpc3QsIHdoYXQ9Ikluc3RhbGxlZCIpOgogICAgICAgICIiIkhlbHBmdWwgaW5zdGFsbGF0aW9uIG1lc3NhZ2UgZm9yIGRpc3BsYXkgdG8gcGFja2FnZSB1c2VycyIiIgogICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgogICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IHNlbGYubm9fcmVwb3J0OgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19tdl93YXJuaW5nCiAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpOgogICAgICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9faWRfd2FybmluZwoKICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCiAgICAgICAgbmFtZSA9IGRpc3QucHJvamVjdF9uYW1lCiAgICAgICAgdmVyc2lvbiA9IGRpc3QudmVyc2lvbgogICAgICAgIGV4dHJhcyA9ICcnICAjIFRPRE86IHNlbGYucmVwb3J0X2V4dHJhcyhyZXEsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCgogICAgX19lZGl0YWJsZV9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgRXh0cmFjdGVkIGVkaXRhYmxlIHZlcnNpb24gb2YgJShzcGVjKXMgdG8gJShkaXJuYW1lKXMKCiAgICAgICAgSWYgaXQgdXNlcyBzZXR1cHRvb2xzIGluIGl0cyBzZXR1cCBzY3JpcHQsIHlvdSBjYW4gYWN0aXZhdGUgaXQgaW4KICAgICAgICAiZGV2ZWxvcG1lbnQiIG1vZGUgYnkgZ29pbmcgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmc6OgoKICAgICAgICAgICAgJShweXRob24pcyBzZXR1cC5weSBkZXZlbG9wCgogICAgICAgIFNlZSB0aGUgc2V0dXB0b29scyBkb2N1bWVudGF0aW9uIGZvciB0aGUgImRldmVsb3AiIGNvbW1hbmQgZm9yIG1vcmUgaW5mby4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIHJlcG9ydF9lZGl0YWJsZShzZWxmLCBzcGVjLCBzZXR1cF9zY3JpcHQpOgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQogICAgICAgIHB5dGhvbiA9IHN5cy5leGVjdXRhYmxlCiAgICAgICAgcmV0dXJuICdcbicgKyBzZWxmLl9fZWRpdGFibGVfbXNnICUgbG9jYWxzKCkKCiAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncyk6CiAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZWdnJywgYmRpc3RfZWdnKQogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCgogICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMjoKICAgICAgICAgICAgdiA9ICd2JyAqIChzZWxmLnZlcmJvc2UgLSAxKQogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLScgKyB2KQogICAgICAgIGVsaWYgc2VsZi52ZXJib3NlIDwgMjoKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy1xJykKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctbicpCiAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICJSdW5uaW5nICVzICVzIiwgc2V0dXBfc2NyaXB0W2xlbihzZXR1cF9iYXNlKSArIDE6XSwgJyAnLmpvaW4oYXJncykKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQoKICAgIGRlZiBidWlsZF9hbmRfaW5zdGFsbChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UpOgogICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KCiAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAogICAgICAgICAgICBwcmVmaXg9J2VnZy1kaXN0LXRtcC0nLCBkaXI9b3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9zZXRfZmV0Y2hlcl9vcHRpb25zKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQogICAgICAgICAgICBhcmdzLmFwcGVuZChkaXN0X2RpcikKCiAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncykKICAgICAgICAgICAgYWxsX2VnZ3MgPSBFbnZpcm9ubWVudChbZGlzdF9kaXJdKQogICAgICAgICAgICBlZ2dzID0gW10KICAgICAgICAgICAgZm9yIGtleSBpbiBhbGxfZWdnczoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGFsbF9lZ2dzW2tleV06CiAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKICAgICAgICAgICAgaWYgbm90IGVnZ3MgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBsb2cud2FybigiTm8gZWdncyBmb3VuZCBpbiAlcyAoc2V0dXAgc2NyaXB0IHByb2JsZW0/KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2RpcikKICAgICAgICAgICAgcmV0dXJuIGVnZ3MKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUoZGlzdF9kaXIpCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICMgcmVzdG9yZSBvdXIgbG9nIHZlcmJvc2l0eQoKICAgIGRlZiBfc2V0X2ZldGNoZXJfb3B0aW9ucyhzZWxmLCBiYXNlKToKICAgICAgICAiIiIKICAgICAgICBXaGVuIGVhc3lfaW5zdGFsbCBpcyBhYm91dCB0byBydW4gYmRpc3RfZWdnIG9uIGEgc291cmNlIGRpc3QsIHRoYXQKICAgICAgICBzb3VyY2UgZGlzdCBtaWdodCBoYXZlICdzZXR1cF9yZXF1aXJlcycgZGlyZWN0aXZlcywgcmVxdWlyaW5nCiAgICAgICAgYWRkaXRpb25hbCBmZXRjaGluZy4gRW5zdXJlIHRoZSBmZXRjaGVyIG9wdGlvbnMgZ2l2ZW4gdG8gZWFzeV9pbnN0YWxsCiAgICAgICAgYXJlIGF2YWlsYWJsZSB0byB0aGF0IGNvbW1hbmQgYXMgd2VsbC4KICAgICAgICAiIiIKICAgICAgICAjIGZpbmQgdGhlIGZldGNoIG9wdGlvbnMgZnJvbSBlYXN5X2luc3RhbGwgYW5kIHdyaXRlIHRoZW0gb3V0CiAgICAgICAgIyB0byB0aGUgc2V0dXAuY2ZnIGZpbGUuCiAgICAgICAgZWlfb3B0cyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykuY29weSgpCiAgICAgICAgZmV0Y2hfZGlyZWN0aXZlcyA9ICgKICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsICdvcHRpbWl6ZScsICdhbGxvd19ob3N0cycsCiAgICAgICAgKQogICAgICAgIGZldGNoX29wdGlvbnMgPSB7fQogICAgICAgIGZvciBrZXksIHZhbCBpbiBlaV9vcHRzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gZmV0Y2hfZGlyZWN0aXZlczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZldGNoX29wdGlvbnNba2V5LnJlcGxhY2UoJ18nLCAnLScpXSA9IHZhbFsxXQogICAgICAgICMgY3JlYXRlIGEgc2V0dGluZ3MgZGljdGlvbmFyeSBzdWl0YWJsZSBmb3IgYGVkaXRfY29uZmlnYAogICAgICAgIHNldHRpbmdzID0gZGljdChlYXN5X2luc3RhbGw9ZmV0Y2hfb3B0aW9ucykKICAgICAgICBjZmdfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSwgJ3NldHVwLmNmZycpCiAgICAgICAgc2V0b3B0LmVkaXRfY29uZmlnKGNmZ19maWxlbmFtZSwgc2V0dGluZ3MpCgogICAgZGVmIHVwZGF0ZV9wdGgoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZm9yIGQgaW4gc2VsZi5wdGhfZmlsZVtkaXN0LmtleV06ICAjIGRyb3Agb2xkIGVudHJpZXMKICAgICAgICAgICAgaWYgc2VsZi5tdWx0aV92ZXJzaW9uIG9yIGQubG9jYXRpb24gIT0gZGlzdC5sb2NhdGlvbjoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyBmcm9tIGVhc3ktaW5zdGFsbC5wdGggZmlsZSIsIGQpCiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLnJlbW92ZShkKQogICAgICAgICAgICAgICAgaWYgZC5sb2NhdGlvbiBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGgucmVtb3ZlKGQubG9jYXRpb24pCgogICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wdGhfZmlsZS5wYXRoczoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBhbHJlYWR5IHRoZSBhY3RpdmUgdmVyc2lvbiBpbiBlYXN5LWluc3RhbGwucHRoIiwKICAgICAgICAgICAgICAgICAgICBkaXN0LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIkFkZGluZyAlcyB0byBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkaXN0KQogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5hZGQoZGlzdCkgICMgYWRkIG5ldyBlbnRyeQogICAgICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmFwcGVuZChkaXN0LmxvY2F0aW9uKQoKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgoKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5zYXZlKCkKCiAgICAgICAgICAgIGlmIGRpc3Qua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgc2V0dXB0b29scyBpdHNlbGYgbmV2ZXIgYmVjb21lcyB1bmF2YWlsYWJsZSEKICAgICAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGNoZWNrIGZvciBsYXRlc3QgdmVyc2lvbj8KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICdzZXR1cHRvb2xzLnB0aCcpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3dCcpCiAgICAgICAgICAgICAgICBmLndyaXRlKHNlbGYucHRoX2ZpbGUubWFrZV9yZWxhdGl2ZShkaXN0LmxvY2F0aW9uKSArICdcbicpCiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgdW5wYWNrX3Byb2dyZXNzKHNlbGYsIHNyYywgZHN0KToKICAgICAgICAjIFByb2dyZXNzIGZpbHRlciBmb3IgdW5wYWNraW5nCiAgICAgICAgbG9nLmRlYnVnKCJVbnBhY2tpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKICAgICAgICByZXR1cm4gZHN0ICAjIG9ubHkgdW5wYWNrLWFuZC1jb21waWxlIHNraXBzIGZpbGVzIGZvciBkcnkgcnVuCgogICAgZGVmIHVucGFja19hbmRfY29tcGlsZShzZWxmLCBlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIHRvX2NobW9kID0gW10KCiAgICAgICAgZGVmIHBmKHNyYywgZHN0KToKICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKCcucHknKSBhbmQgbm90IHNyYy5zdGFydHN3aXRoKCdFR0ctSU5GTy8nKToKICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKICAgICAgICAgICAgZWxpZiBkc3QuZW5kc3dpdGgoJy5kbGwnKSBvciBkc3QuZW5kc3dpdGgoJy5zbycpOgogICAgICAgICAgICAgICAgdG9fY2htb2QuYXBwZW5kKGRzdCkKICAgICAgICAgICAgc2VsZi51bnBhY2tfcHJvZ3Jlc3Moc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi5kcnlfcnVuIGFuZCBkc3Qgb3IgTm9uZQoKICAgICAgICB1bnBhY2tfYXJjaGl2ZShlZ2dfcGF0aCwgZGVzdGluYXRpb24sIHBmKQogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZm9yIGYgaW4gdG9fY2htb2Q6CiAgICAgICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KGYpW3N0YXQuU1RfTU9ERV0pIHwgMG81NTUpICYgMG83NzU1CiAgICAgICAgICAgICAgICBjaG1vZChmLCBtb2RlKQoKICAgIGRlZiBieXRlX2NvbXBpbGUoc2VsZiwgdG9fY29tcGlsZSk6CiAgICAgICAgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHRyeSB0byBtYWtlIHRoZSBieXRlIGNvbXBpbGUgbWVzc2FnZXMgcXVpZXRlcgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UgLSAxKQoKICAgICAgICAgICAgYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUsIG9wdGltaXplPTAsIGZvcmNlPTEsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplOgogICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKAogICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUsIG9wdGltaXplPXNlbGYub3B0aW1pemUsIGZvcmNlPTEsCiAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCiAgICAgICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAgIyByZXN0b3JlIG9yaWdpbmFsIHZlcmJvc2l0eQoKICAgIF9fbm9fZGVmYXVsdF9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgYmFkIGluc3RhbGwgZGlyZWN0b3J5IG9yIFBZVEhPTlBBVEgKCiAgICAgICAgWW91IGFyZSBhdHRlbXB0aW5nIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90CiAgICAgICAgb24gUFlUSE9OUEFUSCBhbmQgd2hpY2ggUHl0aG9uIGRvZXMgbm90IHJlYWQgIi5wdGgiIGZpbGVzIGZyb20uICBUaGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKICAgICAgICB0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgoKICAgICAgICAgICAgJXMKCiAgICAgICAgYW5kIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjdXJyZW50bHkgY29udGFpbnM6CgogICAgICAgICAgICAlcgoKICAgICAgICBIZXJlIGFyZSBzb21lIG9mIHlvdXIgb3B0aW9ucyBmb3IgY29ycmVjdGluZyB0aGUgcHJvYmxlbToKCiAgICAgICAgKiBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBpLmUuLCBvbmUgdGhhdCBpcwogICAgICAgICAgb24gUFlUSE9OUEFUSCBvciBzdXBwb3J0cyAucHRoIGZpbGVzCgogICAgICAgICogWW91IGNhbiBhZGQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICAgIHZhcmlhYmxlLiAgKEl0IG11c3QgdGhlbiBhbHNvIGJlIG9uIFBZVEhPTlBBVEggd2hlbmV2ZXIgeW91IHJ1bgogICAgICAgICAgUHl0aG9uIGFuZCB3YW50IHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlIGluc3RhbGxpbmcuKQoKICAgICAgICAqIFlvdSBjYW4gc2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHN1cHBvcnQgIi5wdGgiIGZpbGVzIGJ5CiAgICAgICAgICB1c2luZyBvbmUgb2YgdGhlIGFwcHJvYWNoZXMgZGVzY3JpYmVkIGhlcmU6CgogICAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbCNjdXN0b20taW5zdGFsbGF0aW9uLWxvY2F0aW9ucwoKCiAgICAgICAgUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBub19kZWZhdWx0X3ZlcnNpb25fbXNnKHNlbGYpOgogICAgICAgIHRlbXBsYXRlID0gc2VsZi5fX25vX2RlZmF1bHRfbXNnCiAgICAgICAgcmV0dXJuIHRlbXBsYXRlICUgKHNlbGYuaW5zdGFsbF9kaXIsIG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpKQoKICAgIGRlZiBpbnN0YWxsX3NpdGVfcHkoc2VsZik6CiAgICAgICAgIiIiTWFrZSBzdXJlIHRoZXJlJ3MgYSBzaXRlLnB5IGluIHRoZSB0YXJnZXQgZGlyLCBpZiBuZWVkZWQiIiIKCiAgICAgICAgaWYgc2VsZi5zaXRlcHlfaW5zdGFsbGVkOgogICAgICAgICAgICByZXR1cm4gICMgYWxyZWFkeSBkaWQgaXQsIG9yIGRvbid0IG5lZWQgdG8KCiAgICAgICAgc2l0ZXB5ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJzaXRlLnB5IikKICAgICAgICBzb3VyY2UgPSByZXNvdXJjZV9zdHJpbmcoInNldHVwdG9vbHMiLCAic2l0ZS1wYXRjaC5weSIpCiAgICAgICAgc291cmNlID0gc291cmNlLmRlY29kZSgndXRmLTgnKQogICAgICAgIGN1cnJlbnQgPSAiIgoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaXRlcHkpOgogICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGV4aXN0aW5nIHNpdGUucHkgaW4gJXMiLCBzZWxmLmluc3RhbGxfZGlyKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2l0ZXB5KSBhcyBzdHJtOgogICAgICAgICAgICAgICAgY3VycmVudCA9IHN0cm0ucmVhZCgpCgogICAgICAgICAgICBpZiBub3QgY3VycmVudC5zdGFydHN3aXRoKCdkZWYgX19ib290KCk6Jyk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc2V0dXB0b29scy1nZW5lcmF0ZWQgc2l0ZS5weTsgcGxlYXNlIgogICAgICAgICAgICAgICAgICAgICIgcmVtb3ZlIGl0LiIgJSBzaXRlcHkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgaWYgY3VycmVudCAhPSBzb3VyY2U6CiAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyIsIHNpdGVweSkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3Rvcnkoc2l0ZXB5KQogICAgICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNpdGVweSwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBzdHJtOgogICAgICAgICAgICAgICAgICAgIHN0cm0ud3JpdGUoc291cmNlKQogICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShbc2l0ZXB5XSkKCiAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZQoKICAgIGRlZiBjcmVhdGVfaG9tZV9wYXRoKHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSBkaXJlY3RvcmllcyB1bmRlciB+LiIiIgogICAgICAgIGlmIG5vdCBzZWxmLnVzZXI6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGhvbWUgPSBjb252ZXJ0X3BhdGgob3MucGF0aC5leHBhbmR1c2VyKCJ+IikpCiAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gc2l4Lml0ZXJpdGVtcyhzZWxmLmNvbmZpZ192YXJzKToKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGhvbWUpIGFuZCBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIm9zLm1ha2VkaXJzKCclcycsIDBvNzAwKSIgJSBwYXRoKQogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCwgMG83MDApCgogICAgSU5TVEFMTF9TQ0hFTUVTID0gZGljdCgKICAgICAgICBwb3NpeD1kaWN0KAogICAgICAgICAgICBpbnN0YWxsX2Rpcj0nJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAogICAgICAgICAgICBzY3JpcHRfZGlyPSckYmFzZS9iaW4nLAogICAgICAgICksCiAgICApCgogICAgREVGQVVMVF9TQ0hFTUUgPSBkaWN0KAogICAgICAgIGluc3RhbGxfZGlyPSckYmFzZS9MaWIvc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgc2NyaXB0X2Rpcj0nJGJhc2UvU2NyaXB0cycsCiAgICApCgogICAgZGVmIF9leHBhbmQoc2VsZiwgKmF0dHJzKToKICAgICAgICBjb25maWdfdmFycyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuY29uZmlnX3ZhcnMKCiAgICAgICAgaWYgc2VsZi5wcmVmaXg6CiAgICAgICAgICAgICMgU2V0IGRlZmF1bHQgaW5zdGFsbF9kaXIvc2NyaXB0cyBmcm9tIC0tcHJlZml4CiAgICAgICAgICAgIGNvbmZpZ192YXJzID0gY29uZmlnX3ZhcnMuY29weSgpCiAgICAgICAgICAgIGNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLnByZWZpeAogICAgICAgICAgICBzY2hlbWUgPSBzZWxmLklOU1RBTExfU0NIRU1FUy5nZXQob3MubmFtZSwgc2VsZi5ERUZBVUxUX1NDSEVNRSkKICAgICAgICAgICAgZm9yIGF0dHIsIHZhbCBpbiBzY2hlbWUuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3Vic3RfdmFycwoKICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQogICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgY29uZmlnX3ZhcnMpCiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKCmRlZiBfcHl0aG9ucGF0aCgpOgogICAgaXRlbXMgPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKS5zcGxpdChvcy5wYXRoc2VwKQogICAgcmV0dXJuIGZpbHRlcihOb25lLCBpdGVtcykKCgpkZWYgZ2V0X3NpdGVfZGlycygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBsaXN0IG9mICdzaXRlJyBkaXJzCiAgICAiIiIKCiAgICBzaXRlZGlycyA9IFtdCgogICAgIyBzdGFydCB3aXRoIFBZVEhPTlBBVEgKICAgIHNpdGVkaXJzLmV4dGVuZChfcHl0aG9ucGF0aCgpKQoKICAgIHByZWZpeGVzID0gW3N5cy5wcmVmaXhdCiAgICBpZiBzeXMuZXhlY19wcmVmaXggIT0gc3lzLnByZWZpeDoKICAgICAgICBwcmVmaXhlcy5hcHBlbmQoc3lzLmV4ZWNfcHJlZml4KQogICAgZm9yIHByZWZpeCBpbiBwcmVmaXhlczoKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29zMmVteCcsICdyaXNjb3MnKToKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAiTGliIiwgInNpdGUtcGFja2FnZXMiKSkKICAgICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKFsKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJweXRob257fS57fSIuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXB5dGhvbiIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbCiAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1wYWNrYWdlcyIpLAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgIyBmb3IgZnJhbWV3b3JrIGJ1aWxkcyAqb25seSogd2UgYWRkIHRoZSBzdGFuZGFyZCBBcHBsZQogICAgICAgICAgICAgICAgIyBsb2NhdGlvbnMuIEN1cnJlbnRseSBvbmx5IHBlci11c2VyLCBidXQgL0xpYnJhcnkgYW5kCiAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCiAgICAgICAgICAgICAgICBpZiAnUHl0aG9uLmZyYW1ld29yaycgaW4gcHJlZml4OgogICAgICAgICAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uLmdldCgnSE9NRScpCiAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKICAgICAgICAgICAgICAgICAgICAgICAgaG9tZV9zcCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGlicmFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7fS57fScuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoaG9tZV9zcCkKICAgIGxpYl9wYXRocyA9IGdldF9wYXRoKCdwdXJlbGliJyksIGdldF9wYXRoKCdwbGF0bGliJykKICAgIGZvciBzaXRlX2xpYiBpbiBsaWJfcGF0aHM6CiAgICAgICAgaWYgc2l0ZV9saWIgbm90IGluIHNpdGVkaXJzOgogICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZV9saWIpCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIHNpdGVkaXJzLmFwcGVuZChzaXRlLlVTRVJfU0lURSkKCiAgICB0cnk6CiAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKHNpdGUuZ2V0c2l0ZXBhY2thZ2VzKCkpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKCiAgICByZXR1cm4gc2l0ZWRpcnMKCgpkZWYgZXhwYW5kX3BhdGhzKGlucHV0cyk6CiAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKCiAgICBzZWVuID0ge30KCiAgICBmb3IgZGlybmFtZSBpbiBpbnB1dHM6CiAgICAgICAgZGlybmFtZSA9IG5vcm1hbGl6ZV9wYXRoKGRpcm5hbWUpCiAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgICAgICB5aWVsZCBkaXJuYW1lLCBmaWxlcwoKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lIGluICgnZWFzeS1pbnN0YWxsLnB0aCcsICdzZXR1cHRvb2xzLnB0aCcpOgogICAgICAgICAgICAgICAgIyBJZ25vcmUgLnB0aCBmaWxlcyB0aGF0IHdlIGNvbnRyb2wKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFJlYWQgdGhlIC5wdGggZmlsZQogICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCiAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0CiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aCgiaW1wb3J0Iik6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VlbltsaW5lXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lLCBvcy5saXN0ZGlyKGxpbmUpCgoKZGVmIGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSk6CiAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCgogICAgUmV0dXJucyBhIGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIsIG9yIE5vbmUKICAgICIiIgogICAgZiA9IG9wZW4oZGlzdF9maWxlbmFtZSwgJ3JiJykKICAgIHRyeToKICAgICAgICBlbmRyZWMgPSB6aXBmaWxlLl9FbmRSZWNEYXRhKGYpCiAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCiAgICAgICAgaWYgcHJlcGVuZGVkIDwgMTI6ICAjIG5vIHdpbmluc3QgZGF0YSBoZXJlCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZi5zZWVrKHByZXBlbmRlZCAtIDEyKQoKICAgICAgICB0YWcsIGNmZ2xlbiwgYm1sZW4gPSBzdHJ1Y3QudW5wYWNrKCI8aWlpIiwgZi5yZWFkKDEyKSkKICAgICAgICBpZiB0YWcgbm90IGluICgweDEyMzQ1NjdBLCAweDEyMzQ1NjdCKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgbm90IGEgdmFsaWQgdGFnCgogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAoMTIgKyBjZmdsZW4pKQogICAgICAgIGluaXQgPSB7J3ZlcnNpb24nOiAnJywgJ3RhcmdldF92ZXJzaW9uJzogJyd9CiAgICAgICAgY2ZnID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcihpbml0KQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydCA9IGYucmVhZChjZmdsZW4pCiAgICAgICAgICAgICMgUmVhZCB1cCB0byB0aGUgZmlyc3QgbnVsbCBieXRlLgogICAgICAgICAgICBjb25maWcgPSBwYXJ0LnNwbGl0KGInXDAnLCAxKVswXQogICAgICAgICAgICAjIE5vdyB0aGUgY29uZmlnIGlzIGluIGJ5dGVzLCBidXQgZm9yIFJhd0NvbmZpZ1BhcnNlciwgaXQgc2hvdWxkCiAgICAgICAgICAgICMgIGJlIHRleHQsIHNvIGRlY29kZSBpdC4KICAgICAgICAgICAgY29uZmlnID0gY29uZmlnLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgICAgIGNmZy5yZWFkZnAoc2l4LlN0cmluZ0lPKGNvbmZpZykpCiAgICAgICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGNmZwoKICAgIGZpbmFsbHk6CiAgICAgICAgZi5jbG9zZSgpCgoKZGVmIGdldF9leGVfcHJlZml4ZXMoZXhlX2ZpbGVuYW1lKToKICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKCiAgICBwcmVmaXhlcyA9IFsKICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAogICAgICAgICgnUExBVExJQi9weXdpbjMyX3N5c3RlbTMyJywgJycpLAogICAgICAgICgnUExBVExJQi8nLCAnJyksCiAgICAgICAgKCdTQ1JJUFRTLycsICdFR0ctSU5GTy9zY3JpcHRzLycpLAogICAgICAgICgnREFUQS9saWIvc2l0ZS1wYWNrYWdlcycsICcnKSwKICAgIF0KICAgIHogPSB6aXBmaWxlLlppcEZpbGUoZXhlX2ZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAzIGFuZCBwYXJ0c1syXSA9PSAnUEtHLUlORk8nOgogICAgICAgICAgICAgICAgaWYgcGFydHNbMV0uZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmluc2VydCgwLCAoJy8nLmpvaW4ocGFydHNbOjJdKSwgJ0VHRy1JTkZPLycpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gMiBvciBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcGFydHNbMF0udXBwZXIoKSBpbiAoJ1BVUkVMSUInLCAnUExBVExJQicpOgogICAgICAgICAgICAgICAgY29udGVudHMgPSB6LnJlYWQobmFtZSkKICAgICAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5kZWNvZGUoKQogICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyhjb250ZW50cyk6CiAgICAgICAgICAgICAgICAgICAgcHRoID0gcHRoLnN0cmlwKCkucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHB0aC5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0sIHB0aCkpLCAnJykpCiAgICBmaW5hbGx5OgogICAgICAgIHouY2xvc2UoKQogICAgcHJlZml4ZXMgPSBbKHgubG93ZXIoKSwgeSkgZm9yIHgsIHkgaW4gcHJlZml4ZXNdCiAgICBwcmVmaXhlcy5zb3J0KCkKICAgIHByZWZpeGVzLnJldmVyc2UoKQogICAgcmV0dXJuIHByZWZpeGVzCgoKY2xhc3MgUHRoRGlzdHJpYnV0aW9ucyhFbnZpcm9ubWVudCk6CiAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgoKICAgIGRpcnR5ID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIHNpdGVkaXJzPSgpKToKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLnNpdGVkaXJzID0gbGlzdChtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKSkKICAgICAgICBzZWxmLmJhc2VkaXIgPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUoc2VsZi5maWxlbmFtZSkpCiAgICAgICAgc2VsZi5fbG9hZCgpCiAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwgW10sIE5vbmUsIE5vbmUpCiAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aCwgVHJ1ZSkpKQoKICAgIGRlZiBfbG9hZChzZWxmKToKICAgICAgICBzZWxmLnBhdGhzID0gW10KICAgICAgICBzYXdfaW1wb3J0ID0gRmFsc2UKICAgICAgICBzZWVuID0gZGljdC5mcm9ta2V5cyhzZWxmLnNpdGVkaXJzKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBmID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncnQnKQogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKICAgICAgICAgICAgICAgICAgICBzYXdfaW1wb3J0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQocGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXRoLnN0cmlwKCkgb3IgcGF0aC5zdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIyBza2lwIG5vbi1leGlzdGVudCBwYXRocywgaW4gY2FzZSBzb21lYm9keSBkZWxldGVkIGEgcGFja2FnZQogICAgICAgICAgICAgICAgIyBtYW51YWxseSwgYW5kIGR1cGxpY2F0ZSBwYXRocyBhcyB3ZWxsCiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlZGlyLCBwYXRoKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpIG9yIHBhdGggaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAjIHNraXAgaXQKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyB3ZSBjbGVhbmVkIHVwLCBzbyB3ZSdyZSBkaXJ0eSBub3cgOikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYucGF0aHMgYW5kIG5vdCBzYXdfaW1wb3J0OgogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycwogICAgICAgIHdoaWxlIHNlbGYucGF0aHMgYW5kIG5vdCBzZWxmLnBhdGhzWy0xXS5zdHJpcCgpOgogICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpCgogICAgZGVmIHNhdmUoc2VsZik6CiAgICAgICAgIiIiV3JpdGUgY2hhbmdlZCAucHRoIGZpbGUgYmFjayB0byBkaXNrIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZWxfcGF0aHMgPSBsaXN0KG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsIHNlbGYucGF0aHMpKQogICAgICAgIGlmIHJlbF9wYXRoczoKICAgICAgICAgICAgbG9nLmRlYnVnKCJTYXZpbmcgJXMiLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICBsaW5lcyA9IHNlbGYuX3dyYXBfbGluZXMocmVsX3BhdGhzKQogICAgICAgICAgICBkYXRhID0gJ1xuJy5qb2luKGxpbmVzKSArICdcbicKCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAnd3QnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQoKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZW5hbWUpOgogICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCgogICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhsaW5lcyk6CiAgICAgICAgcmV0dXJuIGxpbmVzCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCiAgICAgICAgbmV3X3BhdGggPSAoCiAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHMgYW5kICgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2l0ZWRpcnMgb3IKICAgICAgICAgICAgICAgICMgYWNjb3VudCBmb3IgJy4nIGJlaW5nIGluIFBZVEhPTlBBVEgKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24gPT0gb3MuZ2V0Y3dkKCkKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBpZiBuZXdfcGF0aDoKICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5hZGQoc2VsZiwgZGlzdCkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKICAgICAgICAgICAgc2VsZi5wYXRocy5yZW1vdmUoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZiwgZGlzdCkKCiAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLCBwYXRoKToKICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobm9ybWFsaXplX3BhdGgocGF0aCkpCiAgICAgICAgYmFzZWxlbiA9IGxlbihzZWxmLmJhc2VkaXIpCiAgICAgICAgcGFydHMgPSBbbGFzdF0KICAgICAgICBzZXAgPSBvcy5hbHRzZXAgPT0gJy8nIGFuZCAnLycgb3Igb3Muc2VwCiAgICAgICAgd2hpbGUgbGVuKG5wYXRoKSA+PSBiYXNlbGVuOgogICAgICAgICAgICBpZiBucGF0aCA9PSBzZWxmLmJhc2VkaXI6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQob3MuY3VyZGlyKQogICAgICAgICAgICAgICAgcGFydHMucmV2ZXJzZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VwLmpvaW4ocGFydHMpCiAgICAgICAgICAgIG5wYXRoLCBsYXN0ID0gb3MucGF0aC5zcGxpdChucGF0aCkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKGxhc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHBhdGgKCgpjbGFzcyBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucyhQdGhEaXN0cmlidXRpb25zKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF93cmFwX2xpbmVzKGNscywgbGluZXMpOgogICAgICAgIHlpZWxkIGNscy5wcmVsdWRlCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICB5aWVsZCBjbHMucG9zdGx1ZGUKCiAgICBwcmVsdWRlID0gX29uZV9saW5lcigiIiIKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgc3lzLl9fcGxlbiA9IGxlbihzeXMucGF0aCkKICAgICAgICAiIiIpCiAgICBwb3N0bHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIG5ldyA9IHN5cy5wYXRoW3N5cy5fX3BsZW46XQogICAgICAgIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBwID0gZ2V0YXR0cihzeXMsICdfX2VnZ2luc2VydCcsIDApCiAgICAgICAgc3lzLnBhdGhbcDpwXSA9IG5ldwogICAgICAgIHN5cy5fX2VnZ2luc2VydCA9IHAgKyBsZW4obmV3KQogICAgICAgICIiIikKCgppZiBvcy5lbnZpcm9uLmdldCgnU0VUVVBUT09MU19TWVNfUEFUSF9URUNITklRVUUnLCAncmF3JykgPT0gJ3Jld3JpdGUnOgogICAgUHRoRGlzdHJpYnV0aW9ucyA9IFJld3JpdGVQdGhEaXN0cmlidXRpb25zCgoKZGVmIF9maXJzdF9saW5lX3JlKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBvbiBmaXJzdF9saW5lX3JlIHN1aXRhYmxlIGZvciBtYXRjaGluZwogICAgc3RyaW5ncy4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaXJzdF9saW5lX3JlLnBhdHRlcm4sIHN0cik6CiAgICAgICAgcmV0dXJuIGZpcnN0X2xpbmVfcmUKCiAgICAjIGZpcnN0X2xpbmVfcmUgaW4gUHl0aG9uID49My4xLjQgYW5kID49My4yLjEgaXMgYSBieXRlcyBwYXR0ZXJuLgogICAgcmV0dXJuIHJlLmNvbXBpbGUoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLmRlY29kZSgpKQoKCmRlZiBhdXRvX2NobW9kKGZ1bmMsIGFyZywgZXhjKToKICAgIGlmIGZ1bmMgaW4gW29zLnVubGluaywgb3MucmVtb3ZlXSBhbmQgb3MubmFtZSA9PSAnbnQnOgogICAgICAgIGNobW9kKGFyZywgc3RhdC5TX0lXUklURSkKICAgICAgICByZXR1cm4gZnVuYyhhcmcpCiAgICBldCwgZXYsIF8gPSBzeXMuZXhjX2luZm8oKQogICAgc2l4LnJlcmFpc2UoZXQsIChldlswXSwgZXZbMV0gKyAoIiAlcyAlcyIgJSAoZnVuYywgYXJnKSkpKQoKCmRlZiB1cGRhdGVfZGlzdF9jYWNoZXMoZGlzdF9wYXRoLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzKToKICAgICIiIgogICAgRml4IGFueSBnbG9iYWxseSBjYWNoZWQgYGRpc3RfcGF0aGAgcmVsYXRlZCBkYXRhCgogICAgYGRpc3RfcGF0aGAgc2hvdWxkIGJlIGEgcGF0aCBvZiBhIG5ld2x5IGluc3RhbGxlZCBlZ2cgZGlzdHJpYnV0aW9uICh6aXBwZWQKICAgIG9yIHVuemlwcGVkKS4KCiAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBjb250YWlucyBmaW5kZXIgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjYWNoZWQgd2hlbgogICAgaW1wb3J0aW5nIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLiBBbnkgc3VjaCBmaW5kZXJzIG5lZWQgdG8gYmUKICAgIGNsZWFyZWQgc2luY2UgdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBtaWdodCBiZSBwYWNrYWdlZCBkaWZmZXJlbnRseSwKICAgIGUuZy4gYSB6aXBwZWQgZWdnIGRpc3RyaWJ1dGlvbiBtaWdodCBnZXQgcmVwbGFjZWQgd2l0aCBhbiB1bnppcHBlZCBlZ2cKICAgIGZvbGRlciBvciB2aWNlIHZlcnNhLiBIYXZpbmcgdGhlIG9sZCBmaW5kZXJzIGNhY2hlZCBtYXkgdGhlbiBjYXVzZSBQeXRob24KICAgIHRvIGF0dGVtcHQgbG9hZGluZyBtb2R1bGVzIGZyb20gdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiB1c2luZyBhbgogICAgaW5jb3JyZWN0IGxvYWRlci4KCiAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgb2JqZWN0cyBhcmUgUHl0aG9uIGxvYWRlcnMgY2hhcmdlZCB3aXRoIGltcG9ydGluZwogICAgZGF0YSBwYWNrYWdlZCBpbnNpZGUgemlwIGFyY2hpdmVzLiBJZiBzdGFsZSBsb2FkZXJzIHJlZmVyZW5jaW5nIHRoZQogICAgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLCBhcmUgbGVmdCBiZWhpbmQsIHRoZXkgY2FuIGZhaWwgdG8gbG9hZCBtb2R1bGVzIGZyb20KICAgIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24uIEUuZy4gaWYgYW4gb2xkIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZQogICAgaXMgdXNlZCB0byBsb2FkIGRhdGEgZnJvbSBhIG5ldyB6aXBwZWQgZWdnIGFyY2hpdmUsIGl0IG1heSBjYXVzZSB0aGUKICAgIG9wZXJhdGlvbiB0byBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGRhdGEgaW4gdGhlIHdyb25nIGxvY2F0aW9uIC0KICAgIG9uZSBpbmRpY2F0ZWQgYnkgdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uIFN1Y2ggYW4gb3BlcmF0aW9uIG1heSB0aGVuIGZhaWwgb3V0cmlnaHQsIGUuZy4gcmVwb3J0IGhhdmluZwogICAgcmVhZCBhICdiYWQgbG9jYWwgZmlsZSBoZWFkZXInLCBvciBldmVuIHdvcnNlLCBpdCBtYXkgZmFpbCBzaWxlbnRseSAmCiAgICByZXR1cm4gaW52YWxpZCBkYXRhLgoKICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBjb250YWlucyBjYWNoZWQgemlwIGFyY2hpdmUgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbiBmb3IgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgYW5kIGFsbCBzdWNoCiAgICBpbnN0YW5jZXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGFyY2hpdmUgc2hhcmUgdGhlIHNhbWUgY2FjaGVkIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24uCgogICAgSWYgYXNrZWQsIGFuZCB0aGUgdW5kZXJseWluZyBQeXRob24gaW1wbGVtZW50YXRpb24gYWxsb3dzIGl0LCB3ZSBjYW4gZml4CiAgICBhbGwgZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byB0cmFjawogICAgdGhlbSBkb3duIGFuZCByZW1vdmUgdGhlbSBvbmUgYnkgb25lLCBieSB1cGRhdGluZyB0aGVpciBzaGFyZWQgY2FjaGVkIHppcAogICAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uIFRoaXMsIG9mIGNvdXJzZSwgYXNzdW1lcyB0aGF0IHRoZQogICAgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIGlzIHBhY2thZ2VkIGFzIGEgemlwcGVkIGVnZy4KCiAgICBJZiBub3QgYXNrZWQgdG8gZml4IGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMsIHdlIHN0aWxsIGRvCiAgICBvdXIgYmVzdCB0byBjbGVhciBhbnkgcmVtYWluaW5nIHppcGltcG9ydC56aXBpbXBvcnRlciByZWxhdGVkIGNhY2hlZCBkYXRhCiAgICB0aGF0IG1pZ2h0IHNvbWVob3cgbGF0ZXIgZ2V0IHVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBuZXcKICAgIGRpc3RyaWJ1dGlvbiBhbmQgdGh1cyBjYXVzZSBzdWNoIGxvYWQgb3BlcmF0aW9ucyB0byBmYWlsLiBOb3RlIHRoYXQgd2hlbgogICAgdHJhY2tpbmcgZG93biBzdWNoIHJlbWFpbmluZyBzdGFsZSBkYXRhLCB3ZSBjYW4gbm90IGNhdGNoIGV2ZXJ5IGNvbmNlaXZhYmxlCiAgICB1c2FnZSBmcm9tIGhlcmUsIGFuZCB3ZSBjbGVhciBvbmx5IHRob3NlIHRoYXQgd2Uga25vdyBvZiBhbmQgaGF2ZSBmb3VuZCB0bwogICAgY2F1c2UgcHJvYmxlbXMgaWYgbGVmdCBhbGl2ZS4gQW55IHJlbWFpbmluZyBjYWNoZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYnkKICAgIHdob21ldmVyIGlzIGluIGNoYXJnZSBvZiBtYWludGFpbmluZyB0aGVtLCBpLmUuIHRoZXkgc2hvdWxkIGJlIHJlYWR5IHRvCiAgICBoYW5kbGUgdXMgcmVwbGFjaW5nIHRoZWlyIHppcCBhcmNoaXZlcyB3aXRoIG5ldyBkaXN0cmlidXRpb25zIGF0IHJ1bnRpbWUuCgogICAgIiIiCiAgICAjIFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGtub3duIHNvdXJjZXMgb2Ygc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyCiAgICAjIGluc3RhbmNlcyB0aGF0IHdlIGRvIG5vdCBjbGVhciBoZXJlLCBidXQgbWlnaHQgaWYgZXZlciBnaXZlbiBhIHJlYXNvbiB0bwogICAgIyBkbyBzbzoKICAgICMgKiBHbG9iYWwgc2V0dXB0b29scyBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0IChhLmsuYS4gJ21hc3RlciB3b3JraW5nCiAgICAjIHNldCcpIG1heSBjb250YWluIGRpc3RyaWJ1dGlvbnMgd2hpY2ggbWF5IGluIHR1cm4gY29udGFpbiB0aGVpcgogICAgIyAgIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzLgogICAgIyAqIFNldmVyYWwgemlwaW1wb3J0LnppcGltcG9ydGVyIGxvYWRlcnMgaGVsZCBieSBsb2NhbCB2YXJpYWJsZXMgZnVydGhlcgogICAgIyAgIHVwIHRoZSBmdW5jdGlvbiBjYWxsIHN0YWNrIHdoZW4gcnVubmluZyB0aGUgc2V0dXB0b29scyBpbnN0YWxsYXRpb24uCiAgICAjICogQWxyZWFkeSBsb2FkZWQgbW9kdWxlcyBtYXkgaGF2ZSB0aGVpciBfX2xvYWRlcl9fIGF0dHJpYnV0ZSBzZXQgdG8gdGhlCiAgICAjICAgZXhhY3QgbG9hZGVyIGluc3RhbmNlIHVzZWQgd2hlbiBpbXBvcnRpbmcgdGhlbS4gUHl0aG9uIDMuNCBkb2NzIHN0YXRlCiAgICAjICAgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW50cm9zcGVjdGlvbiBhbmQgc28gaXMKICAgICMgICBub3QgZXhwZWN0ZWQgdG8gY2F1c2UgdXMgcHJvYmxlbXMuCiAgICBub3JtYWxpemVkX3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0X3BhdGgpCiAgICBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlKQogICAgaWYgZml4X3ppcGltcG9ydGVyX2NhY2hlczoKICAgICAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQogICAgZWxzZToKICAgICAgICAjIEhlcmUsIGV2ZW4gdGhvdWdoIHdlIGRvIG5vdCB3YW50IHRvIGZpeCBleGlzdGluZyBhbmQgbm93IHN0YWxlCiAgICAgICAgIyB6aXBpbXBvcnRlciBjYWNoZSBpbmZvcm1hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byByZW1vdmUgaXQuIFJlbGF0ZWQgdG8KICAgICAgICAjIFB5dGhvbidzIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjYWNoZSwgd2UgY2xlYXIgZWFjaCBvZgogICAgICAgICMgaXRzIHN0YWxlIGVudHJpZXMgaW4gdHdvIHBoYXNlczoKICAgICAgICAjICAgMS4gQ2xlYXIgdGhlIGVudHJ5IHNvIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHppcCBhcmNoaXZlIGluZm9ybWF0aW9uCiAgICAgICAgIyAgICAgIHZpYSBhbnkgZXhpc3Rpbmcgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBmYWlscy4KICAgICAgICAjICAgMi4gUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyBhbnkgbmV3bHkgY29uc3RydWN0ZWQKICAgICAgICAjICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBkbyBub3QgZW5kIHVwIHVzaW5nIG9sZCBzdGFsZQogICAgICAgICMgICAgICB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCiAgICAgICAgIyBUaGlzIHdob2xlIHN0YWxlIGRhdGEgcmVtb3ZhbCBzdGVwIGRvZXMgbm90IHNlZW0gc3RyaWN0bHkgbmVjZXNzYXJ5LAogICAgICAgICMgYnV0IGhhcyBiZWVuIGxlZnQgaW4gYmVjYXVzZSBpdCB3YXMgZG9uZSBiZWZvcmUgd2Ugc3RhcnRlZCByZXBsYWNpbmcKICAgICAgICAjIHRoZSB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUgY29udGVudCBpZiBwb3NzaWJsZSwgYW5kCiAgICAgICAgIyB0aGVyZSBhcmUgbm8gcmVsZXZhbnQgdW5pdCB0ZXN0cyB0aGF0IHdlIGNhbiBkZXBlbmQgb24gdG8gdGVsbCB1cyBpZgogICAgICAgICMgdGhpcyBpcyByZWFsbHkgbmVlZGVkLgogICAgICAgIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpCgoKZGVmIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAiIiIKICAgIFJldHVybiB6aXBpbXBvcnRlciBjYWNoZSBlbnRyeSBrZXlzIHJlbGF0ZWQgdG8gYSBnaXZlbiBub3JtYWxpemVkIHBhdGguCgogICAgQWx0ZXJuYXRpdmUgcGF0aCBzcGVsbGluZ3MgKGUuZy4gdGhvc2UgdXNpbmcgZGlmZmVyZW50IGNoYXJhY3RlciBjYXNlIG9yCiAgICB0aG9zZSB1c2luZyBhbHRlcm5hdGl2ZSBwYXRoIHNlcGFyYXRvcnMpIHJlbGF0ZWQgdG8gdGhlIHNhbWUgcGF0aCBhcmUKICAgIGluY2x1ZGVkLiBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgaW5jbHVkZWQgYXMgd2VsbCwgaS5lLiB0aG9zZQogICAgY29ycmVzcG9uZGluZyB0byB6aXAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgICIiIgogICAgcmVzdWx0ID0gW10KICAgIHByZWZpeF9sZW4gPSBsZW4obm9ybWFsaXplZF9wYXRoKQogICAgZm9yIHAgaW4gY2FjaGU6CiAgICAgICAgbnAgPSBub3JtYWxpemVfcGF0aChwKQogICAgICAgIGlmIChucC5zdGFydHN3aXRoKG5vcm1hbGl6ZWRfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICBucFtwcmVmaXhfbGVuOnByZWZpeF9sZW4gKyAxXSBpbiAob3Muc2VwLCAnJykpOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSwgdXBkYXRlcj1Ob25lKToKICAgICIiIgogICAgVXBkYXRlIHppcGltcG9ydGVyIGNhY2hlIGRhdGEgZm9yIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFueSBzdWItcGF0aCBlbnRyaWVzIGFyZSBwcm9jZXNzZWQgYXMgd2VsbCwgaS5lLiB0aG9zZSBjb3JyZXNwb25kaW5nIHRvIHppcAogICAgYXJjaGl2ZXMgZW1iZWRkZWQgaW4gb3RoZXIgemlwIGFyY2hpdmVzLgoKICAgIEdpdmVuIHVwZGF0ZXIgaXMgYSBjYWxsYWJsZSB0YWtpbmcgYSBjYWNoZSBlbnRyeSBrZXkgYW5kIHRoZSBvcmlnaW5hbCBlbnRyeQogICAgKGFmdGVyIGFscmVhZHkgcmVtb3ZpbmcgdGhlIGVudHJ5IGZyb20gdGhlIGNhY2hlKSwgYW5kIGV4cGVjdGVkIHRvIHVwZGF0ZQogICAgdGhlIGVudHJ5IGFuZCBwb3NzaWJseSByZXR1cm4gYSBuZXcgb25lIHRvIGJlIGluc2VydGVkIGluIGl0cyBwbGFjZS4KICAgIFJldHVybmluZyBOb25lIGluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBzaG91bGQgbm90IGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKICAgIG9uZS4gSWYgbm8gdXBkYXRlciBpcyBnaXZlbiwgdGhlIGNhY2hlIGVudHJpZXMgYXJlIHNpbXBseSByZW1vdmVkIHdpdGhvdXQKICAgIGFueSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcsIHRoZSBzYW1lIGFzIGlmIHRoZSB1cGRhdGVyIHNpbXBseSByZXR1cm5lZCBOb25lLgoKICAgICIiIgogICAgZm9yIHAgaW4gX2NvbGxlY3RfemlwaW1wb3J0ZXJfY2FjaGVfZW50cmllcyhub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgICAgICAjIE4uQi4gcHlweSdzIGN1c3RvbSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgaW1wbGVtZW50YXRpb24gZG9lcwogICAgICAgICMgbm90IHN1cHBvcnQgdGhlIGNvbXBsZXRlIGRpY3QgaW50ZXJmYWNlOgogICAgICAgICMgKiBEb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCwgdGh1cyBub3QgYWxsb3dpbmcgdGhpcyBmdW5jdGlvbgogICAgICAgICMgICAgdG8gYmUgdXNlZCBvbmx5IGZvciByZW1vdmluZyBleGlzdGluZyBjYWNoZSBlbnRyaWVzLgogICAgICAgICMgICogRG9lcyBub3Qgc3VwcG9ydCB0aGUgZGljdC5wb3AoKSBtZXRob2QsIGZvcmNpbmcgdXMgdG8gdXNlIHRoZQogICAgICAgICMgICAgZ2V0L2RlbCBwYXR0ZXJucyBpbnN0ZWFkLiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgdGhlCiAgICAgICAgIyAgICBmb2xsb3dpbmcgbGlua3M6CiAgICAgICAgIyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzIwMiNpc3N1ZWNvbW1lbnQtMjAyOTEzNDIwCiAgICAgICAgIyAgICAgIGh0dHA6Ly9iaXQubHkvMmg5aXRKWAogICAgICAgIG9sZF9lbnRyeSA9IGNhY2hlW3BdCiAgICAgICAgZGVsIGNhY2hlW3BdCiAgICAgICAgbmV3X2VudHJ5ID0gdXBkYXRlciBhbmQgdXBkYXRlcihwLCBvbGRfZW50cnkpCiAgICAgICAgaWYgbmV3X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjYWNoZVtwXSA9IG5ld19lbnRyeQoKCmRlZiBfdW5jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSkKCgpkZWYgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICBkZWYgY2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEocGF0aCwgb2xkX2VudHJ5KToKICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQoKICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgdXBkYXRlcj1jbGVhcl9hbmRfcmVtb3ZlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YSkKCgojIFB5UHkgUHl0aG9uIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGRpcmVjdGx5IHdyaXRpbmcgdG8gdGhlCiMgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGFuZCBzbyBwcmV2ZW50cyB1cyBmcm9tIGF0dGVtcHRpbmcgdG8gY29ycmVjdAojIGl0cyBjb250ZW50LiBUaGUgYmVzdCB3ZSBjYW4gZG8gdGhlcmUgaXMgY2xlYXIgdGhlIHByb2JsZW1hdGljIGNhY2hlIGNvbnRlbnQKIyBhbmQgaGF2ZSBQeVB5IHJlcG9wdWxhdGUgaXQgYXMgbmVlZGVkLiBUaGUgZG93bnNpZGUgaXMgdGhhdCBpZiB0aGVyZSBhcmUgYW55CiMgc3RhbGUgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBsYXlpbmcgYXJvdW5kLCBhdHRlbXB0aW5nIHRvIHVzZSB0aGVtCiMgd2lsbCBmYWlsIGR1ZSB0byBub3QgaGF2aW5nIGl0cyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlCiMgaW5zdGVhZCBvZiBiZWluZyBhdXRvbWF0aWNhbGx5IGNvcnJlY3RlZCB0byB1c2UgdGhlIG5ldyBjb3JyZWN0IHppcCBhcmNoaXZlCiMgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgppZiAnX19weXB5X18nIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKICAgIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YSA9IFwKICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEKZWxzZToKCiAgICBkZWYgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCk6CiAgICAgICAgZGVmIHJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgICAgICMgTi5CLiBJbiB0aGVvcnksIHdlIGNvdWxkIGxvYWQgdGhlIHppcCBkaXJlY3RvcnkgaW5mb3JtYXRpb24ganVzdAogICAgICAgICAgICAjIG9uY2UgZm9yIGFsbCB1cGRhdGVkIHBhdGggc3BlbGxpbmdzLCBhbmQgdGhlbiBjb3B5IGl0IGxvY2FsbHkgYW5kCiAgICAgICAgICAgICMgdXBkYXRlIGl0cyBjb250YWluZWQgcGF0aCBzdHJpbmdzIHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QKICAgICAgICAgICAgIyBzcGVsbGluZywgYnV0IHRoYXQgc2VlbXMgbGlrZSBhIHdheSB0b28gaW52YXNpdmUgbW92ZSAodGhpcyBjYWNoZQogICAgICAgICAgICAjIHN0cnVjdHVyZSBpcyBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFueXdoZXJlIGFuZCBjb3VsZCBpbgogICAgICAgICAgICAjIHRoZW9yeSBjaGFuZ2Ugd2l0aCBuZXcgUHl0aG9uIHJlbGVhc2VzKSBmb3Igbm8gc2lnbmlmaWNhbnQKICAgICAgICAgICAgIyBiZW5lZml0LgogICAgICAgICAgICBvbGRfZW50cnkuY2xlYXIoKQogICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aCkKICAgICAgICAgICAgb2xkX2VudHJ5LnVwZGF0ZSh6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbcGF0aF0pCiAgICAgICAgICAgIHJldHVybiBvbGRfZW50cnkKCiAgICAgICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZSgKICAgICAgICAgICAgbm9ybWFsaXplZF9wYXRoLCB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUsCiAgICAgICAgICAgIHVwZGF0ZXI9cmVwbGFjZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKZGVmIGlzX3B5dGhvbih0ZXh0LCBmaWxlbmFtZT0nPHN0cmluZz4nKToKICAgICJJcyB0aGlzIHN0cmluZyBhIHZhbGlkIFB5dGhvbiBzY3JpcHQ/IgogICAgdHJ5OgogICAgICAgIGNvbXBpbGUodGV4dCwgZmlsZW5hbWUsICdleGVjJykKICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBUcnVlCgoKZGVmIGlzX3NoKGV4ZWN1dGFibGUpOgogICAgIiIiRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgZXhlY3V0YWJsZSBpcyBhIC5zaCAoY29udGFpbnMgYSAjISBsaW5lKSIiIgogICAgdHJ5OgogICAgICAgIHdpdGggaW8ub3BlbihleGVjdXRhYmxlLCBlbmNvZGluZz0nbGF0aW4tMScpIGFzIGZwOgogICAgICAgICAgICBtYWdpYyA9IGZwLnJlYWQoMikKICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgIHJldHVybiBtYWdpYyA9PSAnIyEnCgoKZGVmIG50X3F1b3RlX2FyZyhhcmcpOgogICAgIiIiUXVvdGUgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgYWNjb3JkaW5nIHRvIFdpbmRvd3MgcGFyc2luZyBydWxlcyIiIgogICAgcmV0dXJuIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFthcmddKQoKCmRlZiBpc19weXRob25fc2NyaXB0KHNjcmlwdF90ZXh0LCBmaWxlbmFtZSk6CiAgICAiIiJJcyB0aGlzIHRleHQsIGFzIGEgd2hvbGUsIGEgUHl0aG9uIHNjcmlwdD8gKGFzIG9wcG9zZWQgdG8gc2hlbGwvYmF0L2V0Yy4KICAgICIiIgogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgcmV0dXJuIFRydWUgICMgZXh0ZW5zaW9uIHNheXMgaXQncyBQeXRob24KICAgIGlmIGlzX3B5dGhvbihzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgICAgIHJldHVybiBUcnVlICAjIGl0J3Mgc3ludGFjdGljYWxseSB2YWxpZCBQeXRob24KICAgIGlmIHNjcmlwdF90ZXh0LnN0YXJ0c3dpdGgoJyMhJyk6CiAgICAgICAgIyBJdCBiZWdpbnMgd2l0aCBhICcjIScgbGluZSwgc28gY2hlY2sgaWYgJ3B5dGhvbicgaXMgaW4gaXQgc29tZXdoZXJlCiAgICAgICAgcmV0dXJuICdweXRob24nIGluIHNjcmlwdF90ZXh0LnNwbGl0bGluZXMoKVswXS5sb3dlcigpCgogICAgcmV0dXJuIEZhbHNlICAjIE5vdCBhbnkgUHl0aG9uIEkgY2FuIHJlY29nbml6ZQoKCnRyeToKICAgIGZyb20gb3MgaW1wb3J0IGNobW9kIGFzIF9jaG1vZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIEp5dGhvbiBjb21wYXRpYmlsaXR5CiAgICBkZWYgX2NobW9kKCphcmdzKToKICAgICAgICBwYXNzCgoKZGVmIGNobW9kKHBhdGgsIG1vZGUpOgogICAgbG9nLmRlYnVnKCJjaGFuZ2luZyBtb2RlIG9mICVzIHRvICVvIiwgcGF0aCwgbW9kZSkKICAgIHRyeToKICAgICAgICBfY2htb2QocGF0aCwgbW9kZSkKICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlOgogICAgICAgIGxvZy5kZWJ1ZygiY2htb2QgZmFpbGVkOiAlcyIsIGUpCgoKY2xhc3MgQ29tbWFuZFNwZWMobGlzdCk6CiAgICAiIiIKICAgIEEgY29tbWFuZCBzcGVjIGZvciBhICMhIGhlYWRlciwgc3BlY2lmaWVkIGFzIGEgbGlzdCBvZiBhcmd1bWVudHMgYWtpbiB0bwogICAgdGhvc2UgcGFzc2VkIHRvIFBvcGVuLgogICAgIiIiCgogICAgb3B0aW9ucyA9IFtdCiAgICBzcGxpdF9hcmdzID0gZGljdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIENob29zZSB0aGUgYmVzdCBDb21tYW5kU3BlYyBjbGFzcyBiYXNlZCBvbiBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9zeXNfZXhlY3V0YWJsZShjbHMpOgogICAgICAgIF9kZWZhdWx0ID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKICAgICAgICByZXR1cm4gb3MuZW52aXJvbi5nZXQoJ19fUFlWRU5WX0xBVU5DSEVSX18nLCBfZGVmYXVsdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3BhcmFtKGNscywgcGFyYW0pOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIENvbW1hbmRTcGVjIGZyb20gYSBwYXJhbWV0ZXIgdG8gYnVpbGRfc2NyaXB0cywgd2hpY2ggbWF5CiAgICAgICAgYmUgTm9uZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBjbHMpOgogICAgICAgICAgICByZXR1cm4gcGFyYW0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBsaXN0KToKICAgICAgICAgICAgcmV0dXJuIGNscyhwYXJhbSkKICAgICAgICBpZiBwYXJhbSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gY2xzLmZyb21fZW52aXJvbm1lbnQoKQogICAgICAgICMgb3RoZXJ3aXNlLCBhc3N1bWUgaXQncyBhIHN0cmluZy4KICAgICAgICByZXR1cm4gY2xzLmZyb21fc3RyaW5nKHBhcmFtKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZW52aXJvbm1lbnQoY2xzKToKICAgICAgICByZXR1cm4gY2xzKFtjbHMuX3N5c19leGVjdXRhYmxlKCldKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fc3RyaW5nKGNscywgc3RyaW5nKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBjb21tYW5kIHNwZWMgZnJvbSBhIHNpbXBsZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgY29tbWFuZAogICAgICAgIGxpbmUgcGFyc2VhYmxlIGJ5IHNobGV4LnNwbGl0LgogICAgICAgICIiIgogICAgICAgIGl0ZW1zID0gc2hsZXguc3BsaXQoc3RyaW5nLCAqKmNscy5zcGxpdF9hcmdzKQogICAgICAgIHJldHVybiBjbHMoaXRlbXMpCgogICAgZGVmIGluc3RhbGxfb3B0aW9ucyhzZWxmLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgc2VsZi5vcHRpb25zID0gc2hsZXguc3BsaXQoc2VsZi5fZXh0cmFjdF9vcHRpb25zKHNjcmlwdF90ZXh0KSkKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoc2VsZikKICAgICAgICBpZiBub3QgaXNhc2NpaShjbWRsaW5lKToKICAgICAgICAgICAgc2VsZi5vcHRpb25zWzowXSA9IFsnLXgnXQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZXh0cmFjdF9vcHRpb25zKG9yaWdfc2NyaXB0KToKICAgICAgICAiIiIKICAgICAgICBFeHRyYWN0IGFueSBvcHRpb25zIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBmaXJzdCA9IChvcmlnX3NjcmlwdCArICdcbicpLnNwbGl0bGluZXMoKVswXQogICAgICAgIG1hdGNoID0gX2ZpcnN0X2xpbmVfcmUoKS5tYXRjaChmaXJzdCkKICAgICAgICBvcHRpb25zID0gbWF0Y2guZ3JvdXAoMSkgb3IgJycgaWYgbWF0Y2ggZWxzZSAnJwogICAgICAgIHJldHVybiBvcHRpb25zLnN0cmlwKCkKCiAgICBkZWYgYXNfaGVhZGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9yZW5kZXIoc2VsZiArIGxpc3Qoc2VsZi5vcHRpb25zKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3N0cmlwX3F1b3RlcyhpdGVtKToKICAgICAgICBfUVVPVEVTID0gJyJcJycKICAgICAgICBmb3IgcSBpbiBfUVVPVEVTOgogICAgICAgICAgICBpZiBpdGVtLnN0YXJ0c3dpdGgocSkgYW5kIGl0ZW0uZW5kc3dpdGgocSk6CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVsxOi0xXQogICAgICAgIHJldHVybiBpdGVtCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXIoaXRlbXMpOgogICAgICAgIGNtZGxpbmUgPSBzdWJwcm9jZXNzLmxpc3QyY21kbGluZSgKICAgICAgICAgICAgQ29tbWFuZFNwZWMuX3N0cmlwX3F1b3RlcyhpdGVtLnN0cmlwKCkpIGZvciBpdGVtIGluIGl0ZW1zKQogICAgICAgIHJldHVybiAnIyEnICsgY21kbGluZSArICdcbicKCgojIEZvciBwYnIgY29tcGF0OyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4Kc3lzX2V4ZWN1dGFibGUgPSBDb21tYW5kU3BlYy5fc3lzX2V4ZWN1dGFibGUoKQoKCmNsYXNzIFdpbmRvd3NDb21tYW5kU3BlYyhDb21tYW5kU3BlYyk6CiAgICBzcGxpdF9hcmdzID0gZGljdChwb3NpeD1GYWxzZSkKCgpjbGFzcyBTY3JpcHRXcml0ZXI6CiAgICAiIiIKICAgIEVuY2Fwc3VsYXRlcyBiZWhhdmlvciBhcm91bmQgd3JpdGluZyBlbnRyeSBwb2ludCBzY3JpcHRzIGZvciBjb25zb2xlIGFuZAogICAgZ3VpIGFwcHMuCiAgICAiIiIKCiAgICB0ZW1wbGF0ZSA9IHRleHR3cmFwLmRlZGVudChyIiIiCiAgICAgICAgIyBFQVNZLUlOU1RBTEwtRU5UUlktU0NSSVBUOiAlKHNwZWMpciwlKGdyb3VwKXIsJShuYW1lKXIKICAgICAgICBfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgogICAgICAgIGltcG9ydCByZQogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGxvYWRfZW50cnlfcG9pbnQKCiAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKICAgICAgICAgICAgc3lzLmV4aXQoCiAgICAgICAgICAgICAgICBsb2FkX2VudHJ5X3BvaW50KCUoc3BlYylyLCAlKGdyb3VwKXIsICUobmFtZSlyKSgpCiAgICAgICAgICAgICkKICAgICIiIikubHN0cmlwKCkKCiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9zY3JpcHRfYXJncyhjbHMsIGRpc3QsIGV4ZWN1dGFibGU9Tm9uZSwgd2luaW5zdD1GYWxzZSk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBnZXRfYXJncyIsIEVhc3lJbnN0YWxsRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHdyaXRlciA9IChXaW5kb3dzU2NyaXB0V3JpdGVyIGlmIHdpbmluc3QgZWxzZSBTY3JpcHRXcml0ZXIpLmJlc3QoKQogICAgICAgIGhlYWRlciA9IGNscy5nZXRfc2NyaXB0X2hlYWRlcigiIiwgZXhlY3V0YWJsZSwgd2luaW5zdCkKICAgICAgICByZXR1cm4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGhlYWRlcikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfc2NyaXB0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0LCBleGVjdXRhYmxlPU5vbmUsIHdpbmluc3Q9RmFsc2UpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgZ2V0X2hlYWRlciIsIEVhc3lJbnN0YWxsRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgaWYgd2luaW5zdDoKICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICJweXRob24uZXhlIgogICAgICAgIHJldHVybiBjbHMuZ2V0X2hlYWRlcihzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfYXJncyhjbHMsIGRpc3QsIGhlYWRlcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZCB3cml0ZV9zY3JpcHQoKSBhcmd1bWVudCB0dXBsZXMgZm9yIGEgZGlzdHJpYnV0aW9uJ3MKICAgICAgICBjb25zb2xlX3NjcmlwdHMgYW5kIGd1aV9zY3JpcHRzIGVudHJ5IHBvaW50cy4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXIgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVyID0gY2xzLmdldF9oZWFkZXIoKQogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGZvciB0eXBlXyBpbiAnY29uc29sZScsICdndWknOgogICAgICAgICAgICBncm91cCA9IHR5cGVfICsgJ19zY3JpcHRzJwogICAgICAgICAgICBmb3IgbmFtZSwgZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgogICAgICAgICAgICAgICAgY2xzLl9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpCiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGNscy50ZW1wbGF0ZSAlIGxvY2FscygpCiAgICAgICAgICAgICAgICBhcmdzID0gY2xzLl9nZXRfc2NyaXB0X2FyZ3ModHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpCiAgICAgICAgICAgICAgICBmb3IgcmVzIGluIGFyZ3M6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFByZXZlbnQgcGF0aHMgaW4gKl9zY3JpcHRzIGVudHJ5IHBvaW50IG5hbWVzLgogICAgICAgICIiIgogICAgICAgIGhhc19wYXRoX3NlcCA9IHJlLnNlYXJjaChyJ1tcXC9dJywgbmFtZSkKICAgICAgICBpZiBoYXNfcGF0aF9zZXA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBhdGggc2VwYXJhdG9ycyBub3QgYWxsb3dlZCBpbiBzY3JpcHQgbmFtZXMiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzLCBmb3JjZV93aW5kb3dzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBFYXN5SW5zdGFsbERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkgaWYgZm9yY2Vfd2luZG93cyBlbHNlIGNscy5iZXN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VsZWN0IHRoZSBiZXN0IFNjcmlwdFdyaXRlciBmb3IgdGhpcyBlbnZpcm9ubWVudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpOgogICAgICAgICAgICByZXR1cm4gV2luZG93c1NjcmlwdFdyaXRlci5iZXN0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gY2xzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAjIFNpbXBseSB3cml0ZSB0aGUgc3R1YiB3aXRoIG5vIGV4dGVuc2lvbi4KICAgICAgICB5aWVsZCAobmFtZSwgaGVhZGVyICsgc2NyaXB0X3RleHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X2hlYWRlcihjbHMsIHNjcmlwdF90ZXh0PSIiLCBleGVjdXRhYmxlPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhICMhIGxpbmUsIGdldHRpbmcgb3B0aW9ucyAoaWYgYW55KSBmcm9tIHNjcmlwdF90ZXh0IiIiCiAgICAgICAgY21kID0gY2xzLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjdXRhYmxlKQogICAgICAgIGNtZC5pbnN0YWxsX29wdGlvbnMoc2NyaXB0X3RleHQpCiAgICAgICAgcmV0dXJuIGNtZC5hc19oZWFkZXIoKQoKCmNsYXNzIFdpbmRvd3NTY3JpcHRXcml0ZXIoU2NyaXB0V3JpdGVyKToKICAgIGNvbW1hbmRfc3BlY19jbGFzcyA9IFdpbmRvd3NDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBFYXN5SW5zdGFsbERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICByZXR1cm4gY2xzLmJlc3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZWxlY3QgdGhlIGJlc3QgU2NyaXB0V3JpdGVyIHN1aXRhYmxlIGZvciBXaW5kb3dzCiAgICAgICAgIiIiCiAgICAgICAgd3JpdGVyX2xvb2t1cCA9IGRpY3QoCiAgICAgICAgICAgIGV4ZWN1dGFibGU9V2luZG93c0V4ZWN1dGFibGVMYXVuY2hlcldyaXRlciwKICAgICAgICAgICAgbmF0dXJhbD1jbHMsCiAgICAgICAgKQogICAgICAgICMgZm9yIGNvbXBhdGliaWxpdHksIHVzZSB0aGUgZXhlY3V0YWJsZSBsYXVuY2hlciBieSBkZWZhdWx0CiAgICAgICAgbGF1bmNoZXIgPSBvcy5lbnZpcm9uLmdldCgnU0VUVVBUT09MU19MQVVOQ0hFUicsICdleGVjdXRhYmxlJykKICAgICAgICByZXR1cm4gd3JpdGVyX2xvb2t1cFtsYXVuY2hlcl0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICJGb3IgV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiIKICAgICAgICBleHQgPSBkaWN0KGNvbnNvbGU9Jy5weWEnLCBndWk9Jy5weXcnKVt0eXBlX10KICAgICAgICBpZiBleHQgbm90IGluIG9zLmVudmlyb25bJ1BBVEhFWFQnXS5sb3dlcigpLnNwbGl0KCc7Jyk6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICJ7ZXh0fSBub3QgbGlzdGVkIGluIFBBVEhFWFQ7IHNjcmlwdHMgd2lsbCBub3QgYmUgIgogICAgICAgICAgICAgICAgInJlY29nbml6ZWQgYXMgZXhlY3V0YWJsZXMuIgogICAgICAgICAgICApLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCiAgICAgICAgb2xkID0gWycucHlhJywgJy5weScsICctc2NyaXB0LnB5JywgJy5weWMnLCAnLnB5bycsICcucHl3JywgJy5leGUnXQogICAgICAgIG9sZC5yZW1vdmUoZXh0KQogICAgICAgIGhlYWRlciA9IGNscy5fYWRqdXN0X2hlYWRlcih0eXBlXywgaGVhZGVyKQogICAgICAgIGJsb2NrZXJzID0gW25hbWUgKyB4IGZvciB4IGluIG9sZF0KICAgICAgICB5aWVsZCBuYW1lICsgZXh0LCBoZWFkZXIgKyBzY3JpcHRfdGV4dCwgJ3QnLCBibG9ja2VycwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9hZGp1c3RfaGVhZGVyKGNscywgdHlwZV8sIG9yaWdfaGVhZGVyKToKICAgICAgICAiIiIKICAgICAgICBNYWtlIHN1cmUgJ3B5dGhvbncnIGlzIHVzZWQgZm9yIGd1aSBhbmQgYW5kICdweXRob24nIGlzIHVzZWQgZm9yCiAgICAgICAgY29uc29sZSAocmVnYXJkbGVzcyBvZiB3aGF0IHN5cy5leGVjdXRhYmxlIGlzKS4KICAgICAgICAiIiIKICAgICAgICBwYXR0ZXJuID0gJ3B5dGhvbncuZXhlJwogICAgICAgIHJlcGwgPSAncHl0aG9uLmV4ZScKICAgICAgICBpZiB0eXBlXyA9PSAnZ3VpJzoKICAgICAgICAgICAgcGF0dGVybiwgcmVwbCA9IHJlcGwsIHBhdHRlcm4KICAgICAgICBwYXR0ZXJuX29iID0gcmUuY29tcGlsZShyZS5lc2NhcGUocGF0dGVybiksIHJlLklHTk9SRUNBU0UpCiAgICAgICAgbmV3X2hlYWRlciA9IHBhdHRlcm5fb2Iuc3ViKHN0cmluZz1vcmlnX2hlYWRlciwgcmVwbD1yZXBsKQogICAgICAgIHJldHVybiBuZXdfaGVhZGVyIGlmIGNscy5fdXNlX2hlYWRlcihuZXdfaGVhZGVyKSBlbHNlIG9yaWdfaGVhZGVyCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF91c2VfaGVhZGVyKG5ld19oZWFkZXIpOgogICAgICAgICIiIgogICAgICAgIFNob3VsZCBfYWRqdXN0X2hlYWRlciB1c2UgdGhlIHJlcGxhY2VkIGhlYWRlcj8KCiAgICAgICAgT24gbm9uLXdpbmRvd3Mgc3lzdGVtcywgYWx3YXlzIHVzZS4gT24KICAgICAgICBXaW5kb3dzIHN5c3RlbXMsIG9ubHkgdXNlIHRoZSByZXBsYWNlZCBoZWFkZXIgaWYgaXQgcmVzb2x2ZXMKICAgICAgICB0byBhbiBleGVjdXRhYmxlIG9uIHRoZSBzeXN0ZW0uCiAgICAgICAgIiIiCiAgICAgICAgY2xlYW5faGVhZGVyID0gbmV3X2hlYWRlclsyOi0xXS5zdHJpcCgnIicpCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInIG9yIGZpbmRfZXhlY3V0YWJsZShjbGVhbl9oZWFkZXIpCgoKY2xhc3MgV2luZG93c0V4ZWN1dGFibGVMYXVuY2hlcldyaXRlcihXaW5kb3dzU2NyaXB0V3JpdGVyKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24gYW5kIGFuIC5leGUgbGF1bmNoZXIKICAgICAgICAiIiIKICAgICAgICBpZiB0eXBlXyA9PSAnZ3VpJzoKICAgICAgICAgICAgbGF1bmNoZXJfdHlwZSA9ICdndWknCiAgICAgICAgICAgIGV4dCA9ICctc2NyaXB0LnB5dycKICAgICAgICAgICAgb2xkID0gWycucHl3J10KICAgICAgICBlbHNlOgogICAgICAgICAgICBsYXVuY2hlcl90eXBlID0gJ2NsaScKICAgICAgICAgICAgZXh0ID0gJy1zY3JpcHQucHknCiAgICAgICAgICAgIG9sZCA9IFsnLnB5JywgJy5weWMnLCAnLnB5byddCiAgICAgICAgaGRyID0gY2xzLl9hZGp1c3RfaGVhZGVyKHR5cGVfLCBoZWFkZXIpCiAgICAgICAgYmxvY2tlcnMgPSBbbmFtZSArIHggZm9yIHggaW4gb2xkXQogICAgICAgIHlpZWxkIChuYW1lICsgZXh0LCBoZHIgKyBzY3JpcHRfdGV4dCwgJ3QnLCBibG9ja2VycykKICAgICAgICB5aWVsZCAoCiAgICAgICAgICAgIG5hbWUgKyAnLmV4ZScsIGdldF93aW5fbGF1bmNoZXIobGF1bmNoZXJfdHlwZSksCiAgICAgICAgICAgICdiJyAgIyB3cml0ZSBpbiBiaW5hcnkgbW9kZQogICAgICAgICkKICAgICAgICBpZiBub3QgaXNfNjRiaXQoKToKICAgICAgICAgICAgIyBpbnN0YWxsIGEgbWFuaWZlc3QgZm9yIHRoZSBsYXVuY2hlciB0byBwcmV2ZW50IFdpbmRvd3MKICAgICAgICAgICAgIyBmcm9tIGRldGVjdGluZyBpdCBhcyBhbiBpbnN0YWxsZXIgKHdoaWNoIGl0IHdpbGwgZm9yCiAgICAgICAgICAgICMgIGxhdW5jaGVycyBsaWtlIGVhc3lfaW5zdGFsbC5leGUpLiBDb25zaWRlciBvbmx5CiAgICAgICAgICAgICMgIGFkZGluZyBhIG1hbmlmZXN0IGZvciBsYXVuY2hlcnMgZGV0ZWN0ZWQgYXMgaW5zdGFsbGVycy4KICAgICAgICAgICAgIyAgU2VlIERpc3RyaWJ1dGUgIzE0MyBmb3IgZGV0YWlscy4KICAgICAgICAgICAgbV9uYW1lID0gbmFtZSArICcuZXhlLm1hbmlmZXN0JwogICAgICAgICAgICB5aWVsZCAobV9uYW1lLCBsb2FkX2xhdW5jaGVyX21hbmlmZXN0KG5hbWUpLCAndCcpCgoKIyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eQpnZXRfc2NyaXB0X2FyZ3MgPSBTY3JpcHRXcml0ZXIuZ2V0X3NjcmlwdF9hcmdzCmdldF9zY3JpcHRfaGVhZGVyID0gU2NyaXB0V3JpdGVyLmdldF9zY3JpcHRfaGVhZGVyCgoKZGVmIGdldF93aW5fbGF1bmNoZXIodHlwZSk6CiAgICAiIiIKICAgIExvYWQgdGhlIFdpbmRvd3MgbGF1bmNoZXIgKGV4ZWN1dGFibGUpIHN1aXRhYmxlIGZvciBsYXVuY2hpbmcgYSBzY3JpcHQuCgogICAgYHR5cGVgIHNob3VsZCBiZSBlaXRoZXIgJ2NsaScgb3IgJ2d1aScKCiAgICBSZXR1cm5zIHRoZSBleGVjdXRhYmxlIGFzIGEgYnl0ZSBzdHJpbmcuCiAgICAiIiIKICAgIGxhdW5jaGVyX2ZuID0gJyVzLmV4ZScgJSB0eXBlCiAgICBpZiBpc182NGJpdCgpOgogICAgICAgIGxhdW5jaGVyX2ZuID0gbGF1bmNoZXJfZm4ucmVwbGFjZSgiLiIsICItNjQuIikKICAgIGVsc2U6CiAgICAgICAgbGF1bmNoZXJfZm4gPSBsYXVuY2hlcl9mbi5yZXBsYWNlKCIuIiwgIi0zMi4iKQogICAgcmV0dXJuIHJlc291cmNlX3N0cmluZygnc2V0dXB0b29scycsIGxhdW5jaGVyX2ZuKQoKCmRlZiBsb2FkX2xhdW5jaGVyX21hbmlmZXN0KG5hbWUpOgogICAgbWFuaWZlc3QgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX3N0cmluZyhfX25hbWVfXywgJ2xhdW5jaGVyIG1hbmlmZXN0LnhtbCcpCiAgICBpZiBzaXguUFkyOgogICAgICAgIHJldHVybiBtYW5pZmVzdCAlIHZhcnMoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFuaWZlc3QuZGVjb2RlKCd1dGYtOCcpICUgdmFycygpCgoKZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPWF1dG9fY2htb2QpOgogICAgcmV0dXJuIHNodXRpbC5ybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKCgpkZWYgY3VycmVudF91bWFzaygpOgogICAgdG1wID0gb3MudW1hc2soMG8wMjIpCiAgICBvcy51bWFzayh0bXApCiAgICByZXR1cm4gdG1wCgoKZGVmIGJvb3RzdHJhcCgpOgogICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHNldHVwdG9vbHMqLmVnZyBpcyBydW4gdXNpbmcgL2Jpbi9zaAogICAgaW1wb3J0IHNldHVwdG9vbHMKCiAgICBhcmd2MCA9IG9zLnBhdGguZGlybmFtZShzZXR1cHRvb2xzLl9fcGF0aF9fWzBdKQogICAgc3lzLmFyZ3ZbMF0gPSBhcmd2MAogICAgc3lzLmFyZ3YuYXBwZW5kKGFyZ3YwKQogICAgbWFpbigpCgoKZGVmIG1haW4oYXJndj1Ob25lLCAqKmt3KToKICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KCiAgICBjbGFzcyBEaXN0cmlidXRpb25XaXRob3V0SGVscENvbW1hbmRzKERpc3RyaWJ1dGlvbik6CiAgICAgICAgY29tbW9uX3VzYWdlID0gIiIKCiAgICAgICAgZGVmIF9zaG93X2hlbHAoc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICB3aXRoIF9wYXRjaF91c2FnZSgpOgogICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uLl9zaG93X2hlbHAoc2VsZiwgKmFyZ3MsICoqa3cpCgogICAgaWYgYXJndiBpcyBOb25lOgogICAgICAgIGFyZ3YgPSBzeXMuYXJndlsxOl0KCiAgICB3aXRoIF9wYXRjaF91c2FnZSgpOgogICAgICAgIHNldHVwKAogICAgICAgICAgICBzY3JpcHRfYXJncz1bJy1xJywgJ2Vhc3lfaW5zdGFsbCcsICctdiddICsgYXJndiwKICAgICAgICAgICAgc2NyaXB0X25hbWU9c3lzLmFyZ3ZbMF0gb3IgJ2Vhc3lfaW5zdGFsbCcsCiAgICAgICAgICAgIGRpc3RjbGFzcz1EaXN0cmlidXRpb25XaXRob3V0SGVscENvbW1hbmRzLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBfcGF0Y2hfdXNhZ2UoKToKICAgIGltcG9ydCBkaXN0dXRpbHMuY29yZQogICAgVVNBR0UgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgdXNhZ2U6ICUoc2NyaXB0KXMgW29wdGlvbnNdIHJlcXVpcmVtZW50X29yX3VybCAuLi4KICAgICAgICAgICBvcjogJShzY3JpcHQpcyAtLWhlbHAKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIGdlbl91c2FnZShzY3JpcHRfbmFtZSk6CiAgICAgICAgcmV0dXJuIFVTQUdFICUgZGljdCgKICAgICAgICAgICAgc2NyaXB0PW9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpLAogICAgICAgICkKCiAgICBzYXZlZCA9IGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZQogICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gZ2VuX3VzYWdlCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gc2F2ZWQKCmNsYXNzIEVhc3lJbnN0YWxsRGVwcmVjYXRpb25XYXJuaW5nKFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiQ2xhc3MgZm9yIHdhcm5pbmcgYWJvdXQgZGVwcmVjYXRpb25zIGluIEVhc3lJbnN0YWxsIGluIFNldHVwVG9vbHMuIE5vdCBpZ25vcmVkIGJ5IGRlZmF1bHQsIHVubGlrZSBEZXByZWNhdGlvbldhcm5pbmcuIiIiCiAgICAKUEsDBBQAAAAAAAAAIQAxifT24mMAAOJjAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weSIiInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbwoKQ3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSBhbmQgY29udGVudHMiIiIKCmZyb20gZGlzdHV0aWxzLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdCBhcyBfRmlsZUxpc3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNJbnRlcm5hbEVycm9yCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBpbwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHRpbWUKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgd2Fsa19yZXZjdHJsCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZwpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIHBhcnNlX3JlcXVpcmVtZW50cywgc2FmZV9uYW1lLCBwYXJzZV92ZXJzaW9uLAogICAgc2FmZV92ZXJzaW9uLCB5aWVsZF9saW5lcywgRW50cnlQb2ludCwgaXRlcl9lbnRyeV9wb2ludHMsIHRvX2ZpbGVuYW1lKQppbXBvcnQgc2V0dXB0b29scy51bmljb2RlX3V0aWxzIGFzIHVuaWNvZGVfdXRpbHMKZnJvbSBzZXR1cHRvb2xzLmdsb2IgaW1wb3J0IGdsb2IKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IFNldHVwdG9vbHNEZXByZWNhdGlvbldhcm5pbmcKCmRlZiB0cmFuc2xhdGVfcGF0dGVybihnbG9iKToKICAgICIiIgogICAgVHJhbnNsYXRlIGEgZmlsZSBwYXRoIGdsb2IgbGlrZSAnKi50eHQnIGluIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgogICAgVGhpcyBkaWZmZXJzIGZyb20gZm5tYXRjaC50cmFuc2xhdGUgd2hpY2ggYWxsb3dzIHdpbGRjYXJkcyB0byBtYXRjaAogICAgZGlyZWN0b3J5IHNlcGFyYXRvcnMuIEl0IGFsc28ga25vd3MgYWJvdXQgJyoqLycgd2hpY2ggbWF0Y2hlcyBhbnkgbnVtYmVyIG9mCiAgICBkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcGF0ID0gJycKCiAgICAjIFRoaXMgd2lsbCBzcGxpdCBvbiAnLycgd2l0aGluIFtjaGFyYWN0ZXIgY2xhc3Nlc10uIFRoaXMgaXMgZGVsaWJlcmF0ZS4KICAgIGNodW5rcyA9IGdsb2Iuc3BsaXQob3MucGF0aC5zZXApCgogICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKICAgIHZhbGlkX2NoYXIgPSAnW14lc10nICUgKHNlcCwpCgogICAgZm9yIGMsIGNodW5rIGluIGVudW1lcmF0ZShjaHVua3MpOgogICAgICAgIGxhc3RfY2h1bmsgPSBjID09IGxlbihjaHVua3MpIC0gMQoKICAgICAgICAjIENodW5rcyB0aGF0IGFyZSBhIGxpdGVyYWwgKiogYXJlIGdsb2JzdGFycy4gVGhleSBtYXRjaCBhbnl0aGluZy4KICAgICAgICBpZiBjaHVuayA9PSAnKionOgogICAgICAgICAgICBpZiBsYXN0X2NodW5rOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNvbXBvbmVudAogICAgICAgICAgICAgICAgcGF0ICs9ICcuKicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTWF0Y2ggJyhuYW1lLykqJwogICAgICAgICAgICAgICAgcGF0ICs9ICcoPzolcyslcykqJyAlICh2YWxpZF9jaGFyLCBzZXApCiAgICAgICAgICAgIGNvbnRpbnVlICAjIEJyZWFrIGhlcmUgYXMgdGhlIHdob2xlIHBhdGggY29tcG9uZW50IGhhcyBiZWVuIGhhbmRsZWQKCiAgICAgICAgIyBGaW5kIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHJlbWFpbmRlcgogICAgICAgIGkgPSAwCiAgICAgICAgY2h1bmtfbGVuID0gbGVuKGNodW5rKQogICAgICAgIHdoaWxlIGkgPCBjaHVua19sZW46CiAgICAgICAgICAgIGNoYXIgPSBjaHVua1tpXQogICAgICAgICAgICBpZiBjaGFyID09ICcqJzoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55IG51bWJlciBvZiBuYW1lIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgIHBhdCArPSB2YWxpZF9jaGFyICsgJyonCiAgICAgICAgICAgIGVsaWYgY2hhciA9PSAnPyc6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGEgbmFtZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgIHBhdCArPSB2YWxpZF9jaGFyCiAgICAgICAgICAgIGVsaWYgY2hhciA9PSAnWyc6CiAgICAgICAgICAgICAgICAjIENoYXJhY3RlciBjbGFzcwogICAgICAgICAgICAgICAgaW5uZXJfaSA9IGkgKyAxCiAgICAgICAgICAgICAgICAjIFNraXAgaW5pdGlhbCAhL10gY2hhcnMKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldID09ICchJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldID09ICddJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKCiAgICAgICAgICAgICAgICAjIExvb3AgdGlsbCB0aGUgY2xvc2luZyBdIGlzIGZvdW5kCiAgICAgICAgICAgICAgICB3aGlsZSBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSAhPSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA+PSBjaHVua19sZW46CiAgICAgICAgICAgICAgICAgICAgIyBHb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdpdGhvdXQgZmluZGluZyBhIGNsb3NpbmcgXQogICAgICAgICAgICAgICAgICAgICMgRG8gbm90IHRyZWF0IHRoaXMgYXMgYSBtYXRjaGluZyBncm91cCwgYnV0IGFzIGEgbGl0ZXJhbCBbCiAgICAgICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIEdyYWIgdGhlIGluc2lkZXMgb2YgdGhlIFticmFja2V0c10KICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGNodW5rW2kgKyAxOmlubmVyX2ldCiAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyA9ICcnCgogICAgICAgICAgICAgICAgICAgICMgQ2xhc3MgbmVnYXRpb24KICAgICAgICAgICAgICAgICAgICBpZiBpbm5lclswXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnXicKICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBpbm5lclsxOl0KCiAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyArPSByZS5lc2NhcGUoaW5uZXIpCiAgICAgICAgICAgICAgICAgICAgcGF0ICs9ICdbJXNdJyAlIChjaGFyX2NsYXNzLCkKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBlbmQgXQogICAgICAgICAgICAgICAgICAgIGkgPSBpbm5lcl9pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXQgKz0gcmUuZXNjYXBlKGNoYXIpCiAgICAgICAgICAgIGkgKz0gMQoKICAgICAgICAjIEpvaW4gZWFjaCBjaHVuayB3aXRoIHRoZSBkaXIgc2VwYXJhdG9yCiAgICAgICAgaWYgbm90IGxhc3RfY2h1bms6CiAgICAgICAgICAgIHBhdCArPSBzZXAKCiAgICBwYXQgKz0gcidcWicKICAgIHJldHVybiByZS5jb21waWxlKHBhdCwgZmxhZ3M9cmUuTVVMVElMSU5FfHJlLkRPVEFMTCkKCgpjbGFzcyBJbmZvQ29tbW9uOgogICAgdGFnX2J1aWxkID0gTm9uZQogICAgdGFnX2RhdGUgPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpCgogICAgZGVmIHRhZ2dlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgIyBlZ2dfaW5mbyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciBhIGRpc3RyaWJ1dGlvbiwKICAgICAgICAjIGluIHdoaWNoIGNhc2UgdGhlIHZlcnNpb24gc3RyaW5nIGFscmVhZHkgY29udGFpbnMgYWxsIHRhZ3MuCiAgICAgICAgaWYgc2VsZi52dGFncyBhbmQgdmVyc2lvbi5lbmRzd2l0aChzZWxmLnZ0YWdzKToKICAgICAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbiArIHNlbGYudnRhZ3MpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgaWYgc2VsZi50YWdfYnVpbGQ6CiAgICAgICAgICAgIHZlcnNpb24gKz0gc2VsZi50YWdfYnVpbGQKICAgICAgICBpZiBzZWxmLnRhZ19kYXRlOgogICAgICAgICAgICB2ZXJzaW9uICs9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQiKQogICAgICAgIHJldHVybiB2ZXJzaW9uCiAgICB2dGFncyA9IHByb3BlcnR5KHRhZ3MpCgoKY2xhc3MgZWdnX2luZm8oSW5mb0NvbW1vbiwgQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCd0YWctYnVpbGQ9JywgJ2InLCAiU3BlY2lmeSBleHBsaWNpdCB0YWcgdG8gYWRkIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCduby1kYXRlJywgJ0QnLCAiRG9uJ3QgaW5jbHVkZSBkYXRlIHN0YW1wIFtkZWZhdWx0XSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnXQogICAgbmVnYXRpdmVfb3B0ID0gewogICAgICAgICduby1kYXRlJzogJ3RhZy1kYXRlJywKICAgIH0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19pbmZvID0gTm9uZQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBGYWxzZQoKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyBhbGxvdyB0aGUgJ3RhZ19zdm5fcmV2aXNpb24nIHRvIGJlIGRldGVjdGVkIGFuZAogICAgIyBzZXQsIHN1cHBvcnRpbmcgc2Rpc3RzIGJ1aWx0IG9uIG9sZGVyIFNldHVwdG9vbHMuCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YWdfc3ZuX3JldmlzaW9uKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBAdGFnX3N2bl9yZXZpc2lvbi5zZXR0ZXIKICAgIGRlZiB0YWdfc3ZuX3JldmlzaW9uKHNlbGYsIHZhbHVlKToKICAgICAgICBwYXNzCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBkZWYgc2F2ZV92ZXJzaW9uX2luZm8oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIgogICAgICAgIE1hdGVyaWFsaXplIHRoZSB2YWx1ZSBvZiBkYXRlIGludG8gdGhlCiAgICAgICAgYnVpbGQgdGFnLiBJbnN0YWxsIGJ1aWxkIGtleXMgaW4gYSBkZXRlcm1pbmlzdGljIG9yZGVyCiAgICAgICAgdG8gYXZvaWQgYXJiaXRyYXJ5IHJlb3JkZXJpbmcgb24gc3Vic2VxdWVudCBidWlsZHMuCiAgICAgICAgIiIiCiAgICAgICAgZWdnX2luZm8gPSBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpCiAgICAgICAgIyBmb2xsb3cgdGhlIG9yZGVyIHRoZXNlIGtleXMgd291bGQgaGF2ZSBiZWVuIGFkZGVkCiAgICAgICAgIyB3aGVuIFBZVEhPTkhBU0hTRUVEPTAKICAgICAgICBlZ2dfaW5mb1sndGFnX2J1aWxkJ10gPSBzZWxmLnRhZ3MoKQogICAgICAgIGVnZ19pbmZvWyd0YWdfZGF0ZSddID0gMAogICAgICAgIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBkaWN0KGVnZ19pbmZvPWVnZ19pbmZvKSkKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICAjIE5vdGU6IHdlIG5lZWQgdG8gY2FwdHVyZSB0aGUgY3VycmVudCB2YWx1ZSByZXR1cm5lZAogICAgICAgICMgYnkgYHNlbGYudGFnZ2VkX3ZlcnNpb24oKWAsIHNvIHdlIGNhbiBsYXRlciB1cGRhdGUKICAgICAgICAjIGBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uYCB3aXRob3V0CiAgICAgICAgIyByZXBlcmN1c3Npb25zLgogICAgICAgIHNlbGYuZWdnX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gc2VsZi50YWdnZWRfdmVyc2lvbigpCiAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCgogICAgICAgIHRyeToKICAgICAgICAgICAgaXNfdmVyc2lvbiA9IGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pCiAgICAgICAgICAgIHNwZWMgPSAoCiAgICAgICAgICAgICAgICAiJXM9PSVzIiBpZiBpc192ZXJzaW9uIGVsc2UgIiVzPT09JXMiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cyhzcGVjICUgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBkaXN0cmlidXRpb24gbmFtZSBvciB2ZXJzaW9uIHN5bnRheDogJXMtJXMiICUKICAgICAgICAgICAgICAgIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgaXMgTm9uZToKICAgICAgICAgICAgZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLCBvcy5jdXJkaXIpCgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ2VnZ19iYXNlJykKICAgICAgICBzZWxmLmVnZ19pbmZvID0gdG9fZmlsZW5hbWUoc2VsZi5lZ2dfbmFtZSkgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIHNlbGYuZWdnX2luZm8pCiAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKCiAgICAgICAgIyBTZXQgcGFja2FnZSB2ZXJzaW9uIGZvciB0aGUgYmVuZWZpdCBvZiBkdW1iZXIgY29tbWFuZHMKICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQogICAgICAgICMKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgoKICAgICAgICAjIElmIHdlIGJvb3RzdHJhcHBlZCBhcm91bmQgdGhlIGxhY2sgb2YgYSBQS0ctSU5GTywgYXMgbWlnaHQgYmUgdGhlCiAgICAgICAgIyBjYXNlIGluIGEgZnJlc2ggY2hlY2tvdXQsIG1ha2Ugc3VyZSB0aGF0IGFueSBzcGVjaWFsIHRhZ3MgZ2V0IGFkZGVkCiAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCiAgICAgICAgIwogICAgICAgIHBkID0gc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdAogICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXkgPT0gc2VsZi5lZ2dfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBwZC5fdmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiB3cml0ZV9vcl9kZWxldGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIG9yIGRlbGV0ZSBpZiBlbXB0eQoKICAgICAgICBJZiBgZGF0YWAgaXMgbm9uLWVtcHR5LCB0aGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgYGB3cml0ZV9maWxlKClgYC4KICAgICAgICBJZiBgZGF0YWAgaXMgZW1wdHkgYnV0IG5vdCBgYE5vbmVgYCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nCiAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAogICAgICAgIHVubGVzcyBgZmlsZW5hbWVgIGV4aXN0cywgaW4gd2hpY2ggY2FzZSBhIHdhcm5pbmcgaXMgaXNzdWVkIGFib3V0IHRoZQogICAgICAgIG9ycGhhbmVkIGZpbGUgKGlmIGBmb3JjZWAgaXMgZmFsc2UpLCBvciBkZWxldGVkIChpZiBgZm9yY2VgIGlzIHRydWUpLgogICAgICAgICIiIgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZSh3aGF0LCBmaWxlbmFtZSwgZGF0YSkKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lIGFuZCBub3QgZm9yY2U6CiAgICAgICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlbmFtZSkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQKCiAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KICAgICAgICB0byB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgidXRmLTgiKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQogICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQiIiIKICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIG9zLnV0aW1lKHNlbGYuZWdnX2luZm8sIE5vbmUpCiAgICAgICAgaW5zdGFsbGVyID0gc2VsZi5kaXN0cmlidXRpb24uZmV0Y2hfYnVpbGRfZWdnCiAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdlZ2dfaW5mby53cml0ZXJzJyk6CiAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPWluc3RhbGxlcikKICAgICAgICAgICAgd3JpdGVyID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgIHdyaXRlcihzZWxmLCBlcC5uYW1lLCBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgZXAubmFtZSkpCgogICAgICAgICMgR2V0IHJpZCBvZiBuYXRpdmVfbGlicy50eHQgaWYgaXQgd2FzIHB1dCB0aGVyZSBieSBvbGRlciBiZGlzdF9lZ2cKICAgICAgICBubCA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhubCk6CiAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUobmwpCgogICAgICAgIHNlbGYuZmluZF9zb3VyY2VzKCkKCiAgICBkZWYgZmluZF9zb3VyY2VzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIFNPVVJDRVMudHh0IG1hbmlmZXN0IGZpbGUiIiIKICAgICAgICBtYW5pZmVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAiU09VUkNFUy50eHQiKQogICAgICAgIG1tID0gbWFuaWZlc3RfbWFrZXIoc2VsZi5kaXN0cmlidXRpb24pCiAgICAgICAgbW0ubWFuaWZlc3QgPSBtYW5pZmVzdF9maWxlbmFtZQogICAgICAgIG1tLnJ1bigpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IG1tLmZpbGVsaXN0CgogICAgZGVmIGNoZWNrX2Jyb2tlbl9lZ2dfaW5mbyhzZWxmKToKICAgICAgICBiZWkgPSBzZWxmLmVnZ19uYW1lICsgJy5lZ2ctaW5mbycKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgYmVpID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIGJlaSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhiZWkpOgogICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICItIiAqIDc4ICsgJ1xuJwogICAgICAgICAgICAgICAgIk5vdGU6IFlvdXIgY3VycmVudCAuZWdnLWluZm8gZGlyZWN0b3J5IGhhcyBhICctJyBpbiBpdHMgbmFtZTsiCiAgICAgICAgICAgICAgICAnXG50aGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggInNldHVwLnB5IGRldmVsb3AiLlxuXG4nCiAgICAgICAgICAgICAgICAnUGxlYXNlIHJlbmFtZSAlcyB0byAlcyB0byBjb3JyZWN0IHRoaXMgcHJvYmxlbS5cbicgKyAnLScgKiA3OCwKICAgICAgICAgICAgICAgIGJlaSwgc2VsZi5lZ2dfaW5mbwogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gc2VsZi5lZ2dfaW5mbwogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gYmVpICAjIG1ha2UgaXQgd29yayBmb3Igbm93CgoKY2xhc3MgRmlsZUxpc3QoX0ZpbGVMaXN0KToKICAgICMgSW1wbGVtZW50YXRpb25zIG9mIHRoZSB2YXJpb3VzIE1BTklGRVNULmluIGNvbW1hbmRzCgogICAgZGVmIHByb2Nlc3NfdGVtcGxhdGVfbGluZShzZWxmLCBsaW5lKToKICAgICAgICAjIFBhcnNlIHRoZSBsaW5lOiBzcGxpdCBpdCB1cCwgbWFrZSBzdXJlIHRoZSByaWdodCBudW1iZXIgb2Ygd29yZHMKICAgICAgICAjIGlzIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSByZWxldmFudCB3b3Jkcy4gICdhY3Rpb24nIGlzIGFsd2F5cwogICAgICAgICMgZGVmaW5lZDogaXQncyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZS4gIFdoaWNoIG9mIHRoZSBvdGhlcgogICAgICAgICMgdGhyZWUgYXJlIGRlZmluZWQgZGVwZW5kcyBvbiB0aGUgYWN0aW9uOyBpdCdsbCBiZSBlaXRoZXIKICAgICAgICAjIHBhdHRlcm5zLCAoZGlyIGFuZCBwYXR0ZXJucyksIG9yIChkaXJfcGF0dGVybikuCiAgICAgICAgKGFjdGlvbiwgcGF0dGVybnMsIGRpciwgZGlyX3BhdHRlcm4pID0gc2VsZi5fcGFyc2VfdGVtcGxhdGVfbGluZShsaW5lKQoKICAgICAgICAjIE9LLCBub3cgd2Uga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgdmFsaWQgYW5kIHdlIGhhdmUgdGhlCiAgICAgICAgIyByaWdodCBudW1iZXIgb2Ygd29yZHMgb24gdGhlIGxpbmUgZm9yIHRoYXQgYWN0aW9uIC0tIHNvIHdlCiAgICAgICAgIyBjYW4gcHJvY2VlZCB3aXRoIG1pbmltYWwgZXJyb3ItY2hlY2tpbmcuCiAgICAgICAgaWYgYWN0aW9uID09ICdpbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmluY2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcyciLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBtYXRjaGluZyAnJXMnIiksIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1pbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZ2xvYmFsX2luY2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWV4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9leGNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIGFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1pbmNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfaW5jbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicmVjdXJzaXZlLWV4Y2x1ZGUgJXMgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyLCAnICcuam9pbihwYXR0ZXJucykpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZV9leGNsdWRlKGRpciwgcGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgdW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdncmFmdCc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdyYWZ0ICIgKyBkaXJfcGF0dGVybikKICAgICAgICAgICAgaWYgbm90IHNlbGYuZ3JhZnQoZGlyX3BhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGRpcmVjdG9yaWVzIGZvdW5kIG1hdGNoaW5nICclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdwcnVuZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInBydW5lICIgKyBkaXJfcGF0dGVybikKICAgICAgICAgICAgaWYgbm90IHNlbGYucHJ1bmUoZGlyX3BhdHRlcm4pOgogICAgICAgICAgICAgICAgbG9nLndhcm4oKCJubyBwcmV2aW91c2x5LWluY2x1ZGVkIGRpcmVjdG9yaWVzIGZvdW5kICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hpbmcgJyVzJyIpLCBkaXJfcGF0dGVybikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcigKICAgICAgICAgICAgICAgICJ0aGlzIGNhbm5vdCBoYXBwZW46IGludmFsaWQgYWN0aW9uICclcyciICUgYWN0aW9uKQoKICAgIGRlZiBfcmVtb3ZlX2ZpbGVzKHNlbGYsIHByZWRpY2F0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIHRoZSBmaWxlIGxpc3QgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLgogICAgICAgIFJldHVybiBUcnVlIGlmIGFueSBtYXRjaGluZyBmaWxlcyB3ZXJlIHJlbW92ZWQKICAgICAgICAiIiIKICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmlsZXMpIC0gMSwgLTEsIC0xKToKICAgICAgICAgICAgaWYgcHJlZGljYXRlKHNlbGYuZmlsZXNbaV0pOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiIHJlbW92aW5nICIgKyBzZWxmLmZpbGVzW2ldKQogICAgICAgICAgICAgICAgZGVsIHNlbGYuZmlsZXNbaV0KICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgIHJldHVybiBmb3VuZAoKICAgIGRlZiBpbmNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIkluY2x1ZGUgZmlsZXMgdGhhdCBtYXRjaCAncGF0dGVybicuIiIiCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKHBhdHRlcm4pIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBleGNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIkV4Y2x1ZGUgZmlsZXMgdGhhdCBtYXRjaCAncGF0dGVybicuIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIHJlY3Vyc2l2ZV9pbmNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gJ2Rpci8nIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgZnVsbF9wYXR0ZXJuID0gb3MucGF0aC5qb2luKGRpciwgJyoqJywgcGF0dGVybikKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIGdsb2IoZnVsbF9wYXR0ZXJuLCByZWN1cnNpdmU9VHJ1ZSkKICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcmVjdXJzaXZlX2V4Y2x1ZGUoc2VsZiwgZGlyLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBFeGNsdWRlIGFueSBmaWxlIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJywgcGF0dGVybikpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ3JhZnQoc2VsZiwgZGlyKToKICAgICAgICAiIiJJbmNsdWRlIGFsbCBmaWxlcyBmcm9tICdkaXIvJy4iIiIKICAgICAgICBmb3VuZCA9IFsKICAgICAgICAgICAgaXRlbQogICAgICAgICAgICBmb3IgbWF0Y2hfZGlyIGluIGdsb2IoZGlyKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBkaXN0dXRpbHMuZmlsZWxpc3QuZmluZGFsbChtYXRjaF9kaXIpCiAgICAgICAgXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBwcnVuZShzZWxmLCBkaXIpOgogICAgICAgICIiIkZpbHRlciBvdXQgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oZGlyLCAnKionKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBnbG9iYWxfaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBJbmNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBtYXRjaCB0aGUKICAgICAgICBwYXR0ZXJuLiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQgb24gbGFyZ2UgZmlsZSB0cmVlcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmFsbGZpbGVzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZmluZGFsbCgpCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oJyoqJywgcGF0dGVybikpCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBzZWxmLmFsbGZpbGVzIGlmIG1hdGNoLm1hdGNoKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiBnbG9iYWxfZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBFeGNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKICAgICAgICBpZiBpdGVtLmVuZHN3aXRoKCdccicpOiAgIyBGaXggb2xkZXIgc2Rpc3RzIGJ1aWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgaXRlbSA9IGl0ZW1bOi0xXQogICAgICAgIHBhdGggPSBjb252ZXJ0X3BhdGgoaXRlbSkKCiAgICAgICAgaWYgc2VsZi5fc2FmZV9wYXRoKHBhdGgpOgogICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChwYXRoKQoKICAgIGRlZiBleHRlbmQoc2VsZiwgcGF0aHMpOgogICAgICAgIHNlbGYuZmlsZXMuZXh0ZW5kKGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHBhdGhzKSkKCiAgICBkZWYgX3JlcGFpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNlbGYuZmlsZXMgd2l0aCBvbmx5IHNhZmUgcGF0aHMKCiAgICAgICAgQmVjYXVzZSBzb21lIG93bmVycyBvZiBGaWxlTGlzdCBtYW5pcHVsYXRlIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgYGBmaWxlc2BgIGF0dHJpYnV0ZSBkaXJlY3RseSwgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgdG8KICAgICAgICByZXBhaXIgdGhvc2UgcGF0aHMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlcyA9IGxpc3QoZmlsdGVyKHNlbGYuX3NhZmVfcGF0aCwgc2VsZi5maWxlcykpCgogICAgZGVmIF9zYWZlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgZW5jX3dhcm4gPSAiJyVzJyBub3QgJXMgZW5jb2RhYmxlIC0tIHNraXBwaW5nIgoKICAgICAgICAjIFRvIGF2b2lkIGFjY2lkZW50YWwgdHJhbnMtY29kaW5ncyBlcnJvcnMsIGZpcnN0IHRvIHVuaWNvZGUKICAgICAgICB1X3BhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgaWYgdV9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKCInJXMnIGluIHVuZXhwZWN0ZWQgZW5jb2RpbmcgLS0gc2tpcHBpbmciICUgcGF0aCkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgTXVzdCBlbnN1cmUgdXRmLTggZW5jb2RhYmlsaXR5CiAgICAgICAgdXRmOF9wYXRoID0gdW5pY29kZV91dGlscy50cnlfZW5jb2RlKHVfcGF0aCwgInV0Zi04IikKICAgICAgICBpZiB1dGY4X3BhdGggaXMgTm9uZToKICAgICAgICAgICAgbG9nLndhcm4oZW5jX3dhcm4sIHBhdGgsICd1dGYtOCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgYWNjZXB0IGlzIGVpdGhlciB3YXkgY2hlY2tzIG91dAogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh1X3BhdGgpIG9yIG9zLnBhdGguZXhpc3RzKHV0ZjhfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICMgdGhpcyB3aWxsIGNhdGNoIGFueSBlbmNvZGUgZXJyb3JzIGRlY29kaW5nIHVfcGF0aAogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCgoKY2xhc3MgbWFuaWZlc3RfbWFrZXIoc2Rpc3QpOgogICAgdGVtcGxhdGUgPSAiTUFOSUZFU1QuaW4iCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVzZV9kZWZhdWx0cyA9IDEKICAgICAgICBzZWxmLnBydW5lID0gMQogICAgICAgIHNlbGYubWFuaWZlc3Rfb25seSA9IDEKICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBGaWxlTGlzdCgpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkgICMgaXQgbXVzdCBleGlzdCBzbyBpdCdsbCBnZXQgaW4gdGhlIGxpc3QKICAgICAgICBzZWxmLmFkZF9kZWZhdWx0cygpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50ZW1wbGF0ZSk6CiAgICAgICAgICAgIHNlbGYucmVhZF90ZW1wbGF0ZSgpCiAgICAgICAgc2VsZi5wcnVuZV9maWxlX2xpc3QoKQogICAgICAgIHNlbGYuZmlsZWxpc3Quc29ydCgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCiAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpCgogICAgZGVmIF9tYW5pZmVzdF9ub3JtYWxpemUoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IHVuaWNvZGVfdXRpbHMuZmlsZXN5c19kZWNvZGUocGF0aCkKICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKG9zLnNlcCwgJy8nKQoKICAgIGRlZiB3cml0ZV9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSB0aGUgZmlsZSBsaXN0IGluICdzZWxmLmZpbGVsaXN0JyB0byB0aGUgbWFuaWZlc3QgZmlsZQogICAgICAgIG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0Jy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVsaXN0Ll9yZXBhaXIoKQoKICAgICAgICAjIE5vdyBfcmVwYWlycyBzaG91bGQgZW5jb2RhYmlsaXR5LCBidXQgbm90IHVuaWNvZGUKICAgICAgICBmaWxlcyA9IFtzZWxmLl9tYW5pZmVzdF9ub3JtYWxpemUoZikgZm9yIGYgaW4gc2VsZi5maWxlbGlzdC5maWxlc10KICAgICAgICBtc2cgPSAid3JpdGluZyBtYW5pZmVzdCBmaWxlICclcyciICUgc2VsZi5tYW5pZmVzdAogICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLCAoc2VsZi5tYW5pZmVzdCwgZmlsZXMpLCBtc2cpCgogICAgZGVmIHdhcm4oc2VsZiwgbXNnKToKICAgICAgICBpZiBub3Qgc2VsZi5fc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAgICAgc2Rpc3Qud2FybihzZWxmLCBtc2cpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zaG91bGRfc3VwcHJlc3Nfd2FybmluZyhtc2cpOgogICAgICAgICIiIgogICAgICAgIHN1cHByZXNzIG1pc3NpbmctZmlsZSB3YXJuaW5ncyBmcm9tIHNkaXN0CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHJlLm1hdGNoKHIic3RhbmRhcmQgZmlsZSAuKm5vdCBmb3VuZCIsIG1zZykKCiAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgogICAgICAgIHNkaXN0LmFkZF9kZWZhdWx0cyhzZWxmKQogICAgICAgIHNlbGYuY2hlY2tfbGljZW5zZSgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi50ZW1wbGF0ZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLm1hbmlmZXN0KQogICAgICAgIHJjZmlsZXMgPSBsaXN0KHdhbGtfcmV2Y3RybCgpKQogICAgICAgIGlmIHJjZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKHJjZmlsZXMpCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi5yZWFkX21hbmlmZXN0KCkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoInNldHVwLnB5Iik6CiAgICAgICAgICAgICMgc2V0dXAucHkgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGV2ZW4gaWYgaXQncyBub3QKICAgICAgICAgICAgIyB0aGUgc2NyaXB0IGNhbGxlZCB0byBjcmVhdGUgdGhlIHNkaXN0CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKCJzZXR1cC5weSIpCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdC5ncmFmdChlaV9jbWQuZWdnX2luZm8pCgogICAgZGVmIHBydW5lX2ZpbGVfbGlzdChzZWxmKToKICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYnVpbGQuYnVpbGRfYmFzZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJhc2VfZGlyKQogICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4ocicoXnwnICsgc2VwICsgcicpKFJDU3xDVlN8XC5zdm4pJyArIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD0xKQoKCmRlZiB3cml0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50cyk6CiAgICAiIiJDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB3cml0ZSAnY29udGVudHMnIChhCiAgICBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9ycykgdG8gaXQuCiAgICAiIiIKICAgIGNvbnRlbnRzID0gIlxuIi5qb2luKGNvbnRlbnRzKQoKICAgICMgYXNzdW1pbmcgdGhlIGNvbnRlbnRzIGhhcyBiZWVuIHZldHRlZCBmb3IgdXRmLTggZW5jb2RpbmcKICAgIGNvbnRlbnRzID0gY29udGVudHMuZW5jb2RlKCJ1dGYtOCIpCgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAid2IiKSBhcyBmOiAgIyBhbHdheXMgd3JpdGUgUE9TSVgtc3R5bGUgbWFuaWZlc3QKICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQoKCmRlZiB3cml0ZV9wa2dfaW5mbyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGNtZC5kcnlfcnVuOgogICAgICAgIG1ldGFkYXRhID0gY21kLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIG1ldGFkYXRhLm5hbWUsIG9sZG5hbWUgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHdyaXRlIHVuZXNjYXBlZCBkYXRhIHRvIFBLRy1JTkZPLCBzbyBvbGRlciBwa2dfcmVzb3VyY2VzCiAgICAgICAgICAgICMgY2FuIHN0aWxsIHBhcnNlIGl0CiAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uID0gb2xkbmFtZSwgb2xkdmVyCgogICAgICAgIHNhZmUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCgogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhjbWQuZWdnX2luZm8sIHNhZmUpCgoKZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICApCgoKZGVmIF93cml0ZV9yZXF1aXJlbWVudHMoc3RyZWFtLCByZXFzKToKICAgIGxpbmVzID0geWllbGRfbGluZXMocmVxcyBvciAoKSkKICAgIGFwcGVuZF9jciA9IGxhbWJkYSBsaW5lOiBsaW5lICsgJ1xuJwogICAgbGluZXMgPSBtYXAoYXBwZW5kX2NyLCBsaW5lcykKICAgIHN0cmVhbS53cml0ZWxpbmVzKGxpbmVzKQoKCmRlZiB3cml0ZV9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGlzdCA9IGNtZC5kaXN0cmlidXRpb24KICAgIGRhdGEgPSBzaXguU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICBleHRyYXNfcmVxdWlyZSA9IGRpc3QuZXh0cmFzX3JlcXVpcmUgb3Ige30KICAgIGZvciBleHRyYSBpbiBzb3J0ZWQoZXh0cmFzX3JlcXVpcmUpOgogICAgICAgIGRhdGEud3JpdGUoJ1xuW3tleHRyYX1dXG4nLmZvcm1hdCgqKnZhcnMoKSkpCiAgICAgICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBleHRyYXNfcmVxdWlyZVtleHRyYV0pCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3NldHVwX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkYXRhID0gaW8uU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBjbWQuZGlzdHJpYnV0aW9uLnNldHVwX3JlcXVpcmVzKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJzZXR1cC1yZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV90b3BsZXZlbF9uYW1lcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKICAgICAgICBbCiAgICAgICAgICAgIGsuc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKICAgICAgICBdCiAgICApCiAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihzb3J0ZWQocGtncykpICsgJ1xuJykKCgpkZWYgb3ZlcndyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIFRydWUpCgoKZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgogICAgYXJnbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICB2YWx1ZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgYXJnbmFtZSwgTm9uZSkKICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgIHZhbHVlID0gJ1xuJy5qb2luKHZhbHVlKSArICdcbicKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQoKCmRlZiB3cml0ZV9lbnRyaWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGVwID0gY21kLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMKCiAgICBpZiBpc2luc3RhbmNlKGVwLCBzaXguc3RyaW5nX3R5cGVzKSBvciBlcCBpcyBOb25lOgogICAgICAgIGRhdGEgPSBlcAogICAgZWxpZiBlcCBpcyBub3QgTm9uZToKICAgICAgICBkYXRhID0gW10KICAgICAgICBmb3Igc2VjdGlvbiwgY29udGVudHMgaW4gc29ydGVkKGVwLml0ZW1zKCkpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCiAgICAgICAgICAgICAgICBjb250ZW50cyA9ICdcbicuam9pbihzb3J0ZWQobWFwKHN0ciwgY29udGVudHMudmFsdWVzKCkpKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ1slc11cbiVzXG5cbicgJSAoc2VjdGlvbiwgY29udGVudHMpKQogICAgICAgIGRhdGEgPSAnJy5qb2luKGRhdGEpCgogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCdlbnRyeSBwb2ludHMnLCBmaWxlbmFtZSwgZGF0YSwgVHJ1ZSkKCgpkZWYgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCk6CiAgICAiIiIKICAgIEdldCBhIC1yIyMjIG9mZiBvZiBQS0ctSU5GTyBWZXJzaW9uIGluIGNhc2UgdGhpcyBpcyBhbiBzZGlzdCBvZgogICAgYSBzdWJ2ZXJzaW9uIHJldmlzaW9uLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCJnZXRfcGtnX2luZm9fcmV2aXNpb24gaXMgZGVwcmVjYXRlZC4iLCBFZ2dJbmZvRGVwcmVjYXRpb25XYXJuaW5nKQogICAgaWYgb3MucGF0aC5leGlzdHMoJ1BLRy1JTkZPJyk6CiAgICAgICAgd2l0aCBpby5vcGVuKCdQS0ctSU5GTycpIGFzIGY6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiVmVyc2lvbjouKi1yKFxkKylccyokIiwgbGluZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoMSkpCiAgICByZXR1cm4gMAoKCmNsYXNzIEVnZ0luZm9EZXByZWNhdGlvbldhcm5pbmcoU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiJDbGFzcyBmb3Igd2FybmluZyBhYm91dCBkZXByZWNhdGlvbnMgaW4gZWdnSW5mbyBpbiBzZXR1cFRvb2xzLiBOb3QgaWdub3JlZCBieSBkZWZhdWx0LCB1bmxpa2UgRGVwcmVjYXRpb25XYXJuaW5nLiIiIgpQSwMEFAAAAAAAAAAhAFBhEaxhEgAAYRIAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHlmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yCmltcG9ydCBpbnNwZWN0CmltcG9ydCBnbG9iCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgYXMgb3JpZwoKaW1wb3J0IHNldHVwdG9vbHMKCiMgUHJpb3IgdG8gbnVtcHkgMS45LCBOdW1QeSByZWxpZXMgb24gdGhlICdfaW5zdGFsbCcgbmFtZSwgc28gcHJvdmlkZSBpdCBmb3IKIyBub3cuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xOTkvCl9pbnN0YWxsID0gb3JpZy5pbnN0YWxsCgoKY2xhc3MgaW5zdGFsbChvcmlnLmluc3RhbGwpOgogICAgIiIiVXNlIGVhc3lfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLCB3L2RlcGVuZGVuY2llcyIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IG9yaWcuaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCdvbGQtYW5kLXVubWFuYWdlYWJsZScsIE5vbmUsICJUcnkgbm90IHRvIHVzZSB0aGlzISIpLAogICAgICAgICgnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywgTm9uZSwKICAgICAgICAgInVzZWQgYnkgc3lzdGVtIHBhY2thZ2UgYnVpbGRlcnMgdG8gY3JlYXRlICdmbGF0JyBlZ2dzIiksCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSBvcmlnLmluc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWwogICAgICAgICdvbGQtYW5kLXVubWFuYWdlYWJsZScsICdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLAogICAgXQogICAgbmV3X2NvbW1hbmRzID0gWwogICAgICAgICgnaW5zdGFsbF9lZ2dfaW5mbycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKICAgICAgICAoJ2luc3RhbGxfc2NyaXB0cycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKICAgIF0KICAgIF9uYyA9IGRpY3QobmV3X2NvbW1hbmRzKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYub2xkX2FuZF91bm1hbmFnZWFibGUgPSBOb25lCiAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnJvb3Q6CiAgICAgICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gVHJ1ZQogICAgICAgIGVsaWYgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJvb3QgYW5kIG5vdCBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IC0tcmVjb3JkIG9yIC0tcm9vdCB3aGVuIGJ1aWxkaW5nIHN5c3RlbSIKICAgICAgICAgICAgICAgICAgICAiIHBhY2thZ2VzIgogICAgICAgICAgICAgICAgKQoKICAgIGRlZiBoYW5kbGVfZXh0cmFfcGF0aChzZWxmKToKICAgICAgICBpZiBzZWxmLnJvb3Qgb3Igc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgICMgZXhwbGljaXQgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlLCBhbGxvdyBleHRyYV9wYXRoIHRvIHdvcmsKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbC5oYW5kbGVfZXh0cmFfcGF0aChzZWxmKQoKICAgICAgICAjIElnbm9yZSBleHRyYV9wYXRoIHdoZW4gaW5zdGFsbGluZyBhbiBlZ2cgKG9yIGJlaW5nIHJ1biBieSBhbm90aGVyCiAgICAgICAgIyBjb21tYW5kIHdpdGhvdXQgLS1yb290IG9yIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkCiAgICAgICAgc2VsZi5wYXRoX2ZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYV9kaXJzID0gJycKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgRXhwbGljaXQgcmVxdWVzdCBmb3Igb2xkLXN0eWxlIGluc3RhbGw/ICBKdXN0IGRvIGl0CiAgICAgICAgaWYgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbC5ydW4oc2VsZikKCiAgICAgICAgaWYgbm90IHNlbGYuX2NhbGxlZF9mcm9tX3NldHVwKGluc3BlY3QuY3VycmVudGZyYW1lKCkpOgogICAgICAgICAgICAjIFJ1biBpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUgdG8gc3VwcG9ydCBiZGlzdF8qIGNvbW1hbmRzLgogICAgICAgICAgICBvcmlnLmluc3RhbGwucnVuKHNlbGYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kb19lZ2dfaW5zdGFsbCgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jYWxsZWRfZnJvbV9zZXR1cChydW5fZnJhbWUpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gZGV0ZWN0IHdoZXRoZXIgcnVuKCkgd2FzIGNhbGxlZCBmcm9tIHNldHVwKCkgb3IgYnkgYW5vdGhlcgogICAgICAgIGNvbW1hbmQuICBJZiBjYWxsZWQgYnkgc2V0dXAoKSwgdGhlIHBhcmVudCBjYWxsZXIgd2lsbCBiZSB0aGUKICAgICAgICAncnVuX2NvbW1hbmQnIG1ldGhvZCBpbiAnZGlzdHV0aWxzLmRpc3QnLCBhbmQgKml0cyogY2FsbGVyIHdpbGwgYmUKICAgICAgICB0aGUgJ3J1bl9jb21tYW5kcycgbWV0aG9kLiAgSWYgY2FsbGVkIGFueSBvdGhlciB3YXksIHRoZQogICAgICAgIGltbWVkaWF0ZSBjYWxsZXIgKm1pZ2h0KiBiZSAncnVuX2NvbW1hbmQnLCBidXQgaXQgd29uJ3QgaGF2ZSBiZWVuCiAgICAgICAgY2FsbGVkIGJ5ICdydW5fY29tbWFuZHMnLiBSZXR1cm4gVHJ1ZSBpbiB0aGF0IGNhc2Ugb3IgaWYgYSBjYWxsIHN0YWNrCiAgICAgICAgaXMgdW5hdmFpbGFibGUuIFJldHVybiBGYWxzZSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgcnVuX2ZyYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIG1zZyA9ICJDYWxsIHN0YWNrIG5vdCBhdmFpbGFibGUuIGJkaXN0XyogY29tbWFuZHMgbWF5IGZhaWwuIgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKICAgICAgICAgICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gJ0lyb25QeXRob24nOgogICAgICAgICAgICAgICAgbXNnID0gIkZvciBiZXN0IHJlc3VsdHMsIHBhc3MgLVg6RnJhbWVzIHRvIGVuYWJsZSBjYWxsIHN0YWNrLiIKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJlcyA9IGluc3BlY3QuZ2V0b3V0ZXJmcmFtZXMocnVuX2ZyYW1lKVsyXQogICAgICAgIGNhbGxlciwgPSByZXNbOjFdCiAgICAgICAgaW5mbyA9IGluc3BlY3QuZ2V0ZnJhbWVpbmZvKGNhbGxlcikKICAgICAgICBjYWxsZXJfbW9kdWxlID0gY2FsbGVyLmZfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJywgJycpCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgY2FsbGVyX21vZHVsZSA9PSAnZGlzdHV0aWxzLmRpc3QnCiAgICAgICAgICAgIGFuZCBpbmZvLmZ1bmN0aW9uID09ICdydW5fY29tbWFuZHMnCiAgICAgICAgKQoKICAgIGRlZiBkb19lZ2dfaW5zdGFsbChzZWxmKToKCiAgICAgICAgZWFzeV9pbnN0YWxsID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3MoJ2Vhc3lfaW5zdGFsbCcpCgogICAgICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24sIGFyZ3M9IngiLCByb290PXNlbGYucm9vdCwgcmVjb3JkPXNlbGYucmVjb3JkLAogICAgICAgICkKICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpICAjIGZpbmFsaXplIGJlZm9yZSBiZGlzdF9lZ2cgbXVuZ2VzIGluc3RhbGwgY21kCiAgICAgICAgY21kLmFsd2F5c19jb3B5X2Zyb20gPSAnLicgICMgbWFrZSBzdXJlIGxvY2FsLWRpciBlZ2dzIGdldCBpbnN0YWxsZWQKCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIGNtZC5wYWNrYWdlX2luZGV4LnNjYW4oZ2xvYi5nbG9iKCcqLmVnZycpKQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdiZGlzdF9lZ2cnKQogICAgICAgIGFyZ3MgPSBbc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCdiZGlzdF9lZ2cnKS5lZ2dfb3V0cHV0XQoKICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CiAgICAgICAgICAgICMgQm9vdHN0cmFwIHNlbGYtaW5zdGFsbGF0aW9uIG9mIHNldHVwdG9vbHMKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tKQoKICAgICAgICBjbWQuYXJncyA9IGFyZ3MKICAgICAgICBjbWQucnVuKHNob3dfZGVwcmVjYXRpb249RmFsc2UpCiAgICAgICAgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKCiMgWFhYIFB5dGhvbiAzLjEgZG9lc24ndCBzZWUgX25jIGlmIHRoaXMgaXMgaW5zaWRlIHRoZSBjbGFzcwppbnN0YWxsLnN1Yl9jb21tYW5kcyA9ICgKICAgIFtjbWQgZm9yIGNtZCBpbiBvcmlnLmluc3RhbGwuc3ViX2NvbW1hbmRzIGlmIGNtZFswXSBub3QgaW4gaW5zdGFsbC5fbmNdICsKICAgIGluc3RhbGwubmV3X2NvbW1hbmRzCikKUEsDBBQAAAAAAAAAIQBc0qjlmwgAAJsIAABLAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKaW1wb3J0IG9zCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCmltcG9ydCBwa2dfcmVzb3VyY2VzCgoKY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhuYW1lc3BhY2VzLkluc3RhbGxlciwgQ29tbWFuZCk6CiAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIiIiCgogICAgZGVzY3JpcHRpb24gPSAiSW5zdGFsbCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0byIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kaXInKSkKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGJhc2VuYW1lID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uCiAgICAgICAgKS5lZ2dfbmFtZSgpICsgJy5lZ2ctaW5mbycKICAgICAgICBzZWxmLnNvdXJjZSA9IGVpX2NtZC5lZ2dfaW5mbwogICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQogICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLnRhcmdldCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhzZWxmLnRhcmdldCk6CiAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKHNlbGYudGFyZ2V0LCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFyZ2V0KToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywgKHNlbGYudGFyZ2V0LCksICJSZW1vdmluZyAiICsgc2VsZi50YXJnZXQpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5lbnN1cmVfZGlyZWN0b3J5KHNlbGYudGFyZ2V0KQogICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgc2VsZi5jb3B5dHJlZSwgKCksICJDb3B5aW5nICVzIHRvICVzIiAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpCiAgICAgICAgKQogICAgICAgIHNlbGYuaW5zdGFsbF9uYW1lc3BhY2VzKCkKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYub3V0cHV0cwoKICAgIGRlZiBjb3B5dHJlZShzZWxmKToKICAgICAgICAjIENvcHkgdGhlIC5lZ2ctaW5mbyB0cmVlIHRvIHNpdGUtcGFja2FnZXMKICAgICAgICBkZWYgc2tpbW1lcihzcmMsIGRzdCk6CiAgICAgICAgICAgICMgZmlsdGVyIG91dCBzb3VyY2UtY29udHJvbCBkaXJlY3Rvcmllczsgbm90ZSB0aGF0ICdzcmMnIGlzIGFsd2F5cwogICAgICAgICAgICAjIGEgJy8nLXNlcGFyYXRlZCBwYXRoLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiAgJ2RzdCcgaXMgYQogICAgICAgICAgICAjIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguCiAgICAgICAgICAgIGZvciBza2lwIGluICcuc3ZuLycsICdDVlMvJzoKICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKHNraXApIG9yICcvJyArIHNraXAgaW4gc3JjOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZHN0KQogICAgICAgICAgICBsb2cuZGVidWcoIkNvcHlpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfYXJjaGl2ZShzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQsIHNraW1tZXIpClBLAwQUAAAAAAAAACEAEtOMKhYPAAAWDwAARgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcHJvZHVjdCwgc3Rhcm1hcAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIgYXMgb3JpZwoKCmNsYXNzIGluc3RhbGxfbGliKG9yaWcuaW5zdGFsbF9saWIpOgogICAgIiIiRG9uJ3QgYWRkIGNvbXBpbGVkIGZsYWdzIHRvIGZpbGVuYW1lcyBvZiBub24tUHl0aG9uIGZpbGVzIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmJ1aWxkKCkKICAgICAgICBvdXRmaWxlcyA9IHNlbGYuaW5zdGFsbCgpCiAgICAgICAgaWYgb3V0ZmlsZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgYWx3YXlzIGNvbXBpbGUsIGluIGNhc2Ugd2UgaGF2ZSBhbnkgZXh0ZW5zaW9uIHN0dWJzIHRvIGRlYWwgd2l0aAogICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvdXRmaWxlcykKCiAgICBkZWYgZ2V0X2V4Y2x1c2lvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY29sbGVjdGlvbnMuU2l6ZWQgY29sbGVjdGlvbnMuQ29udGFpbmVyIG9mIHBhdGhzIHRvIGJlCiAgICAgICAgZXhjbHVkZWQgZm9yIHNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCBpbnN0YWxsYXRpb25zLgogICAgICAgICIiIgogICAgICAgIGFsbF9wYWNrYWdlcyA9ICgKICAgICAgICAgICAgcGtnCiAgICAgICAgICAgIGZvciBuc19wa2cgaW4gc2VsZi5fZ2V0X1NWRU1fTlNQcygpCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fYWxsX3BhY2thZ2VzKG5zX3BrZykKICAgICAgICApCgogICAgICAgIGV4Y2xfc3BlY3MgPSBwcm9kdWN0KGFsbF9wYWNrYWdlcywgc2VsZi5fZ2VuX2V4Y2x1c2lvbl9wYXRocygpKQogICAgICAgIHJldHVybiBzZXQoc3Rhcm1hcChzZWxmLl9leGNsdWRlX3BrZ19wYXRoLCBleGNsX3NwZWNzKSkKCiAgICBkZWYgX2V4Y2x1ZGVfcGtnX3BhdGgoc2VsZiwgcGtnLCBleGNsdXNpb25fcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBwYWNrYWdlIG5hbWUgYW5kIGV4Y2x1c2lvbiBwYXRoIHdpdGhpbiB0aGF0IHBhY2thZ2UsCiAgICAgICAgY29tcHV0ZSB0aGUgZnVsbCBleGNsdXNpb24gcGF0aC4KICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpICsgW2V4Y2x1c2lvbl9wYXRoXQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgKnBhcnRzKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYWxsX3BhY2thZ2VzKHBrZ19uYW1lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbGlzdChpbnN0YWxsX2xpYi5fYWxsX3BhY2thZ2VzKCdmb28uYmFyLmJheicpKQogICAgICAgIFsnZm9vLmJhci5iYXonLCAnZm9vLmJhcicsICdmb28nXQogICAgICAgICIiIgogICAgICAgIHdoaWxlIHBrZ19uYW1lOgogICAgICAgICAgICB5aWVsZCBwa2dfbmFtZQogICAgICAgICAgICBwa2dfbmFtZSwgc2VwLCBjaGlsZCA9IHBrZ19uYW1lLnJwYXJ0aXRpb24oJy4nKQoKICAgIGRlZiBfZ2V0X1NWRU1fTlNQcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgbmFtZXNwYWNlIHBhY2thZ2VzIChsaXN0KSBidXQgb25seSBmb3IKICAgICAgICBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucyBhbmQgZW1wdHkgb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgICMgVE9ETzogaXMgaXQgbmVjZXNzYXJ5IHRvIHNob3J0LWNpcmN1aXQgaGVyZT8gaS5lLiB3aGF0J3MgdGhlIGNvc3QKICAgICAgICAjIGlmIGdldF9maW5hbGl6ZWRfY29tbWFuZCBpcyBjYWxsZWQgZXZlbiB3aGVuIG5hbWVzcGFjZV9wYWNrYWdlcyBpcwogICAgICAgICMgRmFsc2U/CiAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGluc3RhbGxfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQogICAgICAgIHN2ZW0gPSBpbnN0YWxsX2NtZC5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcyBpZiBzdmVtIGVsc2UgW10KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dlbl9leGNsdXNpb25fcGF0aHMoKToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBmaWxlIHBhdGhzIHRvIGJlIGV4Y2x1ZGVkIGZvciBuYW1lc3BhY2UgcGFja2FnZXMgKGJ5dGVjb2RlCiAgICAgICAgY2FjaGUgZmlsZXMpLgogICAgICAgICIiIgogICAgICAgICMgYWx3YXlzIGV4Y2x1ZGUgdGhlIHBhY2thZ2UgbW9kdWxlIGl0c2VsZgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weScKCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5YycKICAgICAgICB5aWVsZCAnX19pbml0X18ucHlvJwoKICAgICAgICBpZiBub3QgaGFzYXR0cihzeXMsICdpbXBsZW1lbnRhdGlvbicpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbignX19weWNhY2hlX18nLCAnX19pbml0X18uJyArIHN5cy5pbXBsZW1lbnRhdGlvbi5jYWNoZV90YWcpCiAgICAgICAgeWllbGQgYmFzZSArICcucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5bycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMS5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTIucHljJwoKICAgIGRlZiBjb3B5X3RyZWUoCiAgICAgICAgICAgIHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLCBsZXZlbD0xCiAgICApOgogICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQoKICAgICAgICBpZiBub3QgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKCiAgICAgICAgIyBFeGNsdWRlIG5hbWVzcGFjZSBwYWNrYWdlIF9faW5pdF9fLnB5KiBmaWxlcyBmcm9tIHRoZSBvdXRwdXQKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2RpcmVjdG9yeQogICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCiAgICAgICAgb3V0ZmlsZXMgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QgaW4gZXhjbHVkZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgJXMgKG5hbWVzcGFjZSBwYWNrYWdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfZGlyZWN0b3J5KGluZmlsZSwgb3V0ZmlsZSwgcGYpCiAgICAgICAgcmV0dXJuIG91dGZpbGVzCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIG91dHB1dHMgPSBvcmlnLmluc3RhbGxfbGliLmdldF9vdXRwdXRzKHNlbGYpCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQogICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBvdXRwdXRzIGlmIGYgbm90IGluIGV4Y2x1ZGVdCiAgICAgICAgcmV0dXJuIG91dHB1dHMKUEsDBBQAAAAAAAAAIQBGP/EehwkAAIcJAABKAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgZW5zdXJlX2RpcmVjdG9yeQoKCmNsYXNzIGluc3RhbGxfc2NyaXB0cyhvcmlnLmluc3RhbGxfc2NyaXB0cyk6CiAgICAiIiJEbyBub3JtYWwgc2NyaXB0IGluc3RhbGwsIHBsdXMgYW55IGVnZ19pbmZvIHdyYXBwZXIgc2NyaXB0cyIiIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5ub19lcCA9IEZhbHNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpbXBvcnQgc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBhcyBlaQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMucnVuKHNlbGYpICAjIHJ1biBmaXJzdCB0byBzZXQgdXAgc2VsZi5vdXRmaWxlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQogICAgICAgIGlmIHNlbGYubm9fZXA6CiAgICAgICAgICAgICMgZG9uJ3QgaW5zdGFsbCBlbnRyeSBwb2ludCBzY3JpcHRzIGludG8gLmVnZyBmaWxlIQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBlaV9jbWQuZWdnX2Jhc2UsIFBhdGhNZXRhZGF0YShlaV9jbWQuZWdnX2Jhc2UsIGVpX2NtZC5lZ2dfaW5mbyksCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICkKICAgICAgICBic19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgZXhlY19wYXJhbSA9IGdldGF0dHIoYnNfY21kLCAnZXhlY3V0YWJsZScsIE5vbmUpCiAgICAgICAgYndfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJkaXN0X3dpbmluc3QiKQogICAgICAgIGlzX3dpbmluc3QgPSBnZXRhdHRyKGJ3X2NtZCwgJ19pc19ydW5uaW5nJywgRmFsc2UpCiAgICAgICAgd3JpdGVyID0gZWkuU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgaXNfd2luaW5zdDoKICAgICAgICAgICAgZXhlY19wYXJhbSA9ICJweXRob24uZXhlIgogICAgICAgICAgICB3cml0ZXIgPSBlaS5XaW5kb3dzU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgZXhlY19wYXJhbSA9PSBzeXMuZXhlY3V0YWJsZToKICAgICAgICAgICAgIyBJbiBjYXNlIHRoZSBwYXRoIHRvIHRoZSBQeXRob24gZXhlY3V0YWJsZSBjb250YWlucyBhIHNwYWNlLCB3cmFwCiAgICAgICAgICAgICMgaXQgc28gaXQncyBub3Qgc3BsaXQgdXAuCiAgICAgICAgICAgIGV4ZWNfcGFyYW0gPSBbZXhlY19wYXJhbV0KICAgICAgICAjIHJlc29sdmUgdGhlIHdyaXRlciB0byB0aGUgZW52aXJvbm1lbnQKICAgICAgICB3cml0ZXIgPSB3cml0ZXIuYmVzdCgpCiAgICAgICAgY21kID0gd3JpdGVyLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjX3BhcmFtKQogICAgICAgIGZvciBhcmdzIGluIHdyaXRlci5nZXRfYXJncyhkaXN0LCBjbWQuYXNfaGVhZGVyKCkpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsICppZ25vcmVkKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBjaG1vZCwgY3VycmVudF91bWFzawoKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQodGFyZ2V0KQoKICAgICAgICBtYXNrID0gY3VycmVudF91bWFzaygpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgInciICsgbW9kZSkKICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQpQSwMEFAAAAAAAAAAhAH1zYL96EwAAehMAAEUAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHlpbXBvcnQgb3MKZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCBzZGlzdAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcgoKCmNsYXNzIHNkaXN0X2FkZF9kZWZhdWx0czoKICAgICIiIgogICAgTWl4LWluIHByb3ZpZGluZyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIGZ1bmN0aW9uYWxpdHkgYXMgZm91bmQgaW4KICAgIGRpc3R1dGlscyBvbiBQeXRob24gMy43LgoKICAgIERvIG5vdCBlZGl0IHRoZSBjb2RlIGluIHRoaXMgY2xhc3MgZXhjZXB0IHRvIHVwZGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBhcyBpbXBsZW1lbnRlZCBpbiBkaXN0dXRpbHMuIEluc3RlYWQsIG92ZXJyaWRlIGluIHRoZSBzdWJjbGFzcy4KICAgICIiIgoKICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgIiIiQWRkIGFsbCB0aGUgZGVmYXVsdCBmaWxlcyB0byBzZWxmLmZpbGVsaXN0OgogICAgICAgICAgLSBSRUFETUUgb3IgUkVBRE1FLnR4dAogICAgICAgICAgLSBzZXR1cC5weQogICAgICAgICAgLSB0ZXN0L3Rlc3QqLnB5CiAgICAgICAgICAtIGFsbCBwdXJlIFB5dGhvbiBtb2R1bGVzIG1lbnRpb25lZCBpbiBzZXR1cCBzY3JpcHQKICAgICAgICAgIC0gYWxsIGZpbGVzIHBvaW50ZWQgYnkgcGFja2FnZV9kYXRhIChidWlsZF9weSkKICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgaW4gZGF0YV9maWxlcy4KICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgYXMgc2NyaXB0cy4KICAgICAgICAgIC0gYWxsIEMgc291cmNlcyBsaXN0ZWQgYXMgcGFydCBvZiBleHRlbnNpb25zIG9yIEMgbGlicmFyaWVzCiAgICAgICAgICAgIGluIHRoZSBzZXR1cCBzY3JpcHQgKGRvZXNuJ3QgY2F0Y2ggQyBoZWFkZXJzISkKICAgICAgICBXYXJucyBpZiAoUkVBRE1FIG9yIFJFQURNRS50eHQpIG9yIHNldHVwLnB5IGFyZSBtaXNzaW5nOyBldmVyeXRoaW5nCiAgICAgICAgZWxzZSBpcyBvcHRpb25hbC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc3RhbmRhcmRzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19weXRob24oKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZXh0KCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfY19saWJzKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfc2NyaXB0cygpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jc19wYXRoX2V4aXN0cyhmc3BhdGgpOgogICAgICAgICIiIgogICAgICAgIENhc2Utc2Vuc2l0aXZlIHBhdGggZXhpc3RlbmNlIGNoZWNrCgogICAgICAgID4+PiBzZGlzdF9hZGRfZGVmYXVsdHMuX2NzX3BhdGhfZXhpc3RzKF9fZmlsZV9fKQogICAgICAgIFRydWUKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXy51cHBlcigpKQogICAgICAgIEZhbHNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZzcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgbWFrZSBhYnNvbHV0ZSBzbyB3ZSBhbHdheXMgaGF2ZSBhIGRpcmVjdG9yeQogICAgICAgIGFic3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZnNwYXRoKQogICAgICAgIGRpcmVjdG9yeSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGFic3BhdGgpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcyhzZWxmKToKICAgICAgICBzdGFuZGFyZHMgPSBbc2VsZi5SRUFETUVTLCBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZV0KICAgICAgICBmb3IgZm4gaW4gc3RhbmRhcmRzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZuLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBhbHRzID0gZm4KICAgICAgICAgICAgICAgIGdvdF9pdCA9IEZhbHNlCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gYWx0czoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9pdCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgaWYgbm90IGdvdF9pdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInN0YW5kYXJkIGZpbGUgbm90IGZvdW5kOiBzaG91bGQgaGF2ZSBvbmUgb2YgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihhbHRzKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NzX3BhdGhfZXhpc3RzKGZuKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlICclcycgbm90IGZvdW5kIiAlIGZuKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX29wdGlvbmFsKHNlbGYpOgogICAgICAgIG9wdGlvbmFsID0gWyd0ZXN0L3Rlc3QqLnB5JywgJ3NldHVwLmNmZyddCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gb3B0aW9uYWw6CiAgICAgICAgICAgIGZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9iKHBhdHRlcm4pKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChmaWxlcykKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIyBidWlsZF9weSBpcyB1c2VkIHRvIGdldDoKICAgICAgICAjICAtIHB5dGhvbiBtb2R1bGVzCiAgICAgICAgIyAgLSBmaWxlcyBkZWZpbmVkIGluIHBhY2thZ2VfZGF0YQogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKCiAgICAgICAgIyBnZXR0aW5nIHB5dGhvbiBmaWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgICAgICAjIGdldHRpbmcgcGFja2FnZV9kYXRhIGZpbGVzCiAgICAgICAgIyAoY29tcHV0ZWQgaW4gYnVpbGRfcHkuZGF0YV9maWxlcyBieSBidWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKQogICAgICAgIGZvciBwa2csIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgIyBnZXR0aW5nIGRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2RhdGFfZmlsZXMoKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgc3RyKToKICAgICAgICAgICAgICAgICAgICAjIHBsYWluIGZpbGUKICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29udmVydF9wYXRoKGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgYSAoZGlybmFtZSwgZmlsZW5hbWVzKSB0dXBsZQogICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lcyA9IGl0ZW0KICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjb252ZXJ0X3BhdGgoZikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2V4dChzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfZXh0ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2V4dC5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfY19saWJzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpOgogICAgICAgICAgICBidWlsZF9jbGliID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9jbGliLmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zY3JpcHRzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCk6CiAgICAgICAgICAgIGJ1aWxkX3NjcmlwdHMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3NjcmlwdHMuZ2V0X3NvdXJjZV9maWxlcygpKQoKCmlmIGhhc2F0dHIoc2Rpc3Quc2Rpc3QsICdfYWRkX2RlZmF1bHRzX3N0YW5kYXJkcycpOgogICAgIyBkaXNhYmxlIHRoZSBmdW5jdGlvbmFsaXR5IGFscmVhZHkgYXZhaWxhYmxlIHVwc3RyZWFtCiAgICBjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAHbS6rXUAQAA1AEAAEMAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQucmVnaXN0ZXIgYXMgb3JpZwoKZnJvbSBzZXR1cHRvb2xzLmVycm9ycyBpbXBvcnQgUmVtb3ZlZENvbW1hbmRFcnJvcgoKCmNsYXNzIHJlZ2lzdGVyKG9yaWcucmVnaXN0ZXIpOgogICAgIiIiRm9ybWVybHkgdXNlZCB0byByZWdpc3RlciBwYWNrYWdlcyBvbiBQeVBJLiIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiVGhlIHJlZ2lzdGVyIGNvbW1hbmQgaGFzIGJlZW4gcmVtb3ZlZCwgdXNlIHR3aW5lIHRvIHVwbG9hZCAiCiAgICAgICAgICAgICsgImluc3RlYWQgKGh0dHBzOi8vcHlwaS5vcmcvcC90d2luZSkiCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFubm91bmNlKCJFUlJPUjogIiArIG1zZywgbG9nLkVSUk9SKQoKICAgICAgICByYWlzZSBSZW1vdmVkQ29tbWFuZEVycm9yKG1zZykKUEsDBBQAAAAAAAAAIQAZytSkdAgAAHQIAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKCmNsYXNzIHJvdGF0ZShDb21tYW5kKToKICAgICIiIkRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zIiIiCgogICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdtYXRjaD0nLCAnbScsICJwYXR0ZXJucyB0byBtYXRjaCAocmVxdWlyZWQpIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCiAgICAgICAgKCdrZWVwPScsICdrJywgIm51bWJlciBvZiBtYXRjaGluZyBkaXN0cmlidXRpb25zIHRvIGtlZXAiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5tYXRjaCA9IE5vbmUKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYua2VlcCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBpZiBzZWxmLm1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCiAgICAgICAgICAgICAgICAiKGUuZy4gJy56aXAnIG9yICcuZWdnJykiCiAgICAgICAgICAgICkKICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSBudW1iZXIgb2YgZmlsZXMgdG8ga2VlcCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiLS1rZWVwIG11c3QgYmUgYW4gaW50ZWdlciIpCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgc2VsZi5tYXRjaCA9IFsKICAgICAgICAgICAgICAgIGNvbnZlcnRfcGF0aChwLnN0cmlwKCkpIGZvciBwIGluIHNlbGYubWF0Y2guc3BsaXQoJywnKQogICAgICAgICAgICBdCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgoKICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLm1hdGNoOgogICAgICAgICAgICBwYXR0ZXJuID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSArICcqJyArIHBhdHRlcm4KICAgICAgICAgICAgZmlsZXMgPSBnbG9iKG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBwYXR0ZXJuKSkKICAgICAgICAgICAgZmlsZXMgPSBbKG9zLnBhdGguZ2V0bXRpbWUoZiksIGYpIGZvciBmIGluIGZpbGVzXQogICAgICAgICAgICBmaWxlcy5zb3J0KCkKICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCgogICAgICAgICAgICBsb2cuaW5mbygiJWQgZmlsZShzKSBtYXRjaGluZyAlcyIsIGxlbihmaWxlcyksIHBhdHRlcm4pCiAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KICAgICAgICAgICAgZm9yICh0LCBmKSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIGYpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKUEsDBBQAAAAAAAAAIQAEgdY0kgIAAJICAABDAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weWZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlCgoKY2xhc3Mgc2F2ZW9wdHMob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzYXZlIHN1cHBsaWVkIG9wdGlvbnMgdG8gc2V0dXAuY2ZnIG9yIG90aGVyIGNvbmZpZyBmaWxlIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uCiAgICAgICAgc2V0dGluZ3MgPSB7fQoKICAgICAgICBmb3IgY21kIGluIGRpc3QuY29tbWFuZF9vcHRpb25zOgoKICAgICAgICAgICAgaWYgY21kID09ICdzYXZlb3B0cyc6CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBkb24ndCBzYXZlIG91ciBvd24gb3B0aW9ucyEKCiAgICAgICAgICAgIGZvciBvcHQsIChzcmMsIHZhbCkgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoY21kKS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgc3JjID09ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldGRlZmF1bHQoY21kLCB7fSlbb3B0XSA9IHZhbAoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCBzZXR0aW5ncywgc2VsZi5kcnlfcnVuKQpQSwMEFAAAAAAAAAAhAHCKNgeYHwAAmB8AAEAAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IGNvbnRleHRsaWIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeCwgb3JkZXJlZF9zZXQKCmZyb20gLnB5MzZjb21wYXQgaW1wb3J0IHNkaXN0X2FkZF9kZWZhdWx0cwoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCl9kZWZhdWx0X3JldmN0cmwgPSBsaXN0CgoKZGVmIHdhbGtfcmV2Y3RybChkaXJuYW1lPScnKToKICAgICIiIkZpbmQgYWxsIGZpbGVzIHVuZGVyIHJldmlzaW9uIGNvbnRyb2wiIiIKICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdzZXR1cHRvb2xzLmZpbGVfZmluZGVycycpOgogICAgICAgIGZvciBpdGVtIGluIGVwLmxvYWQoKShkaXJuYW1lKToKICAgICAgICAgICAgeWllbGQgaXRlbQoKCmNsYXNzIHNkaXN0KHNkaXN0X2FkZF9kZWZhdWx0cywgb3JpZy5zZGlzdCk6CiAgICAiIiJTbWFydCBzZGlzdCB0aGF0IGZpbmRzIGFueXRoaW5nIHN1cHBvcnRlZCBieSByZXZpc2lvbiBjb250cm9sIiIiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZm9ybWF0cz0nLCBOb25lLAogICAgICAgICAiZm9ybWF0cyBmb3Igc291cmNlIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBkaXN0cmlidXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgY3JlYXRpbmcgIiArCiAgICAgICAgICJhcmNoaXZlIGZpbGUocykiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYXJjaGl2ZShzKSBpbiAiCiAgICAgICAgICJbZGVmYXVsdDogZGlzdF0iKSwKICAgIF0KCiAgICBuZWdhdGl2ZV9vcHQgPSB7fQoKICAgIFJFQURNRV9FWFRFTlNJT05TID0gWycnLCAnLnJzdCcsICcudHh0JywgJy5tZCddCiAgICBSRUFETUVTID0gdHVwbGUoJ1JFQURNRXswfScuZm9ybWF0KGV4dCkgZm9yIGV4dCBpbiBSRUFETUVfRVhURU5TSU9OUykKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBlaV9jbWQuZmlsZWxpc3QKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oZWlfY21kLmVnZ19pbmZvLCAnU09VUkNFUy50eHQnKSkKICAgICAgICBzZWxmLmNoZWNrX3JlYWRtZSgpCgogICAgICAgICMgUnVuIHN1YiBjb21tYW5kcwogICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKCiAgICAgICAgc2VsZi5tYWtlX2Rpc3RyaWJ1dGlvbigpCgogICAgICAgIGRpc3RfZmlsZXMgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKQogICAgICAgIGZvciBmaWxlIGluIHNlbGYuYXJjaGl2ZV9maWxlczoKICAgICAgICAgICAgZGF0YSA9ICgnc2Rpc3QnLCAnJywgZmlsZSkKICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZGlzdF9maWxlczoKICAgICAgICAgICAgICAgIGRpc3RfZmlsZXMuYXBwZW5kKGRhdGEpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLnNkaXN0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQoKICAgICAgICBzZWxmLl9kZWZhdWx0X3RvX2d6dGFyKCkKCiAgICBkZWYgX2RlZmF1bHRfdG9fZ3p0YXIoc2VsZik6CiAgICAgICAgIyBvbmx5IG5lZWRlZCBvbiBQeXRob24gcHJpb3IgdG8gMy42LgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDYsIDAsICdiZXRhJywgMSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZm9ybWF0cyA9IFsnZ3p0YXInXQoKICAgIGRlZiBtYWtlX2Rpc3RyaWJ1dGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTE2CiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLl9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICAgICBvcmlnLnNkaXN0Lm1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpCgogICAgQHN0YXRpY21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBfcmVtb3ZlX29zX2xpbmsoKToKICAgICAgICAiIiIKICAgICAgICBJbiBhIGNvbnRleHQsIHJlbW92ZSBhbmQgcmVzdG9yZSBvcy5saW5rIGlmIGl0IGV4aXN0cwogICAgICAgICIiIgoKICAgICAgICBjbGFzcyBOb1ZhbHVlOgogICAgICAgICAgICBwYXNzCgogICAgICAgIG9yaWdfdmFsID0gZ2V0YXR0cihvcywgJ2xpbmsnLCBOb1ZhbHVlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG9zLmxpbmsKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9yaWdfdmFsIGlzIG5vdCBOb1ZhbHVlOgogICAgICAgICAgICAgICAgc2V0YXR0cihvcywgJ2xpbmsnLCBvcmlnX3ZhbCkKCiAgICBkZWYgX19yZWFkX3RlbXBsYXRlX2hhY2soc2VsZik6CiAgICAgICAgIyBUaGlzIGdyb2R5IGhhY2sgY2xvc2VzIHRoZSB0ZW1wbGF0ZSBmaWxlIChNQU5JRkVTVC5pbikgaWYgYW4KICAgICAgICAjICBleGNlcHRpb24gb2NjdXJzIGR1cmluZyByZWFkX3RlbXBsYXRlLgogICAgICAgICMgRG9pbmcgc28gcHJldmVudHMgYW4gZXJyb3Igd2hlbiBlYXN5X2luc3RhbGwgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZQogICAgICAgICMgIGZpbGUuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcmlnLnNkaXN0LnJlYWRfdGVtcGxhdGUoc2VsZikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBfLCBfLCB0YiA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgIHRiLnRiX25leHQudGJfZnJhbWUuZl9sb2NhbHNbJ3RlbXBsYXRlJ10uY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKICAgICMgQmVnaW5uaW5nIHdpdGggUHl0aG9uIDIuNy4yLCAzLjEuNCwgYW5kIDMuMi4xLCB0aGlzIGxlYWt5IGZpbGUgaGFuZGxlCiAgICAjICBoYXMgYmVlbiBmaXhlZCwgc28gb25seSBvdmVycmlkZSB0aGUgbWV0aG9kIGlmIHdlJ3JlIHVzaW5nIGFuIGVhcmxpZXIKICAgICMgIFB5dGhvbi4KICAgIGhhc19sZWFreV9oYW5kbGUgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAyKQogICAgICAgIG9yICgzLCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDEsIDQpCiAgICAgICAgb3IgKDMsIDIpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMiwgMSkKICAgICkKICAgIGlmIGhhc19sZWFreV9oYW5kbGU6CiAgICAgICAgcmVhZF90ZW1wbGF0ZSA9IF9fcmVhZF90ZW1wbGF0ZV9oYWNrCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoc2VsZik6CiAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgc2Rpc3RfYWRkX2RlZmF1bHRzLl9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoc2VsZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlcigpLl9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKCdweXByb2plY3QudG9tbCcpOgogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCgncHlwcm9qZWN0LnRvbWwnKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3B5dGhvbihzZWxmKToKICAgICAgICAiIiJnZXR0aW5nIHB5dGhvbiBmaWxlcyIiIgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKICAgICAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9weS5nZXRfc291cmNlX2ZpbGVzKCkpCiAgICAgICAgICAgIHNlbGYuX2FkZF9kYXRhX2ZpbGVzKHNlbGYuX3NhZmVfZGF0YV9maWxlcyhidWlsZF9weSkpCgogICAgZGVmIF9zYWZlX2RhdGFfZmlsZXMoc2VsZiwgYnVpbGRfcHkpOgogICAgICAgICIiIgogICAgICAgIEV4dHJhY3RpbmcgZGF0YV9maWxlcyBmcm9tIGJ1aWxkX3B5IGlzIGtub3duIHRvIGNhdXNlCiAgICAgICAgaW5maW5pdGUgcmVjdXJzaW9uIGVycm9ycyB3aGVuIGBpbmNsdWRlX3BhY2thZ2VfZGF0YWAKICAgICAgICBpcyBlbmFibGVkLCBzbyBzdXBwcmVzcyBpdCBpbiB0aGF0IGNhc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgIHJldHVybiAoKQogICAgICAgIHJldHVybiBidWlsZF9weS5kYXRhX2ZpbGVzCgogICAgZGVmIF9hZGRfZGF0YV9maWxlcyhzZWxmLCBkYXRhX2ZpbGVzKToKICAgICAgICAiIiIKICAgICAgICBBZGQgZGF0YSBmaWxlcyBhcyBmb3VuZCBpbiBidWlsZF9weS5kYXRhX2ZpbGVzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgbmFtZSkKICAgICAgICAgICAgZm9yIF8sIHNyY19kaXIsIF8sIGZpbGVuYW1lcyBpbiBkYXRhX2ZpbGVzCiAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lcwogICAgICAgICkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgICAgIHNkaXN0X2FkZF9kZWZhdWx0cy5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN1cGVyKCkuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBsb2cud2FybigiZGF0YV9maWxlcyBjb250YWlucyB1bmV4cGVjdGVkIG9iamVjdHMiKQoKICAgIGRlZiBjaGVja19yZWFkbWUoc2VsZik6CiAgICAgICAgZm9yIGYgaW4gc2VsZi5SRUFETUVTOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgJywgJy5qb2luKHNlbGYuUkVBRE1FUykKICAgICAgICAgICAgKQoKICAgIGRlZiBtYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpOgogICAgICAgIG9yaWcuc2Rpc3QubWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKQoKICAgICAgICAjIFNhdmUgYW55IGVnZ19pbmZvIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzZWQgdG8gY3JlYXRlIHRoaXMgc2Rpc3QKICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCAnc2V0dXAuY2ZnJykKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpIGFuZCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgIyB1bmxpbmsgYW5kIHJlLWNvcHksIHNpbmNlIGl0IG1pZ2h0IGJlIGhhcmQtbGlua2VkLCBhbmQKICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc291cmNlIHZlcnNpb24KICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCiAgICAgICAgICAgIHNlbGYuY29weV9maWxlKCdzZXR1cC5jZmcnLCBkZXN0KQoKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKS5zYXZlX3ZlcnNpb25faW5mbyhkZXN0KQoKICAgIGRlZiBfbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZChzZWxmKToKICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIGNvbW1lbnQgdXNlZCBpbiAyLjcuMSBhbmQgaGlnaGVyCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYubWFuaWZlc3QsICdyYicpIGFzIGZwOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIHJldHVybiAoZmlyc3RfbGluZSAhPQogICAgICAgICAgICAgICAgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdFxuJy5lbmNvZGUoKSkKCiAgICBkZWYgcmVhZF9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiJSZWFkIHRoZSBtYW5pZmVzdCBmaWxlIChuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcpIGFuZCB1c2UgaXQgdG8KICAgICAgICBmaWxsIGluICdzZWxmLmZpbGVsaXN0JywgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgc291cmNlCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJyZWFkaW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIsIHNlbGYubWFuaWZlc3QpCiAgICAgICAgbWFuaWZlc3QgPSBvcGVuKHNlbGYubWFuaWZlc3QsICdyYicpCiAgICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CiAgICAgICAgICAgICMgVGhlIG1hbmlmZXN0IG11c3QgY29udGFpbiBVVEYtOC4gU2VlICMzMDMuCiAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCdVVEYtOCcpCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlciBub3QgVVRGLTggZGVjb2RhYmxlIC0tIHNraXBwaW5nIiAlIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3Igbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChsaW5lKQogICAgICAgIG1hbmlmZXN0LmNsb3NlKCkKCiAgICBkZWYgY2hlY2tfbGljZW5zZShzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgbGljZW5zZV9maWxlJyBvciAnbGljZW5zZV9maWxlcycgaXMgY29uZmlndXJlZCBhbmQgYWRkcyBhbnkKICAgICAgICB2YWxpZCBwYXRocyB0byAnc2VsZi5maWxlbGlzdCcuCiAgICAgICAgIiIiCgogICAgICAgIGZpbGVzID0gb3JkZXJlZF9zZXQuT3JkZXJlZFNldCgpCgogICAgICAgIG9wdHMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ21ldGFkYXRhJykKCiAgICAgICAgIyBpZ25vcmUgdGhlIHNvdXJjZSBvZiB0aGUgdmFsdWUKICAgICAgICBfLCBsaWNlbnNlX2ZpbGUgPSBvcHRzLmdldCgnbGljZW5zZV9maWxlJywgKE5vbmUsIE5vbmUpKQoKICAgICAgICBpZiBsaWNlbnNlX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgbG9nLmRlYnVnKCInbGljZW5zZV9maWxlJyBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbGVzLmFkZChsaWNlbnNlX2ZpbGUpCgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZXMudXBkYXRlKHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLmxpY2Vuc2VfZmlsZXMpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6ICdsaWNlbnNlX2ZpbGVzJyBvcHRpb24gaXMgbWFsZm9ybWVkIikKCiAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nOiBGYWlsZWQgdG8gZmluZCB0aGUgY29uZmlndXJlZCBsaWNlbnNlIGZpbGUgJyVzJyIsCiAgICAgICAgICAgICAgICAgICAgZikKICAgICAgICAgICAgICAgIGZpbGVzLnJlbW92ZShmKQoKICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChmaWxlcykKUEsDBBQAAAAAAAAAIQCbcMvH3RMAAN0TAABBAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBkaXN0dXRpbHMKaW1wb3J0IG9zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCl9fYWxsX18gPSBbJ2NvbmZpZ19maWxlJywgJ2VkaXRfY29uZmlnJywgJ29wdGlvbl9iYXNlJywgJ3NldG9wdCddCgoKZGVmIGNvbmZpZ19maWxlKGtpbmQ9ImxvY2FsIik6CiAgICAiIiJHZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBkaXN0dXRpbHMsIGxvY2FsLCBnbG9iYWwsIG9yIHBlci11c2VyIGNvbmZpZwoKICAgIGBraW5kYCBtdXN0IGJlIG9uZSBvZiAibG9jYWwiLCAiZ2xvYmFsIiwgb3IgInVzZXIiCiAgICAiIiIKICAgIGlmIGtpbmQgPT0gJ2xvY2FsJzoKICAgICAgICByZXR1cm4gJ3NldHVwLmNmZycKICAgIGlmIGtpbmQgPT0gJ2dsb2JhbCc6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksICdkaXN0dXRpbHMuY2ZnJwogICAgICAgICkKICAgIGlmIGtpbmQgPT0gJ3VzZXInOgogICAgICAgIGRvdCA9IG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgJy4nIG9yICcnCiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihjb252ZXJ0X3BhdGgoIn4vJXNweWRpc3R1dGlscy5jZmciICUgZG90KSkKICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgImNvbmZpZ19maWxlKCkgdHlwZSBtdXN0IGJlICdsb2NhbCcsICdnbG9iYWwnLCBvciAndXNlciciLCBraW5kCiAgICApCgoKZGVmIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBzZXR0aW5ncywgZHJ5X3J1bj1GYWxzZSk6CiAgICAiIiJFZGl0IGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGluY2x1ZGUgYHNldHRpbmdzYAoKICAgIGBzZXR0aW5nc2AgaXMgYSBkaWN0aW9uYXJ5IG9mIGRpY3Rpb25hcmllcyBvciBgYE5vbmVgYCB2YWx1ZXMsIGtleWVkIGJ5CiAgICBjb21tYW5kL3NlY3Rpb24gbmFtZS4gIEEgYGBOb25lYGAgdmFsdWUgbWVhbnMgdG8gZGVsZXRlIHRoZSBlbnRpcmUgc2VjdGlvbiwKICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgogICAgQSBzZXR0aW5nIG9mIGBgTm9uZWBgIG1lYW5zIHRvIGRlbGV0ZSB0aGF0IHNldHRpbmcuCiAgICAiIiIKICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBjb25maWd1cmF0aW9uIGZyb20gJXMiLCBmaWxlbmFtZSkKICAgIG9wdHMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgIG9wdHMucmVhZChbZmlsZW5hbWVdKQogICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBzZWN0aW9uIFslc10gZnJvbSAlcyIsIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IG9wdHMuaGFzX3NlY3Rpb24oc2VjdGlvbik6CiAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBvcHRzLmFkZF9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIG9wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiRGVsZXRpbmcgJXMuJXMgZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0cy5vcHRpb25zKHNlY3Rpb24pOgogICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKCiAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CiAgICAgICAgICAgIG9wdHMud3JpdGUoZikKCgpjbGFzcyBvcHRpb25fYmFzZShDb21tYW5kKToKICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbW1hbmRzIHRoYXQgbWVzcyB3aXRoIGNvbmZpZyBmaWxlcyIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2dsb2JhbC1jb25maWcnLCAnZycsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIHNpdGUtd2lkZSBkaXN0dXRpbHMuY2ZnIGZpbGUiKSwKICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAogICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgnZmlsZW5hbWU9JywgJ2YnLAogICAgICAgICAiY29uZmlndXJhdGlvbiBmaWxlIHRvIHVzZSAoZGVmYXVsdD1zZXR1cC5jZmcpIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICdnbG9iYWwtY29uZmlnJywgJ3VzZXItY29uZmlnJywKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKICAgICAgICBzZWxmLnVzZXJfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBpZiBzZWxmLmdsb2JhbF9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQogICAgICAgIGlmIHNlbGYudXNlcl9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ3VzZXInKSkKICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIiwKICAgICAgICAgICAgICAgIGZpbGVuYW1lcwogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlbmFtZSwgPSBmaWxlbmFtZXMKCgpjbGFzcyBzZXRvcHQob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzZXQgYW4gb3B0aW9uIGluIHNldHVwLmNmZyBvciBhbm90aGVyIGNvbmZpZyBmaWxlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2NvbW1hbmQ9JywgJ2MnLCAnY29tbWFuZCB0byBzZXQgYW4gb3B0aW9uIGZvcicpLAogICAgICAgICgnb3B0aW9uPScsICdvJywgJ29wdGlvbiB0byBzZXQnKSwKICAgICAgICAoJ3NldC12YWx1ZT0nLCAncycsICd2YWx1ZSBvZiB0aGUgb3B0aW9uJyksCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgdmFsdWUnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5zZXRfdmFsdWUgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYuY29tbWFuZCBpcyBOb25lIG9yIHNlbGYub3B0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1jb21tYW5kICphbmQqIC0tb3B0aW9uIikKICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1zZXQtdmFsdWUgb3IgLS1yZW1vdmUiKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWRpdF9jb25maWcoCiAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHsKICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCAnXycpOiBzZWxmLnNldF92YWx1ZX0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZi5kcnlfcnVuCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAN2WnM+CJQAAgiUAAD8AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlpbXBvcnQgb3MKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgdW5pdHRlc3QKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0TG9hZGVyCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IChyZXNvdXJjZV9saXN0ZGlyLCByZXNvdXJjZV9leGlzdHMsIG5vcm1hbGl6ZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX3NldCwgX25hbWVzcGFjZV9wYWNrYWdlcywgZXZhbHVhdGVfbWFya2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciwgcmVxdWlyZSwgRW50cnlQb2ludCkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gLmJ1aWxkX3B5IGltcG9ydCBfdW5pcXVlX2V2ZXJzZWVuCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCmNsYXNzIFNjYW5uaW5nTG9hZGVyKFRlc3RMb2FkZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBUZXN0TG9hZGVyLl9faW5pdF9fKHNlbGYpCiAgICAgICAgc2VsZi5fdmlzaXRlZCA9IHNldCgpCgogICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlLCBwYXR0ZXJuPU5vbmUpOgogICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZQoKICAgICAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSwgbG9hZCB0ZXN0cyBmcm9tIGFsbCB0aGUgbW9kdWxlcyBpbiBpdC4KICAgICAgICBJZiB0aGUgbW9kdWxlIGhhcyBhbiBgYGFkZGl0aW9uYWxfdGVzdHNgYCBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgYWRkCiAgICAgICAgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgdGVzdHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbW9kdWxlIGluIHNlbGYuX3Zpc2l0ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgc2VsZi5fdmlzaXRlZC5hZGQobW9kdWxlKQoKICAgICAgICB0ZXN0cyA9IFtdCiAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUpKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgImFkZGl0aW9uYWxfdGVzdHMiKToKICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZHVsZS5hZGRpdGlvbmFsX3Rlc3RzKCkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmVzb3VyY2VfbGlzdGRpcihtb2R1bGUuX19uYW1lX18sICcnKToKICAgICAgICAgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlICE9ICdfX2luaXRfXy5weSc6CiAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZVs6LTNdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIHJlc291cmNlX2V4aXN0cyhtb2R1bGUuX19uYW1lX18sIGZpbGUgKyAnL19faW5pdF9fLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXyArICcuJyArIGZpbGUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKHNlbGYubG9hZFRlc3RzRnJvbU5hbWUoc3VibW9kdWxlKSkKCiAgICAgICAgaWYgbGVuKHRlc3RzKSAhPSAxOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0ZXN0c1swXSAgIyBkb24ndCBjcmVhdGUgYSBuZXN0ZWQgc3VpdGUgZm9yIG9ubHkgb25lIHJldHVybgoKCiMgYWRhcHRlZCBmcm9tIGphcmFjby5jbGFzc2VzLnByb3BlcnRpZXM6Tm9uRGF0YVByb3BlcnR5CmNsYXNzIE5vbkRhdGFQcm9wZXJ0eToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZ2V0KToKICAgICAgICBzZWxmLmZnZXQgPSBmZ2V0CgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBvYmp0eXBlPU5vbmUpOgogICAgICAgIGlmIG9iaiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBzZWxmLmZnZXQob2JqKQoKCmNsYXNzIHRlc3QoQ29tbWFuZCk6CiAgICAiIiJDb21tYW5kIHRvIHJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIiIiCgogICAgZGVzY3JpcHRpb24gPSAicnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQgKGRlcHJlY2F0ZWQpIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3Rlc3QtbW9kdWxlPScsICdtJywgIlJ1biAndGVzdF9zdWl0ZScgaW4gc3BlY2lmaWVkIG1vZHVsZSIpLAogICAgICAgICgndGVzdC1zdWl0ZT0nLCAncycsCiAgICAgICAgICJSdW4gc2luZ2xlIHRlc3QsIGNhc2Ugb3Igc3VpdGUgKGUuZy4gJ21vZHVsZS50ZXN0X3N1aXRlJykiKSwKICAgICAgICAoJ3Rlc3QtcnVubmVyPScsICdyJywgIlRlc3QgcnVubmVyIHRvIHVzZSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9tb2R1bGUgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgYW5kIHNlbGYudGVzdF9tb2R1bGU6CiAgICAgICAgICAgIG1zZyA9ICJZb3UgbWF5IHNwZWNpZnkgYSBtb2R1bGUgb3IgYSBzdWl0ZSwgYnV0IG5vdCBib3RoIgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRlc3RfbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0X3N1aXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLnRlc3RfbW9kdWxlICsgIi50ZXN0X3N1aXRlIgoKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9sb2FkZXInLCBOb25lKQogICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9ICJzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDpTY2FubmluZ0xvYWRlciIKICAgICAgICBpZiBzZWxmLnRlc3RfcnVubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9ydW5uZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndGVzdF9ydW5uZXInLCBOb25lKQoKICAgIEBOb25EYXRhUHJvcGVydHkKICAgIGRlZiB0ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fdGVzdF9hcmdzKCkpCgogICAgZGVmIF90ZXN0X2FyZ3Moc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYudGVzdF9zdWl0ZSBhbmQgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNyk6CiAgICAgICAgICAgIHlpZWxkICdkaXNjb3ZlcicKICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CiAgICAgICAgICAgIHlpZWxkICctLXZlcmJvc2UnCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlOgogICAgICAgICAgICB5aWVsZCBzZWxmLnRlc3Rfc3VpdGUKCiAgICBkZWYgd2l0aF9wcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIgogICAgICAgIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHByb2plY3Rfb25fc3lzX3BhdGggY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYucHJvamVjdF9vbl9zeXNfcGF0aCgpOgogICAgICAgICAgICBmdW5jKCkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHByb2plY3Rfb25fc3lzX3BhdGgoc2VsZiwgaW5jbHVkZV9kaXN0cz1bXSk6CiAgICAgICAgd2l0aF8ydG8zID0gc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpCgogICAgICAgIGlmIHdpdGhfMnRvMzoKICAgICAgICAgICAgIyBJZiB3ZSBydW4gMnRvMyB3ZSBjYW4gbm90IGRvIHRoaXMgaW5wbGFjZToKCiAgICAgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfcHknLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgYnB5X2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJidWlsZF9weSIpCiAgICAgICAgICAgIGJ1aWxkX3BhdGggPSBub3JtYWxpemVfcGF0aChicHlfY21kLmJ1aWxkX2xpYikKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucwogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdlZ2dfaW5mbycsIGVnZ19iYXNlPWJ1aWxkX3BhdGgpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdpdGhvdXQgMnRvMyBpbnBsYWNlIHdvcmtzIGZpbmU6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKCiAgICAgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCgogICAgICAgIG9sZF9wYXRoID0gc3lzLnBhdGhbOl0KICAgICAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByb2plY3RfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGVpX2NtZC5lZ2dfYmFzZSkKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3RfcGF0aCkKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQogICAgICAgICAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQogICAgICAgICAgICByZXF1aXJlKCclcz09JXMnICUgKGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uKSkKICAgICAgICAgICAgd2l0aCBzZWxmLnBhdGhzX29uX3B5dGhvbnBhdGgoW3Byb2plY3RfcGF0aF0pOgogICAgICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMucGF0aFs6XSA9IG9sZF9wYXRoCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLmNsZWFyKCkKICAgICAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCgogICAgQHN0YXRpY21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAiIiIKICAgICAgICBBZGQgdGhlIGluZGljYXRlZCBwYXRocyB0byB0aGUgaGVhZCBvZiB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgc3VicHJvY2Vzc2VzIHdpbGwgYWxzbyBzZWUgdGhlIHBhY2thZ2VzIGF0CiAgICAgICAgdGhlc2UgcGF0aHMuCgogICAgICAgIERvIHRoaXMgaW4gYSBjb250ZXh0IHRoYXQgcmVzdG9yZXMgdGhlIHZhbHVlIG9uIGV4aXQuCiAgICAgICAgIiIiCiAgICAgICAgbm90aGluZyA9IG9iamVjdCgpCiAgICAgICAgb3JpZ19weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCBub3RoaW5nKQogICAgICAgIGN1cnJlbnRfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVmaXggPSBvcy5wYXRoc2VwLmpvaW4oX3VuaXF1ZV9ldmVyc2VlbihwYXRocykpCiAgICAgICAgICAgIHRvX2pvaW4gPSBmaWx0ZXIoTm9uZSwgW3ByZWZpeCwgY3VycmVudF9weXRob25wYXRoXSkKICAgICAgICAgICAgbmV3X3BhdGggPSBvcy5wYXRoc2VwLmpvaW4odG9fam9pbikKICAgICAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBuZXdfcGF0aAogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9yaWdfcHl0aG9ucGF0aCBpcyBub3RoaW5nOgogICAgICAgICAgICAgICAgb3MuZW52aXJvbi5wb3AoJ1BZVEhPTlBBVEgnLCBOb25lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gb3JpZ19weXRob25wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGluc3RhbGxfZGlzdHMoZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGUgcmVxdWlyZW1lbnRzIGluZGljYXRlZCBieSBzZWxmLmRpc3RyaWJ1dGlvbiBhbmQKICAgICAgICByZXR1cm4gYW4gaXRlcmFibGUgb2YgdGhlIGRpc3RzIHRoYXQgd2VyZSBidWlsdC4KICAgICAgICAiIiIKICAgICAgICBpcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QuaW5zdGFsbF9yZXF1aXJlcykKICAgICAgICB0cl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3QudGVzdHNfcmVxdWlyZSBvciBbXSkKICAgICAgICBlcl9kID0gZGlzdC5mZXRjaF9idWlsZF9lZ2dzKAogICAgICAgICAgICB2IGZvciBrLCB2IGluIGRpc3QuZXh0cmFzX3JlcXVpcmUuaXRlbXMoKQogICAgICAgICAgICBpZiBrLnN0YXJ0c3dpdGgoJzonKSBhbmQgZXZhbHVhdGVfbWFya2VyKGtbMTpdKQogICAgICAgICkKICAgICAgICByZXR1cm4gaXRlcnRvb2xzLmNoYWluKGlyX2QsIHRyX2QsIGVyX2QpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmFubm91bmNlKAogICAgICAgICAgICAiV0FSTklORzogVGVzdGluZyB2aWEgdGhpcyBjb21tYW5kIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgIgogICAgICAgICAgICAicmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBVc2VycyBsb29raW5nIGZvciBhIGdlbmVyaWMgdGVzdCAiCiAgICAgICAgICAgICJlbnRyeSBwb2ludCBpbmRlcGVuZGVudCBvZiB0ZXN0IHJ1bm5lciBhcmUgZW5jb3VyYWdlZCB0byB1c2UgIgogICAgICAgICAgICAidG94LiIsCiAgICAgICAgICAgIGxvZy5XQVJOLAogICAgICAgICkKCiAgICAgICAgaW5zdGFsbGVkX2Rpc3RzID0gc2VsZi5pbnN0YWxsX2Rpc3RzKHNlbGYuZGlzdHJpYnV0aW9uKQoKICAgICAgICBjbWQgPSAnICcuam9pbihzZWxmLl9hcmd2KQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnc2tpcHBpbmcgIiVzIiAoZHJ5IHJ1biknICUgY21kKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5hbm5vdW5jZSgncnVubmluZyAiJXMiJyAlIGNtZCkKCiAgICAgICAgcGF0aHMgPSBtYXAob3BlcmF0b3IuYXR0cmdldHRlcignbG9jYXRpb24nKSwgaW5zdGFsbGVkX2Rpc3RzKQogICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3RzKCkKCiAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgogICAgICAgICMgUHVyZ2UgbW9kdWxlcyB1bmRlciB0ZXN0IGZyb20gc3lzLm1vZHVsZXMuIFRoZSB0ZXN0IGxvYWRlciB3aWxsCiAgICAgICAgIyByZS1pbXBvcnQgdGhlbSBmcm9tIHRoZSBidWlsZCBsb2NhdGlvbi4gUmVxdWlyZWQgd2hlbiAydG8zIGlzIHVzZWQKICAgICAgICAjIHdpdGggbmFtZXNwYWNlIHBhY2thZ2VzLgogICAgICAgIGlmIHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKToKICAgICAgICAgICAgbW9kdWxlID0gc2VsZi50ZXN0X3N1aXRlLnNwbGl0KCcuJylbMF0KICAgICAgICAgICAgaWYgbW9kdWxlIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcyA9IFtdCiAgICAgICAgICAgICAgICBpZiBtb2R1bGUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVsX21vZHVsZXMuYXBwZW5kKG1vZHVsZSkKICAgICAgICAgICAgICAgIG1vZHVsZSArPSAnLicKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChtb2R1bGUpOgogICAgICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobmFtZSkKICAgICAgICAgICAgICAgIGxpc3QobWFwKHN5cy5tb2R1bGVzLl9fZGVsaXRlbV9fLCBkZWxfbW9kdWxlcykpCgogICAgICAgIHRlc3QgPSB1bml0dGVzdC5tYWluKAogICAgICAgICAgICBOb25lLCBOb25lLCBzZWxmLl9hcmd2LAogICAgICAgICAgICB0ZXN0TG9hZGVyPXNlbGYuX3Jlc29sdmVfYXNfZXAoc2VsZi50ZXN0X2xvYWRlciksCiAgICAgICAgICAgIHRlc3RSdW5uZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfcnVubmVyKSwKICAgICAgICAgICAgZXhpdD1GYWxzZSwKICAgICAgICApCiAgICAgICAgaWYgbm90IHRlc3QucmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKICAgICAgICAgICAgbXNnID0gJ1Rlc3QgZmFpbGVkOiAlcycgJSB0ZXN0LnJlc3VsdAogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLkVSUk9SKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2FyZ3Yoc2VsZik6CiAgICAgICAgcmV0dXJuIFsndW5pdHRlc3QnXSArIHNlbGYudGVzdF9hcmdzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX2FzX2VwKHZhbCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSwgY2FsbGVkLCBhcyBhIGFzIGlmIGl0IHdlcmUKICAgICAgICBzcGVjaWZpZWQgYXMgYW4gZW50cnkgcG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBhcnNlZCA9IEVudHJ5UG9pbnQucGFyc2UoIng9IiArIHZhbCkKICAgICAgICByZXR1cm4gcGFyc2VkLnJlc29sdmUoKSgpClBLAwQUAAAAAAAAACEAIgBdS84BAADOAQAAQQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCB1cGxvYWQgYXMgb3JpZwoKZnJvbSBzZXR1cHRvb2xzLmVycm9ycyBpbXBvcnQgUmVtb3ZlZENvbW1hbmRFcnJvcgoKCmNsYXNzIHVwbG9hZChvcmlnLnVwbG9hZCk6CiAgICAiIiJGb3JtZXJseSB1c2VkIHRvIHVwbG9hZCBwYWNrYWdlcyB0byBQeVBJLiIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiVGhlIHVwbG9hZCBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQsIHVzZSB0d2luZSB0byB1cGxvYWQgIgogICAgICAgICAgICArICJpbnN0ZWFkIChodHRwczovL3B5cGkub3JnL3AvdHdpbmUpIgogICAgICAgICkKCiAgICAgICAgc2VsZi5hbm5vdW5jZSgiRVJST1I6ICIgKyBtc2csIGxvZy5FUlJPUikKICAgICAgICByYWlzZSBSZW1vdmVkQ29tbWFuZEVycm9yKG1zZykKUEsDBBQAAAAAAAAAIQDyl/PGjxwAAI8cAABGAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiInVwbG9hZF9kb2NzCgpJbXBsZW1lbnRzIGEgRGlzdHV0aWxzICd1cGxvYWRfZG9jcycgc3ViY29tbWFuZCAodXBsb2FkIGRvY3VtZW50YXRpb24gdG8KUHlQSSdzIHB5dGhvbmhvc3RlZC5vcmcpLgoiIiIKCmZyb20gYmFzZTY0IGltcG9ydCBzdGFuZGFyZF9iNjRlbmNvZGUKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCB6aXBmaWxlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCwgdXJsbGliCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGl0ZXJfZW50cnlfcG9pbnRzCmZyb20gLnVwbG9hZCBpbXBvcnQgdXBsb2FkCgoKZGVmIF9lbmNvZGUocyk6CiAgICBlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJyBpZiBzaXguUFkzIGVsc2UgJ3N0cmljdCcKICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnLCBlcnJvcnMpCgoKY2xhc3MgdXBsb2FkX2RvY3ModXBsb2FkKToKICAgICMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBhcyB1cGxvYWRfZG9jcyBpc24ndAogICAgIyBzdXBwb3J0ZWQgYnkgV2FyZWhvdXNlIChhbmQgd29uJ3QgYmUpLgogICAgREVGQVVMVF9SRVBPU0lUT1JZID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvJwoKICAgIGRlc2NyaXB0aW9uID0gJ1VwbG9hZCBkb2N1bWVudGF0aW9uIHRvIFB5UEknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncmVwb3NpdG9yeT0nLCAncicsCiAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIHVwbG9hZC5ERUZBVUxUX1JFUE9TSVRPUlkpLAogICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCiAgICAgICAgICdkaXNwbGF5IGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHNlcnZlcicpLAogICAgICAgICgndXBsb2FkLWRpcj0nLCBOb25lLCAnZGlyZWN0b3J5IHRvIHVwbG9hZCcpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gdXBsb2FkLmJvb2xlYW5fb3B0aW9ucwoKICAgIGRlZiBoYXNfc3BoaW54KHNlbGYpOgogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsICdidWlsZF9zcGhpbngnKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgc3ViX2NvbW1hbmRzID0gWygnYnVpbGRfc3BoaW54JywgaGFzX3NwaGlueCldCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi51cGxvYWRfZGlyID0gTm9uZQogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmhhc19zcGhpbngoKToKICAgICAgICAgICAgICAgIGJ1aWxkX3NwaGlueCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zcGhpbngnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gYnVpbGRfc3BoaW54LmJ1aWxkZXJfdGFyZ2V0X2RpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsICdkb2NzJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCd1cGxvYWRfZGlyJykKICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gc2VsZi51cGxvYWRfZGlyCiAgICAgICAgaWYgJ3B5cGkucHl0aG9uLm9yZycgaW4gc2VsZi5yZXBvc2l0b3J5OgogICAgICAgICAgICBsb2cud2FybigiVXBsb2FkX2RvY3MgY29tbWFuZCBpcyBkZXByZWNhdGVkLiBVc2UgUlREIGluc3RlYWQuIikKICAgICAgICBzZWxmLmFubm91bmNlKCdVc2luZyB1cGxvYWQgZGlyZWN0b3J5ICVzJyAlIHNlbGYudGFyZ2V0X2RpcikKCiAgICBkZWYgY3JlYXRlX3ppcGZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAidyIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1rcGF0aChzZWxmLnRhcmdldF9kaXIpICAjIGp1c3QgaW4gY2FzZQogICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLnRhcmdldF9kaXIpOgogICAgICAgICAgICAgICAgaWYgcm9vdCA9PSBzZWxmLnRhcmdldF9kaXIgYW5kIG5vdCBmaWxlczoKICAgICAgICAgICAgICAgICAgICB0bXBsID0gIm5vIGZpbGVzIGZvdW5kIGluIHVwbG9hZCBkaXJlY3RvcnkgJyVzJyIKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcih0bXBsICUgc2VsZi50YXJnZXRfZGlyKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgZnVsbCA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlID0gcm9vdFtsZW4oc2VsZi50YXJnZXRfZGlyKTpdLmxzdHJpcChvcy5wYXRoLnNlcCkKICAgICAgICAgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHJlbGF0aXZlLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHppcF9maWxlLndyaXRlKGZ1bGwsIGRlc3QpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgemlwX2ZpbGUuY2xvc2UoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICB0bXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLmdldF9uYW1lKCkKICAgICAgICB6aXBfZmlsZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAiJXMuemlwIiAlIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNyZWF0ZV96aXBmaWxlKHppcF9maWxlKQogICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKHppcF9maWxlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wX2RpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX3BhcnQoaXRlbSwgc2VwX2JvdW5kYXJ5KToKICAgICAgICBrZXksIHZhbHVlcyA9IGl0ZW0KICAgICAgICB0aXRsZSA9ICdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlIGtleQogICAgICAgICMgaGFuZGxlIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIG5hbWUKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZXMsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQogICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHRpdGxlICs9ICc7IGZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gX2VuY29kZSh2YWx1ZSkKICAgICAgICAgICAgeWllbGQgc2VwX2JvdW5kYXJ5CiAgICAgICAgICAgIHlpZWxkIF9lbmNvZGUodGl0bGUpCiAgICAgICAgICAgIHlpZWxkIGIiXG5cbiIKICAgICAgICAgICAgeWllbGQgdmFsdWUKICAgICAgICAgICAgaWYgdmFsdWUgYW5kIHZhbHVlWy0xOl0gPT0gYidccic6CiAgICAgICAgICAgICAgICB5aWVsZCBiJ1xuJyAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tdWx0aXBhcnQoY2xzLCBkYXRhKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCiAgICAgICAgIiIiCiAgICAgICAgYm91bmRhcnkgPSBiJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKICAgICAgICBzZXBfYm91bmRhcnkgPSBiJ1xuLS0nICsgYm91bmRhcnkKICAgICAgICBlbmRfYm91bmRhcnkgPSBzZXBfYm91bmRhcnkgKyBiJy0tJwogICAgICAgIGVuZF9pdGVtcyA9IGVuZF9ib3VuZGFyeSwgYiJcbiIsCiAgICAgICAgYnVpbGRlciA9IGZ1bmN0b29scy5wYXJ0aWFsKAogICAgICAgICAgICBjbHMuX2J1aWxkX3BhcnQsCiAgICAgICAgICAgIHNlcF9ib3VuZGFyeT1zZXBfYm91bmRhcnksCiAgICAgICAgKQogICAgICAgIHBhcnRfZ3JvdXBzID0gbWFwKGJ1aWxkZXIsIGRhdGEuaXRlbXMoKSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHBhcnRfZ3JvdXBzKQogICAgICAgIGJvZHlfaXRlbXMgPSBpdGVydG9vbHMuY2hhaW4ocGFydHMsIGVuZF9pdGVtcykKICAgICAgICBjb250ZW50X3R5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgYm91bmRhcnkuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIGInJy5qb2luKGJvZHlfaXRlbXMpLCBjb250ZW50X3R5cGUKCiAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgbWV0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCiAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgJzphY3Rpb24nOiAnZG9jX3VwbG9hZCcsCiAgICAgICAgICAgICduYW1lJzogbWV0YS5nZXRfbmFtZSgpLAogICAgICAgICAgICAnY29udGVudCc6IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgY29udGVudCksCiAgICAgICAgfQogICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgogICAgICAgIGNyZWRlbnRpYWxzID0gX2VuY29kZShzZWxmLnVzZXJuYW1lICsgJzonICsgc2VsZi5wYXNzd29yZCkKICAgICAgICBjcmVkZW50aWFscyA9IHN0YW5kYXJkX2I2NGVuY29kZShjcmVkZW50aWFscykKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICBjcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzLmRlY29kZSgnYXNjaWknKQogICAgICAgIGF1dGggPSAiQmFzaWMgIiArIGNyZWRlbnRpYWxzCgogICAgICAgIGJvZHksIGN0ID0gc2VsZi5fYnVpbGRfbXVsdGlwYXJ0KGRhdGEpCgogICAgICAgIG1zZyA9ICJTdWJtaXR0aW5nIGRvY3VtZW50YXRpb24gdG8gJXMiICUgKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCgogICAgICAgICMgYnVpbGQgdGhlIFJlcXVlc3QKICAgICAgICAjIFdlIGNhbid0IHVzZSB1cmxsaWIyIHNpbmNlIHdlIG5lZWQgdG8gc2VuZCB0aGUgQmFzaWMKICAgICAgICAjIGF1dGggcmlnaHQgd2l0aCB0aGUgZmlyc3QgcmVxdWVzdAogICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBhc3NlcnQgbm90IHBhcmFtcyBhbmQgbm90IHF1ZXJ5IGFuZCBub3QgZnJhZ21lbnRzCiAgICAgICAgaWYgc2NoZW1hID09ICdodHRwJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbGlmIHNjaGVtYSA9PSAnaHR0cHMnOgogICAgICAgICAgICBjb25uID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5zdXBwb3J0ZWQgc2NoZW1hICIgKyBzY2hlbWEpCgogICAgICAgIGRhdGEgPSAnJwogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5jb25uZWN0KCkKICAgICAgICAgICAgY29ubi5wdXRyZXF1ZXN0KCJQT1NUIiwgdXJsKQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBjdAogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC10eXBlJywgY29udGVudF90eXBlKQogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCBzdHIobGVuKGJvZHkpKSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBhdXRoKQogICAgICAgICAgICBjb25uLmVuZGhlYWRlcnMoKQogICAgICAgICAgICBjb25uLnNlbmQoYm9keSkKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2Uoc3RyKGUpLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgaWYgci5zdGF0dXMgPT0gMjAwOgogICAgICAgICAgICBtc2cgPSAnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICBlbGlmIHIuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbG9jYXRpb24gPSByLmdldGhlYWRlcignTG9jYXRpb24nKQogICAgICAgICAgICBpZiBsb2NhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSAnaHR0cHM6Ly9weXRob25ob3N0ZWQub3JnLyVzLycgJSBtZXRhLmdldF9uYW1lKCkKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBzdWNjZXNzZnVsLiBWaXNpdCAlcycgJSBsb2NhdGlvbgogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbikKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CiAgICAgICAgICAgIHByaW50KCctJyAqIDc1LCByLnJlYWQoKSwgJy0nICogNzUpClBLAwQUAAAAAAAAACEATe/SU19QAABfUAAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbmZpZy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCB1bmljb2RlX2xpdGVyYWxzCmltcG9ydCBpbwppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBmdW5jdG9vbHMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCmZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNGaWxlRXJyb3IKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgTGVnYWN5VmVyc2lvbiwgcGFyc2UKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyU2V0CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMsIFBZMwoKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKZGVmIHJlYWRfY29uZmlndXJhdGlvbigKICAgICAgICBmaWxlcGF0aCwgZmluZF9vdGhlcnM9RmFsc2UsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlJlYWQgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm5zIG9wdGlvbnMgZnJvbSBpdCBhcyBhIGRpY3QuCgogICAgOnBhcmFtIHN0cnx1bmljb2RlIGZpbGVwYXRoOiBQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgICAgIHRvIGdldCBvcHRpb25zIGZyb20uCgogICAgOnBhcmFtIGJvb2wgZmluZF9vdGhlcnM6IFdoZXRoZXIgdG8gc2VhcmNoIGZvciBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgd2hpY2ggY291bGQgYmUgb24gaW4gdmFyaW91cyBwbGFjZXMuCgogICAgOnBhcmFtIGJvb2wgaWdub3JlX29wdGlvbl9lcnJvcnM6IFdoZXRoZXIgdG8gc2lsZW50bHkgaWdub3JlCiAgICAgICAgb3B0aW9ucywgdmFsdWVzIG9mIHdoaWNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZCAoZS5nLiBkdWUgdG8gZXhjZXB0aW9ucwogICAgICAgIGluIGRpcmVjdGl2ZXMgc3VjaCBhcyBmaWxlOiwgYXR0cjosIGV0Yy4pLgogICAgICAgIElmIEZhbHNlIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQgYXMgZXhwZWN0ZWQuCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIF9EaXN0cmlidXRpb24KCiAgICBmaWxlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmaWxlcGF0aCkKCiAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZXBhdGgpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKICAgICAgICAgICAgJ0NvbmZpZ3VyYXRpb24gZmlsZSAlcyBkb2VzIG5vdCBleGlzdC4nICUgZmlsZXBhdGgpCgogICAgY3VycmVudF9kaXJlY3RvcnkgPSBvcy5nZXRjd2QoKQogICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKGZpbGVwYXRoKSkKCiAgICB0cnk6CiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCgogICAgICAgIGZpbGVuYW1lcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKSBpZiBmaW5kX290aGVycyBlbHNlIFtdCiAgICAgICAgaWYgZmlsZXBhdGggbm90IGluIGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChmaWxlcGF0aCkKCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoZGlzdCwgZmlsZW5hbWVzPWZpbGVuYW1lcykKCiAgICAgICAgaGFuZGxlcnMgPSBwYXJzZV9jb25maWd1cmF0aW9uKAogICAgICAgICAgICBkaXN0LCBkaXN0LmNvbW1hbmRfb3B0aW9ucywKICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCgogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihjdXJyZW50X2RpcmVjdG9yeSkKCiAgICByZXR1cm4gY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKQoKCmRlZiBfZ2V0X29wdGlvbih0YXJnZXRfb2JqLCBrZXkpOgogICAgIiIiCiAgICBHaXZlbiBhIHRhcmdldCBvYmplY3QgYW5kIG9wdGlvbiBrZXksIGdldCB0aGF0IG9wdGlvbiBmcm9tCiAgICB0aGUgdGFyZ2V0IG9iamVjdCwgZWl0aGVyIHRocm91Z2ggYSBnZXRfe2tleX0gbWV0aG9kIG9yCiAgICBmcm9tIGFuIGF0dHJpYnV0ZSBkaXJlY3RseS4KICAgICIiIgogICAgZ2V0dGVyX25hbWUgPSAnZ2V0X3trZXl9Jy5mb3JtYXQoKipsb2NhbHMoKSkKICAgIGJ5X2F0dHJpYnV0ZSA9IGZ1bmN0b29scy5wYXJ0aWFsKGdldGF0dHIsIHRhcmdldF9vYmosIGtleSkKICAgIGdldHRlciA9IGdldGF0dHIodGFyZ2V0X29iaiwgZ2V0dGVyX25hbWUsIGJ5X2F0dHJpYnV0ZSkKICAgIHJldHVybiBnZXR0ZXIoKQoKCmRlZiBjb25maWd1cmF0aW9uX3RvX2RpY3QoaGFuZGxlcnMpOgogICAgIiIiUmV0dXJucyBjb25maWd1cmF0aW9uIGRhdGEgZ2F0aGVyZWQgYnkgZ2l2ZW4gaGFuZGxlcnMgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBsaXN0W0NvbmZpZ0hhbmRsZXJdIGhhbmRsZXJzOiBIYW5kbGVycyBsaXN0LAogICAgICAgIHVzdWFsbHkgZnJvbSBwYXJzZV9jb25maWd1cmF0aW9uKCkKCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgY29uZmlnX2RpY3QgPSBkZWZhdWx0ZGljdChkaWN0KQoKICAgIGZvciBoYW5kbGVyIGluIGhhbmRsZXJzOgogICAgICAgIGZvciBvcHRpb24gaW4gaGFuZGxlci5zZXRfb3B0aW9uczoKICAgICAgICAgICAgdmFsdWUgPSBfZ2V0X29wdGlvbihoYW5kbGVyLnRhcmdldF9vYmosIG9wdGlvbikKICAgICAgICAgICAgY29uZmlnX2RpY3RbaGFuZGxlci5zZWN0aW9uX3ByZWZpeF1bb3B0aW9uXSA9IHZhbHVlCgogICAgcmV0dXJuIGNvbmZpZ19kaWN0CgoKZGVmIHBhcnNlX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlBlcmZvcm1zIGFkZGl0aW9uYWwgcGFyc2luZyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgIGZvciBhIGRpc3RyaWJ1dGlvbi4KCiAgICBSZXR1cm5zIGEgbGlzdCBvZiB1c2VkIG9wdGlvbiBoYW5kbGVycy4KCiAgICA6cGFyYW0gRGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbjoKICAgIDpwYXJhbSBkaWN0IGNvbW1hbmRfb3B0aW9uczoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIG9wdGlvbnMgPSBDb25maWdPcHRpb25zSGFuZGxlcigKICAgICAgICBkaXN0cmlidXRpb24sIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICBvcHRpb25zLnBhcnNlKCkKCiAgICBtZXRhID0gQ29uZmlnTWV0YWRhdGFIYW5kbGVyKAogICAgICAgIGRpc3RyaWJ1dGlvbi5tZXRhZGF0YSwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycywKICAgICAgICBkaXN0cmlidXRpb24ucGFja2FnZV9kaXIpCiAgICBtZXRhLnBhcnNlKCkKCiAgICByZXR1cm4gbWV0YSwgb3B0aW9ucwoKCmNsYXNzIENvbmZpZ0hhbmRsZXI6CiAgICAiIiJIYW5kbGVzIG1ldGFkYXRhIHN1cHBsaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuIiIiCgogICAgc2VjdGlvbl9wcmVmaXggPSBOb25lCiAgICAiIiJQcmVmaXggZm9yIGNvbmZpZyBzZWN0aW9ucyBoYW5kbGVkIGJ5IHRoaXMgaGFuZGxlci4KICAgIE11c3QgYmUgcHJvdmlkZWQgYnkgY2xhc3MgaGVpcnMuCgogICAgIiIiCgogICAgYWxpYXNlcyA9IHt9CiAgICAiIiJPcHRpb25zIGFsaWFzZXMuCiAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgcGFja2FnZXMuIEUuZy46IGQydG8xIGFuZCBwYnIuCiAgICBOb3RlOiBgLWAgaW4ga2V5cyBpcyByZXBsYWNlZCB3aXRoIGBfYCBieSBjb25maWcgcGFyc2VyLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXRfb2JqLCBvcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgc2VjdGlvbnMgPSB7fQoKICAgICAgICBzZWN0aW9uX3ByZWZpeCA9IHNlbGYuc2VjdGlvbl9wcmVmaXgKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VjdGlvbl9uYW1lLnN0YXJ0c3dpdGgoc2VjdGlvbl9wcmVmaXgpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZS5yZXBsYWNlKHNlY3Rpb25fcHJlZml4LCAnJykuc3RyaXAoJy4nKQogICAgICAgICAgICBzZWN0aW9uc1tzZWN0aW9uX25hbWVdID0gc2VjdGlvbl9vcHRpb25zCgogICAgICAgIHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnMgPSBpZ25vcmVfb3B0aW9uX2Vycm9ycwogICAgICAgIHNlbGYudGFyZ2V0X29iaiA9IHRhcmdldF9vYmoKICAgICAgICBzZWxmLnNlY3Rpb25zID0gc2VjdGlvbnMKICAgICAgICBzZWxmLnNldF9vcHRpb25zID0gW10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAnJXMgbXVzdCBwcm92aWRlIC5wYXJzZXJzIHByb3BlcnR5JyAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBvcHRpb25fbmFtZSwgdmFsdWUpOgogICAgICAgIHVua25vd24gPSB0dXBsZSgpCiAgICAgICAgdGFyZ2V0X29iaiA9IHNlbGYudGFyZ2V0X29iagoKICAgICAgICAjIFRyYW5zbGF0ZSBhbGlhcyBpbnRvIHJlYWwgbmFtZS4KICAgICAgICBvcHRpb25fbmFtZSA9IHNlbGYuYWxpYXNlcy5nZXQob3B0aW9uX25hbWUsIG9wdGlvbl9uYW1lKQoKICAgICAgICBjdXJyZW50X3ZhbHVlID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdW5rbm93bikKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZSBpcyB1bmtub3duOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihvcHRpb25fbmFtZSkKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZToKICAgICAgICAgICAgIyBBbHJlYWR5IGluaGFiaXRlZC4gU2tpcHBpbmcuCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBza2lwX29wdGlvbiA9IEZhbHNlCiAgICAgICAgcGFyc2VyID0gc2VsZi5wYXJzZXJzLmdldChvcHRpb25fbmFtZSkKICAgICAgICBpZiBwYXJzZXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VyKHZhbHVlKQoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHNraXBfb3B0aW9uID0gVHJ1ZQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgaWYgc2tpcF9vcHRpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosICdzZXRfJXMnICUgb3B0aW9uX25hbWUsIE5vbmUpCiAgICAgICAgaWYgc2V0dGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uX25hbWUsIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNldHRlcih2YWx1ZSkKCiAgICAgICAgc2VsZi5zZXRfb3B0aW9ucy5hcHBlbmQob3B0aW9uX25hbWUpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2xpc3QoY2xzLCB2YWx1ZSwgc2VwYXJhdG9yPScsJyk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFZhbHVlIGlzIHNwbGl0IGVpdGhlciBieSBzZXBhcmF0b3IgKGRlZmF1bHRzIHRvIGNvbW1hKSBvciBieSBsaW5lcy4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpwYXJhbSBzZXBhcmF0b3I6IExpc3QgaXRlbXMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KICAgICAgICA6cnR5cGU6IGxpc3QKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KTogICMgX2dldF9wYXJzZXJfY29tcG91bmQgY2FzZQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgJ1xuJyBpbiB2YWx1ZToKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdGxpbmVzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KHNlcGFyYXRvcikKCiAgICAgICAgcmV0dXJuIFtjaHVuay5zdHJpcCgpIGZvciBjaHVuayBpbiB2YWx1ZSBpZiBjaHVuay5zdHJpcCgpXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9kaWN0KGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBkaWN0LgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgc2VwYXJhdG9yID0gJz0nCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBmb3IgbGluZSBpbiBjbHMuX3BhcnNlX2xpc3QodmFsdWUpOgogICAgICAgICAgICBrZXksIHNlcCwgdmFsID0gbGluZS5wYXJ0aXRpb24oc2VwYXJhdG9yKQogICAgICAgICAgICBpZiBzZXAgIT0gc2VwYXJhdG9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBwYXJzZSBvcHRpb24gdmFsdWUgdG8gZGljdDogJXMnICUgdmFsdWUpCiAgICAgICAgICAgIHJlc3VsdFtrZXkuc3RyaXAoKV0gPSB2YWwuc3RyaXAoKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2Jvb2woY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBib29sZWFuLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBib29sCiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHZhbHVlIGluICgnMScsICd0cnVlJywgJ3llcycpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2V4Y2x1ZGVfZmlsZXNfcGFyc2VyKGNscywga2V5KToKICAgICAgICAiIiJSZXR1cm5zIGEgcGFyc2VyIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZSBmaWVsZCBpbnB1dHMKICAgICAgICBhcmUgbm90IGZpbGVzLgoKICAgICAgICBQYXJzZXMgYSB2YWx1ZSBhZnRlciBnZXR0aW5nIHRoZSBrZXkgc28gZXJyb3IgbWVzc2FnZXMgYXJlCiAgICAgICAgbW9yZSBpbmZvcm1hdGl2ZS4KCiAgICAgICAgOnBhcmFtIGtleToKICAgICAgICA6cnR5cGU6IGNhbGxhYmxlCiAgICAgICAgIiIiCiAgICAgICAgZGVmIHBhcnNlcih2YWx1ZSk6CiAgICAgICAgICAgIGV4Y2x1ZGVfZGlyZWN0aXZlID0gJ2ZpbGU6JwogICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKGV4Y2x1ZGVfZGlyZWN0aXZlKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ09ubHkgc3RyaW5ncyBhcmUgYWNjZXB0ZWQgZm9yIHRoZSB7MH0gZmllbGQsICcKICAgICAgICAgICAgICAgICAgICAnZmlsZXMgYXJlIG5vdCBhY2NlcHRlZCcuZm9ybWF0KGtleSkpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIHJldHVybiBwYXJzZXIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZmlsZShjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgc3RyaW5nLCBhbGxvd2luZyBpbmNsdWRpbmcgdGV4dAogICAgICAgIGZyb20gbmVhcmVzdCBmaWxlcyB1c2luZyBgZmlsZTpgIGRpcmVjdGl2ZS4KCiAgICAgICAgRGlyZWN0aXZlIGlzIHNhbmRib3hlZCBhbmQgd29uJ3QgcmVhY2ggYW55dGhpbmcgb3V0c2lkZQogICAgICAgIGRpcmVjdG9yeSB3aXRoIHNldHVwLnB5LgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgZmlsZTogUkVBRE1FLnJzdCwgQ0hBTkdFTE9HLm1kLCBzcmMvZmlsZS50eHQKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGluY2x1ZGVfZGlyZWN0aXZlID0gJ2ZpbGU6JwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGluY2x1ZGVfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIHNwZWMgPSB2YWx1ZVtsZW4oaW5jbHVkZV9kaXJlY3RpdmUpOl0KICAgICAgICBmaWxlcGF0aHMgPSAob3MucGF0aC5hYnNwYXRoKHBhdGguc3RyaXAoKSkgZm9yIHBhdGggaW4gc3BlYy5zcGxpdCgnLCcpKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4oCiAgICAgICAgICAgIGNscy5fcmVhZF9maWxlKHBhdGgpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGZpbGVwYXRocwogICAgICAgICAgICBpZiAoY2xzLl9hc3NlcnRfbG9jYWwocGF0aCkgb3IgVHJ1ZSkKICAgICAgICAgICAgYW5kIG9zLnBhdGguaXNmaWxlKHBhdGgpCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYXNzZXJ0X2xvY2FsKGZpbGVwYXRoKToKICAgICAgICBpZiBub3QgZmlsZXBhdGguc3RhcnRzd2l0aChvcy5nZXRjd2QoKSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ2BmaWxlOmAgZGlyZWN0aXZlIGNhbiBub3QgYWNjZXNzICVzJyAlIGZpbGVwYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVhZF9maWxlKGZpbGVwYXRoKToKICAgICAgICB3aXRoIGlvLm9wZW4oZmlsZXBhdGgsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9hdHRyKGNscywgdmFsdWUsIHBhY2thZ2VfZGlyPU5vbmUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBtb2R1bGUgYXR0cmlidXRlLgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5hdHRyCiAgICAgICAgICAgIGF0dHI6IHBhY2thZ2UubW9kdWxlLmF0dHIKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGF0dHJfZGlyZWN0aXZlID0gJ2F0dHI6JwogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGF0dHJfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGF0dHJzX3BhdGggPSB2YWx1ZS5yZXBsYWNlKGF0dHJfZGlyZWN0aXZlLCAnJykuc3RyaXAoKS5zcGxpdCgnLicpCiAgICAgICAgYXR0cl9uYW1lID0gYXR0cnNfcGF0aC5wb3AoKQoKICAgICAgICBtb2R1bGVfbmFtZSA9ICcuJy5qb2luKGF0dHJzX3BhdGgpCiAgICAgICAgbW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZSBvciAnX19pbml0X18nCgogICAgICAgIHBhcmVudF9wYXRoID0gb3MuZ2V0Y3dkKCkKICAgICAgICBpZiBwYWNrYWdlX2RpcjoKICAgICAgICAgICAgaWYgYXR0cnNfcGF0aFswXSBpbiBwYWNrYWdlX2RpcjoKICAgICAgICAgICAgICAgICMgQSBjdXN0b20gcGF0aCB3YXMgc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlIHdlIHdhbnQgdG8gaW1wb3J0CiAgICAgICAgICAgICAgICBjdXN0b21fcGF0aCA9IHBhY2thZ2VfZGlyW2F0dHJzX3BhdGhbMF1dCiAgICAgICAgICAgICAgICBwYXJ0cyA9IGN1c3RvbV9wYXRoLnJzcGxpdCgnLycsIDEpCiAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID4gMToKICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgcGFydHNbMF0pCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBwYXJ0c1sxXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSA9IGN1c3RvbV9wYXRoCiAgICAgICAgICAgIGVsaWYgJycgaW4gcGFja2FnZV9kaXI6CiAgICAgICAgICAgICAgICAjIEEgY3VzdG9tIHBhcmVudCBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCBmb3IgYWxsIHJvb3QgbW9kdWxlcwogICAgICAgICAgICAgICAgcGFyZW50X3BhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHBhY2thZ2VfZGlyWycnXSkKICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGFyZW50X3BhdGgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtb2R1bGUgPSBpbXBvcnRfbW9kdWxlKG1vZHVsZV9uYW1lKQogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIobW9kdWxlLCBhdHRyX25hbWUpCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5wYXRoID0gc3lzLnBhdGhbMTpdCgogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfcGFyc2VyX2NvbXBvdW5kKGNscywgKnBhcnNlX21ldGhvZHMpOgogICAgICAgICIiIlJldHVybnMgcGFyc2VyIGZ1bmN0aW9uIHRvIHJlcHJlc2VudHMgdmFsdWUgYXMgYSBsaXN0LgoKICAgICAgICBQYXJzZXMgYSB2YWx1ZSBhcHBseWluZyBnaXZlbiBtZXRob2RzIG9uZSBhZnRlciBhbm90aGVyLgoKICAgICAgICA6cGFyYW0gcGFyc2VfbWV0aG9kczoKICAgICAgICA6cnR5cGU6IGNhbGxhYmxlCiAgICAgICAgIiIiCiAgICAgICAgZGVmIHBhcnNlKHZhbHVlKToKICAgICAgICAgICAgcGFyc2VkID0gdmFsdWUKCiAgICAgICAgICAgIGZvciBtZXRob2QgaW4gcGFyc2VfbWV0aG9kczoKICAgICAgICAgICAgICAgIHBhcnNlZCA9IG1ldGhvZChwYXJzZWQpCgogICAgICAgICAgICByZXR1cm4gcGFyc2VkCgogICAgICAgIHJldHVybiBwYXJzZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoY2xzLCBzZWN0aW9uX29wdGlvbnMsIHZhbHVlc19wYXJzZXI9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2VzIHNlY3Rpb24gb3B0aW9ucyBpbnRvIGEgZGljdGlvbmFyeS4KCiAgICAgICAgT3B0aW9uYWxseSBhcHBsaWVzIGEgZ2l2ZW4gcGFyc2VyIHRvIHZhbHVlcy4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgIDpwYXJhbSBjYWxsYWJsZSB2YWx1ZXNfcGFyc2VyOgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHZhbHVlID0ge30KICAgICAgICB2YWx1ZXNfcGFyc2VyID0gdmFsdWVzX3BhcnNlciBvciAobGFtYmRhIHZhbDogdmFsKQogICAgICAgIGZvciBrZXksIChfLCB2YWwpIGluIHNlY3Rpb25fb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICB2YWx1ZVtrZXldID0gdmFsdWVzX3BhcnNlcih2YWwpCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIHBhcnNlX3NlY3Rpb24oc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBmb3IgKG5hbWUsIChfLCB2YWx1ZSkpIGluIHNlY3Rpb25fb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MgICMgS2VlcCBzaWxlbnQgZm9yIGEgbmV3IG9wdGlvbiBtYXkgYXBwZWFyIGFueXRpbWUuCgogICAgZGVmIHBhcnNlKHNlbGYpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGUgaXRlbXMgZnJvbSBvbmUKICAgICAgICBvciBtb3JlIHJlbGF0ZWQgc2VjdGlvbnMuCgogICAgICAgICIiIgogICAgICAgIGZvciBzZWN0aW9uX25hbWUsIHNlY3Rpb25fb3B0aW9ucyBpbiBzZWxmLnNlY3Rpb25zLml0ZW1zKCk6CgogICAgICAgICAgICBtZXRob2RfcG9zdGZpeCA9ICcnCiAgICAgICAgICAgIGlmIHNlY3Rpb25fbmFtZTogICMgW3NlY3Rpb24ub3B0aW9uXSB2YXJpYW50CiAgICAgICAgICAgICAgICBtZXRob2RfcG9zdGZpeCA9ICdfJXMnICUgc2VjdGlvbl9uYW1lCgogICAgICAgICAgICBzZWN0aW9uX3BhcnNlcl9tZXRob2QgPSBnZXRhdHRyKAogICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICMgRG90cyBpbiBzZWN0aW9uIG5hbWVzIGFyZSB0cmFuc2xhdGVkIGludG8gZHVuZGVyc2NvcmVzLgogICAgICAgICAgICAgICAgKCdwYXJzZV9zZWN0aW9uJXMnICUgbWV0aG9kX3Bvc3RmaXgpLnJlcGxhY2UoJy4nLCAnX18nKSwKICAgICAgICAgICAgICAgIE5vbmUpCgogICAgICAgICAgICBpZiBzZWN0aW9uX3BhcnNlcl9tZXRob2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdVbnN1cHBvcnRlZCBkaXN0cmlidXRpb24gb3B0aW9uIHNlY3Rpb246IFslcy4lc10nICUgKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlY3Rpb25fcHJlZml4LCBzZWN0aW9uX25hbWUpKQoKICAgICAgICAgICAgc2VjdGlvbl9wYXJzZXJfbWV0aG9kKHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgX2RlcHJlY2F0ZWRfY29uZmlnX2hhbmRsZXIoc2VsZiwgZnVuYywgbXNnLCB3YXJuaW5nX2NsYXNzKToKICAgICAgICAiIiIgdGhpcyBmdW5jdGlvbiB3aWxsIHdyYXAgYXJvdW5kIHBhcmFtZXRlcnMgdGhhdCBhcmUgZGVwcmVjYXRlZAoKICAgICAgICA6cGFyYW0gbXNnOiBkZXByZWNhdGlvbiBtZXNzYWdlCiAgICAgICAgOnBhcmFtIHdhcm5pbmdfY2xhc3M6IGNsYXNzIG9mIHdhcm5pbmcgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZAogICAgICAgIDpwYXJhbSBmdW5jOiBmdW5jdGlvbiB0byBiZSB3cmFwcGVkIGFyb3VuZAogICAgICAgICIiIgogICAgICAgIEB3cmFwcyhmdW5jKQogICAgICAgIGRlZiBjb25maWdfaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgd2FybmluZ19jbGFzcykKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICByZXR1cm4gY29uZmlnX2hhbmRsZXIKCgpjbGFzcyBDb25maWdNZXRhZGF0YUhhbmRsZXIoQ29uZmlnSGFuZGxlcik6CgogICAgc2VjdGlvbl9wcmVmaXggPSAnbWV0YWRhdGEnCgogICAgYWxpYXNlcyA9IHsKICAgICAgICAnaG9tZV9wYWdlJzogJ3VybCcsCiAgICAgICAgJ3N1bW1hcnknOiAnZGVzY3JpcHRpb24nLAogICAgICAgICdjbGFzc2lmaWVyJzogJ2NsYXNzaWZpZXJzJywKICAgICAgICAncGxhdGZvcm0nOiAncGxhdGZvcm1zJywKICAgIH0KCiAgICBzdHJpY3RfbW9kZSA9IEZhbHNlCiAgICAiIiJXZSBuZWVkIHRvIGtlZXAgaXQgbG9vc2UsIHRvIGJlIHBhcnRpYWxseSBjb21wYXRpYmxlIHdpdGgKICAgIGBwYnJgIGFuZCBgZDJ0bzFgIHBhY2thZ2VzIHdoaWNoIGFsc28gdXNlcyBgbWV0YWRhdGFgIHNlY3Rpb24uCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldF9vYmosIG9wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlLAogICAgICAgICAgICAgICAgIHBhY2thZ2VfZGlyPU5vbmUpOgogICAgICAgIHN1cGVyKENvbmZpZ01ldGFkYXRhSGFuZGxlciwgc2VsZikuX19pbml0X18odGFyZ2V0X29iaiwgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgICAgIHNlbGYucGFja2FnZV9kaXIgPSBwYWNrYWdlX2RpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlcnMoc2VsZik6CiAgICAgICAgIiIiTWV0YWRhdGEgaXRlbSBuYW1lIHRvIHBhcnNlciBmdW5jdGlvbiBtYXBwaW5nLiIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBzZWxmLl9wYXJzZV9saXN0CiAgICAgICAgcGFyc2VfZmlsZSA9IHNlbGYuX3BhcnNlX2ZpbGUKICAgICAgICBwYXJzZV9kaWN0ID0gc2VsZi5fcGFyc2VfZGljdAogICAgICAgIGV4Y2x1ZGVfZmlsZXNfcGFyc2VyID0gc2VsZi5fZXhjbHVkZV9maWxlc19wYXJzZXIKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3BsYXRmb3Jtcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdrZXl3b3Jkcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdwcm92aWRlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdyZXF1aXJlcyc6IHNlbGYuX2RlcHJlY2F0ZWRfY29uZmlnX2hhbmRsZXIoCiAgICAgICAgICAgICAgICBwYXJzZV9saXN0LAogICAgICAgICAgICAgICAgIlRoZSByZXF1aXJlcyBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSAiCiAgICAgICAgICAgICAgICAiaW5zdGFsbF9yZXF1aXJlcyBmb3IgcnVudGltZSBkZXBlbmRlbmNpZXMuIiwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZyksCiAgICAgICAgICAgICdvYnNvbGV0ZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnY2xhc3NpZmllcnMnOiBzZWxmLl9nZXRfcGFyc2VyX2NvbXBvdW5kKHBhcnNlX2ZpbGUsIHBhcnNlX2xpc3QpLAogICAgICAgICAgICAnbGljZW5zZSc6IGV4Y2x1ZGVfZmlsZXNfcGFyc2VyKCdsaWNlbnNlJyksCiAgICAgICAgICAgICdsaWNlbnNlX2ZpbGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiBwYXJzZV9maWxlLAogICAgICAgICAgICAndmVyc2lvbic6IHNlbGYuX3BhcnNlX3ZlcnNpb24sCiAgICAgICAgICAgICdwcm9qZWN0X3VybHMnOiBwYXJzZV9kaWN0LAogICAgICAgIH0KCiAgICBkZWYgX3BhcnNlX3ZlcnNpb24oc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgdmVyc2lvbmAgb3B0aW9uIHZhbHVlLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuX3BhcnNlX2ZpbGUodmFsdWUpCgogICAgICAgIGlmIHZlcnNpb24gIT0gdmFsdWU6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnN0cmlwKCkKICAgICAgICAgICAgIyBCZSBzdHJpY3QgYWJvdXQgdmVyc2lvbnMgbG9hZGVkIGZyb20gZmlsZSBiZWNhdXNlIGl0J3MgZWFzeSB0bwogICAgICAgICAgICAjIGFjY2lkZW50YWxseSBpbmNsdWRlIG5ld2xpbmVzIGFuZCBvdGhlciB1bmludGVuZGVkIGNvbnRlbnQKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZSh2ZXJzaW9uKSwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAgICAgICAgICdWZXJzaW9uIGxvYWRlZCBmcm9tIHt2YWx1ZX0gZG9lcyBub3QgJwogICAgICAgICAgICAgICAgICAgICdjb21wbHkgd2l0aCBQRVAgNDQwOiB7dmVyc2lvbn0nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcih0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgICAgIHZlcnNpb24gPSBzZWxmLl9wYXJzZV9hdHRyKHZhbHVlLCBzZWxmLnBhY2thZ2VfZGlyKQoKICAgICAgICBpZiBjYWxsYWJsZSh2ZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24oKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBpZiBoYXNhdHRyKHZlcnNpb24sICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICclcycgJSB2ZXJzaW9uCgogICAgICAgIHJldHVybiB2ZXJzaW9uCgoKY2xhc3MgQ29uZmlnT3B0aW9uc0hhbmRsZXIoQ29uZmlnSGFuZGxlcik6CgogICAgc2VjdGlvbl9wcmVmaXggPSAnb3B0aW9ucycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2xpc3Rfc2VtaWNvbG9uID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHBhcnNlX2Jvb2wgPSBzZWxmLl9wYXJzZV9ib29sCiAgICAgICAgcGFyc2VfZGljdCA9IHNlbGYuX3BhcnNlX2RpY3QKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3ppcF9zYWZlJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3VzZV8ydG8zJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ2luY2x1ZGVfcGFja2FnZV9kYXRhJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3BhY2thZ2VfZGlyJzogcGFyc2VfZGljdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICd1c2VfMnRvM19leGNsdWRlX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnc2NyaXB0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdlYWdlcl9yZXNvdXJjZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZGVwZW5kZW5jeV9saW5rcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICduYW1lc3BhY2VfcGFja2FnZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnaW5zdGFsbF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAnc2V0dXBfcmVxdWlyZXMnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3Rlc3RzX3JlcXVpcmUnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3BhY2thZ2VzJzogc2VsZi5fcGFyc2VfcGFja2FnZXMsCiAgICAgICAgICAgICdlbnRyeV9wb2ludHMnOiBzZWxmLl9wYXJzZV9maWxlLAogICAgICAgICAgICAncHlfbW9kdWxlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdweXRob25fcmVxdWlyZXMnOiBTcGVjaWZpZXJTZXQsCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2VfcGFja2FnZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZXNgIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGZpbmRfZGlyZWN0aXZlcyA9IFsnZmluZDonLCAnZmluZF9uYW1lc3BhY2U6J10KICAgICAgICB0cmltbWVkX3ZhbHVlID0gdmFsdWUuc3RyaXAoKQoKICAgICAgICBpZiB0cmltbWVkX3ZhbHVlIG5vdCBpbiBmaW5kX2RpcmVjdGl2ZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9saXN0KHZhbHVlKQoKICAgICAgICBmaW5kbnMgPSB0cmltbWVkX3ZhbHVlID09IGZpbmRfZGlyZWN0aXZlc1sxXQogICAgICAgIGlmIGZpbmRucyBhbmQgbm90IFBZMzoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnZmluZF9uYW1lc3BhY2U6IGRpcmVjdGl2ZSBpcyB1bnN1cHBvcnRlZCBvbiBQeXRob24gPCAzLjMnKQoKICAgICAgICAjIFJlYWQgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gYSBkZWRpY2F0ZWQgc2VjdGlvbi4KICAgICAgICBmaW5kX2t3YXJncyA9IHNlbGYucGFyc2Vfc2VjdGlvbl9wYWNrYWdlc19fZmluZCgKICAgICAgICAgICAgc2VsZi5zZWN0aW9ucy5nZXQoJ3BhY2thZ2VzLmZpbmQnLCB7fSkpCgogICAgICAgIGlmIGZpbmRuczoKICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBmaW5kX25hbWVzcGFjZV9wYWNrYWdlcyBhcyBmaW5kX3BhY2thZ2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBmaW5kX3BhY2thZ2VzCgogICAgICAgIHJldHVybiBmaW5kX3BhY2thZ2VzKCoqZmluZF9rd2FyZ3MpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZXNfX2ZpbmQoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VzLmZpbmRgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICBUbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggX3BhcnNlX3BhY2thZ2VzKCkuCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWN0aW9uX2RhdGEgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgdmFsaWRfa2V5cyA9IFsnd2hlcmUnLCAnaW5jbHVkZScsICdleGNsdWRlJ10KCiAgICAgICAgZmluZF9rd2FyZ3MgPSBkaWN0KAogICAgICAgICAgICBbKGssIHYpIGZvciBrLCB2IGluIHNlY3Rpb25fZGF0YS5pdGVtcygpIGlmIGsgaW4gdmFsaWRfa2V5cyBhbmQgdl0pCgogICAgICAgIHdoZXJlID0gZmluZF9rd2FyZ3MuZ2V0KCd3aGVyZScpCiAgICAgICAgaWYgd2hlcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbmRfa3dhcmdzWyd3aGVyZSddID0gd2hlcmVbMF0gICMgY2FzdCBsaXN0IHRvIHNpbmdsZSB2YWwKCiAgICAgICAgcmV0dXJuIGZpbmRfa3dhcmdzCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZW50cnlfcG9pbnRzKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBlbnRyeV9wb2ludHNgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKICAgICAgICBzZWxmWydlbnRyeV9wb2ludHMnXSA9IHBhcnNlZAoKICAgIGRlZiBfcGFyc2VfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKCiAgICAgICAgcm9vdCA9IHBhcnNlZC5nZXQoJyonKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHBhcnNlZFsnJ10gPSByb290CiAgICAgICAgICAgIGRlbCBwYXJzZWRbJyonXQoKICAgICAgICByZXR1cm4gcGFyc2VkCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsncGFja2FnZV9kYXRhJ10gPSBzZWxmLl9wYXJzZV9wYWNrYWdlX2RhdGEoc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4Y2x1ZGVfcGFja2FnZV9kYXRhKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleGNsdWRlX3BhY2thZ2VfZGF0YWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWxmWydleGNsdWRlX3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZXh0cmFzX3JlcXVpcmUoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGV4dHJhc19yZXF1aXJlYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlX2xpc3QgPSBwYXJ0aWFsKHNlbGYuX3BhcnNlX2xpc3QsIHNlcGFyYXRvcj0nOycpCiAgICAgICAgc2VsZlsnZXh0cmFzX3JlcXVpcmUnXSA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdCgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zLCBwYXJzZV9saXN0KQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2RhdGFfZmlsZXMoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGRhdGFfZmlsZXNgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VkID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KHNlY3Rpb25fb3B0aW9ucywgc2VsZi5fcGFyc2VfbGlzdCkKICAgICAgICBzZWxmWydkYXRhX2ZpbGVzJ10gPSBbKGssIHYpIGZvciBrLCB2IGluIHBhcnNlZC5pdGVtcygpXQpQSwMEFAAAAAAAAAAhABoiBDKnAwAApwMAADsAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kZXBfdXRpbC5weWZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9ncm91cAoKIyB5ZXMsIHRoaXMgaXMgd2FzIGFsbW9zdCBlbnRpcmVseSBjb3B5LXBhc3RlZCBmcm9tCiMgJ25ld2VyX3BhaXJ3aXNlKCknLCB0aGlzIGlzIGp1c3QgYW5vdGhlciBjb252ZW5pZW5jZQojIGZ1bmN0aW9uLgpkZWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoc291cmNlc19ncm91cHMsIHRhcmdldHMpOgogICAgIiIiV2FsayBib3RoIGFyZ3VtZW50cyBpbiBwYXJhbGxlbCwgdGVzdGluZyBpZiBlYWNoIHNvdXJjZSBncm91cCBpcyBuZXdlcgogICAgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0YXJnZXQuIFJldHVybnMgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywKICAgIHRhcmdldHMpIHdoZXJlIHNvdXJjZXMgaXMgbmV3ZXIgdGhhbiB0YXJnZXQsIGFjY29yZGluZyB0byB0aGUgc2VtYW50aWNzCiAgICBvZiAnbmV3ZXJfZ3JvdXAoKScuCiAgICAiIiIKICAgIGlmIGxlbihzb3VyY2VzX2dyb3VwcykgIT0gbGVuKHRhcmdldHMpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIidzb3VyY2VzX2dyb3VwJyBhbmQgJ3RhcmdldHMnIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIikKCiAgICAjIGJ1aWxkIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsIHRhcmdldHMpIHdoZXJlIHNvdXJjZSBpcyBuZXdlcgogICAgbl9zb3VyY2VzID0gW10KICAgIG5fdGFyZ2V0cyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc291cmNlc19ncm91cHMpKToKICAgICAgICBpZiBuZXdlcl9ncm91cChzb3VyY2VzX2dyb3Vwc1tpXSwgdGFyZ2V0c1tpXSk6CiAgICAgICAgICAgIG5fc291cmNlcy5hcHBlbmQoc291cmNlc19ncm91cHNbaV0pCiAgICAgICAgICAgIG5fdGFyZ2V0cy5hcHBlbmQodGFyZ2V0c1tpXSkKCiAgICByZXR1cm4gbl9zb3VyY2VzLCBuX3RhcmdldHMKUEsDBBQAAAAAAAAAIQD9GVsKjRUAAI0VAAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGVwZW5kcy5weWltcG9ydCBzeXMKaW1wb3J0IG1hcnNoYWwKaW1wb3J0IGNvbnRleHRsaWIKZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbgoKZnJvbSAucHkzM2NvbXBhdCBpbXBvcnQgQnl0ZWNvZGUKCmZyb20gLnB5Mjdjb21wYXQgaW1wb3J0IGZpbmRfbW9kdWxlLCBQWV9DT01QSUxFRCwgUFlfRlJPWkVOLCBQWV9TT1VSQ0UKZnJvbSAuIGltcG9ydCBweTI3Y29tcGF0CgoKX19hbGxfXyA9IFsKICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKXQoKCmNsYXNzIFJlcXVpcmU6CiAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBuYW1lLCByZXF1ZXN0ZWRfdmVyc2lvbiwgbW9kdWxlLCBob21lcGFnZT0nJywKICAgICAgICAgICAgYXR0cmlidXRlPU5vbmUsIGZvcm1hdD1Ob25lKToKCiAgICAgICAgaWYgZm9ybWF0IGlzIE5vbmUgYW5kIHJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3JtYXQgPSBTdHJpY3RWZXJzaW9uCgogICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVxdWVzdGVkX3ZlcnNpb24gPSBmb3JtYXQocmVxdWVzdGVkX3ZlcnNpb24pCiAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gJ19fdmVyc2lvbl9fJwoKICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShsb2NhbHMoKSkKICAgICAgICBkZWwgc2VsZi5zZWxmCgogICAgZGVmIGZ1bGxfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gZnVsbCBwYWNrYWdlL2Rpc3RyaWJ1dGlvbiBuYW1lLCB3L3ZlcnNpb24iIiIKICAgICAgICBpZiBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYucmVxdWVzdGVkX3ZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiB2ZXJzaW9uX29rKHNlbGYsIHZlcnNpb24pOgogICAgICAgICIiIklzICd2ZXJzaW9uJyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZT8iIiIKICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWJ1dGUgaXMgTm9uZSBvciBzZWxmLmZvcm1hdCBpcyBOb25lIG9yIFwKICAgICAgICAgICAgc3RyKHZlcnNpb24pICE9ICJ1bmtub3duIiBhbmQgdmVyc2lvbiA+PSBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uCgogICAgZGVmIGdldF92ZXJzaW9uKHNlbGYsIHBhdGhzPU5vbmUsIGRlZmF1bHQ9InVua25vd24iKToKICAgICAgICAiIiJHZXQgdmVyc2lvbiBudW1iZXIgb2YgaW5zdGFsbGVkIG1vZHVsZSwgJ05vbmUnLCBvciAnZGVmYXVsdCcKCiAgICAgICAgU2VhcmNoICdwYXRocycgZm9yIG1vZHVsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJuICdOb25lJy4gIElmIGZvdW5kLAogICAgICAgIHJldHVybiB0aGUgZXh0cmFjdGVkIHZlcnNpb24gYXR0cmlidXRlLCBvciAnZGVmYXVsdCcgaWYgbm8gdmVyc2lvbgogICAgICAgIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBvciB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgd2l0aG91dAogICAgICAgIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhlIHZlcnNpb24gaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKICAgICAgICByZXF1aXJlbWVudCdzIHZlcnNpb24gZm9ybWF0IChpZiBhbnkpLCB1bmxlc3MgaXQgaXMgJ05vbmUnIG9yIHRoZQogICAgICAgIHN1cHBsaWVkICdkZWZhdWx0Jy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgc2VsZi5hdHRyaWJ1dGUgaXMgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZiwgcCwgaSA9IGZpbmRfbW9kdWxlKHNlbGYubW9kdWxlLCBwYXRocykKICAgICAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB2ID0gZ2V0X21vZHVsZV9jb25zdGFudChzZWxmLm1vZHVsZSwgc2VsZi5hdHRyaWJ1dGUsIGRlZmF1bHQsIHBhdGhzKQoKICAgICAgICBpZiB2IGlzIG5vdCBOb25lIGFuZCB2IGlzIG5vdCBkZWZhdWx0IGFuZCBzZWxmLmZvcm1hdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0KHYpCgogICAgICAgIHJldHVybiB2CgogICAgZGVmIGlzX3ByZXNlbnQoc2VsZiwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IG9uICdwYXRocyciIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmVyc2lvbihwYXRocykgaXMgbm90IE5vbmUKCiAgICBkZWYgaXNfY3VycmVudChzZWxmLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgYW5kIHVwLXRvLWRhdGUgb24gJ3BhdGhzJyIiIgogICAgICAgIHZlcnNpb24gPSBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKQogICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9vayh2ZXJzaW9uKQoKCmRlZiBtYXliZV9jbG9zZShmKToKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgZW1wdHkoKToKICAgICAgICB5aWVsZAogICAgICAgIHJldHVybgogICAgaWYgbm90IGY6CiAgICAgICAgcmV0dXJuIGVtcHR5KCkKCiAgICByZXR1cm4gY29udGV4dGxpYi5jbG9zaW5nKGYpCgoKZGVmIGdldF9tb2R1bGVfY29uc3RhbnQobW9kdWxlLCBzeW1ib2wsIGRlZmF1bHQ9LTEsIHBhdGhzPU5vbmUpOgogICAgIiIiRmluZCAnbW9kdWxlJyBieSBzZWFyY2hpbmcgJ3BhdGhzJywgYW5kIGV4dHJhY3QgJ3N5bWJvbCcKCiAgICBSZXR1cm4gJ05vbmUnIGlmICdtb2R1bGUnIGRvZXMgbm90IGV4aXN0IG9uICdwYXRocycsIG9yIGl0IGRvZXMgbm90IGRlZmluZQogICAgJ3N5bWJvbCcuICBJZiB0aGUgbW9kdWxlIGRlZmluZXMgJ3N5bWJvbCcgYXMgYSBjb25zdGFudCwgcmV0dXJuIHRoZQogICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCgogICAgdHJ5OgogICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gaW5mbyA9IGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHMpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBNb2R1bGUgZG9lc24ndCBleGlzdAogICAgICAgIHJldHVybiBOb25lCgogICAgd2l0aCBtYXliZV9jbG9zZShmKToKICAgICAgICBpZiBraW5kID09IFBZX0NPTVBJTEVEOgogICAgICAgICAgICBmLnJlYWQoOCkgICMgc2tpcCBtYWdpYyAmIGRhdGUKICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9GUk9aRU46CiAgICAgICAgICAgIGNvZGUgPSBweTI3Y29tcGF0LmdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSwgcGF0aHMpCiAgICAgICAgZWxpZiBraW5kID09IFBZX1NPVVJDRToKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE5vdCBzb21ldGhpbmcgd2UgY2FuIHBhcnNlOyB3ZSdsbCBoYXZlIHRvIGltcG9ydCBpdC4gIDooCiAgICAgICAgICAgIGltcG9ydGVkID0gcHkyN2NvbXBhdC5nZXRfbW9kdWxlKG1vZHVsZSwgcGF0aHMsIGluZm8pCiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKGltcG9ydGVkLCBzeW1ib2wsIE5vbmUpCgogICAgcmV0dXJuIGV4dHJhY3RfY29uc3RhbnQoY29kZSwgc3ltYm9sLCBkZWZhdWx0KQoKCmRlZiBleHRyYWN0X2NvbnN0YW50KGNvZGUsIHN5bWJvbCwgZGVmYXVsdD0tMSk6CiAgICAiIiJFeHRyYWN0IHRoZSBjb25zdGFudCB2YWx1ZSBvZiAnc3ltYm9sJyBmcm9tICdjb2RlJwoKICAgIElmIHRoZSBuYW1lICdzeW1ib2wnIGlzIGJvdW5kIHRvIGEgY29uc3RhbnQgdmFsdWUgYnkgdGhlIFB5dGhvbiBjb2RlCiAgICBvYmplY3QgJ2NvZGUnLCByZXR1cm4gdGhhdCB2YWx1ZS4gIElmICdzeW1ib2wnIGlzIGJvdW5kIHRvIGFuIGV4cHJlc3Npb24sCiAgICByZXR1cm4gJ2RlZmF1bHQnLiAgT3RoZXJ3aXNlLCByZXR1cm4gJ05vbmUnLgoKICAgIFJldHVybiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgZmlyc3QgYXNzaWdubWVudCB0byAnc3ltYm9sJy4gICdzeW1ib2wnIG11c3QKICAgIGJlIGEgZ2xvYmFsLCBvciBhdCBsZWFzdCBhIG5vbi0iZmFzdCIgbG9jYWwgaW4gdGhlIGNvZGUgYmxvY2suICBUaGF0IGlzLAogICAgb25seSAnU1RPUkVfTkFNRScgYW5kICdTVE9SRV9HTE9CQUwnIG9wY29kZXMgYXJlIGNoZWNrZWQsIGFuZCAnc3ltYm9sJwogICAgbXVzdCBiZSBwcmVzZW50IGluICdjb2RlLmNvX25hbWVzJy4KICAgICIiIgogICAgaWYgc3ltYm9sIG5vdCBpbiBjb2RlLmNvX25hbWVzOgogICAgICAgICMgbmFtZSdzIG5vdCB0aGVyZSwgY2FuJ3QgcG9zc2libHkgYmUgYW4gYXNzaWdubWVudAogICAgICAgIHJldHVybiBOb25lCgogICAgbmFtZV9pZHggPSBsaXN0KGNvZGUuY29fbmFtZXMpLmluZGV4KHN5bWJvbCkKCiAgICBTVE9SRV9OQU1FID0gOTAKICAgIFNUT1JFX0dMT0JBTCA9IDk3CiAgICBMT0FEX0NPTlNUID0gMTAwCgogICAgY29uc3QgPSBkZWZhdWx0CgogICAgZm9yIGJ5dGVfY29kZSBpbiBCeXRlY29kZShjb2RlKToKICAgICAgICBvcCA9IGJ5dGVfY29kZS5vcGNvZGUKICAgICAgICBhcmcgPSBieXRlX2NvZGUuYXJnCgogICAgICAgIGlmIG9wID09IExPQURfQ09OU1Q6CiAgICAgICAgICAgIGNvbnN0ID0gY29kZS5jb19jb25zdHNbYXJnXQogICAgICAgIGVsaWYgYXJnID09IG5hbWVfaWR4IGFuZCAob3AgPT0gU1RPUkVfTkFNRSBvciBvcCA9PSBTVE9SRV9HTE9CQUwpOgogICAgICAgICAgICByZXR1cm4gY29uc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25zdCA9IGRlZmF1bHQKCgpkZWYgX3VwZGF0ZV9nbG9iYWxzKCk6CiAgICAiIiIKICAgIFBhdGNoIHRoZSBnbG9iYWxzIHRvIHJlbW92ZSB0aGUgb2JqZWN0cyBub3QgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zLgoKICAgIFhYWCBpdCdkIGJlIGJldHRlciB0byB0ZXN0IGFzc2VydGlvbnMgYWJvdXQgYnl0ZWNvZGUgaW5zdGVhZC4KICAgICIiIgoKICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpIGFuZCBzeXMucGxhdGZvcm0gIT0gJ2NsaSc6CiAgICAgICAgcmV0dXJuCiAgICBpbmNvbXBhdGlibGUgPSAnZXh0cmFjdF9jb25zdGFudCcsICdnZXRfbW9kdWxlX2NvbnN0YW50JwogICAgZm9yIG5hbWUgaW4gaW5jb21wYXRpYmxlOgogICAgICAgIGRlbCBnbG9iYWxzKClbbmFtZV0KICAgICAgICBfX2FsbF9fLnJlbW92ZShuYW1lKQoKCl91cGRhdGVfZ2xvYmFscygpClBLAwQUAAAAAAAAACEAFfJflMHCAADBwgAANwAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2Rpc3QucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQpfX2FsbF9fID0gWydEaXN0cmlidXRpb24nXQoKaW1wb3J0IGlvCmltcG9ydCBzeXMKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG51bWJlcnMKaW1wb3J0IGRpc3R1dGlscy5sb2cKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuY21kCmltcG9ydCBkaXN0dXRpbHMuZGlzdApmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdHJ0b2Jvb2wKZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCmZyb20gZGlzdHV0aWxzLmZhbmN5X2dldG9wdCBpbXBvcnQgdHJhbnNsYXRlX2xvbmdvcHQKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZV9mcm9tX2ZpbGUKCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIERpc3R1dGlsc1NldHVwRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgcmZjODIyX2VzY2FwZQpmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IG9yZGVyZWRfc2V0CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlciwgZmlsdGVyZmFsc2UKCmZyb20gLiBpbXBvcnQgU2V0dXB0b29sc0RlcHJlY2F0aW9uV2FybmluZwoKZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCB3aW5kb3dzX3N1cHBvcnQKZnJvbSBzZXR1cHRvb2xzLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZApmcm9tIHNldHVwdG9vbHMuY29uZmlnIGltcG9ydCBwYXJzZV9jb25maWd1cmF0aW9uCmltcG9ydCBwa2dfcmVzb3VyY2VzCgpfX2ltcG9ydF9fKCdzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3NldHVwdG9vbHMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKCgpkZWYgX2dldF91bnBhdGNoZWQoY2xzKToKICAgIHdhcm5pbmdzLndhcm4oIkRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24iLCBEaXN0RGVwcmVjYXRpb25XYXJuaW5nKQogICAgcmV0dXJuIGdldF91bnBhdGNoZWQoY2xzKQoKCmRlZiBnZXRfbWV0YWRhdGFfdmVyc2lvbihzZWxmKToKICAgIG12ID0gZ2V0YXR0cihzZWxmLCAnbWV0YWRhdGFfdmVyc2lvbicsIE5vbmUpCgogICAgaWYgbXYgaXMgTm9uZToKICAgICAgICBpZiBzZWxmLmxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlIG9yIHNlbGYucHJvdmlkZXNfZXh0cmFzOgogICAgICAgICAgICBtdiA9IFN0cmljdFZlcnNpb24oJzIuMScpCiAgICAgICAgZWxpZiAoc2VsZi5tYWludGFpbmVyIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgc2VsZi5tYWludGFpbmVyX2VtYWlsIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJywgTm9uZSkgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICBzZWxmLnByb2plY3RfdXJscyk6CiAgICAgICAgICAgIG12ID0gU3RyaWN0VmVyc2lvbignMS4yJykKICAgICAgICBlbGlmIChzZWxmLnByb3ZpZGVzIG9yIHNlbGYucmVxdWlyZXMgb3Igc2VsZi5vYnNvbGV0ZXMgb3IKICAgICAgICAgICAgICAgIHNlbGYuY2xhc3NpZmllcnMgb3Igc2VsZi5kb3dubG9hZF91cmwpOgogICAgICAgICAgICBtdiA9IFN0cmljdFZlcnNpb24oJzEuMScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXYgPSBTdHJpY3RWZXJzaW9uKCcxLjAnKQoKICAgICAgICBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gPSBtdgoKICAgIHJldHVybiBtdgoKCmRlZiByZWFkX3BrZ19maWxlKHNlbGYsIGZpbGUpOgogICAgIiIiUmVhZHMgdGhlIG1ldGFkYXRhIHZhbHVlcyBmcm9tIGEgZmlsZSBvYmplY3QuIiIiCiAgICBtc2cgPSBtZXNzYWdlX2Zyb21fZmlsZShmaWxlKQoKICAgIGRlZiBfcmVhZF9maWVsZChuYW1lKToKICAgICAgICB2YWx1ZSA9IG1zZ1tuYW1lXQogICAgICAgIGlmIHZhbHVlID09ICdVTktOT1dOJzoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgX3JlYWRfbGlzdChuYW1lKToKICAgICAgICB2YWx1ZXMgPSBtc2cuZ2V0X2FsbChuYW1lLCBOb25lKQogICAgICAgIGlmIHZhbHVlcyA9PSBbXToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gdmFsdWVzCgogICAgc2VsZi5tZXRhZGF0YV92ZXJzaW9uID0gU3RyaWN0VmVyc2lvbihtc2dbJ21ldGFkYXRhLXZlcnNpb24nXSkKICAgIHNlbGYubmFtZSA9IF9yZWFkX2ZpZWxkKCduYW1lJykKICAgIHNlbGYudmVyc2lvbiA9IF9yZWFkX2ZpZWxkKCd2ZXJzaW9uJykKICAgIHNlbGYuZGVzY3JpcHRpb24gPSBfcmVhZF9maWVsZCgnc3VtbWFyeScpCiAgICAjIHdlIGFyZSBmaWxsaW5nIGF1dGhvciBvbmx5LgogICAgc2VsZi5hdXRob3IgPSBfcmVhZF9maWVsZCgnYXV0aG9yJykKICAgIHNlbGYubWFpbnRhaW5lciA9IE5vbmUKICAgIHNlbGYuYXV0aG9yX2VtYWlsID0gX3JlYWRfZmllbGQoJ2F1dGhvci1lbWFpbCcpCiAgICBzZWxmLm1haW50YWluZXJfZW1haWwgPSBOb25lCiAgICBzZWxmLnVybCA9IF9yZWFkX2ZpZWxkKCdob21lLXBhZ2UnKQogICAgc2VsZi5saWNlbnNlID0gX3JlYWRfZmllbGQoJ2xpY2Vuc2UnKQoKICAgIGlmICdkb3dubG9hZC11cmwnIGluIG1zZzoKICAgICAgICBzZWxmLmRvd25sb2FkX3VybCA9IF9yZWFkX2ZpZWxkKCdkb3dubG9hZC11cmwnKQogICAgZWxzZToKICAgICAgICBzZWxmLmRvd25sb2FkX3VybCA9IE5vbmUKCiAgICBzZWxmLmxvbmdfZGVzY3JpcHRpb24gPSBfcmVhZF9maWVsZCgnZGVzY3JpcHRpb24nKQogICAgc2VsZi5kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdzdW1tYXJ5JykKCiAgICBpZiAna2V5d29yZHMnIGluIG1zZzoKICAgICAgICBzZWxmLmtleXdvcmRzID0gX3JlYWRfZmllbGQoJ2tleXdvcmRzJykuc3BsaXQoJywnKQoKICAgIHNlbGYucGxhdGZvcm1zID0gX3JlYWRfbGlzdCgncGxhdGZvcm0nKQogICAgc2VsZi5jbGFzc2lmaWVycyA9IF9yZWFkX2xpc3QoJ2NsYXNzaWZpZXInKQoKICAgICMgUEVQIDMxNCAtIHRoZXNlIGZpZWxkcyBvbmx5IGV4aXN0IGluIDEuMQogICAgaWYgc2VsZi5tZXRhZGF0YV92ZXJzaW9uID09IFN0cmljdFZlcnNpb24oJzEuMScpOgogICAgICAgIHNlbGYucmVxdWlyZXMgPSBfcmVhZF9saXN0KCdyZXF1aXJlcycpCiAgICAgICAgc2VsZi5wcm92aWRlcyA9IF9yZWFkX2xpc3QoJ3Byb3ZpZGVzJykKICAgICAgICBzZWxmLm9ic29sZXRlcyA9IF9yZWFkX2xpc3QoJ29ic29sZXRlcycpCiAgICBlbHNlOgogICAgICAgIHNlbGYucmVxdWlyZXMgPSBOb25lCiAgICAgICAgc2VsZi5wcm92aWRlcyA9IE5vbmUKICAgICAgICBzZWxmLm9ic29sZXRlcyA9IE5vbmUKCgojIEJhc2VkIG9uIFB5dGhvbiAzLjUgdmVyc2lvbgpkZWYgd3JpdGVfcGtnX2ZpbGUoc2VsZiwgZmlsZSk6CiAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZm9ybWF0IGRhdGEgdG8gYSBmaWxlIG9iamVjdC4KICAgICIiIgogICAgdmVyc2lvbiA9IHNlbGYuZ2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgZGVmIHdyaXRlX2ZpZWxkKGtleSwgdmFsdWUpOgogICAgICAgICAgICBmaWxlLndyaXRlKCIlczogJXNcbiIgJSAoa2V5LCBzZWxmLl9lbmNvZGVfZmllbGQodmFsdWUpKSkKICAgIGVsc2U6CiAgICAgICAgZGVmIHdyaXRlX2ZpZWxkKGtleSwgdmFsdWUpOgogICAgICAgICAgICBmaWxlLndyaXRlKCIlczogJXNcbiIgJSAoa2V5LCB2YWx1ZSkpCgogICAgd3JpdGVfZmllbGQoJ01ldGFkYXRhLVZlcnNpb24nLCBzdHIodmVyc2lvbikpCiAgICB3cml0ZV9maWVsZCgnTmFtZScsIHNlbGYuZ2V0X25hbWUoKSkKICAgIHdyaXRlX2ZpZWxkKCdWZXJzaW9uJywgc2VsZi5nZXRfdmVyc2lvbigpKQogICAgd3JpdGVfZmllbGQoJ1N1bW1hcnknLCBzZWxmLmdldF9kZXNjcmlwdGlvbigpKQogICAgd3JpdGVfZmllbGQoJ0hvbWUtcGFnZScsIHNlbGYuZ2V0X3VybCgpKQoKICAgIGlmIHZlcnNpb24gPCBTdHJpY3RWZXJzaW9uKCcxLjInKToKICAgICAgICB3cml0ZV9maWVsZCgnQXV0aG9yJywgc2VsZi5nZXRfY29udGFjdCgpKQogICAgICAgIHdyaXRlX2ZpZWxkKCdBdXRob3ItZW1haWwnLCBzZWxmLmdldF9jb250YWN0X2VtYWlsKCkpCiAgICBlbHNlOgogICAgICAgIG9wdGlvbmFsX2ZpZWxkcyA9ICgKICAgICAgICAgICAgKCdBdXRob3InLCAnYXV0aG9yJyksCiAgICAgICAgICAgICgnQXV0aG9yLWVtYWlsJywgJ2F1dGhvcl9lbWFpbCcpLAogICAgICAgICAgICAoJ01haW50YWluZXInLCAnbWFpbnRhaW5lcicpLAogICAgICAgICAgICAoJ01haW50YWluZXItZW1haWwnLCAnbWFpbnRhaW5lcl9lbWFpbCcpLAogICAgICAgICkKCiAgICAgICAgZm9yIGZpZWxkLCBhdHRyIGluIG9wdGlvbmFsX2ZpZWxkczoKICAgICAgICAgICAgYXR0cl92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCgogICAgICAgICAgICBpZiBhdHRyX3ZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHdyaXRlX2ZpZWxkKGZpZWxkLCBhdHRyX3ZhbCkKCiAgICB3cml0ZV9maWVsZCgnTGljZW5zZScsIHNlbGYuZ2V0X2xpY2Vuc2UoKSkKICAgIGlmIHNlbGYuZG93bmxvYWRfdXJsOgogICAgICAgIHdyaXRlX2ZpZWxkKCdEb3dubG9hZC1VUkwnLCBzZWxmLmRvd25sb2FkX3VybCkKICAgIGZvciBwcm9qZWN0X3VybCBpbiBzZWxmLnByb2plY3RfdXJscy5pdGVtcygpOgogICAgICAgIHdyaXRlX2ZpZWxkKCdQcm9qZWN0LVVSTCcsICAnJXMsICVzJyAlIHByb2plY3RfdXJsKQoKICAgIGxvbmdfZGVzYyA9IHJmYzgyMl9lc2NhcGUoc2VsZi5nZXRfbG9uZ19kZXNjcmlwdGlvbigpKQogICAgd3JpdGVfZmllbGQoJ0Rlc2NyaXB0aW9uJywgbG9uZ19kZXNjKQoKICAgIGtleXdvcmRzID0gJywnLmpvaW4oc2VsZi5nZXRfa2V5d29yZHMoKSkKICAgIGlmIGtleXdvcmRzOgogICAgICAgIHdyaXRlX2ZpZWxkKCdLZXl3b3JkcycsIGtleXdvcmRzKQoKICAgIGlmIHZlcnNpb24gPj0gU3RyaWN0VmVyc2lvbignMS4yJyk6CiAgICAgICAgZm9yIHBsYXRmb3JtIGluIHNlbGYuZ2V0X3BsYXRmb3JtcygpOgogICAgICAgICAgICB3cml0ZV9maWVsZCgnUGxhdGZvcm0nLCBwbGF0Zm9ybSkKICAgIGVsc2U6CiAgICAgICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUGxhdGZvcm0nLCBzZWxmLmdldF9wbGF0Zm9ybXMoKSkKCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdDbGFzc2lmaWVyJywgc2VsZi5nZXRfY2xhc3NpZmllcnMoKSkKCiAgICAjIFBFUCAzMTQKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1JlcXVpcmVzJywgc2VsZi5nZXRfcmVxdWlyZXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1Byb3ZpZGVzJywgc2VsZi5nZXRfcHJvdmlkZXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ09ic29sZXRlcycsIHNlbGYuZ2V0X29ic29sZXRlcygpKQoKICAgICMgU2V0dXB0b29scyBzcGVjaWZpYyBmb3IgUEVQIDM0NQogICAgaWYgaGFzYXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJyk6CiAgICAgICAgd3JpdGVfZmllbGQoJ1JlcXVpcmVzLVB5dGhvbicsIHNlbGYucHl0aG9uX3JlcXVpcmVzKQoKICAgICMgUEVQIDU2NgogICAgaWYgc2VsZi5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZToKICAgICAgICB3cml0ZV9maWVsZCgKICAgICAgICAgICAgJ0Rlc2NyaXB0aW9uLUNvbnRlbnQtVHlwZScsCiAgICAgICAgICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUKICAgICAgICApCiAgICBpZiBzZWxmLnByb3ZpZGVzX2V4dHJhczoKICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5wcm92aWRlc19leHRyYXM6CiAgICAgICAgICAgIHdyaXRlX2ZpZWxkKCdQcm92aWRlcy1FeHRyYScsIGV4dHJhKQoKCnNlcXVlbmNlID0gdHVwbGUsIGxpc3QKCgpkZWYgY2hlY2tfaW1wb3J0YWJsZShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICB0cnk6CiAgICAgICAgZXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2UoJ3g9JyArIHZhbHVlKQogICAgICAgIGFzc2VydCBub3QgZXAuZXh0cmFzCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBpbXBvcnRhYmxlICdtb2R1bGU6YXR0cnMnIHN0cmluZyAoZ290ICVyKSIKICAgICAgICAgICAgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBzdHJpbmcgbGlzdCIiIgogICAgdHJ5OgogICAgICAgICMgdmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBsaXN0IG9yIHR1cGxlIHRvIGV4Y2x1ZGUgdW5vcmRlcmVkCiAgICAgICAgIyBvciBzaW5nbGUtdXNlIGl0ZXJhYmxlcwogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKQogICAgICAgICMgdmVyaWZ5IHRoYXQgZWxlbWVudHMgb2YgdmFsdWUgYXJlIHN0cmluZ3MKICAgICAgICBhc3NlcnQgJycuam9pbih2YWx1ZSkgIT0gdmFsdWUKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICIlciBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIiAlIChhdHRyLCB2YWx1ZSkKICAgICAgICApCgoKZGVmIGNoZWNrX25zcChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBuYW1lc3BhY2UgcGFja2FnZXMgYXJlIHZhbGlkIiIiCiAgICBuc19wYWNrYWdlcyA9IHZhbHVlCiAgICBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgbnNfcGFja2FnZXMpCiAgICBmb3IgbnNwIGluIG5zX3BhY2thZ2VzOgogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IobnNwKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gY29udGFpbnMgbm8gbW9kdWxlcyBvciBwYWNrYWdlcyBmb3IgIiArCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIHBhY2thZ2UgJXIiICUgbnNwCiAgICAgICAgICAgICkKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBuc3AucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50IGFuZCBwYXJlbnQgbm90IGluIG5zX3BhY2thZ2VzOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgaXMgZGVjbGFyZWQgYXMgYSBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0ICVyIgogICAgICAgICAgICAgICAgIiBpcyBub3Q6IHBsZWFzZSBjb3JyZWN0IHRoaXMgaW4gc2V0dXAucHkiLCBuc3AsIHBhcmVudAogICAgICAgICAgICApCgoKZGVmIGNoZWNrX2V4dHJhcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBleHRyYXNfcmVxdWlyZSBtYXBwaW5nIGlzIHZhbGlkIiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChpdGVydG9vbHMuc3Rhcm1hcChfY2hlY2tfZXh0cmEsIHZhbHVlLml0ZW1zKCkpKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJ2V4dHJhc19yZXF1aXJlJyBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSB2YWx1ZXMgYXJlICIKICAgICAgICAgICAgInN0cmluZ3Mgb3IgbGlzdHMgb2Ygc3RyaW5ncyBjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiAiCiAgICAgICAgICAgICJyZXF1aXJlbWVudCBzcGVjaWZpZXJzLiIKICAgICAgICApCgoKZGVmIF9jaGVja19leHRyYShleHRyYSwgcmVxcyk6CiAgICBuYW1lLCBzZXAsIG1hcmtlciA9IGV4dHJhLnBhcnRpdGlvbignOicpCiAgICBpZiBtYXJrZXIgYW5kIHBrZ19yZXNvdXJjZXMuaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJJbnZhbGlkIGVudmlyb25tZW50IG1hcmtlcjogIiArIG1hcmtlcikKICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCgoKZGVmIGFzc2VydF9ib29sKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIFRydWUsIEZhbHNlLCAwLCBvciAxIiIiCiAgICBpZiBib29sKHZhbHVlKSAhPSB2YWx1ZToKICAgICAgICB0bXBsID0gInthdHRyIXJ9IG11c3QgYmUgYSBib29sZWFuIHZhbHVlIChnb3Qge3ZhbHVlIXJ9KSIKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgdmFsdWU9dmFsdWUpKQoKCmRlZiBjaGVja19yZXF1aXJlbWVudHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgaW5zdGFsbF9yZXF1aXJlcyBpcyBhIHZhbGlkIHJlcXVpcmVtZW50cyBsaXN0IiIiCiAgICB0cnk6CiAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2YWx1ZSkpCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGRpY3QsIHNldCkpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVub3JkZXJlZCB0eXBlcyBhcmUgbm90IGFsbG93ZWQiKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19zcGVjaWZpZXIoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllciIiIgogICAgdHJ5OgogICAgICAgIHBhY2thZ2luZy5zcGVjaWZpZXJzLlNwZWNpZmllclNldCh2YWx1ZSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcuc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyIGFzIGVycm9yOgogICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICJ7YXR0ciFyfSBtdXN0IGJlIGEgc3RyaW5nICIKICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXJzOyB7ZXJyb3J9IgogICAgICAgICkKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKHRtcGwuZm9ybWF0KGF0dHI9YXR0ciwgZXJyb3I9ZXJyb3IpKQoKCmRlZiBjaGVja19lbnRyeV9wb2ludHMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZW50cnlfcG9pbnRzIG1hcCBpcyBwYXJzZWFibGUiIiIKICAgIHRyeToKICAgICAgICBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKHZhbHVlKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKGUpCgoKZGVmIGNoZWNrX3Rlc3Rfc3VpdGUoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoInRlc3Rfc3VpdGUgbXVzdCBiZSBhIHN0cmluZyIpCgoKZGVmIGNoZWNrX3BhY2thZ2VfZGF0YShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIGRpY3Rpb25hcnkgb2YgcGFja2FnZSBuYW1lcyB0byBnbG9iIGxpc3RzIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgInshcn0gbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mICIKICAgICAgICAgICAgInN0cmluZyB3aWxkY2FyZCBwYXR0ZXJucyIuZm9ybWF0KGF0dHIpKQogICAgZm9yIGssIHYgaW4gdmFsdWUuaXRlbXMoKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJrZXlzIG9mIHshcn0gZGljdCBtdXN0IGJlIHN0cmluZ3MgKGdvdCB7IXJ9KSIKICAgICAgICAgICAgICAgIC5mb3JtYXQoYXR0ciwgaykKICAgICAgICAgICAgKQogICAgICAgIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCAndmFsdWVzIG9mIHshcn0gZGljdCcuZm9ybWF0KGF0dHIpLCB2KQoKCmRlZiBjaGVja19wYWNrYWdlcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICBmb3IgcGtnbmFtZSBpbiB2YWx1ZToKICAgICAgICBpZiBub3QgcmUubWF0Y2gocidcdysoXC5cdyspKicsIHBrZ25hbWUpOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgbm90IGEgdmFsaWQgcGFja2FnZSBuYW1lOyBwbGVhc2UgdXNlIG9ubHkgIgogICAgICAgICAgICAgICAgIi4tc2VwYXJhdGVkIHBhY2thZ2UgbmFtZXMgaW4gc2V0dXAucHkiLCBwa2duYW1lCiAgICAgICAgICAgICkKCgpfRGlzdHJpYnV0aW9uID0gZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24pCgoKY2xhc3MgRGlzdHJpYnV0aW9uKF9EaXN0cmlidXRpb24pOgogICAgIiIiRGlzdHJpYnV0aW9uIHdpdGggc3VwcG9ydCBmb3IgZmVhdHVyZXMsIHRlc3RzLCBhbmQgcGFja2FnZSBkYXRhCgogICAgVGhpcyBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mICdkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24nIHRoYXQKICAgIGVmZmVjdGl2ZWx5IGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknOgoKICAgICAnaW5zdGFsbF9yZXF1aXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHByb2plY3QKICAgICAgICB2ZXJzaW9ucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVxdWlyZXMgd2hlbiBpbnN0YWxsZWQsIGluIHRoZSBmb3JtYXQKICAgICAgICB1c2VkIGJ5ICdwa2dfcmVzb3VyY2VzLnJlcXVpcmUoKScuICBUaGV5IHdpbGwgYmUgaW5zdGFsbGVkCiAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gIElmIHlvdSB3aXNoIHRvIHVzZQogICAgICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gUHlQSSwgb3Igd2FudCB0byBnaXZlIHlvdXIgdXNlcnMgYW4KICAgICAgICBhbHRlcm5hdGUgZG93bmxvYWQgbG9jYXRpb24sIHlvdSBjYW4gYWRkIGEgJ2ZpbmRfbGlua3MnIG9wdGlvbiB0byB0aGUKICAgICAgICAnW2Vhc3lfaW5zdGFsbF0nIHNlY3Rpb24gb2YgeW91ciBwcm9qZWN0J3MgJ3NldHVwLmNmZycgZmlsZSwgYW5kIHRoZW4KICAgICAgICBzZXR1cHRvb2xzIHdpbGwgc2NhbiB0aGUgbGlzdGVkIHdlYiBwYWdlcyBmb3IgbGlua3MgdGhhdCBzYXRpc2Z5IHRoZQogICAgICAgIHJlcXVpcmVtZW50cy4KCiAgICAgJ2V4dHJhc19yZXF1aXJlJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBvcHRpb25hbCAiZXh0cmFzIiB0byB0aGUKICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50KHMpIHRoYXQgdXNpbmcgdGhvc2UgZXh0cmFzIGluY3Vycy4gRm9yIGV4YW1wbGUsCiAgICAgICAgdGhpczo6CgogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IGRpY3QocmVTVCA9IFsiZG9jdXRpbHM+PTAuMyIsICJyZVNUZWRpdCJdKQoKICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZXh0cmEKICAgICAgICBjYXBhYmlsaXR5IGNhbGxlZCAicmVTVCIsIGJ1dCBpdCBjYW4gb25seSBiZSB1c2VkIGlmIGRvY3V0aWxzIGFuZAogICAgICAgIHJlU1RlZGl0IGFyZSBpbnN0YWxsZWQuICBJZiB0aGUgdXNlciBpbnN0YWxscyB5b3VyIHBhY2thZ2UgdXNpbmcKICAgICAgICBFYXN5SW5zdGFsbCBhbmQgcmVxdWVzdHMgb25lIG9mIHlvdXIgZXh0cmFzLCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHdpbGwgYmUgaW5zdGFsbGVkIGlmIG5lZWRlZC4KCiAgICAgJ2ZlYXR1cmVzJyAqKmRlcHJlY2F0ZWQqKiAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gbmFtZXMgdG8KICAgICAgICAnc2V0dXB0b29scy5GZWF0dXJlJwogICAgICAgIG9iamVjdHMuICBGZWF0dXJlcyBhcmUgYSBwb3J0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUKICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZCBiYXNlZCBvbiB1c2VyIG9wdGlvbnMsIGludGVyLWZlYXR1cmUgZGVwZW5kZW5jaWVzLAogICAgICAgIGFuZCBhdmFpbGFiaWxpdHkgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgRXhjbHVkZWQgZmVhdHVyZXMgYXJlIG9taXR0ZWQKICAgICAgICBmcm9tIGFsbCBzZXR1cCBjb21tYW5kcywgaW5jbHVkaW5nIHNvdXJjZSBhbmQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMsIHNvCiAgICAgICAgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgogICAgICAgIEZlYXR1cmUgbmFtZXMgc2hvdWxkIGJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycywgZXhjZXB0IHRoYXQgdGhleSBtYXkKICAgICAgICBjb250YWluIHRoZSAnLScgKG1pbnVzKSBzaWduLiAgRmVhdHVyZXMgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCiAgICAgICAgdmlhIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS13aXRoLVgnIGFuZCAnLS13aXRob3V0LVgnLCB3aGVyZSAnWCcgaXMKICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gIFdoZXRoZXIgYSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGFuZAogICAgICAgIHdoZXRoZXIgeW91IGFyZSBhbGxvd2VkIHRvIGNvbnRyb2wgdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGlzCiAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgRmVhdHVyZSBvYmplY3QuICBTZWUgdGhlICdGZWF0dXJlJyBjbGFzcyBmb3IgbW9yZQogICAgICAgIGluZm9ybWF0aW9uLgoKICAgICAndGVzdF9zdWl0ZScgLS0gdGhlIG5hbWUgb2YgYSB0ZXN0IHN1aXRlIHRvIHJ1biBmb3IgdGhlICd0ZXN0JyBjb21tYW5kLgogICAgICAgIElmIHRoZSB1c2VyIHJ1bnMgJ3B5dGhvbiBzZXR1cC5weSB0ZXN0JywgdGhlIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQsCiAgICAgICAgYW5kIHRoZSBuYW1lZCB0ZXN0IHN1aXRlIHdpbGwgYmUgcnVuLiAgVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcwogICAgICAgIHdvdWxkIGJlIHVzZWQgb24gYSAndW5pdHRlc3QucHknIGNvbW1hbmQgbGluZS4gIFRoYXQgaXMsIGl0IGlzIHRoZQogICAgICAgIGRvdHRlZCBuYW1lIG9mIGFuIG9iamVjdCB0byBpbXBvcnQgYW5kIGNhbGwgdG8gZ2VuZXJhdGUgYSB0ZXN0IHN1aXRlLgoKICAgICAncGFja2FnZV9kYXRhJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mIGZpbGVuYW1lcwogICAgICAgIG9yIGdsb2JzIHRvIHVzZSB0byBmaW5kIGRhdGEgZmlsZXMgY29udGFpbmVkIGluIHRoZSBuYW1lZCBwYWNrYWdlcy4KICAgICAgICBJZiB0aGUgZGljdGlvbmFyeSBoYXMgZmlsZW5hbWVzIG9yIGdsb2JzIGxpc3RlZCB1bmRlciAnIiInICh0aGUgZW1wdHkKICAgICAgICBzdHJpbmcpLCB0aG9zZSBuYW1lcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBldmVyeSBwYWNrYWdlLCBpbiBhZGRpdGlvbgogICAgICAgIHRvIGFueSBuYW1lcyBmb3IgdGhlIHNwZWNpZmljIHBhY2thZ2UuICBEYXRhIGZpbGVzIGZvdW5kIHVzaW5nIHRoZXNlCiAgICAgICAgbmFtZXMvZ2xvYnMgd2lsbCBiZSBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aGUgcGFja2FnZSwgaW4gdGhlIHNhbWUKICAgICAgICBsb2NhdGlvbiBhcyB0aGUgcGFja2FnZS4gIE5vdGUgdGhhdCBnbG9icyBhcmUgYWxsb3dlZCB0byByZWZlcmVuY2UKICAgICAgICB0aGUgY29udGVudHMgb2Ygbm9uLXBhY2thZ2Ugc3ViZGlyZWN0b3JpZXMsIGFzIGxvbmcgYXMgeW91IHVzZSAnLycgYXMKICAgICAgICBhIHBhdGggc2VwYXJhdG9yLiAgKEdsb2JzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0bwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGF0IHJ1bnRpbWUuKQoKICAgIEluIGFkZGl0aW9uIHRvIHRoZXNlIG5ldyBrZXl3b3JkcywgdGhpcyBjbGFzcyBhbHNvIGhhcyBzZXZlcmFsIG5ldyBtZXRob2RzCiAgICBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkaXN0cmlidXRpb24ncyBjb250ZW50cy4gIEZvciBleGFtcGxlLCB0aGUgJ2luY2x1ZGUoKScKICAgIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluLXBsYWNlIGFkZCBhbmQgc3VidHJhY3QKICAgIGNvbW1hbmRzIHRoYXQgYWRkIG9yIHJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgZXh0ZW5zaW9ucywgYW5kIHNvIG9uIGZyb20KICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBmZWF0dXJlIHN1YnN5c3RlbSB0byBjb25maWd1cmUgdGhlCiAgICBkaXN0cmlidXRpb24gZm9yIHRoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgZmVhdHVyZXMuCiAgICAiIiIKCiAgICBfRElTVFVUSUxTX1VOU1VQUE9SVEVEX01FVEFEQVRBID0gewogICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSc6IE5vbmUsCiAgICAgICAgJ3Byb2plY3RfdXJscyc6IGRpY3QsCiAgICAgICAgJ3Byb3ZpZGVzX2V4dHJhcyc6IG9yZGVyZWRfc2V0Lk9yZGVyZWRTZXQsCiAgICAgICAgJ2xpY2Vuc2VfZmlsZXMnOiBvcmRlcmVkX3NldC5PcmRlcmVkU2V0LAogICAgfQoKICAgIF9wYXRjaGVkX2Rpc3QgPSBOb25lCgogICAgZGVmIHBhdGNoX21pc3NpbmdfcGtnX2luZm8oc2VsZiwgYXR0cnMpOgogICAgICAgICMgRmFrZSB1cCBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGF0YSB0aGF0IHdvdWxkIG5vcm1hbGx5IGNvbWUgZnJvbQogICAgICAgICMgUEtHLUlORk8sIGJ1dCB3aGljaCBtaWdodCBub3QgeWV0IGJlIGJ1aWx0IGlmIHRoaXMgaXMgYSBmcmVzaAogICAgICAgICMgY2hlY2tvdXQuCiAgICAgICAgIwogICAgICAgIGlmIG5vdCBhdHRycyBvciAnbmFtZScgbm90IGluIGF0dHJzIG9yICd2ZXJzaW9uJyBub3QgaW4gYXR0cnM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGtleSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lKHN0cihhdHRyc1snbmFtZSddKSkubG93ZXIoKQogICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleS5nZXQoa2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICAgICAgZGlzdC5fdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uKHN0cihhdHRyc1sndmVyc2lvbiddKSkKICAgICAgICAgICAgc2VsZi5fcGF0Y2hlZF9kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRycz1Ob25lKToKICAgICAgICBoYXZlX3BhY2thZ2VfZGF0YSA9IGhhc2F0dHIoc2VsZiwgInBhY2thZ2VfZGF0YSIpCiAgICAgICAgaWYgbm90IGhhdmVfcGFja2FnZV9kYXRhOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHt9CiAgICAgICAgYXR0cnMgPSBhdHRycyBvciB7fQogICAgICAgIGlmICdmZWF0dXJlcycgaW4gYXR0cnMgb3IgJ3JlcXVpcmVfZmVhdHVyZXMnIGluIGF0dHJzOgogICAgICAgICAgICBGZWF0dXJlLndhcm5fZGVwcmVjYXRlZCgpCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gW10KICAgICAgICBzZWxmLmZlYXR1cmVzID0ge30KICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQogICAgICAgICMgRmlsdGVyLW91dCBzZXR1cHRvb2xzJyBzcGVjaWZpYyBvcHRpb25zLgogICAgICAgIHNlbGYuc3JjX3Jvb3QgPSBhdHRycy5wb3AoInNyY19yb290IiwgTm9uZSkKICAgICAgICBzZWxmLnBhdGNoX21pc3NpbmdfcGtnX2luZm8oYXR0cnMpCiAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gYXR0cnMucG9wKCdkZXBlbmRlbmN5X2xpbmtzJywgW10pCiAgICAgICAgc2VsZi5zZXR1cF9yZXF1aXJlcyA9IGF0dHJzLnBvcCgnc2V0dXBfcmVxdWlyZXMnLCBbXSkKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CiAgICAgICAgICAgIHZhcnMoc2VsZikuc2V0ZGVmYXVsdChlcC5uYW1lLCBOb25lKQogICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZiwgewogICAgICAgICAgICBrOiB2IGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCkKICAgICAgICAgICAgaWYgayBub3QgaW4gc2VsZi5fRElTVFVUSUxTX1VOU1VQUE9SVEVEX01FVEFEQVRBCiAgICAgICAgfSkKCiAgICAgICAgIyBGaWxsLWluIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIG5vdCBzdXBwb3J0ZWQgYnkgZGlzdHV0aWxzLgogICAgICAgICMgTm90ZSBzb21lIGZpZWxkcyBtYXkgaGF2ZSBiZWVuIHNldCBieSBvdGhlciB0b29scyAoZS5nLiBwYnIpCiAgICAgICAgIyBhYm92ZTsgdGhleSBhcmUgdGFrZW4gcHJlZmVycmVudGlhbGx5IHRvIHNldHVwKCkgYXJndW1lbnRzCiAgICAgICAgZm9yIG9wdGlvbiwgZGVmYXVsdCBpbiBzZWxmLl9ESVNUVVRJTFNfVU5TVVBQT1JURURfTUVUQURBVEEuaXRlbXMoKToKICAgICAgICAgICAgZm9yIHNvdXJjZSBpbiBzZWxmLm1ldGFkYXRhLl9fZGljdF9fLCBhdHRyczoKICAgICAgICAgICAgICAgIGlmIG9wdGlvbiBpbiBzb3VyY2U6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzb3VyY2Vbb3B0aW9uXQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHQoKSBpZiBkZWZhdWx0IGVsc2UgTm9uZQogICAgICAgICAgICBzZXRhdHRyKHNlbGYubWV0YWRhdGEsIG9wdGlvbiwgdmFsdWUpCgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tZXRhZGF0YS52ZXJzaW9uLCBudW1iZXJzLk51bWJlcik6CiAgICAgICAgICAgICMgU29tZSBwZW9wbGUgYXBwYXJlbnRseSB0YWtlICJ2ZXJzaW9uIG51bWJlciIgdG9vIGxpdGVyYWxseSA6KQogICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBzdHIoc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQoKICAgICAgICBpZiBzZWxmLm1ldGFkYXRhLnZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZlciA9IHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24oc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQogICAgICAgICAgICAgICAgbm9ybWFsaXplZF92ZXJzaW9uID0gc3RyKHZlcikKICAgICAgICAgICAgICAgIGlmIHNlbGYubWV0YWRhdGEudmVyc2lvbiAhPSBub3JtYWxpemVkX3ZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAgICAgIk5vcm1hbGl6aW5nICclcycgdG8gJyVzJyIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gbm9ybWFsaXplZF92ZXJzaW9uCiAgICAgICAgICAgIGV4Y2VwdCAocGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb24sIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICJUaGUgdmVyc2lvbiBzcGVjaWZpZWQgKCVyKSBpcyBhbiBpbnZhbGlkIHZlcnNpb24sIHRoaXMgIgogICAgICAgICAgICAgICAgICAgICJtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiAiCiAgICAgICAgICAgICAgICAgICAgInNldHVwdG9vbHMsIHBpcCwgYW5kIFB5UEkuIFBsZWFzZSBzZWUgUEVQIDQ0MCBmb3IgbW9yZSAiCiAgICAgICAgICAgICAgICAgICAgImRldGFpbHMuIiAlIHNlbGYubWV0YWRhdGEudmVyc2lvbgogICAgICAgICAgICAgICAgKQogICAgICAgIHNlbGYuX2ZpbmFsaXplX3JlcXVpcmVzKCkKCiAgICBkZWYgX2ZpbmFsaXplX3JlcXVpcmVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldCBgbWV0YWRhdGEucHl0aG9uX3JlcXVpcmVzYCBhbmQgZml4IGVudmlyb25tZW50IG1hcmtlcnMKICAgICAgICBpbiBgaW5zdGFsbF9yZXF1aXJlc2AgYW5kIGBleHRyYXNfcmVxdWlyZWAuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEucHl0aG9uX3JlcXVpcmVzID0gc2VsZi5weXRob25fcmVxdWlyZXMKCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnZXh0cmFzX3JlcXVpcmUnLCBOb25lKToKICAgICAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuZXh0cmFzX3JlcXVpcmUua2V5cygpOgogICAgICAgICAgICAgICAgIyBTaW5jZSB0aGlzIGdldHMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGF0IHBvaW50cyB3aGVyZSB0aGUKICAgICAgICAgICAgICAgICMga2V5cyBoYXZlIGJlY29tZSAnY29udmVydGVkJyBleHRyYXMsIGVuc3VyZSB0aGF0IHdlIGFyZSBvbmx5CiAgICAgICAgICAgICAgICAjIHRydWx5IGFkZGluZyBleHRyYXMgd2UgaGF2ZW4ndCBzZWVuIGJlZm9yZSBoZXJlLgogICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYS5zcGxpdCgnOicpWzBdCiAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnByb3ZpZGVzX2V4dHJhcy5hZGQoZXh0cmEpCgogICAgICAgIHNlbGYuX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cygpCiAgICAgICAgc2VsZi5fbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKCkKCiAgICBkZWYgX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHJlcXVpcmVtZW50cyBpbiBgZXh0cmFzX3JlcXVpcmVgIG9mIHRoZSBmb3JtCiAgICAgICAgYCJleHRyYSI6IFsiYmFyYmF6cXV1eDsge21hcmtlcn0iXWAgdG8KICAgICAgICBgImV4dHJhOnttYXJrZXJ9IjogWyJiYXJiYXpxdXV4Il1gLgogICAgICAgICIiIgogICAgICAgIHNwZWNfZXh0X3JlcXMgPSBnZXRhdHRyKHNlbGYsICdleHRyYXNfcmVxdWlyZScsIE5vbmUpIG9yIHt9CiAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlID0gZGVmYXVsdGRpY3QobGlzdCkKICAgICAgICBmb3Igc2VjdGlvbiwgdiBpbiBzcGVjX2V4dF9yZXFzLml0ZW1zKCk6CiAgICAgICAgICAgICMgRG8gbm90IHN0cmlwIGVtcHR5IHNlY3Rpb25zLgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbl0KICAgICAgICAgICAgZm9yIHIgaW4gcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModik6CiAgICAgICAgICAgICAgICBzdWZmaXggPSBzZWxmLl9zdWZmaXhfZm9yKHIpCiAgICAgICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbiArIHN1ZmZpeF0uYXBwZW5kKHIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdWZmaXhfZm9yKHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgcmVxdWlyZW1lbnQsIHJldHVybiB0aGUgJ2V4dHJhc19yZXF1aXJlJyBzdWZmaXggZm9yCiAgICAgICAgdGhhdCByZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJzonICsgc3RyKHJlcS5tYXJrZXIpIGlmIHJlcS5tYXJrZXIgZWxzZSAnJwoKICAgIGRlZiBfbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1vdmUgcmVxdWlyZW1lbnRzIGluIGBpbnN0YWxsX3JlcXVpcmVzYCB0aGF0IGFyZSB1c2luZyBlbnZpcm9ubWVudAogICAgICAgIG1hcmtlcnMgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKCiAgICAgICAgIyBkaXZpZGUgdGhlIGluc3RhbGxfcmVxdWlyZXMgaW50byB0d28gc2V0cywgc2ltcGxlIG9uZXMgc3RpbGwKICAgICAgICAjIGhhbmRsZWQgYnkgaW5zdGFsbF9yZXF1aXJlcyBhbmQgbW9yZSBjb21wbGV4IG9uZXMgaGFuZGxlZAogICAgICAgICMgYnkgZXh0cmFzX3JlcXVpcmUuCgogICAgICAgIGRlZiBpc19zaW1wbGVfcmVxKHJlcSk6CiAgICAgICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlcgoKICAgICAgICBzcGVjX2luc3RfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2luc3RhbGxfcmVxdWlyZXMnLCBOb25lKSBvciAoKQogICAgICAgIGluc3RfcmVxcyA9IGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMoc3BlY19pbnN0X3JlcXMpKQogICAgICAgIHNpbXBsZV9yZXFzID0gZmlsdGVyKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBjb21wbGV4X3JlcXMgPSBmaWx0ZXJmYWxzZShpc19zaW1wbGVfcmVxLCBpbnN0X3JlcXMpCiAgICAgICAgc2VsZi5pbnN0YWxsX3JlcXVpcmVzID0gbGlzdChtYXAoc3RyLCBzaW1wbGVfcmVxcykpCgogICAgICAgIGZvciByIGluIGNvbXBsZXhfcmVxczoKICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlWyc6JyArIHN0cihyLm1hcmtlcildLmFwcGVuZChyKQogICAgICAgIHNlbGYuZXh0cmFzX3JlcXVpcmUgPSBkaWN0KAogICAgICAgICAgICAoaywgW3N0cihyKSBmb3IgciBpbiBtYXAoc2VsZi5fY2xlYW5fcmVxLCB2KV0pCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZS5pdGVtcygpCiAgICAgICAgKQoKICAgIGRlZiBfY2xlYW5fcmVxKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBSZXF1aXJlbWVudCwgcmVtb3ZlIGVudmlyb25tZW50IG1hcmtlcnMgYW5kIHJldHVybiBpdC4KICAgICAgICAiIiIKICAgICAgICByZXEubWFya2VyID0gTm9uZQogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgX3BhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWRhcHRlZCBmcm9tIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMsCiAgICAgICAgdGhpcyBtZXRob2QgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBpbiBzdWJ0bHktaW1wcm92ZWQKICAgICAgICB3YXlzLgogICAgICAgICIiIgogICAgICAgIGZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzLmNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCgogICAgICAgICMgSWdub3JlIGluc3RhbGwgZGlyZWN0b3J5IG9wdGlvbnMgaWYgd2UgaGF2ZSBhIHZlbnYKICAgICAgICBpZiBzaXguUFkzIGFuZCBzeXMucHJlZml4ICE9IHN5cy5iYXNlX3ByZWZpeDoKICAgICAgICAgICAgaWdub3JlX29wdGlvbnMgPSBbCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1iYXNlJywgJ2luc3RhbGwtcGxhdGJhc2UnLCAnaW5zdGFsbC1saWInLAogICAgICAgICAgICAgICAgJ2luc3RhbGwtcGxhdGxpYicsICdpbnN0YWxsLXB1cmVsaWInLCAnaW5zdGFsbC1oZWFkZXJzJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXNjcmlwdHMnLCAnaW5zdGFsbC1kYXRhJywgJ3ByZWZpeCcsICdleGVjLXByZWZpeCcsCiAgICAgICAgICAgICAgICAnaG9tZScsICd1c2VyJywgJ3Jvb3QnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gW10KCiAgICAgICAgaWdub3JlX29wdGlvbnMgPSBmcm96ZW5zZXQoaWdub3JlX29wdGlvbnMpCgogICAgICAgIGlmIGZpbGVuYW1lcyBpcyBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmZpbmRfY29uZmlnX2ZpbGVzKCkKCiAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIkRpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoKToiKQoKICAgICAgICBwYXJzZXIgPSBDb25maWdQYXJzZXIoKQogICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIHdpdGggaW8ub3BlbihmaWxlbmFtZSwgZW5jb2Rpbmc9J3V0Zi04JykgYXMgcmVhZGVyOgogICAgICAgICAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICByZWFkaW5nIHtmaWxlbmFtZX0iLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICAgICAgICAgIChwYXJzZXIucmVhZF9maWxlIGlmIHNpeC5QWTMgZWxzZSBwYXJzZXIucmVhZGZwKShyZWFkZXIpCiAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHBhcnNlci5zZWN0aW9ucygpOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlci5vcHRpb25zKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KHNlY3Rpb24pCgogICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBvcHRpb25zOgogICAgICAgICAgICAgICAgICAgIGlmIG9wdCAhPSAnX19uYW1lX18nIGFuZCBvcHQgbm90IGluIGlnbm9yZV9vcHRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLl90cnlfc3RyKHBhcnNlci5nZXQoc2VjdGlvbiwgb3B0KSkKICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kaWN0W29wdF0gPSAoZmlsZW5hbWUsIHZhbCkKCiAgICAgICAgICAgICMgTWFrZSB0aGUgQ29uZmlnUGFyc2VyIGZvcmdldCBldmVyeXRoaW5nIChzbyB3ZSByZXRhaW4KICAgICAgICAgICAgIyB0aGUgb3JpZ2luYWwgZmlsZW5hbWVzIHRoYXQgb3B0aW9ucyBjb21lIGZyb20pCiAgICAgICAgICAgIHBhcnNlci5fX2luaXRfXygpCgogICAgICAgICMgSWYgdGhlcmUgd2FzIGEgImdsb2JhbCIgc2VjdGlvbiBpbiB0aGUgY29uZmlnIGZpbGUsIHVzZSBpdAogICAgICAgICMgdG8gc2V0IERpc3RyaWJ1dGlvbiBvcHRpb25zLgoKICAgICAgICBpZiAnZ2xvYmFsJyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uczoKICAgICAgICAgICAgZm9yIChvcHQsIChzcmMsIHZhbCkpIGluIHNlbGYuY29tbWFuZF9vcHRpb25zWydnbG9iYWwnXS5pdGVtcygpOgogICAgICAgICAgICAgICAgYWxpYXMgPSBzZWxmLm5lZ2F0aXZlX29wdC5nZXQob3B0KQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIGFsaWFzOgogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGFsaWFzLCBub3Qgc3RydG9ib29sKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCd2ZXJib3NlJywgJ2RyeV9ydW4nKTogICMgdWdoIQogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgc3RydG9ib29sKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHZhbCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIG1zZzoKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF90cnlfc3RyKHZhbCk6CiAgICAgICAgIiIiCiAgICAgICAgT24gUHl0aG9uIDIsIG11Y2ggb2YgZGlzdHV0aWxzIHJlbGllcyBvbiBzdHJpbmcgdmFsdWVzIGJlaW5nIG9mCiAgICAgICAgdHlwZSAnc3RyJyAoYnl0ZXMpIGFuZCBub3QgdW5pY29kZSB0ZXh0LiBJZiB0aGUgdmFsdWUgY2FuIGJlIHNhZmVseQogICAgICAgIGVuY29kZWQgdG8gYnl0ZXMgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcsIHByZWZlciB0aGF0LgoKICAgICAgICBXaHkgdGhlIGRlZmF1bHQgZW5jb2Rpbmc/IEJlY2F1c2UgdGhhdCB2YWx1ZSBjYW4gYmUgaW1wbGljaXRseQogICAgICAgIGRlY29kZWQgYmFjayB0byB0ZXh0IGlmIG5lZWRlZC4KCiAgICAgICAgUmVmICMxNjUzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgcmV0dXJuIHZhbAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZhbC5lbmNvZGUoKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gdmFsCgogICAgZGVmIF9zZXRfY29tbWFuZF9vcHRpb25zKHNlbGYsIGNvbW1hbmRfb2JqLCBvcHRpb25fZGljdD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTZXQgdGhlIG9wdGlvbnMgZm9yICdjb21tYW5kX29iaicgZnJvbSAnb3B0aW9uX2RpY3QnLiAgQmFzaWNhbGx5CiAgICAgICAgdGhpcyBtZWFucyBjb3B5aW5nIGVsZW1lbnRzIG9mIGEgZGljdGlvbmFyeSAoJ29wdGlvbl9kaWN0JykgdG8KICAgICAgICBhdHRyaWJ1dGVzIG9mIGFuIGluc3RhbmNlICgnY29tbWFuZCcpLgoKICAgICAgICAnY29tbWFuZF9vYmonIG11c3QgYmUgYSBDb21tYW5kIGluc3RhbmNlLiAgSWYgJ29wdGlvbl9kaWN0JyBpcyBub3QKICAgICAgICBzdXBwbGllZCwgdXNlcyB0aGUgc3RhbmRhcmQgb3B0aW9uIGRpY3Rpb25hcnkgZm9yIHRoaXMgY29tbWFuZAogICAgICAgIChmcm9tICdzZWxmLmNvbW1hbmRfb3B0aW9ucycpLgoKICAgICAgICAoQWRvcHRlZCBmcm9tIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbi5fc2V0X2NvbW1hbmRfb3B0aW9ucykKICAgICAgICAiIiIKICAgICAgICBjb21tYW5kX25hbWUgPSBjb21tYW5kX29iai5nZXRfY29tbWFuZF9uYW1lKCkKICAgICAgICBpZiBvcHRpb25fZGljdCBpcyBOb25lOgogICAgICAgICAgICBvcHRpb25fZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmRfbmFtZSkKCiAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgc2V0dGluZyBvcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNvbW1hbmRfbmFtZSkKICAgICAgICBmb3IgKG9wdGlvbiwgKHNvdXJjZSwgdmFsdWUpKSBpbiBvcHRpb25fZGljdC5pdGVtcygpOgogICAgICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgICAlcyA9ICVzIChmcm9tICVzKSIgJSAob3B0aW9uLCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYm9vbF9vcHRzID0gW3RyYW5zbGF0ZV9sb25nb3B0KG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG8gaW4gY29tbWFuZF9vYmouYm9vbGVhbl9vcHRpb25zXQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBib29sX29wdHMgPSBbXQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBuZWdfb3B0ID0gY29tbWFuZF9vYmoubmVnYXRpdmVfb3B0CiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIG5lZ19vcHQgPSB7fQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXNfc3RyaW5nID0gaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcykKICAgICAgICAgICAgICAgIGlmIG9wdGlvbiBpbiBuZWdfb3B0IGFuZCBpc19zdHJpbmc6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgbmVnX29wdFtvcHRpb25dLCBub3Qgc3RydG9ib29sKHZhbHVlKSkKICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9uIGluIGJvb2xfb3B0cyBhbmQgaXNfc3RyaW5nOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoY29tbWFuZF9vYmosIG9wdGlvbiwgc3RydG9ib29sKHZhbHVlKSkKICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihjb21tYW5kX29iaiwgb3B0aW9uKToKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24sIHZhbHVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGluICVzOiBjb21tYW5kICclcycgaGFzIG5vIHN1Y2ggb3B0aW9uICclcyciCiAgICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgY29tbWFuZF9uYW1lLCBvcHRpb24pKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcihtc2cpCgogICAgZGVmIHBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSwgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gdmFyaW91cyBsZXZlbHMKICAgICAgICBhbmQgbG9hZHMgY29uZmlndXJhdGlvbi4KCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fcGFyc2VfY29uZmlnX2ZpbGVzKGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIHBhcnNlX2NvbmZpZ3VyYXRpb24oc2VsZiwgc2VsZi5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycz1pZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgICAgICBzZWxmLl9maW5hbGl6ZV9yZXF1aXJlcygpCgogICAgZGVmIHBhcnNlX2NvbW1hbmRfbGluZShzZWxmKToKICAgICAgICAiIiJQcm9jZXNzIGZlYXR1cmVzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMiIiIKICAgICAgICByZXN1bHQgPSBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbW1hbmRfbGluZShzZWxmKQogICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CiAgICAgICAgICAgIHNlbGYuX2ZpbmFsaXplX2ZlYXR1cmVzKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9mZWF0dXJlX2F0dHJuYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkNvbnZlcnQgZmVhdHVyZSBuYW1lIHRvIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGF0dHJpYnV0ZSBuYW1lIiIiCiAgICAgICAgcmV0dXJuICd3aXRoXycgKyBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgcmVxdWlyZXMpOgogICAgICAgICIiIlJlc29sdmUgcHJlLXNldHVwIHJlcXVpcmVtZW50cyIiIgogICAgICAgIHJlc29sdmVkX2Rpc3RzID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5yZXNvbHZlKAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlcyksCiAgICAgICAgICAgIGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZywKICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlLAogICAgICAgICkKICAgICAgICBmb3IgZGlzdCBpbiByZXNvbHZlZF9kaXN0czoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5hZGQoZGlzdCwgcmVwbGFjZT1UcnVlKQogICAgICAgIHJldHVybiByZXNvbHZlZF9kaXN0cwoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEFsbG93IHBsdWdpbnMgdG8gYXBwbHkgYXJiaXRyYXJ5IG9wZXJhdGlvbnMgdG8gdGhlCiAgICAgICAgZGlzdHJpYnV0aW9uLiBFYWNoIGhvb2sgbWF5IG9wdGlvbmFsbHkgZGVmaW5lIGEgJ29yZGVyJwogICAgICAgIHRvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uLiBTbWFsbGVyIG51bWJlcnMKICAgICAgICBnbyBmaXJzdCBhbmQgdGhlIGRlZmF1bHQgaXMgMC4KICAgICAgICAiIiIKICAgICAgICBob29rX2tleSA9ICdzZXR1cHRvb2xzLmZpbmFsaXplX2Rpc3RyaWJ1dGlvbl9vcHRpb25zJwoKICAgICAgICBkZWYgYnlfb3JkZXIoaG9vayk6CiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKGhvb2ssICdvcmRlcicsIDApCiAgICAgICAgZXBzID0gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cyhob29rX2tleSkKICAgICAgICBmb3IgZXAgaW4gc29ydGVkKGVwcywga2V5PWJ5X29yZGVyKToKICAgICAgICAgICAgZXAubG9hZCgpKHNlbGYpCgogICAgZGVmIF9maW5hbGl6ZV9zZXR1cF9rZXl3b3JkcyhzZWxmKToKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLCBlcC5uYW1lLCBOb25lKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQogICAgICAgICAgICAgICAgZXAubG9hZCgpKHNlbGYsIGVwLm5hbWUsIHZhbHVlKQoKICAgIGRlZiBfZmluYWxpemVfMnRvM19kb2N0ZXN0cyhzZWxmKToKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnLCBOb25lKToKICAgICAgICAgICAgIyBYWFggbWF5IGNvbnZlcnQgdG8gc2V0IGhlcmUgd2hlbiB3ZSBjYW4gcmVseSBvbiBzZXQgYmVpbmcgYnVpbHRpbgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChwKQogICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMKICAgICAgICAgICAgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzID0gW10KCiAgICBkZWYgZ2V0X2VnZ19jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgZWdnX2NhY2hlX2RpciA9IG9zLnBhdGguam9pbihvcy5jdXJkaXIsICcuZWdncycpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZ19jYWNoZV9kaXIpOgogICAgICAgICAgICBvcy5ta2RpcihlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICB3aW5kb3dzX3N1cHBvcnQuaGlkZV9maWxlKGVnZ19jYWNoZV9kaXIpCiAgICAgICAgICAgIHJlYWRtZV90eHRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZWdnX2NhY2hlX2RpciwgJ1JFQURNRS50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4ocmVhZG1lX3R4dF9maWxlbmFtZSwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZWdncyB0aGF0IHdlcmUgZG93bmxvYWRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdieSBzZXR1cHRvb2xzIHRvIGJ1aWxkLCB0ZXN0LCBhbmQgcnVuIHBsdWctaW5zLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnVGhpcyBkaXJlY3RvcnkgY2FjaGVzIHRob3NlIGVnZ3MgdG8gcHJldmVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICdyZXBlYXRlZCBkb3dubG9hZHMuXG5cbicpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdIb3dldmVyLCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeS5cblxuJykKCiAgICAgICAgcmV0dXJuIGVnZ19jYWNoZV9kaXIKCiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmciIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuaW5zdGFsbGVyIGltcG9ydCBmZXRjaF9idWlsZF9lZ2cKICAgICAgICByZXR1cm4gZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSkKCiAgICBkZWYgX2ZpbmFsaXplX2ZlYXR1cmVfb3B0cyhzZWxmKToKICAgICAgICAiIiJBZGQgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyBiYXNlZCBvbiBvcHRpb25hbCBmZWF0dXJlcyIiIgoKICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGdvID0gW10KICAgICAgICBubyA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQoKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIE5vbmUpCiAgICAgICAgICAgIGZlYXR1cmUudmFsaWRhdGUoc2VsZikKCiAgICAgICAgICAgIGlmIGZlYXR1cmUub3B0aW9uYWw6CiAgICAgICAgICAgICAgICBkZXNjciA9IGZlYXR1cmUuZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIGluY2RlZiA9ICcgKGRlZmF1bHQpJwogICAgICAgICAgICAgICAgZXhjZGVmID0gJycKICAgICAgICAgICAgICAgIGlmIG5vdCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpOgogICAgICAgICAgICAgICAgICAgIGV4Y2RlZiwgaW5jZGVmID0gaW5jZGVmLCBleGNkZWYKCiAgICAgICAgICAgICAgICBuZXcgPSAoCiAgICAgICAgICAgICAgICAgICAgKCd3aXRoLScgKyBuYW1lLCBOb25lLCAnaW5jbHVkZSAnICsgZGVzY3IgKyBpbmNkZWYpLAogICAgICAgICAgICAgICAgICAgICgnd2l0aG91dC0nICsgbmFtZSwgTm9uZSwgJ2V4Y2x1ZGUgJyArIGRlc2NyICsgZXhjZGVmKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGdvLmV4dGVuZChuZXcpCiAgICAgICAgICAgICAgICBub1snd2l0aG91dC0nICsgbmFtZV0gPSAnd2l0aC0nICsgbmFtZQoKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5mZWF0dXJlX29wdGlvbnMgPSBnbyArIHNlbGYuZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuZmVhdHVyZV9uZWdvcHQgPSBubwoKICAgIGRlZiBfZmluYWxpemVfZmVhdHVyZXMoc2VsZik6CiAgICAgICAgIiIiQWRkL3JlbW92ZSBmZWF0dXJlcyBhbmQgcmVzb2x2ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtIiIiCgogICAgICAgICMgRmlyc3QsIGZsYWcgYWxsIHRoZSBlbmFibGVkIGl0ZW1zIChhbmQgdGh1cyB0aGVpciBkZXBlbmRlbmNpZXMpCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBlbmFibGVkID0gc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpCiAgICAgICAgICAgIGlmIGVuYWJsZWQgb3IgKGVuYWJsZWQgaXMgTm9uZSBhbmQgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKSk6CiAgICAgICAgICAgICAgICBmZWF0dXJlLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDEpCgogICAgICAgICMgVGhlbiBkaXNhYmxlIHRoZSByZXN0LCBzbyB0aGF0IG9mZi1ieS1kZWZhdWx0IGZlYXR1cmVzIGRvbid0CiAgICAgICAgIyBnZXQgZmxhZ2dlZCBhcyBlcnJvcnMgd2hlbiB0aGV5J3JlIHJlcXVpcmVkIGJ5IGFuIGVuYWJsZWQgZmVhdHVyZQogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuZXhjbHVkZV9mcm9tKHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAwKQoKICAgIGRlZiBnZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKToKICAgICAgICAiIiJQbHVnZ2FibGUgdmVyc2lvbiBvZiBnZXRfY29tbWFuZF9jbGFzcygpIiIiCiAgICAgICAgaWYgY29tbWFuZCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jbWRjbGFzc1tjb21tYW5kXQoKICAgICAgICBlcHMgPSBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCBjb21tYW5kKQogICAgICAgIGZvciBlcCBpbiBlcHM6CiAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQogICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdID0gY21kY2xhc3MgPSBlcC5sb2FkKCkKICAgICAgICAgICAgcmV0dXJuIGNtZGNsYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCkKCiAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLnByaW50X2NvbW1hbmRzKHNlbGYpCgogICAgZGVmIGdldF9jb21tYW5kX2xpc3Qoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2xpc3Qoc2VsZikKCiAgICBkZWYgX3NldF9mZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXR1cyk6CiAgICAgICAgIiIiU2V0IGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIiIiCiAgICAgICAgc2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpLCBzdGF0dXMpCgogICAgZGVmIGZlYXR1cmVfaXNfaW5jbHVkZWQoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIDEgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCwgMCBpZiBleGNsdWRlZCwgJ05vbmUnIGlmIHVua25vd24iIiIKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpKQoKICAgIGRlZiBpbmNsdWRlX2ZlYXR1cmUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmVxdWVzdCBpbmNsdXNpb24gb2YgZmVhdHVyZSBuYW1lZCAnbmFtZSciIiIKCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpID09IDA6CiAgICAgICAgICAgIGRlc2NyID0gc2VsZi5mZWF0dXJlc1tuYW1lXS5kZXNjcmlwdGlvbgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgIGRlc2NyICsgIiBpcyByZXF1aXJlZCwgYnV0IHdhcyBleGNsdWRlZCBvciBpcyBub3QgYXZhaWxhYmxlIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5mZWF0dXJlc1tuYW1lXS5pbmNsdWRlX2luKHNlbGYpCiAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICBkZWYgaW5jbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJBZGQgaXRlbXMgdG8gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5pbmNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCBhZGQgJ3gnIHRvCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUsIGlmIGl0IHdhcyBub3QgYWxyZWFkeQogICAgICAgIHRoZXJlLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgaW5jbHVzaW9uIGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGFkZGluZyB0byBvdGhlcgogICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2luY2x1ZGVfWCcgbWV0aG9kLAogICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnaW5jbHVkZSgpJy4gIFNvLCAnZGlzdC5pbmNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9pbmNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCiAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgaW5jbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpOgogICAgICAgICAgICBpbmNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2luY2x1ZGVfJyArIGssIE5vbmUpCiAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICBpbmNsdWRlKHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9pbmNsdWRlX21pc2MoaywgdikKCiAgICBkZWYgZXhjbHVkZV9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICIiIlJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgaW4gbmFtZWQgcGFja2FnZSIiIgoKICAgICAgICBwZnggPSBwYWNrYWdlICsgJy4nCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcwogICAgICAgICAgICAgICAgaWYgcCAhPSBwYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5weV9tb2R1bGVzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYuZXh0X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYuZXh0X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAubmFtZSAhPSBwYWNrYWdlIGFuZCBub3QgcC5uYW1lLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgZGVmIGhhc19jb250ZW50c19mb3Ioc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4Y2x1ZGVfcGFja2FnZShwYWNrYWdlKScgd291bGQgZG8gc29tZXRoaW5nIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKCiAgICAgICAgZm9yIHAgaW4gc2VsZi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpOgogICAgICAgICAgICBpZiBwID09IHBhY2thZ2Ugb3IgcC5zdGFydHN3aXRoKHBmeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfZXhjbHVkZV9taXNjKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJIYW5kbGUgJ2V4Y2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsaWYgb2xkOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIFtpdGVtIGZvciBpdGVtIGluIG9sZCBpZiBpdGVtIG5vdCBpbiB2YWx1ZV0pCgogICAgZGVmIF9pbmNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnaW5jbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3QgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldyA9IFtpdGVtIGZvciBpdGVtIGluIHZhbHVlIGlmIGl0ZW0gbm90IGluIG9sZF0KICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBvbGQgKyBuZXcpCgogICAgZGVmIGV4Y2x1ZGUoc2VsZiwgKiphdHRycyk6CiAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCByZW1vdmUgJ3gnIGZyb20KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZS4gIEV4Y2x1ZGluZyBwYWNrYWdlcyB1c2VzCiAgICAgICAgdGhlICdleGNsdWRlX3BhY2thZ2UoKScgbWV0aG9kLCBzbyBhbGwgb2YgdGhlIHBhY2thZ2UncyBjb250YWluZWQKICAgICAgICBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgYXJlIGFsc28gZXhjbHVkZWQuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBleGNsdXNpb24gZnJvbSBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGluZyBmcm9tIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfZXhjbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdleGNsdWRlKCknLiAgU28sICdkaXN0LmV4Y2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2V4Y2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBleGNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGV4Y2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfZXhjbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgZXhjbHVkZToKICAgICAgICAgICAgICAgIGV4Y2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBfZXhjbHVkZV9wYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZXMsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJwYWNrYWdlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChwYWNrYWdlcywpCiAgICAgICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLmV4Y2x1ZGVfcGFja2FnZSwgcGFja2FnZXMpKQoKICAgIGRlZiBfcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncyk6CiAgICAgICAgIyBSZW1vdmUgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyB3aGVuIHByb2Nlc3NpbmcgY29tbWFuZCBhcmdzCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuX19jbGFzc19fLmdsb2JhbF9vcHRpb25zCiAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLl9fY2xhc3NfXy5uZWdhdGl2ZV9vcHQKCiAgICAgICAgIyBGaXJzdCwgZXhwYW5kIGFueSBhbGlhc2VzCiAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KICAgICAgICBhbGlhc2VzID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQogICAgICAgIHdoaWxlIGNvbW1hbmQgaW4gYWxpYXNlczoKICAgICAgICAgICAgc3JjLCBhbGlhcyA9IGFsaWFzZXNbY29tbWFuZF0KICAgICAgICAgICAgZGVsIGFsaWFzZXNbY29tbWFuZF0gICMgZW5zdXJlIGVhY2ggYWxpYXMgY2FuIGV4cGFuZCBvbmx5IG9uY2UhCiAgICAgICAgICAgIGltcG9ydCBzaGxleAogICAgICAgICAgICBhcmdzWzoxXSA9IHNobGV4LnNwbGl0KGFsaWFzLCBUcnVlKQogICAgICAgICAgICBjb21tYW5kID0gYXJnc1swXQoKICAgICAgICBuYXJncyA9IF9EaXN0cmlidXRpb24uX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpCgogICAgICAgICMgSGFuZGxlIGNvbW1hbmRzIHRoYXQgd2FudCB0byBjb25zdW1lIGFsbCByZW1haW5pbmcgYXJndW1lbnRzCiAgICAgICAgY21kX2NsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQogICAgICAgIGlmIGdldGF0dHIoY21kX2NsYXNzLCAnY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZClbJ2FyZ3MnXSA9ICgiY29tbWFuZCBsaW5lIiwgbmFyZ3MpCiAgICAgICAgICAgIGlmIG5hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBuYXJncwoKICAgIGRlZiBnZXRfY21kbGluZV9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhICd7Y21kOiB7b3B0OnZhbH19JyBtYXAgb2YgYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zCgogICAgICAgIE9wdGlvbiBuYW1lcyBhcmUgYWxsIGxvbmcsIGJ1dCBkbyBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAnLS0nLCBhbmQKICAgICAgICBjb250YWluIGRhc2hlcyByYXRoZXIgdGhhbiB1bmRlcnNjb3Jlcy4gIElmIHRoZSBvcHRpb24gZG9lc24ndCB0YWtlCiAgICAgICAgYW4gYXJndW1lbnQgKGUuZy4gJy0tcXVpZXQnKSwgdGhlICd2YWwnIGlzICdOb25lJy4KCiAgICAgICAgTm90ZSB0aGF0IG9wdGlvbnMgcHJvdmlkZWQgYnkgY29uZmlnIGZpbGVzIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkLgogICAgICAgICIiIgoKICAgICAgICBkID0ge30KCiAgICAgICAgZm9yIGNtZCwgb3B0cyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgZm9yIG9wdCwgKHNyYywgdmFsKSBpbiBvcHRzLml0ZW1zKCk6CgogICAgICAgICAgICAgICAgaWYgc3JjICE9ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJ18nLCAnLScpCgogICAgICAgICAgICAgICAgaWYgdmFsID09IDA6CiAgICAgICAgICAgICAgICAgICAgY21kb2JqID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY21kKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKICAgICAgICAgICAgICAgICAgICBuZWdfb3B0LnVwZGF0ZShnZXRhdHRyKGNtZG9iaiwgJ25lZ2F0aXZlX29wdCcsIHt9KSkKICAgICAgICAgICAgICAgICAgICBmb3IgbmVnLCBwb3MgaW4gbmVnX29wdC5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPT0gb3B0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gbmVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZSIpCgogICAgICAgICAgICAgICAgZWxpZiB2YWwgPT0gMToKICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCgogICAgICAgICAgICAgICAgZC5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiWWllbGQgYWxsIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9uIG5hbWVzIGluIGRpc3RyaWJ1dGlvbiIiIgoKICAgICAgICBmb3IgcGtnIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgIHlpZWxkIHBrZwoKICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYucHlfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgbW9kdWxlCgogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIHR1cGxlKToKICAgICAgICAgICAgICAgIG5hbWUsIGJ1aWxkaW5mbyA9IGV4dAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IGV4dC5uYW1lCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi02XQogICAgICAgICAgICB5aWVsZCBuYW1lCgogICAgZGVmIGhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKToKICAgICAgICAiIiJJZiB0aGVyZSB3ZXJlIGFueSBub24tZ2xvYmFsICJkaXNwbGF5LW9ubHkiIG9wdGlvbnMKICAgICAgICAoLS1oZWxwLWNvbW1hbmRzIG9yIHRoZSBtZXRhZGF0YSBkaXNwbGF5IG9wdGlvbnMpIG9uIHRoZSBjb21tYW5kCiAgICAgICAgbGluZSwgZGlzcGxheSB0aGUgcmVxdWVzdGVkIGluZm8gYW5kIHJldHVybiB0cnVlOyBlbHNlIHJldHVybgogICAgICAgIGZhbHNlLgogICAgICAgICIiIgogICAgICAgIGltcG9ydCBzeXMKCiAgICAgICAgaWYgc2l4LlBZMiBvciBzZWxmLmhlbHBfY29tbWFuZHM6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFN0ZG91dCBtYXkgYmUgU3RyaW5nSU8gKGUuZy4gaW4gdGVzdHMpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3lzLnN0ZG91dCwgaW8uVGV4dElPV3JhcHBlcik6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIERvbid0IHdyYXAgc3Rkb3V0IGlmIHV0Zi04IGlzIGFscmVhZHkgdGhlIGVuY29kaW5nLiBQcm92aWRlcwogICAgICAgICMgIHdvcmthcm91bmQgZm9yICMzMzQuCiAgICAgICAgaWYgc3lzLnN0ZG91dC5lbmNvZGluZy5sb3dlcigpIGluICgndXRmLTgnLCAndXRmOCcpOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBQcmludCBtZXRhZGF0YSBpbiBVVEYtOCBubyBtYXR0ZXIgdGhlIHBsYXRmb3JtCiAgICAgICAgZW5jb2RpbmcgPSBzeXMuc3Rkb3V0LmVuY29kaW5nCiAgICAgICAgZXJyb3JzID0gc3lzLnN0ZG91dC5lcnJvcnMKICAgICAgICBuZXdsaW5lID0gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgYW5kICdcbicgb3IgTm9uZQogICAgICAgIGxpbmVfYnVmZmVyaW5nID0gc3lzLnN0ZG91dC5saW5lX2J1ZmZlcmluZwoKICAgICAgICBzeXMuc3Rkb3V0ID0gaW8uVGV4dElPV3JhcHBlcigKICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgJ3V0Zi04JywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgbGluZV9idWZmZXJpbmcpCgoKY2xhc3MgRmVhdHVyZToKICAgICIiIgogICAgKipkZXByZWNhdGVkKiogLS0gVGhlIGBGZWF0dXJlYCBmYWNpbGl0eSB3YXMgbmV2ZXIgY29tcGxldGVseSBpbXBsZW1lbnRlZAogICAgb3Igc3VwcG9ydGVkLCBgaGFzIHJlcG9ydGVkIGlzc3VlcwogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzU4PmBfIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4KICAgIGEgZnV0dXJlIHZlcnNpb24uCgogICAgQSBzdWJzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZSBleGNsdWRlZCBpZiB1bm5lZWRlZC93YW50ZWQKCiAgICBGZWF0dXJlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGVzZSBrZXl3b3JkIGFyZ3VtZW50czoKCiAgICAgICdkZXNjcmlwdGlvbicgLS0gYSBzaG9ydCwgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUsIHRvCiAgICAgICAgIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMsIGFuZCBvcHRpb24gaGVscCBtZXNzYWdlcy4KCiAgICAgICdzdGFuZGFyZCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBpZiBpdCBpcwogICAgICAgICBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgT3RoZXJ3aXNlLCB0aGUgZmVhdHVyZSBpcyBvbmx5CiAgICAgICAgIGluY2x1ZGVkIGlmIHJlcXVlc3RlZCB2aWEgYSBjb21tYW5kIGxpbmUgJy0td2l0aC1YJyBvcHRpb24sIG9yIGlmCiAgICAgICAgIGFub3RoZXIgaW5jbHVkZWQgZmVhdHVyZSByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ0ZhbHNlJy4KCiAgICAgICdhdmFpbGFibGUnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIG9uIHRoZQogICAgICAgICBjdXJyZW50IHN5c3RlbS4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgoKICAgICAgJ29wdGlvbmFsJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBjYW4gYmUgY29udHJvbGxlZCBmcm9tIHRoZQogICAgICAgICBjb21tYW5kIGxpbmUsIHVzaW5nIHRoZSAnLS13aXRoLVgnIG9yICctLXdpdGhvdXQtWCcgb3B0aW9ucy4gIElmCiAgICAgICAgIGZhbHNlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAogICAgICAgICBiYXNlZCBvbiAnYXZhaWxhYmlsZScsICdzdGFuZGFyZCcsIGFuZCB3aGV0aGVyIGFueSBvdGhlciBmZWF0dXJlCiAgICAgICAgIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAncmVxdWlyZV9mZWF0dXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBuYW1pbmcgZmVhdHVyZXMKICAgICAgICAgdGhhdCBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZCBpZiB0aGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBlbXB0eSBsaXN0LiAgTWF5IGFsc28gY29udGFpbiAnUmVxdWlyZScgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQogICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICAgICdyZW1vdmUnIC0tIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgICBmcm9tIHRoZSBkaXN0cmlidXRpb24gaWYgdGhpcyBmZWF0dXJlIGlzICpub3QqIGluY2x1ZGVkLiAgSWYgdGhlCiAgICAgICAgIGZlYXR1cmUgKmlzKiBpbmNsdWRlZCwgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhpcyBhcmd1bWVudCBleGlzdHMKICAgICAgICAgdG8gc3VwcG9ydCByZW1vdmluZyBmZWF0dXJlcyB0aGF0ICJjcm9zc2N1dCIgYSBkaXN0cmlidXRpb24sIHN1Y2ggYXMKICAgICAgICAgZGVmaW5pbmcgYSAndGVzdHMnIGZlYXR1cmUgdGhhdCByZW1vdmVzIGFsbCB0aGUgJ3Rlc3RzJyBzdWJwYWNrYWdlcwogICAgICAgICBwcm92aWRlZCBieSBvdGhlciBmZWF0dXJlcy4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGFyZ3VtZW50IGlzIGFuIGVtcHR5CiAgICAgICAgIGxpc3QuICAoTm90ZTogdGhlIG5hbWVkIHBhY2thZ2Uocykgb3IgbW9kdWxlcyBtdXN0IGV4aXN0IGluIHRoZSBiYXNlCiAgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuIHRoZSAnc2V0dXAoKScgZnVuY3Rpb24gaXMgaW5pdGlhbGx5IGNhbGxlZC4pCgogICAgICBvdGhlciBrZXl3b3JkcyAtLSBhbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNhdmVkLCBhbmQgcGFzc2VkIHRvCiAgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAnaW5jbHVkZSgpJyBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyB3aGVuIHRoZQogICAgICAgICBmZWF0dXJlIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLCByZXNwZWN0aXZlbHkuICBTbywgZm9yIGV4YW1wbGUsIHlvdQogICAgICAgICBjb3VsZCBwYXNzICdwYWNrYWdlcz1bImEiLCJiIl0nIHRvIGNhdXNlIHBhY2thZ2VzICdhJyBhbmQgJ2InIHRvIGJlCiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGFzIGFwcHJvcHJpYXRlLgoKICAgIEEgZmVhdHVyZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICdyZXF1aXJlcycsICdyZW1vdmUnLCBvciBvdGhlcgogICAga2V5d29yZCBhcmd1bWVudC4gIE90aGVyd2lzZSwgaXQgY2FuJ3QgYWZmZWN0IHRoZSBkaXN0cmlidXRpb24gaW4gYW55IHdheS4KICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgJ0ZlYXR1cmUnIHRvIGNyZWF0ZSB5b3VyIG93biBzcGVjaWFsaXplZAogICAgZmVhdHVyZSB0eXBlcyB0aGF0IG1vZGlmeSB0aGUgZGlzdHJpYnV0aW9uIGluIG90aGVyIHdheXMgd2hlbiBpbmNsdWRlZCBvcgogICAgZXhjbHVkZWQuICBTZWUgdGhlIGRvY3N0cmluZ3MgZm9yIHRoZSB2YXJpb3VzIG1ldGhvZHMgaGVyZSBmb3IgbW9yZSBkZXRhaWwuCiAgICBBc2lkZSBmcm9tIHRoZSBtZXRob2RzLCB0aGUgb25seSBmZWF0dXJlIGF0dHJpYnV0ZXMgdGhhdCBkaXN0cmlidXRpb25zIGxvb2sKICAgIGF0IGFyZSAnZGVzY3JpcHRpb24nIGFuZCAnb3B0aW9uYWwnLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHdhcm5fZGVwcmVjYXRlZCgpOgogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIkZlYXR1cmVzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgIgogICAgICAgICAgICAidmVyc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzY1LiIKICAgICAgICApCiAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIERpc3REZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MykKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGRlc2NyaXB0aW9uLCBzdGFuZGFyZD1GYWxzZSwgYXZhaWxhYmxlPVRydWUsCiAgICAgICAgICAgIG9wdGlvbmFsPVRydWUsIHJlcXVpcmVfZmVhdHVyZXM9KCksIHJlbW92ZT0oKSwgKipleHRyYXMpOgogICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkKCkKCiAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCiAgICAgICAgc2VsZi5zdGFuZGFyZCA9IHN0YW5kYXJkCiAgICAgICAgc2VsZi5hdmFpbGFibGUgPSBhdmFpbGFibGUKICAgICAgICBzZWxmLm9wdGlvbmFsID0gb3B0aW9uYWwKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVfZmVhdHVyZXMsIChzdHIsIFJlcXVpcmUpKToKICAgICAgICAgICAgcmVxdWlyZV9mZWF0dXJlcyA9IHJlcXVpcmVfZmVhdHVyZXMsCgogICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFsKICAgICAgICAgICAgciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIGlzaW5zdGFuY2Uociwgc3RyKQogICAgICAgIF0KICAgICAgICBlciA9IFtyIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgbm90IGlzaW5zdGFuY2Uociwgc3RyKV0KICAgICAgICBpZiBlcjoKICAgICAgICAgICAgZXh0cmFzWydyZXF1aXJlX2ZlYXR1cmVzJ10gPSBlcgoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlbW92ZSwgc3RyKToKICAgICAgICAgICAgcmVtb3ZlID0gcmVtb3ZlLAogICAgICAgIHNlbGYucmVtb3ZlID0gcmVtb3ZlCiAgICAgICAgc2VsZi5leHRyYXMgPSBleHRyYXMKCiAgICAgICAgaWYgbm90IHJlbW92ZSBhbmQgbm90IHJlcXVpcmVfZmVhdHVyZXMgYW5kIG5vdCBleHRyYXM6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiRmVhdHVyZSAlczogbXVzdCBkZWZpbmUgJ3JlcXVpcmVfZmVhdHVyZXMnLCAncmVtb3ZlJywgb3IgIgogICAgICAgICAgICAgICAgImF0IGxlYXN0IG9uZSBvZiAncGFja2FnZXMnLCAncHlfbW9kdWxlcycsIGV0Yy4iCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5jbHVkZV9ieV9kZWZhdWx0KHNlbGYpOgogICAgICAgICIiIlNob3VsZCB0aGlzIGZlYXR1cmUgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdD8iIiIKICAgICAgICByZXR1cm4gc2VsZi5hdmFpbGFibGUgYW5kIHNlbGYuc3RhbmRhcmQKCiAgICBkZWYgaW5jbHVkZV9pbihzZWxmLCBkaXN0KToKICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBhbmQgaXRzIHJlcXVpcmVtZW50cyBhcmUgaW5jbHVkZWQgaW4gZGlzdHJpYnV0aW9uCgogICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgcGVyIGZlYXR1cmUsIGFuZCBzbyBzaG91bGQgYmUgaWRlbXBvdGVudC4KCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBzZWxmLmF2YWlsYWJsZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gKyAiIGlzIHJlcXVpcmVkLCAiCiAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKICAgICAgICAgICAgKQoKICAgICAgICBkaXN0LmluY2x1ZGUoKipzZWxmLmV4dHJhcykKCiAgICAgICAgZm9yIGYgaW4gc2VsZi5yZXF1aXJlX2ZlYXR1cmVzOgogICAgICAgICAgICBkaXN0LmluY2x1ZGVfZmVhdHVyZShmKQoKICAgIGRlZiBleGNsdWRlX2Zyb20oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgaXMgZXhjbHVkZWQgZnJvbSBkaXN0cmlidXRpb24KCiAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlcgogICAgICAgIGZlYXR1cmUsIGFuZCBvbmx5IGFmdGVyIGFsbCBpbmNsdWRlZCBmZWF0dXJlcyBoYXZlIGJlZW4gYXNrZWQgdG8KICAgICAgICBpbmNsdWRlIHRoZW1zZWx2ZXMuCiAgICAgICAgIiIiCgogICAgICAgIGRpc3QuZXhjbHVkZSgqKnNlbGYuZXh0cmFzKQoKICAgICAgICBpZiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CiAgICAgICAgICAgICAgICBkaXN0LmV4Y2x1ZGVfcGFja2FnZShpdGVtKQoKICAgIGRlZiB2YWxpZGF0ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJWZXJpZnkgdGhhdCBmZWF0dXJlIG1ha2VzIHNlbnNlIGluIGNvbnRleHQgb2YgZGlzdHJpYnV0aW9uCgogICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGlzdHJpYnV0aW9uIGp1c3QgYmVmb3JlIGl0IHBhcnNlcyBpdHMKICAgICAgICBjb21tYW5kIGxpbmUuICBJdCBjaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlICdyZW1vdmUnIGF0dHJpYnV0ZSwgaWYgYW55LAogICAgICAgIGNvbnRhaW5zIG9ubHkgdmFsaWQgcGFja2FnZS9tb2R1bGUgbmFtZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgYmFzZQogICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuICdzZXR1cCgpJyBpcyBjYWxsZWQuICBZb3UgbWF5IG92ZXJyaWRlIGl0IGluIGEKICAgICAgICBzdWJjbGFzcyB0byBwZXJmb3JtIGFueSBvdGhlciByZXF1aXJlZCB2YWxpZGF0aW9uIG9mIHRoZSBmZWF0dXJlCiAgICAgICAgYWdhaW5zdCBhIHRhcmdldCBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgogICAgICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKGl0ZW0pOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAiJXMgd2FudHMgdG8gYmUgYWJsZSB0byByZW1vdmUgJXMsIGJ1dCB0aGUgZGlzdHJpYnV0aW9uIgogICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBjb250YWluIGFueSBwYWNrYWdlcyBvciBtb2R1bGVzIHVuZGVyICVzIgogICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZGVzY3JpcHRpb24sIGl0ZW0sIGl0ZW0pCiAgICAgICAgICAgICAgICApCgoKY2xhc3MgRGlzdERlcHJlY2F0aW9uV2FybmluZyhTZXR1cHRvb2xzRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIkNsYXNzIGZvciB3YXJuaW5nIGFib3V0IGRlcHJlY2F0aW9ucyBpbiBkaXN0IGluCiAgICBzZXR1cHRvb2xzLiBOb3QgaWdub3JlZCBieSBkZWZhdWx0LCB1bmxpa2UgRGVwcmVjYXRpb25XYXJuaW5nLiIiIgpQSwMEFAAAAAAAAAAhALv/UeYMAgAADAIAADkAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9lcnJvcnMucHkiIiJzZXR1cHRvb2xzLmVycm9ycwoKUHJvdmlkZXMgZXhjZXB0aW9ucyB1c2VkIGJ5IHNldHVwdG9vbHMgbW9kdWxlcy4KIiIiCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCgoKY2xhc3MgUmVtb3ZlZENvbW1hbmRFcnJvcihEaXN0dXRpbHNFcnJvciwgUnVudGltZUVycm9yKToKICAgICIiIkVycm9yIHVzZWQgZm9yIGNvbW1hbmRzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gc2V0dXB0b29scy4KCiAgICBTaW5jZSBgYHNldHVwdG9vbHNgYCBpcyBidWlsdCBvbiBgYGRpc3R1dGlsc2BgLCBzaW1wbHkgcmVtb3ZpbmcgYSBjb21tYW5kCiAgICBmcm9tIGBgc2V0dXB0b29sc2BgIHdpbGwgbWFrZSB0aGUgYmVoYXZpb3IgZmFsbCBiYWNrIHRvIGBgZGlzdHV0aWxzYGA7IHRoaXMKICAgIGVycm9yIGlzIHJhaXNlZCBpZiBhIGNvbW1hbmQgZXhpc3RzIGluIGBgZGlzdHV0aWxzYGAgYnV0IGhhcyBiZWVuIGFjdGl2ZWx5CiAgICByZW1vdmVkIGluIGBgc2V0dXB0b29sc2BgLgogICAgIiIiClBLAwQUAAAAAAAAACEAuaqR7sEGAADBBgAAPAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weWltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmV4dGVuc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSAubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCgoKZGVmIF9oYXZlX2N5dGhvbigpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBDeXRob24gY2FuIGJlIGltcG9ydGVkLgogICAgIiIiCiAgICBjeXRob25faW1wbCA9ICdDeXRob24uRGlzdHV0aWxzLmJ1aWxkX2V4dCcKICAgIHRyeToKICAgICAgICAjIGZyb20gKGN5dGhvbl9pbXBsKSBpbXBvcnQgYnVpbGRfZXh0CiAgICAgICAgX19pbXBvcnRfXyhjeXRob25faW1wbCwgZnJvbWxpc3Q9WydidWlsZF9leHQnXSkuYnVpbGRfZXh0CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwogICAgcmV0dXJuIEZhbHNlCgoKIyBmb3IgY29tcGF0aWJpbGl0eQpoYXZlX3B5cmV4ID0gX2hhdmVfY3l0aG9uCgpfRXh0ZW5zaW9uID0gZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5FeHRlbnNpb24pCgoKY2xhc3MgRXh0ZW5zaW9uKF9FeHRlbnNpb24pOgogICAgIiIiRXh0ZW5zaW9uIHRoYXQgdXNlcyAnLmMnIGZpbGVzIGluIHBsYWNlIG9mICcucHl4JyBmaWxlcyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdyk6CiAgICAgICAgIyBUaGUgKmFyZ3MgaXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IGFzIGNhbGxzIG1heSB1c2UgcG9zaXRpb25hbAogICAgICAgICMgYXJndW1lbnRzLiBweV9saW1pdGVkX2FwaSBtYXkgYmUgc2V0IG9ubHkgdmlhIGtleXdvcmQuCiAgICAgICAgc2VsZi5weV9saW1pdGVkX2FwaSA9IGt3LnBvcCgicHlfbGltaXRlZF9hcGkiLCBGYWxzZSkKICAgICAgICBfRXh0ZW5zaW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZXMsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfY29udmVydF9weXhfc291cmNlc190b19sYW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2Ugc291cmNlcyB3aXRoIC5weXggZXh0ZW5zaW9ucyB0byBzb3VyY2VzIHdpdGggdGhlIHRhcmdldAogICAgICAgIGxhbmd1YWdlIGV4dGVuc2lvbi4gVGhpcyBtZWNoYW5pc20gYWxsb3dzIGxhbmd1YWdlIGF1dGhvcnMgdG8gc3VwcGx5CiAgICAgICAgcHJlLWNvbnZlcnRlZCBzb3VyY2VzIGJ1dCB0byBwcmVmZXIgdGhlIC5weXggc291cmNlcy4KICAgICAgICAiIiIKICAgICAgICBpZiBfaGF2ZV9jeXRob24oKToKICAgICAgICAgICAgIyB0aGUgYnVpbGQgaGFzIEN5dGhvbiwgc28gYWxsb3cgaXQgdG8gY29tcGlsZSB0aGUgLnB5eCBmaWxlcwogICAgICAgICAgICByZXR1cm4KICAgICAgICBsYW5nID0gc2VsZi5sYW5ndWFnZSBvciAnJwogICAgICAgIHRhcmdldF9leHQgPSAnLmNwcCcgaWYgbGFuZy5sb3dlcigpID09ICdjKysnIGVsc2UgJy5jJwogICAgICAgIHN1YiA9IGZ1bmN0b29scy5wYXJ0aWFsKHJlLnN1YiwgJy5weXgkJywgdGFyZ2V0X2V4dCkKICAgICAgICBzZWxmLnNvdXJjZXMgPSBsaXN0KG1hcChzdWIsIHNlbGYuc291cmNlcykpCgoKY2xhc3MgTGlicmFyeShFeHRlbnNpb24pOgogICAgIiIiSnVzdCBsaWtlIGEgcmVndWxhciBFeHRlbnNpb24sIGJ1dCBidWlsdCBhcyBhIGxpYnJhcnkgaW5zdGVhZCIiIgpQSwMEFAAAAAAAAAAhAMckbJPSCQAA0gkAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlpbXBvcnQgc3lzCgoKY2xhc3MgVmVuZG9ySW1wb3J0ZXI6CiAgICAiIiIKICAgIEEgUEVQIDMwMiBtZXRhIHBhdGggaW1wb3J0ZXIgZm9yIGZpbmRpbmcgb3B0aW9uYWxseS12ZW5kb3JlZAogICAgb3Igb3RoZXJ3aXNlIG5hdHVyYWxseS1pbnN0YWxsZWQgcGFja2FnZXMgZnJvbSByb290X25hbWUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9uYW1lLCB2ZW5kb3JlZF9uYW1lcz0oKSwgdmVuZG9yX3BrZz1Ob25lKToKICAgICAgICBzZWxmLnJvb3RfbmFtZSA9IHJvb3RfbmFtZQogICAgICAgIHNlbGYudmVuZG9yZWRfbmFtZXMgPSBzZXQodmVuZG9yZWRfbmFtZXMpCiAgICAgICAgc2VsZi52ZW5kb3JfcGtnID0gdmVuZG9yX3BrZyBvciByb290X25hbWUucmVwbGFjZSgnZXh0ZXJuJywgJ192ZW5kb3InKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNlYXJjaF9wYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlYXJjaCBmaXJzdCB0aGUgdmVuZG9yIHBhY2thZ2UgdGhlbiBhcyBhIG5hdHVyYWwgcGFja2FnZS4KICAgICAgICAiIiIKICAgICAgICB5aWVsZCBzZWxmLnZlbmRvcl9wa2cgKyAnLicKICAgICAgICB5aWVsZCAnJwoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc2VsZiB3aGVuIGZ1bGxuYW1lIHN0YXJ0cyB3aXRoIHJvb3RfbmFtZSBhbmQgdGhlCiAgICAgICAgdGFyZ2V0IG1vZHVsZSBpcyBvbmUgdmVuZG9yZWQgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgYW55KG1hcCh0YXJnZXQuc3RhcnRzd2l0aCwgc2VsZi52ZW5kb3JlZF9uYW1lcykpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZSBvdmVyIHRoZSBzZWFyY2ggcGF0aCB0byBsb2NhdGUgYW5kIGxvYWQgZnVsbG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGZvciBwcmVmaXggaW4gc2VsZi5zZWFyY2hfcGF0aDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXh0YW50ID0gcHJlZml4ICsgdGFyZ2V0CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKGV4dGFudCkKICAgICAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgICAgICAgICAgIyBteXN0ZXJpb3VzIGhhY2s6CiAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHRhbnQgcGFja2FnZS9tb2R1bGUKICAgICAgICAgICAgICAgICMgb24gbGF0ZXIgUHl0aG9uIHZlcnNpb25zIHRvIGNhdXNlIHJlbGF0aXZlIGltcG9ydHMKICAgICAgICAgICAgICAgICMgaW4gdGhlIHZlbmRvciBwYWNrYWdlIHRvIHJlc29sdmUgdGhlIHNhbWUgbW9kdWxlcwogICAgICAgICAgICAgICAgIyBhcyB0aG9zZSBnb2luZyB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCApOgogICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICJUaGUgJ3t0YXJnZXR9JyBwYWNrYWdlIGlzIHJlcXVpcmVkOyAiCiAgICAgICAgICAgICAgICAibm9ybWFsbHkgdGhpcyBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIHNvIGlmIHlvdSBnZXQgIgogICAgICAgICAgICAgICAgInRoaXMgd2FybmluZywgY29uc3VsdCB0aGUgcGFja2FnZXIgb2YgeW91ciAiCiAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uLiIuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5zdGFsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoaXMgaW1wb3J0ZXIgaW50byBzeXMubWV0YV9wYXRoIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZiBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoc2VsZikKCgpuYW1lcyA9ICdzaXgnLCAncGFja2FnaW5nJywgJ3B5cGFyc2luZycsICdvcmRlcmVkX3NldCcsClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcywgJ3NldHVwdG9vbHMuX3ZlbmRvcicpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAI7IT2vcEwAA3BMAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9nbG9iLnB5IiIiCkZpbGVuYW1lIGdsb2JiaW5nIHV0aWxpdHkuIE1vc3RseSBhIGNvcHkgb2YgYGdsb2JgIGZyb20gUHl0aG9uIDMuNS4KCkNoYW5nZXMgaW5jbHVkZToKICogYHlpZWxkIGZyb21gIGFuZCBQRVAzMTAyIGAqYCByZW1vdmVkLgogKiBIaWRkZW4gZmlsZXMgYXJlIG5vdCBpZ25vcmVkLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IGZubWF0Y2gKCl9fYWxsX18gPSBbImdsb2IiLCAiaWdsb2IiLCAiZXNjYXBlIl0KCgpkZWYgZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcGF0aHMgbWF0Y2hpbmcgYSBwYXRobmFtZSBwYXR0ZXJuLgoKICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQogICAgZm5tYXRjaC4gSG93ZXZlciwgdW5saWtlIGZubWF0Y2gsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEKICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JwogICAgcGF0dGVybnMuCgogICAgSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZSBwYXR0ZXJuICcqKicgd2lsbCBtYXRjaCBhbnkgZmlsZXMgYW5kCiAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgIiIiCiAgICByZXR1cm4gbGlzdChpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPXJlY3Vyc2l2ZSkpCgoKZGVmIGlnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9RmFsc2UpOgogICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHdoaWNoIHlpZWxkcyB0aGUgcGF0aHMgbWF0Y2hpbmcgYSBwYXRobmFtZSBwYXR0ZXJuLgoKICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQogICAgZm5tYXRjaC4gSG93ZXZlciwgdW5saWtlIGZubWF0Y2gsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEKICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JwogICAgcGF0dGVybnMuCgogICAgSWYgcmVjdXJzaXZlIGlzIHRydWUsIHRoZSBwYXR0ZXJuICcqKicgd2lsbCBtYXRjaCBhbnkgZmlsZXMgYW5kCiAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgIiIiCiAgICBpdCA9IF9pZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlKQogICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUocGF0aG5hbWUpOgogICAgICAgIHMgPSBuZXh0KGl0KSAgIyBza2lwIGVtcHR5IHN0cmluZwogICAgICAgIGFzc2VydCBub3QgcwogICAgcmV0dXJuIGl0CgoKZGVmIF9pZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlKToKICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKICAgIGlmIG5vdCBoYXNfbWFnaWMocGF0aG5hbWUpOgogICAgICAgIGlmIGJhc2VuYW1lOgogICAgICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMocGF0aG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aG5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFBhdHRlcm5zIGVuZGluZyB3aXRoIGEgc2xhc2ggc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgcmV0dXJuCiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGZvciB4IGluIGdsb2IyKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMShkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgcmV0dXJuCiAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZiBhcyBhIGRpcm5hbWUgaWYgaXQgaXMgYQogICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKICAgICMgY29udGFpbnMgbWFnaWMgY2hhcmFjdGVycyAoaS5lLiByJ1xcP1xDOicpLgogICAgaWYgZGlybmFtZSAhPSBwYXRobmFtZSBhbmQgaGFzX21hZ2ljKGRpcm5hbWUpOgogICAgICAgIGRpcnMgPSBfaWdsb2IoZGlybmFtZSwgcmVjdXJzaXZlKQogICAgZWxzZToKICAgICAgICBkaXJzID0gW2Rpcm5hbWVdCiAgICBpZiBoYXNfbWFnaWMoYmFzZW5hbWUpOgogICAgICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKGJhc2VuYW1lKToKICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjEKICAgIGVsc2U6CiAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMAogICAgZm9yIGRpcm5hbWUgaW4gZGlyczoKICAgICAgICBmb3IgbmFtZSBpbiBnbG9iX2luX2RpcihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQoKCiMgVGhlc2UgMiBoZWxwZXIgZnVuY3Rpb25zIG5vbi1yZWN1cnNpdmVseSBnbG9iIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgojIFRoZXkgcmV0dXJuIGEgbGlzdCBvZiBiYXNlbmFtZXMuIGBnbG9iMWAgYWNjZXB0cyBhIHBhdHRlcm4gd2hpbGUgYGdsb2IwYAojIHRha2VzIGEgbGl0ZXJhbCBiYXNlbmFtZSAoc28gaXQgb25seSBoYXMgdG8gY2hlY2sgZm9yIGl0cyBleGlzdGVuY2UpLgoKCmRlZiBnbG9iMShkaXJuYW1lLCBwYXR0ZXJuKToKICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYnl0ZXMpOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyLmVuY29kZSgnQVNDSUknKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgIHJldHVybiBbXQogICAgcmV0dXJuIGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKQoKCmRlZiBnbG9iMChkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICBpZiBub3QgYmFzZW5hbWU6CiAgICAgICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIGFuIGVtcHR5IGJhc2VuYW1lIGZvciBwYXRocyBlbmRpbmcgd2l0aCBhCiAgICAgICAgIyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgJ3EqeC8nIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzLgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICBlbHNlOgogICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpKToKICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgIHJldHVybiBbXQoKCiMgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsCiMgZGlyZWN0b3J5LgoKCmRlZiBnbG9iMihkaXJuYW1lLCBwYXR0ZXJuKToKICAgIGFzc2VydCBfaXNyZWN1cnNpdmUocGF0dGVybikKICAgIHlpZWxkIHBhdHRlcm5bOjBdCiAgICBmb3IgeCBpbiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICAgICAgeWllbGQgeAoKCiMgUmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KZGVmIF9ybGlzdGRpcihkaXJuYW1lKToKICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGlybmFtZSwgYnl0ZXMpOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyLmVuY29kZSgnQVNDSUknKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICByZXR1cm4KICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgIHlpZWxkIHgKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIHgpIGlmIGRpcm5hbWUgZWxzZSB4CiAgICAgICAgZm9yIHkgaW4gX3JsaXN0ZGlyKHBhdGgpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oeCwgeSkKCgptYWdpY19jaGVjayA9IHJlLmNvbXBpbGUoJyhbKj9bXSknKQptYWdpY19jaGVja19ieXRlcyA9IHJlLmNvbXBpbGUoYicoWyo/W10pJykKCgpkZWYgaGFzX21hZ2ljKHMpOgogICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgbWF0Y2ggPSBtYWdpY19jaGVja19ieXRlcy5zZWFyY2gocykKICAgIGVsc2U6CiAgICAgICAgbWF0Y2ggPSBtYWdpY19jaGVjay5zZWFyY2gocykKICAgIHJldHVybiBtYXRjaCBpcyBub3QgTm9uZQoKCmRlZiBfaXNyZWN1cnNpdmUocGF0dGVybik6CiAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJ5dGVzKToKICAgICAgICByZXR1cm4gcGF0dGVybiA9PSBiJyoqJwogICAgZWxzZToKICAgICAgICByZXR1cm4gcGF0dGVybiA9PSAnKionCgoKZGVmIGVzY2FwZShwYXRobmFtZSk6CiAgICAiIiJFc2NhcGUgYWxsIHNwZWNpYWwgY2hhcmFjdGVycy4KICAgICIiIgogICAgIyBFc2NhcGluZyBpcyBkb25lIGJ5IHdyYXBwaW5nIGFueSBvZiAiKj9bIiBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cy4KICAgICMgTWV0YWNoYXJhY3RlcnMgZG8gbm90IHdvcmsgaW4gdGhlIGRyaXZlIHBhcnQgYW5kIHNob3VsZG4ndCBiZSBlc2NhcGVkLgogICAgZHJpdmUsIHBhdGhuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKHBhdGhuYW1lKQogICAgaWYgaXNpbnN0YW5jZShwYXRobmFtZSwgYnl0ZXMpOgogICAgICAgIHBhdGhuYW1lID0gbWFnaWNfY2hlY2tfYnl0ZXMuc3ViKGJyJ1tcMV0nLCBwYXRobmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aG5hbWUgPSBtYWdpY19jaGVjay5zdWIocidbXDFdJywgcGF0aG5hbWUpCiAgICByZXR1cm4gZHJpdmUgKyBwYXRobmFtZQpQSwMEFAAAAAAAAAAhABD5/CkAAAEAAAABADoAAABwaXB0b29sX2Rl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/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//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5f//A8E5tTzl//+JhTjl//8PjBUEAACDvSDl//8AD4TNAAAAagCNhTzl//9QagGNRfRQi4Uo5f//iwDGRfQN/zQH/xWY4EAAhcAPhNADAACDvTzl//8BD4zPAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJZoP+Cg+UwUNDg4VE5f//Aom1QOX//4mNIOX//zwBdAQ8AnVS/7VA5f//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/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRTosrb//8cACQAAAOi6tv//iTDrP/+1QOX//+i+tv//Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6HK2///HABwAAADoerb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7o2J3//8nDahBo8PdAAOiEtv//i0UIg/j+dRvoPrb//4MgAOgjtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIegVtv//iTjo+7X//8cACQAAAFdXV1dX6IO1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbomLX//8cACQAAAOigtf//iTiDTeT/x0X8/v///+gJAAAAi0Xk6AS2///D/3UI6IMkAABZw2oQaBD4QADoqLX//4tFCIP4/nUT6E+1///HAAkAAACDyP/pqgAAADPbO8N8CDsFkCpBAHIa6C61///HAAkAAABTU1NTU+i2tP//g8QU69CLyMH5BY08jaAqQQCL8IPmH8HmBosPD75MDgSD4QF0xlDobCMAAFmJXfyLB/ZEBgQBdDH/dQjo4CIAAFlQ/xXk4EAAhcB1C/8VXOBAAIlF5OsDiV3kOV3kdBnozbT//4tN5IkI6LC0///HAAkAAACDTeT/x0X8/v///+gJAAAAi0Xk6CO1///D/3UI6KIjAABZw4v/VYvsg+wQUzPbOV0IdRzocrT//1NTU1NTxwAWAAAA6Pqz//+DxBQzwOtqVot1DDvzdRroTrT//1NTU1NTxwAWAAAA6Naz//+DxBTrBTl1CHIEM8DrPv91EI1N8OjGm///i030jUb/OVkIdBxIOUUIdwoPthD2RAodBHXwi84ryIPhASvxTovGOF38dAeL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O8N0HMcAzMwAAOsRUOhQ4P//WTvDdAnHAN3dAACDwAiL2IXbdGmNBD9QagBT6E6Q//+DxAxXU/91EP91DGoB/3UY/9aFwHQR/3UUUFP/dQj/FfjgQACJRfhT6Mn6//+LRfhZ63Uz9jldHHUIiweLQBSJRRw5XRh1CIsHi0AEiUUY/3Uc6EEdAABZg/j/dQQzwOtHO0UYdB5TU41NEFH/dQxQ/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//9Zi3Yk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IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAFAAUABAAEAAQABAAEAAUABAAEAAQABAAEAAQAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQAAEBAQEBAQEBAQEBAQEBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAACAQIBAgECAQIBAgECAQIBAQEAAAAAgIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6W1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/SEg6bW06c3MAAAAAZGRkZCwgTU1NTSBkZCwgeXl5eQBNTS9kZC95eQAAAABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVtYmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZlYgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAEdldExhc3RBY3RpdmVQb3B1cAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAFVTRVIzMi5ETEwAAFN1bk1vblR1ZVdlZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAAAAOAAAsGkAAKCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///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+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCtBAAAAAADAK0EAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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LmV4ZQAAAAAjIQAAAAAAAENhbm5vdCBvcGVuICVzCgAtc2NyaXB0LnB5dwAAAAAAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAAAAAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAAAAAAEDgBQAEAAACwOAFAAQAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAAAAAABydW50aW1lIGVycm9yIAAADQoAAAAAAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAAAAAAAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAAAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAAAAAAAAAAAAAAAAAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgAAAAAAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAAAAAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVu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AAAAAKgYAQAAAAAAuhgBAAAAAADGGAEAAAAAANQYAQAAAAAA5BgBAAAAAAD6GAEAAAAAAAoZAQAAAAAAGhkBAAAAAAAoGQEAAAAAADoZAQAAAAAATBkBAAAAAAB0GQEAAAAAAIAZAQAAAAAAkBkBAAAAAACiGQEAAAAAAAAAAAAAAAAAUwFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMcBR2V0RXhpdENvZGVQcm9jZXNzAAByBFdhaXRGb3JTaW5nbGVPYmplY3QAlgBDcmVhdGVQcm9jZXNzQQAAtANTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANsARW50ZXJDcml0aWNhbFNlY3Rpb24AAO4CTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAALwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAGAUV4aXRQcm9jZXNzAHEBR2V0Q29tbWFuZExpbmVBADwCR2V0U3RhcnR1cEluZm9BAJ4DUnRsVW53aW5kRXgA9ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANkBR2V0RmlsZVR5cGUAwABEZWxldGVDcml0aWNhbFNlY3Rpb24AOwRUZXJtaW5hdGVQcm9jZXNzAACrAUdldEN1cnJlbnRQcm9jZXNzAEwEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAjBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDQAklzRGVidWdnZXJQcmVzZW50AJ8DUnRsVmlydHVhbFVud2luZAAAmANSdGxMb29rdXBGdW5jdGlvbkVudHJ5AACRA1J0bENhcHR1cmVDb250ZXh0AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBdAUdldENQSW5mbwBUAUdldEFDUAAAFAJHZXRPRU1DUAAA2gJJc1ZhbGlkQ29kZVBhZ2UA1wBFbmNvZGVQb2ludGVyALkARGVjb2RlUG9pbnRlcgBAAUZsc0dldFZhbHVlAEEBRmxzU2V0VmFsdWUAPwFGbHNGcmVlAPgDU2V0TGFzdEVycm9yAACvAUdldEN1cnJlbnRUaHJlYWRJZAAAPgFGbHNBbGxvYwAAmwRXcml0ZUZpbGUA8AJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMEBR2V0RW52aXJvbm1lbnRTdHJpbmdzAE0BRnJlZUVudmlyb25tZW50U3RyaW5nc1cAiARXaWRlQ2hhclRvTXVsdGlCeXRlAMMBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqgJIZWFwU2V0SW5mb3JtYXRpb24AAKQCSGVhcENyZWF0ZQAAUwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAArAFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAqQJIZWFwUmVBbGxvYwCFAUdldENvbnNvbGVDUAAAlwFHZXRDb25zb2xlTW9kZQAAQwFGbHVzaEZpbGVCdWZmZXJzAADgAkxDTWFwU3RyaW5nQQAAGQNNdWx0aUJ5dGVUb1dpZGVDaGFyAOICTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADsA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAJAEV3JpdGVDb25zb2xlQQCbAUdldENvbnNvbGVPdXRwdXRDUAAAmgRXcml0ZUNvbnNvbGVXAAoEU2V0U3RkSGFuZGxlAAB6AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAAN0DU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABoA1JlYWRGaWxlAADaA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAywFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBFAUABAAAAAAAAAAAAAADgRQFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKi3y2ZKwAA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tfD9//+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///Jw5AWK0AAFylAAEcpQAClKUAA8SlAAPwpQABCKkAAcCtAAGpUaFj1QADoZQQAADP/iX38jUWcUP8VNOBAAMdF/P7///9qQGogXlboeQYAAFlZO8cPhBQCAACjoCpBAIk1kCpBAI2IAAgAAOswxkAEAIMI/8ZABQqJeAjGQCQAxkAlCsZAJgqJeDjGQDQAg8BAiw2gKkEAgcEACAAAO8FyzGY5fc4PhAoBAACLRdA7xw+E/wAAAIs4jVgE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/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/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRTosrb//8cACQAAAOi6tv//iTDrP/+1QOX//+i+tv//Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6HK2///HABwAAADoerb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7o2J3//8nDahBo8PdAAOiEtv//i0UI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/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+xWM8BQUFBQUFBQUItVDI1JAIoCCsB0CYPCAQ+rBCTr8Yt1CIPJ/41JAIPBAYoGCsB0CYPGAQ+jBCRz7ovBg8QgXsnDi/9Vi+xTVot1CDPbVzldFHUQO/N1EDldDHUSM8BfXltdwzvzdAeLfQw7+3cb6Gio//9qFl6JMFNTU1NT6PGn//+DxBSLxuvVOV0UdQSIHuvKi1UQO9N1BIge69GDfRT/i8Z1D4oKiAhAQjrLdB5PdfPrGYoK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BgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAqCFBAAAiQQAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAAAAOAAAsGkAAKCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///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////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAA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ICIiIkVuc3VyZSBmaW5kLWxpbmtzIG9wdGlvbiBlbmQtdXAgYmVpbmcgYSBsaXN0IG9mIHN0cmluZ3MuIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpbmRfbGlua3MsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIHJldHVybiBmaW5kX2xpbmtzLnNwbGl0KCkKICAgIGFzc2VydCBpc2luc3RhbmNlKGZpbmRfbGlua3MsICh0dXBsZSwgbGlzdCkpCiAgICByZXR1cm4gZmluZF9saW5rcwoKCmRlZiBfbGVnYWN5X2ZldGNoX2J1aWxkX2VnZyhkaXN0LCByZXEpOgogICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmcuCgogICAgTGVnYWN5IHBhdGggdXNpbmcgRWFzeUluc3RhbGwuCiAgICAiIiIKICAgIHRtcF9kaXN0ID0gZGlzdC5fX2NsYXNzX18oeydzY3JpcHRfYXJncyc6IFsnZWFzeV9pbnN0YWxsJ119KQogICAgb3B0cyA9IHRtcF9kaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgIG9wdHMuY2xlYXIoKQogICAgb3B0cy51cGRhdGUoCiAgICAgICAgKGssIHYpCiAgICAgICAgZm9yIGssIHYgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLml0ZW1zKCkKICAgICAgICBpZiBrIGluICgKICAgICAgICAgICAgIyBkb24ndCB1c2UgYW55IG90aGVyIHNldHRpbmdzCiAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLAogICAgICAgICAgICAnb3B0aW1pemUnLCAnc2l0ZV9kaXJzJywgJ2FsbG93X2hvc3RzJywKICAgICAgICApKQogICAgaWYgZGlzdC5kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgIGxpbmtzID0gZGlzdC5kZXBlbmRlbmN5X2xpbmtzWzpdCiAgICAgICAgaWYgJ2ZpbmRfbGlua3MnIGluIG9wdHM6CiAgICAgICAgICAgIGxpbmtzID0gX2ZpeHVwX2ZpbmRfbGlua3Mob3B0c1snZmluZF9saW5rcyddWzFdKSArIGxpbmtzCiAgICAgICAgb3B0c1snZmluZF9saW5rcyddID0gKCdzZXR1cCcsIGxpbmtzKQogICAgaW5zdGFsbF9kaXIgPSBkaXN0LmdldF9lZ2dfY2FjaGVfZGlyKCkKICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKICAgICAgICB0bXBfZGlzdCwgYXJncz1bIngiXSwgaW5zdGFsbF9kaXI9aW5zdGFsbF9kaXIsCiAgICAgICAgZXhjbHVkZV9zY3JpcHRzPVRydWUsCiAgICAgICAgYWx3YXlzX2NvcHk9RmFsc2UsIGJ1aWxkX2RpcmVjdG9yeT1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKICAgICAgICB1cGdyYWRlPUZhbHNlLCBtdWx0aV92ZXJzaW9uPVRydWUsIG5vX3JlcG9ydD1UcnVlLCB1c2VyPUZhbHNlCiAgICApCiAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCiAgICByZXR1cm4gY21kLmVhc3lfaW5zdGFsbChyZXEpCgoKZGVmIGZldGNoX2J1aWxkX2VnZyhkaXN0LCByZXEpOgogICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmcuCgogICAgVXNlIHBpcC93aGVlbCB0byBmZXRjaC9idWlsZCBhIHdoZWVsLiIiIgogICAgIyBDaGVjayBwaXAgaXMgYXZhaWxhYmxlLgogICAgdHJ5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbigncGlwJykKICAgIGV4Y2VwdCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgIGRpc3QuYW5ub3VuY2UoCiAgICAgICAgICAgICdXQVJOSU5HOiBUaGUgcGlwIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrICcKICAgICAgICAgICAgJ3RvIEVhc3lJbnN0YWxsIGZvciBoYW5kbGluZyBzZXR1cF9yZXF1aXJlcy90ZXN0X3JlcXVpcmVzOyAnCiAgICAgICAgICAgICd0aGlzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicKICAgICAgICAgICAgLCBsb2cuV0FSTgogICAgICAgICkKICAgICAgICByZXR1cm4gX2xlZ2FjeV9mZXRjaF9idWlsZF9lZ2coZGlzdCwgcmVxKQogICAgIyBXYXJuIGlmIHdoZWVsIGlzIG5vdC4KICAgIHRyeToKICAgICAgICBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oJ3doZWVsJykKICAgIGV4Y2VwdCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgIGRpc3QuYW5ub3VuY2UoJ1dBUk5JTkc6IFRoZSB3aGVlbCBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUuJywgbG9nLldBUk4pCiAgICAjIElnbm9yZSBlbnZpcm9ubWVudCBtYXJrZXJzOyBpZiBzdXBwbGllZCwgaXQgaXMgcmVxdWlyZWQuCiAgICByZXEgPSBzdHJpcF9tYXJrZXIocmVxKQogICAgIyBUYWtlIGVhc3lfaW5zdGFsbCBvcHRpb25zIGludG8gYWNjb3VudCwgYnV0IGRvIG5vdCBvdmVycmlkZSByZWxldmFudAogICAgIyBwaXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIChsaWtlIFBJUF9JTkRFWF9VUkwgb3IgUElQX1FVSUVUKTsgdGhleSdsbAogICAgIyB0YWtlIHByZWNlZGVuY2UuCiAgICBvcHRzID0gZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICBpZiAnYWxsb3dfaG9zdHMnIGluIG9wdHM6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoJ3RoZSBgYWxsb3ctaG9zdHNgIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlbiB1c2luZyBwaXAgdG8gaW5zdGFsbCByZXF1aXJlbWVudHMuJykKICAgIGlmICdQSVBfUVVJRVQnIGluIG9zLmVudmlyb24gb3IgJ1BJUF9WRVJCT1NFJyBpbiBvcy5lbnZpcm9uOgogICAgICAgIHF1aWV0ID0gRmFsc2UKICAgIGVsc2U6CiAgICAgICAgcXVpZXQgPSBUcnVlCiAgICBpZiAnUElQX0lOREVYX1VSTCcgaW4gb3MuZW52aXJvbjoKICAgICAgICBpbmRleF91cmwgPSBOb25lCiAgICBlbGlmICdpbmRleF91cmwnIGluIG9wdHM6CiAgICAgICAgaW5kZXhfdXJsID0gb3B0c1snaW5kZXhfdXJsJ11bMV0KICAgIGVsc2U6CiAgICAgICAgaW5kZXhfdXJsID0gTm9uZQogICAgaWYgJ2ZpbmRfbGlua3MnIGluIG9wdHM6CiAgICAgICAgZmluZF9saW5rcyA9IF9maXh1cF9maW5kX2xpbmtzKG9wdHNbJ2ZpbmRfbGlua3MnXVsxXSlbOl0KICAgIGVsc2U6CiAgICAgICAgZmluZF9saW5rcyA9IFtdCiAgICBpZiBkaXN0LmRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgZmluZF9saW5rcy5leHRlbmQoZGlzdC5kZXBlbmRlbmN5X2xpbmtzKQogICAgZWdnc19kaXIgPSBvcy5wYXRoLnJlYWxwYXRoKGRpc3QuZ2V0X2VnZ19jYWNoZV9kaXIoKSkKICAgIGVudmlyb25tZW50ID0gcGtnX3Jlc291cmNlcy5FbnZpcm9ubWVudCgpCiAgICBmb3IgZWdnX2Rpc3QgaW4gcGtnX3Jlc291cmNlcy5maW5kX2Rpc3RyaWJ1dGlvbnMoZWdnc19kaXIpOgogICAgICAgIGlmIGVnZ19kaXN0IGluIHJlcSBhbmQgZW52aXJvbm1lbnQuY2FuX2FkZChlZ2dfZGlzdCk6CiAgICAgICAgICAgIHJldHVybiBlZ2dfZGlzdAogICAgd2l0aCBUZW1wb3JhcnlEaXJlY3RvcnkoKSBhcyB0bXBkaXI6CiAgICAgICAgY21kID0gWwogICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1tJywgJ3BpcCcsCiAgICAgICAgICAgICctLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2snLAogICAgICAgICAgICAnd2hlZWwnLCAnLS1uby1kZXBzJywKICAgICAgICAgICAgJy13JywgdG1wZGlyLAogICAgICAgIF0KICAgICAgICBpZiBxdWlldDoKICAgICAgICAgICAgY21kLmFwcGVuZCgnLS1xdWlldCcpCiAgICAgICAgaWYgaW5kZXhfdXJsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjbWQuZXh0ZW5kKCgnLS1pbmRleC11cmwnLCBpbmRleF91cmwpKQogICAgICAgIGlmIGZpbmRfbGlua3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBsaW5rIGluIGZpbmRfbGlua3M6CiAgICAgICAgICAgICAgICBjbWQuZXh0ZW5kKCgnLS1maW5kLWxpbmtzJywgbGluaykpCiAgICAgICAgIyBJZiByZXF1aXJlbWVudCBpcyBhIFBFUCA1MDggZGlyZWN0IFVSTCwgZGlyZWN0bHkgcGFzcwogICAgICAgICMgdGhlIFVSTCB0byBwaXAsIGFzIGByZXEgQCB1cmxgIGRvZXMgbm90IHdvcmsgb24gdGhlCiAgICAgICAgIyBjb21tYW5kIGxpbmUuCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgY21kLmFwcGVuZChyZXEudXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNtZC5hcHBlbmQoc3RyKHJlcSkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kKQogICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHIoZSkpCiAgICAgICAgd2hlZWwgPSBXaGVlbChnbG9iLmdsb2Iob3MucGF0aC5qb2luKHRtcGRpciwgJyoud2hsJykpWzBdKQogICAgICAgIGRpc3RfbG9jYXRpb24gPSBvcy5wYXRoLmpvaW4oZWdnc19kaXIsIHdoZWVsLmVnZ19uYW1lKCkpCiAgICAgICAgd2hlZWwuaW5zdGFsbF9hc19lZ2coZGlzdF9sb2NhdGlvbikKICAgICAgICBkaXN0X21ldGFkYXRhID0gcGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgIGRpc3RfbG9jYXRpb24sIG9zLnBhdGguam9pbihkaXN0X2xvY2F0aW9uLCAnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKICAgICAgICAgICAgZGlzdF9sb2NhdGlvbiwgbWV0YWRhdGE9ZGlzdF9tZXRhZGF0YSkKICAgICAgICByZXR1cm4gZGlzdAoKCmRlZiBzdHJpcF9tYXJrZXIocmVxKToKICAgICIiIgogICAgUmV0dXJuIGEgbmV3IHJlcXVpcmVtZW50IHdpdGhvdXQgdGhlIGVudmlyb25tZW50IG1hcmtlciB0byBhdm9pZAogICAgY2FsbGluZyBwaXAgd2l0aCBzb21ldGhpbmcgbGlrZSBgYmFiZWw7IGV4dHJhID09ICJpMThuImAsIHdoaWNoCiAgICB3b3VsZCBhbHdheXMgYmUgaWdub3JlZC4KICAgICIiIgogICAgIyBjcmVhdGUgYSBjb3B5IHRvIGF2b2lkIG11dGF0aW5nIHRoZSBpbnB1dAogICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShzdHIocmVxKSkKICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICByZXR1cm4gcmVxClBLAwQUAAAAAAAAACEAZPl+mxMDAAATAwAAOQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2xhdW5jaC5weSIiIgpMYXVuY2ggdGhlIFB5dGhvbiBzY3JpcHQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlcgpzZXR1cHRvb2xzIGlzIGJvb3RzdHJhcHBlZCB2aWEgaW1wb3J0LgoiIiIKCiMgTm90ZSB0aGF0IHNldHVwdG9vbHMgZ2V0cyBpbXBvcnRlZCBpbXBsaWNpdGx5IGJ5IHRoZQojIGludm9jYXRpb24gb2YgdGhpcyBzY3JpcHQgdXNpbmcgcHl0aG9uIC1tIHNldHVwdG9vbHMubGF1bmNoCgppbXBvcnQgdG9rZW5pemUKaW1wb3J0IHN5cwoKCmRlZiBydW4oKToKICAgICIiIgogICAgUnVuIHRoZSBzY3JpcHQgaW4gc3lzLmFyZ3ZbMV0gYXMgaWYgaXQgaGFkCiAgICBiZWVuIGludm9rZWQgbmF0dXJhbGx5LgogICAgIiIiCiAgICBfX2J1aWx0aW5zX18KICAgIHNjcmlwdF9uYW1lID0gc3lzLmFyZ3ZbMV0KICAgIG5hbWVzcGFjZSA9IGRpY3QoCiAgICAgICAgX19maWxlX189c2NyaXB0X25hbWUsCiAgICAgICAgX19uYW1lX189J19fbWFpbl9fJywKICAgICAgICBfX2RvY19fPU5vbmUsCiAgICApCiAgICBzeXMuYXJndls6XSA9IHN5cy5hcmd2WzE6XQoKICAgIG9wZW5fID0gZ2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKQogICAgc2NyaXB0ID0gb3Blbl8oc2NyaXB0X25hbWUpLnJlYWQoKQogICAgbm9ybV9zY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBjb2RlID0gY29tcGlsZShub3JtX3NjcmlwdCwgc2NyaXB0X25hbWUsICdleGVjJykKICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBydW4oKQpQSwMEFAAAAAAAAAAhAIdR66LdBwAA3QcAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9saWIydG8zX2V4LnB5IiIiCkN1c3RvbWl6ZWQgTWl4aW4ydG8zIHN1cHBvcnQ6CgogLSBhZGRzIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgZG9jdGVzdHMKCgpUaGlzIG1vZHVsZSByYWlzZXMgYW4gSW1wb3J0RXJyb3Igb24gUHl0aG9uIDIuCiIiIgoKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgTWl4aW4ydG8zIGFzIF9NaXhpbjJ0bzMKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGxpYjJ0bzMucmVmYWN0b3IgaW1wb3J0IFJlZmFjdG9yaW5nVG9vbCwgZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UKCmltcG9ydCBzZXR1cHRvb2xzCgoKY2xhc3MgRGlzdHV0aWxzUmVmYWN0b3JpbmdUb29sKFJlZmFjdG9yaW5nVG9vbCk6CiAgICBkZWYgbG9nX2Vycm9yKHNlbGYsIG1zZywgKmFyZ3MsICoqa3cpOgogICAgICAgIGxvZy5lcnJvcihtc2csICphcmdzKQoKICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiBsb2dfZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCgoKY2xhc3MgTWl4aW4ydG8zKF9NaXhpbjJ0bzMpOgogICAgZGVmIHJ1bl8ydG8zKHNlbGYsIGZpbGVzLCBkb2N0ZXN0cz1GYWxzZSk6CiAgICAgICAgIyBTZWUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvcHRpb24gaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgY2hlY2sgdGhlCiAgICAgICAgIyBzZXR1cHRvb2xzIGRlZmF1bHQuCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzMgaXMgbm90IFRydWU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBmaWxlczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nLmluZm8oIkZpeGluZyAiICsgIiAiLmpvaW4oZmlsZXMpKQogICAgICAgIHNlbGYuX19idWlsZF9maXhlcl9uYW1lcygpCiAgICAgICAgc2VsZi5fX2V4Y2x1ZGVfZml4ZXJzKCkKICAgICAgICBpZiBkb2N0ZXN0czoKICAgICAgICAgICAgaWYgc2V0dXB0b29scy5ydW5fMnRvM19vbl9kb2N0ZXN0czoKICAgICAgICAgICAgICAgIHIgPSBEaXN0dXRpbHNSZWZhY3RvcmluZ1Rvb2woc2VsZi5maXhlcl9uYW1lcykKICAgICAgICAgICAgICAgIHIucmVmYWN0b3IoZmlsZXMsIHdyaXRlPVRydWUsIGRvY3Rlc3RzX29ubHk9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfTWl4aW4ydG8zLnJ1bl8ydG8zKHNlbGYsIGZpbGVzKQoKICAgIGRlZiBfX2J1aWxkX2ZpeGVyX25hbWVzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZml4ZXJfbmFtZXM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZml4ZXJfbmFtZXMgPSBbXQogICAgICAgIGZvciBwIGluIHNldHVwdG9vbHMubGliMnRvM19maXhlcl9wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5leHRlbmQoZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocCkpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZml4ZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19maXhlcnM6CiAgICAgICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLmV4dGVuZChnZXRfZml4ZXJzX2Zyb21fcGFja2FnZShwKSkKCiAgICBkZWYgX19leGNsdWRlX2ZpeGVycyhzZWxmKToKICAgICAgICBleGNsdWRlZF9maXhlcnMgPSBnZXRhdHRyKHNlbGYsICdleGNsdWRlX2ZpeGVycycsIFtdKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBleGNsdWRlZF9maXhlcnMuZXh0ZW5kKHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzKQogICAgICAgIGZvciBmaXhlcl9uYW1lIGluIGV4Y2x1ZGVkX2ZpeGVyczoKICAgICAgICAgICAgaWYgZml4ZXJfbmFtZSBpbiBzZWxmLmZpeGVyX25hbWVzOgogICAgICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5yZW1vdmUoZml4ZXJfbmFtZSkKUEsDBBQAAAAAAAAAIQAUY0jLkBQAAJAUAAA5AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvbW9ua2V5LnB5IiIiCk1vbmtleSBwYXRjaGluZyBvZiBkaXN0dXRpbHMuCiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgdHlwZXMKaW1wb3J0IGZ1bmN0b29scwpmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQppbXBvcnQgaW5zcGVjdAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgppbXBvcnQgc2V0dXB0b29scwoKX19hbGxfXyA9IFtdCiIiIgpFdmVyeXRoaW5nIGlzIHByaXZhdGUuIENvbnRhY3QgdGhlIHByb2plY3QgdGVhbQppZiB5b3UgdGhpbmsgeW91IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgoiIiIKCgpkZWYgX2dldF9tcm8oY2xzKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgYmFzZXMgY2xhc3NlcyBmb3IgY2xzIHNvcnRlZCBieSB0aGUgTVJPLgoKICAgIFdvcmtzIGFyb3VuZCBhbiBpc3N1ZSBvbiBKeXRob24gd2hlcmUgaW5zcGVjdC5nZXRtcm8gd2lsbCBub3QgcmV0dXJuIGFsbAogICAgYmFzZSBjbGFzc2VzIGlmIG11bHRpcGxlIGNsYXNzZXMgc2hhcmUgdGhlIHNhbWUgbmFtZS4gSW5zdGVhZCwgdGhpcwogICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCB0aGUgY29udGVudHMKICAgIG9mIGNscy5fX2Jhc2VzX18uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xMDI0LgogICAgIiIiCiAgICBpZiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSA9PSAiSnl0aG9uIjoKICAgICAgICByZXR1cm4gKGNscywpICsgY2xzLl9fYmFzZXNfXwogICAgcmV0dXJuIGluc3BlY3QuZ2V0bXJvKGNscykKCgpkZWYgZ2V0X3VucGF0Y2hlZChpdGVtKToKICAgIGxvb2t1cCA9ICgKICAgICAgICBnZXRfdW5wYXRjaGVkX2NsYXNzIGlmIGlzaW5zdGFuY2UoaXRlbSwgc2l4LmNsYXNzX3R5cGVzKSBlbHNlCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbiBpZiBpc2luc3RhbmNlKGl0ZW0sIHR5cGVzLkZ1bmN0aW9uVHlwZSkgZWxzZQogICAgICAgIGxhbWJkYSBpdGVtOiBOb25lCiAgICApCiAgICByZXR1cm4gbG9va3VwKGl0ZW0pCgoKZGVmIGdldF91bnBhdGNoZWRfY2xhc3MoY2xzKToKICAgICIiIlByb3RlY3QgYWdhaW5zdCByZS1wYXRjaGluZyB0aGUgZGlzdHV0aWxzIGlmIHJlbG9hZGVkCgogICAgQWxzbyBlbnN1cmVzIHRoYXQgbm8gb3RoZXIgZGlzdHV0aWxzIGV4dGVuc2lvbiBtb25rZXlwYXRjaGVkIHRoZSBkaXN0dXRpbHMKICAgIGZpcnN0LgogICAgIiIiCiAgICBleHRlcm5hbF9iYXNlcyA9ICgKICAgICAgICBjbHMKICAgICAgICBmb3IgY2xzIGluIF9nZXRfbXJvKGNscykKICAgICAgICBpZiBub3QgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnc2V0dXB0b29scycpCiAgICApCiAgICBiYXNlID0gbmV4dChleHRlcm5hbF9iYXNlcykKICAgIGlmIG5vdCBiYXNlLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnZGlzdHV0aWxzJyk6CiAgICAgICAgbXNnID0gImRpc3R1dGlscyBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgJXIiICUgY2xzCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQogICAgcmV0dXJuIGJhc2UKCgpkZWYgcGF0Y2hfYWxsKCk6CiAgICAjIHdlIGNhbid0IHBhdGNoIGRpc3R1dGlscy5jbWQsIGFsYXMKICAgIGRpc3R1dGlscy5jb3JlLkNvbW1hbmQgPSBzZXR1cHRvb2xzLkNvbW1hbmQKCiAgICBoYXNfaXNzdWVfMTI4ODUgPSBzeXMudmVyc2lvbl9pbmZvIDw9ICgzLCA1LCAzKQoKICAgIGlmIGhhc19pc3N1ZV8xMjg4NToKICAgICAgICAjIGZpeCBmaW5kYWxsIGJ1ZyBpbiBkaXN0dXRpbHMgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjg4NSkKICAgICAgICBkaXN0dXRpbHMuZmlsZWxpc3QuZmluZGFsbCA9IHNldHVwdG9vbHMuZmluZGFsbAoKICAgIG5lZWRzX3dhcmVob3VzZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDEzKQogICAgICAgIG9yCiAgICAgICAgKDMsIDQpIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCA0LCA2KQogICAgICAgIG9yCiAgICAgICAgKDMsIDUpIDwgc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKICAgICkKCiAgICBpZiBuZWVkc193YXJlaG91c2U6CiAgICAgICAgd2FyZWhvdXNlID0gJ2h0dHBzOi8vdXBsb2FkLnB5cGkub3JnL2xlZ2FjeS8nCiAgICAgICAgZGlzdHV0aWxzLmNvbmZpZy5QeVBJUkNDb21tYW5kLkRFRkFVTFRfUkVQT1NJVE9SWSA9IHdhcmVob3VzZQoKICAgIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGEoKQoKICAgICMgSW5zdGFsbCBEaXN0cmlidXRpb24gdGhyb3VnaG91dCB0aGUgZGlzdHV0aWxzCiAgICBmb3IgbW9kdWxlIGluIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZDoKICAgICAgICBtb2R1bGUuRGlzdHJpYnV0aW9uID0gc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbgoKICAgICMgSW5zdGFsbCB0aGUgcGF0Y2hlZCBFeHRlbnNpb24KICAgIGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGlmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgogICAgICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSAoCiAgICAgICAgICAgIHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgICAgICkKCiAgICBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpCgoKZGVmIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGEoKToKICAgICIiIlBhdGNoIHdyaXRlX3BrZ19maWxlIGFuZCByZWFkX3BrZ19maWxlIGZvciBoaWdoZXIgbWV0YWRhdGEgc3RhbmRhcmRzIiIiCiAgICBmb3IgYXR0ciBpbiAoJ3dyaXRlX3BrZ19maWxlJywgJ3JlYWRfcGtnX2ZpbGUnLCAnZ2V0X21ldGFkYXRhX3ZlcnNpb24nKToKICAgICAgICBuZXdfdmFsID0gZ2V0YXR0cihzZXR1cHRvb2xzLmRpc3QsIGF0dHIpCiAgICAgICAgc2V0YXR0cihkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb25NZXRhZGF0YSwgYXR0ciwgbmV3X3ZhbCkKCgpkZWYgcGF0Y2hfZnVuYyhyZXBsYWNlbWVudCwgdGFyZ2V0X21vZCwgZnVuY19uYW1lKToKICAgICIiIgogICAgUGF0Y2ggZnVuY19uYW1lIGluIHRhcmdldF9tb2Qgd2l0aCByZXBsYWNlbWVudAoKICAgIEltcG9ydGFudCAtIG9yaWdpbmFsIG11c3QgYmUgcmVzb2x2ZWQgYnkgbmFtZSB0byBhdm9pZAogICAgcGF0Y2hpbmcgYW4gYWxyZWFkeSBwYXRjaGVkIGZ1bmN0aW9uLgogICAgIiIiCiAgICBvcmlnaW5hbCA9IGdldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lKQoKICAgICMgc2V0IHRoZSAndW5wYXRjaGVkJyBhdHRyaWJ1dGUgb24gdGhlIHJlcGxhY2VtZW50IHRvCiAgICAjIHBvaW50IHRvIHRoZSBvcmlnaW5hbC4KICAgIHZhcnMocmVwbGFjZW1lbnQpLnNldGRlZmF1bHQoJ3VucGF0Y2hlZCcsIG9yaWdpbmFsKQoKICAgICMgcmVwbGFjZSB0aGUgZnVuY3Rpb24gaW4gdGhlIG9yaWdpbmFsIG1vZHVsZQogICAgc2V0YXR0cih0YXJnZXRfbW9kLCBmdW5jX25hbWUsIHJlcGxhY2VtZW50KQoKCmRlZiBnZXRfdW5wYXRjaGVkX2Z1bmN0aW9uKGNhbmRpZGF0ZSk6CiAgICByZXR1cm4gZ2V0YXR0cihjYW5kaWRhdGUsICd1bnBhdGNoZWQnKQoKCmRlZiBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpOgogICAgIiIiCiAgICBQYXRjaCBmdW5jdGlvbnMgaW4gZGlzdHV0aWxzIHRvIHVzZSBzdGFuZGFsb25lIE1pY3Jvc29mdCBWaXN1YWwgQysrCiAgICBjb21waWxlcnMuCiAgICAiIiIKICAgICMgaW1wb3J0IGxhdGUgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0cyBvbiBQeXRob24gPCAzLjUKICAgIG1zdmMgPSBpbXBvcnRfbW9kdWxlKCdzZXR1cHRvb2xzLm1zdmMnKQoKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKICAgICAgICAjIENvbXBpbGVycyBvbmx5IGF2YWlsYWJsZXMgb24gTWljcm9zb2Z0IFdpbmRvd3MKICAgICAgICByZXR1cm4KCiAgICBkZWYgcGF0Y2hfcGFyYW1zKG1vZF9uYW1lLCBmdW5jX25hbWUpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIHBhcmFtZXRlcnMgZm9yIHBhdGNoX2Z1bmMgdG8gcGF0Y2ggaW5kaWNhdGVkIGZ1bmN0aW9uLgogICAgICAgICIiIgogICAgICAgIHJlcGxfcHJlZml4ID0gJ21zdmM5XycgaWYgJ21zdmM5JyBpbiBtb2RfbmFtZSBlbHNlICdtc3ZjMTRfJwogICAgICAgIHJlcGxfbmFtZSA9IHJlcGxfcHJlZml4ICsgZnVuY19uYW1lLmxzdHJpcCgnXycpCiAgICAgICAgcmVwbCA9IGdldGF0dHIobXN2YywgcmVwbF9uYW1lKQogICAgICAgIG1vZCA9IGltcG9ydF9tb2R1bGUobW9kX25hbWUpCiAgICAgICAgaWYgbm90IGhhc2F0dHIobW9kLCBmdW5jX25hbWUpOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihmdW5jX25hbWUpCiAgICAgICAgcmV0dXJuIHJlcGwsIG1vZCwgZnVuY19uYW1lCgogICAgIyBQeXRob24gMi43IHRvIDMuNAogICAgbXN2YzkgPSBmdW5jdG9vbHMucGFydGlhbChwYXRjaF9wYXJhbXMsICdkaXN0dXRpbHMubXN2Yzljb21waWxlcicpCgogICAgIyBQeXRob24gMy41KwogICAgbXN2YzE0ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXInKQoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyCiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzkoJ2ZpbmRfdmN2YXJzYWxsJykpCiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzkoJ3F1ZXJ5X3ZjdmFyc2FsbCcpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMuX21zdmNjb21waWxlci5fZ2V0X3ZjX2VudgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmMxNCgnX2dldF92Y19lbnYnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zIGZvciBOdW1weQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmMxNCgnZ2VuX2xpYl9vcHRpb25zJykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhADKn/FyftgAAn7YAADcAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9tc3ZjLnB5IiIiCkltcHJvdmVkIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVycy4KCktub3duIHN1cHBvcnRlZCBjb21waWxlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDYuMSAoeDg2LCB4NjQsIGlhNjQpCiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDEwLjA6CiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDE0Llg6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyAyMDE1ICh4ODYsIHg2NCwgYXJtKQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE5ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKClRoaXMgbWF5IGFsc28gc3VwcG9ydCBjb21waWxlcnMgc2hpcHBlZCB3aXRoIGNvbXBhdGlibGUgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucy4KIiIiCgppbXBvcnQganNvbgpmcm9tIGlvIGltcG9ydCBvcGVuCmZyb20gb3MgaW1wb3J0IGxpc3RkaXIsIHBhdGhzZXAKZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luLCBpc2ZpbGUsIGlzZGlyLCBkaXJuYW1lCmltcG9ydCBzeXMKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgTGVnYWN5VmVyc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcmZhbHNlCgpmcm9tIC5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgIGZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB3aW5yZWcKICAgIGZyb20gb3MgaW1wb3J0IGVudmlyb24KZWxzZToKICAgICMgTW9jayB3aW5yZWcgYW5kIGVudmlyb24gc28gdGhlIG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KCiAgICBjbGFzcyB3aW5yZWc6CiAgICAgICAgSEtFWV9VU0VSUyA9IE5vbmUKICAgICAgICBIS0VZX0NVUlJFTlRfVVNFUiA9IE5vbmUKICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUgPSBOb25lCiAgICAgICAgSEtFWV9DTEFTU0VTX1JPT1QgPSBOb25lCgogICAgZW52aXJvbiA9IGRpY3QoKQoKX21zdmM5X3N1cHByZXNzX2Vycm9ycyA9ICgKICAgICMgbXN2Yzljb21waWxlciBpc24ndCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKICAgIEltcG9ydEVycm9yLAoKICAgICMgbXN2Yzljb21waWxlciByYWlzZXMgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBpbiBzb21lCiAgICAjIGVudmlyb25tZW50cy4gU2VlICMxMTE4LgogICAgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCgp0cnk6CiAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBSZWcKZXhjZXB0IF9tc3ZjOV9zdXBwcmVzc19lcnJvcnM6CiAgICBwYXNzCgoKZGVmIG1zdmM5X2ZpbmRfdmN2YXJzYWxsKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMubXN2Yzljb21waWxlci5maW5kX3ZjdmFyc2FsbCIgdG8gdXNlIHRoZSBzdGFuZGFsb25lCiAgICBjb21waWxlciBidWlsZCBmb3IgUHl0aG9uCiAgICAoVkNGb3JQeXRob24gLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNykuCgogICAgRmFsbCBiYWNrIHRvIG9yaWdpbmFsIGJlaGF2aW9yIHdoZW4gdGhlIHN0YW5kYWxvbmUgY29tcGlsZXIgaXMgbm90CiAgICBhdmFpbGFibGUuCgogICAgUmVkaXJlY3QgdGhlIHBhdGggb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcnNpb246IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgc3RyCiAgICAgICAgdmN2YXJzYWxsLmJhdCBwYXRoCiAgICAiIiIKICAgIHZjX2Jhc2UgPSByJ1NvZnR3YXJlXCVzTWljcm9zb2Z0XERldkRpdlxWQ0ZvclB5dGhvblwlMC4xZicKICAgIGtleSA9IHZjX2Jhc2UgJSAoJycsIHZlcnNpb24pCiAgICB0cnk6CiAgICAgICAgIyBQZXItdXNlciBpbnN0YWxscyByZWdpc3RlciB0aGUgY29tcGlsZXIgcGF0aCBoZXJlCiAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUoa2V5LCAiaW5zdGFsbGRpciIpCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEFsbC11c2VyIGluc3RhbGxzIG9uIGEgNjQtYml0IHN5c3RlbSByZWdpc3RlciBoZXJlCiAgICAgICAgICAgIGtleSA9IHZjX2Jhc2UgJSAoJ1dvdzY0MzJOb2RlXFwnLCB2ZXJzaW9uKQogICAgICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShrZXksICJpbnN0YWxsZGlyIikKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBOb25lCgogICAgaWYgcHJvZHVjdGRpcjoKICAgICAgICB2Y3ZhcnNhbGwgPSBqb2luKHByb2R1Y3RkaXIsICJ2Y3ZhcnNhbGwuYmF0IikKICAgICAgICBpZiBpc2ZpbGUodmN2YXJzYWxsKToKICAgICAgICAgICAgcmV0dXJuIHZjdmFyc2FsbAoKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmM5X2ZpbmRfdmN2YXJzYWxsKSh2ZXJzaW9uKQoKCmRlZiBtc3ZjOV9xdWVyeV92Y3ZhcnNhbGwodmVyLCBhcmNoPSd4ODYnLCAqYXJncywgKiprd2FyZ3MpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMubXN2Yzljb21waWxlci5xdWVyeV92Y3ZhcnNhbGwiIGZvciBzdXBwb3J0IGV4dHJhCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjAgYW5kIDEwLjAgY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBkaWN0CiAgICAgICAgZW52aXJvbm1lbnQKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25tZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICBvcmlnID0gZ2V0X3VucGF0Y2hlZChtc3ZjOV9xdWVyeV92Y3ZhcnNhbGwpCiAgICAgICAgcmV0dXJuIG9yaWcodmVyLCBhcmNoLCAqYXJncywgKiprd2FyZ3MpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBpZiBWY3ZhcnNhbGwuYmF0IGlzIG1pc3NpbmcKICAgICAgICBwYXNzCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgZW52aXJvbm1lbnQgbm90IHNldCBhZnRlciBleGVjdXRpbmcgdmN2YXJzYWxsLmJhdAogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhhcmNoLCB2ZXIpLnJldHVybl9lbnYoKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyBleGM6CiAgICAgICAgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyLCBhcmNoKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZXRfdmNfZW52KHBsYXRfc3BlYyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLl9nZXRfdmNfZW52IiBmb3Igc3VwcG9ydCBleHRyYQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMTQuWCBjb21waWxlcnMuCgogICAgU2V0IGVudmlyb25tZW50IHdpdGhvdXQgdXNlIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBwbGF0X3NwZWM6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIGRpY3QKICAgICAgICBlbnZpcm9ubWVudAogICAgIiIiCiAgICAjIFRyeSB0byBnZXQgZW52aXJvbm1lbnQgZnJvbSB2Y3ZhcnNhbGwuYmF0IChDbGFzc2ljYWwgd2F5KQogICAgdHJ5OgogICAgICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmMxNF9nZXRfdmNfZW52KShwbGF0X3NwZWMpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBWY3ZhcnNhbGwuYmF0IGlzIG1pc3NpbmcKICAgICAgICBwYXNzCgogICAgIyBJZiBlcnJvciwgdHJ5IHRvIHNldCBlbnZpcm9ubWVudCBkaXJlY3RseQogICAgdHJ5OgogICAgICAgIHJldHVybiBFbnZpcm9ubWVudEluZm8ocGxhdF9zcGVjLCB2Y19taW5fdmVyPTE0LjApLnJldHVybl9lbnYoKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyBleGM6CiAgICAgICAgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgMTQuMCkKICAgICAgICByYWlzZQoKCmRlZiBtc3ZjMTRfZ2VuX2xpYl9vcHRpb25zKCphcmdzLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyIgZm9yIGZpeAogICAgY29tcGF0aWJpbGl0eSBiZXR3ZWVuICJudW1weS5kaXN0dXRpbHMiIGFuZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIiCiAgICAoZm9yIE51bXB5IDwgMS4xMS4yKQogICAgIiIiCiAgICBpZiAibnVtcHkuZGlzdHV0aWxzIiBpbiBzeXMubW9kdWxlczoKICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICBpZiBMZWdhY3lWZXJzaW9uKG5wLl9fdmVyc2lvbl9fKSA8IExlZ2FjeVZlcnNpb24oJzEuMTEuMicpOgogICAgICAgICAgICByZXR1cm4gbnAuZGlzdHV0aWxzLmNjb21waWxlci5nZW5fbGliX29wdGlvbnMoKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzE0X2dlbl9saWJfb3B0aW9ucykoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBfYXVnbWVudF9leGNlcHRpb24oZXhjLCB2ZXJzaW9uLCBhcmNoPScnKToKICAgICIiIgogICAgQWRkIGRldGFpbHMgdG8gdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHRvIGhlbHAgZ3VpZGUgdGhlIHVzZXIKICAgIGFzIHRvIHdoYXQgYWN0aW9uIHdpbGwgcmVzb2x2ZSBpdC4KICAgICIiIgogICAgIyBFcnJvciBpZiBNU1ZDKysgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBlbnZpcm9ubWVudCBub3Qgc2V0CiAgICBtZXNzYWdlID0gZXhjLmFyZ3NbMF0KCiAgICBpZiAidmN2YXJzYWxsIiBpbiBtZXNzYWdlLmxvd2VyKCkgb3IgInZpc3VhbCBjIiBpbiBtZXNzYWdlLmxvd2VyKCk6CiAgICAgICAgIyBTcGVjaWFsIGVycm9yIG1lc3NhZ2UgaWYgTVNWQysrIG5vdCBpbnN0YWxsZWQKICAgICAgICB0bXBsID0gJ01pY3Jvc29mdCBWaXN1YWwgQysrIHt2ZXJzaW9uOjAuMWZ9IGlzIHJlcXVpcmVkLicKICAgICAgICBtZXNzYWdlID0gdG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICBtc2Rvd25sb2FkID0gJ3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0lZCcKICAgICAgICBpZiB2ZXJzaW9uID09IDkuMDoKICAgICAgICAgICAgaWYgYXJjaC5sb3dlcigpLmZpbmQoJ2lhNjQnKSA+IC0xOgogICAgICAgICAgICAgICAgIyBGb3IgVkMrKyA5LjAsIGlmIElBNjQgc3VwcG9ydCBpcyBuZWVkZWQsIHJlZGlyZWN0IHVzZXIKICAgICAgICAgICAgICAgICMgdG8gV2luZG93cyBTREsgNy4wLgogICAgICAgICAgICAgICAgIyBOb3RlOiBObyBkb3dubG9hZCBsaW5rIGF2YWlsYWJsZSBmcm9tIE1pY3Jvc29mdC4KICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCInCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEZvciBWQysrIDkuMCByZWRpcmVjdCB1c2VyIHRvIFZjKysgZm9yIFB5dGhvbiAyLjcgOgogICAgICAgICAgICAgICAgIyBUaGlzIHJlZGlyZWN0aW9uIGxpbmsgaXMgbWFpbnRhaW5lZCBieSBNaWNyb3NvZnQuCiAgICAgICAgICAgICAgICAjIENvbnRhY3QgdnNweXRob25AbWljcm9zb2Z0LmNvbSBpZiBpdCBuZWVkcyB1cGRhdGluZy4KICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgZnJvbSBodHRwOi8vYWthLm1zL3ZjcHl0aG9uMjcnCiAgICAgICAgZWxpZiB2ZXJzaW9uID09IDEwLjA6CiAgICAgICAgICAgICMgRm9yIFZDKysgMTAuMCBSZWRpcmVjdCB1c2VyIHRvIFdpbmRvd3MgU0RLIDcuMQogICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEiOiAnCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gbXNkb3dubG9hZCAlIDgyNzkKICAgICAgICBlbGlmIHZlcnNpb24gPj0gMTQuMDoKICAgICAgICAgICAgIyBGb3IgVkMrKyAxNC5YIFJlZGlyZWN0IHVzZXIgdG8gbGF0ZXN0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMKICAgICAgICAgICAgbWVzc2FnZSArPSAoJyBHZXQgaXQgd2l0aCAiQnVpbGQgVG9vbHMgZm9yIFZpc3VhbCBTdHVkaW8iOiAnCiAgICAgICAgICAgICAgICAgICAgICAgIHInaHR0cHM6Ly92aXN1YWxzdHVkaW8ubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvJykKCiAgICBleGMuYXJncyA9IChtZXNzYWdlLCApCgoKY2xhc3MgUGxhdGZvcm1JbmZvOgogICAgIiIiCiAgICBDdXJyZW50IGFuZCBUYXJnZXQgQXJjaGl0ZWN0dXJlcyBpbmZvcm1hdGlvbi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgogICAgIiIiCiAgICBjdXJyZW50X2NwdSA9IGVudmlyb24uZ2V0KCdwcm9jZXNzb3JfYXJjaGl0ZWN0dXJlJywgJycpLmxvd2VyKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXJjaCk6CiAgICAgICAgc2VsZi5hcmNoID0gYXJjaC5sb3dlcigpLnJlcGxhY2UoJ3g2NCcsICdhbWQ2NCcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFyZ2V0X2NwdShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVGFyZ2V0IENQVSBhcmNoaXRlY3R1cmUuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBUYXJnZXQgQ1BVCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXJjaFtzZWxmLmFyY2guZmluZCgnXycpICsgMTpdCgogICAgZGVmIHRhcmdldF9pc194ODYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGFyZ2V0IENQVSBpcyB4ODYgMzIgYml0cy4uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGJvb2wKICAgICAgICAgICAgQ1BVIGlzIHg4NiAzMiBiaXRzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0X2NwdSA9PSAneDg2JwoKICAgIGRlZiBjdXJyZW50X2lzX3g4NihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBjdXJyZW50IENQVSBpcyB4ODYgMzIgYml0cy4uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGJvb2wKICAgICAgICAgICAgQ1BVIGlzIHg4NiAzMiBiaXRzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBDdXJyZW50IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgc3ViZm9sZGVyOiAnXHRhcmdldCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIGFuZCB4NjQpIGVsc2UKICAgICAgICAgICAgcidcJXMnICUgc2VsZi5jdXJyZW50X2NwdQogICAgICAgICkKCiAgICBkZWYgdGFyZ2V0X2RpcihzZWxmLCBoaWRleDg2PUZhbHNlLCB4NjQ9RmFsc2UpOgogICAgICAgIHIiIiIKICAgICAgICBUYXJnZXQgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGhpZGV4ODY6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICcnIGFuZCBub3QgJ1x4ODYnIGlmIGFyY2hpdGVjdHVyZSBpcyB4ODYuCiAgICAgICAgeDY0OiBib29sCiAgICAgICAgICAgIHJldHVybiAnXHg2NCcgYW5kIG5vdCAnXGFtZDY0JyBpZiBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBzdWJmb2xkZXI6ICdcY3VycmVudCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYudGFyZ2V0X2NwdSA9PSAneDg2JyBhbmQgaGlkZXg4NikgZWxzZQogICAgICAgICAgICByJ1x4NjQnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYudGFyZ2V0X2NwdQogICAgICAgICkKCiAgICBkZWYgY3Jvc3NfZGlyKHNlbGYsIGZvcmNleDg2PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgQ3Jvc3MgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGZvcmNleDg2OiBib29sCiAgICAgICAgICAgIFVzZSAneDg2JyBhcyBjdXJyZW50IGFyY2hpdGVjdHVyZSBldmVuIGlmIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzCiAgICAgICAgICAgIG5vdCB4ODYuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBzdWJmb2xkZXI6ICcnIGlmIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgY3VycmVudCBhcmNoaXRlY3R1cmUsCiAgICAgICAgICAgICdcY3VycmVudF90YXJnZXQnIGlmIG5vdC4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50ID0gJ3g4NicgaWYgZm9yY2V4ODYgZWxzZSBzZWxmLmN1cnJlbnRfY3B1CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgc2VsZi50YXJnZXRfY3B1ID09IGN1cnJlbnQgZWxzZQogICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIoKS5yZXBsYWNlKCdcXCcsICdcXCVzXycgJSBjdXJyZW50KQogICAgICAgICkKCgpjbGFzcyBSZWdpc3RyeUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgcmVnaXN0cnkgaW5mb3JtYXRpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcGxhdGZvcm1faW5mbzogUGxhdGZvcm1JbmZvCiAgICAgICAgIlBsYXRmb3JtSW5mbyIgaW5zdGFuY2UuCiAgICAiIiIKICAgIEhLRVlTID0gKHdpbnJlZy5IS0VZX1VTRVJTLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfTE9DQUxfTUFDSElORSwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NMQVNTRVNfUk9PVCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm1faW5mbyk6CiAgICAgICAgc2VsZi5waSA9IHBsYXRmb3JtX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2aXN1YWxzdHVkaW8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcm9vdCByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJ1Zpc3VhbFN0dWRpbycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzeHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU3hTIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiBqb2luKHNlbGYudmlzdWFsc3R1ZGlvLCAnU3hTJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2YyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBWQzcgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGpvaW4oc2VsZi5zeHMsICdWQzcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFZTNyByZWdpc3RyeSBrZXkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gam9pbihzZWxmLnN4cywgJ1ZTNycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmNfZm9yX3B5dGhvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBmb3IgUHl0aG9uIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiByJ0RldkRpdlxWQ0ZvclB5dGhvbicKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtaWNyb3NvZnRfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBTREsgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdNaWNyb3NvZnQgU0RLcycKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cy9QbGF0Zm9ybSBTREsgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnV2luZG93cycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0Znhfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgcmVnaXN0cnkga2V5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnTkVURlhTREsnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpbmRvd3Nfa2l0c19yb290cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBLaXRzIFJvb3RzIHJlZ2lzdHJ5IGtleS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleQogICAgICAgICIiIgogICAgICAgIHJldHVybiByJ1dpbmRvd3MgS2l0c1xJbnN0YWxsZWQgUm9vdHMnCgogICAgZGVmIG1pY3Jvc29mdChzZWxmLCBrZXksIHg4Nj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGtleSBpbiBNaWNyb3NvZnQgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAga2V5OiBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5IHBhdGggd2hlcmUgbG9vay4KICAgICAgICB4ODY6IHN0cgogICAgICAgICAgICBGb3JjZSB4ODYgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkKICAgICAgICAiIiIKICAgICAgICBub2RlNjQgPSAnJyBpZiBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCkgb3IgeDg2IGVsc2UgJ1dvdzY0MzJOb2RlJwogICAgICAgIHJldHVybiBqb2luKCdTb2Z0d2FyZScsIG5vZGU2NCwgJ01pY3Jvc29mdCcsIGtleSkKCiAgICBkZWYgbG9va3VwKHNlbGYsIGtleSwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTG9vayBmb3IgdmFsdWVzIGluIHJlZ2lzdHJ5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIG5hbWU6IHN0cgogICAgICAgICAgICBWYWx1ZSBuYW1lIHRvIGZpbmQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICB2YWx1ZQogICAgICAgICIiIgogICAgICAgIGtleV9yZWFkID0gd2lucmVnLktFWV9SRUFECiAgICAgICAgb3BlbmtleSA9IHdpbnJlZy5PcGVuS2V5CiAgICAgICAgbXMgPSBzZWxmLm1pY3Jvc29mdAogICAgICAgIGZvciBoa2V5IGluIHNlbGYuSEtFWVM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGJrZXkgPSBvcGVua2V5KGhrZXksIG1zKGtleSksIDAsIGtleV9yZWFkKQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGkuY3VycmVudF9pc194ODYoKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJrZXkgPSBvcGVua2V5KGhrZXksIG1zKGtleSwgVHJ1ZSksIDAsIGtleV9yZWFkKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiB3aW5yZWcuUXVlcnlWYWx1ZUV4KGJrZXksIG5hbWUpWzBdCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBwYXNzCgoKY2xhc3MgU3lzdGVtSW5mbzoKICAgICIiIgogICAgTWljcm9zb2Z0IFdpbmRvd3MgYW5kIFZpc3VhbCBTdHVkaW8gcmVsYXRlZCBzeXN0ZW0gaW5mb3JtYXRpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcmVnaXN0cnlfaW5mbzogUmVnaXN0cnlJbmZvCiAgICAgICAgIlJlZ2lzdHJ5SW5mbyIgaW5zdGFuY2UuCiAgICB2Y192ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICIiIgoKICAgICMgVmFyaWFibGVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoaXMgY2xhc3MgdXNlIG9yaWdpbmFscyBDYW1lbENhc2UgdmFyaWFibGVzCiAgICAjIG5hbWVzIGZyb20gTWljcm9zb2Z0IHNvdXJjZSBmaWxlcyBmb3IgbW9yZSBlYXN5IGNvbXBhcmlzb24uCiAgICBXaW5EaXIgPSBlbnZpcm9uLmdldCgnV2luRGlyJywgJycpCiAgICBQcm9ncmFtRmlsZXMgPSBlbnZpcm9uLmdldCgnUHJvZ3JhbUZpbGVzJywgJycpCiAgICBQcm9ncmFtRmlsZXN4ODYgPSBlbnZpcm9uLmdldCgnUHJvZ3JhbUZpbGVzKHg4NiknLCBQcm9ncmFtRmlsZXMpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZ2lzdHJ5X2luZm8sIHZjX3Zlcj1Ob25lKToKICAgICAgICBzZWxmLnJpID0gcmVnaXN0cnlfaW5mbwogICAgICAgIHNlbGYucGkgPSBzZWxmLnJpLnBpCgogICAgICAgIHNlbGYua25vd25fdnNfcGF0aHMgPSBzZWxmLmZpbmRfcHJvZ3JhbWRhdGFfdnNfdmVycygpCgogICAgICAgICMgRXhjZXB0IGZvciBWUzE1KywgVkMgdmVyc2lvbiBpcyBhbGlnbmVkIHdpdGggVlMgdmVyc2lvbgogICAgICAgIHNlbGYudnNfdmVyID0gc2VsZi52Y192ZXIgPSAoCiAgICAgICAgICAgICAgICB2Y192ZXIgb3Igc2VsZi5fZmluZF9sYXRlc3RfYXZhaWxhYmxlX3ZzX3ZlcigpKQoKICAgIGRlZiBfZmluZF9sYXRlc3RfYXZhaWxhYmxlX3ZzX3ZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIHRoZSBsYXRlc3QgVkMgdmVyc2lvbgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBmbG9hdAogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmVnX3ZjX3ZlcnMgPSBzZWxmLmZpbmRfcmVnX3ZzX3ZlcnMoKQoKICAgICAgICBpZiBub3QgKHJlZ192Y192ZXJzIG9yIHNlbGYua25vd25fdnNfcGF0aHMpOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAnTm8gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcpCgogICAgICAgIHZjX3ZlcnMgPSBzZXQocmVnX3ZjX3ZlcnMpCiAgICAgICAgdmNfdmVycy51cGRhdGUoc2VsZi5rbm93bl92c19wYXRocykKICAgICAgICByZXR1cm4gc29ydGVkKHZjX3ZlcnMpWy0xXQoKICAgIGRlZiBmaW5kX3JlZ192c192ZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMgYXZhaWxhYmxlIGluIHJlZ2lzdHJ5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIGZsb2F0CiAgICAgICAgICAgIFZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgbXMgPSBzZWxmLnJpLm1pY3Jvc29mdAogICAgICAgIHZja2V5cyA9IChzZWxmLnJpLnZjLCBzZWxmLnJpLnZjX2Zvcl9weXRob24sIHNlbGYucmkudnMpCiAgICAgICAgdnNfdmVycyA9IFtdCiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5yaS5IS0VZUzoKICAgICAgICAgICAgZm9yIGtleSBpbiB2Y2tleXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYmtleSA9IHdpbnJlZy5PcGVuS2V5KGhrZXksIG1zKGtleSksIDAsIHdpbnJlZy5LRVlfUkVBRCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHN1YmtleXMsIHZhbHVlcywgXyA9IHdpbnJlZy5RdWVyeUluZm9LZXkoYmtleSkKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHZhbHVlcyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bVZhbHVlKGJrZXksIGkpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXIgbm90IGluIHZzX3ZlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c192ZXJzLmFwcGVuZCh2ZXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN1YmtleXMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZmxvYXQod2lucmVnLkVudW1LZXkoYmtleSwgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdnNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBzb3J0ZWQodnNfdmVycykKCiAgICBkZWYgZmluZF9wcm9ncmFtZGF0YV92c192ZXJzKHNlbGYpOgogICAgICAgIHIiIiIKICAgICAgICBGaW5kIFZpc3VhbCBzdHVkaW8gMjAxNysgdmVyc2lvbnMgZnJvbSBpbmZvcm1hdGlvbiBpbgogICAgICAgICJDOlxQcm9ncmFtRGF0YVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXFBhY2thZ2VzXF9JbnN0YW5jZXMiLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBkaWN0CiAgICAgICAgICAgIGZsb2F0IHZlcnNpb24gYXMga2V5LCBwYXRoIGFzIHZhbHVlLgogICAgICAgICIiIgogICAgICAgIHZzX3ZlcnNpb25zID0ge30KICAgICAgICBpbnN0YW5jZXNfZGlyID0gXAogICAgICAgICAgICByJ0M6XFByb2dyYW1EYXRhXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cUGFja2FnZXNcX0luc3RhbmNlcycKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoYXNoZWRfbmFtZXMgPSBsaXN0ZGlyKGluc3RhbmNlc19kaXIpCgogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgRGlyZWN0b3J5IG5vdCBleGlzdHMgd2l0aCBhbGwgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucwogICAgICAgICAgICByZXR1cm4gdnNfdmVyc2lvbnMKCiAgICAgICAgZm9yIG5hbWUgaW4gaGFzaGVkX25hbWVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIEdldCBWUyBpbnN0YWxsYXRpb24gcGF0aCBmcm9tICJzdGF0ZS5qc29uIiBmaWxlCiAgICAgICAgICAgICAgICBzdGF0ZV9wYXRoID0gam9pbihpbnN0YW5jZXNfZGlyLCBuYW1lLCAnc3RhdGUuanNvbicpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc3RhdGVfcGF0aCwgJ3J0JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgc3RhdGVfZmlsZToKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGpzb24ubG9hZChzdGF0ZV9maWxlKQogICAgICAgICAgICAgICAgdnNfcGF0aCA9IHN0YXRlWydpbnN0YWxsYXRpb25QYXRoJ10KCiAgICAgICAgICAgICAgICAjIFJhaXNlcyBPU0Vycm9yIGlmIHRoaXMgVlMgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gVkMKICAgICAgICAgICAgICAgIGxpc3RkaXIoam9pbih2c19wYXRoLCByJ1ZDXFRvb2xzXE1TVkMnKSkKCiAgICAgICAgICAgICAgICAjIFN0b3JlIHZlcnNpb24gYW5kIHBhdGgKICAgICAgICAgICAgICAgIHZzX3ZlcnNpb25zW3NlbGYuX2FzX2Zsb2F0X3ZlcnNpb24oCiAgICAgICAgICAgICAgICAgICAgc3RhdGVbJ2luc3RhbGxhdGlvblZlcnNpb24nXSldID0gdnNfcGF0aAoKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBLZXlFcnJvcik6CiAgICAgICAgICAgICAgICAjIFNraXAgaWYgInN0YXRlLmpzb24iIGZpbGUgaXMgbWlzc2luZyBvciBiYWQgZm9ybWF0CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICByZXR1cm4gdnNfdmVyc2lvbnMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2FzX2Zsb2F0X3ZlcnNpb24odmVyc2lvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3RyaW5nIHZlcnNpb24gYXMgYSBzaW1wbGlmaWVkIGZsb2F0IHZlcnNpb24gKG1ham9yLm1pbm9yKQoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIHZlcnNpb246IHN0cgogICAgICAgICAgICBWZXJzaW9uLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBmbG9hdAogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGZsb2F0KCcuJy5qb2luKHZlcnNpb24uc3BsaXQoJy4nKVs6Ml0pKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBkZWZhdWx0ID0gam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwKICAgICAgICAgICAgICAgICAgICAgICAnTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gJTAuMWYnICUgc2VsZi52c192ZXIpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZzLCAnJTAuMWYnICUgc2VsZi52c192ZXIpIG9yIGRlZmF1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGggPSBzZWxmLl9ndWVzc192YygpIG9yIHNlbGYuX2d1ZXNzX3ZjX2xlZ2FjeSgpCgogICAgICAgIGlmIG5vdCBpc2RpcihwYXRoKToKICAgICAgICAgICAgbXNnID0gJ01pY3Jvc29mdCBWaXN1YWwgQysrIGRpcmVjdG9yeSBub3QgZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9ndWVzc192YyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2NhdGUgVmlzdWFsIEMrKyBmb3IgVlMyMDE3Ky4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEZpcnN0IHNlYXJjaCBpbiBrbm93biBWUyBwYXRocwogICAgICAgICAgICB2c19kaXIgPSBzZWxmLmtub3duX3ZzX3BhdGhzW3NlbGYudnNfdmVyXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIyBFbHNlLCBzZWFyY2ggd2l0aCBwYXRoIGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgdnNfZGlyID0gc2VsZi5WU0luc3RhbGxEaXIKCiAgICAgICAgZ3Vlc3NfdmMgPSBqb2luKHZzX2RpciwgcidWQ1xUb29sc1xNU1ZDJykKCiAgICAgICAgIyBTdWJkaXIgd2l0aCBWQyBleGFjdCB2ZXJzaW9uIGFzIG5hbWUKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVXBkYXRlIHRoZSBWQyB2ZXJzaW9uIHdpdGggcmVhbCBvbmUgaW5zdGVhZCBvZiBWUyB2ZXJzaW9uCiAgICAgICAgICAgIHZjX3ZlciA9IGxpc3RkaXIoZ3Vlc3NfdmMpWy0xXQogICAgICAgICAgICBzZWxmLnZjX3ZlciA9IHNlbGYuX2FzX2Zsb2F0X3ZlcnNpb24odmNfdmVyKQogICAgICAgICAgICByZXR1cm4gam9pbihndWVzc192YywgdmNfdmVyKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBfZ3Vlc3NfdmNfbGVnYWN5KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvY2F0ZSBWaXN1YWwgQysrIGZvciB2ZXJzaW9ucyBwcmlvciB0byAyMDE3LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIGRlZmF1bHQgPSBqb2luKHNlbGYuUHJvZ3JhbUZpbGVzeDg2LAogICAgICAgICAgICAgICAgICAgICAgIHInTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gJTAuMWZcVkMnICUgc2VsZi52c192ZXIpCgogICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiBwYXRoIGZyb20gcmVnaXN0cnkgYXMgZGVmYXVsdCBwYXRoCiAgICAgICAgcmVnX3BhdGggPSBqb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudnNfdmVyKQogICAgICAgIHB5dGhvbl92YyA9IHNlbGYucmkubG9va3VwKHJlZ19wYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgZGVmYXVsdF92YyA9IGpvaW4ocHl0aG9uX3ZjLCAnVkMnKSBpZiBweXRob25fdmMgZWxzZSBkZWZhdWx0CgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnJTAuMWYnICUgc2VsZi52c192ZXIpIG9yIGRlZmF1bHRfdmMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgdHVwbGUgb2Ygc3RyCiAgICAgICAgICAgIHZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gOS4wOgogICAgICAgICAgICByZXR1cm4gJzcuMCcsICc2LjEnLCAnNi4wYScKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID09IDEwLjA6CiAgICAgICAgICAgIHJldHVybiAnNy4xJywgJzcuMGEnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA9PSAxMS4wOgogICAgICAgICAgICByZXR1cm4gJzguMCcsICc4LjBhJwogICAgICAgIGVsaWYgc2VsZi52c192ZXIgPT0gMTIuMDoKICAgICAgICAgICAgcmV0dXJuICc4LjEnLCAnOC4xYScKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHJldHVybiAnMTAuMCcsICc4LjEnCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBsYXN0IHZlcnNpb24uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKGpvaW4oc2VsZi5XaW5kb3dzU2RrRGlyLCAnbGliJykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIHNka2RpciA9ICcnCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAjIFRyeSB0byBnZXQgaXQgZnJvbSByZWdpc3RyeQogICAgICAgICAgICBsb2MgPSBqb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXMnICUgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IGlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiB2ZXJzaW9uIGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgcGF0aCA9IGpvaW4oc2VsZi5yaS52Y19mb3JfcHl0aG9uLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpCiAgICAgICAgICAgIGluc3RhbGxfYmFzZSA9IHNlbGYucmkubG9va3VwKHBhdGgsICdpbnN0YWxsZGlyJykKICAgICAgICAgICAgaWYgaW5zdGFsbF9iYXNlOgogICAgICAgICAgICAgICAgc2RrZGlyID0gam9pbihpbnN0YWxsX2Jhc2UsICdXaW5TREsnKQogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IGlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIGRlZmF1bHQgbmV3IHBhdGgKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgaW50dmVyID0gdmVyWzp2ZXIucmZpbmQoJy4nKV0KICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3MgS2l0c1wlcycgJSBpbnR2ZXIKICAgICAgICAgICAgICAgIGQgPSBqb2luKHNlbGYuUHJvZ3JhbUZpbGVzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IGlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIGRlZmF1bHQgb2xkIHBhdGgKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IHInTWljcm9zb2Z0IFNES3NcV2luZG93c1x2JXMnICUgdmVyCiAgICAgICAgICAgICAgICBkID0gam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIGlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIHNka2RpciA9IGQKICAgICAgICBpZiBub3Qgc2RrZGlyOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBQbGF0Zm9ybSBTREsKICAgICAgICAgICAgc2RrZGlyID0gam9pbihzZWxmLlZDSW5zdGFsbERpciwgJ1BsYXRmb3JtU0RLJykKICAgICAgICByZXR1cm4gc2RrZGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1NES0V4ZWN1dGFibGVQYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBleGVjdXRhYmxlIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICAjIEZpbmQgV2luU0RLIE5ldEZ4IFRvb2xzIHJlZ2lzdHJ5IGRpciBuYW1lCiAgICAgICAgaWYgc2VsZi52c192ZXIgPD0gMTEuMDoKICAgICAgICAgICAgbmV0Znh2ZXIgPSAzNQogICAgICAgICAgICBhcmNoID0gJycKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXRmeHZlciA9IDQwCiAgICAgICAgICAgIGhpZGV4ODYgPSBUcnVlIGlmIHNlbGYudnNfdmVyIDw9IDEyLjAgZWxzZSBGYWxzZQogICAgICAgICAgICBhcmNoID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSwgaGlkZXg4Nj1oaWRleDg2KQogICAgICAgIGZ4ID0gJ1dpblNESy1OZXRGeCVkVG9vbHMlcycgJSAobmV0Znh2ZXIsIGFyY2gucmVwbGFjZSgnXFwnLCAnLScpKQoKICAgICAgICAjIGxpc3QgYWxsIHBvc3NpYmxlcyByZWdpc3RyeSBwYXRocwogICAgICAgIHJlZ3BhdGhzID0gW10KICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgcmVncGF0aHMgKz0gW2pvaW4oc2VsZi5yaS5uZXRmeF9zZGssIHZlciwgZngpXQoKICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgIHJlZ3BhdGhzICs9IFtqb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXNBJyAlIHZlciwgZngpXQoKICAgICAgICAjIFJldHVybiBpbnN0YWxsYXRpb24gZm9sZGVyIGZyb20gdGhlIG1vcmUgcmVjZW50IHBhdGgKICAgICAgICBmb3IgcGF0aCBpbiByZWdwYXRoczoKICAgICAgICAgICAgZXhlY3BhdGggPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgZXhlY3BhdGg6CiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3BhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnBJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgRiMgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGggPSBqb2luKHNlbGYucmkudmlzdWFsc3R1ZGlvLCByJyUwLjFmXFNldHVwXEYjJyAlIHNlbGYudnNfdmVyKQogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChwYXRoLCAncHJvZHVjdGRpcicpIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgVW5pdmVyc2FsQ1JUU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQ1JUIFNESyBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgS2l0IFJvb3RzIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICB2ZXJzID0gKCcxMCcsICc4MScpIGlmIHNlbGYudnNfdmVyID49IDE0LjAgZWxzZSAoKQoKICAgICAgICAjIEZpbmQgcGF0aCBvZiB0aGUgbW9yZSByZWNlbnQgS2l0CiAgICAgICAgZm9yIHZlciBpbiB2ZXJzOgogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLndpbmRvd3Nfa2l0c19yb290cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tpdHNyb290JXMnICUgdmVyKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICByZXR1cm4gc2RrZGlyIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgVW5pdmVyc2FsQ1JUU2RrTGFzdFZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIGxhc3QgdmVyc2lvbi4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUoam9pbihzZWxmLlVuaXZlcnNhbENSVFNka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHZlcnNpb25zLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICB0dXBsZSBvZiBzdHIKICAgICAgICAgICAgdmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICAjIFNldCBGeFNkayB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIFZTIHZlcnNpb24KICAgICAgICByZXR1cm4gKCgnNC43LjInLCAnNC43LjEnLCAnNC43JywKICAgICAgICAgICAgICAgICAnNC42LjInLCAnNC42LjEnLCAnNC42JywKICAgICAgICAgICAgICAgICAnNC41LjInLCAnNC41LjEnLCAnNC41JykKICAgICAgICAgICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjAgZWxzZSAoKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIGRpcmVjdG9yeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHBhdGgKICAgICAgICAiIiIKICAgICAgICBzZGtkaXIgPSAnJwogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgIGxvYyA9IGpvaW4oc2VsZi5yaS5uZXRmeF9zZGssIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAna2l0c2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNka2RpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCBkaXJlY3RvcnkuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IGpvaW4oc2VsZi5XaW5EaXIsIHInTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmsnKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya2RpcjMyJykgb3IgZ3Vlc3NfZncKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtEaXI2NChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNjRiaXQgZGlyZWN0b3J5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHIKICAgICAgICAgICAgcGF0aAogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgZ3Vlc3NfZncgPSBqb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrNjQnKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya2RpcjY0Jykgb3IgZ3Vlc3NfZncKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtWZXJzaW9uMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IHZlcnNpb25zLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICB0dXBsZSBvZiBzdHIKICAgICAgICAgICAgdmVyc2lvbnMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDMyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya1ZlcnNpb242NChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNjRiaXQgdmVyc2lvbnMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHR1cGxlIG9mIHN0cgogICAgICAgICAgICB2ZXJzaW9ucwogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX2RvdF9uZXRfdmVyc2lvbnMoNjQpCgogICAgZGVmIF9maW5kX2RvdF9uZXRfdmVyc2lvbnMoc2VsZiwgYml0cyk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgdmVyc2lvbnMuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgYml0czogaW50CiAgICAgICAgICAgIFBsYXRmb3JtIG51bWJlciBvZiBiaXRzOiAzMiBvciA2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgdHVwbGUgb2Ygc3RyCiAgICAgICAgICAgIHZlcnNpb25zCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIGFjdHVhbCAuTkVUIHZlcnNpb24gaW4gcmVnaXN0cnkKICAgICAgICByZWdfdmVyID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya3ZlciVkJyAlIGJpdHMpCiAgICAgICAgZG90X25ldF9kaXIgPSBnZXRhdHRyKHNlbGYsICdGcmFtZXdvcmtEaXIlZCcgJSBiaXRzKQogICAgICAgIHZlciA9IHJlZ192ZXIgb3Igc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUoZG90X25ldF9kaXIsICd2Jykgb3IgJycKCiAgICAgICAgIyBTZXQgLk5FVCB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTIuMDoKICAgICAgICAgICAgcmV0dXJuIHZlciwgJ3Y0LjAnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA+PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gJ3Y0LjAuMzAzMTknIGlmIHZlci5sb3dlcigpWzoyXSAhPSAndjQnIGVsc2UgdmVyLCAndjMuNScKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID09IDkuMDoKICAgICAgICAgICAgcmV0dXJuICd2My41JywgJ3YyLjAuNTA3MjcnCiAgICAgICAgZWxpZiBzZWxmLnZzX3ZlciA9PSA4LjA6CiAgICAgICAgICAgIHJldHVybiAndjMuMCcsICd2Mi4wLjUwNzI3JwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdXNlX2xhc3RfZGlyX25hbWUocGF0aCwgcHJlZml4PScnKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gbmFtZSBvZiB0aGUgbGFzdCBkaXIgaW4gcGF0aCBvciAnJyBpZiBubyBkaXIgZm91bmQuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgcGF0aDogc3RyCiAgICAgICAgICAgIFVzZSBkaXJzIGluIHRoaXMgcGF0aAogICAgICAgIHByZWZpeDogc3RyCiAgICAgICAgICAgIFVzZSBvbmx5IGRpcnMgc3RhcnRpbmcgYnkgdGhpcyBwcmVmaXgKCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIG5hbWUKICAgICAgICAiIiIKICAgICAgICBtYXRjaGluZ19kaXJzID0gKAogICAgICAgICAgICBkaXJfbmFtZQogICAgICAgICAgICBmb3IgZGlyX25hbWUgaW4gcmV2ZXJzZWQobGlzdGRpcihwYXRoKSkKICAgICAgICAgICAgaWYgaXNkaXIoam9pbihwYXRoLCBkaXJfbmFtZSkpIGFuZAogICAgICAgICAgICBkaXJfbmFtZS5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5leHQobWF0Y2hpbmdfZGlycywgTm9uZSkgb3IgJycKCgpjbGFzcyBFbnZpcm9ubWVudEluZm86CiAgICAiIiIKICAgIFJldHVybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNwZWNpZmllZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uCiAgICBhbmQgcGxhdGZvcm0gOiBMaWIsIEluY2x1ZGUsIFBhdGggYW5kIGxpYnBhdGguCgogICAgVGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wIHRvIDE0LlguCgogICAgU2NyaXB0IGNyZWF0ZWQgYnkgYW5hbHlzaW5nIE1pY3Jvc29mdCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGZpbGVzIGxpa2UKICAgICJ2Y3ZhcnNbLi4uXS5iYXQiLCAiU2V0RW52LkNtZCIsICJ2Y2J1aWxkdG9vbHMuYmF0IiwgLi4uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLiBJZiBub3Qgc2V0LCBhdXRvZGV0ZWN0IHRoZSBsYXN0CiAgICAgICAgdmVyc2lvbi4KICAgIHZjX21pbl92ZXI6IGZsb2F0CiAgICAgICAgTWluaW11bSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyaXNvbi4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXJjaCwgdmNfdmVyPU5vbmUsIHZjX21pbl92ZXI9MCk6CiAgICAgICAgc2VsZi5waSA9IFBsYXRmb3JtSW5mbyhhcmNoKQogICAgICAgIHNlbGYucmkgPSBSZWdpc3RyeUluZm8oc2VsZi5waSkKICAgICAgICBzZWxmLnNpID0gU3lzdGVtSW5mbyhzZWxmLnJpLCB2Y192ZXIpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgdmNfbWluX3ZlcjoKICAgICAgICAgICAgZXJyID0gJ05vIHN1aXRhYmxlIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24gZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihlcnIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdnNfdmVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBmbG9hdAogICAgICAgICAgICB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuc2kudnNfdmVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmNfdmVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGZsb2F0CiAgICAgICAgICAgIHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5zaS52Y192ZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFRvb2xzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHBhdGhzID0gW3InQ29tbW9uN1xJREUnLCByJ0NvbW1vbjdcVG9vbHMnXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aHMgKz0gW3InQ29tbW9uN1xJREVcQ29tbW9uRXh0ZW5zaW9uc1xNaWNyb3NvZnRcVGVzdFdpbmRvdyddCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ1RlYW0gVG9vbHNcUGVyZm9ybWFuY2UgVG9vbHMnXQogICAgICAgICAgICBwYXRocyArPSBbcidUZWFtIFRvb2xzXFBlcmZvcm1hbmNlIFRvb2xzJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcGF0aCkgZm9yIHBhdGggaW4gcGF0aHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIEluY2x1ZGVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgJ0luY2x1ZGUnKSwKICAgICAgICAgICAgICAgIGpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInQVRMTUZDXEluY2x1ZGUnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIExpYnJhcmllcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgcGF0aHMgPSBbJ0xpYiVzJyAlIGFyY2hfc3ViZGlyLCByJ0FUTE1GQ1xMaWIlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcGF0aHMgKz0gW3InTGliXHN0b3JlJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcGF0aCkgZm9yIHBhdGggaW4gcGF0aHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNTdG9yZVJlZnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgc3RvcmUgcmVmZXJlbmNlcyBMaWJyYXJpZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInTGliXHN0b3JlXHJlZmVyZW5jZXMnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFRvb2xzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIHNpID0gc2VsZi5zaQogICAgICAgIHRvb2xzID0gW2pvaW4oc2kuVkNJbnN0YWxsRGlyLCAnVkNQYWNrYWdlcycpXQoKICAgICAgICBmb3JjZXg4NiA9IFRydWUgaWYgc2VsZi52c192ZXIgPD0gMTAuMCBlbHNlIEZhbHNlCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmNyb3NzX2Rpcihmb3JjZXg4NikKICAgICAgICBpZiBhcmNoX3N1YmRpcjoKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA9PSAxNC4wOgogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgICAgICB0b29scyArPSBbam9pbihzaS5WQ0luc3RhbGxEaXIsIHBhdGgpXQoKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIGhvc3RfZGlyID0gKHInYmluXEhvc3RYODYlcycgaWYgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcidiaW5cSG9zdFg2NCVzJykKICAgICAgICAgICAgdG9vbHMgKz0gW2pvaW4oCiAgICAgICAgICAgICAgICBzaS5WQ0luc3RhbGxEaXIsIGhvc3RfZGlyICUgc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgICAgICBpZiBzZWxmLnBpLmN1cnJlbnRfY3B1ICE9IHNlbGYucGkudGFyZ2V0X2NwdToKICAgICAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKAogICAgICAgICAgICAgICAgICAgIHNpLlZDSW5zdGFsbERpciwgaG9zdF9kaXIgJSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRvb2xzICs9IFtqb2luKHNpLlZDSW5zdGFsbERpciwgJ0JpbicpXQoKICAgICAgICByZXR1cm4gdG9vbHMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgTGlicmFyaWVzLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdMaWIlcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBsaWIgPSBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ2xpYicpCiAgICAgICAgICAgIGxpYnZlciA9IHNlbGYuX3Nka19zdWJkaXIKICAgICAgICAgICAgcmV0dXJuIFtqb2luKGxpYiwgJyVzdW0lcycgJSAobGlidmVyICwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBJbmNsdWRlLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGluY2x1ZGUgPSBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ2luY2x1ZGUnKQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gW2luY2x1ZGUsIGpvaW4oaW5jbHVkZSwgJ2dsJyldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0LjA6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSAnJwogICAgICAgICAgICByZXR1cm4gW2pvaW4oaW5jbHVkZSwgJyVzc2hhcmVkJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgam9pbihpbmNsdWRlLCAnJXN1bScgJSBzZGt2ZXIpLAogICAgICAgICAgICAgICAgICAgIGpvaW4oaW5jbHVkZSwgJyVzd2lucnQnICUgc2RrdmVyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0xpYnBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcyBQYXRocy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICByZWYgPSBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1JlZmVyZW5jZXMnKQogICAgICAgIGxpYnBhdGggPSBbXQoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8PSA5LjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gc2VsZi5PU0xpYnJhcmllcwoKICAgICAgICBpZiBzZWxmLnZzX3ZlciA+PSAxMS4wOgogICAgICAgICAgICBsaWJwYXRoICs9IFtqb2luKHJlZiwgcidDb21tb25Db25maWd1cmF0aW9uXE5ldXRyYWwnKV0KCiAgICAgICAgaWYgc2VsZi52c192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbCiAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1VuaW9uTWV0YWRhdGEnKSwKICAgICAgICAgICAgICAgIGpvaW4ocmVmLCAnV2luZG93cy5Gb3VuZGF0aW9uLlVuaXZlcnNhbEFwaUNvbnRyYWN0JywgJzEuMC4wLjAnKSwKICAgICAgICAgICAgICAgIGpvaW4ocmVmLCAnV2luZG93cy5Gb3VuZGF0aW9uLkZvdW5kYXRpb25Db250cmFjdCcsICcxLjAuMC4wJyksCiAgICAgICAgICAgICAgICBqb2luKHJlZiwnV2luZG93cy5OZXR3b3JraW5nLkNvbm5lY3Rpdml0eS5Xd2FuQ29udHJhY3QnLAogICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcpLAogICAgICAgICAgICAgICAgam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdFeHRlbnNpb25TREtzJywgJ01pY3Jvc29mdC5WQ0xpYnMnLAogICAgICAgICAgICAgICAgICAgICAnJTAuMWYnICUgc2VsZi52c192ZXIsICdSZWZlcmVuY2VzJywgJ0NvbW1vbkNvbmZpZ3VyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAnbmV1dHJhbCcpLAogICAgICAgICAgICBdCiAgICAgICAgcmV0dXJuIGxpYnBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fc2RrX3Rvb2xzKCkpCgogICAgZGVmIF9zZGtfdG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFRvb2xzIHBhdGhzIGdlbmVyYXRvci4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZ2VuZXJhdG9yIG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTUuMDoKICAgICAgICAgICAgYmluX2RpciA9ICdCaW4nIGlmIHNlbGYudnNfdmVyIDw9IDExLjAgZWxzZSByJ0Jpblx4ODYnCiAgICAgICAgICAgIHlpZWxkIGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBiaW5fZGlyKQoKICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGlmIHNlbGYudnNfdmVyIGluICgxMC4wLCAxMS4wKToKICAgICAgICAgICAgaWYgc2VsZi5waS50YXJnZXRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aCA9IHInQmluXE5FVEZYIDQuMCBUb29scyVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIGpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBwYXRoKQoKICAgICAgICBlbGlmIHNlbGYudnNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIHBhdGggPSBqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0JpbicpCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5zaS5XaW5kb3dzU2RrTGFzdFZlcnNpb24KICAgICAgICAgICAgeWllbGQgam9pbihwYXRoLCAnJXMlcycgJSAoc2RrdmVyLCBhcmNoX3N1YmRpcikpCgogICAgICAgIGlmIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoOgogICAgICAgICAgICB5aWVsZCBzZWxmLnNpLldpbmRvd3NTREtFeGVjdXRhYmxlUGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9zZGtfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9uIHN1YmRpci4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyCiAgICAgICAgICAgIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLldpbmRvd3NTZGtMYXN0VmVyc2lvbgogICAgICAgIHJldHVybiAoJyVzXFwnICUgdWNydHZlcikgaWYgdWNydHZlciBlbHNlICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgU2RrU2V0dXAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFNldHVwLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyID4gOS4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1NldHVwJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnhUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgVG9vbHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcGkgPSBzZWxmLnBpCiAgICAgICAgc2kgPSBzZWxmLnNpCgogICAgICAgIGlmIHNlbGYudnNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IFRydWUKICAgICAgICAgICAgaW5jbHVkZTY0ID0gbm90IHBpLnRhcmdldF9pc194ODYoKSBhbmQgbm90IHBpLmN1cnJlbnRfaXNfeDg2KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmNsdWRlMzIgPSBwaS50YXJnZXRfaXNfeDg2KCkgb3IgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgICAgICBpbmNsdWRlNjQgPSBwaS5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIG9yIHBpLnRhcmdldF9jcHUgPT0gJ2FtZDY0JwoKICAgICAgICB0b29scyA9IFtdCiAgICAgICAgaWYgaW5jbHVkZTMyOgogICAgICAgICAgICB0b29scyArPSBbam9pbihzaS5GcmFtZXdvcmtEaXIzMiwgdmVyKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHZlciBpbiBzaS5GcmFtZXdvcmtWZXJzaW9uMzJdCiAgICAgICAgaWYgaW5jbHVkZTY0OgogICAgICAgICAgICB0b29scyArPSBbam9pbihzaS5GcmFtZXdvcmtEaXI2NCwgdmVyKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHZlciBpbiBzaS5GcmFtZXdvcmtWZXJzaW9uNjRdCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5OZXQgRnJhbWV3b3JrIFNESyBMaWJyYXJpZXMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuTmV0RnhTZGtEaXIsIHInbGliXHVtJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U0RLSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5OZXQgRnJhbWV3b3JrIFNESyBJbmNsdWRlcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW2pvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidpbmNsdWRlXHVtJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVnNURGIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVGVhbSBTeXN0ZW0gRGF0YWJhc2UuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtqb2luKHNlbGYuc2kuVlNJbnN0YWxsRGlyLCByJ1ZTVFNEQlxEZXBsb3knKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBNU0J1aWxkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBCdWlsZCBFbmdpbmUuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52c192ZXIgPCAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBlbGlmIHNlbGYudnNfdmVyIDwgMTUuMDoKICAgICAgICAgICAgYmFzZV9wYXRoID0gc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlZTSW5zdGFsbERpcgogICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCgogICAgICAgIHBhdGggPSByJ01TQnVpbGRcJTAuMWZcYmluJXMnICUgKHNlbGYudnNfdmVyLCBhcmNoX3N1YmRpcikKICAgICAgICBidWlsZCA9IFtqb2luKGJhc2VfcGF0aCwgcGF0aCldCgogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE1LjA6CiAgICAgICAgICAgICMgQWRkIFJvc2x5biBDIyAmIFZpc3VhbCBCYXNpYyBDb21waWxlcgogICAgICAgICAgICBidWlsZCArPSBbam9pbihiYXNlX3BhdGgsIHBhdGgsICdSb3NseW4nKV0KCiAgICAgICAgcmV0dXJuIGJ1aWxkCgogICAgQHByb3BlcnR5CiAgICBkZWYgSFRNTEhlbHBXb3Jrc2hvcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgSFRNTCBIZWxwIFdvcmtzaG9wLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTEuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbam9pbihzZWxmLnNpLlByb2dyYW1GaWxlc3g4NiwgJ0hUTUwgSGVscCBXb3Jrc2hvcCcpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVDUlRMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIExpYnJhcmllcy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgbGlzdCBvZiBzdHIKICAgICAgICAgICAgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZzX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBsaWIgPSBqb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnbGliJykKICAgICAgICB1Y3J0dmVyID0gc2VsZi5fdWNydF9zdWJkaXIKICAgICAgICByZXR1cm4gW2pvaW4obGliLCAnJXN1Y3J0JXMnICUgKHVjcnR2ZXIsIGFyY2hfc3ViZGlyKSldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVUNSVEluY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBJbmNsdWRlLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBsaXN0IG9mIHN0cgogICAgICAgICAgICBwYXRocwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudnNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGluY2x1ZGUgPSBqb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnaW5jbHVkZScpCiAgICAgICAgcmV0dXJuIFtqb2luKGluY2x1ZGUsICclc3VjcnQnICUgc2VsZi5fdWNydF9zdWJkaXIpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF91Y3J0X3N1YmRpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgdmVyc2lvbiBzdWJkaXIuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBzdWJkaXIKICAgICAgICAiIiIKICAgICAgICB1Y3J0dmVyID0gc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtMYXN0VmVyc2lvbgogICAgICAgIHJldHVybiAoJyVzXFwnICUgdWNydHZlcikgaWYgdWNydHZlciBlbHNlICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgRlNoYXJwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgRiMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIGxpc3Qgb2Ygc3RyCiAgICAgICAgICAgIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgaWYgMTEuMCA+IHNlbGYudnNfdmVyID4gMTIuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbc2VsZi5zaS5GU2hhcnBJbnN0YWxsRGlyXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDUnVudGltZVJlZGlzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBydW50aW1lIHJlZGlzdHJpYnV0YWJsZSBkbGwuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBwYXRoCiAgICAgICAgIiIiCiAgICAgICAgdmNydW50aW1lID0gJ3ZjcnVudGltZSVkMC5kbGwnICUgc2VsZi52Y192ZXIKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkuc3RyaXAoJ1xcJykKCiAgICAgICAgIyBJbnN0YWxsYXRpb24gcHJlZml4ZXMgY2FuZGlkYXRlcwogICAgICAgIHByZWZpeGVzID0gW10KICAgICAgICB0b29sc19wYXRoID0gc2VsZi5zaS5WQ0luc3RhbGxEaXIKICAgICAgICByZWRpc3RfcGF0aCA9IGRpcm5hbWUodG9vbHNfcGF0aC5yZXBsYWNlKHInXFRvb2xzJywgcidcUmVkaXN0JykpCiAgICAgICAgaWYgaXNkaXIocmVkaXN0X3BhdGgpOgogICAgICAgICAgICAjIFJlZGlzdCB2ZXJzaW9uIG1heSBub3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0b29scwogICAgICAgICAgICByZWRpc3RfcGF0aCA9IGpvaW4ocmVkaXN0X3BhdGgsIGxpc3RkaXIocmVkaXN0X3BhdGgpWy0xXSkKICAgICAgICAgICAgcHJlZml4ZXMgKz0gW3JlZGlzdF9wYXRoLCBqb2luKHJlZGlzdF9wYXRoLCAnb25lY29yZScpXQoKICAgICAgICBwcmVmaXhlcyArPSBbam9pbih0b29sc19wYXRoLCAncmVkaXN0JyldICAjIFZTMTQgbGVnYWN5IHBhdGgKCiAgICAgICAgIyBDUlQgZGlyZWN0b3J5CiAgICAgICAgY3J0X2RpcnMgPSAoJ01pY3Jvc29mdC5WQyVkLkNSVCcgJSAoc2VsZi52Y192ZXIgKiAxMCksCiAgICAgICAgICAgICAgICAgICAgIyBTb21ldGltZSBzdG9yZSBpbiBkaXJlY3Rvcnkgd2l0aCBWUyB2ZXJzaW9uIGluc3RlYWQgb2YgVkMKICAgICAgICAgICAgICAgICAgICAnTWljcm9zb2Z0LlZDJWQuQ1JUJyAlIChpbnQoc2VsZi52c192ZXIpICogMTApKQoKICAgICAgICAjIHZjcnVudGltZSBwYXRoCiAgICAgICAgZm9yIHByZWZpeCwgY3J0X2RpciBpbiBpdGVydG9vbHMucHJvZHVjdChwcmVmaXhlcywgY3J0X2RpcnMpOgogICAgICAgICAgICBwYXRoID0gam9pbihwcmVmaXgsIGFyY2hfc3ViZGlyLCBjcnRfZGlyLCB2Y3J1bnRpbWUpCiAgICAgICAgICAgIGlmIGlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIHJldHVybl9lbnYoc2VsZiwgZXhpc3RzPVRydWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBlbnZpcm9ubWVudCBkaWN0LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGV4aXN0czogYm9vbAogICAgICAgICAgICBJdCBUcnVlLCBvbmx5IHJldHVybiBleGlzdGluZyBwYXRocy4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgZGljdAogICAgICAgICAgICBlbnZpcm9ubWVudAogICAgICAgICIiIgogICAgICAgIGVudiA9IGRpY3QoCiAgICAgICAgICAgIGluY2x1ZGU9c2VsZi5fYnVpbGRfcGF0aHMoJ2luY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VQ1JUSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTmV0RnhTREtJbmNsdWRlc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgbGliPXNlbGYuX2J1aWxkX3BhdGhzKCdsaWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VQ1JUTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTmV0RnhTREtMaWJyYXJpZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgbGlicGF0aD1zZWxmLl9idWlsZF9wYXRocygnbGlicGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5WQ1N0b3JlUmVmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0xpYnBhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIHBhdGg9c2VsZi5fYnVpbGRfcGF0aHMoJ3BhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVlNUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Wc1REYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZGtUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZGtTZXR1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk1TQnVpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSFRNTEhlbHBXb3Jrc2hvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GU2hhcnBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgKQogICAgICAgIGlmIHNlbGYudnNfdmVyID49IDE0IGFuZCBpc2ZpbGUoc2VsZi5WQ1J1bnRpbWVSZWRpc3QpOgogICAgICAgICAgICBlbnZbJ3B5X3ZjcnVudGltZV9yZWRpc3QnXSA9IHNlbGYuVkNSdW50aW1lUmVkaXN0CiAgICAgICAgcmV0dXJuIGVudgoKICAgIGRlZiBfYnVpbGRfcGF0aHMoc2VsZiwgbmFtZSwgc3BlY19wYXRoX2xpc3RzLCBleGlzdHMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgYW5kIHNwZWNpZmllZCBwYXRocywKICAgICAgICByZXR1cm4gYSBwYXRoc2VwLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGF0aHMgY29udGFpbmluZwogICAgICAgIHVuaXF1ZSwgZXh0YW50LCBkaXJlY3RvcmllcyBmcm9tIHRob3NlIHBhdGhzIGFuZCBmcm9tCiAgICAgICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiBSYWlzZSBhbiBlcnJvciBpZiBubyBwYXRocwogICAgICAgIGFyZSByZXNvbHZlZC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBuYW1lOiBzdHIKICAgICAgICAgICAgRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZQogICAgICAgIHNwZWNfcGF0aF9saXN0czogbGlzdCBvZiBzdHIKICAgICAgICAgICAgUGF0aHMKICAgICAgICBleGlzdHM6IGJvb2wKICAgICAgICAgICAgSXQgVHJ1ZSwgb25seSByZXR1cm4gZXhpc3RpbmcgcGF0aHMuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cgogICAgICAgICAgICBQYXRoc2VwLXNlcGFyYXRlZCBwYXRocwogICAgICAgICIiIgogICAgICAgICMgZmxhdHRlbiBzcGVjX3BhdGhfbGlzdHMKICAgICAgICBzcGVjX3BhdGhzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUoc3BlY19wYXRoX2xpc3RzKQogICAgICAgIGVudl9wYXRocyA9IGVudmlyb24uZ2V0KG5hbWUsICcnKS5zcGxpdChwYXRoc2VwKQogICAgICAgIHBhdGhzID0gaXRlcnRvb2xzLmNoYWluKHNwZWNfcGF0aHMsIGVudl9wYXRocykKICAgICAgICBleHRhbnRfcGF0aHMgPSBsaXN0KGZpbHRlcihpc2RpciwgcGF0aHMpKSBpZiBleGlzdHMgZWxzZSBwYXRocwogICAgICAgIGlmIG5vdCBleHRhbnRfcGF0aHM6CiAgICAgICAgICAgIG1zZyA9ICIlcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBlbXB0eSIgJSBuYW1lLnVwcGVyKCkKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKICAgICAgICB1bmlxdWVfcGF0aHMgPSBzZWxmLl91bmlxdWVfZXZlcnNlZW4oZXh0YW50X3BhdGhzKQogICAgICAgIHJldHVybiBwYXRoc2VwLmpvaW4odW5pcXVlX3BhdGhzKQoKICAgICMgZnJvbSBQeXRob24gZG9jcwogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF91bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4KICAgICAgICBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLgoKICAgICAgICBfdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAoKICAgICAgICBfdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgICAgICIiIgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgICAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudApQSwMEFAAAAAAAAAAhAGML49Z/DAAAfwwAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5aW1wb3J0IG9zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKCmZsYXR0ZW4gPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZQoKCmNsYXNzIEluc3RhbGxlcjoKCiAgICBuc3BrZ19leHQgPSAnLW5zcGtnLnB0aCcKCiAgICBkZWYgaW5zdGFsbF9uYW1lc3BhY2VzKHNlbGYpOgogICAgICAgIG5zcCA9IHNlbGYuX2dldF9hbGxfbnNfcGFja2FnZXMoKQogICAgICAgIGlmIG5vdCBuc3A6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuX2dldF90YXJnZXQoKSkKICAgICAgICBmaWxlbmFtZSArPSBzZWxmLm5zcGtnX2V4dAogICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBsaW5lcyA9IG1hcChzZWxmLl9nZW5fbnNwa2dfbGluZSwgbnNwKQoKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICMgYWx3YXlzIGdlbmVyYXRlIHRoZSBsaW5lcywgZXZlbiBpbiBkcnkgcnVuCiAgICAgICAgICAgIGxpc3QobGluZXMpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3dCcpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGVsaW5lcyhsaW5lcykKCiAgICBkZWYgdW5pbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQoKICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQKCiAgICBfbnNwa2dfdG1wbCA9ICgKICAgICAgICAiaW1wb3J0IHN5cywgdHlwZXMsIG9zIiwKICAgICAgICAiaGFzX21mcyA9IHN5cy52ZXJzaW9uX2luZm8gPiAoMywgNSkiLAogICAgICAgICJwID0gb3MucGF0aC5qb2luKCUocm9vdClzLCAqJShwdGgpcikiLAogICAgICAgICJpbXBvcnRsaWIgPSBoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIudXRpbCcpIiwKICAgICAgICAiaGFzX21mcyBhbmQgX19pbXBvcnRfXygnaW1wb3J0bGliLm1hY2hpbmVyeScpIiwKICAgICAgICAibSA9IGhhc19tZnMgYW5kICIKICAgICAgICAgICAgInN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJShwa2cpciwgIgogICAgICAgICAgICAgICAgImltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoIgogICAgICAgICAgICAgICAgICAgICJpbXBvcnRsaWIubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCUocGtnKXIsICIKICAgICAgICAgICAgICAgICAgICAgICAgIltvcy5wYXRoLmRpcm5hbWUocCldKSkpIiwKICAgICAgICAibSA9IG0gb3IgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCB0eXBlcy5Nb2R1bGVUeXBlKCUocGtnKXIpKSIsCiAgICAgICAgIm1wID0gKG0gb3IgW10pIGFuZCBtLl9fZGljdF9fLnNldGRlZmF1bHQoJ19fcGF0aF9fJyxbXSkiLAogICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocCkiLAogICAgKQogICAgImxpbmVzIGZvciB0aGUgbmFtZXNwYWNlIGluc3RhbGxlciIKCiAgICBfbnNwa2dfdG1wbF9tdWx0aSA9ICgKICAgICAgICAnbSBhbmQgc2V0YXR0cihzeXMubW9kdWxlc1slKHBhcmVudClyXSwgJShjaGlsZClyLCBtKScsCiAgICApCiAgICAiYWRkaXRpb25hbCBsaW5lKHMpIHdoZW4gYSBwYXJlbnQgcGFja2FnZSBpcyBpbmRpY2F0ZWQiCgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gInN5cy5fZ2V0ZnJhbWUoMSkuZl9sb2NhbHNbJ3NpdGVkaXInXSIKCiAgICBkZWYgX2dlbl9uc3BrZ19saW5lKHNlbGYsIHBrZyk6CiAgICAgICAgIyBlbnN1cmUgcGtnIGlzIG5vdCBhIHVuaWNvZGUgc3RyaW5nIHVuZGVyIFB5dGhvbiAyLjcKICAgICAgICBwa2cgPSBzdHIocGtnKQogICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQogICAgICAgIHJvb3QgPSBzZWxmLl9nZXRfcm9vdCgpCiAgICAgICAgdG1wbF9saW5lcyA9IHNlbGYuX25zcGtnX3RtcGwKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBwa2cucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50OgogICAgICAgICAgICB0bXBsX2xpbmVzICs9IHNlbGYuX25zcGtnX3RtcGxfbXVsdGkKICAgICAgICByZXR1cm4gJzsnLmpvaW4odG1wbF9saW5lcykgJSBsb2NhbHMoKSArICdcbicKCiAgICBkZWYgX2dldF9hbGxfbnNfcGFja2FnZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHNvcnRlZCBsaXN0IG9mIGFsbCBwYWNrYWdlIG5hbWVzcGFjZXMiIiIKICAgICAgICBwa2dzID0gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzIG9yIFtdCiAgICAgICAgcmV0dXJuIHNvcnRlZChmbGF0dGVuKG1hcChzZWxmLl9wa2dfbmFtZXMsIHBrZ3MpKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BrZ19uYW1lcyhwa2cpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbmFtZXNwYWNlIHBhY2thZ2UsIHlpZWxkIHRoZSBjb21wb25lbnRzIG9mIHRoYXQKICAgICAgICBwYWNrYWdlLgoKICAgICAgICA+Pj4gbmFtZXMgPSBJbnN0YWxsZXIuX3BrZ19uYW1lcygnYS5iLmMnKQogICAgICAgID4+PiBzZXQobmFtZXMpID09IHNldChbJ2EnLCAnYS5iJywgJ2EuYi5jJ10pCiAgICAgICAgVHJ1ZQogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykKICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgeWllbGQgJy4nLmpvaW4ocGFydHMpCiAgICAgICAgICAgIHBhcnRzLnBvcCgpCgoKY2xhc3MgRGV2ZWxvcEluc3RhbGxlcihJbnN0YWxsZXIpOgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gcmVwcihzdHIoc2VsZi5lZ2dfcGF0aCkpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19saW5rClBLAwQUAAAAAAAAACEAngXYjZ2eAACdngAAQAAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkiIiJQeVBJIGFuZCBkaXJlY3QgcGFja2FnZSBkb3dubG9hZGluZyIiIgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc29ja2V0CmltcG9ydCBiYXNlNjQKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgd2FybmluZ3MKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgaHR0cF9jbGllbnQsIGNvbmZpZ3BhcnNlciwgbWFwCgppbXBvcnQgc2V0dXB0b29scwpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIENIRUNLT1VUX0RJU1QsIERpc3RyaWJ1dGlvbiwgQklOQVJZX0RJU1QsIG5vcm1hbGl6ZV9wYXRoLCBTT1VSQ0VfRElTVCwKICAgIEVudmlyb25tZW50LCBmaW5kX2Rpc3RyaWJ1dGlvbnMsIHNhZmVfbmFtZSwgc2FmZV92ZXJzaW9uLAogICAgdG9fZmlsZW5hbWUsIFJlcXVpcmVtZW50LCBERVZFTE9QX0RJU1QsIEVHR19ESVNULAopCmZyb20gc2V0dXB0b29scyBpbXBvcnQgc3NsX3N1cHBvcnQKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gZm5tYXRjaCBpbXBvcnQgdHJhbnNsYXRlCmZyb20gc2V0dXB0b29scy5weTI3Y29tcGF0IGltcG9ydCBnZXRfYWxsX2hlYWRlcnMKZnJvbSBzZXR1cHRvb2xzLnB5MzNjb21wYXQgaW1wb3J0IHVuZXNjYXBlCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgpFR0dfRlJBR01FTlQgPSByZS5jb21waWxlKHInXmVnZz0oWy1BLVphLXowLTlfLishXSspJCcpCkhSRUYgPSByZS5jb21waWxlKHIiIiJocmVmXHMqPVxzKlsnIl0/KFteJyI+IF0rKSIiIiwgcmUuSSkKUFlQSV9NRDUgPSByZS5jb21waWxlKAogICAgcic8YSBocmVmPSIoW14iI10rKSI+KFtePF0rKTwvYT5cblxzK1woPGEgKD86dGl0bGU9Ik1ENSBoYXNoIlxuXHMrKScKICAgIHInaHJlZj0iW14/XStcPzphY3Rpb249c2hvd19tZDUmYW1wO2RpZ2VzdD0oWzAtOWEtZl17MzJ9KSI+bWQ1PC9hPlwpJwopClVSTF9TQ0hFTUUgPSByZS5jb21waWxlKCcoWy0rLmEtejAtOV17Mix9KTonLCByZS5JKS5tYXRjaApFWFRFTlNJT05TID0gIi50YXIuZ3ogLnRhci5iejIgLnRhciAuemlwIC50Z3oiLnNwbGl0KCkKCl9fYWxsX18gPSBbCiAgICAnUGFja2FnZUluZGV4JywgJ2Rpc3Ryb3NfZm9yX3VybCcsICdwYXJzZV9iZGlzdF93aW5pbnN0JywKICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLApdCgpfU09DS0VUX1RJTUVPVVQgPSAxNQoKX3RtcGwgPSAic2V0dXB0b29scy97c2V0dXB0b29scy5fX3ZlcnNpb25fX30gUHl0aG9uLXVybGxpYi97cHlfbWFqb3J9Igp1c2VyX2FnZW50ID0gX3RtcGwuZm9ybWF0KHB5X21ham9yPSd7fS57fScuZm9ybWF0KCpzeXMudmVyc2lvbl9pbmZvKSwgc2V0dXB0b29scz1zZXR1cHRvb2xzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUgKHNwZWMsKQogICAgICAgICkKCgpkZWYgcGFyc2VfYmRpc3Rfd2luaW5zdChuYW1lKToKICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKCiAgICBsb3dlciA9IG5hbWUubG93ZXIoKQogICAgYmFzZSwgcHlfdmVyLCBwbGF0ID0gTm9uZSwgTm9uZSwgTm9uZQoKICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4zMi1weScsIC0xNik6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5lbmRzd2l0aCgnLndpbi1hbWQ2NC5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luLWFtZDY0LXB5JywgLTIwKToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0yMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICByZXR1cm4gYmFzZSwgcHlfdmVyLCBwbGF0CgoKZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQgPSBwYXJ0cwogICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMV0pCiAgICBpZiBzZXJ2ZXIgPT0gJ3NvdXJjZWZvcmdlLm5ldCcgYW5kIGJhc2UgPT0gJ2Rvd25sb2FkJzogICMgWFhYIFl1Y2sKICAgICAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0yXSkKICAgIGlmICcjJyBpbiBiYXNlOgogICAgICAgIGJhc2UsIGZyYWdtZW50ID0gYmFzZS5zcGxpdCgnIycsIDEpCiAgICByZXR1cm4gYmFzZSwgZnJhZ21lbnQKCgpkZWYgZGlzdHJvc19mb3JfdXJsKHVybCwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICBmb3IgZGlzdCBpbiBkaXN0cm9zX2Zvcl9sb2NhdGlvbih1cmwsIGJhc2UsIG1ldGFkYXRhKToKICAgICAgICB5aWVsZCBkaXN0CiAgICBpZiBmcmFnbWVudDoKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgdXJsLCBtYXRjaC5ncm91cCgxKSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9Q0hFQ0tPVVRfRElTVAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0cm9zX2Zvcl9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBiYXNlbmFtZSIiIgogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdICAjIHN0cmlwIHRoZSAuemlwCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZycpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgIyBvbmx5IG9uZSwgdW5hbWJpZ3VvdXMgaW50ZXJwcmV0YXRpb24KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgIHdoZWVsID0gV2hlZWwoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9d2hlZWwucHJvamVjdF9uYW1lLAogICAgICAgICAgICB2ZXJzaW9uPXdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICMgSW5jcmVhc2UgcHJpb3JpdHkgb3ZlciBlZ2dzLgogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUICsgMSwKICAgICAgICApXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICB3aW5fYmFzZSwgcHlfdmVyLCBwbGF0Zm9ybSA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCiAgICAgICAgaWYgd2luX2Jhc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCBwbGF0Zm9ybQogICAgICAgICAgICApCiAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCiAgICAjCiAgICBmb3IgZXh0IGluIEVYVEVOU0lPTlM6CiAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LWxlbihleHQpXQogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpCiAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKCgpkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgcG9zc2libGUgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBhIGZpbGVuYW1lIiIiCiAgICByZXR1cm4gZGlzdHJvc19mb3JfbG9jYXRpb24oCiAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKICAgICkKCgpkZWYgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEsIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwKICAgICAgICBwbGF0Zm9ybT1Ob25lCik6CiAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKCiAgICBOb3RlOiBpZiBgbG9jYXRpb25gIGlzIGEgZmlsZXN5c3RlbSBmaWxlbmFtZSwgeW91IHNob3VsZCBjYWxsCiAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKICAgIHJvdXRpbmUhCiAgICAiIiIKICAgICMgR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCiAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKICAgICMgZS5nLiAiYWRucy1weXRob24tMS4xLjAiLCAiZWdlbml4LW14LWNvbW1lcmNpYWwiLCBldGMuCiAgICAjIFNvLCB3ZSBnZW5lcmF0ZSBlYWNoIHBvc3NpYmxlIGludGVyZXByZXRhdGlvbiAoZS5nLiAiYWRucywgcHl0aG9uLTEuMS4wIgogICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCiAgICAjIHRoZSBzcHVyaW91cyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGlnbm9yZWQsIGJlY2F1c2UgaW4gdGhlIGV2ZW50CiAgICAjIHRoZXJlJ3MgYWxzbyBhbiAiYWRucyIgcGFja2FnZSwgdGhlIHNwdXJpb3VzICJweXRob24tMS4xLjAiIHZlcnNpb24gd2lsbAogICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKICAgICMgdG8gbWF0Y2ggYSByZXF1ZXN0IGZvciBpdC4gIEl0J3Mgc3RpbGwgYSBwb3RlbnRpYWwgcHJvYmxlbSwgdGhvdWdoLCBhbmQKICAgICMgaW4gdGhlIGxvbmcgcnVuIFB5UEkgYW5kIHRoZSBkaXN0dXRpbHMgc2hvdWxkIGdvIGZvciAic2FmZSIgbmFtZXMgYW5kCiAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgoKICAgIHBhcnRzID0gYmFzZW5hbWUuc3BsaXQoJy0nKQogICAgaWYgbm90IHB5X3ZlcnNpb24gYW5kIGFueShyZS5tYXRjaChyJ3B5XGRcLlxkJCcsIHApIGZvciBwIGluIHBhcnRzWzI6XSk6CiAgICAgICAgIyBpdCBpcyBhIGJkaXN0X2R1bWIsIG5vdCBhbiBzZGlzdCAtLSBiYWlsIG91dAogICAgICAgIHJldHVybgoKICAgIGZvciBwIGluIHJhbmdlKDEsIGxlbihwYXJ0cykgKyAxKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgJy0nLmpvaW4ocGFydHNbOnBdKSwgJy0nLmpvaW4ocGFydHNbcDpdKSwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwcmVjZWRlbmNlPXByZWNlZGVuY2UsCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtCiAgICAgICAgKQoKCiMgRnJvbSBQeXRob24gMi43IGRvY3MKZGVmIHVuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIHNpeC5tb3Zlcy5maWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiB1bmlxdWVfdmFsdWVzKGZ1bmMpOgogICAgIiIiCiAgICBXcmFwIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhYmxlIHN1Y2ggdGhhdCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlCiAgICBvbmx5IGV2ZXIgeWllbGRzIHVuaXF1ZSBpdGVtcy4KICAgICIiIgoKICAgIEB3cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gdW5pcXVlX2V2ZXJzZWVuKGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSkKCiAgICByZXR1cm4gd3JhcHBlcgoKClJFTCA9IHJlLmNvbXBpbGUociIiIjwoW14+XSpcc3JlbFxzKj1ccypbJyJdPyhbXiciPl0rKVtePl0qKT4iIiIsIHJlLkkpCiMgdGhpcyBsaW5lIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKCgpAdW5pcXVlX3ZhbHVlcwpkZWYgZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgIiIiRmluZCByZWw9ImhvbWVwYWdlIiBhbmQgcmVsPSJkb3dubG9hZCIgbGlua3MgaW4gYHBhZ2VgLCB5aWVsZGluZyBVUkxzIiIiCgogICAgZm9yIG1hdGNoIGluIFJFTC5maW5kaXRlcihwYWdlKToKICAgICAgICB0YWcsIHJlbCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgcmVscyA9IHNldChtYXAoc3RyLnN0cmlwLCByZWwubG93ZXIoKS5zcGxpdCgnLCcpKSkKICAgICAgICBpZiAnaG9tZXBhZ2UnIGluIHJlbHMgb3IgJ2Rvd25sb2FkJyBpbiByZWxzOgogICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcih0YWcpOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCiAgICBmb3IgdGFnIGluICgiPHRoPkhvbWUgUGFnZSIsICI8dGg+RG93bmxvYWQgVVJMIik6CiAgICAgICAgcG9zID0gcGFnZS5maW5kKHRhZykKICAgICAgICBpZiBwb3MgIT0gLTE6CiAgICAgICAgICAgIG1hdGNoID0gSFJFRi5zZWFyY2gocGFnZSwgcG9zKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgoKY2xhc3MgQ29udGVudENoZWNrZXI6CiAgICAiIiIKICAgIEEgbnVsbCBjb250ZW50IGNoZWNrZXIgdGhhdCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIGNoZWNraW5nIGNvbnRlbnQKICAgICIiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJsb2NrKToKICAgICAgICAiIiIKICAgICAgICBGZWVkIGEgYmxvY2sgb2YgZGF0YSB0byB0aGUgaGFzaC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4KCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgdGhlIGhhc2guIFJldHVybiBGYWxzZSBpZiB2YWxpZGF0aW9uIGZhaWxzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgICIiIgogICAgICAgIENhbGwgcmVwb3J0ZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hlY2tlciAoaGFzaCBuYW1lKQogICAgICAgIHN1YnN0aXR1dGVkIGludG8gdGhlIHRlbXBsYXRlLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKCmNsYXNzIEhhc2hDaGVja2VyKENvbnRlbnRDaGVja2VyKToKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInKD9QPGhhc2hfbmFtZT5zaGExfHNoYTIyNHxzaGEzODR8c2hhMjU2fHNoYTUxMnxtZDUpPScKICAgICAgICByJyg/UDxleHBlY3RlZD5bYS1mMC05XSspJwogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYXNoX25hbWUsIGV4cGVjdGVkKToKICAgICAgICBzZWxmLmhhc2hfbmFtZSA9IGhhc2hfbmFtZQogICAgICAgIHNlbGYuaGFzaCA9IGhhc2hsaWIubmV3KGhhc2hfbmFtZSkKICAgICAgICBzZWxmLmV4cGVjdGVkID0gZXhwZWN0ZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3VybChjbHMsIHVybCk6CiAgICAgICAgIkNvbnN0cnVjdCBhIChwb3NzaWJseSBudWxsKSBDb250ZW50Q2hlY2tlciBmcm9tIGEgVVJMIgogICAgICAgIGZyYWdtZW50ID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbLTFdCiAgICAgICAgaWYgbm90IGZyYWdtZW50OgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIG1hdGNoID0gY2xzLnBhdHRlcm4uc2VhcmNoKGZyYWdtZW50KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRDaGVja2VyKCkKICAgICAgICByZXR1cm4gY2xzKCoqbWF0Y2guZ3JvdXBkaWN0KCkpCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgIHNlbGYuaGFzaC51cGRhdGUoYmxvY2spCgogICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2guaGV4ZGlnZXN0KCkgPT0gc2VsZi5leHBlY3RlZAoKICAgIGRlZiByZXBvcnQoc2VsZiwgcmVwb3J0ZXIsIHRlbXBsYXRlKToKICAgICAgICBtc2cgPSB0ZW1wbGF0ZSAlIHNlbGYuaGFzaF9uYW1lCiAgICAgICAgcmV0dXJuIHJlcG9ydGVyKG1zZykKCgpjbGFzcyBQYWNrYWdlSW5kZXgoRW52aXJvbm1lbnQpOgogICAgIiIiQSBkaXN0cmlidXRpb24gaW5kZXggdGhhdCBzY2FucyB3ZWIgcGFnZXMgZm9yIGRvd25sb2FkIFVSTHMiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGluZGV4X3VybD0iaHR0cHM6Ly9weXBpLm9yZy9zaW1wbGUvIiwgaG9zdHM9KCcqJywpLAogICAgICAgICAgICBjYV9idW5kbGU9Tm9uZSwgdmVyaWZ5X3NzbD1UcnVlLCAqYXJncywgKiprdwogICAgKToKICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKICAgICAgICBzZWxmLmluZGV4X3VybCA9IGluZGV4X3VybCArICIvIiBbOm5vdCBpbmRleF91cmwuZW5kc3dpdGgoJy8nKV0KICAgICAgICBzZWxmLnNjYW5uZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHMgPSB7fQogICAgICAgIHNlbGYucGFja2FnZV9wYWdlcyA9IHt9CiAgICAgICAgc2VsZi5hbGxvd3MgPSByZS5jb21waWxlKCd8Jy5qb2luKG1hcCh0cmFuc2xhdGUsIGhvc3RzKSkpLm1hdGNoCiAgICAgICAgc2VsZi50b19zY2FuID0gW10KICAgICAgICB1c2Vfc3NsID0gKAogICAgICAgICAgICB2ZXJpZnlfc3NsCiAgICAgICAgICAgIGFuZCBzc2xfc3VwcG9ydC5pc19hdmFpbGFibGUKICAgICAgICAgICAgYW5kIChjYV9idW5kbGUgb3Igc3NsX3N1cHBvcnQuZmluZF9jYV9idW5kbGUoKSkKICAgICAgICApCiAgICAgICAgaWYgdXNlX3NzbDoKICAgICAgICAgICAgc2VsZi5vcGVuZXIgPSBzc2xfc3VwcG9ydC5vcGVuZXJfZm9yKGNhX2J1bmRsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4KCiAgICBkZWYgcHJvY2Vzc191cmwoc2VsZiwgdXJsLCByZXRyaWV2ZT1GYWxzZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBVUkwgYXMgYSBwb3NzaWJsZSBkb3dubG9hZCwgYW5kIG1heWJlIHJldHJpZXZlIGl0IiIiCiAgICAgICAgaWYgdXJsIGluIHNlbGYuc2Nhbm5lZF91cmxzIGFuZCBub3QgcmV0cmlldmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzW3VybF0gPSBUcnVlCiAgICAgICAgaWYgbm90IFVSTF9TQ0hFTUUodXJsKToKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKHVybCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdHMgPSBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKQogICAgICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQgbGluazogJXMiLCB1cmwpCgogICAgICAgIGlmIGRpc3RzIG9yIG5vdCByZXRyaWV2ZSBvciB1cmwgaW4gc2VsZi5mZXRjaGVkX3VybHM6CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCiAgICAgICAgICAgIHJldHVybiAgIyBkb24ndCBuZWVkIHRoZSBhY3R1YWwgcGFnZQoKICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKICAgICAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuaW5mbygiUmVhZGluZyAlcyIsIHVybCkKICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZSAgIyBwcmV2ZW50IG11bHRpcGxlIGZldGNoIGF0dGVtcHRzCiAgICAgICAgdG1wbCA9ICJEb3dubG9hZCBlcnJvciBvbiAlczogJSVzIC0tIFNvbWUgcGFja2FnZXMgbWF5IG5vdCBiZSBmb3VuZCEiCiAgICAgICAgZiA9IHNlbGYub3Blbl91cmwodXJsLCB0bXBsICUgdXJsKQogICAgICAgIGlmIGYgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbZi51cmxdID0gVHJ1ZQogICAgICAgIGlmICdodG1sJyBub3QgaW4gZi5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpLmxvd2VyKCk6CiAgICAgICAgICAgIGYuY2xvc2UoKSAgIyBub3QgaHRtbCwgd2UgY2FuJ3QgcHJvY2VzcyBpdAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IGYudXJsICAjIGhhbmRsZSByZWRpcmVjdHMKICAgICAgICBwYWdlID0gZi5yZWFkKCkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWdlLCBzdHIpOgogICAgICAgICAgICAjIEluIFB5dGhvbiAzIGFuZCBnb3QgYnl0ZXMgYnV0IHdhbnQgc3RyLgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHVybGxpYi5lcnJvci5IVFRQRXJyb3IpOgogICAgICAgICAgICAgICAgIyBFcnJvcnMgaGF2ZSBubyBjaGFyc2V0LCBhc3N1bWUgbGF0aW4xOgogICAgICAgICAgICAgICAgY2hhcnNldCA9ICdsYXRpbi0xJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2hhcnNldCA9IGYuaGVhZGVycy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSBvciAnbGF0aW4tMScKICAgICAgICAgICAgcGFnZSA9IHBhZ2UuZGVjb2RlKGNoYXJzZXQsICJpZ25vcmUiKQogICAgICAgIGYuY2xvc2UoKQogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICBsaW5rID0gdXJsbGliLnBhcnNlLnVybGpvaW4oYmFzZSwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc191cmwobGluaykKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCkgYW5kIGdldGF0dHIoZiwgJ2NvZGUnLCBOb25lKSAhPSA0MDQ6CiAgICAgICAgICAgIHBhZ2UgPSBzZWxmLnByb2Nlc3NfaW5kZXgodXJsLCBwYWdlKQoKICAgIGRlZiBwcm9jZXNzX2ZpbGVuYW1lKHNlbGYsIGZuLCBuZXN0ZWQ9RmFsc2UpOgogICAgICAgICMgcHJvY2VzcyBmaWxlbmFtZXMgb3IgZGlyZWN0b3JpZXMKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICBzZWxmLndhcm4oIk5vdCBmb3VuZDogJXMiLCBmbikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm4pIGFuZCBub3QgbmVzdGVkOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChmbikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZShvcy5wYXRoLmpvaW4ocGF0aCwgaXRlbSksIFRydWUpCgogICAgICAgIGRpc3RzID0gZGlzdHJvc19mb3JfZmlsZW5hbWUoZm4pCiAgICAgICAgaWYgZGlzdHM6CiAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZGlzdHMpKQoKICAgIGRlZiB1cmxfb2soc2VsZiwgdXJsLCBmYXRhbD1GYWxzZSk6CiAgICAgICAgcyA9IFVSTF9TQ0hFTUUodXJsKQogICAgICAgIGlzX2ZpbGUgPSBzIGFuZCBzLmdyb3VwKDEpLmxvd2VyKCkgPT0gJ2ZpbGUnCiAgICAgICAgaWYgaXNfZmlsZSBvciBzZWxmLmFsbG93cyh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsxXSk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiXG5Ob3RlOiBCeXBhc3NpbmcgJXMgKGRpc2FsbG93ZWQgaG9zdDsgc2VlICIKICAgICAgICAgICAgImh0dHA6Ly9iaXQubHkvMmhySW1uWSBmb3IgZGV0YWlscykuXG4iKQogICAgICAgIGlmIGZhdGFsOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cgJSB1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgdXJsKQoKICAgIGRlZiBzY2FuX2VnZ19saW5rcyhzZWxmLCBzZWFyY2hfcGF0aCk6CiAgICAgICAgZGlycyA9IGZpbHRlcihvcy5wYXRoLmlzZGlyLCBzZWFyY2hfcGF0aCkKICAgICAgICBlZ2dfbGlua3MgPSAoCiAgICAgICAgICAgIChwYXRoLCBlbnRyeSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZGlycwogICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihwYXRoKQogICAgICAgICAgICBpZiBlbnRyeS5lbmRzd2l0aCgnLmVnZy1saW5rJykKICAgICAgICApCiAgICAgICAgbGlzdChpdGVydG9vbHMuc3Rhcm1hcChzZWxmLnNjYW5fZWdnX2xpbmssIGVnZ19saW5rcykpCgogICAgZGVmIHNjYW5fZWdnX2xpbmsoc2VsZiwgcGF0aCwgZW50cnkpOgogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocGF0aCwgZW50cnkpKSBhcyByYXdfbGluZXM6CiAgICAgICAgICAgICMgZmlsdGVyIG5vbi1lbXB0eSBsaW5lcwogICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmlsdGVyKE5vbmUsIG1hcChzdHIuc3RyaXAsIHJhd19saW5lcykpKQoKICAgICAgICBpZiBsZW4obGluZXMpICE9IDI6CiAgICAgICAgICAgICMgZm9ybWF0IGlzIG5vdCByZWNvZ25pemVkOyBwdW50CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlZ2dfcGF0aCwgc2V0dXBfcGF0aCA9IGxpbmVzCgogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhvcy5wYXRoLmpvaW4ocGF0aCwgZWdnX3BhdGgpKToKICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiA9IG9zLnBhdGguam9pbihwYXRoLCAqbGluZXMpCiAgICAgICAgICAgIGRpc3QucHJlY2VkZW5jZSA9IFNPVVJDRV9ESVNUCiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIHByb2Nlc3NfaW5kZXgoc2VsZiwgdXJsLCBwYWdlKToKICAgICAgICAiIiJQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIFB5UEkgcGFnZSIiIgoKICAgICAgICBkZWYgc2NhbihsaW5rKToKICAgICAgICAgICAgIyBQcm9jZXNzIGEgVVJMIHRvIHNlZSBpZiBpdCdzIGZvciBhIHBhY2thZ2UgcGFnZQogICAgICAgICAgICBpZiBsaW5rLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpOgogICAgICAgICAgICAgICAgcGFydHMgPSBsaXN0KG1hcCgKICAgICAgICAgICAgICAgICAgICB1cmxsaWIucGFyc2UudW5xdW90ZSwgbGlua1tsZW4oc2VsZi5pbmRleF91cmwpOl0uc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMiBhbmQgJyMnIG5vdCBpbiBwYXJ0c1sxXToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBwYWNrYWdlIHBhZ2UsIHNhbml0aXplIGFuZCBpbmRleCBpdAogICAgICAgICAgICAgICAgICAgIHBrZyA9IHNhZmVfbmFtZShwYXJ0c1swXSkKICAgICAgICAgICAgICAgICAgICB2ZXIgPSBzYWZlX3ZlcnNpb24ocGFydHNbMV0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzLnNldGRlZmF1bHQocGtnLmxvd2VyKCksIHt9KVtsaW5rXSA9IFRydWUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9fZmlsZW5hbWUocGtnKSwgdG9fZmlsZW5hbWUodmVyKQogICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQoKICAgICAgICAjIHByb2Nlc3MgYW4gaW5kZXggcGFnZSBpbnRvIHRoZSBwYWNrYWdlLXBhZ2UgaW5kZXgKICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2Nhbih1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIHBrZywgdmVyID0gc2Nhbih1cmwpICAjIGVuc3VyZSB0aGlzIHBhZ2UgaXMgaW4gdGhlIHBhZ2UgaW5kZXgKICAgICAgICBpZiBwa2c6CiAgICAgICAgICAgICMgcHJvY2VzcyBpbmRpdmlkdWFsIHBhY2thZ2UgcGFnZQogICAgICAgICAgICBmb3IgbmV3X3VybCBpbiBmaW5kX2V4dGVybmFsX2xpbmtzKHVybCwgcGFnZSk6CiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGZvdW5kIFVSTAogICAgICAgICAgICAgICAgYmFzZSwgZnJhZyA9IGVnZ19pbmZvX2Zvcl91cmwobmV3X3VybCkKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpIGFuZCBub3QgZnJhZzoKICAgICAgICAgICAgICAgICAgICBpZiB2ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld191cmwgKz0gJyNlZ2c9JXMtJXMnICUgKHBrZywgdmVyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmVlZF92ZXJzaW9uX2luZm8odXJsKQogICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybChuZXdfdXJsKQoKICAgICAgICAgICAgcmV0dXJuIFBZUElfTUQ1LnN1YigKICAgICAgICAgICAgICAgIGxhbWJkYSBtOiAnPGEgaHJlZj0iJXMjbWQ1PSVzIj4lczwvYT4nICUgbS5ncm91cCgxLCAzLCAyKSwgcGFnZQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiICAjIG5vIHNlbnNlIGRvdWJsZS1zY2FubmluZyBub24tcGFja2FnZSBwYWdlcwoKICAgIGRlZiBuZWVkX3ZlcnNpb25faW5mbyhzZWxmLCB1cmwpOgogICAgICAgIHNlbGYuc2Nhbl9hbGwoCiAgICAgICAgICAgICJQYWdlIGF0ICVzIGxpbmtzIHRvIC5weSBmaWxlKHMpIHdpdGhvdXQgdmVyc2lvbiBpbmZvOyBhbiBpbmRleCAiCiAgICAgICAgICAgICJzY2FuIGlzIHJlcXVpcmVkLiIsIHVybAogICAgICAgICkKCiAgICBkZWYgc2Nhbl9hbGwoc2VsZiwgbXNnPU5vbmUsICphcmdzKToKICAgICAgICBpZiBzZWxmLmluZGV4X3VybCBub3QgaW4gc2VsZi5mZXRjaGVkX3VybHM6CiAgICAgICAgICAgIGlmIG1zZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybihtc2csICphcmdzKQogICAgICAgICAgICBzZWxmLmluZm8oCiAgICAgICAgICAgICAgICAiU2Nhbm5pbmcgaW5kZXggb2YgYWxsIHBhY2thZ2VzICh0aGlzIG1heSB0YWtlIGEgd2hpbGUpIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCkKCiAgICBkZWYgZmluZF9wYWNrYWdlcyhzZWxmLCByZXF1aXJlbWVudCk6CiAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIEZhbGwgYmFjayB0byBzYWZlIHZlcnNpb24gb2YgdGhlIG5hbWUKICAgICAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSArICcvJykKCiAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKICAgICAgICAgICAgIyBXZSBjb3VsZG4ndCBmaW5kIHRoZSB0YXJnZXQgcGFja2FnZSwgc28gc2VhcmNoIHRoZSBpbmRleCBwYWdlIHRvbwogICAgICAgICAgICBzZWxmLm5vdF9mb3VuZF9pbl9pbmRleChyZXF1aXJlbWVudCkKCiAgICAgICAgZm9yIHVybCBpbiBsaXN0KHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5LCAoKSkpOgogICAgICAgICAgICAjIHNjYW4gZWFjaCBwYWdlIHRoYXQgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGUgZGVzaXJlZCBwYWNrYWdlCiAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcXVpcmVtZW50LmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBzZWxmLmRlYnVnKCIlcyBkb2VzIG5vdCBtYXRjaCAlcyIsIHJlcXVpcmVtZW50LCBkaXN0KQogICAgICAgIHJldHVybiBzdXBlcihQYWNrYWdlSW5kZXgsIHNlbGYpLm9idGFpbihyZXF1aXJlbWVudCwgaW5zdGFsbGVyKQoKICAgIGRlZiBjaGVja19oYXNoKHNlbGYsIGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApOgogICAgICAgICIiIgogICAgICAgIGNoZWNrZXIgaXMgYSBDb250ZW50Q2hlY2tlcgogICAgICAgICIiIgogICAgICAgIGNoZWNrZXIucmVwb3J0KAogICAgICAgICAgICBzZWxmLmRlYnVnLAogICAgICAgICAgICAiVmFsaWRhdGluZyAlJXMgY2hlY2tzdW0gZm9yICVzIiAlIGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBjaGVja2VyLmlzX3ZhbGlkKCk6CiAgICAgICAgICAgIHRmcC5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICVzOyAiCiAgICAgICAgICAgICAgICAicG9zc2libGUgZG93bmxvYWQgcHJvYmxlbT8iCiAgICAgICAgICAgICAgICAlIChjaGVja2VyLmhhc2gubmFtZSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgICAgICkKCiAgICBkZWYgYWRkX2ZpbmRfbGlua3Moc2VsZiwgdXJscyk6CiAgICAgICAgIiIiQWRkIGB1cmxzYCB0byB0aGUgbGlzdCB0aGF0IHdpbGwgYmUgcHJlc2Nhbm5lZCBmb3Igc2VhcmNoZXMiIiIKICAgICAgICBmb3IgdXJsIGluIHVybHM6CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHNlbGYudG9fc2NhbiBpcyBOb25lICAjIGlmIHdlIGhhdmUgYWxyZWFkeSAiZ29uZSBvbmxpbmUiCiAgICAgICAgICAgICAgICBvciBub3QgVVJMX1NDSEVNRSh1cmwpICAjIG9yIGl0J3MgYSBsb2NhbCBmaWxlL2RpcmVjdG9yeQogICAgICAgICAgICAgICAgb3IgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKICAgICAgICAgICAgICAgIG9yIGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpICAjIG9yIGEgZGlyZWN0IHBhY2thZ2UgbGluawogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgIyB0aGVuIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGl0IG5vdwogICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgZGVmZXIgcmV0cmlldmFsIHRpbGwgbGF0ZXIKICAgICAgICAgICAgICAgIHNlbGYudG9fc2Nhbi5hcHBlbmQodXJsKQoKICAgIGRlZiBwcmVzY2FuKHNlbGYpOgogICAgICAgICIiIlNjYW4gdXJscyBzY2hlZHVsZWQgZm9yIHByZXNjYW5uaW5nIChlLmcuIC0tZmluZC1saW5rcykiIiIKICAgICAgICBpZiBzZWxmLnRvX3NjYW46CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuc2Nhbl91cmwsIHNlbGYudG9fc2NhbikpCiAgICAgICAgc2VsZi50b19zY2FuID0gTm9uZSAgIyBmcm9tIG5vdyBvbiwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgaW1tZWRpYXRlbHkKCiAgICBkZWYgbm90X2ZvdW5kX2luX2luZGV4KHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBpZiBzZWxmW3JlcXVpcmVtZW50LmtleV06ICAjIHdlJ3ZlIHNlZW4gYXQgbGVhc3Qgb25lIGRpc3RybwogICAgICAgICAgICBtZXRoLCBtc2cgPSBzZWxmLmluZm8sICJDb3VsZG4ndCByZXRyaWV2ZSBpbmRleCBwYWdlIGZvciAlciIKICAgICAgICBlbHNlOiAgIyBubyBkaXN0cm9zIHNlZW4gZm9yIHRoaXMgbmFtZSwgbWlnaHQgYmUgbWlzc3BlbGxlZAogICAgICAgICAgICBtZXRoLCBtc2cgPSAoCiAgICAgICAgICAgICAgICBzZWxmLndhcm4sCiAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBpbmRleCBwYWdlIGZvciAlciAobWF5YmUgbWlzc3BlbGxlZD8pIikKICAgICAgICBtZXRoKG1zZywgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUpCiAgICAgICAgc2VsZi5zY2FuX2FsbCgpCgogICAgZGVmIGRvd25sb2FkKHNlbGYsIHNwZWMsIHRtcGRpcik6CiAgICAgICAgIiIiTG9jYXRlIGFuZC9vciBkb3dubG9hZCBgc3BlY2AgdG8gYHRtcGRpcmAsIHJldHVybmluZyBhIGxvY2FsIHBhdGgKCiAgICAgICAgYHNwZWNgIG1heSBiZSBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QsIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBVUkwsCiAgICAgICAgYW4gZXhpc3RpbmcgbG9jYWwgZmlsZW5hbWUsIG9yIGEgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMKICAgICAgICAoaS5lLiB0aGUgc3RyaW5nIGZvcm0gb2YgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0KS4gIElmIGl0IGlzIHRoZSBVUkwKICAgICAgICBvZiBhIC5weSBmaWxlIHdpdGggYW4gdW5hbWJpZ3VvdXMgYGAjZWdnPW5hbWUtdmVyc2lvbmBgIHRhZyAoaS5lLiwgb25lCiAgICAgICAgdGhhdCBlc2NhcGVzIGBgLWBgIGFzIGBgX2BgIHRocm91Z2hvdXQpLCBhIHRyaXZpYWwgYGBzZXR1cC5weWBgIGlzCiAgICAgICAgYXV0b21hdGljYWxseSBjcmVhdGVkIGFsb25nc2lkZSB0aGUgZG93bmxvYWRlZCBmaWxlLgoKICAgICAgICBJZiBgc3BlY2AgaXMgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0IG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQogICAgICAgIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZgogICAgICAgIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIChwb3NzaWJseSBhZnRlciBkb3dubG9hZGluZyBpdCB0byBgdG1wZGlyYCkuCiAgICAgICAgSWYgYHNwZWNgIGlzIGEgbG9jYWxseSBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLCBpdCBpcyBzaW1wbHkKICAgICAgICByZXR1cm5lZCB1bmNoYW5nZWQuICBJZiBgc3BlY2AgaXMgYSBVUkwsIGl0IGlzIGRvd25sb2FkZWQgdG8gYSBzdWJwYXRoCiAgICAgICAgb2YgYHRtcGRpcmAsIGFuZCB0aGUgbG9jYWwgZmlsZW5hbWUgaXMgcmV0dXJuZWQuICBWYXJpb3VzIGVycm9ycyBtYXkgYmUKICAgICAgICByYWlzZWQgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgZG93bmxvYWRpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYywgUmVxdWlyZW1lbnQpOgogICAgICAgICAgICBzY2hlbWUgPSBVUkxfU0NIRU1FKHNwZWMpCiAgICAgICAgICAgIGlmIHNjaGVtZToKICAgICAgICAgICAgICAgICMgSXQncyBhIHVybCwgZG93bmxvYWQgaXQgdG8gdG1wZGlyCiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2Rvd25sb2FkX3VybChzY2hlbWUuZ3JvdXAoMSksIHNwZWMsIHRtcGRpcikKICAgICAgICAgICAgICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybChzcGVjKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLmdlbl9zZXR1cChmb3VuZCwgZnJhZ21lbnQsIHRtcGRpcikKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgogICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCByZXR1cm4gaXQKICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzcGVjID0gcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5mZXRjaF9kaXN0cmlidXRpb24oc3BlYywgdG1wZGlyKSwgJ2xvY2F0aW9uJywgTm9uZSkKCiAgICBkZWYgZmV0Y2hfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICBzZWxmLCByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UsCiAgICAgICAgICAgIGRldmVsb3Bfb2s9RmFsc2UsIGxvY2FsX2luZGV4PU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCgogICAgICAgIGByZXF1aXJlbWVudGAgbXVzdCBiZSBhIGBgcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudGBgIGluc3RhbmNlLgogICAgICAgIElmIG5lY2Vzc2FyeSwgb3IgaWYgdGhlIGBmb3JjZV9zY2FuYCBmbGFnIGlzIHNldCwgdGhlIHJlcXVpcmVtZW50IGlzCiAgICAgICAgc2VhcmNoZWQgZm9yIGluIHRoZSAob25saW5lKSBwYWNrYWdlIGluZGV4IGFzIHdlbGwgYXMgdGhlIGxvY2FsbHkKICAgICAgICBpbnN0YWxsZWQgcGFja2FnZXMuICBJZiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIGlzIGZvdW5kLAogICAgICAgIHRoZSByZXR1cm5lZCBkaXN0cmlidXRpb24ncyBgYGxvY2F0aW9uYGAgaXMgdGhlIHZhbHVlIHlvdSB3b3VsZCBoYXZlCiAgICAgICAgZ290dGVuIGZyb20gY2FsbGluZyB0aGUgYGBkb3dubG9hZCgpYGAgbWV0aG9kIHdpdGggdGhlIG1hdGNoaW5nCiAgICAgICAgZGlzdHJpYnV0aW9uJ3MgVVJMIG9yIGZpbGVuYW1lLiAgSWYgbm8gbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLAogICAgICAgIGBgTm9uZWBgIGlzIHJldHVybmVkLgoKICAgICAgICBJZiB0aGUgYHNvdXJjZWAgZmxhZyBpcyBzZXQsIG9ubHkgc291cmNlIGRpc3RyaWJ1dGlvbnMgYW5kIHNvdXJjZQogICAgICAgIGNoZWNrb3V0IGxpbmtzIHdpbGwgYmUgY29uc2lkZXJlZC4gIFVubGVzcyB0aGUgYGRldmVsb3Bfb2tgIGZsYWcgaXMKICAgICAgICBzZXQsIGRldmVsb3BtZW50IGFuZCBzeXN0ZW0gZWdncyAoaS5lLiwgdGhvc2UgdXNpbmcgdGhlIGBgLmVnZy1pbmZvYGAKICAgICAgICBmb3JtYXQpIHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAiIiIKICAgICAgICAjIHByb2Nlc3MgYSBSZXF1aXJlbWVudAogICAgICAgIHNlbGYuaW5mbygiU2VhcmNoaW5nIGZvciAlcyIsIHJlcXVpcmVtZW50KQogICAgICAgIHNraXBwZWQgPSB7fQogICAgICAgIGRpc3QgPSBOb25lCgogICAgICAgIGRlZiBmaW5kKHJlcSwgZW52PU5vbmUpOgogICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVudiA9IHNlbGYKICAgICAgICAgICAgIyBGaW5kIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBlbnZbcmVxLmtleV06CgogICAgICAgICAgICAgICAgaWYgZGlzdC5wcmVjZWRlbmNlID09IERFVkVMT1BfRElTVCBhbmQgbm90IGRldmVsb3Bfb2s6CiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gc2tpcHBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGRldmVsb3BtZW50IG9yIHN5c3RlbSBlZ2c6ICVzIiwgZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkW2Rpc3RdID0gMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgdGVzdCA9ICgKICAgICAgICAgICAgICAgICAgICBkaXN0IGluIHJlcQogICAgICAgICAgICAgICAgICAgIGFuZCAoZGlzdC5wcmVjZWRlbmNlIDw9IFNPVVJDRV9ESVNUIG9yIG5vdCBzb3VyY2UpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiB0ZXN0OgogICAgICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuZG93bmxvYWQoZGlzdC5sb2NhdGlvbiwgdG1wZGlyKQogICAgICAgICAgICAgICAgICAgIGRpc3QuZG93bmxvYWRfbG9jYXRpb24gPSBsb2MKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0LmRvd25sb2FkX2xvY2F0aW9uKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKCiAgICAgICAgaWYgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgbm90IGRpc3QgYW5kIGxvY2FsX2luZGV4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCwgbG9jYWxfaW5kZXgpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi50b19zY2FuIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZSBhbmQgbm90IGZvcmNlX3NjYW46CiAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgIk5vIGxvY2FsIHBhY2thZ2VzIG9yIHdvcmtpbmcgZG93bmxvYWQgbGlua3MgZm91bmQgZm9yICVzJXMiLAogICAgICAgICAgICAgICAgKHNvdXJjZSBhbmQgImEgc291cmNlIGRpc3RyaWJ1dGlvbiBvZiAiIG9yICIiKSwKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJCZXN0IG1hdGNoOiAlcyIsIGRpc3QpCiAgICAgICAgICAgIHJldHVybiBkaXN0LmNsb25lKGxvY2F0aW9uPWRpc3QuZG93bmxvYWRfbG9jYXRpb24pCgogICAgZGVmIGZldGNoKHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZmlsZSBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCgogICAgICAgIERFUFJFQ0FURUQ7IHVzZSB0aGUgYGBmZXRjaF9kaXN0cmlidXRpb24oKWBgIG1ldGhvZCBub3cgaW5zdGVhZC4gIEZvcgogICAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgYnV0IHJldHVybnMgdGhlCiAgICAgICAgYGBsb2NhdGlvbmBgIG9mIHRoZSBkb3dubG9hZGVkIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkIG9mIGEgZGlzdHJpYnV0aW9uCiAgICAgICAgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihyZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuLCBzb3VyY2UpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRpc3QubG9jYXRpb24KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZW5fc2V0dXAoc2VsZiwgZmlsZW5hbWUsIGZyYWdtZW50LCB0bXBkaXIpOgogICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KQogICAgICAgIGRpc3RzID0gbWF0Y2ggYW5kIFsKICAgICAgICAgICAgZCBmb3IgZCBpbgogICAgICAgICAgICBpbnRlcnByZXRfZGlzdHJvX25hbWUoZmlsZW5hbWUsIG1hdGNoLmdyb3VwKDEpLCBOb25lKSBpZiBkLnZlcnNpb24KICAgICAgICBdIG9yIFtdCgogICAgICAgIGlmIGxlbihkaXN0cykgPT0gMTogICMgdW5hbWJpZ3VvdXMgYGAjZWdnYGAgZnJhZ21lbnQKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZCB0byB0aGUgdGVtcCBkaXIuCiAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkgIT0gdG1wZGlyOgogICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHRtcGRpciwgYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IHNhbWVmaWxlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZmlsZW5hbWUsIGRzdCk6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGZpbGVuYW1lLCBkc3QpCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBkc3QKCiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4odG1wZGlyLCAnc2V0dXAucHknKSwgJ3cnKSBhcyBmaWxlOgogICAgICAgICAgICAgICAgZmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAiZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cFxuIgogICAgICAgICAgICAgICAgICAgICJzZXR1cChuYW1lPSVyLCB2ZXJzaW9uPSVyLCBweV9tb2R1bGVzPVslcl0pXG4iCiAgICAgICAgICAgICAgICAgICAgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RzWzBdLnByb2plY3RfbmFtZSwgZGlzdHNbMF0udmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgICAgICBlbGlmIG1hdGNoOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCB1bmFtYmlndW91c2x5IGludGVycHJldCBwcm9qZWN0L3ZlcnNpb24gaWRlbnRpZmllciAlcjsgIgogICAgICAgICAgICAgICAgImFueSBkYXNoZXMgaW4gdGhlIG5hbWUgb3IgdmVyc2lvbiBzaG91bGQgYmUgZXNjYXBlZCB1c2luZyAiCiAgICAgICAgICAgICAgICAidW5kZXJzY29yZXMuICVyIiAlIChmcmFnbWVudCwgZGlzdHMpCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBwcm9jZXNzIHBsYWluIC5weSBmaWxlcyB3aXRob3V0IGFuICcjZWdnPW5hbWUtdmVyc2lvbiciCiAgICAgICAgICAgICAgICAiIHN1ZmZpeCB0byBlbmFibGUgYXV0b21hdGljIHNldHVwIHNjcmlwdCBnZW5lcmF0aW9uLiIKICAgICAgICAgICAgKQoKICAgIGRsX2Jsb2Nrc2l6ZSA9IDgxOTIKCiAgICBkZWYgX2Rvd25sb2FkX3RvKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHNlbGYuaW5mbygiRG93bmxvYWRpbmcgJXMiLCB1cmwpCiAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQogICAgICAgIGZwID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgY2hlY2tlciA9IEhhc2hDaGVja2VyLmZyb21fdXJsKHVybCkKICAgICAgICAgICAgZnAgPSBzZWxmLm9wZW5fdXJsKHVybCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcCwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZG93bmxvYWQgJXM6ICVzICVzIiAlICh1cmwsIGZwLmNvZGUsIGZwLm1zZykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaGVhZGVycyA9IGZwLmluZm8oKQogICAgICAgICAgICBibG9ja251bSA9IDAKICAgICAgICAgICAgYnMgPSBzZWxmLmRsX2Jsb2Nrc2l6ZQogICAgICAgICAgICBzaXplID0gLTEKICAgICAgICAgICAgaWYgImNvbnRlbnQtbGVuZ3RoIiBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgIyBTb21lIHNlcnZlcnMgcmV0dXJuIG11bHRpcGxlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMgOigKICAgICAgICAgICAgICAgIHNpemVzID0gZ2V0X2FsbF9oZWFkZXJzKGhlYWRlcnMsICdDb250ZW50LUxlbmd0aCcpCiAgICAgICAgICAgICAgICBzaXplID0gbWF4KG1hcChpbnQsIHNpemVzKSkKICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgdGZwOgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZwLnJlYWQoYnMpCiAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIuZmVlZChibG9jaykKICAgICAgICAgICAgICAgICAgICAgICAgdGZwLndyaXRlKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfaGFzaChjaGVja2VyLCBmaWxlbmFtZSwgdGZwKQogICAgICAgICAgICByZXR1cm4gaGVhZGVycwogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIGZwOgogICAgICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiByZXBvcnRob29rKHNlbGYsIHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBibGtzaXplLCBzaXplKToKICAgICAgICBwYXNzICAjIG5vLW9wCgogICAgZGVmIG9wZW5fdXJsKHNlbGYsIHVybCwgd2FybmluZz1Ob25lKToKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICAgICAgcmV0dXJuIGxvY2FsX29wZW4odXJsKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9wZW5fd2l0aF9hdXRoKHVybCwgc2VsZi5vcGVuZXIpCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBodHRwX2NsaWVudC5JbnZhbGlkVVJMKSBhcyB2OgogICAgICAgICAgICBtc2cgPSAnICcuam9pbihbc3RyKGFyZykgZm9yIGFyZyBpbiB2LmFyZ3NdKQogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIG1zZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCclcyAlcycgJSAodXJsLCBtc2cpKQogICAgICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yIGFzIHY6CiAgICAgICAgICAgIHJldHVybiB2CiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5VUkxFcnJvciBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYucmVhc29uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yIGZvciAlczogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh1cmwsIHYucmVhc29uKSkKICAgICAgICBleGNlcHQgaHR0cF9jbGllbnQuQmFkU3RhdHVzTGluZSBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYubGluZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICclcyByZXR1cm5lZCBhIGJhZCBzdGF0dXMgbGluZS4gVGhlIHNlcnZlciBtaWdodCBiZSAnCiAgICAgICAgICAgICAgICAgICAgJ2Rvd24sICVzJyAlCiAgICAgICAgICAgICAgICAgICAgKHVybCwgdi5saW5lKQogICAgICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCAoaHR0cF9jbGllbnQuSFRUUEV4Y2VwdGlvbiwgc29ja2V0LmVycm9yKSBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdikpCgogICAgZGVmIF9kb3dubG9hZF91cmwoc2VsZiwgc2NoZW1lLCB1cmwsIHRtcGRpcik6CiAgICAgICAgIyBEZXRlcm1pbmUgZG93bmxvYWQgZmlsZW5hbWUKICAgICAgICAjCiAgICAgICAgbmFtZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHVybCkKICAgICAgICBpZiBuYW1lOgogICAgICAgICAgICB3aGlsZSAnLi4nIGluIG5hbWU6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuLicsICcuJykucmVwbGFjZSgnXFwnLCAnXycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9ICJfX2Rvd25sb2FkZWRfXyIgICMgZGVmYXVsdCBpZiBVUkwgaGFzIG5vIHBhdGggY29udGVudHMKCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi00XSAgIyBzdHJpcCB0aGUgZXh0cmEgLnppcCBiZWZvcmUgZG93bmxvYWQKCiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBuYW1lKQoKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgIwogICAgICAgIGlmIHNjaGVtZSA9PSAnc3ZuJyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnc3ZuKycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUgPT0gJ2dpdCcgb3Igc2NoZW1lLnN0YXJ0c3dpdGgoJ2dpdCsnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2dpdCh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lLnN0YXJ0c3dpdGgoJ2hnKycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaGcodXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZmlsZSc6CiAgICAgICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmwycGF0aG5hbWUodXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbMl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmxfb2sodXJsLCBUcnVlKSAgIyByYWlzZXMgZXJyb3IgaWYgbm90IGFsbG93ZWQKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dGVtcHRfZG93bmxvYWQodXJsLCBmaWxlbmFtZSkKCiAgICBkZWYgc2Nhbl91cmwoc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKHVybCwgVHJ1ZSkKCiAgICBkZWYgX2F0dGVtcHRfZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgaGVhZGVycyA9IHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCiAgICAgICAgaWYgJ2h0bWwnIGluIGhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2h0bWwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX2Rvd25sb2FkX2h0bWwoc2VsZiwgdXJsLCBoZWFkZXJzLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCiAgICAgICAgZm9yIGxpbmUgaW4gZmlsZToKICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2UKICAgICAgICAgICAgICAgIGlmIHJlLnNlYXJjaChyJzx0aXRsZT4oW14tIF0rIC0gKT9SZXZpc2lvbiBcZCs6JywgbGluZSk6CiAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlOgogICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBicmVhayAgIyBub3QgYW4gaW5kZXggcGFnZQogICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiVW5leHBlY3RlZCBIVE1MIHBhZ2UgZm91bmQgYXQgIiArIHVybCkKCiAgICBkZWYgX2Rvd25sb2FkX3N2bihzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICB3YXJuaW5ncy53YXJuKCJTVk4gZG93bmxvYWQgc3VwcG9ydCBpcyBkZXByZWNhdGVkIiwgVXNlcldhcm5pbmcpCiAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcjJywgMSlbMF0gICMgcmVtb3ZlIGFueSBmcmFnbWVudCBmb3Igc3ZuJ3Mgc2FrZQogICAgICAgIGNyZWRzID0gJycKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCdzdm46JykgYW5kICdAJyBpbiB1cmw6CiAgICAgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwLCBxLCBmID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgICAgICAgICAgaWYgbm90IG5ldGxvYyBhbmQgcGF0aC5zdGFydHN3aXRoKCcvLycpIGFuZCAnLycgaW4gcGF0aFsyOl06CiAgICAgICAgICAgICAgICBuZXRsb2MsIHBhdGggPSBwYXRoWzI6XS5zcGxpdCgnLycsIDEpCiAgICAgICAgICAgICAgICBhdXRoLCBob3N0ID0gX3NwbGl0dXNlcihuZXRsb2MpCiAgICAgICAgICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBwdyA9IGF1dGguc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0lcyAtLXBhc3N3b3JkPSVzIiAlICh1c2VyLCBwdykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0iICsgYXV0aAogICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9IGhvc3QKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHAsIHEsIGYKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIHN1YnZlcnNpb24gY2hlY2tvdXQgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQlcyAtcSAlcyAlcyIgJSAoY3JlZHMsIHVybCwgZmlsZW5hbWUpKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9RmFsc2UpOgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5zcGxpdCgnKycsIDEpWy0xXQoKICAgICAgICAjIFNvbWUgZnJhZ21lbnQgaWRlbnRpZmljYXRpb24gZmFpbHMKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnIycsIDEpWzBdCgogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQoKICAgICAgICAjIEFsc28sIGRpc2NhcmQgZnJhZ21lbnQKICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCAnJykpCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBfZG93bmxvYWRfZ2l0KHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBnaXQgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJDaGVja2luZyBvdXQgJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiZ2l0IC1DICVzIGNoZWNrb3V0IC0tcXVpZXQgJXMiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaGcoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLl92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1UcnVlKQoKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIGhnIGNsb25lIGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgiaGcgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJVcGRhdGluZyB0byAlcyIsIHJldikKICAgICAgICAgICAgb3Muc3lzdGVtKCJoZyAtLWN3ZCAlcyB1cCAtQyAtciAlcyAtcSIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQoKICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCgogICAgZGVmIHdhcm4oc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLndhcm4obXNnLCAqYXJncykKCgojIFRoaXMgcGF0dGVybiBtYXRjaGVzIGEgY2hhcmFjdGVyIGVudGl0eSByZWZlcmVuY2UgKGEgZGVjaW1hbCBudW1lcmljCiMgcmVmZXJlbmNlcywgYSBoZXhhZGVjaW1hbCBudW1lcmljIHJlZmVyZW5jZSwgb3IgYSBuYW1lZCByZWZlcmVuY2UpLgplbnRpdHlfc3ViID0gcmUuY29tcGlsZShyJyYoIyhcZCt8eFtcZGEtZkEtRl0rKXxbXHcuOi1dKyk7PycpLnN1YgoKCmRlZiBkZWNvZGVfZW50aXR5KG1hdGNoKToKICAgIHdoYXQgPSBtYXRjaC5ncm91cCgwKQogICAgcmV0dXJuIHVuZXNjYXBlKHdoYXQpCgoKZGVmIGh0bWxkZWNvZGUodGV4dCk6CiAgICAiIiIKICAgIERlY29kZSBIVE1MIGVudGl0aWVzIGluIHRoZSBnaXZlbiB0ZXh0LgoKICAgID4+PiBodG1sZGVjb2RlKAogICAgLi4uICAgICAnaHR0cHM6Ly8uLi9wYWNrYWdlX25hbWUtMC4xLjIudGFyLmd6JwogICAgLi4uICAgICAnP3Rva2VuYT1BJmFtcDt0b2tlbmI9QiI+cGFja2FnZV9uYW1lLTAuMS4yLnRhci5neicpCiAgICAnaHR0cHM6Ly8uLi9wYWNrYWdlX25hbWUtMC4xLjIudGFyLmd6P3Rva2VuYT1BJnRva2VuYj1CIj5wYWNrYWdlX25hbWUtMC4xLjIudGFyLmd6JwogICAgIiIiCiAgICByZXR1cm4gZW50aXR5X3N1YihkZWNvZGVfZW50aXR5LCB0ZXh0KQoKCmRlZiBzb2NrZXRfdGltZW91dCh0aW1lb3V0PTE1KToKICAgIGRlZiBfc29ja2V0X3RpbWVvdXQoZnVuYyk6CiAgICAgICAgZGVmIF9zb2NrZXRfdGltZW91dCgqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCiAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob2xkX3RpbWVvdXQpCgogICAgICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCiAgICByZXR1cm4gX3NvY2tldF90aW1lb3V0CgoKZGVmIF9lbmNvZGVfYXV0aChhdXRoKToKICAgICIiIgogICAgQSBmdW5jdGlvbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMy0zLjMgdGhhdCB3aWxsIGVuY29kZQogICAgYXV0aCBmcm9tIGEgVVJMIHN1aXRhYmxlIGZvciBhbiBIVFRQIGhlYWRlci4KICAgID4+PiBzdHIoX2VuY29kZV9hdXRoKCd1c2VybmFtZSUzQXBhc3N3b3JkJykpCiAgICAnZFhObGNtNWhiV1U2Y0dGemMzZHZjbVE9JwoKICAgIExvbmcgYXV0aCBzdHJpbmdzIHNob3VsZCBub3QgY2F1c2UgYSBuZXdsaW5lIHRvIGJlIGluc2VydGVkLgogICAgPj4+IGxvbmdfYXV0aCA9ICd1c2VybmFtZTonICsgJ3Bhc3N3b3JkJyoxMAogICAgPj4+IGNocigxMCkgaW4gc3RyKF9lbmNvZGVfYXV0aChsb25nX2F1dGgpKQogICAgRmFsc2UKICAgICIiIgogICAgYXV0aF9zID0gdXJsbGliLnBhcnNlLnVucXVvdGUoYXV0aCkKICAgICMgY29udmVydCB0byBieXRlcwogICAgYXV0aF9ieXRlcyA9IGF1dGhfcy5lbmNvZGUoKQogICAgZW5jb2RlZF9ieXRlcyA9IGJhc2U2NC5iNjRlbmNvZGUoYXV0aF9ieXRlcykKICAgICMgY29udmVydCBiYWNrIHRvIGEgc3RyaW5nCiAgICBlbmNvZGVkID0gZW5jb2RlZF9ieXRlcy5kZWNvZGUoKQogICAgIyBzdHJpcCB0aGUgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuCiAgICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKCdcbicsICcnKQoKCmNsYXNzIENyZWRlbnRpYWw6CiAgICAiIiIKICAgIEEgdXNlcm5hbWUvcGFzc3dvcmQgcGFpci4gVXNlIGxpa2UgYSBuYW1lZHR1cGxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHlpZWxkIHNlbGYudXNlcm5hbWUKICAgICAgICB5aWVsZCBzZWxmLnBhc3N3b3JkCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclKHVzZXJuYW1lKXM6JShwYXNzd29yZClzJyAlIHZhcnMoc2VsZikKCgpjbGFzcyBQeVBJQ29uZmlnKGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvYWQgZnJvbSB+Ly5weXBpcmMKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0cyA9IGRpY3QuZnJvbWtleXMoWyd1c2VybmFtZScsICdwYXNzd29yZCcsICdyZXBvc2l0b3J5J10sICcnKQogICAgICAgIGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIuX19pbml0X18oc2VsZiwgZGVmYXVsdHMpCgogICAgICAgIHJjID0gb3MucGF0aC5qb2luKG9zLnBhdGguZXhwYW5kdXNlcignficpLCAnLnB5cGlyYycpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmMpOgogICAgICAgICAgICBzZWxmLnJlYWQocmMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY3JlZHNfYnlfcmVwb3NpdG9yeShzZWxmKToKICAgICAgICBzZWN0aW9uc193aXRoX3JlcG9zaXRvcmllcyA9IFsKICAgICAgICAgICAgc2VjdGlvbiBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zKCkKICAgICAgICAgICAgaWYgc2VsZi5nZXQoc2VjdGlvbiwgJ3JlcG9zaXRvcnknKS5zdHJpcCgpCiAgICAgICAgXQoKICAgICAgICByZXR1cm4gZGljdChtYXAoc2VsZi5fZ2V0X3JlcG9fY3JlZCwgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMpKQoKICAgIGRlZiBfZ2V0X3JlcG9fY3JlZChzZWxmLCBzZWN0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXQoc2VjdGlvbiwgJ3JlcG9zaXRvcnknKS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIHJlcG8sIENyZWRlbnRpYWwoCiAgICAgICAgICAgIHNlbGYuZ2V0KHNlY3Rpb24sICd1c2VybmFtZScpLnN0cmlwKCksCiAgICAgICAgICAgIHNlbGYuZ2V0KHNlY3Rpb24sICdwYXNzd29yZCcpLnN0cmlwKCksCiAgICAgICAgKQoKICAgIGRlZiBmaW5kX2NyZWRlbnRpYWwoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgVVJMIGluZGljYXRlZCBhcHBlYXJzIHRvIGJlIGEgcmVwb3NpdG9yeSBkZWZpbmVkIGluIHRoaXMKICAgICAgICBjb25maWcsIHJldHVybiB0aGUgY3JlZGVudGlhbCBmb3IgdGhhdCByZXBvc2l0b3J5LgogICAgICAgICIiIgogICAgICAgIGZvciByZXBvc2l0b3J5LCBjcmVkIGluIHNlbGYuY3JlZHNfYnlfcmVwb3NpdG9yeS5pdGVtcygpOgogICAgICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChyZXBvc2l0b3J5KToKICAgICAgICAgICAgICAgIHJldHVybiBjcmVkCgoKZGVmIG9wZW5fd2l0aF9hdXRoKHVybCwgb3BlbmVyPXVybGxpYi5yZXF1ZXN0LnVybG9wZW4pOgogICAgIiIiT3BlbiBhIHVybGxpYjIgcmVxdWVzdCwgaGFuZGxpbmcgSFRUUCBhdXRoZW50aWNhdGlvbiIiIgoKICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHBhcnNlZAoKICAgICMgRG91YmxlIHNjaGVtZSBkb2VzIG5vdCByYWlzZSBvbiBNYWMgT1MgWCBhcyByZXZlYWxlZCBieSBhCiAgICAjIGZhaWxpbmcgdGVzdC4gV2Ugd291bGQgZXhwZWN0ICJub25udW1lcmljIHBvcnQiLiBSZWZzICMyMC4KICAgIGlmIG5ldGxvYy5lbmRzd2l0aCgnOicpOgogICAgICAgIHJhaXNlIGh0dHBfY2xpZW50LkludmFsaWRVUkwoIm5vbm51bWVyaWMgcG9ydDogJyciKQoKICAgIGlmIHNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKICAgICAgICBhdXRoLCBhZGRyZXNzID0gX3NwbGl0dXNlcihuZXRsb2MpCiAgICBlbHNlOgogICAgICAgIGF1dGggPSBOb25lCgogICAgaWYgbm90IGF1dGg6CiAgICAgICAgY3JlZCA9IFB5UElDb25maWcoKS5maW5kX2NyZWRlbnRpYWwodXJsKQogICAgICAgIGlmIGNyZWQ6CiAgICAgICAgICAgIGF1dGggPSBzdHIoY3JlZCkKICAgICAgICAgICAgaW5mbyA9IGNyZWQudXNlcm5hbWUsIHVybAogICAgICAgICAgICBsb2cuaW5mbygnQXV0aGVudGljYXRpbmcgYXMgJXMgZm9yICVzIChmcm9tIC5weXBpcmMpJywgKmluZm8pCgogICAgaWYgYXV0aDoKICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBfZW5jb2RlX2F1dGgoYXV0aCkKICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgYWRkcmVzcywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZwogICAgICAgIG5ld191cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdChuZXdfdXJsKQogICAgICAgIHJlcXVlc3QuYWRkX2hlYWRlcigiQXV0aG9yaXphdGlvbiIsIGF1dGgpCiAgICBlbHNlOgogICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KHVybCkKCiAgICByZXF1ZXN0LmFkZF9oZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQogICAgZnAgPSBvcGVuZXIocmVxdWVzdCkKCiAgICBpZiBhdXRoOgogICAgICAgICMgUHV0IGF1dGhlbnRpY2F0aW9uIGluZm8gYmFjayBpbnRvIHJlcXVlc3QgVVJMIGlmIHNhbWUgaG9zdCwKICAgICAgICAjIHNvIHRoYXQgbGlua3MgZm91bmQgb24gdGhlIHBhZ2Ugd2lsbCB3b3JrCiAgICAgICAgczIsIGgyLCBwYXRoMiwgcGFyYW0yLCBxdWVyeTIsIGZyYWcyID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGZwLnVybCkKICAgICAgICBpZiBzMiA9PSBzY2hlbWUgYW5kIGgyID09IGFkZHJlc3M6CiAgICAgICAgICAgIHBhcnRzID0gczIsIG5ldGxvYywgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMgogICAgICAgICAgICBmcC51cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKCiAgICByZXR1cm4gZnAKCgojIGNvcHkgb2YgdXJsbGliLnBhcnNlLl9zcGxpdHVzZXIgZnJvbSBQeXRob24gMy44CmRlZiBfc3BsaXR1c2VyKGhvc3QpOgogICAgIiIic3BsaXR1c2VyKCd1c2VyWzpwYXNzd2RdQGhvc3RbOnBvcnRdJykgLS0+ICd1c2VyWzpwYXNzd2RdJywgJ2hvc3RbOnBvcnRdJy4iIiIKICAgIHVzZXIsIGRlbGltLCBob3N0ID0gaG9zdC5ycGFydGl0aW9uKCdAJykKICAgIHJldHVybiAodXNlciBpZiBkZWxpbSBlbHNlIE5vbmUpLCBob3N0CgoKIyBhZGRpbmcgYSB0aW1lb3V0IHRvIGF2b2lkIGZyZWV6aW5nIHBhY2thZ2VfaW5kZXgKb3Blbl93aXRoX2F1dGggPSBzb2NrZXRfdGltZW91dChfU09DS0VUX1RJTUVPVVQpKG9wZW5fd2l0aF9hdXRoKQoKCmRlZiBmaXhfc2ZfdXJsKHVybCk6CiAgICByZXR1cm4gdXJsICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCgpkZWYgbG9jYWxfb3Blbih1cmwpOgogICAgIiIiUmVhZCBhIGxvY2FsIHBhdGgsIHdpdGggc3BlY2lhbCBzdXBwb3J0IGZvciBkaXJlY3RvcmllcyIiIgogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBmaWxlbmFtZSA9IHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHVybCkKICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLycpIGFuZCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICBmaWxlcyA9IFtdCiAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihmaWxlbmFtZSk6CiAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGZpbGVuYW1lLCBmKQogICAgICAgICAgICBpZiBmID09ICdpbmRleC5odG1sJzoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3InKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnAucmVhZCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZmlsZXBhdGgpOgogICAgICAgICAgICAgICAgZiArPSAnLycKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCc8YSBocmVmPSJ7bmFtZX0iPntuYW1lfTwvYT4nLmZvcm1hdChuYW1lPWYpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPnt1cmx9PC90aXRsZT4iCiAgICAgICAgICAgICAgICAiPC9oZWFkPjxib2R5PntmaWxlc308L2JvZHk+PC9odG1sPiIpCiAgICAgICAgICAgIGJvZHkgPSB0bXBsLmZvcm1hdCh1cmw9dXJsLCBmaWxlcz0nXG4nLmpvaW4oZmlsZXMpKQogICAgICAgIHN0YXR1cywgbWVzc2FnZSA9IDIwMCwgIk9LIgogICAgZWxzZToKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UsIGJvZHkgPSA0MDQsICJQYXRoIG5vdCBmb3VuZCIsICJOb3QgZm91bmQiCgogICAgaGVhZGVycyA9IHsnY29udGVudC10eXBlJzogJ3RleHQvaHRtbCd9CiAgICBib2R5X3N0cmVhbSA9IHNpeC5TdHJpbmdJTyhib2R5KQogICAgcmV0dXJuIHVybGxpYi5lcnJvci5IVFRQRXJyb3IodXJsLCBzdGF0dXMsIG1lc3NhZ2UsIGhlYWRlcnMsIGJvZHlfc3RyZWFtKQpQSwMEFAAAAAAAAAAhAP4FRNTYBQAA2AUAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5IiIiCkNvbXBhdGliaWxpdHkgU3VwcG9ydCBmb3IgUHl0aG9uIDIuNyBhbmQgZWFybGllcgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IHBsYXRmb3JtCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgpkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAiIiIKICAgIEdpdmVuIGFuIEhUVFBNZXNzYWdlLCByZXR1cm4gYWxsIGhlYWRlcnMgbWF0Y2hpbmcgYSBnaXZlbiBrZXkuCiAgICAiIiIKICAgIHJldHVybiBtZXNzYWdlLmdldF9hbGwoa2V5KQoKCmlmIHNpeC5QWTI6CiAgICBkZWYgZ2V0X2FsbF9oZWFkZXJzKG1lc3NhZ2UsIGtleSk6CiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0aGVhZGVycyhrZXkpCgoKbGludXhfcHkyX2FzY2lpID0gKAogICAgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JyBhbmQKICAgIHNpeC5QWTIKKQoKcm10cmVlX3NhZmUgPSBzdHIgaWYgbGludXhfcHkyX2FzY2lpIGVsc2UgbGFtYmRhIHg6IHgKIiIiV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0NjcyIiIiCgoKdHJ5OgogICAgZnJvbSAuX2ltcCBpbXBvcnQgZmluZF9tb2R1bGUsIFBZX0NPTVBJTEVELCBQWV9GUk9aRU4sIFBZX1NPVVJDRQogICAgZnJvbSAuX2ltcCBpbXBvcnQgZ2V0X2Zyb3plbl9vYmplY3QsIGdldF9tb2R1bGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IGltcAogICAgZnJvbSBpbXAgaW1wb3J0IFBZX0NPTVBJTEVELCBQWV9GUk9aRU4sIFBZX1NPVVJDRSAgIyBub3FhCgogICAgZGVmIGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiSnVzdCBsaWtlICdpbXAuZmluZF9tb2R1bGUoKScsIGJ1dCB3aXRoIHBhY2thZ2Ugc3VwcG9ydCIiIgogICAgICAgIHBhcnRzID0gbW9kdWxlLnNwbGl0KCcuJykKICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgcGFydCA9IHBhcnRzLnBvcCgwKQogICAgICAgICAgICBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCgogICAgICAgICAgICBpZiBraW5kID09IGltcC5QS0dfRElSRUNUT1JZOgogICAgICAgICAgICAgICAgcGFydHMgPSBwYXJ0cyBvciBbJ19faW5pdF9fJ10KICAgICAgICAgICAgICAgIHBhdGhzID0gW3BhdGhdCgogICAgICAgICAgICBlbGlmIHBhcnRzOgogICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXIgaW4gJXMiICUgKHBhcnRzLCBtb2R1bGUpKQoKICAgICAgICByZXR1cm4gaW5mbwoKICAgIGRlZiBnZXRfZnJvemVuX29iamVjdChtb2R1bGUsIHBhdGhzKToKICAgICAgICByZXR1cm4gaW1wLmdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSkKCiAgICBkZWYgZ2V0X21vZHVsZShtb2R1bGUsIHBhdGhzLCBpbmZvKToKICAgICAgICBpbXAubG9hZF9tb2R1bGUobW9kdWxlLCAqaW5mbykKICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbbW9kdWxlXQpQSwMEFAAAAAAAAAAhAN7LMOJGAwAARgMAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTMxY29tcGF0LnB5X19hbGxfXyA9IFtdCgpfX21ldGFjbGFzc19fID0gdHlwZQoKCnRyeToKICAgICMgUHl0aG9uID49My4yCiAgICBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHNodXRpbAogICAgaW1wb3J0IHRlbXBmaWxlCgogICAgY2xhc3MgVGVtcG9yYXJ5RGlyZWN0b3J5OgogICAgICAgICIiIgogICAgICAgIFZlcnkgc2ltcGxlIHRlbXBvcmFyeSBkaXJlY3RvcnkgY29udGV4dCBtYW5hZ2VyLgogICAgICAgIFdpbGwgdHJ5IHRvIGRlbGV0ZSBhZnRlcndhcmQsIGJ1dCB3aWxsIGFsc28gaWdub3JlIE9TIGFuZCBzaW1pbGFyCiAgICAgICAgZXJyb3JzIG9uIGRlbGV0aW9uLgogICAgICAgICIiIgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lICAjIEhhbmRsZSBta2R0ZW1wIHJhaXNpbmcgYW4gZXhjZXB0aW9uCiAgICAgICAgICAgIHNlbGYubmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoKiprd2FyZ3MpCgogICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y3R5cGUsIGV4Y3ZhbHVlLCBleGN0cmFjZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5uYW1lLCBUcnVlKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogICMgcmVtb3ZhbCBlcnJvcnMgYXJlIG5vdCB0aGUgb25seSBwb3NzaWJsZQogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lClBLAwQUAAAAAAAAACEAB2HYojIFAAAyBQAAPQAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzNjb21wYXQucHlpbXBvcnQgZGlzCmltcG9ydCBhcnJheQppbXBvcnQgY29sbGVjdGlvbnMKCnRyeToKICAgIGltcG9ydCBodG1sCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGh0bWwgPSBOb25lCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGh0bWxfcGFyc2VyCgpfX21ldGFjbGFzc19fID0gdHlwZQoKT3BBcmcgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdPcEFyZycsICdvcGNvZGUgYXJnJykKCgpjbGFzcyBCeXRlY29kZV9jb21wYXQ6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSk6CiAgICAgICAgc2VsZi5jb2RlID0gY29kZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCAnKG9wLGFyZyknIHBhaXIgZm9yIGVhY2ggb3BlcmF0aW9uIGluIGNvZGUgb2JqZWN0ICdjb2RlJyIiIgoKICAgICAgICBieXRlcyA9IGFycmF5LmFycmF5KCdiJywgc2VsZi5jb2RlLmNvX2NvZGUpCiAgICAgICAgZW9mID0gbGVuKHNlbGYuY29kZS5jb19jb2RlKQoKICAgICAgICBwdHIgPSAwCiAgICAgICAgZXh0ZW5kZWRfYXJnID0gMAoKICAgICAgICB3aGlsZSBwdHIgPCBlb2Y6CgogICAgICAgICAgICBvcCA9IGJ5dGVzW3B0cl0KCiAgICAgICAgICAgIGlmIG9wID49IGRpcy5IQVZFX0FSR1VNRU5UOgoKICAgICAgICAgICAgICAgIGFyZyA9IGJ5dGVzW3B0ciArIDFdICsgYnl0ZXNbcHRyICsgMl0gKiAyNTYgKyBleHRlbmRlZF9hcmcKICAgICAgICAgICAgICAgIHB0ciArPSAzCgogICAgICAgICAgICAgICAgaWYgb3AgPT0gZGlzLkVYVEVOREVEX0FSRzoKICAgICAgICAgICAgICAgICAgICBsb25nX3R5cGUgPSBzaXguaW50ZWdlcl90eXBlc1stMV0KICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmcgPSBhcmcgKiBsb25nX3R5cGUoNjU1MzYpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmcgPSBOb25lCiAgICAgICAgICAgICAgICBwdHIgKz0gMQoKICAgICAgICAgICAgeWllbGQgT3BBcmcob3AsIGFyZykKCgpCeXRlY29kZSA9IGdldGF0dHIoZGlzLCAnQnl0ZWNvZGUnLCBCeXRlY29kZV9jb21wYXQpCgoKdW5lc2NhcGUgPSBnZXRhdHRyKGh0bWwsICd1bmVzY2FwZScsIE5vbmUpCmlmIHVuZXNjYXBlIGlzIE5vbmU6CiAgICAjIEhUTUxQYXJzZXIudW5lc2NhcGUgaXMgZGVwcmVjYXRlZCBzaW5jZSBQeXRob24gMy40LCBhbmQgd2lsbCBiZSByZW1vdmVkCiAgICAjIGZyb20gMy45LgogICAgdW5lc2NhcGUgPSBodG1sX3BhcnNlci5IVE1MUGFyc2VyKCkudW5lc2NhcGUKUEsDBBQAAAAAAAAAIQCOVtBE9QAAAPUAAAA9AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzNGNvbXBhdC5weWltcG9ydCBpbXBvcnRsaWIKCnRyeToKICAgIGltcG9ydCBpbXBvcnRsaWIudXRpbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgoKdHJ5OgogICAgbW9kdWxlX2Zyb21fc3BlYyA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgZGVmIG1vZHVsZV9mcm9tX3NwZWMoc3BlYyk6CiAgICAgICAgcmV0dXJuIHNwZWMubG9hZGVyLmxvYWRfbW9kdWxlKHNwZWMubmFtZSkKUEsDBBQAAAAAAAAAIQCMU5pjxDcAAMQ3AAA6AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2FuZGJveC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgcGlja2xlCmltcG9ydCB0ZXh0d3JhcAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBidWlsdGlucywgbWFwCgppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IG9yZy5weXRob24ubW9kdWxlcy5wb3NpeC5Qb3NpeE1vZHVsZSBhcyBfb3MKZWxzZToKICAgIF9vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCnRyeToKICAgIF9maWxlID0gZmlsZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2ZpbGUgPSBOb25lCl9vcGVuID0gb3Blbgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQKCgpfX2FsbF9fID0gWwogICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKXQoKCmRlZiBfZXhlY2ZpbGUoZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2Fscz1Ob25lKToKICAgICIiIgogICAgUHl0aG9uIDMgaW1wbGVtZW50YXRpb24gb2YgZXhlY2ZpbGUuCiAgICAiIiIKICAgIG1vZGUgPSAncmInCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsIG1vZGUpIGFzIHN0cmVhbToKICAgICAgICBzY3JpcHQgPSBzdHJlYW0ucmVhZCgpCiAgICBpZiBsb2NhbHMgaXMgTm9uZToKICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCiAgICBjb2RlID0gY29tcGlsZShzY3JpcHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9hcmd2KHJlcGw9Tm9uZSk6CiAgICBzYXZlZCA9IHN5cy5hcmd2WzpdCiAgICBpZiByZXBsIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5hcmd2WzpdID0gcmVwbAogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wYXRoKCk6CiAgICBzYXZlZCA9IHN5cy5wYXRoWzpdCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvdmVycmlkZV90ZW1wKHJlcGxhY2VtZW50KToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHRlbXBmaWxlLnRlbXBkaXIgd2l0aCByZXBsYWNlbWVudCwgZW5zdXJpbmcgaXQgZXhpc3RzCiAgICAiIiIKICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhyZXBsYWNlbWVudCwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBzYXZlZCA9IHRlbXBmaWxlLnRlbXBkaXIKCiAgICB0ZW1wZmlsZS50ZW1wZGlyID0gcmVwbGFjZW1lbnQKCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHB1c2hkKHRhcmdldCk6CiAgICBzYXZlZCA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcih0YXJnZXQpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoc2F2ZWQpCgoKY2xhc3MgVW5waWNrbGVhYmxlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEFuIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgYW5vdGhlciBFeGNlcHRpb24gdGhhdCBjb3VsZCBub3QgYmUgcGlja2xlZC4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkdW1wKHR5cGUsIGV4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQWx3YXlzIHJldHVybiBhIGR1bXBlZCAocGlja2xlZCkgdHlwZSBhbmQgZXhjLiBJZiBleGMgY2FuJ3QgYmUgcGlja2xlZCwKICAgICAgICB3cmFwIGl0IGluIFVucGlja2xlYWJsZUV4Y2VwdGlvbiBmaXJzdC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHModHlwZSksIHBpY2tsZS5kdW1wcyhleGMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBnZXQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGluc2lkZSB0aGUgc2FuZGJveAogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGFzIGNscwogICAgICAgICAgICByZXR1cm4gY2xzLmR1bXAoY2xzLCBjbHMocmVwcihleGMpKSkKCgpjbGFzcyBFeGNlcHRpb25TYXZlcjoKICAgICIiIgogICAgQSBDb250ZXh0IE1hbmFnZXIgdGhhdCB3aWxsIHNhdmUgYW4gZXhjZXB0aW9uLCBzZXJpYWxpemVkLCBhbmQgcmVzdG9yZSBpdAogICAgbGF0ZXIuCiAgICAiIiIKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIGV4YywgdGIpOgogICAgICAgIGlmIG5vdCBleGM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIGR1bXAgdGhlIGV4Y2VwdGlvbgogICAgICAgIHNlbGYuX3NhdmVkID0gVW5waWNrbGVhYmxlRXhjZXB0aW9uLmR1bXAodHlwZSwgZXhjKQogICAgICAgIHNlbGYuX3RiID0gdGIKCiAgICAgICAgIyBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVzdW1lKHNlbGYpOgogICAgICAgICJyZXN0b3JlIGFuZCByZS1yYWlzZSBhbnkgZXhjZXB0aW9uIgoKICAgICAgICBpZiAnX3NhdmVkJyBub3QgaW4gdmFycyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHR5cGUsIGV4YyA9IG1hcChwaWNrbGUubG9hZHMsIHNlbGYuX3NhdmVkKQogICAgICAgIHNpeC5yZXJhaXNlKHR5cGUsIGV4Yywgc2VsZi5fdGIpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfbW9kdWxlcygpOgogICAgIiIiCiAgICBDb250ZXh0IGluIHdoaWNoIGltcG9ydGVkIG1vZHVsZXMgYXJlIHNhdmVkLgoKICAgIFRyYW5zbGF0ZXMgZXhjZXB0aW9ucyBpbnRlcm5hbCB0byB0aGUgY29udGV4dCBpbnRvIHRoZSBlcXVpdmFsZW50IGV4Y2VwdGlvbgogICAgb3V0c2lkZSB0aGUgY29udGV4dC4KICAgICIiIgogICAgc2F2ZWQgPSBzeXMubW9kdWxlcy5jb3B5KCkKICAgIHdpdGggRXhjZXB0aW9uU2F2ZXIoKSBhcyBzYXZlZF9leGM6CiAgICAgICAgeWllbGQgc2F2ZWQKCiAgICBzeXMubW9kdWxlcy51cGRhdGUoc2F2ZWQpCiAgICAjIHJlbW92ZSBhbnkgbW9kdWxlcyBpbXBvcnRlZCBzaW5jZQogICAgZGVsX21vZHVsZXMgPSAoCiAgICAgICAgbW9kX25hbWUgZm9yIG1vZF9uYW1lIGluIHN5cy5tb2R1bGVzCiAgICAgICAgaWYgbW9kX25hbWUgbm90IGluIHNhdmVkCiAgICAgICAgIyBleGNsdWRlIGFueSBlbmNvZGluZ3MgbW9kdWxlcy4gU2VlICMyODUKICAgICAgICBhbmQgbm90IG1vZF9uYW1lLnN0YXJ0c3dpdGgoJ2VuY29kaW5ncy4nKQogICAgKQogICAgX2NsZWFyX21vZHVsZXMoZGVsX21vZHVsZXMpCgogICAgc2F2ZWRfZXhjLnJlc3VtZSgpCgoKZGVmIF9jbGVhcl9tb2R1bGVzKG1vZHVsZV9uYW1lcyk6CiAgICBmb3IgbW9kX25hbWUgaW4gbGlzdChtb2R1bGVfbmFtZXMpOgogICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RfbmFtZV0KCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICBzYXZlZCA9IHBrZ19yZXNvdXJjZXMuX19nZXRzdGF0ZV9fKCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBwa2dfcmVzb3VyY2VzLl9fc2V0c3RhdGVfXyhzYXZlZCkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgdGVtcF9kaXIgPSBvcy5wYXRoLmpvaW4oc2V0dXBfZGlyLCAndGVtcCcpCiAgICB3aXRoIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgICAgIHdpdGggc2F2ZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGhpZGVfc2V0dXB0b29scygpCiAgICAgICAgICAgIHdpdGggc2F2ZV9wYXRoKCk6CiAgICAgICAgICAgICAgICB3aXRoIHNhdmVfYXJndigpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3ZlcnJpZGVfdGVtcCh0ZW1wX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcHVzaGQoc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW5zdXJlIHNldHVwdG9vbHMgY29tbWFuZHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXygnc2V0dXB0b29scycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZAoKCmRlZiBfbmVlZHNfaGlkaW5nKG1vZF9uYW1lKToKICAgICIiIgogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3BrZ19yZXNvdXJjZXMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHNfcGx1Z2luJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scy5fX2luaXRfXycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnZGlzdHV0aWxzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdvcycpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ0N5dGhvbicpCiAgICBUcnVlCiAgICAiIiIKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInKHNldHVwdG9vbHN8cGtnX3Jlc291cmNlc3xkaXN0dXRpbHN8Q3l0aG9uKShcLnwkKScpCiAgICByZXR1cm4gYm9vbChwYXR0ZXJuLm1hdGNoKG1vZF9uYW1lKSkKCgpkZWYgaGlkZV9zZXR1cHRvb2xzKCk6CiAgICAiIiIKICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHNldHVwdG9vbHMnIG1vZHVsZXMgZnJvbSBzeXMubW9kdWxlcyB0byBhbGxvdyB0aGUKICAgIGludm9jYXRpb24gdG8gaW1wb3J0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIHNldHVwdG9vbHMuIFRoaXMgdGVjaG5pcXVlIGlzCiAgICBuZWNlc3NhcnkgdG8gYXZvaWQgaXNzdWVzIHN1Y2ggYXMgIzMxNSB3aGVyZSBzZXR1cHRvb2xzIHVwZ3JhZGluZyBpdHNlbGYKICAgIHdvdWxkIGZhaWwgdG8gZmluZCBhIGZ1bmN0aW9uIGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KICAgICIiIgogICAgbW9kdWxlcyA9IGZpbHRlcihfbmVlZHNfaGlkaW5nLCBzeXMubW9kdWxlcykKICAgIF9jbGVhcl9tb2R1bGVzKG1vZHVsZXMpCgoKZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgogICAgIiIiUnVuIGEgZGlzdHV0aWxzIHNldHVwIHNjcmlwdCwgc2FuZGJveGVkIGluIGl0cyBkaXJlY3RvcnkiIiIKICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgIHdpdGggc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XSArIGxpc3QoYXJncykKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKICAgICAgICAgICAgIyByZXNldCB0byBpbmNsdWRlIHNldHVwIGRpciwgdy9jbGVhbiBjYWxsYmFjayBsaXN0CiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgd29ya2luZ19zZXQuY2FsbGJhY2tzLmFwcGVuZChsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQoKICAgICAgICAgICAgIyBfX2ZpbGVfXyBzaG91bGQgYmUgYSBieXRlIHN0cmluZyBvbiBQeXRob24gMiAoIzcxMikKICAgICAgICAgICAgZHVuZGVyX2ZpbGUgPSAoCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0dXBfc2NyaXB0LCBzdHIpIGVsc2UKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdC5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICApCgogICAgICAgICAgICB3aXRoIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgIG5zID0gZGljdChfX2ZpbGVfXz1kdW5kZXJfZmlsZSwgX19uYW1lX189J19fbWFpbl9fJykKICAgICAgICAgICAgICAgIF9leGVjZmlsZShzZXR1cF9zY3JpcHQsIG5zKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBOb3JtYWwgZXhpdCwganVzdCByZXR1cm4KCgpjbGFzcyBBYnN0cmFjdFNhbmRib3g6CiAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgoKICAgIF9hY3RpdmUgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9hdHRycyA9IFsKICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZiwgbmFtZSkKICAgICAgICBdCgogICAgZGVmIF9jb3B5KHNlbGYsIHNvdXJjZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CiAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLCBuYW1lKSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvcHkoc2VsZikKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IHNlbGYuX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gc2VsZi5fb3BlbgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gX29wZW4KICAgICAgICBzZWxmLl9jb3B5KF9vcykKCiAgICBkZWYgcnVuKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgogICAgICAgIHdpdGggc2VsZjoKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQoKICAgIGRlZiBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgc3JjLCBkc3QgPSBzZWxmLl9yZW1hcF9wYWlyKG5hbWUsIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHNyYywgZHN0LCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgogICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgb3IgZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgaWYgX2ZpbGU6CiAgICAgICAgX2ZpbGUgPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9maWxlKQogICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignb3BlbicsIF9vcGVuKQogICAgZm9yIG5hbWUgaW4gWwogICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCiAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCiAgICAgICAgInN0YXJ0ZmlsZSIsICJta2ZpZm8iLCAibWtub2QiLCAicGF0aGNvbmYiLCAiYWNjZXNzIgogICAgXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpKQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKCiAgICBkZWYgX21rX3F1ZXJ5KG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgcmV0dmFsKQogICAgICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydnZXRjd2QnLCAndG1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19xdWVyeShuYW1lKQoKICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy1mcm9tJywgc3JjLCAqYXJncywgKiprdyksCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctdG8nLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICkKCgppZiBoYXNhdHRyKG9zLCAnZGV2bnVsbCcpOgogICAgX0VYQ0VQVElPTlMgPSBbb3MuZGV2bnVsbCxdCmVsc2U6CiAgICBfRVhDRVBUSU9OUyA9IFtdCgoKY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgogICAgIiIiUmVzdHJpY3Qgb3BlcmF0aW9ucyB0byBhIHNpbmdsZSBzdWJkaXJlY3RvcnkgLSBwc2V1ZG8tY2hyb290IiIiCgogICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCiAgICAgICAgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLCAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsCiAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAogICAgXSkKCiAgICBfZXhjZXB0aW9uX3BhdHRlcm5zID0gWwogICAgICAgICMgQWxsb3cgbGliMnRvMyB0byBhdHRlbXB0IHRvIHNhdmUgYSBwaWNrbGVkIGdyYW1tYXIgb2JqZWN0ICgjMTIxKQogICAgICAgIHInLipsaWIydG8zLipcLnBpY2tsZSQnLAogICAgXQogICAgImV4ZW1wdCB3cml0aW5nIHRvIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNhbmRib3gsIGV4Y2VwdGlvbnM9X0VYQ0VQVElPTlMpOgogICAgICAgIHNlbGYuX3NhbmRib3ggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoc2FuZGJveCkpCiAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsICcnKQogICAgICAgIHNlbGYuX2V4Y2VwdGlvbnMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZXhjZXB0aW9ucwogICAgICAgIF0KICAgICAgICBBYnN0cmFjdFNhbmRib3guX19pbml0X18oc2VsZikKCiAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgU2FuZGJveFZpb2xhdGlvbgogICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKCiAgICBpZiBfZmlsZToKCiAgICAgICAgZGVmIF9maWxlKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigiZmlsZSIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gX2ZpbGUocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29wZW4ocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIHRtcG5hbShzZWxmKToKICAgICAgICBzZWxmLl92aW9sYXRpb24oInRtcG5hbSIpCgogICAgZGVmIF9vayhzZWxmLCBwYXRoKToKICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VsZi5fZXhlbXB0ZWQocmVhbHBhdGgpCiAgICAgICAgICAgICAgICBvciByZWFscGF0aCA9PSBzZWxmLl9zYW5kYm94CiAgICAgICAgICAgICAgICBvciByZWFscGF0aC5zdGFydHN3aXRoKHNlbGYuX3ByZWZpeCkKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IGFjdGl2ZQoKICAgIGRlZiBfZXhlbXB0ZWQoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgIHN0YXJ0X21hdGNoZXMgPSAoCiAgICAgICAgICAgIGZpbGVwYXRoLnN0YXJ0c3dpdGgoZXhjZXB0aW9uKQogICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIHNlbGYuX2V4Y2VwdGlvbnMKICAgICAgICApCiAgICAgICAgcGF0dGVybl9tYXRjaGVzID0gKAogICAgICAgICAgICByZS5tYXRjaChwYXR0ZXJuLCBmaWxlcGF0aCkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5fZXhjZXB0aW9uX3BhdHRlcm5zCiAgICAgICAgKQogICAgICAgIGNhbmRpZGF0ZXMgPSBpdGVydG9vbHMuY2hhaW4oc3RhcnRfbWF0Y2hlcywgcGF0dGVybl9tYXRjaGVzKQogICAgICAgIHJldHVybiBhbnkoY2FuZGlkYXRlcykKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgb3MucGF0aC5yZWFscGF0aChwYXRoKSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9vayhzcmMpIG9yIG5vdCBzZWxmLl9vayhkc3QpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIChzcmMsIGRzdCkKCiAgICBkZWYgb3BlbihzZWxmLCBmaWxlLCBmbGFncywgbW9kZT0wbzc3NywgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgbG93LWxldmVsIG9zLm9wZW4oKSIiIgogICAgICAgIGlmIGZsYWdzICYgV1JJVEVfRkxBR1MgYW5kIG5vdCBzZWxmLl9vayhmaWxlKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcy5vcGVuIiwgZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3Mub3BlbihmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCgoKV1JJVEVfRkxBR1MgPSBmdW5jdG9vbHMucmVkdWNlKAogICAgb3BlcmF0b3Iub3JfLCBbZ2V0YXR0cihfb3MsIGEsIDApIGZvciBhIGluCiAgICAgICAgIk9fV1JPTkxZIE9fUkRXUiBPX0FQUEVORCBPX0NSRUFUIE9fVFJVTkMgT19URU1QT1JBUlkiLnNwbGl0KCldCikKCgpjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgoKICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgU2FuZGJveFZpb2xhdGlvbjoge2NtZH17YXJncyFyfSB7a3dhcmdzfQoKICAgICAgICBUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KICAgICAgICB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBFYXN5SW5zdGFsbCBidWlsZCBhcmVhLCBhbmQgaGFzIGJlZW4gYWJvcnRlZC4KCiAgICAgICAgVGhpcyBwYWNrYWdlIGNhbm5vdCBiZSBzYWZlbHkgaW5zdGFsbGVkIGJ5IEVhc3lJbnN0YWxsLCBhbmQgbWF5IG5vdAogICAgICAgIHN1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAogICAgICAgIHNjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCiAgICAgICAgbWFpbnRhaW5lcnMgdG8gZmluZCBvdXQgaWYgYSBmaXggb3Igd29ya2Fyb3VuZCBpcyBhdmFpbGFibGUuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGNtZCwgYXJncywga3dhcmdzID0gc2VsZi5hcmdzCiAgICAgICAgcmV0dXJuIHNlbGYudG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQCoM7S+igAAAIoAAAA7AAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2NyaXB0LnRtcGwjIEVBU1ktSU5TVEFMTC1TQ1JJUFQ6ICUoc3BlYylyLCUoc2NyaXB0X25hbWUpcgpfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKQpQSwMEFAAAAAAAAAAhAK0qgzb+CAAA/ggAAD0AAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5ZGVmIF9fYm9vdCgpOgogICAgaW1wb3J0IHN5cwogICAgaW1wb3J0IG9zCiAgICBQWVRIT05QQVRIID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogICAgaWYgUFlUSE9OUEFUSCBpcyBOb25lIG9yIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgogICAgICAgIFBZVEhPTlBBVEggPSBbXQogICAgZWxzZToKICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQoKICAgIHBpYyA9IGdldGF0dHIoc3lzLCAncGF0aF9pbXBvcnRlcl9jYWNoZScsIHt9KQogICAgc3RkcGF0aCA9IHN5cy5wYXRoW2xlbihQWVRIT05QQVRIKTpdCiAgICBteWRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKCiAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgogICAgICAgIGlmIGl0ZW0gPT0gbXlkaXIgb3Igbm90IGl0ZW06CiAgICAgICAgICAgIGNvbnRpbnVlICAjIHNraXAgaWYgY3VycmVudCBkaXIuIG9uIFdpbmRvd3MsIG9yIG15IG93biBkaXJlY3RvcnkKICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKICAgICAgICBpZiBpbXBvcnRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZSgnc2l0ZScpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBpbXAgICMgQXZvaWQgaW1wb3J0IGxvb3AgaW4gUHl0aG9uIDMKICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLCBbaXRlbV0pCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHN0cmVhbSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLCBzdHJlYW0sIHBhdGgsIGRlc2NyKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNvdWxkbid0IGZpbmQgdGhlIHJlYWwgJ3NpdGUnIG1vZHVsZSIpCgogICAga25vd25fcGF0aHMgPSBkaWN0KFsobWFrZXBhdGgoaXRlbSlbMV0sIDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgICMgMi4yIGNvbXAKCiAgICBvbGRwb3MgPSBnZXRhdHRyKHN5cywgJ19fZWdnaW5zZXJ0JywgMCkgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCiAgICBzeXMuX19lZ2dpbnNlcnQgPSAwICAjIGFuZCByZXNldCB0aGUgY3VycmVudCBvbmUKCiAgICBmb3IgaXRlbSBpbiBQWVRIT05QQVRIOgogICAgICAgIGFkZHNpdGVkaXIoaXRlbSkKCiAgICBzeXMuX19lZ2dpbnNlcnQgKz0gb2xkcG9zICAjIHJlc3RvcmUgZWZmZWN0aXZlIG9sZCBwb3NpdGlvbgoKICAgIGQsIG5kID0gbWFrZXBhdGgoc3RkcGF0aFswXSkKICAgIGluc2VydF9hdCA9IE5vbmUKICAgIG5ld19wYXRoID0gW10KCiAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKICAgICAgICBwLCBucCA9IG1ha2VwYXRoKGl0ZW0pCgogICAgICAgIGlmIG5wID09IG5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKICAgICAgICAgICAgIyBXZSd2ZSBoaXQgdGhlIGZpcnN0ICdzeXN0ZW0nIHBhdGggZW50cnksIHNvIGFkZGVkIGVudHJpZXMgZ28gaGVyZQogICAgICAgICAgICBpbnNlcnRfYXQgPSBsZW4obmV3X3BhdGgpCgogICAgICAgIGlmIG5wIGluIGtub3duX3BhdGhzIG9yIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICBuZXdfcGF0aC5hcHBlbmQoaXRlbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG5ldyBwYXRoIGFmdGVyIHRoZSBpbnNlcnQgcG9pbnQsIGJhY2staW5zZXJ0IGl0CiAgICAgICAgICAgIG5ld19wYXRoLmluc2VydChpbnNlcnRfYXQsIGl0ZW0pCiAgICAgICAgICAgIGluc2VydF9hdCArPSAxCgogICAgc3lzLnBhdGhbOl0gPSBuZXdfcGF0aAoKCmlmIF9fbmFtZV9fID09ICdzaXRlJzoKICAgIF9fYm9vdCgpCiAgICBkZWwgX19ib290ClBLAwQUAAAAAAAAACEAzpU0ji0hAAAtIQAAPgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5aW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IGF0ZXhpdAppbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgaHR0cF9jbGllbnQsIG1hcCwgZmlsdGVyCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCl9fYWxsX18gPSBbCiAgICAnVmVyaWZ5aW5nSFRUUFNIYW5kbGVyJywgJ2ZpbmRfY2FfYnVuZGxlJywgJ2lzX2F2YWlsYWJsZScsICdjZXJ0X3BhdGhzJywKICAgICdvcGVuZXJfZm9yJwpdCgpjZXJ0X3BhdGhzID0gIiIiCi9ldGMvcGtpL3Rscy9jZXJ0cy9jYS1idW5kbGUuY3J0Ci9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQKL3Vzci9zaGFyZS9zc2wvY2VydHMvY2EtYnVuZGxlLmNydAovdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QuY3J0Ci9ldGMvc3NsL2NlcnQucGVtCi9TeXN0ZW0vTGlicmFyeS9PcGVuU1NML2NlcnRzL2NlcnQucGVtCi91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC1uc3MuY3J0Ci9ldGMvc3NsL2NhLWJ1bmRsZS5wZW0KIiIiLnN0cmlwKCkuc3BsaXQoKQoKdHJ5OgogICAgSFRUUFNIYW5kbGVyID0gdXJsbGliLnJlcXVlc3QuSFRUUFNIYW5kbGVyCiAgICBIVFRQU0Nvbm5lY3Rpb24gPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24KZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgSFRUUFNIYW5kbGVyID0gSFRUUFNDb25uZWN0aW9uID0gb2JqZWN0Cgppc19hdmFpbGFibGUgPSBzc2wgaXMgbm90IE5vbmUgYW5kIG9iamVjdCBub3QgaW4gKEhUVFBTSGFuZGxlciwgSFRUUFNDb25uZWN0aW9uKQoKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yCiAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIENlcnRpZmljYXRlRXJyb3IgPSBOb25lCiAgICAgICAgbWF0Y2hfaG9zdG5hbWUgPSBOb25lCgppZiBub3QgQ2VydGlmaWNhdGVFcnJvcjoKCiAgICBjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCgppZiBub3QgbWF0Y2hfaG9zdG5hbWU6CgogICAgZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxMjUjc2VjdGlvbi02LjQuMwogICAgICAgICIiIgogICAgICAgIHBhdHMgPSBbXQogICAgICAgIGlmIG5vdCBkbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgUG9ydGVkIGZyb20gcHl0aG9uMy1zeW50YXg6CiAgICAgICAgIyBsZWZ0bW9zdCwgKnJlbWFpbmRlciA9IGRuLnNwbGl0KHInLicpCiAgICAgICAgcGFydHMgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIGxlZnRtb3N0ID0gcGFydHNbMF0KICAgICAgICByZW1haW5kZXIgPSBwYXJ0c1sxOl0KCiAgICAgICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgICAgIGlmIHdpbGRjYXJkcyA+IG1heF93aWxkY2FyZHM6CiAgICAgICAgICAgICMgSXNzdWUgIzE3OTgwOiBhdm9pZCBkZW5pYWxzIG9mIHNlcnZpY2UgYnkgcmVmdXNpbmcgbW9yZQogICAgICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgICAgICMgcG9saWN5IGFtb25nIFNTTCBpbXBsZW1lbnRhdGlvbnMgc2hvd2VkIGl0IHRvIGJlIGEKICAgICAgICAgICAgIyByZWFzb25hYmxlIGNob2ljZS4KICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgICAgICJ0b28gbWFueSB3aWxkY2FyZHMgaW4gY2VydGlmaWNhdGUgRE5TIG5hbWU6ICIgKyByZXByKGRuKSkKCiAgICAgICAgIyBzcGVlZCB1cCBjb21tb24gY2FzZSB3L28gd2lsZGNhcmRzCiAgICAgICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICAgICAgcmV0dXJuIGRuLmxvd2VyKCkgPT0gaG9zdG5hbWUubG93ZXIoKQoKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDEuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAgICAgIyB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGNvbXByaXNlcyBhIGxhYmVsIG90aGVyIHRoYW4gdGhlIGxlZnQtbW9zdCBsYWJlbC4KICAgICAgICBpZiBsZWZ0bW9zdCA9PSAnKic6CiAgICAgICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICAgICAjIGZyYWdtZW50LgogICAgICAgICAgICBwYXRzLmFwcGVuZCgnW14uXSsnKQogICAgICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAzLgogICAgICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIKICAgICAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgICAgICMgVS1sYWJlbCBvZiBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZS4KICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSwgJyonIG1hdGNoZXMgYW55IGRvdGxlc3Mgc3RyaW5nLCBlLmcuIHd3dyoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGxlZnRtb3N0KS5yZXBsYWNlKHInXConLCAnW14uXSonKSkKCiAgICAgICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICAgICAgZm9yIGZyYWcgaW4gcmVtYWluZGVyOgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUoZnJhZykpCgogICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICAgICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKCiAgICBkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgICAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgICAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlIikKICAgICAgICBkbnNuYW1lcyA9IFtdCiAgICAgICAgc2FuID0gY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2FuOgogICAgICAgICAgICBpZiBrZXkgPT0gJ0ROUyc6CiAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIG5vdCBkbnNuYW1lczoKICAgICAgICAgICAgIyBUaGUgc3ViamVjdCBpcyBvbmx5IGNoZWNrZWQgd2hlbiB0aGVyZSBpcyBubyBkTlNOYW1lIGVudHJ5CiAgICAgICAgICAgICMgaW4gc3ViamVjdEFsdE5hbWUKICAgICAgICAgICAgZm9yIHN1YiBpbiBjZXJ0LmdldCgnc3ViamVjdCcsICgpKToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHN1YjoKICAgICAgICAgICAgICAgICAgICAjIFhYWCBhY2NvcmRpbmcgdG8gUkZDIDI4MTgsIHRoZSBtb3N0IHNwZWNpZmljIENvbW1vbiBOYW1lCiAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tb25OYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbGVuKGRuc25hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoIGVpdGhlciBvZiAlcyIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCAnLCAnLmpvaW4obWFwKHJlcHIsIGRuc25hbWVzKSkpKQogICAgICAgIGVsaWYgbGVuKGRuc25hbWVzKSA9PSAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCAlciIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCBkbnNuYW1lc1swXSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigibm8gYXBwcm9wcmlhdGUgY29tbW9uTmFtZSBvciAiCiAgICAgICAgICAgICAgICAic3ViamVjdEFsdE5hbWUgZmllbGRzIHdlcmUgZm91bmQiKQoKCmNsYXNzIFZlcmlmeWluZ0hUVFBTSGFuZGxlcihIVFRQU0hhbmRsZXIpOgogICAgIiIiU2ltcGxlIHZlcmlmeWluZyBoYW5kbGVyOiBubyBhdXRoLCBzdWJjbGFzc2VzLCB0aW1lb3V0cywgZXRjLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYV9idW5kbGUpOgogICAgICAgIHNlbGYuY2FfYnVuZGxlID0gY2FfYnVuZGxlCiAgICAgICAgSFRUUFNIYW5kbGVyLl9faW5pdF9fKHNlbGYpCgogICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKAogICAgICAgICAgICBsYW1iZGEgaG9zdCwgKiprdzogVmVyaWZ5aW5nSFRUUFNDb25uKGhvc3QsIHNlbGYuY2FfYnVuZGxlLCAqKmt3KSwgcmVxCiAgICAgICAgKQoKCmNsYXNzIFZlcmlmeWluZ0hUVFBTQ29ubihIVFRQU0Nvbm5lY3Rpb24pOgogICAgIiIiU2ltcGxlIHZlcmlmeWluZyBjb25uZWN0aW9uOiBubyBhdXRoLCBzdWJjbGFzc2VzLCB0aW1lb3V0cywgZXRjLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBjYV9idW5kbGUsICoqa3cpOgogICAgICAgIEhUVFBTQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBob3N0LCAqKmt3KQogICAgICAgIHNlbGYuY2FfYnVuZGxlID0gY2FfYnVuZGxlCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigKICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgZ2V0YXR0cihzZWxmLCAnc291cmNlX2FkZHJlc3MnLCBOb25lKQogICAgICAgICkKCiAgICAgICAgIyBIYW5kbGUgdGhlIHNvY2tldCBpZiBhIChwcm94eSkgdHVubmVsIGlzIHByZXNlbnQKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdfdHVubmVsJykgYW5kIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIE5vbmUpOgogICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrCiAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCiAgICAgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTc3NzY6IFB5dGhvbj49My40LjEgYW5kID49Mi43LjcKICAgICAgICAgICAgIyBjaGFuZ2Ugc2VsZi5ob3N0IHRvIG1lYW4gdGhlIHByb3h5IHNlcnZlciBob3N0IHdoZW4gdHVubmVsaW5nIGlzCiAgICAgICAgICAgICMgYmVpbmcgdXNlZC4gQWRhcHQsIHNpbmNlIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZXN0aW5hdGlvbgogICAgICAgICAgICAjIGhvc3QgZm9yIHRoZSBtYXRjaF9ob3N0bmFtZSgpIGNvbXBhcmlzb24uCiAgICAgICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5fdHVubmVsX2hvc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuaG9zdAoKICAgICAgICBpZiBoYXNhdHRyKHNzbCwgJ2NyZWF0ZV9kZWZhdWx0X2NvbnRleHQnKToKICAgICAgICAgICAgY3R4ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPXNlbGYuY2FfYnVuZGxlKQogICAgICAgICAgICBzZWxmLnNvY2sgPSBjdHgud3JhcF9zb2NrZXQoc29jaywgc2VydmVyX2hvc3RuYW1lPWFjdHVhbF9ob3N0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVGhpcyBpcyBmb3IgcHl0aG9uIDwgMi43LjkgYW5kIDwgMy40PwogICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoCiAgICAgICAgICAgICAgICBzb2NrLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPXNlbGYuY2FfYnVuZGxlCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hdGNoX2hvc3RuYW1lKHNlbGYuc29jay5nZXRwZWVyY2VydCgpLCBhY3R1YWxfaG9zdCkKICAgICAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5zb2NrLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpCiAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgoKZGVmIG9wZW5lcl9mb3IoY2FfYnVuZGxlPU5vbmUpOgogICAgIiIiR2V0IGEgdXJsb3BlbigpIHJlcGxhY2VtZW50IHRoYXQgdXNlcyBjYV9idW5kbGUgZm9yIHZlcmlmaWNhdGlvbiIiIgogICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LmJ1aWxkX29wZW5lcigKICAgICAgICBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoY2FfYnVuZGxlIG9yIGZpbmRfY2FfYnVuZGxlKCkpCiAgICApLm9wZW4KCgojIGZyb20gamFyYWNvLmZ1bmN0b29scwpkZWYgb25jZShmdW5jKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoZnVuYywgJ2Fsd2F5c19yZXR1cm5zJyk6CiAgICAgICAgICAgIGZ1bmMuYWx3YXlzX3JldHVybnMgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gZnVuYy5hbHdheXNfcmV0dXJucwogICAgcmV0dXJuIHdyYXBwZXIKCgpAb25jZQpkZWYgZ2V0X3dpbl9jZXJ0ZmlsZSgpOgogICAgdHJ5OgogICAgICAgIGltcG9ydCB3aW5jZXJ0c3RvcmUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGNsYXNzIENlcnRGaWxlKHdpbmNlcnRzdG9yZS5DZXJ0RmlsZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihDZXJ0RmlsZSwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5jbG9zZSkKCiAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzdXBlcihDZXJ0RmlsZSwgc2VsZikuY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBfd2luY2VydHMgPSBDZXJ0RmlsZSgpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ0NBJykKICAgIF93aW5jZXJ0cy5hZGRzdG9yZSgnUk9PVCcpCiAgICByZXR1cm4gX3dpbmNlcnRzLm5hbWUKCgpkZWYgZmluZF9jYV9idW5kbGUoKToKICAgICIiIlJldHVybiBhbiBleGlzdGluZyBDQSBidW5kbGUgcGF0aCwgb3IgTm9uZSIiIgogICAgZXh0YW50X2NlcnRfcGF0aHMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGNlcnRfcGF0aHMpCiAgICByZXR1cm4gKAogICAgICAgIGdldF93aW5fY2VydGZpbGUoKQogICAgICAgIG9yIG5leHQoZXh0YW50X2NlcnRfcGF0aHMsIE5vbmUpCiAgICAgICAgb3IgX2NlcnRpZmlfd2hlcmUoKQogICAgKQoKCmRlZiBfY2VydGlmaV93aGVyZSgpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfX2ltcG9ydF9fKCdjZXJ0aWZpJykud2hlcmUoKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IpOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCaQtea5AMAAOQDAABAAAAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weWltcG9ydCB1bmljb2RlZGF0YQppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgojIEhGUyBQbHVzIHVzZXMgZGVjb21wb3NlZCBVVEYtOApkZWYgZGVjb21wb3NlKHBhdGgpOgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgdHJ5OgogICAgICAgIHBhdGggPSBwYXRoLmRlY29kZSgndXRmLTgnKQogICAgICAgIHBhdGggPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GRCcsIHBhdGgpCiAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MgICMgTm90IFVURi04CiAgICByZXR1cm4gcGF0aAoKCmRlZiBmaWxlc3lzX2RlY29kZShwYXRoKToKICAgICIiIgogICAgRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHBhdGggaXMgZGVjb2RlZCwKICAgIE5PTkUgd2hlbiBubyBleHBlY3RlZCBlbmNvZGluZyB3b3JrcwogICAgIiIiCgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGZzX2VuYyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSBvciAndXRmLTgnCiAgICBjYW5kaWRhdGVzID0gZnNfZW5jLCAndXRmLTgnCgogICAgZm9yIGVuYyBpbiBjYW5kaWRhdGVzOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBhdGguZGVjb2RlKGVuYykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQoKCmRlZiB0cnlfZW5jb2RlKHN0cmluZywgZW5jKToKICAgICJ0dXJuIHVuaWNvZGUgZW5jb2RpbmcgaW50byBhIGZ1bmN0aW9uYWwgcm91dGluZSIKICAgIHRyeToKICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShlbmMpCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEASLFMYpAAAACQAAAAOgAAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlpbXBvcnQgcGtnX3Jlc291cmNlcwoKdHJ5OgogICAgX192ZXJzaW9uX18gPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oJ3NldHVwdG9vbHMnKS52ZXJzaW9uCmV4Y2VwdCBFeGNlcHRpb246CiAgICBfX3ZlcnNpb25fXyA9ICd1bmtub3duJwpQSwMEFAAAAAAAAAAhALDFRYAHIQAAByEAADgAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy93aGVlbC5weSIiIldoZWVscyBzdXBwb3J0LiIiIgoKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGVtYWlsCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgc2V0dXB0b29scwpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3ZlcnNpb24KZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcudGFncyBpbXBvcnQgc3lzX3RhZ3MKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4IGltcG9ydCBQWTMKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8gaW1wb3J0IHdyaXRlX3JlcXVpcmVtZW50cwoKCl9fbWV0YWNsYXNzX18gPSB0eXBlCgoKV0hFRUxfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiXig/UDxwcm9qZWN0X25hbWU+Lis/KS0oP1A8dmVyc2lvbj5cZC4qPykKICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHlfdmVyc2lvbj4uKz8pLSg/UDxhYmk+Lis/KS0oP1A8cGxhdGZvcm0+Lis/KQogICAgKVwud2hsJCIiIiwKICAgIHJlLlZFUkJPU0UpLm1hdGNoCgpOQU1FU1BBQ0VfUEFDS0FHRV9JTklUID0gJycnXAp0cnk6CiAgICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKJycnCgoKZGVmIHVucGFjayhzcmNfZGlyLCBkc3RfZGlyKToKICAgICcnJ01vdmUgZXZlcnl0aGluZyB1bmRlciBgc3JjX2RpcmAgdG8gYGRzdF9kaXJgLCBhbmQgZGVsZXRlIHRoZSBmb3JtZXIuJycnCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIpOgogICAgICAgIHN1YmRpciA9IG9zLnBhdGgucmVscGF0aChkaXJwYXRoLCBzcmNfZGlyKQogICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGYpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGYpCiAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgZm9yIG4sIGQgaW4gcmV2ZXJzZWQobGlzdChlbnVtZXJhdGUoZGlybmFtZXMpKSk6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBkKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGluIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgIyByZW5hbWUgaXQgYW5kIHBydW5lIGl0IGZyb20gb3Mud2FsayBsaXN0LgogICAgICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICAgICAgICAgIGRlbCBkaXJuYW1lc1tuXQogICAgIyBDbGVhbnVwLgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyLCB0b3Bkb3duPVRydWUpOgogICAgICAgIGFzc2VydCBub3QgZmlsZW5hbWVzCiAgICAgICAgb3Mucm1kaXIoZGlycGF0aCkKCgpjbGFzcyBXaGVlbDoKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIG1hdGNoID0gV0hFRUxfTkFNRShvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHdoZWVsIG5hbWU6ICVyJyAlIGZpbGVuYW1lKQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIGZvciBrLCB2IGluIG1hdGNoLmdyb3VwZGljdCgpLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgaywgdikKCiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICAnJydMaXN0IHRhZ3MgKHB5X3ZlcnNpb24sIGFiaSwgcGxhdGZvcm0pIHN1cHBvcnRlZCBieSB0aGlzIHdoZWVsLicnJwogICAgICAgIHJldHVybiBpdGVydG9vbHMucHJvZHVjdCgKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uLnNwbGl0KCcuJyksCiAgICAgICAgICAgIHNlbGYuYWJpLnNwbGl0KCcuJyksCiAgICAgICAgICAgIHNlbGYucGxhdGZvcm0uc3BsaXQoJy4nKSwKICAgICAgICApCgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgJycnSXMgdGhlIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBwbGF0Zm9ybT8nJycKICAgICAgICBzdXBwb3J0ZWRfdGFncyA9IHNldCgodC5pbnRlcnByZXRlciwgdC5hYmksIHQucGxhdGZvcm0pIGZvciB0IGluIHN5c190YWdzKCkpCiAgICAgICAgcmV0dXJuIG5leHQoKFRydWUgZm9yIHQgaW4gc2VsZi50YWdzKCkgaWYgdCBpbiBzdXBwb3J0ZWRfdGFncyksIEZhbHNlKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1zZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbj1zZWxmLnZlcnNpb24sCiAgICAgICAgICAgIHBsYXRmb3JtPShOb25lIGlmIHNlbGYucGxhdGZvcm0gPT0gJ2FueScgZWxzZSBnZXRfcGxhdGZvcm0oKSksCiAgICAgICAgKS5lZ2dfbmFtZSgpICsgJy5lZ2cnCgogICAgZGVmIGdldF9kaXN0X2luZm8oc2VsZiwgemYpOgogICAgICAgICMgZmluZCB0aGUgY29ycmVjdCBuYW1lIG9mIHRoZSAuZGlzdC1pbmZvIGRpciBpbiB0aGUgd2hlZWwgZmlsZQogICAgICAgIGZvciBtZW1iZXIgaW4gemYubmFtZWxpc3QoKToKICAgICAgICAgICAgZGlybmFtZSA9IHBvc2l4cGF0aC5kaXJuYW1lKG1lbWJlcikKICAgICAgICAgICAgaWYgKGRpcm5hbWUuZW5kc3dpdGgoJy5kaXN0LWluZm8nKSBhbmQKICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShkaXJuYW1lKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShzZWxmLnByb2plY3RfbmFtZSkpKToKICAgICAgICAgICAgICAgIHJldHVybiBkaXJuYW1lCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5zdXBwb3J0ZWQgd2hlZWwgZm9ybWF0LiAuZGlzdC1pbmZvIG5vdCBmb3VuZCIpCgogICAgZGVmIGluc3RhbGxfYXNfZWdnKHNlbGYsIGRlc3RpbmF0aW9uX2VnZ2Rpcik6CiAgICAgICAgJycnSW5zdGFsbCB3aGVlbCBhcyBhbiBlZ2cgZGlyZWN0b3J5LicnJwogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBzZWxmLl9pbnN0YWxsX2FzX2VnZyhkZXN0aW5hdGlvbl9lZ2dkaXIsIHpmKQoKICAgIGRlZiBfaW5zdGFsbF9hc19lZ2coc2VsZiwgZGVzdGluYXRpb25fZWdnZGlyLCB6Zik6CiAgICAgICAgZGlzdF9iYXNlbmFtZSA9ICclcy0lcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkaXN0X2luZm8gPSBzZWxmLmdldF9kaXN0X2luZm8oemYpCiAgICAgICAgZGlzdF9kYXRhID0gJyVzLmRhdGEnICUgZGlzdF9iYXNlbmFtZQogICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgJ0VHRy1JTkZPJykKCiAgICAgICAgc2VsZi5fY29udmVydF9tZXRhZGF0YSh6ZiwgZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8sIGVnZ19pbmZvKQogICAgICAgIHNlbGYuX21vdmVfZGF0YV9lbnRyaWVzKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKQogICAgICAgIHNlbGYuX2ZpeF9uYW1lc3BhY2VfcGFja2FnZXMoZWdnX2luZm8sIGRlc3RpbmF0aW9uX2VnZ2RpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NvbnZlcnRfbWV0YWRhdGEoemYsIGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvLCBlZ2dfaW5mbyk6CiAgICAgICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHBvc2l4cGF0aC5qb2luKGRpc3RfaW5mbywgbmFtZSkpIGFzIGZwOgogICAgICAgICAgICAgICAgdmFsdWUgPSBmcC5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpIGlmIFBZMyBlbHNlIGZwLnJlYWQoKQogICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cih2YWx1ZSkKCiAgICAgICAgd2hlZWxfbWV0YWRhdGEgPSBnZXRfbWV0YWRhdGEoJ1dIRUVMJykKICAgICAgICAjIENoZWNrIHdoZWVsIGZvcm1hdCB2ZXJzaW9uIGlzIHN1cHBvcnRlZC4KICAgICAgICB3aGVlbF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbih3aGVlbF9tZXRhZGF0YS5nZXQoJ1doZWVsLVZlcnNpb24nKSkKICAgICAgICB3aGVlbF92MSA9ICgKICAgICAgICAgICAgcGFyc2VfdmVyc2lvbignMS4wJykgPD0gd2hlZWxfdmVyc2lvbiA8IHBhcnNlX3ZlcnNpb24oJzIuMGRldjAnKQogICAgICAgICkKICAgICAgICBpZiBub3Qgd2hlZWxfdjE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAndW5zdXBwb3J0ZWQgd2hlZWwgZm9ybWF0IHZlcnNpb246ICVzJyAlIHdoZWVsX3ZlcnNpb24pCiAgICAgICAgIyBFeHRyYWN0IHRvIHRhcmdldCBkaXJlY3RvcnkuCiAgICAgICAgb3MubWtkaXIoZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgIHpmLmV4dHJhY3RhbGwoZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgICMgQ29udmVydCBtZXRhZGF0YS4KICAgICAgICBkaXN0X2luZm8gPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8pCiAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgIGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvLAogICAgICAgICAgICBtZXRhZGF0YT1wa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YShkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbyksCiAgICAgICAgKQoKICAgICAgICAjIE5vdGU6IEV2YWx1YXRlIGFuZCBzdHJpcCBtYXJrZXJzIG5vdywKICAgICAgICAjIGFzIGl0J3MgZGlmZmljdWx0IHRvIGNvbnZlcnQgYmFjayBmcm9tIHRoZSBzeW50YXg6CiAgICAgICAgIyBmb29iYXI7ICJsaW51eCIgaW4gc3lzX3BsYXRmb3JtIGFuZCBleHRyYSA9PSAndGVzdCcKICAgICAgICBkZWYgcmF3X3JlcShyZXEpOgogICAgICAgICAgICByZXEubWFya2VyID0gTm9uZQogICAgICAgICAgICByZXR1cm4gc3RyKHJlcSkKICAgICAgICBpbnN0YWxsX3JlcXVpcmVzID0gbGlzdChzb3J0ZWQobWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKSkpKQogICAgICAgIGV4dHJhc19yZXF1aXJlID0gewogICAgICAgICAgICBleHRyYTogc29ydGVkKAogICAgICAgICAgICAgICAgcmVxCiAgICAgICAgICAgICAgICBmb3IgcmVxIGluIG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKChleHRyYSwpKSkKICAgICAgICAgICAgICAgIGlmIHJlcSBub3QgaW4gaW5zdGFsbF9yZXF1aXJlcwogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBkaXN0LmV4dHJhcwogICAgICAgIH0KICAgICAgICBvcy5yZW5hbWUoZGlzdF9pbmZvLCBlZ2dfaW5mbykKICAgICAgICBvcy5yZW5hbWUoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ01FVEFEQVRBJyksCiAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJyksCiAgICAgICAgKQogICAgICAgIHNldHVwX2Rpc3QgPSBzZXR1cHRvb2xzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgYXR0cnM9ZGljdCgKICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxdWlyZXM9aW5zdGFsbF9yZXF1aXJlcywKICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlPWV4dHJhc19yZXF1aXJlLAogICAgICAgICAgICApLAogICAgICAgICkKICAgICAgICAjIFRlbXBvcmFyaWx5IGRpc2FibGUgaW5mbyB0cmFjZXMuCiAgICAgICAgbG9nX3RocmVzaG9sZCA9IGxvZy5fZ2xvYmFsX2xvZy50aHJlc2hvbGQKICAgICAgICBsb2cuc2V0X3RocmVzaG9sZChsb2cuV0FSTikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgIHNldHVwX2Rpc3QuZ2V0X2NvbW1hbmRfb2JqKCdlZ2dfaW5mbycpLAogICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ3JlcXVpcmVzLnR4dCcpLAogICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF90aHJlc2hvbGQobG9nX3RocmVzaG9sZCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX21vdmVfZGF0YV9lbnRyaWVzKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKToKICAgICAgICAiIiJNb3ZlIGRhdGEgZW50cmllcyB0byB0aGVpciBjb3JyZWN0IGxvY2F0aW9uLiIiIgogICAgICAgIGRpc3RfZGF0YSA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfZGF0YSkKICAgICAgICBkaXN0X2RhdGFfc2NyaXB0cyA9IG9zLnBhdGguam9pbihkaXN0X2RhdGEsICdzY3JpcHRzJykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgIGVnZ19pbmZvX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9lZ2dkaXIsICdFR0ctSU5GTycsICdzY3JpcHRzJykKICAgICAgICAgICAgb3MubWtkaXIoZWdnX2luZm9fc2NyaXB0cykKICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICAgICAgIyBSZW1vdmUgYnl0ZWNvZGUsIGFzIGl0J3Mgbm90IHByb3Blcmx5IGhhbmRsZWQKICAgICAgICAgICAgICAgICMgZHVyaW5nIGVhc3lfaW5zdGFsbCBzY3JpcHRzIGluc3RhbGwgcGhhc2UuCiAgICAgICAgICAgICAgICBpZiBlbnRyeS5lbmRzd2l0aCgnLnB5YycpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvX3NjcmlwdHMsIGVudHJ5KSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIG9zLnJtZGlyKGRpc3RfZGF0YV9zY3JpcHRzKQogICAgICAgIGZvciBzdWJkaXIgaW4gZmlsdGVyKG9zLnBhdGguZXhpc3RzLCAoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2RhdGEsIGQpCiAgICAgICAgICAgIGZvciBkIGluICgnZGF0YScsICdoZWFkZXJzJywgJ3B1cmVsaWInLCAncGxhdGxpYicpCiAgICAgICAgKSk6CiAgICAgICAgICAgIHVucGFjayhzdWJkaXIsIGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0X2RhdGEpOgogICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGEpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9maXhfbmFtZXNwYWNlX3BhY2thZ2VzKGVnZ19pbmZvLCBkZXN0aW5hdGlvbl9lZ2dkaXIpOgogICAgICAgIG5hbWVzcGFjZV9wYWNrYWdlcyA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgZWdnX2luZm8sICduYW1lc3BhY2VfcGFja2FnZXMudHh0JykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICB3aXRoIG9wZW4obmFtZXNwYWNlX3BhY2thZ2VzKSBhcyBmcDoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZV9wYWNrYWdlcyA9IGZwLnJlYWQoKS5zcGxpdCgpCiAgICAgICAgICAgIGZvciBtb2QgaW4gbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgbW9kX2RpciA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICptb2Quc3BsaXQoJy4nKSkKICAgICAgICAgICAgICAgIG1vZF9pbml0ID0gb3MucGF0aC5qb2luKG1vZF9kaXIsICdfX2luaXRfXy5weScpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobW9kX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgb3MubWtkaXIobW9kX2RpcikKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhtb2RfaW5pdCk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG1vZF9pbml0LCAndycpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShOQU1FU1BBQ0VfUEFDS0FHRV9JTklUKQpQSwMEFAAAAAAAAAAhAPnL7g3KAgAAygIAAEIAAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHlpbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGN0eXBlcwoKCmRlZiB3aW5kb3dzX29ubHkoZnVuYyk6CiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgcmV0dXJuIGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IE5vbmUKICAgIHJldHVybiBmdW5jCgoKQHdpbmRvd3Nfb25seQpkZWYgaGlkZV9maWxlKHBhdGgpOgogICAgIiIiCiAgICBTZXQgdGhlIGhpZGRlbiBhdHRyaWJ1dGUgb24gYSBmaWxlIG9yIGRpcmVjdG9yeS4KCiAgICBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk2MjIxMzMvCgogICAgYHBhdGhgIG11c3QgYmUgdGV4dC4KICAgICIiIgogICAgX19pbXBvcnRfXygnY3R5cGVzLndpbnR5cGVzJykKICAgIFNldEZpbGVBdHRyaWJ1dGVzID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5TZXRGaWxlQXR0cmlidXRlc1cKICAgIFNldEZpbGVBdHRyaWJ1dGVzLmFyZ3R5cGVzID0gY3R5cGVzLndpbnR5cGVzLkxQV1NUUiwgY3R5cGVzLndpbnR5cGVzLkRXT1JECiAgICBTZXRGaWxlQXR0cmlidXRlcy5yZXN0eXBlID0gY3R5cGVzLndpbnR5cGVzLkJPT0wKCiAgICBGSUxFX0FUVFJJQlVURV9ISURERU4gPSAweDAyCgogICAgcmV0ID0gU2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgRklMRV9BVFRSSUJVVEVfSElEREVOKQogICAgaWYgbm90IHJldDoKICAgICAgICByYWlzZSBjdHlwZXMuV2luRXJyb3IoKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACIAAABydWxlc19weXRob24vcGFja2FnaW5nL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQDmu2l2JxwAACccAAAdAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSB3aGwgbW9kdWxlcyBkZWZpbmVzIGNsYXNzZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUHl0aG9uIHBhY2thZ2VzLiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHN0YXQKaW1wb3J0IHppcGZpbGUKCgpkZWYgY3VycmVudF91bWFzaygpOgogICAgIiIiR2V0IHRoZSBjdXJyZW50IHVtYXNrIHdoaWNoIGludm9sdmVzIGhhdmluZyB0byBzZXQgaXQgdGVtcG9yYXJpbHkuIiIiCiAgICBtYXNrID0gb3MudW1hc2soMCkKICAgIG9zLnVtYXNrKG1hc2spCiAgICByZXR1cm4gbWFzawoKCmRlZiBzZXRfZXh0cmFjdGVkX2ZpbGVfdG9fZGVmYXVsdF9tb2RlX3BsdXNfZXhlY3V0YWJsZShwYXRoKToKICAgICIiIgogICAgTWFrZSBmaWxlIHByZXNlbnQgYXQgcGF0aCBoYXZlIGV4ZWN1dGUgZm9yIHVzZXIvZ3JvdXAvd29ybGQKICAgIChjaG1vZCAreCkgaXMgbm8tb3Agb24gd2luZG93cyBwZXIgcHl0aG9uIGRvY3MKICAgICIiIgogICAgb3MuY2htb2QocGF0aCwgKDBvNzc3ICYgfmN1cnJlbnRfdW1hc2soKSB8IDBvMTExKSkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICBzZWxmLl9wYXRoID0gcGF0aAoKICBkZWYgcGF0aChzZWxmKToKICAgIHJldHVybiBzZWxmLl9wYXRoCgogIGRlZiBiYXNlbmFtZShzZWxmKToKICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCgpKQoKICBkZWYgZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgIyBTZWUgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8jZmlsZS1uYW1lLWNvbnZlbnRpb24KICAgIHBhcnRzID0gc2VsZi5iYXNlbmFtZSgpLnNwbGl0KCctJykKICAgIHJldHVybiBwYXJ0c1swXQoKICBkZWYgdmVyc2lvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMV0KCiAgZGVmIHJlcG9zaXRvcnlfc3VmZml4KHNlbGYpOgogICAgIyBSZXR1cm5zIGEgY2Fub25pY2FsIHN1ZmZpeCB0aGF0IHdpbGwgZm9ybSBwYXJ0IG9mIHRoZSBuYW1lIG9mIHRoZSBCYXplbAogICAgIyByZXBvc2l0b3J5IGZvciB0aGlzIHBhY2thZ2UuCiAgICBjYW5vbmljYWwgPSAncHlwaV9fe31fe30nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKICAgICMgRXNjYXBlIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3JlLgogICAgcmV0dXJuIHJlLnN1YignWy0uK10nLCAnXycsIGNhbm9uaWNhbCkKCiAgZGVmIF9kaXN0X2luZm8oc2VsZik6CiAgICAjIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlzdC1pbmZvIGRpcmVjdG9yeSB3aXRoaW4gdGhlIC53aGwgZmlsZS4KICAgICMgZS5nLiBnb29nbGVfY2xvdWQtMC4yNy4wLXB5Mi5weTMtbm9uZS1hbnkud2hsIC0+CiAgICAjICAgICAgZ29vZ2xlX2Nsb3VkLTAuMjcuMC5kaXN0LWluZm8KICAgIHJldHVybiAne30te30uZGlzdC1pbmZvJy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCgogIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICMgRXh0cmFjdCB0aGUgc3RydWN0dXJlZCBkYXRhIGZyb20gbWV0YWRhdGEuanNvbiBpbiB0aGUgV0hMJ3MgZGlzdC1pbmZvCiAgICAjIGRpcmVjdG9yeS4KICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgIyBmaXJzdCBjaGVjayBmb3IgbWV0YWRhdGEuanNvbgogICAgICB0cnk6CiAgICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvbWV0YWRhdGEuanNvbicpIGFzIGY6CiAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgIHBhc3MKICAgICAgIyBmYWxsIGJhY2sgdG8gTUVUQURBVEEgZmlsZSAoaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pCiAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL01FVEFEQVRBJykgYXMgZjoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbWV0YWRhdGEoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICBkZWYgbmFtZShzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCduYW1lJykKCiAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCBleHRyYT1Ob25lKToKICAgICIiIkFjY2VzcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgV2hlZWwuCgogICAgQXJnczoKICAgICAgZXh0cmE6IGlmIHNwZWNpZmllZCwgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgb2YgdGhlIG5hbWVkICJleHRyYSIuCgogICAgWWllbGRzOgogICAgICB0aGUgbmFtZXMgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG1ldGFkYXRhLmpzb24sIGluIGxleGljYWwgb3JkZXIuCiAgICAiIiIKICAgICMgVE9ETyhtYXR0bW9vcik6IElzIHRoZXJlIGEgc2NoZW1hIHRvIGZvbGxvdyBmb3IgdGhpcz8KICAgIGRlcGVuZGVuY3lfc2V0ID0gc2V0KCkKCiAgICBydW5fcmVxdWlyZXMgPSBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgIGZvciByZXF1aXJlbWVudCBpbiBydW5fcmVxdWlyZXM6CiAgICAgIGlmIHJlcXVpcmVtZW50LmdldCgnZXh0cmEnKSAhPSBleHRyYToKICAgICAgICAjIE1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBleHRyYSB3ZSdyZSBsb29raW5nIGZvci4KICAgICAgICBjb250aW51ZQogICAgICBtYXJrZXIgPSByZXF1aXJlbWVudC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgaWYgbWFya2VyIGFuZCBub3QgcGtnX3Jlc291cmNlcy5ldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAjIFRoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBQRVAgNTA4IG1hcmtlciwKICAgICAgICAjIHNvIGlnbm9yZSB0aGlzIHJlcXVpcmVtZW50LgogICAgICAgIGNvbnRpbnVlCiAgICAgIHJlcXVpcmVzID0gcmVxdWlyZW1lbnQuZ2V0KCdyZXF1aXJlcycsIFtdKQogICAgICBmb3IgZW50cnkgaW4gcmVxdWlyZXM6CiAgICAgICAgIyBTdHJpcCBvZmYgYW55IHRyYWlsaW5nIHZlcnNpb25pbmcgZGF0YS4KICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KCdbID48PSgpXScsIGVudHJ5KQogICAgICAgIGRlcGVuZGVuY3lfc2V0LmFkZChwYXJ0c1swXSkKCiAgICByZXR1cm4gc29ydGVkKGRlcGVuZGVuY3lfc2V0KQoKICBkZWYgZXh0cmFzKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ2V4dHJhcycsIFtdKQoKICBkZWYgZXhwYW5kKHNlbGYsIGRpcmVjdG9yeSk6CiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgInIiLCBhbGxvd1ppcDY0PVRydWUpIGFzIHdobDoKICAgICAgICB3aGwuZXh0cmFjdGFsbChkaXJlY3RvcnkpCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIGxvZ2ljIGlzIGJvcnJvd2VkIGZyb20gUGlwOgogICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvY2M0OGMwN2I2NGYzMzhhYzVlMzQ3ZDkwZjZjYjRlZmMyMmVkMGQwYi9zcmMvcGlwL19pbnRlcm5hbC91dGlscy91bnBhY2tpbmcucHkjTDI0MAogICAgICAgIGZvciBpbmZvIGluIHdobC5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICAjIERvIG5vdCBhdHRlbXB0IHRvIG1vZGlmeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiLyIpIG9yIG5hbWUuZW5kc3dpdGgoIlxcIik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBtb2RlID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgICMgaWYgbW9kZSBhbmQgcmVndWxhciBmaWxlIGFuZCBhbnkgZXhlY3V0ZSBwZXJtaXNzaW9ucyBmb3IKICAgICAgICAgICAgIyB1c2VyL2dyb3VwL3dvcmxkPwogICAgICAgICAgICBpZiBtb2RlIGFuZCBzdGF0LlNfSVNSRUcobW9kZSkgYW5kIG1vZGUgJiAwbzExMToKICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKQogICAgICAgICAgICAgICAgc2V0X2V4dHJhY3RlZF9maWxlX3RvX2RlZmF1bHRfbW9kZV9wbHVzX2V4ZWN1dGFibGUobmFtZSkKCiAgIyBfcGFyc2VfbWV0YWRhdGEgcGFyc2VzIE1FVEFEQVRBIGZpbGVzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMzE0LwogIGRlZiBfcGFyc2VfbWV0YWRhdGEoc2VsZiwgY29udGVudCk6CiAgICAjIFRPRE86IGhhbmRsZSBmaWVsZHMgb3RoZXIgdGhhbiBqdXN0IG5hbWUKICAgIG5hbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUoJ05hbWU6ICguKiknKQogICAgcmV0dXJuIHsgJ25hbWUnOiBuYW1lX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpLmdyb3VwKDEpIH0KCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdVbnBhY2sgYSBXSEwgZmlsZSBhcyBhIHB5X2xpYnJhcnkuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0td2hsJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSAud2hsIGZpbGUgd2UgYXJlIGV4cGFuZGluZy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHBpcF9pbXBvcnQgZnJvbSB3aGljaCB0byBkcmF3IGRlcGVuZGVuY2llcy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nLicsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGV4cGFuZCB0aGluZ3MuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFzJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXQgb2YgZXh0cmFzIGZvciB3aGljaCB0byBnZW5lcmF0ZSBsaWJyYXJ5IHRhcmdldHMuJykKCmRlZiBtYWluKCk6CiAgIiIiCiAgR2VuZXJhdGUgYSBCVUlMRCBmaWxlIGZvciBhbiB1bnppcHBlZCBXaGVlbAoKICBXZSBhbGxvdyBmb3IgZW1wdHkgUHl0aG9uIHNvdXJjZXMgYXMgZm9yIFdoZWVscyBjb250YWluaW5nIG9ubHkgY29tcGlsZWQgQyBjb2RlCiAgdGhlcmUgbWF5IGJlIG5vIFB5dGhvbiBzb3VyY2VzIHdoYXRzb2V2ZXIgKGUuZy4gcGFja2FnZXMgd3JpdHRlbiBpbiBDeXRob246IGxpa2UgYHB5bXNzcWxgKS4KICAiIiIKCiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICB3aGwgPSBXaGVlbChhcmdzLndobCkKCiAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIHdobC5leHBhbmQoYXJncy5kaXJlY3RvcnkpCgogIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYXJncy5kaXJlY3RvcnksICdCVUlMRCcpLCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIgpwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQoKbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2xpYnJhcnkiKQpsb2FkKCJ7cmVxdWlyZW1lbnRzfSIsICJyZXF1aXJlbWVudCIpCgpweV9saWJyYXJ5KAogICAgbmFtZSA9ICJwa2ciLAogICAgc3JjcyA9IGdsb2IoWyIqKi8qLnB5Il0sIGFsbG93X2VtcHR5ID0gVHJ1ZSksCiAgICBkYXRhID0gZ2xvYihbIioqLyoiXSwgZXhjbHVkZT1bIioqLyoucHkiLCAiKiovKiAqIiwgIkJVSUxEIiwgIldPUktTUEFDRSJdKSwKICAgICMgVGhpcyBtYWtlcyB0aGlzIGRpcmVjdG9yeSBhIHRvcC1sZXZlbCBpbiB0aGUgcHl0aG9uIGltcG9ydAogICAgIyBzZWFyY2ggcGF0aCBmb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoaXMuCiAgICBpbXBvcnRzID0gWyIuIl0sCiAgICBkZXBzID0gW3tkZXBlbmRlbmNpZXN9XSwKKQp7ZXh0cmFzfSIiIi5mb3JtYXQoCiAgcmVxdWlyZW1lbnRzPWFyZ3MucmVxdWlyZW1lbnRzLAogIGRlcGVuZGVuY2llcz0nLCcuam9pbihbCiAgICAncmVxdWlyZW1lbnQoIiVzIiknICUgZAogICAgZm9yIGQgaW4gd2hsLmRlcGVuZGVuY2llcygpCiAgXSksCiAgZXh0cmFzPSdcblxuJy5qb2luKFsKICAgICIiInB5X2xpYnJhcnkoCiAgICBuYW1lID0gIntleHRyYX0iLAogICAgZGVwcyA9IFsKICAgICAgICAiOnBrZyIse2RlcHN9CiAgICBdLAopIiIiLmZvcm1hdChleHRyYT1leHRyYSwKICAgICAgICAgICAgZGVwcz0nLCcuam9pbihbCiAgICAgICAgICAgICAgICAncmVxdWlyZW1lbnQoIiVzIiknICUgZGVwCiAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHdobC5kZXBlbmRlbmNpZXMoZXh0cmEpCiAgICAgICAgICAgIF0pKQogICAgZm9yIGV4dHJhIGluIGFyZ3MuZXh0cmFzIG9yIFtdCiAgXSkpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQB3Up1V+jEAAPoxAAAeAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGx0b29sIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHppcGZpbGUKCiMgUmV0dXJuIFRydWUgaWYgcnVubmluZyBvbiBXaW5kb3dzCmRlZiBJc1dpbmRvd3MoKToKICByZXR1cm4gb3MubmFtZSA9PSAnbnQnCgpkZWYgR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KHBhdGgpOgogICIiIgogIEFkZGluZyBVTkMgcHJlZml4IGFmdGVyIGdldHRpbmcgYSBub3JtYWxpemVkIGFic29sdXRlIFdpbmRvd3MgcGF0aCwKICBpdCdzIG5vLW9wIGZvciBub24tV2luZG93cyBwbGF0Zm9ybXMgb3IgaWYgcnVubmluZyB1bmRlciBweXRob24yLgogICIiIgogIHBhdGggPSBwYXRoLnN0cmlwKCkKCiAgIyBObyBuZWVkIHRvIGFkZCBwcmVmaXggZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAjIEFuZCBcXD9cIGRvZXNuJ3Qgd29yayBpbiBweXRob24gMgogIGlmIG5vdCBJc1dpbmRvd3MoKSBvciBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgIHJldHVybiBwYXRoCgogICMgTGV0cyBzdGFydCB0aGUgdW5pY29kZSBmdW4KICB1bmljb2RlX3ByZWZpeCA9ICJcXFxcP1xcIgogIGlmIHBhdGguc3RhcnRzd2l0aCh1bmljb2RlX3ByZWZpeCk6CiAgICByZXR1cm4gcGF0aAoKICAjIG9zLnBhdGguYWJzcGF0aCByZXR1cm5zIGEgbm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoCiAgcmV0dXJuIHVuaWNvZGVfcHJlZml4ICsgb3MucGF0aC5hYnNwYXRoKHBhdGgpCgpkZWYgSGFzV2luZG93c0V4ZWN1dGFibGVFeHRlbnNpb24ocGF0aCk6CiAgcmV0dXJuIHBhdGguZW5kc3dpdGgoJy5leGUnKSBvciBwYXRoLmVuZHN3aXRoKCcuY29tJykgb3IgcGF0aC5lbmRzd2l0aCgnLmJhdCcpCgpQWVRIT05fQklOQVJZID0gJ2JhemVsX3Rvb2xzL3Rvb2xzL3B5dGhvbi9weTN3cmFwcGVyLnNoJwppZiBJc1dpbmRvd3MoKSBhbmQgbm90IEhhc1dpbmRvd3NFeGVjdXRhYmxlRXh0ZW5zaW9uKFBZVEhPTl9CSU5BUlkpOgogIFBZVEhPTl9CSU5BUlkgPSBQWVRIT05fQklOQVJZICsgJy5leGUnCgojIEZpbmQgYSBmaWxlIGluIGEgZ2l2ZW4gc2VhcmNoIHBhdGguCmRlZiBTZWFyY2hQYXRoKG5hbWUpOgogIHNlYXJjaF9wYXRoID0gb3MuZ2V0ZW52KCdQQVRIJywgb3MuZGVmcGF0aCkuc3BsaXQob3MucGF0aHNlcCkKICBmb3IgZGlyZWN0b3J5IGluIHNlYXJjaF9wYXRoOgogICAgaWYgZGlyZWN0b3J5ID09ICcnOiBjb250aW51ZQogICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKSBhbmQgb3MuYWNjZXNzKHBhdGgsIG9zLlhfT0spOgogICAgICByZXR1cm4gcGF0aAogIHJldHVybiBOb25lCgpkZWYgSXNSdW5uaW5nRnJvbVppcCgpOgogIHJldHVybiBGYWxzZQoKIyBGaW5kIHRoZSByZWFsIFB5dGhvbiBiaW5hcnkgaWYgaXQncyBub3QgYSBub3JtYWwgYWJzb2x1dGUgcGF0aApkZWYgRmluZFB5dGhvbkJpbmFyeShtb2R1bGVfc3BhY2UpOgogIGlmIFBZVEhPTl9CSU5BUlkuc3RhcnRzd2l0aCgnLy8nKToKICAgICMgQ2FzZSAxOiBQYXRoIGlzIGEgbGFiZWwuIE5vdCBzdXBwb3J0ZWQgeWV0LgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICdCYXplbCBkb2VzIG5vdCBzdXBwb3J0IGV4ZWN1dGlvbiBvZiBQeXRob24gaW50ZXJwcmV0ZXJzIHZpYSBsYWJlbHMgeWV0JykKICBlbGlmIG9zLnBhdGguaXNhYnMoUFlUSE9OX0JJTkFSWSk6CiAgICAjIENhc2UgMjogQWJzb2x1dGUgcGF0aC4KICAgIHJldHVybiBQWVRIT05fQklOQVJZCiAgIyBVc2Ugbm9ybXBhdGgoKSB0byBjb252ZXJ0IHNsYXNoZXMgdG8gb3Muc2VwIG9uIFdpbmRvd3MuCiAgZWxpZiBvcy5zZXAgaW4gb3MucGF0aC5ub3JtcGF0aChQWVRIT05fQklOQVJZKToKICAgICMgQ2FzZSAzOiBQYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QuCiAgICByZXR1cm4gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgUFlUSE9OX0JJTkFSWSkKICBlbHNlOgogICAgIyBDYXNlIDQ6IFBhdGggaGFzIHRvIGJlIGxvb2tlZCB1cCBpbiB0aGUgc2VhcmNoIHBhdGguCiAgICByZXR1cm4gU2VhcmNoUGF0aChQWVRIT05fQklOQVJZKQoKZGVmIENyZWF0ZVB5dGhvblBhdGhFbnRyaWVzKHB5dGhvbl9pbXBvcnRzLCBtb2R1bGVfc3BhY2UpOgogIHBhcnRzID0gcHl0aG9uX2ltcG9ydHMuc3BsaXQoJzonKTsKICByZXR1cm4gW21vZHVsZV9zcGFjZV0gKyBbIiVzLyVzIiAlIChtb2R1bGVfc3BhY2UsIHBhdGgpIGZvciBwYXRoIGluIHBhcnRzXQoKIyBGaW5kIHRoZSBydW5maWxlcyB0cmVlCmRlZiBGaW5kTW9kdWxlU3BhY2UoKToKICBzdHViX2ZpbGVuYW1lID0gc3lzLmFyZ3ZbMF0KICBpZiBub3Qgb3MucGF0aC5pc2FicyhzdHViX2ZpbGVuYW1lKToKICAgIHN0dWJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHN0dWJfZmlsZW5hbWUpCgogIHdoaWxlIFRydWU6CiAgICBtb2R1bGVfc3BhY2UgPSBzdHViX2ZpbGVuYW1lICsgKCcuZXhlJyBpZiBJc1dpbmRvd3MoKSBlbHNlICcnKSArICcucnVuZmlsZXMnCiAgICBpZiBvcy5wYXRoLmlzZGlyKG1vZHVsZV9zcGFjZSk6CiAgICAgIHJldHVybiBtb2R1bGVfc3BhY2UKCiAgICBydW5maWxlc19wYXR0ZXJuID0gcicoLipcLnJ1bmZpbGVzKScgKyAocidcXCcgaWYgSXNXaW5kb3dzKCkgZWxzZSAnLycpICsgJy4qJwogICAgbWF0Y2hvYmogPSByZS5tYXRjaChydW5maWxlc19wYXR0ZXJuLCBzdHViX2ZpbGVuYW1lKQogICAgaWYgbWF0Y2hvYmo6CiAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgxKQoKICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhzdHViX2ZpbGVuYW1lKToKICAgICAgYnJlYWsKICAgIHRhcmdldCA9IG9zLnJlYWRsaW5rKHN0dWJfZmlsZW5hbWUpCiAgICBpZiBvcy5wYXRoLmlzYWJzKHRhcmdldCk6CiAgICAgIHN0dWJfZmlsZW5hbWUgPSB0YXJnZXQKICAgIGVsc2U6CiAgICAgIHN0dWJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN0dWJfZmlsZW5hbWUpLCB0YXJnZXQpCgogIHJhaXNlIEFzc2VydGlvbkVycm9yKCdDYW5ub3QgZmluZCAucnVuZmlsZXMgZGlyZWN0b3J5IGZvciAlcycgJSBzeXMuYXJndlswXSkKCmRlZiBFeHRyYWN0WmlwKHppcF9wYXRoLCBkZXN0X2Rpcik6CiAgIiIiRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUsIHByZXNlcnZpbmcgdGhlIHVuaXggZmlsZSBtb2RlIGJpdHMuCgogIFRoZXNlIGluY2x1ZGUgdGhlIHBlcm1pc3Npb24gYml0cywgYW5kIGluIHBhcnRpY3VsYXIsIHRoZSBleGVjdXRhYmxlIGJpdC4KCiAgSWRlYWxseSB0aGUgemlwZmlsZSBtb2R1bGUgc2hvdWxkIHNldCB0aGVzZSBiaXRzLCBidXQgaXQgZG9lc24ndC4gU2VlOgogIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU3OTUuCgogIEFyZ3M6CiAgICAgIHppcF9wYXRoOiBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgdG8gZXh0cmFjdAogICAgICBkZXN0X2RpcjogVGhlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQogICIiIgogIHppcF9wYXRoID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KHppcF9wYXRoKQogIGRlc3RfZGlyID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KGRlc3RfZGlyKQogIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9wYXRoKSBhcyB6ZjoKICAgIGZvciBpbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgIHpmLmV4dHJhY3QoaW5mbywgZGVzdF9kaXIpCiAgICAgICMgVU5DLXByZWZpeGVkIHBhdGhzIG11c3QgYmUgYWJzb2x1dGUvbm9ybWFsaXplZC4gU2VlCiAgICAgICMgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy9kZXNrdG9wL2ZpbGVpby9uYW1pbmctYS1maWxlI21heGltdW0tcGF0aC1sZW5ndGgtbGltaXRhdGlvbgogICAgICBmaWxlX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGRlc3RfZGlyLCBpbmZvLmZpbGVuYW1lKSkKICAgICAgIyBUaGUgVW5peCBzdF9tb2RlIGJpdHMgKHNlZSAibWFuIDcgaW5vZGUiKSBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciAxNgogICAgICAjIGJpdHMgb2YgZXh0ZXJuYWxfYXR0ci4gT2YgdGhvc2UsIHdlIHNldCB0aGUgbG93ZXIgMTIgYml0cywgd2hpY2ggYXJlIHRoZQogICAgICAjIGZpbGUgbW9kZSBiaXRzIChzaW5jZSB0aGUgZmlsZSB0eXBlIGJpdHMgY2FuJ3QgYmUgc2V0IGJ5IGNobW9kIGFueXdheSkuCiAgICAgIGF0dHJzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgIGlmIGF0dHJzICE9IDA6ICAjIFJ1bW9yIGhhcyBpdCB0aGVzZSBjYW4gYmUgMCBmb3IgemlwcyBjcmVhdGVkIG9uIFdpbmRvd3MuCiAgICAgICAgb3MuY2htb2QoZmlsZV9wYXRoLCBhdHRycyAmIDBvNzc3NykKCiMgQ3JlYXRlIHRoZSBydW5maWxlcyB0cmVlIGJ5IGV4dHJhY3RpbmcgdGhlIHppcCBmaWxlCmRlZiBDcmVhdGVNb2R1bGVTcGFjZSgpOgogIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgiIiwgIkJhemVsLnJ1bmZpbGVzXyIpCiAgRXh0cmFjdFppcChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCB0ZW1wX2RpcikKICByZXR1cm4gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAicnVuZmlsZXMiKQoKIyBSZXR1cm5zIHJlcG9zaXRvcnkgcm9vdHMgdG8gYWRkIHRvIHRoZSBpbXBvcnQgcGF0aC4KZGVmIEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBpbXBvcnRfYWxsKToKICBpZiBpbXBvcnRfYWxsOgogICAgcmVwb19kaXJzID0gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIGQpIGZvciBkIGluIG9zLmxpc3RkaXIobW9kdWxlX3NwYWNlKV0KICAgIHJldHVybiBbZCBmb3IgZCBpbiByZXBvX2RpcnMgaWYgb3MucGF0aC5pc2RpcihkKV0KICByZXR1cm4gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsICJydWxlc19weXRob24iKV0KCiMgRmluZHMgdGhlIHJ1bmZpbGVzIG1hbmlmZXN0IG9yIHRoZSBydW5maWxlcyBkaXJlY3RvcnkuCmRlZiBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpOgogICMgSWYgdGhpcyBiaW5hcnkgaXMgdGhlIGRhdGEtZGVwZW5kZW5jeSBvZiBhbm90aGVyIG9uZSwgdGhlIG90aGVyIHNldHMKICAjIFJVTkZJTEVTX01BTklGRVNUX0ZJTEUgb3IgUlVORklMRVNfRElSIGZvciBvdXIgc2FrZS4KICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgcnVuZmlsZXMgPSBvcy5lbnZpcm9uLmdldCgnUlVORklMRVNfRElSJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgZnJvbSBhIHppcCwgdGhlcmUncyBubyBtYW5pZmVzdCBmaWxlLgogIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIG1vZHVsZV9zcGFjZSkKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgIm91dHB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzX21hbmlmZXN0IgogIHJ1bmZpbGVzID0gbW9kdWxlX3NwYWNlICsgJ19tYW5pZmVzdCcKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgcnVuZmlsZXMpCgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICJpbnB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzL01BTklGRVNUIgogIHJ1bmZpbGVzID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgJ01BTklGRVNUJykKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBydW5maWxlcykKCiAgIyBJZiBydW5uaW5nIGluIGEgc2FuZGJveCBhbmQgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQsIHRoZW4KICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAgbmV4dCB0byB0aGUgYmluYXJ5LgogIGlmIG1vZHVsZV9zcGFjZS5lbmRzd2l0aCgnLnJ1bmZpbGVzJykgYW5kIG9zLnBhdGguaXNkaXIobW9kdWxlX3NwYWNlKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIG1vZHVsZV9zcGFjZSkKCiAgcmV0dXJuIChOb25lLCBOb25lKQoKIyBUT0RPKCM2NDQzKTogUmVtb3ZlIHRoaXMgb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhIGhvc3QgY29uZmlndXJhdGlvbiBmb3IKIyBQeXRob24gdGFyZ2V0cyB0byBhcHBlYXIgaW4uCmRlZiBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpOgogICIiIldhcm4gdGhlIHVzZXIgaWYgYSBmYWlsdXJlIG1heSBiZSBkdWUgdG8gdGhlIGhvc3QgY29uZmlnJ3MgdmVyc2lvbi4KCiAgVGhpcyBlbWl0cyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGlmCiAgICAxKSByZXRfY29kZSBpcyBub24temVybywKICAgIDIpIHRoZSB0YXJnZXQgd2FzIGJ1aWx0IGluIHRoZSBob3N0IGNvbmZpZyBhbmQgd2l0aCB0b29sY2hhaW5zIGVuYWJsZWQsIGFuZAogICAgMykgYXQgYW5hbHlzaXMgdGltZSB3ZSBkZXRlY3RlZCBhIG1pc21hdGNoIGJldHdlZW4gdGhlIGhvc3QgY29uZmlnJ3MgdmVyc2lvbgogICAgICAgYW5kIHRoaXMgdGFyZ2V0J3MgZXhwbGljaXRseSBkZWNsYXJlZCB2ZXJzaW9uLCBvciBlbHNlIHRoaXMgdGFyZ2V0IGRpZAogICAgICAgbm90IGV4cGxpY2l0bHkgZGVjbGFyZSBpdHMgdmVyc2lvbi4gKFRoZSBmb3JtZXIgZGlhZ25vc2VzIHRhcmdldHMKICAgICAgIGFmZmVjdGVkIGJ5ICM2NDQzLCBhbmQgdGhlIGxhdHRlciBkaWFnbm9zZXMgdGFyZ2V0cyB0aGF0IGFyZSBicm9rZW4gYnkKICAgICAgIGZpeGluZyAjNDgxNS4pCgogIFNlZSBhbHNvICM3ODk5LCAjODU0OSwgYW5kIFB5Q29tbW9uI3Nob3VsZFdhcm5BYm91dEhvc3RWZXJzaW9uVXBvbkZhaWx1cmUuCgogIFNpbmNlIHRoaXMgd2FybmluZyBpcyBlbWl0dGVkIGhlcmUgaW4gdGhlIHN0dWIgc2NyaXB0IGFuZCBub3QgaW4gQmF6ZWwgaXRzZWxmLAogIGl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbGwgZmFpbGluZyBydW5zIG9mIGFmZmVjdGVkIHRhcmdldHMsIGV2ZW4gd2hlbiBleGVjdXRlZAogIGRpcmVjdGx5IGFuZCBub3QgdmlhIGBiYXplbCBydW5gLiBIb3dldmVyLCBub3RlIHRoYXQgdGhpcyB3YXJuaW5nIGlzIG5ldmVyCiAgYWRkZWQgdG8gbm9uLWhvc3QtY29uZmlndXJlZCB0YXJnZXRzLCBhbmQgdGhhdCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgZW5zdXJpbmcKICB0aGUgY29ycmVjdCBQeXRob24gdmVyc2lvbiBpcyBwYXNzZWQgdG8gLS1ob3N0X2ZvcmNlX3B5dGhvbiBhbmQgZGVjbGFyZWQgaW4KICB0b29scycgcHl0aG9uX3ZlcnNpb24gYXR0cmlidXRlcy4KCiAgQXJnczoKICAgICAgcmV0X2NvZGU6IFRoZSBleGl0IGNvZGUgb2YgdGhlIHBheWxvYWQgdXNlciBwcm9ncmFtCiAgIiIiCiAgaWYgcmV0X2NvZGUgPT0gMDoKICAgIHJldHVybgogIGlmIG5vdCBGYWxzZToKICAgIHJldHVybgoKICBob3N0X3ZlcnNpb24gPSAiMyIKICB0YXJnZXRfdmVyc2lvbiA9ICIzIgogIG9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbiA9ICIyIiBpZiBob3N0X3ZlcnNpb24gPT0gIjMiIGVsc2UgIjMiCgogIGlmIEZhbHNlOgogICAgIyBNaXNtYXRjaCB3aXRoIGV4cGxpY2l0bHkgZGVjbGFyZWQgdmVyc2lvbi4KICAgIGRpYWdub3N0aWMgPSAiIiJcCk5vdGU6IFRoZSBmYWlsdXJlIG9mIHRhcmdldCB7dGFyZ2V0fSAod2l0aCBleGl0IGNvZGUge3JldF9jb2RlfSkgbWF5IGhhdmUgYmVlbiBcCmNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGlzIGEgUHl0aG9uIHt0YXJnZXRfdmVyc2lvbn0gcHJvZ3JhbSB0aGF0IHdhcyBidWlsdCBcCmluIHRoZSBob3N0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIHVzZXMgUHl0aG9uIHtob3N0X3ZlcnNpb259LiBZb3UgY2FuIGNoYW5nZSBcCnRoZSBob3N0IGNvbmZpZ3VyYXRpb24gKGZvciB0aGUgZW50aXJlIGJ1aWxkKSB0byBpbnN0ZWFkIHVzZSBQeXRob24gXAp7dGFyZ2V0X3ZlcnNpb259IGJ5IHNldHRpbmcgLS1ob3N0X2ZvcmNlX3B5dGhvbj1QWXt0YXJnZXRfdmVyc2lvbn0uXAoiIiIuZm9ybWF0KAogICAgdGFyZ2V0PSIvL3BhY2thZ2luZzp3aGx0b29sIiwKICAgIHJldF9jb2RlPXJldF9jb2RlLAogICAgdGFyZ2V0X3ZlcnNpb249dGFyZ2V0X3ZlcnNpb24sCiAgICBob3N0X3ZlcnNpb249aG9zdF92ZXJzaW9uKQogIGVsc2U6CiAgICBkaWFnbm9zdGljID0gIiIiXApOb3RlOiBUaGUgZmFpbHVyZSBvZiB0YXJnZXQge3RhcmdldH0gKHdpdGggZXhpdCBjb2RlIHtyZXRfY29kZX0pIG1heSBoYXZlIGJlZW4gXApjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBpcyBydW5uaW5nIHVuZGVyIFB5dGhvbiB7aG9zdF92ZXJzaW9ufSBpbnN0ZWFkIG9mIFwKUHl0aG9uIHtvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb259LiBFeGFtaW5lIHRoZSBlcnJvciB0byBkZXRlcm1pbmUgaWYgdGhhdCBcCmFwcGVhcnMgdG8gYmUgdGhlIHByb2JsZW0uIFNpbmNlIHRoaXMgdGFyZ2V0IGlzIGJ1aWx0IGluIHRoZSBob3N0IFwKY29uZmlndXJhdGlvbiwgdGhlIG9ubHkgd2F5IHRvIGNoYW5nZSBpdHMgdmVyc2lvbiBpcyB0byBzZXQgXAotLWhvc3RfZm9yY2VfcHl0aG9uPVBZe29wcG9zaXRlX29mX2hvc3RfdmVyc2lvbn0sIHdoaWNoIGFmZmVjdHMgdGhlIGVudGlyZSBcCmJ1aWxkLlwKIiIiLmZvcm1hdCgKICAgIHRhcmdldD0iLy9wYWNrYWdpbmc6d2hsdG9vbCIsCiAgICByZXRfY29kZT1yZXRfY29kZSwKICAgIGhvc3RfdmVyc2lvbj1ob3N0X3ZlcnNpb24sCiAgICBvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb249b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uKQoKICAjIFRPRE8oYnJhbmRqb24pOiBDaGFuZ2UgdGhlIHdvcmRpbmcgIllvdSBhcmUgbGlrZWx5IHNlZWluZyB0aGlzIG1lc3NhZ2UKICAjIGJlY2F1c2UiIHRvIHNvbWV0aGluZyBsZXNzIHN0cm9uZyBhZnRlciBhIGZldyByZWxlYXNlcyBmcm9tIDAuMjcuIEJ5IHRoYXQKICAjIHBvaW50LCBtaWdyYXRpb24gZm9yIHRvb2xjaGFpbnMgd29uJ3QgYmUgdGhlIG1haW4gcmVhc29uIHRoaXMgZXJyb3IgaXMgc2VlbgogICMgYnkgdXNlcnMuCiAgbWVzc2FnZSA9ICIiIlwKLS0tLS0tLS0tLS0tLS0tLQp7ZGlhZ25vc3RpY30KCklmIHRoaXMgZXJyb3Igc3RhcnRlZCBvY2N1cnJpbmcgaW4gQmF6ZWwgMC4yNyBhbmQgbGF0ZXIsIGl0IG1heSBiZSBiZWNhdXNlIHRoZSBcClB5dGhvbiB0b29sY2hhaW4gbm93IGVuZm9yY2VzIHRoYXQgdGFyZ2V0cyBhbmFseXplZCBhcyBQWTIgYW5kIFBZMyBydW4gdW5kZXIgYSBcClB5dGhvbiAyIGFuZCBQeXRob24gMyBpbnRlcnByZXRlciwgcmVzcGVjdGl2ZWx5LiBTZWUgXApodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvNzg5OSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS0tLS0tLS0tLS0tLS0tLSIiIi5mb3JtYXQoZGlhZ25vc3RpYz1kaWFnbm9zdGljKQogIHByaW50KG1lc3NhZ2UsIGZpbGU9c3lzLnN0ZGVycikKCmRlZiBNYWluKCk6CiAgYXJncyA9IHN5cy5hcmd2WzE6XQoKICBuZXdfZW52ID0ge30KCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgbW9kdWxlX3NwYWNlID0gQ3JlYXRlTW9kdWxlU3BhY2UoKQogIGVsc2U6CiAgICBtb2R1bGVfc3BhY2UgPSBGaW5kTW9kdWxlU3BhY2UoKQoKICBweXRob25faW1wb3J0cyA9ICdwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAnCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IENyZWF0ZVB5dGhvblBhdGhFbnRyaWVzKHB5dGhvbl9pbXBvcnRzLCBtb2R1bGVfc3BhY2UpCiAgcHl0aG9uX3BhdGhfZW50cmllcyArPSBHZXRSZXBvc2l0b3JpZXNJbXBvcnRzKG1vZHVsZV9zcGFjZSwgVHJ1ZSkKCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IFtHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZCkgZm9yIGQgaW4gcHl0aG9uX3BhdGhfZW50cmllc10KCiAgb2xkX3B5dGhvbl9wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogIHB5dGhvbl9wYXRoID0gb3MucGF0aHNlcC5qb2luKHB5dGhvbl9wYXRoX2VudHJpZXMpCiAgaWYgb2xkX3B5dGhvbl9wYXRoOgogICAgcHl0aG9uX3BhdGggKz0gb3MucGF0aHNlcCArIG9sZF9weXRob25fcGF0aAoKICBpZiBJc1dpbmRvd3MoKToKICAgIHB5dGhvbl9wYXRoID0gcHl0aG9uX3BhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKCiAgbmV3X2VudlsnUFlUSE9OUEFUSCddID0gcHl0aG9uX3BhdGgKICBydW5maWxlc19lbnZrZXksIHJ1bmZpbGVzX2VudnZhbHVlID0gUnVuZmlsZXNFbnZ2YXIobW9kdWxlX3NwYWNlKQogIGlmIHJ1bmZpbGVzX2VudmtleToKICAgIG5ld19lbnZbcnVuZmlsZXNfZW52a2V5XSA9IHJ1bmZpbGVzX2VudnZhbHVlCgogICMgTm93IGxvb2sgZm9yIG15IG1haW4gcHl0aG9uIHNvdXJjZSBmaWxlLgogICMgVGhlIG1hZ2ljIHN0cmluZyBwZXJjZW50LW1haW4tcGVyY2VudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUKICAjIG1haW4gZmlsZSBvZiB0aGUgUHl0aG9uIGJpbmFyeSBpbiBCYXplbFB5dGhvblNlbWFudGljcy5qYXZhLgogIHJlbF9wYXRoID0gJ3J1bGVzX3B5dGhvbi9wYWNrYWdpbmcvd2hsLnB5JwogIGlmIElzV2luZG93cygpOgogICAgcmVsX3BhdGggPSByZWxfcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBtYWluX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgcmVsX3BhdGgpCiAgbWFpbl9maWxlbmFtZSA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChtYWluX2ZpbGVuYW1lKQogIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhtYWluX2ZpbGVuYW1lKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgZm91bmQuJyAlIG1haW5fZmlsZW5hbWUKICBhc3NlcnQgb3MuYWNjZXNzKG1haW5fZmlsZW5hbWUsIG9zLlJfT0spLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCByZWFkYWJsZS4nICUgbWFpbl9maWxlbmFtZQoKICBwcm9ncmFtID0gcHl0aG9uX3Byb2dyYW0gPSBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSkKICBpZiBweXRob25fcHJvZ3JhbSBpcyBOb25lOgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHB5dGhvbiBiaW5hcnk6ICcgKyBQWVRIT05fQklOQVJZKQogIGFyZ3MgPSBbcHl0aG9uX3Byb2dyYW0sIG1haW5fZmlsZW5hbWVdICsgYXJncwoKICBvcy5lbnZpcm9uLnVwZGF0ZShuZXdfZW52KQoKICB0cnk6CiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgICAgIyBJZiBSVU5fVU5ERVJfUlVORklMRVMgZXF1YWxzIDEsIGl0IG1lYW5zIHdlIG5lZWQgdG8KICAgICAgIyBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByaWdodCBydW5maWxlcyBkaXJlY3RvcnkuCiAgICAgICMgKFNvIHRoYXQgdGhlIGRhdGEgZmlsZXMgYXJlIGFjY2Vzc2libGUpCiAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJSVU5fVU5ERVJfUlVORklMRVMiKSA9PSAiMSI6CiAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpKQogICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChhcmdzKQogICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShtb2R1bGVfc3BhY2UpLCBUcnVlKQogICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgIHN5cy5leGl0KHJldF9jb2RlKQogICAgZWxzZToKICAgICAgIyBPbiBXaW5kb3dzLCBvcy5leGVjdiBkb2Vzbid0IGhhbmRsZSBhcmd1bWVudHMgd2l0aCBzcGFjZXMgY29ycmVjdGx5LAogICAgICAjIGFuZCBpdCBhY3R1YWxseSBzdGFydHMgYSBzdWJwcm9jZXNzIGp1c3QgbGlrZSBzdWJwcm9jZXNzLmNhbGwuCiAgICAgICMKICAgICAgIyBJZiB3ZSBtYXkgbmVlZCB0byBlbWl0IGEgaG9zdCBjb25maWcgd2FybmluZyBhZnRlciBleGVjdXRpb24sIGRvbid0CiAgICAgICMgZXhlY3YgYmVjYXVzZSB3ZSBuZWVkIGNvbnRyb2wgdG8gcmV0dXJuIGhlcmUuIFRoaXMgb25seSBoYXBwZW5zIGZvcgogICAgICAjIHRhcmdldHMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnLCBzbyBvdGhlciB0YXJnZXRzIHN0aWxsIGdldCB0byB0YWtlCiAgICAgICMgYWR2YW50YWdlIG9mIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0cyBvZiBleGVjdi4KICAgICAgaWYgSXNXaW5kb3dzKCkgb3IgRmFsc2U6CiAgICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncykKICAgICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCiAgICAgIGVsc2U6CiAgICAgICAgb3MuZXhlY3YoYXJnc1swXSwgYXJncykKICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKICAgICMgVGhpcyB3b3JrcyBmcm9tIFB5dGhvbiAyLjQgYWxsIHRoZSB3YXkgdG8gMy54LgogICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAjIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIG9zLmV4ZWN2KCkgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgogICAgaWYgbm90IGdldGF0dHIoZSwgJ2ZpbGVuYW1lJywgTm9uZSk6CiAgICAgIGUuZmlsZW5hbWUgPSBwcm9ncmFtICAjIEFkZCBpbmZvIHRvIGVycm9yIG1lc3NhZ2UKICAgIHJhaXNlCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIE1haW4oKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAABIAAABzdWJwYXIvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAABzdWJwYXIvcnVudGltZS9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAj6BzPLcuAAC3LgAAGQAAAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHkjIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgoiIiJSdW50aW1lIHN1cHBvcnQgY29kZSBmb3IgZXhlY3V0YWJsZXMgY3JlYXRlZCBieSBTdWJwYXIuCgoxLiBUaGlyZC1wYXJ0eSBtb2R1bGVzIHJlcXVpcmUgc29tZSBQWVRIT05QQVRIIG1hbmlwdWxhdGlvbi4KCjIuIFB5dGhvbiBjYW4gbmF0aXZlbHkgaW1wb3J0IHB5dGhvbiBtb2R1bGVzIGZyb20gYSB6aXAgYXJjaGl2ZSwgYnV0CiAgIEMgZXh0ZW5zaW9uIG1vZHVsZXMgcmVxdWlyZSBzb21lIGhlbHAuCgozLiBSZXNvdXJjZXMgc3RvcmVkIGluIGEgLnBhciBmaWxlIG1heSBuZWVkIHRvIGJlIGV4cG9zZWQgYXMgT1MtbGV2ZWwKICAgZmlsZXMgaW5zdGVhZCBvZiBQeXRob24gRmlsZSBvYmplY3RzLgoKV2UgaG9vayBpbnRvIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgaWYgcHJlc2VudCwgdG8gYWNoaWV2ZSAyIGFuZCAzLgoKTGltaXRhdGlvbnM6CgpBLiBSZXRyaWV2aW5nIHJlc291cmNlcyBmcm9tIHBhY2thZ2VzCgpJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZG8gdGhpczoKICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnbXlwYWNrYWdlJywgJ215ZmlsZScpCkJ1dCBpbnN0ZWFkIG9uZSBtdXN0IGRvCiAgICBmbiA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoCiAgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlLnNwZWMoJ215cGFja2FnZScpLAogICAgICAgICAgICAgJ215ZmlsZScpCgpCLiBFeHRyYWN0aW9uIGRpcgoKWW91IHNob3VsZCBleHBsaWNpdGx5IHNldCB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIGRpcmVjdG9yeSwgdmlhCmBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgobXlfZGlyZWN0b3J5KWAsIHNpbmNlIHRoZSBkZWZhdWx0CmlzIG5vdCBzYWZlLiAgRm9yIGV4YW1wbGU6CgogICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uKHRtcGRpcikKCllvdSBzaG91bGQgYXJyYW5nZSBmb3IgdGhhdCBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZCBhdCBzb21lIHBvaW50LgpOb3RlIHRoYXQgcGtnX3Jlc291cmNlcy5jbGVhbnVwX3Jlc291cmNlcygpIGlzIGFuIHVuaW1wbGVtZW50ZWQgbm8tb3AsCnNvIHVzZSBzb21ldGhpbmcgZWxzZS4gIEZvciBleGFtcGxlOgoKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUodG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpKQoKIiIiCgppbXBvcnQgYXRleGl0CmltcG9ydCBvcwppbXBvcnQgcGtndXRpbAppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgemlwZmlsZQppbXBvcnQgemlwaW1wb3J0CgoKZGVmIF9sb2cobXNnKToKICAgICIiIlByaW50IGEgZGVidWdnaW5nIG1lc3NhZ2UgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHB5dGhvbiAtdnYgb3V0cHV0IiIiCiAgICBpZiBzeXMuZmxhZ3MudmVyYm9zZToKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZykKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcbicpCgoKZGVmIF9maW5kX2FyY2hpdmUoKToKICAgICIiIkZpbmQgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgLnBhciBmaWxlCgogICAgV2UgZG9uJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHByZWZpeCBpcyBub24tZW1wdHkuCiAgICAiIiIKICAgIG1haW4gPSBzeXMubW9kdWxlcy5nZXQoJ19fbWFpbl9fJykKICAgIGlmIG5vdCBtYWluOgogICAgICAgIF9sb2coJyMgX19tYWluX18gbW9kdWxlIG5vdCBmb3VuZCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIG1haW5fbG9hZGVyID0gZ2V0YXR0cihtYWluLCAnX19sb2FkZXJfXycpCiAgICBpZiBub3QgbWFpbl9sb2FkZXI6CiAgICAgICAgX2xvZygnIyBfX21haW5fXy5fX2xvYWRlcl9fIG5vdCBzZXQnKQogICAgICAgIHJldHVybiBOb25lCiAgICBwcmVmaXggPSBnZXRhdHRyKG1haW5fbG9hZGVyLCAncHJlZml4JykKICAgIGlmIHByZWZpeCAhPSAnJzoKICAgICAgICBfbG9nKCcjIHVuZXhwZWN0ZWQgcHJlZml4IGZvciBfX21haW5fXy5fX2xvYWRlcl9fIGlzICVzJyAlCiAgICAgICAgICAgICBtYWluX2xvYWRlci5wcmVmaXgpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGFyY2hpdmVfcGF0aCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdhcmNoaXZlJykKICAgIGlmIG5vdCBhcmNoaXZlX3BhdGg6CiAgICAgICAgX2xvZygnIyBtaXNzaW5nIGFyY2hpdmUgZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18nKQogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gYXJjaGl2ZV9wYXRoCgoKZGVmIF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCk6CiAgICAiIiJFeHRyYWN0IHRoZSBjb250ZW50cyBvZiB0aGlzIC5wYXIgZmlsZSB0byBkaXNrLgoKICAgIFRoaXMgY3JlYXRlcyBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCByZWdpc3RlcnMgYW4gYXRleGl0CiAgICBoYW5kbGVyIHRvIGNsZWFuIHRoYXQgZGlyZWN0b3J5IG9uIHByb2dyYW0gZXhpdC4gIEV4dHJhY3Rpb24gYW5kCiAgICBjbGVhbnVwIHdpbGwgcG90ZW50aWFsbHkgdXNlIHNpZ25pZmljYW50IHRpbWUgYW5kIGRpc2sgc3BhY2UuCgogICAgUmV0dXJuczoKICAgICAgICBEaXJlY3Rvcnkgd2hlcmUgY29udGVudHMgd2VyZSBleHRyYWN0ZWQgdG8uCiAgICAiIiIKICAgIGV4dHJhY3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCgogICAgZGVmIF9leHRyYWN0X2ZpbGVzX2NsZWFudXAoKToKICAgICAgICBzaHV0aWwucm10cmVlKGV4dHJhY3RfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICBhdGV4aXQucmVnaXN0ZXIoX2V4dHJhY3RfZmlsZXNfY2xlYW51cCkKICAgIF9sb2coJyMgZXh0cmFjdGluZyAlcyB0byAlcycgJSAoYXJjaGl2ZV9wYXRoLCBleHRyYWN0X2RpcikpCgogICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoYXJjaGl2ZV9wYXRoLCBtb2RlPSdyJykKICAgIHppcF9maWxlLmV4dHJhY3RhbGwoZXh0cmFjdF9kaXIpCiAgICB6aXBfZmlsZS5jbG9zZSgpCgogICAgcmV0dXJuIGV4dHJhY3RfZGlyCgoKZGVmIF92ZXJzaW9uX2NoZWNrX3BrZ19yZXNvdXJjZXMocGtnX3Jlc291cmNlcyk6CiAgICAiIiJDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZC4iIiIKICAgICMgQ2hlY2sgdGhhdCBwa2dfcmVzb3VyY2VzIGlzIG5ldyBlbm91Z2guCiAgICAjCiAgICAjIERldGVybWluaW5nIHRoZSB2ZXJzaW9uIG9mIGFuIGFyYml0cmFyaWx5IG9sZCB2ZXJzaW9uIG9mCiAgICAjIHBrZ19yZXNvdXJjZXMgaXMgdG91Z2gsIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhIHZlcnNpb24gbGl0ZXJhbCwKICAgICMgYW5kIHRoZSBhY2NvbXBhbnlpbmcgc2V0dXB0b29scyBwYWNrYWdlIGNvbXB1dGVzIGl0cyB2ZXJzaW9uCiAgICAjIGR5bmFtaWNhbGx5IGZyb20gbWV0YWRhdGEgdGhhdCBtaWdodCBub3QgZXhpc3QuICBBbHNvIHNldHVwdG9vbHMKICAgICMgbWlnaHQgbm90IGV4aXN0LCBlc3BlY2lhbGx5IGluIHRoZSBjYXNlIG9mIHRoZSBwaXAtdmVuZG9yZWQgY29weQogICAgIyBvZiBwa2dfcmVzb3VyY2VzLgogICAgIwogICAgIyBXZSBkbyBhIGZlYXR1cmUgZGV0ZWN0aW9uIGluc3RlYWQuICBXZSBleGFtaW5lCiAgICAjIHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQsIGFuZCBzZWUgaWYgaXQgaGFzIGF0IGxlYXN0IHRoZQogICAgIyB0aGlyZCBkZWZhdWx0IGFyZ3VtZW50ICgncmVwbGFjZScpLgogICAgdHJ5OgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuaW1fZnVuYy5mdW5jX2RlZmF1bHRzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVmYXVsdHMgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQuYWRkLl9fZGVmYXVsdHNfXwogICAgICAgIHJldHVybiBsZW4oZGVmYXVsdHMpID49IDMKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKCgpkZWYgX3NldHVwX3BrZ19yZXNvdXJjZXMocGtnX3Jlc291cmNlc19uYW1lKToKICAgICIiIlNldHVwIGhvb2tzIGludG8gdGhlIGBwa2dfcmVzb3VyY2VzYCBtb2R1bGUKCiAgICBUaGlzIGVuYWJsZXMgdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlIHRvIGZpbmQgbWV0YWRhdGEgZnJvbSB3aGVlbHMKICAgIHRoYXQgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIHRoaXMgLnBhciBmaWxlLgoKICAgIFRoZSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgaGVyZSBhcmUgc2NvcGVkIHRvIHRoaXMgZnVuY3Rpb24sIHNpbmNlCiAgICB3ZSBtaWdodCBoYXZlIG11bHRpdHBsZSBwa2dfcmVzb3VyY2VzIG1vZHVsZXMsIG9yIG5vbmUuCiAgICAiIiIKCiAgICB0cnk6CiAgICAgICAgX19pbXBvcnRfXyhwa2dfcmVzb3VyY2VzX25hbWUpCiAgICAgICAgcGtnX3Jlc291cmNlcyA9IHN5cy5tb2R1bGVzLmdldChwa2dfcmVzb3VyY2VzX25hbWUpCiAgICAgICAgaWYgcGtnX3Jlc291cmNlcyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIFNraXAgc2V0dXAKICAgICAgICByZXR1cm4KCiAgICBpZiBub3QgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICAgICAjIFNraXAgc2V0dXAKICAgICAgICByZXR1cm4KCiAgICBjbGFzcyBEaXN0SW5mb01ldGFkYXRhKHBrZ19yZXNvdXJjZXMuRWdnTWV0YWRhdGEpOgogICAgICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciB6aXAgZmlsZXMgY29udGFpbmluZyAuZGlzdC1pbmZvCgogICAgICAgIEluIGZpbmRfZGlzdF9pbmZvX2luX3ppcCgpLCB3ZSBjYWxsCiAgICAgICAgbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcihkaXJlY3RvcnlfbmFtZSkuICBIb3dldmVyLCBpdCBkb2Vzbid0CiAgICAgICAgd29yayB3aXRoIEVnZ01ldGFkYXRhLCBiZWNhdXNlIF96aXBpbmZvX25hbWUoKSBleHBlY3RzIHRoZQogICAgICAgIGRpcmVjdG9yeSBuYW1lIHRvIGVuZCB3aXRoIGEgLywgYnV0IG1ldGFkYXRhLl9saXN0ZGlyKCkgd2hpY2gKICAgICAgICBleHBlY3RzIHRoZSBkaXJlY3RvcnkgdG8gX25vdF8gZW5kIHdpdGggYSAvLgoKICAgICAgICBUaGVyZWZvcmUgdGhpcyBjbGFzcyBleGlzdHMuCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5femlwaW5mb19uYW1lIiIiCiAgICAgICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEKICAgICAgICAgICAgIyB6aXBmaWxlIHN1YnBhdGggdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICAgICAgIyBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgICAgIGZzcGF0aCA9IGZzcGF0aC5yc3RyaXAob3Muc2VwKQogICAgICAgICAgICBpZiBmc3BhdGggPT0gc2VsZi5sb2FkZXIuYXJjaGl2ZToKICAgICAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi56aXBfcHJlKQogICAgICAgICAgICApCgogICAgICAgIGRlZiBfcGFydHMoc2VsZiwgemlwX3BhdGgpOgogICAgICAgICAgICAiIiJPdmVycmlkZXMgRWdnTWV0YWRhdGEuX3BhcnRzIiIiCiAgICAgICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQKICAgICAgICAgICAgIyBsaXN0LgogICAgICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgICAgICBpZiBmc3BhdGggPT0gc2VsZi5lZ2dfcm9vdDoKICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLmVnZ19yb290ICsgb3Muc2VwKToKICAgICAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpICsgMTpdLnNwbGl0KG9zLnNlcCkKICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLmVnZ19yb290KQogICAgICAgICAgICApCgogICAgZGVmIGZpbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJGaW5kIGRpc3QtaW5mbyBzdHlsZSBtZXRhZGF0YSBpbiB6aXAgZmlsZXMuCgogICAgICAgIGltcG9ydGVyOiBQRVAgMzAyLXN0eWxlIEltcG9ydGVyIG9iamVjdAogICAgICAgIHBhdGhfaXRlbSAoc3RyKTogZmlsZW5hbWUgb3IgcHNldWRvLWZpbGVuYW1lIGxpa2U6CiAgICAgICAgICAgIC91c3Ivc29tZWRpcnMvbWFpbi5wYXIKICAgICAgICAgICAgb3IKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhci9weXBpX19wb3J0cGlja2VyXzFfMl8wCiAgICAgICAgb25seSAoYm9vbCk6IFdlIGlnbm9yZSB0aGUgYG9ubHlgIGZsYWcgYmVjYXVzZSBpdCdzIG5vdCBjbGVhcgogICAgICAgICAgICB3aGF0IGl0IHNob3VsZCBhY3R1YWxseSBkbyBpbiB0aGlzIGNhc2UuCgogICAgICAgIFlpZWxkcyBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBvYmplY3RzCiAgICAgICAgIiIiCiAgICAgICAgbWV0YWRhdGEgPSBEaXN0SW5mb01ldGFkYXRhKGltcG9ydGVyKQogICAgICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKICAgICAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc3ViaXRlbSkKICAgICAgICAgICAgaWYgZXh0Lmxvd2VyKCkgPT0gJy5kaXN0LWluZm8nOgogICAgICAgICAgICAgICAgIyBQYXJzZSBkaXN0cmlidXRpb24gbmFtZQogICAgICAgICAgICAgICAgbWF0Y2ggPSBwa2dfcmVzb3VyY2VzLkVHR19OQU1FKGJhc2VuYW1lKQogICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gJ3Vua25vd24nCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSBtYXRjaC5ncm91cCgnbmFtZScpCiAgICAgICAgICAgICAgICAjIENyZWF0ZSBtZXRhZGF0YSBvYmplY3QKICAgICAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICAgICAgc3VibWV0YSA9IERpc3RJbmZvTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGhfaXRlbSkpCiAgICAgICAgICAgICAgICAjIE92ZXJyaWRlIHBrZ19yZXNvdXJjZXMgZGVmYXVsdHMgdG8gYXZvaWQKICAgICAgICAgICAgICAgICMgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdAogICAgICAgICAgICAgICAgIyAuemlwIiBtZXNzYWdlCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19uYW1lID0gcHJvamVjdF9uYW1lCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19pbmZvID0gc3VicGF0aAogICAgICAgICAgICAgICAgc3VibWV0YS5lZ2dfcm9vdCA9IHBhdGhfaXRlbQogICAgICAgICAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBzdWJpdGVtLCBzdWJtZXRhKQogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgIGRlZiBmaW5kX2VnZ3NfYW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAgICAgIiIiQ2hhaW4gdG9nZXRoZXIgb3VyIGZpbmRlciBhbmQgdGhlIHN0YW5kYXJkIHBrZ19yZXNvdXJjZXMgZmluZGVyCgogICAgICAgIEZvciBzaW1wbGljaXR5LCBhbmQgc2luY2UgcGtnX3Jlc291cmNlcyBkb2Vzbid0IHByb3ZpZGUgYSBwdWJsaWMKICAgICAgICBpbnRlcmZhY2UgdG8gZG8gc28sIHdlIGhhcmRjb2RlIHRoZSBjaGFpbmluZyAoZmluZF9lZ2dzX2luX3ppcCkuCiAgICAgICAgIiIiCiAgICAgICAgIyBPdXIgZmluZGVyCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpOgogICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgIyBUaGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBwa2dfcmVzb3VyY2VzLmZpbmRfZWdnc19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICByZXR1cm4KCiAgICAjIFRoaXMgb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgcmVnaXN0ZXJlZCBmaW5kZXIuCiAgICBwa2dfcmVzb3VyY2VzLnJlZ2lzdGVyX2ZpbmRlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX2VnZ3NfYW5kX2Rpc3RfaW5mb19pbl96aXApCgogICAgIyBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgV29ya2luZ1NldCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGFuZAogICAgIyB0aGVyZSBpcyBubyBwdWJsaWMgaW50ZXJmYWNlIHRvIGVhc2lseSByZWZyZXNoL3JlbG9hZCBpdCB0aGF0CiAgICAjIGRvZXNuJ3QgYWxzbyBoYXZlIGEgIkRvbid0IHVzZSB0aGlzIiB3YXJuaW5nLiAgU28gd2UgbWFudWFsbHkKICAgICMgYWRkIGp1c3QgdGhlIGVudHJpZXMgd2Uga25vdyBhYm91dCB0byB0aGUgZXhpc3RpbmcgV29ya2luZ1NldC4KICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDoKICAgICAgICBpbXBvcnRlciA9IHBrZ3V0aWwuZ2V0X2ltcG9ydGVyKGVudHJ5KQogICAgICAgIGlmIGlzaW5zdGFuY2UoaW1wb3J0ZXIsIHppcGltcG9ydC56aXBpbXBvcnRlcik6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgZW50cnksIG9ubHk9VHJ1ZSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpc3QuX3Byb3ZpZGVyLCBEaXN0SW5mb01ldGFkYXRhKToKICAgICAgICAgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmFkZChkaXN0LCBlbnRyeSwgaW5zZXJ0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U9VHJ1ZSkKCgpkZWYgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KToKICAgICIiIkFkZCBleHRyYSBlbnRyaWVzIHRvIFBZVEhPTlBBVEggc28gdGhhdCBtb2R1bGVzIGNhbiBiZSBpbXBvcnRlZC4iIiIKICAgICMgV2UgdHJ5IHRvIG1hdGNoIHRvIG9yZGVyIG9mIEJhemVsJ3Mgc3R1YgogICAgZnVsbF9yb290cyA9IFsKICAgICAgICBvcy5wYXRoLmpvaW4oaW1wb3J0X3ByZWZpeCwgaW1wb3J0X3Jvb3QpCiAgICAgICAgZm9yIGltcG9ydF9yb290IGluIGltcG9ydF9yb290c10KICAgIHN5cy5wYXRoWzE6MV0gPSBmdWxsX3Jvb3RzCiAgICBfbG9nKCcjIGFkZGluZyAlcyB0byBzeXMucGF0aCcgJSBmdWxsX3Jvb3RzKQoKCmRlZiBzZXR1cChpbXBvcnRfcm9vdHMsIHppcF9zYWZlKToKICAgICIiIkluaXRpYWxpemUgc3VicGFyIHJ1bi10aW1lIHN1cHBvcnQKCiAgICBBcmdzOgogICAgICBpbXBvcnRfcm9vdCAobGlzdCk6IHN1YmRpcnMgaW5zaWRlIC5wYXIgZmlsZSB0byBhZGQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGltcG9ydCBwYXRoIGF0IHJ1bnRpbWUuCiAgICAgIHppcF9zYWZlIChib29sKTogSWYgRmFsc2UsIGV4dHJhY3QgdGhlIC5wYXIgZmlsZSBjb250ZW50cyB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIGltcG9ydCBldmVyeXRoaW5nIGZyb20KICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRpcmVjdG9yeS4KCiAgICBSZXR1cm5zOgogICAgICBUcnVlIGlmIHNldHVwIHdhcyBzdWNjZXNzZnVsLCBlbHNlIEZhbHNlCiAgICAiIiIKICAgIGFyY2hpdmVfcGF0aCA9IF9maW5kX2FyY2hpdmUoKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICB3YXJuaW5ncy53YXJuKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSAucGFyIGZpbGUgcnVudGltZSBzdXBwb3J0JywKICAgICAgICAgICAgICAgICAgICAgIFVzZXJXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQogICAgaWYgb3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoWzBdKSAhPSBvcy5wYXRoLmFic3BhdGgoYXJjaGl2ZV9wYXRoKToKICAgICAgICB3YXJuaW5ncy53YXJuKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSAucGFyIGZpbGUgcnVudGltZSBzdXBwb3J0LiAnICsKICAgICAgICAgICAgICAgICAgICAgICdhcmNoaXZlX3BhdGggd2FzICVyLCBzeXMucGF0aCB3YXMgJXInICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aCwgc3lzLnBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBFeHRyYWN0IGZpbGVzIHRvIGRpc2sgaWYgbmVjZXNzYXJ5CiAgICBpZiBub3QgemlwX3NhZmU6CiAgICAgICAgZXh0cmFjdF9kaXIgPSBfZXh0cmFjdF9maWxlcyhhcmNoaXZlX3BhdGgpCiAgICAgICAgIyBzeXMucGF0aFswXSBpcyB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0aW5nIC5wYXIgZmlsZS4gIFBvaW50CiAgICAgICAgIyBpdCB0byB0aGUgZXh0cmFjdCBkaXJlY3RvcnkgaW5zdGVhZCwgc28gdGhhdCBQeXRob24gc2VhcmNoZXMKICAgICAgICAjIHRoZXJlIGZvciBpbXBvcnRzLgogICAgICAgIHN5cy5wYXRoWzBdID0gZXh0cmFjdF9kaXIKICAgICAgICBpbXBvcnRfcHJlZml4ID0gZXh0cmFjdF9kaXIKICAgIGVsc2U6ICAjIEltcG9ydCBkaXJlY3RseSBmcm9tIC5wYXIgZmlsZQogICAgICAgIGV4dHJhY3RfZGlyID0gTm9uZQogICAgICAgIGltcG9ydF9wcmVmaXggPSBhcmNoaXZlX3BhdGgKCiAgICAjIEluaXRpYWxpemUgaW1wb3J0IHBhdGgKICAgIF9pbml0aWFsaXplX2ltcG9ydF9wYXRoKGltcG9ydF9yb290cywgaW1wb3J0X3ByZWZpeCkKCiAgICAjIEFkZCBob29rIGZvciBwYWNrYWdlIG1ldGFkYXRhCiAgICBfc2V0dXBfcGtnX3Jlc291cmNlcygncGtnX3Jlc291cmNlcycpCiAgICBfc2V0dXBfcGtnX3Jlc291cmNlcygncGlwLl92ZW5kb3IucGtnX3Jlc291cmNlcycpCgogICAgcmV0dXJuIFRydWUKUEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAFwAAAF9faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI4c6nA1HQAANR0AAAsAAAAAAAAAAAAAAAAAQAAAAF9fbWFpbl9fLnB5UEsBAhQDFAAAAAAAAAAhAE85aVXiDQAA4g0AACYAAAAAAAAAAAAAAAAAnh0AAGJhemVsX3Rvb2xzL3Rvb2xzL3B5dGhvbi9weTN3cmFwcGVyLnNoUEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAxCsAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBcT7pFfgAAAH4AAAA0AAAAAAAAAAAAAAAAABIsAABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhABxssk89pwEAPacBAD4AAAAAAAAAAAAAAAAA4iwAAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEYAAAAAAAAAAAAAAAAAe9QBAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAhvNh1H1gAAB9YAAARQAAAAAAAAAAAAAAAADf1AEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5UEsBAhQDFAAAAAAAAAAhADwpWMbQAgAA0AIAAFEAAAAAAAAAAAAAAAAAvzUCAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weVBLAQIUAxQAAAAAAAAAIQCBdpbKAQIAAAECAABQAAAAAAAAAAAAAAAAAP44AgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDmaUrjXAMAAFwDAABPAAAAAAAAAAAAAAAAAG07AgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAPr9pBKIBQAAiAUAAFMAAAAAAAAAAAAAAAAANj8CAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5UEsBAhQDFAAAAAAAAAAhADD4E9w4IAAAOCAAAE8AAAAAAAAAAAAAAAAAL0UCAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEApYYd2wMRAAADEQAAVAAAAAAAAAAAAAAAAADUZQIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5UEsBAhQDFAAAAAAAAAAhAHxFg4x5bQAAeW0AAFIAAAAAAAAAAAAAAAAASXcCAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHlQSwECFAMUAAAAAAAAACEAxeonD6UBAAClAQAATQAAAAAAAAAAAAAAAAAy5QIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHlQSwECFAMUAAAAAAAAACEADu/GoSQtAAAkLQAATwAAAAAAAAAAAAAAAABC5wIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQBmD4Sxd4oDAHeKAwBHAAAAAAAAAAAAAAAAANMUAwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AABBAAAAAAAAAAAAAAAAAK+fBgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weVBLAQIUAxQAAAAAAAAAIQDznfLBwgkAAMIJAABFAAAAAAAAAAAAAAAAAKAVBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAi8CSRi4CAAAuAgAAQAAAAAAAAAAAAAAAAADFHwcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3BrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQBQ16sHNgQAADYEAABIAAAAAAAAAAAAAAAAAFEiBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL0xJQ0VOU0VQSwECFAMUAAAAAAAAACEAMZDeoHgOAAB4DgAASQAAAAAAAAAAAAAAAADtJgcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBzz4mFKCMAACgjAABHAAAAAAAAAAAAAAAAAMw1BwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1JFQ09SRFBLAQIUAxQAAAAAAAAAIQCq4Eb2bgAAAG4AAABGAAAAAAAAAAAAAAAAAFlZBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL1dIRUVMUEsBAhQDFAAAAAAAAAAhADfZX93vAAAA7wAAAFUAAAAAAAAAAAAAAAAAK1oHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHRQSwECFAMUAAAAAAAAACEArHUfCIYMAACGDAAAUQAAAAAAAAAAAAAAAACNWwcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMtNDQuMC4wLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0UEsBAhQDFAAAAAAAAAAhADBcAZEmAAAAJgAAAE4AAAAAAAAAAAAAAAAAgmgHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzLTQ0LjAuMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAABJAAAAAAAAAAAAAAAAABRpBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy00NC4wLjAuZGlzdC1pbmZvL3ppcC1zYWZlUEsBAhQDFAAAAAAAAAAhANHA3+pzHAAAcxwAADsAAAAAAAAAAAAAAAAAfGkHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAA6sEkraAAAA2gAAAEcAAAAAAAAAAAAAAAAASIYHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19kZXByZWNhdGlvbl93YXJuaW5nLnB5UEsBAhQDFAAAAAAAAAAhAFsURI6vCAAArwgAADcAAAAAAAAAAAAAAAAAh4cHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL19pbXAucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAQwAAAAAAAAAAAAAAAACLkAcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBEwyoDGjsAABo7AABGAAAAAAAAAAAAAAAAAOyQBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL29yZGVyZWRfc2V0LnB5UEsBAhQDFAAAAAAAAAAhAIrXf9DoAgAA6AIAAE4AAAAAAAAAAAAAAAAAaswHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weVBLAQIUAxQAAAAAAAAAIQBlGxFEMgIAADICAABNAAAAAAAAAAAAAAAAAL7PBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBmitrjYQMAAGEDAABMAAAAAAAAAAAAAAAAAFvSBwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAGuPHJWIBQAAiAUAAFAAAAAAAAAAAAAAAAAAJtYHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5UEsBAhQDFAAAAAAAAAAhAC854rJMIAAATCAAAEwAAAAAAAAAAAAAAAAAHNwHAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEAOPpXXIYSAACGEgAAUQAAAAAAAAAAAAAAAADS/AcAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5UEsBAhQDFAAAAAAAAAAhAPKIRtOCbAAAgmwAAE8AAAAAAAAAAAAAAAAAxw8IAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHlQSwECFAMUAAAAAAAAACEA8/aH/4UyAACFMgAASQAAAAAAAAAAAAAAAAC2fAgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvX3ZlbmRvci9wYWNrYWdpbmcvdGFncy5weVBLAQIUAxQAAAAAAAAAIQBhPa2d8AUAAPAFAABKAAAAAAAAAAAAAAAAAKKvCABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weVBLAQIUAxQAAAAAAAAAIQDxM3Lryi4AAMouAABMAAAAAAAAAAAAAAAAAPq1CABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAGYPhLF3igMAd4oDAEQAAAAAAAAAAAAAAAAALuUIAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3IvcHlwYXJzaW5nLnB5UEsBAhQDFAAAAAAAAAAhAJlYTVqSdQAAknUAAD4AAAAAAAAAAAAAAAAAB3AMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL192ZW5kb3Ivc2l4LnB5UEsBAhQDFAAAAAAAAAAhAKWHZVHAGQAAwBkAAD8AAAAAAAAAAAAAAAAA9eUMAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQDGtbJjfSUAAH0lAAA9AAAAAAAAAAAAAAAAABIADQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9idWlsZF9tZXRhLnB5UEsBAhQDFAAAAAAAAAAhAPWGemkAAAEAAAABADoAAAAAAAAAAAAAAAAA6iUNAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NsaS0zMi5leGVQSwECFAMUAAAAAAAAACEAYnDO2wAkAQAAJAEAOgAAAAAAAAAAAAAAAABCJg4AcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY2xpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQA3AAAAAAAAAAAAAAAAAJpKDwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jbGkuZXhlUEsBAhQDFAAAAAAAAAAhABbvGQU4AgAAOAIAAEMAAAAAAAAAAAAAAAAA70oQAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAUPgj8noJAAB6CQAAQAAAAAAAAAAAAAAAAACITRAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weVBLAQIUAxQAAAAAAAAAIQCcbDkwCUcAAAlHAABEAAAAAAAAAAAAAAAAAGBXEABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weVBLAQIUAxQAAAAAAAAAIQDr0nQW5AUAAOQFAABEAAAAAAAAAAAAAAAAAMueEABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weVBLAQIUAxQAAAAAAAAAIQAgjHUUfQIAAH0CAABIAAAAAAAAAAAAAAAAABGlEABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlQSwECFAMUAAAAAAAAACEAJxqNG4QRAACEEQAARQAAAAAAAAAAAAAAAAD0pxAAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5UEsBAhQDFAAAAAAAAAAhAI0o/XDbMgAA2zIAAEQAAAAAAAAAAAAAAAAA27kQAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5UEsBAhQDFAAAAAAAAAAhAEBGQtx8JQAAfCUAAEMAAAAAAAAAAAAAAAAAGO0QAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlQSwECFAMUAAAAAAAAACEA0M3zPfgfAAD4HwAAQgAAAAAAAAAAAAAAAAD1EhEAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5UEsBAhQDFAAAAAAAAAAhAP/o9pHAAwAAwAMAAEQAAAAAAAAAAAAAAAAATTMRAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAFZjmkX4VQEA+FUBAEcAAAAAAAAAAAAAAAAAbzcRAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhADGJ9PbiYwAA4mMAAEMAAAAAAAAAAAAAAAAAzI0SAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHlQSwECFAMUAAAAAAAAACEAUGERrGESAABhEgAAQgAAAAAAAAAAAAAAAAAP8hIAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAFzSqOWbCAAAmwgAAEsAAAAAAAAAAAAAAAAA0AQTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQAS04wqFg8AABYPAABGAAAAAAAAAAAAAAAAANQNEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5UEsBAhQDFAAAAAAAAAAhAEY/8R6HCQAAhwkAAEoAAAAAAAAAAAAAAAAATh0TAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5UEsBAhQDFAAAAAAAAAAhAH1zYL96EwAAehMAAEUAAAAAAAAAAAAAAAAAPScTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQB20uq11AEAANQBAABDAAAAAAAAAAAAAAAAABo7EwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5UEsBAhQDFAAAAAAAAAAhABnK1KR0CAAAdAgAAEEAAAAAAAAAAAAAAAAATz0TAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5UEsBAhQDFAAAAAAAAAAhAASB1jSSAgAAkgIAAEMAAAAAAAAAAAAAAAAAIkYTAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlQSwECFAMUAAAAAAAAACEAcIo2B5gfAACYHwAAQAAAAAAAAAAAAAAAAAAVSRMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weVBLAQIUAxQAAAAAAAAAIQCbcMvH3RMAAN0TAABBAAAAAAAAAAAAAAAAAAtpEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weVBLAQIUAxQAAAAAAAAAIQDdlpzPgiUAAIIlAAA/AAAAAAAAAAAAAAAAAEd9EwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlQSwECFAMUAAAAAAAAACEAIgBdS84BAADOAQAAQQAAAAAAAAAAAAAAAAAmoxMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlQSwECFAMUAAAAAAAAACEA8pfzxo8cAACPHAAARgAAAAAAAAAAAAAAAABTpRMAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weVBLAQIUAxQAAAAAAAAAIQBN79JTX1AAAF9QAAA5AAAAAAAAAAAAAAAAAEbCEwBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9jb25maWcucHlQSwECFAMUAAAAAAAAACEAGiIEMqcDAACnAwAAOwAAAAAAAAAAAAAAAAD8EhQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGVwX3V0aWwucHlQSwECFAMUAAAAAAAAACEA/RlbCo0VAACNFQAAOgAAAAAAAAAAAAAAAAD8FhQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZGVwZW5kcy5weVBLAQIUAxQAAAAAAAAAIQAV8l+UwcIAAMHCAAA3AAAAAAAAAAAAAAAAAOEsFABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9kaXN0LnB5UEsBAhQDFAAAAAAAAAAhALv/UeYMAgAADAIAADkAAAAAAAAAAAAAAAAA9+8UAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2Vycm9ycy5weVBLAQIUAxQAAAAAAAAAIQC5qpHuwQYAAMEGAAA8AAAAAAAAAAAAAAAAAFryFABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9leHRlbnNpb24ucHlQSwECFAMUAAAAAAAAACEAxyRsk9IJAADSCQAAQgAAAAAAAAAAAAAAAAB1+RQAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI7IT2vcEwAA3BMAADcAAAAAAAAAAAAAAAAApwMVAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2dsb2IucHlQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEAOgAAAAAAAAAAAAAAAADYFxUAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvZ3VpLTMyLmV4ZVBLAQIUAxQAAAAAAAAAIQDYDqv0ACYBAAAmAQA6AAAAAAAAAAAAAAAAADAYFgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9ndWktNjQuZXhlUEsBAhQDFAAAAAAAAAAhABD5/CkAAAEAAAABADcAAAAAAAAAAAAAAAAAiD4XAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2d1aS5leGVQSwECFAMUAAAAAAAAACEAgN0QJ9kUAADZFAAAPAAAAAAAAAAAAAAAAADdPhgAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvaW5zdGFsbGVyLnB5UEsBAhQDFAAAAAAAAAAhAGT5fpsTAwAAEwMAADkAAAAAAAAAAAAAAAAAEFQYAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL2xhdW5jaC5weVBLAQIUAxQAAAAAAAAAIQCHUeui3QcAAN0HAAA9AAAAAAAAAAAAAAAAAHpXGABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9saWIydG8zX2V4LnB5UEsBAhQDFAAAAAAAAAAhABRjSMuQFAAAkBQAADkAAAAAAAAAAAAAAAAAsl8YAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL21vbmtleS5weVBLAQIUAxQAAAAAAAAAIQAyp/xcn7YAAJ+2AAA3AAAAAAAAAAAAAAAAAJl0GABwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9tc3ZjLnB5UEsBAhQDFAAAAAAAAAAhAGML49Z/DAAAfwwAAD0AAAAAAAAAAAAAAAAAjSsZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL25hbWVzcGFjZXMucHlQSwECFAMUAAAAAAAAACEAngXYjZ2eAACdngAAQAAAAAAAAAAAAAAAAABnOBkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQD+BUTU2AUAANgFAAA9AAAAAAAAAAAAAAAAAGLXGQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAN7LMOJGAwAARgMAAD0AAAAAAAAAAAAAAAAAld0ZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAB2HYojIFAAAyBQAAPQAAAAAAAAAAAAAAAAA24RkAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQCOVtBE9QAAAPUAAAA9AAAAAAAAAAAAAAAAAMPmGQBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9weTM0Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAIxTmmPENwAAxDcAADoAAAAAAAAAAAAAAAAAE+gZAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3NhbmRib3gucHlQSwECFAMUAAAAAAAAACEAqDO0vooAAACKAAAAOwAAAAAAAAAAAAAAAAAvIBoAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2NyaXB0LnRtcGxQSwECFAMUAAAAAAAAACEArSqDNv4IAAD+CAAAPQAAAAAAAAAAAAAAAAASIRoAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weVBLAQIUAxQAAAAAAAAAIQDOlTSOLSEAAC0hAAA+AAAAAAAAAAAAAAAAAGsqGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQCaQtea5AMAAOQDAABAAAAAAAAAAAAAAAAAAPRLGgBwaXB0b29sX2RlcHNfcHlwaV9fc2V0dXB0b29sc180NF8wXzAvc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAEixTGKQAAAAkAAAADoAAAAAAAAAAAAAAAAANlAaAHBpcHRvb2xfZGVwc19weXBpX19zZXR1cHRvb2xzXzQ0XzBfMC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAsMVFgAchAAAHIQAAOAAAAAAAAAAAAAAAAAAeURoAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvd2hlZWwucHlQSwECFAMUAAAAAAAAACEA+cvuDcoCAADKAgAAQgAAAAAAAAAAAAAAAAB7choAcGlwdG9vbF9kZXBzX3B5cGlfX3NldHVwdG9vbHNfNDRfMF8wL3NldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAApXUaAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5rtpdiccAAAnHAAAHQAAAAAAAAAAAAAAAADldRoAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHlQSwECFAMUAAAAAAAAACEAd1KdVfoxAAD6MQAAHgAAAAAAAAAAAAAAAABHkhoAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGx0b29sUEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAfcQaAHN1YnBhci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAK3EGgBzdWJwYXIvcnVudGltZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAAAAAAAAAAAAAAOXEGgBzdWJwYXIvcnVudGltZS9zdXBwb3J0LnB5UEsFBgAAAABwAHAA6C8AANPzGgAAAA==