Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQoKZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgogICAgcmV0dXJuICJmb28iCmRlZiBmdW5jX3JldHVybnVuaWNvZGUoKToKICAgIHJldHVybiAiYmFyIgpkZWYgZnVuY19yZXR1cm5pbnQoKToKICAgIHJldHVybiA0MgpkZWYgZnVuY19yZXR1cm5mbG9hdCgpOgogICAgcmV0dXJuIDMuMTQKZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgogICAgcmV0dXJuIE5vbmUKZGVmIGZ1bmNfcmV0dXJuYmxvYigpOgogICAgcmV0dXJuIGIiYmxvYiIKZGVmIGZ1bmNfcmFpc2VleGNlcHRpb24oKToKICAgIDUvMAoKZGVmIGZ1bmNfaXNzdHJpbmcodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyBzdHIKZGVmIGZ1bmNfaXNpbnQodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyBpbnQKZGVmIGZ1bmNfaXNmbG9hdCh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIGZsb2F0CmRlZiBmdW5jX2lzbm9uZSh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIHR5cGUoTm9uZSkKZGVmIGZ1bmNfaXNibG9iKHYpOgogICAgcmV0dXJuIGlzaW5zdGFuY2UodiwgKGJ5dGVzLCBtZW1vcnl2aWV3KSkKCmNsYXNzIEFnZ3JOb1N0ZXA6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gMQoKY2xhc3MgQWdnck5vRmluYWxpemU6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIHBhc3MKCmNsYXNzIEFnZ3JFeGNlcHRpb25JbkluaXQ6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgNS8wCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICBwYXNzCgpjbGFzcyBBZ2dyRXhjZXB0aW9uSW5TdGVwOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICA1LzAKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIDQyCgpjbGFzcyBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICA1LzAKCmNsYXNzIEFnZ3JDaGVja1R5cGU6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi52YWwgPSBOb25lCgogICAgZGVmIHN0ZXAoc2VsZiwgd2hpY2hUeXBlLCB2YWwpOgogICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHN0ciwgImludCI6IGludCwgImZsb2F0IjogZmxvYXQsICJOb25lIjogdHlwZShOb25lKSwKICAgICAgICAgICAgICAgICAgICJibG9iIjogYnl0ZXN9CiAgICAgICAgc2VsZi52YWwgPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBBZ2dyU3VtOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMC4wCgogICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKICAgICAgICBzZWxmLnZhbCArPSB2YWwKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnVuaWNvZGUiLCAwLCBmdW5jX3JldHVybnVuaWNvZGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzZmxvYXQiLCAxLCBmdW5jX2lzZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrRnVuY0Vycm9yT25DcmVhdGUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0Z1bmNSZWZDb3VudChzZWxmKToKICAgICAgICBkZWYgZ2V0ZnVuYygpOgogICAgICAgICAgICBkZWYgZigpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICBmID0gZ2V0ZnVuYygpCiAgICAgICAgZ2xvYmFscygpWyJmb28iXSA9IGYKICAgICAgICAjIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBmKQogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5UZXh0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm50ZXh0KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBzdHIpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVW5pY29kZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgc3RyKQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgImJhciIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBpbnQpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA0MikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmZsb2F0KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKICAgICAgICBpZiB2YWwgPCAzLjEzOSBvciB2YWwgPiAzLjE0MToKICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybk51bGwoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5ibG9iKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBieXRlcykKICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGIiYmxvYiIpCgogICAgZGVmIENoZWNrRnVuY0V4Y2VwdGlvbihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKICAgICAgICAgICAgY3VyLmZldGNob25lKCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKCiAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Jsb2IoPykiLCAobWVtb3J5dmlldyhiImJsb2IiKSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKY2xhc3MgQWdncmVnYXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgdGVzdCgKICAgICAgICAgICAgICAgIHQgdGV4dCwKICAgICAgICAgICAgICAgIGkgaW50ZWdlciwKICAgICAgICAgICAgICAgIGYgZmxvYXQsCiAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgYiBibG9iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICIiIikKICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0LCBpLCBmLCBuLCBiKSB2YWx1ZXMgKD8sID8sID8sID8sID8pIiwKICAgICAgICAgICAgKCJmb28iLCA1LCAzLjE0LCBOb25lLCBtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vc3RlcCIsIDEsIEFnZ3JOb1N0ZXApCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibm9maW5hbGl6ZSIsIDEsIEFnZ3JOb0ZpbmFsaXplKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0luaXQiLCAxLCBBZ2dyRXhjZXB0aW9uSW5Jbml0KQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y1N0ZXAiLCAxLCBBZ2dyRXhjZXB0aW9uSW5TdGVwKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0ZpbmFsaXplIiwgMSwgQWdnckV4Y2VwdGlvbkluRmluYWxpemUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlIiwgMiwgQWdnckNoZWNrVHlwZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJteXN1bSIsIDEsIEFnZ3JTdW0pCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICNzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgI3NlbGYuY29uLmNsb3NlKCkKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQWdnckVycm9yT25DcmVhdGUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEF0dHJpYnV0ZUVycm9yIikKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAiJ0FnZ3JOb1N0ZXAnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCgogICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluSW5pdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNJbml0KHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5TdGVwKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjRmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnaW50JywgPykiLCAoNDIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Zsb2F0JywgPykiLCAoMy4xNCwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtTm9uZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtQmxvYihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdibG9iJywgPykiLCAobWVtb3J5dmlldyhiImJsb2IiKSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja0FnZ3JTdW0oc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCBbKDEwLCksICgyMCwpLCAoMzAsKV0pCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA2MCkKCmRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgogICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgogICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKICAgIGlmIGFyZzIgPT0gJ2MyJyBvciBhcmcxID09ICd0Mic6CiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQogICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCmNsYXNzIEF1dGhvcml6ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MSAoYzEsIGMyKTsKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQyIChjMSwgYzIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MiAoYzEsIGMyKSB2YWx1ZXMgKDQsIDUpOwogICAgICAgICAgICAiIiIpCgogICAgICAgICMgRm9yIG91ciBzZWN1cml0eSB0ZXN0OgogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQyIikKCiAgICAgICAgc2VsZi5jb24uc2V0X2F1dGhvcml6ZXIoYXV0aG9yaXplcl9jYikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja1RhYmxlQWNjZXNzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0MiIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQoKICAgIGRlZiBDaGVja0NvbHVtbkFjY2VzcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQxIikKICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24gdGV4dDogJXMiICUgZS5hcmdzWzBdKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCgpkZWYgc3VpdGUoKToKICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCiAgICBhZ2dyZWdhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQWdncmVnYXRlVGVzdHMsICJDaGVjayIpCiAgICBhdXRob3JpemVyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUsIGF1dGhvcml6ZXJfc3VpdGUpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK