IiBUZXN0IGZvciA6bWtzZXNzaW9uLCA6bWt2aWV3IGFuZCA6bG9hZHZpZXcgaW4gbGF0aW4xIGVuY29kaW5nCgpzZXQgZW5jb2Rpbmc9bGF0aW4xCnNjcmlwdGVuY29kaW5nIGxhdGluMQoKc291cmNlIGNoZWNrLnZpbQpDaGVja0ZlYXR1cmUgbWtzZXNzaW9uCgpzb3VyY2Ugc2hhcmVkLnZpbQpzb3VyY2UgdGVybV91dGlsLnZpbQoKIiBUZXN0IGZvciBzdG9yaW5nIGdsb2JhbCBhbmQgbG9jYWwgYXJndW1lbnQgbGlzdCBpbiBhIHNlc3Npb24gZmlsZQoiIFRoaXMgb25lIG11c3QgYmUgZG9uZSBmaXJzdC4KZnVuYyBUZXN0X19ta3Nlc3Npb25fYXJnbG9jYWwoKQogIGVuZXcgfCBvbmx5CiAgbiBhIGIgYwogIG5ldwogIGFyZ2xvY2FsCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CgogICVid2lwZSEKICAlYXJnZGVsZXRlCiAgYXJnZ2xvYmFsCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgyLCB3aW5ucignJCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsIGFyZ2xpc3RpZCgxKSkKICBjYWxsIGFzc2VydF9lcXVhbCgwLCBhcmdsaXN0aWQoMikpCgogICVid2lwZSEKICAlYXJnZGVsZXRlCiAgYXJnZ2xvYmFsCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uKCkKICB0YWJuZXcKICBsZXQgd3JhcF9zYXZlID0gJndyYXAKICBzZXQgc2Vzc2lvbm9wdGlvbnM9YnVmZmVycyBzcGxpdGJlbG93IGZpbGVlbmNvZGluZz1sYXRpbjEKICBjYWxsIHNldGxpbmUoMSwgWwogICAgXCAgICdzdGFydDonLAogICAgXCAgICdubyBtdWx0aWJ5dGUgY2hBcmFjdGVyJywKICAgIFwgICAnCW9uZSBsZWFEaW5nIHRhYicsCiAgICBcICAgJyAgICBmb3VyIGxlYWRpbkcgc3BhY2VzJywKICAgIFwgICAndHdvCQljb25zZWN1dGl2ZSB0YWJzJywKICAgIFwgICAndHdvCXRhYnMJaW4gb25lIGxpbmUnLAogICAgXCAgICdvbmUg5CBtdWx0aWJ5dGVDaGFyYWN0ZXInLAogICAgXCAgICdh5CDEICB0d28gbXVsdGlCeXRlIGNoYXJhY3RlcnMnLAogICAgXCAgICdB5Pb8ICB0aHJlZSBtdWxUaWJ5dGUgY2hhcmFjdGVycycsCiAgICBcICAgJ3Nob3J0IGxpbmUnLAogICAgXCBdKQogIGxldCB0bXBmaWxlID0gJ1h0ZW1wJwogIGV4ZWMgJ3chICcgLiB0bXBmaWxlCiAgL15zdGFydDoKICBzZXQgd3JhcAogIHZzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGoxNnwKICBzcGxpdAogIG5vcm0hIGo4fAogIHNwbGl0CiAgbm9ybSEgajh8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqMTZ8CiAgc3BsaXQKICBub3JtISBqJAogIHdpbmNtZCBsCgogIHNldCBub3dyYXAKICAvXnN0YXJ0OgogIG5vcm0hIGoxNnwzemwKICBzcGxpdAogIG5vcm0hIGowMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgbm9ybSEgajA4fDN6bAogIHNwbGl0CiAgbm9ybSEgajA4fDN6bAogIHNwbGl0CiAgbm9ybSEgajAxNnwzemwKICBzcGxpdAogIG5vcm0hIGowMTZ8M3psCiAgc3BsaXQKICBub3JtISBqMDE2fDN6bAogIHNwbGl0CiAgY2FsbCB3aW5jb2woKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaSA9IGZpbHRlcihyZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpLCAndjp2YWwgPX4jICJcXCheICpub3JtYWwhIFswJF1cXHxeICpleGUgJydub3JtYWwhXFwpIicpCiAgbGV0IGV4cGVjdGVkID0gWwogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDAxNnwnLAogICAgXCAgICdub3JtYWwhIDA4fCcsCiAgICBcICAgJ25vcm1hbCEgMDh8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAwMTZ8JywKICAgIFwgICAnbm9ybWFsISAkJywKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gOCAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwOHwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiA4IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDA4fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiLAogICAgXCAgICIgIGV4ZSAnbm9ybWFsISAnIC4gczpjIC4gJ3x6cycgLiAxNiAuICd8JyIsCiAgICBcICAgIiAgbm9ybWFsISAwMTZ8IiwKICAgIFwgICAiICBleGUgJ25vcm1hbCEgJyAuIHM6YyAuICd8enMnIC4gMTYgLiAnfCciLAogICAgXCAgICIgIG5vcm1hbCEgMDE2fCIsCiAgICBcICAgIiAgZXhlICdub3JtYWwhICcgLiBzOmMgLiAnfHpzJyAuIDE2IC4gJ3wnIiwKICAgIFwgICAiICBub3JtYWwhIDAxNnwiCiAgICBcIF0KICBjYWxsIGFzc2VydF9lcXVhbChleHBlY3RlZCwgbGkpCiAgdGFiY2xvc2UhCgogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBjYWxsIGRlbGV0ZSh0bXBmaWxlKQogIGxldCAmd3JhcCA9IHdyYXBfc2F2ZQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl93aW5oZWlnaHQoKQogIG5ldwogIHNldCB3aW5oZWlnaHQ9MTAKICBzZXQgd2lubWluaGVpZ2h0PTIKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBzb3VyY2UgWHRlc3RfbWtzLm91dAoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fbGFyZ2Vfd2luaGVpZ2h0KCkKICBzZXQgd2luaGVpZ2h0PTk5OQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzX3dpbmhlaWdodC5vdXQKICBzZXQgd2luaGVpZ2h0JgogIHNvdXJjZSBYdGVzdF9ta3Nfd2luaGVpZ2h0Lm91dAogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Nfd2luaGVpZ2h0Lm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fcnRwKCkKICBpZiBoYXMoJ3dpbjMyJykKICAgICIgVE9ETzogZml4IHByb2JsZW0gd2l0aCBiYWNrc2xhc2hlcwogICAgcmV0dXJuCiAgZW5kaWYKICBuZXcKICBsZXQgX3J0cD0mcnRwCiAgIiBNYWtlIGEgcmVhbCBsb25nIChpbnZhbGlkKSBydW50aW1lcGF0aCB2YWx1ZSwKICAiIHRoYXQgc2hvdWxkIGV4Y2VlZCBQQVRIX01BWCAoaG9wZWZ1bGx5KQogIGxldCBuZXdydHA9JnJ0cC4nLH4nLnJlcGVhdCgnL2Zvb2JhcicsIDEwMDApCiAgbGV0IG5ld3J0cC49IiwiLmV4cGFuZCgiJEhPTUUiKS4iLy52aW0iCiAgbGV0ICZydHA9bmV3cnRwCgogICIgZGV0ZXJtaW5lIGV4cGVjdGVkIHZhbHVlCiAgbGV0IGV4cGVjdGVkPXNwbGl0KCZydHAsICcsJykKICBsZXQgZXhwZWN0ZWQgPSBtYXAoZXhwZWN0ZWQsICcic2V0IHJ1bnRpbWVwYXRoKz0iLnY6dmFsJykKICBsZXQgZXhwZWN0ZWQgPSBbJ3NldCBydW50aW1lcGF0aD0nXSArIGV4cGVjdGVkCiAgbGV0IGV4cGVjdGVkID0gbWFwKGV4cGVjdGVkLCB7dix3IC0+IHN1YnN0aXR1dGUodywgJEhPTUUsICJ+IiwgImciKX0pCgogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCAmcnRwPV9ydHAKICBsZXQgbGkgPSBmaWx0ZXIocmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKSwgJ3Y6dmFsID1+IyAicnVudGltZXBhdGgiJykKICBjYWxsIGFzc2VydF9lcXVhbChleHBlY3RlZCwgbGkpCgogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9hcmdsaXN0KCkKICAlYXJnZGVsCiAgbmV4dCBmaWxlMSBmaWxlMiBmaWxlMyBmaWxlNAogIG5ldwogIG5leHQgfCBuZXh0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbChbJ2ZpbGUxJywgJ2ZpbGUyJywgJ2ZpbGUzJywgJ2ZpbGU0J10sIGFyZ3YoKSkKICBjYWxsIGFzc2VydF9lcXVhbCgyLCBhcmdpZHgoKSkKICB3aW5jbWQgdwogIGNhbGwgYXNzZXJ0X2VxdWFsKDAsIGFyZ2lkeCgpKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgZW5ldyB8IG9ubHkKICBhcmdkZWwgKgplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX29uZV9idWZmZXJfdHdvX3dpbmRvd3MoKQogIGVkaXQgWHRlc3QxCiAgbmV3IFh0ZXN0MgogIHNwbGl0CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCBjb3VudDEgPSAwCiAgbGV0IGNvdW50MiA9IDAKICBsZXQgY291bnQyYnVmID0gMAogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdlZGl0IFxmKlh0ZXN0MSQnCiAgICAgIGxldCBjb3VudDEgKz0gMQogICAgZW5kaWYKICAgIGlmIGxpbmUgPX4gJ2VkaXQgXGZcey19WHRlc3QyJwogICAgICBsZXQgY291bnQyICs9IDEKICAgIGVuZGlmCiAgICBpZiBsaW5lID1+ICdidWZmZXIgXGZcey19WHRlc3QyJwogICAgICBsZXQgY291bnQyYnVmICs9IDEKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgY291bnQxLCAnWHRlc3QxIGNvdW50JykKICBjYWxsIGFzc2VydF9lcXVhbCgyLCBjb3VudDIsICdYdGVzdDIgY291bnQnKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDIsIGNvdW50MmJ1ZiwgJ1h0ZXN0MiBidWZmZXIgY291bnQnKQoKICBjbG9zZQogIGJ3aXBlIQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl9sY2RfbXVsdGlwbGVfdGFicygpCiAgdGFibmV3CiAgdGFibmV3CiAgbGNkIC4KICB0YWJmaXJzdAogIGxjZCAuCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgdGFib25seQogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfdHJ1ZShoYXNsb2NhbGRpcigpLCAnVGFiIDEgbG9jYWxkaXInKQogIHRhYm5leHQgMgogIGNhbGwgYXNzZXJ0X3RydWUoIWhhc2xvY2FsZGlyKCksICdUYWIgMiBsb2NhbGRpcicpCiAgdGFibmV4dCAzCiAgY2FsbCBhc3NlcnRfdHJ1ZShoYXNsb2NhbGRpcigpLCAnVGFiIDMgbG9jYWxkaXInKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKIiBUZXN0IGZvciB0YWJwYWdlLWxvY2FsIGRpcmVjdG9yeQpmdW5jIFRlc3RfbWtzZXNzaW9uX3RjZF9tdWx0aXBsZV90YWJzKCkKICBsZXQgc2F2ZV9jd2QgPSBnZXRjd2QoKQogIGNhbGwgbWtkaXIoJ1h0b3BkaXInKQogIGNkIFh0b3BkaXIKICBjYWxsIG1rZGlyKCdYdGFiZGlyMScpCiAgY2FsbCBta2RpcignWHRhYmRpcjInKQogIGNhbGwgbWtkaXIoJ1h0YWJkaXIzJykKICBjYWxsIG1rZGlyKCdYd2luZGlyMScpCiAgY2FsbCBta2RpcignWHdpbmRpcjInKQogIGNhbGwgbWtkaXIoJ1h3aW5kaXIzJykKICB0Y2QgWHRhYmRpcjEKICBib3RyaWdodCBuZXcKICB3aW5jbWQgdAogIGxjZCAuLi9Yd2luZGlyMQogIHRhYm5ldwogIHRjZCAuLi9YdGFiZGlyMgogIGJvdHJpZ2h0IG5ldwogIGxjZCAuLi9Yd2luZGlyMgogIHRhYm5ldwogIHRjZCAuLi9YdGFiZGlyMwogIGJvdHJpZ2h0IG5ldwogIGxjZCAuLi9Yd2luZGlyMwogIHRhYmZpcnN0CiAgMXdpbmNtZCB3CiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgb25seSB8IHRhYm9ubHkKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdGFiZGlyMScsIGZuYW1lbW9kaWZ5KGdldGN3ZCgtMSwgMSksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYd2luZGlyMScsIGZuYW1lbW9kaWZ5KGdldGN3ZCgxLCAxKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIxJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDIsIDEpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjInLCBmbmFtZW1vZGlmeShnZXRjd2QoLTEsIDIpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhYmRpcjInLCBmbmFtZW1vZGlmeShnZXRjd2QoMSwgMiksICc6dCcpKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYd2luZGlyMicsIGZuYW1lbW9kaWZ5KGdldGN3ZCgyLCAyKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIzJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKC0xLCAzKSwgJzp0JykpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h0YWJkaXIzJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKDEsIDMpLCAnOnQnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnWHdpbmRpcjMnLCBmbmFtZW1vZGlmeShnZXRjd2QoMiwgMyksICc6dCcpKQogICVid2lwZQogIGNhbGwgY2hkaXIoc2F2ZV9jd2QpCiAgY2FsbCBkZWxldGUoIlh0b3BkaXIiLCAicmYiKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX2JsYW5rX3RhYnMoKQogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5leHQgMwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHRhYm5ldwogIHRhYm5ldwogIHRhYm5leHQgMgogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoNCwgdGFicGFnZW5yKCckJyksICdzZXNzaW9uIHJlc3RvcmUgc2hvdWxkIHJlc3RvcmUgbnVtYmVyIG9mIHRhYnMnKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDMsIHRhYnBhZ2VucigpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIHRoZSBhY3RpdmUgdGFiJykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fYnVmZmVyX2NvdW50KCkKICBzZXQgaGlkZGVuCgogICIgRWRpdCBleGFjdGx5IHRocmVlIGZpbGVzIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCiAgJWJ3aXBlIQogIGUgWGZvbyB8IHRhYmUgWGJhciB8IHRhYmUgWGJhegogIHRhYmRvIHdyaXRlCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CgogICIgVmVyaWZ5IHRoYXQgbG9hZGluZyB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBjcmVhdGUgYWRkaXRpb25hbCBidWZmZXJzLgogICVid2lwZSEKICBzb3VyY2UgWHRlc3RfbWtzLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKDMsIGxlbihnZXRidWZpbmZvKCkpKQoKICAiIENsZWFuIHVwLgogIGNhbGwgZGVsZXRlKCdYZm9vJykKICBjYWxsIGRlbGV0ZSgnWGJhcicpCiAgY2FsbCBkZWxldGUoJ1hiYXonKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICAlYndpcGUhCiAgc2V0IGhpZGRlbiYKZW5kZnVuYwoKaWYgaGFzKCdleHRyYV9zZWFyY2gnKQoKZnVuYyBUZXN0X21rc2Vzc2lvbl9obHNlYXJjaCgpCiAgc2V0IGhsc2VhcmNoCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbm9obHNlYXJjaAogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoMSwgdjpobHNlYXJjaCwgJ3Nlc3Npb24gc2hvdWxkIHJlc3RvcmUgc2VhcmNoIGhpZ2hsaWdodGluZyBzdGF0ZScpCiAgbm9obHNlYXJjaAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoMCwgdjpobHNlYXJjaCwgJ3Nlc3Npb24gc2hvdWxkIHJlc3RvcmUgc2VhcmNoIGhpZ2hsaWdodGluZyBzdGF0ZScpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgplbmRpZgoKCmZ1bmMgVGVzdF9ta3Nlc3Npb25fYmxhbmtfd2luZG93cygpCiAgc3BsaXQKICBzcGxpdAogIHNwbGl0CiAgMyB3aW5jbWQgdwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIHNwbGl0CiAgc3BsaXQKICAyIHdpbmNtZCB3CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCg0LCB3aW5ucignJCcpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIG51bWJlciBvZiB3aW5kb3dzJykKICBjYWxsIGFzc2VydF9lcXVhbCgzLCB3aW5ucigpLCAnc2Vzc2lvbiByZXN0b3JlIHNob3VsZCByZXN0b3JlIHRoZSBhY3RpdmUgd2luZG93JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmlmIGhhcygndGVybWluYWwnKQoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9zaGVsbCgpCiAgQ2hlY2tGZWF0dXJlIHF1aWNrZml4CgogIHRlcm1pbmFsCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGxldCB0ZXJtX2NtZCA9ICcnCiAgZm9yIGxpbmUgaW4gbGluZXMKICAgIGlmIGxpbmUgPX4gJ150ZXJtaW5hbCcKICAgICAgbGV0IHRlcm1fY21kID0gbGluZQogICAgZWxzZWlmIGxpbmUgPX4gJ2JhZGQuKicgLiAmc2hlbGwKICAgICAgY2FsbCBhc3NlcnRfcmVwb3J0KCd1bmV4cGVjdGVkIHNoZWxsIGxpbmU6ICcgLiBsaW5lKQogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9tYXRjaCgndGVybWluYWwgKytjdXJ3aW4gKytjb2xzPVxkXCsgKytyb3dzPVxkXCtccyouKiQnLCB0ZXJtX2NtZCkKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Jlc3RvcmVfY21kYXJnKCkKICB0ZXJtaW5hbCArK25vcmVzdG9yZQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Jlc3RvcmVfZnVuY2FyZygpCiAgY2FsbCB0ZXJtX3N0YXJ0KCZzaGVsbCwgeydub3Jlc3RvcmUnOiAxfSkKICBta3Nlc3Npb24hIFh0ZXN0X21rcy5vdXQKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzLm91dCcpCiAgbGV0IHRlcm1fY21kID0gJycKICBmb3IgbGluZSBpbiBsaW5lcwogICAgaWYgbGluZSA9fiAnXnRlcm1pbmFsJwogICAgICBjYWxsIGFzc2VydF9yZXBvcnQoJ3Nlc3Npb24gbXVzdCBub3QgcmVzdG9yZSB0ZW1pbmFsJykKICAgIGVuZGlmCiAgZW5kZm9yCgogIGNhbGwgU3RvcFNoZWxsSW5UZXJtaW5hbChidWZucignJScpKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9ub19yZXN0b3JlX2Z1bmMoKQogIHRlcm1pbmFsCiAgY2FsbCB0ZXJtX3NldHJlc3RvcmUoYnVmbnIoJyUnKSwgJ05PTkUnKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3Rlcm1pbmFsX25vX3Nzb3AoKQogIHRlcm1pbmFsCiAgc2V0IHNlc3Npb25vcHRpb25zLT10ZXJtaW5hbAogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGNhbGwgYXNzZXJ0X3JlcG9ydCgnc2Vzc2lvbiBtdXN0IG5vdCByZXN0b3JlIHRlbWluYWwnKQogICAgZW5kaWYKICBlbmRmb3IKCiAgY2FsbCBTdG9wU2hlbGxJblRlcm1pbmFsKGJ1Zm5yKCclJykpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKZnVuYyBUZXN0X21rc2Vzc2lvbl90ZXJtaW5hbF9yZXN0b3JlX290aGVyKCkKICBDaGVja0ZlYXR1cmUgcXVpY2tmaXgKCiAgdGVybWluYWwKICBldmFsIGJ1Zm5yKCclJyktPnRlcm1fc2V0cmVzdG9yZSgnb3RoZXInKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBsaW5lcyA9IHJlYWRmaWxlKCdYdGVzdF9ta3Mub3V0JykKICBsZXQgdGVybV9jbWQgPSAnJwogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdedGVybWluYWwnCiAgICAgIGxldCB0ZXJtX2NtZCA9IGxpbmUKICAgIGVuZGlmCiAgZW5kZm9yCiAgY2FsbCBhc3NlcnRfbWF0Y2goJ3Rlcm1pbmFsICsrY3Vyd2luICsrY29scz1cZFwrICsrcm93cz1cZFwrLipvdGhlcicsIHRlcm1fY21kKQoKICBjYWxsIFN0b3BTaGVsbEluVGVybWluYWwoYnVmbnIoJyUnKSkKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCmVuZGZ1bmMKCmVuZGlmICIgaGFzKCd0ZXJtaW5hbCcpCgoiIFRlc3QgOm1rdmlldyB3aXRoIGEgZmlsZSBhcmd1bWVudC4KZnVuYyBUZXN0X21rdmlld19maWxlKCkKICAiIENyZWF0ZSBhIHZpZXcgd2l0aCBsaW5lIG51bWJlciBhbmQgYSBmb2xkLgogIGhlbHAgOm1rdmlldwogIHNldCBudW1iZXIKICBub3JtISBWfXpmMAogIGxldCBwb3MgPSBnZXRwb3MoJy4nKQogIGxldCBsaW5lZm9sZGNsb3NlZDEgPSBmb2xkY2xvc2VkKCcuJykKICBta3ZpZXchIFh2aWV3CiAgc2V0IG5vbnVtYmVyCiAgbm9ybSEgenJqCiAgIiBXZSBjYW4gY2xvc2UgdGhlIGhlbHAgd2luZG93LCBhcyBta3ZpZXcgd2l0aCBhIGZpbGUgbmFtZSBzaG91bGQKICAiIGdlbmVyYXRlIGEgY29tbWFuZCB0byBlZGl0IHRoZSBmaWxlLgogIGhlbHBjbG9zZQoKICBzb3VyY2UgWHZpZXcKICBjYWxsIGFzc2VydF9lcXVhbCgxLCAmbnVtYmVyKQogIGNhbGwgYXNzZXJ0X21hdGNoKCdcKjpta3ZpZXdcKiQnLCBnZXRsaW5lKCcuJykpCiAgY2FsbCBhc3NlcnRfZXF1YWwocG9zLCBnZXRwb3MoJy4nKSkKICBjYWxsIGFzc2VydF9lcXVhbChsaW5lZm9sZGNsb3NlZDEsIGZvbGRjbG9zZWQoJy4nKSkKCiAgIiBDcmVhdGluZyBhIHZpZXcgYWdhaW4gd2l0aCB0aGUgc2FtZSBmaWxlIG5hbWUgc2hvdWxkIGZhaWwgKGZpbGUKICAiIGFscmVhZHkgZXhpc3RzKS4gQnV0IHdpdGggYSAhLCB0aGUgcHJldmlvdXMgdmlldyBzaG91bGQgYmUKICAiIG92ZXJ3cml0dGVuIHdpdGhvdXQgZXJyb3IuCiAgaGVscCA6bG9hZHZpZXcKICBjYWxsIGFzc2VydF9mYWlscygnbWt2aWV3IFh2aWV3JywgJ0UxODk6JykKICBjYWxsIGFzc2VydF9tYXRjaCgnXCo6bG9hZHZpZXdcKiQnLCBnZXRsaW5lKCcuJykpCiAgbWt2aWV3ISBYdmlldwogIGNhbGwgYXNzZXJ0X21hdGNoKCdcKjpsb2Fkdmlld1wqJCcsIGdldGxpbmUoJy4nKSkKCiAgY2FsbCBkZWxldGUoJ1h2aWV3JykKICBid2lwZQplbmRmdW5jCgoiIFRlc3QgOm1rdmlldyBhbmQgOmxvYWR2aWV3IHdpdGggYSBjdXN0b20gJ3ZpZXdkaXInLgpmdW5jIFRlc3RfbWt2aWV3X2xvYWR2aWV3X3dpdGhfdmlld2RpcigpCiAgc2V0IHZpZXdkaXI9WHZpZXdkaXIKCiAgaGVscCA6bWt2aWV3CiAgc2V0IG51bWJlcgogIG5vcm0hIFZ9emYKICBsZXQgcG9zID0gZ2V0cG9zKCcuJykKICBsZXQgbGluZWZvbGRjbG9zZWQxID0gZm9sZGNsb3NlZCgnLicpCiAgbWt2aWV3IDEKICBzZXQgbm9udW1iZXIKICBub3JtISB6cmoKCiAgbG9hZHZpZXcgMQoKICAiIFRoZSBkaXJlY3RvcnkgWHZpZXdkaXIvIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhbmQgdGhlIHZpZXcKICAiIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhhdCBkaXJlY3RvcnkuCiAgY2FsbCBhc3NlcnRfZXF1YWwoJ1h2aWV3ZGlyLycgLgogICAgICAgIFwgICAgICAgICAgIHN1YnN0aXR1dGUoCiAgICAgICAgXCAgICAgICAgICAgICBzdWJzdGl0dXRlKAogICAgICAgIFwgICAgICAgICAgICAgICBleHBhbmQoJyU6cCcpLCAnLycsICc9KycsICdnJyksICc6JywgJz0tJywgJ2cnKSAuICc9MS52aW0nLAogICAgICAgIFwgICAgICAgICAgIGdsb2IoJ1h2aWV3ZGlyLyonKSkKICBjYWxsIGFzc2VydF9lcXVhbCgxLCAmbnVtYmVyKQogIGNhbGwgYXNzZXJ0X21hdGNoKCdcKjpta3ZpZXdcKiQnLCBnZXRsaW5lKCcuJykpCiAgY2FsbCBhc3NlcnRfZXF1YWwocG9zLCBnZXRwb3MoJy4nKSkKICBjYWxsIGFzc2VydF9lcXVhbChsaW5lZm9sZGNsb3NlZDEsIGZvbGRjbG9zZWQoJy4nKSkKCiAgY2FsbCBkZWxldGUoJ1h2aWV3ZGlyJywgJ3JmJykKICBzZXQgdmlld2RpciYKICBoZWxwY2xvc2UKZW5kZnVuYwoKZnVuYyBUZXN0X21rdmlld19ub19maWxlX25hbWUoKQogIG5ldwogICIgOm1rdmlldyBvciA6bWt2aWV3IHtucn0gc2hvdWxkIGZhaWwgaW4gYSB1bm5hbWVkIGJ1ZmZlci4KICBjYWxsIGFzc2VydF9mYWlscygnbWt2aWV3JywgJ0UzMjonKQogIGNhbGwgYXNzZXJ0X2ZhaWxzKCdta3ZpZXcgMScsICdFMzI6JykKCiAgIiA6bWt2aWV3IHtmaWxlfSBzaG91bGQgc3VjY2VlZCBpbiBhIHVubmFtZWQgYnVmZmVyLgogIG1rdmlldyBYdmlldwogIGhlbHAKICBzb3VyY2UgWHZpZXcKICBjYWxsIGFzc2VydF9lcXVhbCgnJywgYnVmbmFtZSgnJScpKQoKICBjYWxsIGRlbGV0ZSgnWHZpZXcnKQogICVid2lwZQplbmRmdW5jCgoiIEEgY2xlYW4gc2Vzc2lvbiAob25lIGVtcHR5IGJ1ZmZlciwgb25lIHdpbmRvdywgYW5kIG9uZSB0YWIpIHNob3VsZCBub3QKIiBzZXQgYW55IGVycm9yIG1lc3NhZ2VzIHdoZW4gc291cmNlZCBiZWNhdXNlIG5vIGNvbW1hbmRzIHNob3VsZCBmYWlsLgpmdW5jIFRlc3RfbWtzZXNzaW9uX25vX2Vycm1zZygpCiAgbGV0IHY6ZXJybXNnID0gJycKICAlYndpcGUhCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgnJywgdjplcnJtc2cpCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgpmdW5jIFRlc3RfbWtzZXNzaW9uX3F1b3RlX2luX2ZpbGVuYW1lKCkKICBpZiAhaGFzKCd1bml4JykKICAgICIgb25seSBVbml4IGNhbiBoYW5kbGUgdGhpcyB3ZWlyZCBmaWxlbmFtZQogICAgcmV0dXJuCiAgZW5kaWYKICBsZXQgdjplcnJtc2cgPSAnJwogICVid2lwZSEKICBzcGxpdCBhbm90aGVyCiAgc3BsaXQgeCd5XCJ6CiAgbWtzZXNzaW9uISBYdGVzdF9ta3NfcXVvdGVkLm91dAogICVid2lwZSEKICBzb3VyY2UgWHRlc3RfbWtzX3F1b3RlZC5vdXQKICBjYWxsIGFzc2VydF90cnVlKGJ1ZmV4aXN0cygieCd5XCJ6IikpCgogICVid2lwZSEKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzX3F1b3RlZC5vdXQnKQplbmRmdW5jCgoiIFRlc3QgZm9yIHN0b3JpbmcgZ2xvYmFsIHZhcmlhYmxlcyBpbiBhIHNlc3Npb24gZmlsZQpmdW5jIFRlc3RfbWtzZXNzaW9uX2dsb2JhbHMoKQogIHNldCBzZXNzaW9ub3B0aW9ucys9Z2xvYmFscwoKICAiIGNyZWF0ZSBkaWZmZXJlbnQgZ2xvYmFsIHZhcmlhYmxlcwogIGxldCBnOkdsb2JhbF9zdHJpbmcgPSAiU3VuIGlzIHNoaW5pbmdcclxuIgogIGxldCBnOkdsb2JhbF9jb3VudCA9IDEwMAogIGxldCBnOkdsb2JhbF9waSA9IDMuMTQKICBsZXQgZzpHbG9iYWxfbmVnX2Zsb2F0ID0gLTIuNjgKCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CgogIHVubGV0IGc6R2xvYmFsX3N0cmluZwogIHVubGV0IGc6R2xvYmFsX2NvdW50CiAgdW5sZXQgZzpHbG9iYWxfcGkKICB1bmxldCBnOkdsb2JhbF9uZWdfZmxvYXQKCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgiU3VuIGlzIHNoaW5pbmdcclxuIiwgZzpHbG9iYWxfc3RyaW5nKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDEwMCwgZzpHbG9iYWxfY291bnQpCiAgY2FsbCBhc3NlcnRfZXF1YWwoMy4xNCwgZzpHbG9iYWxfcGkpCiAgY2FsbCBhc3NlcnRfZXF1YWwoLTIuNjgsIGc6R2xvYmFsX25lZ19mbG9hdCkKCiAgdW5sZXQgZzpHbG9iYWxfc3RyaW5nCiAgdW5sZXQgZzpHbG9iYWxfY291bnQKICB1bmxldCBnOkdsb2JhbF9waQogIHVubGV0IGc6R2xvYmFsX25lZ19mbG9hdAogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3Mub3V0JykKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCmVuZGZ1bmMKCiIgVGVzdCBmb3IgY2hhbmdpbmcgYmFja3NsYXNoIHRvIGZvcndhcmQgc2xhc2ggaW4gZmlsZW5hbWVzCmZ1bmMgVGVzdF9ta3Nlc3Npb25fc2xhc2goKQogIGlmIGV4aXN0cygnK3NoZWxsc2xhc2gnKQogICAgdGhyb3cgJ1NraXBwZWQ6IGNhbm5vdCB1c2UgYmFja3NsYXNoIGluIGZpbGUgbmFtZScKICBlbmRpZgogIGVuZXcKICAlYndpcGUhCiAgZSBhXFxiXFxjCiAgbWtzZXNzaW9uISBYdGVzdF9ta3MxLm91dAogIHNldCBzZXNzaW9ub3B0aW9ucys9c2xhc2gKICBta3Nlc3Npb24hIFh0ZXN0X21rczIub3V0CgogICVid2lwZSEKICBzb3VyY2UgWHRlc3RfbWtzMS5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgnYVxiXGMnLCBidWZuYW1lKCcnKSkKICAlYndpcGUhCiAgc291cmNlIFh0ZXN0X21rczIub3V0CiAgY2FsbCBhc3NlcnRfZXF1YWwoJ2EvYi9jJywgYnVmbmFtZSgnJykpCgogICVid2lwZSEKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzMS5vdXQnKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3MyLm91dCcpCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgoiIFRlc3QgZm9yIGNoYW5naW5nIGRpcmVjdG9yeSB0byB0aGUgc2Vzc2lvbiBmaWxlIGRpcmVjdG9yeQpmdW5jIFRlc3RfbWtzZXNzaW9uX3Nlc2RpcigpCiAgbGV0IHNhdmVfY3dkID0gZ2V0Y3dkKCkKICBjYWxsIG1rZGlyKCdYcHJvaicpCiAgbWtzZXNzaW9uISBYcHJvai9YdGVzdF9ta3MxLm91dAogIHNldCBzZXNzaW9ub3B0aW9ucy09Y3VyZGlyCiAgc2V0IHNlc3Npb25vcHRpb25zKz1zZXNkaXIKICBta3Nlc3Npb24hIFhwcm9qL1h0ZXN0X21rczIub3V0CgogIHNvdXJjZSBYcHJvai9YdGVzdF9ta3MxLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCd0ZXN0ZGlyJywgZm5hbWVtb2RpZnkoZ2V0Y3dkKCksICc6dCcpKQogIHNvdXJjZSBYcHJvai9YdGVzdF9ta3MyLm91dAogIGNhbGwgYXNzZXJ0X2VxdWFsKCdYcHJvaicsIGZuYW1lbW9kaWZ5KGdldGN3ZCgpLCAnOnQnKSkKICBjYWxsIGNoZGlyKHNhdmVfY3dkKQogICVid2lwZQoKICBzZXQgc2Vzc2lvbm9wdGlvbnMmCiAgY2FsbCBkZWxldGUoJ1hwcm9qJywgJ3JmJykKZW5kZnVuYwoKIiBUZXN0IGZvciBzdG9yaW5nIHRoZSAnbGluZXMnIGFuZCAnY29sdW1ucycgc2V0dGluZ3MKZnVuYyBUZXN0X21rc2Vzc2lvbl9yZXNpemUoKQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzMS5vdXQKICBzZXQgc2Vzc2lvbm9wdGlvbnMrPXJlc2l6ZQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzMi5vdXQKCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rczEub3V0JykKICBsZXQgZm91bmRfcmVzaXplID0gdjpmYWxzZQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdec2V0IGxpbmVzPScKICAgICAgbGV0IGZvdW5kX3Jlc2l6ZSA9IHY6dHJ1ZQogICAgICBicmVhawogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF9mYWxzZShmb3VuZF9yZXNpemUpCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rczIub3V0JykKICBsZXQgZm91bmRfcmVzaXplID0gdjpmYWxzZQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdec2V0IGxpbmVzPScKICAgICAgbGV0IGZvdW5kX3Jlc2l6ZSA9IHY6dHJ1ZQogICAgICBicmVhawogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF90cnVlKGZvdW5kX3Jlc2l6ZSkKCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rczEub3V0JykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzMi5vdXQnKQogIHNldCBzZXNzaW9ub3B0aW9ucyYKZW5kZnVuYwoKIiBUZXN0IGZvciBta3Nlc3Npb24gd2l0aCBhIG5hbWVkIHNjcmF0Y2ggYnVmZmVyCmZ1bmMgVGVzdF9ta3Nlc3Npb25fc2NyYXRjaCgpCiAgZW5ldyB8IG9ubHkKICBmaWxlIFhzY3JhdGNoCiAgc2V0IGJ1ZnR5cGU9bm9maWxlCiAgbWtzZXNzaW9uISBYdGVzdF9ta3Mub3V0CiAgJWJ3aXBlCiAgc291cmNlIFh0ZXN0X21rcy5vdXQKICBjYWxsIGFzc2VydF9lcXVhbCgnWHNjcmF0Y2gnLCBidWZuYW1lKCcnKSkKICBjYWxsIGFzc2VydF9lcXVhbCgnbm9maWxlJywgJmJ1ZnR5cGUpCiAgJWJ3aXBlCiAgY2FsbCBkZWxldGUoJ1h0ZXN0X21rcy5vdXQnKQplbmRmdW5jCgoiIFRlc3QgZm9yIG1rc2Vzc2lvbiB3aXRoIGZvbGQgb3B0aW9ucwpmdW5jIFRlc3RfbWtzZXNzaW9uX2ZvbGRvcHQoKQogIHNldCBzZXNzaW9ub3B0aW9ucy09b3B0aW9ucwogIHNldCBzZXNzaW9ub3B0aW9ucys9Zm9sZHMKICBuZXcKICBzZXRsb2NhbCBmb2xkZW5hYmxlCiAgc2V0bG9jYWwgZm9sZG1ldGhvZD1leHByCiAgc2V0bG9jYWwgZm9sZG1hcmtlcj08PDwsPj4+CiAgc2V0bG9jYWwgZm9sZGlnbm9yZT0lCiAgc2V0bG9jYWwgZm9sZGxldmVsPTIKICBzZXRsb2NhbCBmb2xkbWlubGluZXM9MTAKICBzZXRsb2NhbCBmb2xkbmVzdG1heD0xNQogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGNsb3NlCiAgJWJ3aXBlCgogIHNvdXJjZSBYdGVzdF9ta3Mub3V0CiAgY2FsbCBhc3NlcnRfdHJ1ZSgmZm9sZGVuYWJsZSkKICBjYWxsIGFzc2VydF9lcXVhbCgnZXhwcicsICZmb2xkbWV0aG9kKQogIGNhbGwgYXNzZXJ0X2VxdWFsKCc8PDwsPj4+JywgJmZvbGRtYXJrZXIpCiAgY2FsbCBhc3NlcnRfZXF1YWwoJyUnLCAmZm9sZGlnbm9yZSkKICBjYWxsIGFzc2VydF9lcXVhbCgyLCAmZm9sZGxldmVsKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDEwLCAmZm9sZG1pbmxpbmVzKQogIGNhbGwgYXNzZXJ0X2VxdWFsKDE1LCAmZm9sZG5lc3RtYXgpCgogIGNsb3NlCiAgJWJ3aXBlCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgoiIFRlc3QgZm9yIG1rc2Vzc2lvbiB3aXRoIHdpbmRvdyBwb3NpdGlvbgpmdW5jIFRlc3RfbWtzZXNzaW9uX3dpbnBvcygpCiAgaWYgIWhhcygnZ3VpX3J1bm5pbmcnKQogICAgIiBPbmx5IGFwcGxpY2FibGUgaW4gR1VJIFZpbQogICAgcmV0dXJuCiAgZW5kaWYKICBzZXQgc2Vzc2lvbm9wdGlvbnMrPXdpbnBvcwogIG1rc2Vzc2lvbiEgWHRlc3RfbWtzLm91dAogIGxldCBmb3VuZF93aW5wb3MgPSB2OmZhbHNlCiAgbGV0IGxpbmVzID0gcmVhZGZpbGUoJ1h0ZXN0X21rcy5vdXQnKQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICded2lucG9zICcKICAgICAgbGV0IGZvdW5kX3dpbnBvcyA9IHY6dHJ1ZQogICAgICBicmVhawogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF90cnVlKGZvdW5kX3dpbnBvcykKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzLm91dCcpCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgoiIFRlc3QgZm9yIG1rc2Vzc2lvbiB3aXRoICdjb21wYXRpYmxlJyBvcHRpb24KZnVuYyBUZXN0X21rc2Vzc2lvbl9jb21wYXRpYmxlKCkKICBta3Nlc3Npb24hIFh0ZXN0X21rczEub3V0CiAgc2V0IGNvbXBhdGlibGUKICBta3Nlc3Npb24hIFh0ZXN0X21rczIub3V0CiAgc2V0IG5vY3AKCiAgbGV0IHRlc3Rfc3VjY2VzcyA9IHY6ZmFsc2UKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzMS5vdXQnKQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdeaWYgJmNwIHwgc2V0IG5vY3AgfCBlbmRpZicKICAgICAgbGV0IHRlc3Rfc3VjY2VzcyA9IHY6dHJ1ZQogICAgICBicmVhawogICAgZW5kaWYKICBlbmRmb3IKICBjYWxsIGFzc2VydF90cnVlKHRlc3Rfc3VjY2VzcykKCiAgbGV0IHRlc3Rfc3VjY2VzcyA9IHY6ZmFsc2UKICBsZXQgbGluZXMgPSByZWFkZmlsZSgnWHRlc3RfbWtzMi5vdXQnKQogIGZvciBsaW5lIGluIGxpbmVzCiAgICBpZiBsaW5lID1+ICdeaWYgISZjcCB8IHNldCBjcCB8IGVuZGlmJwogICAgICBsZXQgdGVzdF9zdWNjZXNzID0gdjp0cnVlCiAgICAgIGJyZWFrCiAgICBlbmRpZgogIGVuZGZvcgogIGNhbGwgYXNzZXJ0X3RydWUodGVzdF9zdWNjZXNzKQoKICBjYWxsIGRlbGV0ZSgnWHRlc3RfbWtzMS5vdXQnKQogIGNhbGwgZGVsZXRlKCdYdGVzdF9ta3MyLm91dCcpCiAgc2V0IGNvbXBhdGlibGUmCiAgc2V0IHNlc3Npb25vcHRpb25zJgplbmRmdW5jCgpmdW5jIHM6Q2xlYXJNYXBwaW5ncygpCiAgbWFwY2xlYXIKICBvbWFwY2xlYXIKICBtYXBjbGVhciEKICBsbWFwY2xlYXIKICB0bWFwY2xlYXIKZW5kZnVuYwoKZnVuYyBUZXN0X21rdmltcmMoKQogIGxldCBlbnRyaWVzID0gWwogICAgICAgIFwgWycnLCAnbm90aGluZycsICc8Tm9wPiddLAogICAgICAgIFwgWyduJywgJ25vcm1hbCcsICdOT1JNQUwnXSwKICAgICAgICBcIFsndicsICd2aXN1YWwnLCAnVklTVUFMJ10sCiAgICAgICAgXCBbJ3MnLCAnc2VsZWN0JywgJ1NFTEVDVCddLAogICAgICAgIFwgWyd4JywgJ3Zpc3VhbG9ubHknLCAnVklTVUFMT05MWSddLAogICAgICAgIFwgWydvJywgJ29wZXJhdG9yJywgJ09QRVJBVE9SJ10sCiAgICAgICAgXCBbJ2knLCAnaW5zZXJ0JywgJ0lOU0VSVCddLAogICAgICAgIFwgWydsJywgJ2xhbmcnLCAnTEFORyddLAogICAgICAgIFwgWydjJywgJ2NvbW1hbmQnLCAnQ09NTUFORCddLAogICAgICAgIFwgWyd0JywgJ3Rlcm1pbmFsJywgJ1RFUk1JTkFMJ10sCiAgICAgICAgXCBdCiAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgIGV4ZSBlbnRyeVswXSAuLiAnbWFwICcgLi4gZW50cnlbMV0gLi4gJyAnIC4uIGVudHJ5WzJdCiAgZW5kZm9yCgogIG1rdmltcmMgWHRlc3R2aW1yYwoKICBjYWxsIHM6Q2xlYXJNYXBwaW5ncygpCiAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgIGNhbGwgYXNzZXJ0X2VxdWFsKCcnLCBtYXBhcmcoZW50cnlbMV0sIGVudHJ5WzBdKSkKICBlbmRmb3IKCiAgc291cmNlIFh0ZXN0dmltcmMKCiAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgIGNhbGwgYXNzZXJ0X2VxdWFsKGVudHJ5WzJdLCBtYXBhcmcoZW50cnlbMV0sIGVudHJ5WzBdKSkKICBlbmRmb3IKCiAgY2FsbCBzOkNsZWFyTWFwcGluZ3MoKQogIGNhbGwgZGVsZXRlKCdYdGVzdHZpbXJjJykKZW5kZnVuYwoKIiB2aW06IHNoaWZ0d2lkdGg9MiBzdHM9MiBleHBhbmR0YWIK