IyEvdXNyL2Jpbi9weXRob24gLXUKIyAtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQppbXBvcnQgc3lzCmltcG9ydCBsaWJ4bWwyCgojIE1lbW9yeSBkZWJ1ZyBzcGVjaWZpYwpsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpCgpjdHh0ID0gTm9uZQoKY2xhc3MgY2FsbGJhY2s6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnRkLCBzdGFydGUsIGVuZGUsIGRlbHRhLCBlbmRkKToKICAgICAgICBzZWxmLnN0YXJ0ZCA9IHN0YXJ0ZAogICAgICAgIHNlbGYuc3RhcnRlID0gc3RhcnRlCiAgICAgICAgc2VsZi5lbmRlID0gZW5kZQogICAgICAgIHNlbGYuZW5kZCA9IGVuZGQKCXNlbGYuZGVsdGEgPSBkZWx0YQoJc2VsZi5jb3VudCA9IDAKCiAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKICAgICAgICBnbG9iYWwgY3R4dAoJaWYgY3R4dC5ieXRlQ29uc3VtZWQoKSAhPSBzZWxmLnN0YXJ0ZDoKCSAgICBwcmludCAiZG9jdW1lbnQgc3RhcnQgYXQgd3JvbmcgaW5kZXg6ICVkIGV4cGVjdGluZyAlZFxuIiAlICgKCSAgICAgICAgICBjdHh0LmJ5dGVDb25zdW1lZCgpLCBzZWxmLnN0YXJ0ZCkKICAgICAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CiAgICAgICAgZ2xvYmFsIGN0eHQKCWV4cGVjdCA9IHNlbGYuZW5kZSArIHNlbGYuZGVsdGEgKiAoc2VsZi5jb3VudCAtIDEpICsgc2VsZi5lbmRkCglpZiBjdHh0LmJ5dGVDb25zdW1lZCgpICE9IGV4cGVjdDoKCSAgICBwcmludCAiZG9jdW1lbnQgZW5kIGF0IHdyb25nIGluZGV4OiAlZCBleHBlY3RpbmcgJWRcbiIgJSAoCgkgICAgICAgICAgY3R4dC5ieXRlQ29uc3VtZWQoKSwgZXhwZWN0KQogICAgICAgICAgICBzeXMuZXhpdCgxKQoKICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgdGFnLCBhdHRycyk6CiAgICAgICAgZ2xvYmFsIGN0eHQKCWlmIHRhZyA9PSAiYmFyMSI6CgkgICAgZXhwZWN0ID0gc2VsZi5zdGFydGUgKyBzZWxmLmRlbHRhICogc2VsZi5jb3VudAoJICAgIGlmIGN0eHQuYnl0ZUNvbnN1bWVkKCkgIT0gZXhwZWN0OgoJCXByaW50ICJlbGVtZW50IHN0YXJ0IGF0IHdyb25nIGluZGV4OiAlZCBleHBlY3RpbmcgJWRcbiIgJSAoCgkJICAgICAgY3R4dC5ieXRlQ29uc3VtZWQoKSwgZXhwZWN0KQoJCXN5cy5leGl0KDEpCgkgICAgCgogICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgdGFnKToKICAgICAgICBnbG9iYWwgY3R4dAoJaWYgdGFnID09ICJiYXIxIjoKCSAgICBleHBlY3QgPSBzZWxmLmVuZGUgKyBzZWxmLmRlbHRhICogc2VsZi5jb3VudAoJICAgIGlmIGN0eHQuYnl0ZUNvbnN1bWVkKCkgIT0gZXhwZWN0OgoJCXByaW50ICJlbGVtZW50IGVuZCBhdCB3cm9uZyBpbmRleDogJWQgZXhwZWN0aW5nICVkXG4iICUgKAoJCSAgICAgIGN0eHQuYnl0ZUNvbnN1bWVkKCksIGV4cGVjdCkKCQlzeXMuZXhpdCgxKQoJICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQoKICAgIGRlZiBjaGFyYWN0ZXJzKHNlbGYsIGRhdGEpOgogICAgICAgIHBhc3MKCiMKIyBGaXJzdCBydW4gYSBwdXJlIFVURi04IHRlc3QKIwpoYW5kbGVyID0gY2FsbGJhY2soMCwgMTMsIDI3LCAxOTgsIDE4MykKY3R4dCA9IGxpYnhtbDIuY3JlYXRlUHVzaFBhcnNlcihoYW5kbGVyLCAiPGZvbz5cbiIsIDYsICJ0ZXN0LnhtbCIpCmNodW5rID0gIiIiICA8YmFyMT5jaGFyczE8L2JhcjE+CiAgPGJhcjI+Y2hhcnMyPC9iYXIyPgogIDxiYXIzPmNoYXJzMzwvYmFyMz4KICA8YmFyND5jaGFyczQ8L2JhcjQ+CiAgPGJhcjU+Y2hhcnM1PC9iYXI1PgogIDxiYXI2PiZsdDtzNjwvYmFyNj4KICA8YmFyNz5jaGFyczc8L2Jhcjc+CiAgPGJhcjg+JiMzODs4PC9iYXI4PgogIDxiYXI5PmNoYXJzOTwvYmFyOT4KIiIiCmkgPSAwCndoaWxlIGkgPCAxMDAwMDoKICAgIGN0eHQucGFyc2VDaHVuayhjaHVuaywgbGVuKGNodW5rKSwgMCkKICAgIGkgPSBpICsgMQpjaHVuayA9ICI8L2Zvbz4iCmN0eHQucGFyc2VDaHVuayhjaHVuaywgbGVuKGNodW5rKSwgMSkKY3R4dD1Ob25lCgojCiMgVGhlbiBydW4gYSB0ZXN0IHJlbHlpbmcgb24gSVNPLUxhdGluLTEKIwpoYW5kbGVyID0gY2FsbGJhY2soNDMsIDU3LCA3MSwgMTk4LCAxODMpCmNodW5rPSIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KPGZvbz4KIiIiCmN0eHQgPSBsaWJ4bWwyLmNyZWF0ZVB1c2hQYXJzZXIoaGFuZGxlciwgY2h1bmssIGxlbihjaHVuayksICJ0ZXN0LnhtbCIpCmNodW5rID0gIiIiICA8YmFyMT5jaGFyczE8L2JhcjE+CiAgPGJhcjI+Y2hhcnMyPC9iYXIyPgogIDxiYXIzPmNoYXJzMzwvYmFyMz4KICA8YmFyND5jaOByczQ8L2JhcjQ+CiAgPGJhcjU+Y2hhcnM1PC9iYXI1PgogIDxiYXI2PiZsdDtzNjwvYmFyNj4KICA8YmFyNz5jaGFyczc8L2Jhcjc+CiAgPGJhcjg+JiMzODs4PC9iYXI4PgogIDxiYXI5PnRy6HMgOTwvYmFyOT4KIiIiCmkgPSAwCndoaWxlIGkgPCAxMDAwMDoKICAgIGN0eHQucGFyc2VDaHVuayhjaHVuaywgbGVuKGNodW5rKSwgMCkKICAgIGkgPSBpICsgMQpjaHVuayA9ICI8L2Zvbz4iCmN0eHQucGFyc2VDaHVuayhjaHVuaywgbGVuKGNodW5rKSwgMSkKY3R4dD1Ob25lCgojIE1lbW9yeSBkZWJ1ZyBzcGVjaWZpYwpsaWJ4bWwyLmNsZWFudXBQYXJzZXIoKQppZiBsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpID09IDA6CiAgICBwcmludCAiT0siCmVsc2U6CiAgICBwcmludCAiTWVtb3J5IGxlYWsgJWQgYnl0ZXMiICUgKGxpYnhtbDIuZGVidWdNZW1vcnkoMSkpCiAgICBsaWJ4bWwyLmR1bXBNZW1vcnkoKQo=