IyEvdXNyL2Jpbi9weXRob24gLXUKIwojIHRoaXMgdGVzdHMgdGhlIGJhc2ljIEFQSXMgb2YgdGhlIFhtbFRleHRSZWFkZXIgaW50ZXJmYWNlCiMKaW1wb3J0IGxpYnhtbDIKaW1wb3J0IFN0cmluZ0lPCmltcG9ydCBzeXMKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuZGVidWdNZW1vcnkoMSkKCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8YT48YiBiMT0iYjEiLz48Yz5jb250ZW50IG9mIGM8L2M+PC9hPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QxIikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJFcnJvciByZWFkaW5nIHRvIGZpcnN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0aGUgZmlyc3QgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0byBzZWNvbmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDEgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMToKICAgIHByaW50ICJFcnJvciByZWFkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0byB0aGlyZCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYyIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdGhlIHRoaXJkIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdG8gdGV4dCBub2RlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiI3RleHQiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAzIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMCBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJjb250ZW50IG9mIGMiOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdGhlIHRleHQgbm9kZSIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgdGhpcmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImMiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxNSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0aGUgZW5kIG9mIHRoaXJkIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdG8gZW5kIG9mIGZpcnN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMTUgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdGhlIGVuZCBvZiBmaXJzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50ICJFcnJvciByZWFkaW5nIHRvIGVuZCBvZiBkb2N1bWVudCIKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPHRlc3QgeG1sbnM6ZHQ9InVybjpkYXRhdHlwZXMiIGR0OnR5cGU9ImludCIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QyIikKCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0ZXN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuR2V0QXR0cmlidXRlTm8oMCkgIT0gInVybjpkYXRhdHlwZXMiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5vKDEpICE9ICJpbnQiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5zKCJ0eXBlIiwgInVybjpkYXRhdHlwZXMiKSAhPSAiaW50IiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGUoImR0OnR5cGUiKSAhPSAiaW50IjoKICAgIHByaW50ICJlcnJvciByZWFkaW5nIHRlc3QgYXR0cmlidXRlcyIKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPHJvb3QgeG1sbnM6YT0idXJuOjQ1NiI+CjxpdGVtPgo8cmVmIGhyZWY9ImE6YiIvPgo8L2l0ZW0+Cjwvcm9vdD4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MyIpCgpyZXQgPSByZWFkZXIuUmVhZCgpCndoaWxlIHJldCA9PSAxOgogICAgaWYgcmVhZGVyLk5hbWUoKSA9PSAicmVmIjoKICAgICAgICBpZiByZWFkZXIuTG9va3VwTmFtZXNwYWNlKCJhIikgIT0gInVybjo0NTYiOgoJICAgIHByaW50ICJlcnJvciByZXNvbHZpbmcgbmFtZXNwYWNlIHByZWZpeCIKCSAgICBzeXMuZXhpdCgxKQoJYnJlYWsKICAgIHJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgZmluZGluZyB0aGUgcmVmIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQoKIwojIEhvbWUgbWFkZSBleGFtcGxlIGZvciB0aGUgdmFyaW91cyBhdHRyaWJ1dGUgYWNjZXNzIGZ1bmN0aW9ucwojCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8dGVzdGF0dHIgeG1sbnM9InVybjoxIiB4bWxuczphPSJ1cm46MiIgYj0iYiIgYTpiPSJhOmIiLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NCIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0aGUgdGVzdGF0dHIgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgaW5kZXgKIwppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMCkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDApIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMSkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDEpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczphIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygyKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMikiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMykgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgbmFtZQojCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoInhtbG5zIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJ4bWxuczphIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zOmEnKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImIiKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2InKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImE6YiIpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYTpiJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2E6YicpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5zKCJiIiwgInVybjoyIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdiJywgJ3VybjoyJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InLCAndXJuOjInKSIKICAgIHN5cy5leGl0KDEpCiMKIyBHbyBiYWNrIGFuZCByZWFkIGluIHNlcXVlbmNlCiMKaWYgcmVhZGVyLk1vdmVUb0VsZW1lbnQoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIGJhY2sgdG8gZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIHRvIG1vdmUgdG8gZmlyc3QgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIHRvIG1vdmUgdG8gbmV4dCBhdHRyaWJ1dGUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOmEiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMDoKICAgIHByaW50ICJGYWlsZWQgdG8gZGV0ZWN0IGxhc3QgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKCiAgICAKIwojIGEgY291cGxlIG9mIHRlc3RzIGZvciBuYW1lc3BhY2Ugbm9kZXMKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPGEgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9mb28iPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q2IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0NjogZmFpbGVkIHRvIFJlYWQoKSIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3Q2OiBmYWlsZWQgdG8gTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lc3BhY2VVcmkoKSAhPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iIG9yIFwKICAgcmVhZGVyLkxvY2FsTmFtZSgpICE9ICJ4bWxucyIgb3IgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28iIG9yIHJlYWRlci5Ob2RlVHlwZSgpICE9IDI6CiAgICBwcmludCAidGVzdDY6IGZhaWxlZCB0byByZWFkIHRoZSBuYW1lc3BhY2Ugbm9kZSIKICAgIHN5cy5leGl0KDEpCgpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPGEgeG1sbnM6cHJlZml4PSJodHRwOi8vZXhhbXBsZS5jb20vZm9vIj4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NyIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDc6IGZhaWxlZCB0byBSZWFkKCkiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0NzogZmFpbGVkIHRvIE1vdmVUb0ZpcnN0QXR0cmlidXRlKCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZXNwYWNlVXJpKCkgIT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiBvciBcCiAgIHJlYWRlci5Mb2NhbE5hbWUoKSAhPSAicHJlZml4IiBvciByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczpwcmVmaXgiIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28iIG9yIHJlYWRlci5Ob2RlVHlwZSgpICE9IDI6CiAgICBwcmludCAidGVzdDc6IGZhaWxlZCB0byByZWFkIHRoZSBuYW1lc3BhY2Ugbm9kZSIKICAgIHN5cy5leGl0KDEpCgojCiMgVGVzdCBmb3IgYSBsaW1pdCBjYXNlOgojCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8YS8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDgiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3Q4OiBmYWlsZWQgdG8gcmVhZCB0aGUgbm9kZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDE6CiAgICBwcmludCAidGVzdDg6IGZhaWxlZCB0byBhbmFseXplIHRoZSBub2RlIgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50ICJ0ZXN0ODogZmFpbGVkIHRvIGRldGVjdCB0aGUgRU9GIgogICAgc3lzLmV4aXQoMSkKCiMKIyBBbm90aGVyIHRlc3QgcHJvdmlkZWQgYnkgU3TpcGhhbmUgQmlkb3VsIGFuZCBjaGVja2VkIHdpdGggQyMKIwpkZWYgdHN0X3JlYWRlcihzKToKICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTyhzKQogICAgaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCiAgICByZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0c3QiKQogICAgcmVzID0gIiIKICAgIHdoaWxlIHJlYWRlci5SZWFkKCk6CglyZXM9cmVzICsgIiVzICglcykgWyVzXSAlZCAlZFxuIiAlIChyZWFkZXIuTm9kZVR5cGUoKSxyZWFkZXIuTmFtZSgpLAoJCQkJICAgICAgcmVhZGVyLlZhbHVlKCksIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpLAoJCQkJICAgICAgcmVhZGVyLkRlcHRoKCkpCglpZiByZWFkZXIuTm9kZVR5cGUoKSA9PSAxOiAjIEVsZW1lbnQKCSAgICB3aGlsZSByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpOgoJCXJlcyA9IHJlcyArICItLSAlcyAoJXMpIFslc10gJWRcbiIgJSAocmVhZGVyLk5vZGVUeXBlKCksCgkJCQkJCSAgIHJlYWRlci5OYW1lKCkscmVhZGVyLlZhbHVlKCksCgkJCQkJCSAgIHJlYWRlci5EZXB0aCgpKQogICAgcmV0dXJuIHJlcwogICAgCmRvYz0iIiI8YT48YiBiMT0iYjEiLz48Yz5jb250ZW50IG9mIGM8L2M+PC9hPiIiIgpleHBlY3Q9IiIiMSAoYSkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMSAxCi0tIDIgKGIxKSBbYjFdIDIKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NvbnRlbnQgb2YgY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0NSBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PGIvPjxjLz48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAxIDEKMSAoYykgW05vbmVdIDEgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDkgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjxhPjxiPmJiYjwvYj48Yz5jY2M8L2M+PC9hPiIiIgpleHBlY3Q9IiIiMSAoYSkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbYmJiXSAwIDIKMTUgKGIpIFtOb25lXSAwIDEKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NjY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0MTAgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKIwojIGNsZWFudXAgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGNvdW50aW5nCiMKZGVsIGYKZGVsIGlucHV0CmRlbCByZWFkZXIKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuY2xlYW51cFBhcnNlcigpCmlmIGxpYnhtbDIuZGVidWdNZW1vcnkoMSkgPT0gMDoKICAgIHByaW50ICJPSyIKZWxzZToKICAgIHByaW50ICJNZW1vcnkgbGVhayAlZCBieXRlcyIgJSAobGlieG1sMi5kZWJ1Z01lbW9yeSgxKSkKICAgIGxpYnhtbDIuZHVtcE1lbW9yeSgpCg==