Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdHlwZXMucHk6IHRlc3RzIGZvciB0eXBlIGNvbnZlcnNpb24gYW5kIGRldGVjdGlvbgojCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQp0cnk6CiAgICBpbXBvcnQgemxpYgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB6bGliID0gTm9uZQoKCmNsYXNzIFNxbGl0ZVR5cGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludGVnZXIsIHMgdmFyY2hhciwgZiBudW1iZXIsIGIgYmxvYikiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAodSLWc3RlcnJlaWNoIiwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB1ItZzdGVycmVpY2giKQoKICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKCiAgICBkZWYgQ2hlY2tMYXJnZUludChzZWxmKToKICAgICAgICBudW0gPSAyKio0MAogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgbnVtKQoKICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgogICAgICAgIHZhbCA9IDMuMTQKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGYgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKCiAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgogICAgICAgIHZhbCA9IGJ1ZmZlcigiR3VnbGh1cGYiKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQoKICAgIGRlZiBDaGVja1VuaWNvZGVFeGVjdXRlKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUodSJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCgogICAgZGVmIENoZWNrTm9uVXRmOF9EZWZhdWx0KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tOb25VdGY4X1RleHRGYWN0b3J5U3RyaW5nKHNlbGYpOgogICAgICAgIG9yaWdfdGV4dF9mYWN0b3J5ID0gc2VsZi5jb24udGV4dF9mYWN0b3J5CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBvcmlnX3RleHRfZmFjdG9yeQoKICAgIGRlZiBDaGVja05vblV0ZjhfVGV4dEZhY3RvcnlPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgogICAgICAgIG9yaWdfdGV4dF9mYWN0b3J5ID0gc2VsZi5jb24udGV4dF9mYWN0b3J5CiAgICAgICAgdHJ5OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQogICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBvcmlnX3RleHRfZmFjdG9yeQoKY2xhc3MgRGVjbFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgY2xhc3MgRm9vOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdmFsKToKICAgICAgICAgICAgc2VsZi52YWwgPSBfdmFsCgogICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIERlY2xUeXBlc1Rlc3RzLkZvbyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgICAgIGlmIHNlbGYudmFsID09IG90aGVyLnZhbDoKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gMQoKICAgICAgICBkZWYgX19jb25mb3JtX18oc2VsZiwgcHJvdG9jb2wpOgogICAgICAgICAgICBpZiBwcm90b2NvbCBpcyBzcWxpdGUuUHJlcGFyZVByb3RvY29sOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIHNlbGYudmFsCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkgaW50LCBzIHN0ciwgZiBmbG9hdCwgYiBib29sLCB1IHVuaWNvZGUsIGZvbyBmb28sIGJpbiBibG9iLCBuMSBudW1iZXIsIG4yIG51bWJlcig1KSkiKQoKICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXSA9IGxhbWJkYSB4OiA0Ny4yCgogICAgICAgICMgYW5kIGltcGxlbWVudCB0d28gY3VzdG9tIG9uZXMKICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQk9PTCJdID0gbGFtYmRhIHg6IGJvb2woaW50KHgpKQogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXSA9IERlY2xUeXBlc1Rlc3RzLkZvbwogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJXUk9ORyJdID0gbGFtYmRhIHg6ICJXUk9ORyIKICAgICAgICBzcWxpdGUuY29udmVydGVyc1siTlVNQkVSIl0gPSBmbG9hdAoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkZMT0FUIl0KICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXQogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIk5VTUJFUiJdCiAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CiAgICAgICAgIyBkZWZhdWx0CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHMgYXMgInMgW1dST05HXSIgZnJvbSB0ZXN0JykKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQoKICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgogICAgICAgICMgZGVmYXVsdAogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKCiAgICBkZWYgQ2hlY2tMYXJnZUludChzZWxmKToKICAgICAgICAjIGRlZmF1bHQKICAgICAgICBudW0gPSAyKio0MAogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgbnVtKQoKICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgogICAgICAgICMgY3VzdG9tCiAgICAgICAgdmFsID0gMy4xNAogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDcuMikKCiAgICBkZWYgQ2hlY2tCb29sKHNlbGYpOgogICAgICAgICMgY3VzdG9tCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKEZhbHNlLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIEZhbHNlKQoKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAoVHJ1ZSwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBUcnVlKQoKICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CiAgICAgICAgIyBkZWZhdWx0CiAgICAgICAgdmFsID0gdSJceGQ2c3RlcnJlaWNoIgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodSkgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdSBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQoKICAgIGRlZiBDaGVja0ZvbyhzZWxmKToKICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQoKICAgIGRlZiBDaGVja1Vuc3VwcG9ydGVkU2VxKHNlbGYpOgogICAgICAgIGNsYXNzIEJhcjogcGFzcwogICAgICAgIHZhbCA9IEJhcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCgogICAgZGVmIENoZWNrVW5zdXBwb3J0ZWREaWN0KHNlbGYpOgogICAgICAgIGNsYXNzIEJhcjogcGFzcwogICAgICAgIHZhbCA9IEJhcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoOnZhbCkiLCB7InZhbCI6IHZhbH0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCgogICAgZGVmIENoZWNrQmxvYihzZWxmKToKICAgICAgICAjIGRlZmF1bHQKICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGJpbikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCgogICAgZGVmIENoZWNrTnVtYmVyMShzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG4xKSB2YWx1ZXMgKDUpIikKICAgICAgICB2YWx1ZSA9IHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuMSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKCiAgICBkZWYgQ2hlY2tOdW1iZXIyKHNlbGYpOgogICAgICAgICIiIkNoZWNrcyB3ZXRoZXIgY29udmVydGVyIG5hbWVzIGFyZSBjdXQgb2ZmIGF0ICcoJyBjaGFyYWN0ZXJzIiIiCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMikgdmFsdWVzICg1KSIpCiAgICAgICAgdmFsdWUgPSBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbjIgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQogICAgICAgICMgaWYgdGhlIGNvbnZlcnRlciBpcyBub3QgdXNlZCwgaXQncyBhbiBpbnQgaW5zdGVhZCBvZiBhIGZsb2F0CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCgpjbGFzcyBDb2xOYW1lc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHggZm9vKSIpCgogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXSA9IGxhbWJkYSB4OiAiWyVzXSIgJSB4CiAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdID0gbGFtYmRhIHg6ICI8JXM+IiAlIHgKICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRVhDIl0gPSBsYW1iZGEgeDogNSAvLyAwCiAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkIxQjEiXSA9IGxhbWJkYSB4OiAiTUFSS0VSIgoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdCiAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXQogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRVhDIl0KICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkIxQjEiXQogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrRGVjbFR5cGVOb3RVc2VkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEFzc3VyZXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBpcyBub3QgdXNlZCB3aGVuIFBBUlNFX0RFQ0xUWVBFUwogICAgICAgIGlzIG5vdCBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSB0ZXN0IikKICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJ4eHgiKQoKICAgIGRlZiBDaGVja05vbmUoc2VsZik6CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKE5vbmUsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQogICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgTm9uZSkKCiAgICBkZWYgQ2hlY2tDb2xOYW1lKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IFtiYXJdIiBmcm9tIHRlc3QnKQogICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgIjx4eHg+IikKCiAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaXBwaW5nIG9mIGNvbG5hbWVzIHdvcmtzLiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdAogICAgICAgICMgd2hpdGVzcGFjZSBzaG91bGQgYmUgc3RyaXBwZWQuCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQoKICAgIGRlZiBDaGVja0Nhc2VJbkNvbnZlcnRlck5hbWUoc2VsZik6CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiIiJzZWxlY3QgJ290aGVyJyBhcyAieCBbYjFiMV1cIiIiIikKICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJNQVJLRVIiKQoKICAgIGRlZiBDaGVja0N1cnNvckRlc2NyaXB0aW9uTm9Sb3coc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgY3Vyc29yLmRlc2NyaXB0aW9uIHNob3VsZCBhdCBsZWFzdCBwcm92aWRlIHRoZSBjb2x1bW4gbmFtZShzKSwgZXZlbiBpZgogICAgICAgIG5vIHJvdyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgMCA9IDEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdXIuZGVzY3JpcHRpb25bMF1bMF0sICJ4IikKCmNsYXNzIE9iamVjdEFkYXB0YXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgY2FzdChvYmopOgogICAgICAgIHJldHVybiBmbG9hdChvYmopCiAgICBjYXN0ID0gc3RhdGljbWV0aG9kKGNhc3QpCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbaW50XQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwogICAgICAgIHNxbGl0ZS5yZWdpc3Rlcl9hZGFwdGVyKGludCwgT2JqZWN0QWRhcHRhdGlvblRlc3RzLmNhc3QpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzWyhpbnQsIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2wpXQogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKDQsKSkKICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQoKQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQpjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgY29udmVydChzKToKICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKHMpCiAgICBjb252ZXJ0ID0gc3RhdGljbWV0aG9kKGNvbnZlcnQpCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKICAgICAgICBzcWxpdGUucmVnaXN0ZXJfY29udmVydGVyKCJiaW4iLCBCaW5hcnlDb252ZXJ0ZXJUZXN0cy5jb252ZXJ0KQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQmluYXJ5SW5wdXRGb3JDb252ZXJ0ZXIoc2VsZik6CiAgICAgICAgdGVzdGRhdGEgPSAiYWJjZGVmZyIgKiAxMAogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFtiaW5dIicsIChidWZmZXIoemxpYi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RkYXRhLCByZXN1bHQpCgpjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQogICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChkIGRhdGUsIHRzIHRpbWVzdGFtcCkiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja1NxbGl0ZURhdGUoc2VsZik6CiAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDIsIDE0KQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZCkgdmFsdWVzICg/KSIsIChkLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGQgZnJvbSB0ZXN0IikKICAgICAgICBkMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQyKQoKICAgIGRlZiBDaGVja1NxbGl0ZVRpbWVzdGFtcChzZWxmKToKICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQoKICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKICAgICAgICAjIFRoZSBkYXRlIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlIHZlcnNpb24gMy4xIG9yIGxhdGVyCiAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFNRTGl0ZSdzIGN1cnJlbnRfdGltZXN0YW1wIHVzZXMgVVRDIHRpbWUsIHdoaWxlIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpIHVzZXMgbG9jYWwgdGltZS4KICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoY3VycmVudF90aW1lc3RhbXApIikKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodHMpLCBkYXRldGltZS5kYXRldGltZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLnllYXIsIG5vdy55ZWFyKQoKICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kcyhzZWxmKToKICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MDAwMDApCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCgogICAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzRmxvYXRpbmdQb2ludChzZWxmKToKICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MTAyNDEpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCgpkZWYgc3VpdGUoKToKICAgIHNxbGl0ZV90eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZVR5cGVUZXN0cywgIkNoZWNrIikKICAgIGRlY2x0eXBlc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERlY2xUeXBlc1Rlc3RzLCAiQ2hlY2siKQogICAgY29sbmFtZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xOYW1lc1Rlc3RzLCAiQ2hlY2siKQogICAgYWRhcHRhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShPYmplY3RBZGFwdGF0aW9uVGVzdHMsICJDaGVjayIpCiAgICBiaW5fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQmluYXJ5Q29udmVydGVyVGVzdHMsICJDaGVjayIpCiAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChzcWxpdGVfdHlwZV9zdWl0ZSwgZGVjbHR5cGVzX3R5cGVfc3VpdGUsIGNvbG5hbWVzX3R5cGVfc3VpdGUsIGFkYXB0YXRpb25fc3VpdGUsIGJpbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCgpkZWYgdGVzdCgpOgogICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQogICAgcnVubmVyLnJ1bihzdWl0ZSgpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3QoKQo=