Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCB1bmxpbmsKCmNsYXNzIENvbGxhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdFN0cmluZyhzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oTm9uZSwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdENhbGxhYmxlKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiWCIsIDQyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZScpCgogICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oImNvbGzkIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbkJhZFVwcGVyKHNlbGYpOgogICAgICAgIGNsYXNzIEJhZFVwcGVyU3RyKHN0cik6CiAgICAgICAgICAgIGRlZiB1cHBlcihzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBteWNvbGwgPSBsYW1iZGEgeCwgeTogLSgoeCA+IHkpIC0gKHggPCB5KSkKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbihCYWRVcHBlclN0cigibXljb2xsIiksIG15Y29sbCkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCiAgICAgICAgICAgICIiIikuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAnYicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sICdhJykKCiAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpLAogICAgICAgICAgICAgICAgICAgICAnb2xkIFNRTGl0ZSB2ZXJzaW9ucyBjcmFzaCBvbiB0aGlzIHRlc3QnKQogICAgZGVmIENoZWNrQ29sbGF0aW9uSXNVc2VkKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkKCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQogICAgICAgIHNxbCA9ICIiIgogICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CiAgICAgICAgICAgIHVuaW9uCiAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2MnIGFzIHgKICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCiAgICAgICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbKCdjJywpLCAoJ2InLCksICgnYScsKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J3RoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkJykKCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsJykKCiAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZXR1cm5zTGFyZ2VJbnRlZ2VyKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkgKiAyKiozMgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKICAgICAgICBzcWwgPSAiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CiAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygnYycsKSwgKCdiJywpLCAoJ2EnLCldLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCgogICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciB0d28gZGlmZmVyZW50IGNvbGxhdGlvbiBmdW5jdGlvbnMgdW5kZXIgdGhlIHNhbWUgbmFtZS4KICAgICAgICBWZXJpZnkgdGhhdCB0aGUgbGFzdCBvbmUgaXMgYWN0dWFsbHkgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtKCh4ID4geSkgLSAoeCA8IHkpKSkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoc2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgJ2InKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCAnYScpCgogICAgZGVmIENoZWNrRGVyZWdpc3RlckNvbGxhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQogICAgICAgIHRvIHVzZSBpdC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4IG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsJykKCmNsYXNzIFByb2dyZXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrUHJvZ3Jlc3NIYW5kbGVyVXNlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHByb2dyZXNzIGhhbmRsZXIgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGNvbi5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3Jlc3NfY2FsbHMpCgoKICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCB0aGUgb3Bjb2RlIGFyZ3VtZW50IGlzIHJlc3BlY3RlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28gKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBmaXJzdF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAyKQogICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGJhciAoYSwgYikKICAgICAgICAgICAgIiIiKQogICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChmaXJzdF9jb3VudCwgc2Vjb25kX2NvdW50KQoKICAgIGRlZiBDaGVja0NhbmNlbE9wZXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGRlZiBwcm9ncmVzcygpOgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLAogICAgICAgICAgICBjdXJzLmV4ZWN1dGUsCiAgICAgICAgICAgICJjcmVhdGUgdGFibGUgYmFyIChhLCBiKSIpCgogICAgZGVmIENoZWNrQ2xlYXJIYW5kbGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgYWN0aW9uID0gMAogICAgICAgIGRlZiBwcm9ncmVzcygpOgogICAgICAgICAgICBub25sb2NhbCBhY3Rpb24KICAgICAgICAgICAgYWN0aW9uID0gMQogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIoTm9uZSwgMSkKICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCgpjbGFzcyBUcmFjZUNhbGxiYWNrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrVHJhY2VDYWxsYmFja1VzZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSB0cmFjZSBjYWxsYmFjayBpcyBpbnZva2VkIG9uY2UgaXQgaXMgc2V0LgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICB0cmFjZWRfc3RhdGVtZW50cy5hcHBlbmQoc3RhdGVtZW50KQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYSwgYikiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWRfc3RhdGVtZW50cykKICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KCJjcmVhdGUgdGFibGUgZm9vIiBpbiBzdG10IGZvciBzdG10IGluIHRyYWNlZF9zdGF0ZW1lbnRzKSkKCiAgICBkZWYgQ2hlY2tDbGVhclRyYWNlQ2FsbGJhY2soc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHRyYWNlIGNhbGxiYWNrIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjay4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2soTm9uZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhhLCBiKSIpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0cmFjZWRfc3RhdGVtZW50cywgInRyYWNlIGNhbGxiYWNrIHdhcyBub3QgY2xlYXJlZCIpCgogICAgZGVmIENoZWNrVW5pY29kZUNvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHRoZSBzdGF0ZW1lbnQgY2FuIGNvbnRhaW4gdW5pY29kZSBsaXRlcmFscy4KICAgICAgICAiIiIKICAgICAgICB1bmljb2RlX3ZhbHVlID0gJ1x4ZjZceGU0XHhmY1x4ZDZceGM0XHhkY1x4ZGZcdTIwYWMnCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayh0cmFjZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4KSIpCiAgICAgICAgIyBDYW4ndCBleGVjdXRlIGJvdW5kIHBhcmFtZXRlcnMgYXMgdGhlaXIgdmFsdWVzIGRvbid0IGFwcGVhcgogICAgICAgICMgaW4gdHJhY2VkIHN0YXRlbWVudHMgYmVmb3JlIFNRTGl0ZSAzLjYuMjEKICAgICAgICAjIChjZi4gaHR0cDovL3d3dy5zcWxpdGUub3JnL2RyYWZ0L3JlbGVhc2Vsb2cvM182XzIxLmh0bWwpCiAgICAgICAgY29uLmV4ZWN1dGUoJ2luc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKCIlcyIpJyAlIHVuaWNvZGVfdmFsdWUpCiAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFueSh1bmljb2RlX3ZhbHVlIGluIHN0bXQgZm9yIHN0bXQgaW4gdHJhY2VkX3N0YXRlbWVudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSBkYXRhICVzIGdhcmJsZWQgaW4gdHJhY2UgY2FsbGJhY2s6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAlIChhc2NpaSh1bmljb2RlX3ZhbHVlKSwgJywgJy5qb2luKG1hcChhc2NpaSwgdHJhY2VkX3N0YXRlbWVudHMpKSkpCgogICAgQHVuaXR0ZXN0LnNraXBJZihzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAzLCA5KSwgInNxbGl0ZTNfcHJlcGFyZV92MiBpcyBub3QgYXZhaWxhYmxlIikKICAgIGRlZiBDaGVja1RyYWNlQ2FsbGJhY2tDb250ZW50KHNlbGYpOgogICAgICAgICMgc2V0X3RyYWNlX2NhbGxiYWNrKCkgc2hvdWxkbid0IHByb2R1Y2UgZHVwbGljYXRlIGNvbnRlbnQgKGJwby0yNjE4NykKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCgogICAgICAgIHF1ZXJpZXMgPSBbImNyZWF0ZSB0YWJsZSBmb28oeCkiLAogICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMoMSkiXQogICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKICAgICAgICBjb24xID0gc3FsaXRlLmNvbm5lY3QoVEVTVEZOLCBpc29sYXRpb25fbGV2ZWw9Tm9uZSkKICAgICAgICBjb24yID0gc3FsaXRlLmNvbm5lY3QoVEVTVEZOKQogICAgICAgIGNvbjEuc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGN1ciA9IGNvbjEuY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZShxdWVyaWVzWzBdKQogICAgICAgIGNvbjIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGJhcih4KSIpCiAgICAgICAgY3VyLmV4ZWN1dGUocXVlcmllc1sxXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlZF9zdGF0ZW1lbnRzLCBxdWVyaWVzKQoKCmRlZiBzdWl0ZSgpOgogICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQogICAgcHJvZ3Jlc3Nfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUHJvZ3Jlc3NUZXN0cywgIkNoZWNrIikKICAgIHRyYWNlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRyYWNlQ2FsbGJhY2tUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwgcHJvZ3Jlc3Nfc3VpdGUsIHRyYWNlX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==