IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCmltcG9ydCBzeXMKaW1wb3J0IHNldHVwX3Rlc3QKaW1wb3J0IGxpYnhtbDIKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuZGVidWdNZW1vcnkoMSkKCmN0eHQgPSBOb25lCgpjbGFzcyBjYWxsYmFjazoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydGQsIHN0YXJ0ZSwgZW5kZSwgZGVsdGEsIGVuZGQpOgogICAgICAgIHNlbGYuc3RhcnRkID0gc3RhcnRkCiAgICAgICAgc2VsZi5zdGFydGUgPSBzdGFydGUKICAgICAgICBzZWxmLmVuZGUgPSBlbmRlCiAgICAgICAgc2VsZi5lbmRkID0gZW5kZAogICAgICAgIHNlbGYuZGVsdGEgPSBkZWx0YQogICAgICAgIHNlbGYuY291bnQgPSAwCgogICAgZGVmIHN0YXJ0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgZ2xvYmFsIGN0eHQKICAgICAgICBpZiBjdHh0LmJ5dGVDb25zdW1lZCgpICE9IHNlbGYuc3RhcnRkOgogICAgICAgICAgICBwcmludCgiZG9jdW1lbnQgc3RhcnQgYXQgd3JvbmcgaW5kZXg6ICVkIGV4cGVjdGluZyAlZFxuIiAlICgKICAgICAgICAgICAgICAgICAgY3R4dC5ieXRlQ29uc3VtZWQoKSwgc2VsZi5zdGFydGQpKQogICAgICAgICAgICBzeXMuZXhpdCgxKQoKICAgIGRlZiBlbmREb2N1bWVudChzZWxmKToKICAgICAgICBnbG9iYWwgY3R4dAogICAgICAgIGV4cGVjdCA9IHNlbGYuZW5kZSArIHNlbGYuZGVsdGEgKiAoc2VsZi5jb3VudCAtIDEpICsgc2VsZi5lbmRkCiAgICAgICAgaWYgY3R4dC5ieXRlQ29uc3VtZWQoKSAhPSBleHBlY3Q6CiAgICAgICAgICAgIHByaW50KCJkb2N1bWVudCBlbmQgYXQgd3JvbmcgaW5kZXg6ICVkIGV4cGVjdGluZyAlZFxuIiAlICgKICAgICAgICAgICAgICAgICAgY3R4dC5ieXRlQ29uc3VtZWQoKSwgZXhwZWN0KSkKICAgICAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIHRhZywgYXR0cnMpOgogICAgICAgIGdsb2JhbCBjdHh0CiAgICAgICAgaWYgdGFnID09ICJiYXIxIjoKICAgICAgICAgICAgZXhwZWN0ID0gc2VsZi5zdGFydGUgKyBzZWxmLmRlbHRhICogc2VsZi5jb3VudAogICAgICAgICAgICBpZiBjdHh0LmJ5dGVDb25zdW1lZCgpICE9IGV4cGVjdDoKICAgICAgICAgICAgICAgIHByaW50KCJlbGVtZW50IHN0YXJ0IGF0IHdyb25nIGluZGV4OiAlZCBleHBlY3RpbmcgJWRcbiIgJSAoCiAgICAgICAgICAgICAgICAgICBjdHh0LmJ5dGVDb25zdW1lZCgpLCBleHBlY3QpKQogICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICAgICAgCgogICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgdGFnKToKICAgICAgICBnbG9iYWwgY3R4dAogICAgICAgIGlmIHRhZyA9PSAiYmFyMSI6CiAgICAgICAgICAgIGV4cGVjdCA9IHNlbGYuZW5kZSArIHNlbGYuZGVsdGEgKiBzZWxmLmNvdW50CiAgICAgICAgICAgIGlmIGN0eHQuYnl0ZUNvbnN1bWVkKCkgIT0gZXhwZWN0OgogICAgICAgICAgICAgICAgcHJpbnQoImVsZW1lbnQgZW5kIGF0IHdyb25nIGluZGV4OiAlZCBleHBlY3RpbmcgJWRcbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICBjdHh0LmJ5dGVDb25zdW1lZCgpLCBleHBlY3QpKQogICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCgogICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgZGF0YSk6CiAgICAgICAgcGFzcwoKIwojIEZpcnN0IHJ1biBhIHB1cmUgVVRGLTggdGVzdAojCmhhbmRsZXIgPSBjYWxsYmFjaygwLCAxMywgMjcsIDE5OCwgMTgzKQpjdHh0ID0gbGlieG1sMi5jcmVhdGVQdXNoUGFyc2VyKGhhbmRsZXIsICI8Zm9vPlxuIiwgNiwgInRlc3QueG1sIikKY2h1bmsgPSAiIiIgIDxiYXIxPmNoYXJzMTwvYmFyMT4KICA8YmFyMj5jaGFyczI8L2JhcjI+CiAgPGJhcjM+Y2hhcnMzPC9iYXIzPgogIDxiYXI0PmNoYXJzNDwvYmFyND4KICA8YmFyNT5jaGFyczU8L2JhcjU+CiAgPGJhcjY+Jmx0O3M2PC9iYXI2PgogIDxiYXI3PmNoYXJzNzwvYmFyNz4KICA8YmFyOD4mIzM4Ozg8L2Jhcjg+CiAgPGJhcjk+Y2hhcnM5PC9iYXI5PgoiIiIKaSA9IDAKd2hpbGUgaSA8IDEwMDAwOgogICAgY3R4dC5wYXJzZUNodW5rKGNodW5rLCBsZW4oY2h1bmspLCAwKQogICAgaSA9IGkgKyAxCmNodW5rID0gIjwvZm9vPiIKY3R4dC5wYXJzZUNodW5rKGNodW5rLCBsZW4oY2h1bmspLCAxKQpjdHh0PU5vbmUKCiMKIyBUaGVuIHJ1biBhIHRlc3QgcmVseWluZyBvbiBJU08tTGF0aW4tMQojCmhhbmRsZXIgPSBjYWxsYmFjayg0MywgNTcsIDcxLCAxOTgsIDE4MykKY2h1bms9IiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8Zm9vPgoiIiIKY3R4dCA9IGxpYnhtbDIuY3JlYXRlUHVzaFBhcnNlcihoYW5kbGVyLCBjaHVuaywgbGVuKGNodW5rKSwgInRlc3QueG1sIikKY2h1bmsgPSAiIiIgIDxiYXIxPmNoYXJzMTwvYmFyMT4KICA8YmFyMj5jaGFyczI8L2JhcjI+CiAgPGJhcjM+Y2hhcnMzPC9iYXIzPgogIDxiYXI0PmNo4HJzNDwvYmFyND4KICA8YmFyNT5jaGFyczU8L2JhcjU+CiAgPGJhcjY+Jmx0O3M2PC9iYXI2PgogIDxiYXI3PmNoYXJzNzwvYmFyNz4KICA8YmFyOD4mIzM4Ozg8L2Jhcjg+CiAgPGJhcjk+dHLocyA5PC9iYXI5PgoiIiIKaSA9IDAKd2hpbGUgaSA8IDEwMDAwOgogICAgY3R4dC5wYXJzZUNodW5rKGNodW5rLCBsZW4oY2h1bmspLCAwKQogICAgaSA9IGkgKyAxCmNodW5rID0gIjwvZm9vPiIKY3R4dC5wYXJzZUNodW5rKGNodW5rLCBsZW4oY2h1bmspLCAxKQpjdHh0PU5vbmUKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuY2xlYW51cFBhcnNlcigpCmlmIGxpYnhtbDIuZGVidWdNZW1vcnkoMSkgPT0gMDoKICAgIHByaW50KCJPSyIpCmVsc2U6CiAgICBwcmludCgiTWVtb3J5IGxlYWsgJWQgYnl0ZXMiICUgKGxpYnhtbDIuZGVidWdNZW1vcnkoMSkpKQo=