Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZmFjdG9yeS5weTogdGVzdHMgZm9yIHRoZSB2YXJpb3VzIGZhY3RvcmllcyBpbiBweXNxbGl0ZQojCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCmZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTZXF1ZW5jZQoKY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNxbGl0ZS5Db25uZWN0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKCmRlZiBkaWN0X2ZhY3RvcnkoY3Vyc29yLCByb3cpOgogICAgZCA9IHt9CiAgICBmb3IgaWR4LCBjb2wgaW4gZW51bWVyYXRlKGN1cnNvci5kZXNjcmlwdGlvbik6CiAgICAgICAgZFtjb2xbMF1dID0gcm93W2lkeF0KICAgIHJldHVybiBkCgpjbGFzcyBNeUN1cnNvcihzcWxpdGUuQ3Vyc29yKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNxbGl0ZS5DdXJzb3IuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYucm93X2ZhY3RvcnkgPSBkaWN0X2ZhY3RvcnkKCmNsYXNzIENvbm5lY3Rpb25GYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZmFjdG9yeT1NeUNvbm5lY3Rpb24pCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNvbiwgTXlDb25uZWN0aW9uKQoKY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQogICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjdXIsIE15Q3Vyc29yKQoKY2xhc3MgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQrNSBhcyBmb28iKQogICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJvdywgZGljdCkKICAgICAgICBjdXIuY2xvc2UoKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKCiAgICBkZWYgQ2hlY2tDdXN0b21GYWN0b3J5KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBsaXN0KQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocm93LCBzcWxpdGUuUm93KQoKICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbDIsIDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQoKICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2wxLCAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbDIsIDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQiciKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1sxXSwgMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1stMV0sIDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gLTEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93Wy0yXSwgMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAtMiIpCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJvd1snYyddCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKICAgICAgICAgICAgcm93WzJdCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKICAgICAgICAgICAgcm93Wy0zXQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJvd1syKioxMDAwXQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd1NsaWNlKHNlbGYpOgogICAgICAgICMgQSBzcWxpdGUuUm93IGNhbiBiZSBzbGljZWQgbGlrZSBhIGxpc3QuCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEsIDIsIDMsIDQiKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMDowXSwgKCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMDoxXSwgKDEsKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1sxOjNdLCAoMiwgMykpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMzoxXSwgKCkpCiAgICAgICAgIyBFeHBsaWNpdCBib3VuZHMgYXJlIG9wdGlvbmFsLgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzE6XSwgKDIsIDMsIDQpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzozXSwgKDEsIDIsIDMpKQogICAgICAgICMgU2xpY2VzIGNhbiB1c2UgbmVnYXRpdmUgaW5kaWNlcy4KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1stMjotMV0sICgzLCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbLTI6XSwgKDMsIDQpKQogICAgICAgICMgU2xpY2luZyBzdXBwb3J0cyBzdGVwcy4KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swOjQ6Ml0sICgxLCAzKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1szOjA6LTJdLCAoNCwgMikpCgogICAgZGVmIENoZWNrU3FsaXRlUm93SXRlcihzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgaXMgaXRlcmFibGUiIiIKICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgZm9yIGNvbCBpbiByb3c6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1R1cGxlKHNlbGYpOgogICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29udmVydGVkIHRvIGEgdHVwbGUiIiIKICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgdCA9IHR1cGxlKHJvdykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIChyb3dbJ2EnXSwgcm93WydiJ10pKQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0FzRGljdChzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGJlIGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8gYSBkaWN0aW9uYXJ5IiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIGQgPSBkaWN0KHJvdykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbImEiXSwgcm93WyJhIl0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJiIl0sIHJvd1siYiJdKQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0hhc2hDbXAoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGNvbXBhcmVzIGFuZCBoYXNoZXMgY29ycmVjdGx5IiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93XzEgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgcm93XzIgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgcm93XzMgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAzIGFzIGIiKS5mZXRjaG9uZSgpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93XzEsIHJvd18xKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93XzEsIHJvd18yKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMiAhPSByb3dfMykKCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMSkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJvd18xICE9IHJvd18yKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzIgPT0gcm93XzMpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93XzEsIHJvd18yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChyb3dfMSksIGhhc2gocm93XzIpKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocm93XzEsIHJvd18zKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaGFzaChyb3dfMSksIGhhc2gocm93XzMpKQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0FzU2VxdWVuY2Uoc2VsZik6CiAgICAgICAgIiIiIENoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYWN0IGxpa2UgYSBzZXF1ZW5jZSAiIiIKICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCgogICAgICAgIGFzX3R1cGxlID0gdHVwbGUocm93KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChyb3cpKSwgbGlzdChyZXZlcnNlZChhc190dXBsZSkpKQogICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyb3csIFNlcXVlbmNlKQoKICAgIGRlZiBDaGVja0Zha2VDdXJzb3JDbGFzcyhzZWxmKToKICAgICAgICAjIElzc3VlICMyNDI1NzogSW5jb3JyZWN0IHVzZSBvZiBQeU9iamVjdF9Jc0luc3RhbmNlKCkgY2F1c2VkCiAgICAgICAgIyBzZWdtZW50YXRpb24gZmF1bHQuCiAgICAgICAgY2xhc3MgRmFrZUN1cnNvcihzdHIpOgogICAgICAgICAgICBfX2NsYXNzX18gPSBzcWxpdGUuQ3Vyc29yCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9RmFrZUN1cnNvcikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNxbGl0ZS5Sb3csIGN1ciwgKCkpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCmNsYXNzIFRleHRGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKCiAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgogICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm93WzBdKSwgc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKCiAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZXMKICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvd1swXSksIGJ5dGVzLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBieXRlcyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIGF1c3RyaWEuZW5jb2RlKCJ1dGYtOCIpLCAiY29sdW1uIG11c3QgZXF1YWwgb3JpZ2luYWwgZGF0YSBpbiBVVEYtOCIpCgogICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiBzdHIoeCwgInV0Zi04IiwgImlnbm9yZSIpCiAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3dbMF0pLCBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dbMF0uZW5kc3dpdGgoInJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQoKICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGUoc2VsZik6CiAgICAgICAgIyBJbiBweTNrLCBzdHIgb2JqZWN0cyBhcmUgYWx3YXlzIHJldHVybmVkIHdoZW4gdGV4dF9mYWN0b3J5CiAgICAgICAgIyBpcyBPcHRpbWl6ZWRVbmljb2RlCiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgZ2VybWFueSA9ICJEZXV0Y2hsYW5kIgogICAgICAgIGFfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgZF9yb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChnZXJtYW55LCkpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYV9yb3dbMF0pLCBzdHIsICJ0eXBlIG9mIG5vbi1BU0NJSSByb3cgbXVzdCBiZSBzdHIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkX3Jvd1swXSksIHN0ciwgInR5cGUgb2YgQVNDSUktb25seSByb3cgbXVzdCBiZSBzdHIiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpjbGFzcyBUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKHZhbHVlIHRleHQpIikKICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0ICh2YWx1ZSkgdmFsdWVzICg/KSIsICgiYVx4MDBiIiwpKQoKICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKICAgICAgICAjIHRleHRfZmFjdG9yeSBkZWZhdWx0cyB0byBzdHIKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBzdHIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJhXHgwMGIiKQoKICAgIGRlZiBDaGVja0J5dGVzKHNlbGYpOgogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGJ5dGVzCiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgYnl0ZXMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIGIiYVx4MDBiIikKCiAgICBkZWYgQ2hlY2tCeXRlYXJyYXkoc2VsZik6CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZWFycmF5CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgYnl0ZWFycmF5KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBiImFceDAwYiIpCgogICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgogICAgICAgICMgQSBjdXN0b20gZmFjdG9yeSBzaG91bGQgcmVjZWl2ZSBhIGJ5dGVzIGFyZ3VtZW50CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gbGFtYmRhIHg6IHgKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBieXRlcykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgYiJhXHgwMGIiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpkZWYgc3VpdGUoKToKICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvbkZhY3RvcnlUZXN0cywgIkNoZWNrIikKICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICByb3dfc3VpdGVfY29tcGF0ID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCwgIkNoZWNrIikKICAgIHJvd19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZhY3RvcnlUZXN0c1dpdGhFbWJlZGRlZFplcm9CeXRlcywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbm5lY3Rpb25fc3VpdGUsIGN1cnNvcl9zdWl0ZSwgcm93X3N1aXRlX2NvbXBhdCwgcm93X3N1aXRlLCB0ZXh0X3N1aXRlLCB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK