Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZmFjdG9yeS5weTogdGVzdHMgZm9yIHRoZSB2YXJpb3VzIGZhY3RvcmllcyBpbiBweXNxbGl0ZQojCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCmZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTZXF1ZW5jZQoKY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNxbGl0ZS5Db25uZWN0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKCmRlZiBkaWN0X2ZhY3RvcnkoY3Vyc29yLCByb3cpOgogICAgZCA9IHt9CiAgICBmb3IgaWR4LCBjb2wgaW4gZW51bWVyYXRlKGN1cnNvci5kZXNjcmlwdGlvbik6CiAgICAgICAgZFtjb2xbMF1dID0gcm93W2lkeF0KICAgIHJldHVybiBkCgpjbGFzcyBNeUN1cnNvcihzcWxpdGUuQ3Vyc29yKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNxbGl0ZS5DdXJzb3IuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYucm93X2ZhY3RvcnkgPSBkaWN0X2ZhY3RvcnkKCmNsYXNzIENvbm5lY3Rpb25GYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZmFjdG9yeT1NeUNvbm5lY3Rpb24pCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNvbiwgTXlDb25uZWN0aW9uKQoKY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQogICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjdXIsIE15Q3Vyc29yKQoKY2xhc3MgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQrNSBhcyBmb28iKQogICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJvdywgZGljdCkKICAgICAgICBjdXIuY2xvc2UoKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKCiAgICBkZWYgQ2hlY2tDdXN0b21GYWN0b3J5KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBsaXN0KQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBzcWxpdGUuUm93KQoKICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbDIsIDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQoKICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbDIsIDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQiciKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1sxXSwgMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1stMV0sIDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gLTEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93Wy0yXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAtMiIpCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJvd1snYyddCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKICAgICAgICAgICAgcm93WzJdCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKICAgICAgICAgICAgcm93Wy0zXQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJvd1syKioxMDAwXQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0l0ZXIoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGlzIGl0ZXJhYmxlIiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIGZvciBjb2wgaW4gcm93OgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrU3FsaXRlUm93QXNUdXBsZShzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHR1cGxlIiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIHQgPSB0dXBsZShyb3cpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAocm93WydhJ10sIHJvd1snYiddKSkKCiAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc0RpY3Qoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGNhbiBiZSBjb3JyZWN0bHkgY29udmVydGVkIHRvIGEgZGljdGlvbmFyeSIiIgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICBkID0gZGljdChyb3cpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJhIl0sIHJvd1siYSJdKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYiJdLCByb3dbImIiXSkKCiAgICBkZWYgQ2hlY2tTcWxpdGVSb3dIYXNoQ21wKHNlbGYpOgogICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjb21wYXJlcyBhbmQgaGFzaGVzIGNvcnJlY3RseSIiIgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgIHJvd18xID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIHJvd18yID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIHJvd18zID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMyBhcyBiIikuZmV0Y2hvbmUoKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMikKICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzIgIT0gcm93XzMpCgogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzEpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJvd18yID09IHJvd18zKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18yKSkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJvd18xLCByb3dfMykKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18zKSkKCiAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1NlcXVlbmNlKHNlbGYpOgogICAgICAgICIiIiBDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGFjdCBsaWtlIGEgc2VxdWVuY2UgIiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQoKICAgICAgICBhc190dXBsZSA9IHR1cGxlKHJvdykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQocm93KSksIGxpc3QocmV2ZXJzZWQoYXNfdHVwbGUpKSkKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBTZXF1ZW5jZSkKCiAgICBkZWYgQ2hlY2tGYWtlQ3Vyc29yQ2xhc3Moc2VsZik6CiAgICAgICAgIyBJc3N1ZSAjMjQyNTc6IEluY29ycmVjdCB1c2Ugb2YgUHlPYmplY3RfSXNJbnN0YW5jZSgpIGNhdXNlZAogICAgICAgICMgc2VnbWVudGF0aW9uIGZhdWx0LgogICAgICAgIGNsYXNzIEZha2VDdXJzb3Ioc3RyKToKICAgICAgICAgICAgX19jbGFzc19fID0gc3FsaXRlLkN1cnNvcgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PUZha2VDdXJzb3IpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcWxpdGUuUm93LCBjdXIsICgpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpjbGFzcyBUZXh0RmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvd1swXSksIHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCgogICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGJ5dGVzCiAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3dbMF0pLCBieXRlcywgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgYnl0ZXMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQoKICAgIGRlZiBDaGVja0N1c3RvbShzZWxmKToKICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogc3RyKHgsICJ1dGYtOCIsICJpZ25vcmUiKQogICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm93WzBdKSwgc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdLmVuZHN3aXRoKCJyZWljaCIpLCAiY29sdW1uIG11c3QgY29udGFpbiBvcmlnaW5hbCBkYXRhIikKCiAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgogICAgICAgICMgSW4gcHkzaywgc3RyIG9iamVjdHMgYXJlIGFsd2F5cyByZXR1cm5lZCB3aGVuIHRleHRfZmFjdG9yeQogICAgICAgICMgaXMgT3B0aW1pemVkVW5pY29kZQogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IHNxbGl0ZS5PcHRpbWl6ZWRVbmljb2RlCiAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgIGdlcm1hbnkgPSAiRGV1dGNobGFuZCIKICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGFfcm93WzBdKSwgc3RyLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgc3RyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZF9yb3dbMF0pLCBzdHIsICJ0eXBlIG9mIEFTQ0lJLW9ubHkgcm93IG11c3QgYmUgc3RyIikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKY2xhc3MgVGV4dEZhY3RvcnlUZXN0c1dpdGhFbWJlZGRlZFplcm9CeXRlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0ICh2YWx1ZSB0ZXh0KSIpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAoImFceDAwYiIsKSkKCiAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CiAgICAgICAgIyB0ZXh0X2ZhY3RvcnkgZGVmYXVsdHMgdG8gc3RyCiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgc3RyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKCiAgICBkZWYgQ2hlY2tCeXRlcyhzZWxmKToKICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBieXRlcwogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIGJ5dGVzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBiImFceDAwYiIpCgogICAgZGVmIENoZWNrQnl0ZWFycmF5KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGJ5dGVhcnJheQogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIGJ5dGVhcnJheSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgYiJhXHgwMGIiKQoKICAgIGRlZiBDaGVja0N1c3RvbShzZWxmKToKICAgICAgICAjIEEgY3VzdG9tIGZhY3Rvcnkgc2hvdWxkIHJlY2VpdmUgYSBieXRlcyBhcmd1bWVudAogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB4CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgYnl0ZXMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIGIiYVx4MDBiIikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKZGVmIHN1aXRlKCk6CiAgICBjb25uZWN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbm5lY3Rpb25GYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICBjdXJzb3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ3Vyc29yRmFjdG9yeVRlc3RzLCAiQ2hlY2siKQogICAgcm93X3N1aXRlX2NvbXBhdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQsICJDaGVjayIpCiAgICByb3dfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUm93RmFjdG9yeVRlc3RzLCAiQ2hlY2siKQogICAgdGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXh0RmFjdG9yeVRlc3RzLCAiQ2hlY2siKQogICAgdGV4dF96ZXJvX2J5dGVzX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHNXaXRoRW1iZWRkZWRaZXJvQnl0ZXMsICJDaGVjayIpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHJvd19zdWl0ZV9jb21wYXQsIHJvd19zdWl0ZSwgdGV4dF9zdWl0ZSwgdGV4dF96ZXJvX2J5dGVzX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==