IyEvdXNyL2Jpbi9weXRob24gLXUKIyAtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQojCiMgdGhpcyB0ZXN0cyB0aGUgYmFzaWMgQVBJcyBvZiB0aGUgWG1sVGV4dFJlYWRlciBpbnRlcmZhY2UKIwppbXBvcnQgbGlieG1sMgppbXBvcnQgU3RyaW5nSU8KaW1wb3J0IHN5cwoKIyBNZW1vcnkgZGVidWcgc3BlY2lmaWMKbGlieG1sMi5kZWJ1Z01lbW9yeSgxKQoKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxhPjxiIGIxPSJiMSIvPjxjPmNvbnRlbnQgb2YgYzwvYz48L2E+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDEiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGZpcnN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGZpcnN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHNlY29uZCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMSBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gdGhpcmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImMiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgdGhpcmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gdGV4dCBub2RlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiI3RleHQiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAzIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMCBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJjb250ZW50IG9mIGMiOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSB0ZXh0IG5vZGUiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiB0aGlyZCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYyIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDE1IG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgZW5kIG9mIHRoaXJkIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiBmaXJzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDE1IG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMDoKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgZW5kIG9mIGZpcnN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAwOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiBkb2N1bWVudCIKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPHRlc3QgeG1sbnM6ZHQ9InVybjpkYXRhdHlwZXMiIGR0OnR5cGU9ImludCIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QyIikKCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0ZXN0IGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuR2V0QXR0cmlidXRlTm8oMCkgIT0gInVybjpkYXRhdHlwZXMiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5vKDEpICE9ICJpbnQiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZU5zKCJ0eXBlIiwgInVybjpkYXRhdHlwZXMiKSAhPSAiaW50IiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGUoImR0OnR5cGUiKSAhPSAiaW50IjoKICAgIHByaW50ICJlcnJvciByZWFkaW5nIHRlc3QgYXR0cmlidXRlcyIKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPHJvb3QgeG1sbnM6YT0idXJuOjQ1NiI+CjxpdGVtPgo8cmVmIGhyZWY9ImE6YiIvPgo8L2l0ZW0+Cjwvcm9vdD4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MyIpCgpyZXQgPSByZWFkZXIuUmVhZCgpCndoaWxlIHJldCA9PSAxOgogICAgaWYgcmVhZGVyLk5hbWUoKSA9PSAicmVmIjoKICAgICAgICBpZiByZWFkZXIuTG9va3VwTmFtZXNwYWNlKCJhIikgIT0gInVybjo0NTYiOgogICAgICAgICAgICBwcmludCAiZXJyb3IgcmVzb2x2aW5nIG5hbWVzcGFjZSBwcmVmaXgiCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgYnJlYWsKICAgIHJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgZmluZGluZyB0aGUgcmVmIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQoKIwojIEhvbWUgbWFkZSBleGFtcGxlIGZvciB0aGUgdmFyaW91cyBhdHRyaWJ1dGUgYWNjZXNzIGZ1bmN0aW9ucwojCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8dGVzdGF0dHIgeG1sbnM9InVybjoxIiB4bWxuczphPSJ1cm46MiIgYj0iYiIgYTpiPSJhOmIiLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NCIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAiRXJyb3IgcmVhZGluZyB0aGUgdGVzdGF0dHIgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgaW5kZXgKIwppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMCkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDApIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMSkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDEpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczphIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygyKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMikiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMykgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIKICAgIHN5cy5leGl0KDEpCiMKIyBBdHRyaWJ1dGUgZXhwbG9yYXRpb24gYnkgbmFtZQojCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoInhtbG5zIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJ4bWxuczphIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCd4bWxucycpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zOmEnKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImIiKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2InKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImE6YiIpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYTpiJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2E6YicpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5zKCJiIiwgInVybjoyIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdiJywgJ3VybjoyJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2InLCAndXJuOjInKSIKICAgIHN5cy5leGl0KDEpCiMKIyBHbyBiYWNrIGFuZCByZWFkIGluIHNlcXVlbmNlCiMKaWYgcmVhZGVyLk1vdmVUb0VsZW1lbnQoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIGJhY2sgdG8gZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIHRvIG1vdmUgdG8gZmlyc3QgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIHRvIG1vdmUgdG8gbmV4dCBhdHRyaWJ1dGUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOmEiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMDoKICAgIHByaW50ICJGYWlsZWQgdG8gZGV0ZWN0IGxhc3QgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKCiAgICAKIwojIGEgY291cGxlIG9mIHRlc3RzIGZvciBuYW1lc3BhY2Ugbm9kZXMKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPGEgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9mb28iLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NiIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDY6IGZhaWxlZCB0byBSZWFkKCkiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0NjogZmFpbGVkIHRvIE1vdmVUb0ZpcnN0QXR0cmlidXRlKCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZXNwYWNlVXJpKCkgIT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiBvciBcCiAgIHJlYWRlci5Mb2NhbE5hbWUoKSAhPSAieG1sbnMiIG9yIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zIiBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIiBvciByZWFkZXIuTm9kZVR5cGUoKSAhPSAyOgogICAgcHJpbnQgInRlc3Q2OiBmYWlsZWQgdG8gcmVhZCB0aGUgbmFtZXNwYWNlIG5vZGUiCiAgICBzeXMuZXhpdCgxKQoKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxhIHhtbG5zOnByZWZpeD0iaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q3IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0NzogZmFpbGVkIHRvIFJlYWQoKSIKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5Nb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3Q3OiBmYWlsZWQgdG8gTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lc3BhY2VVcmkoKSAhPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iIG9yIFwKICAgcmVhZGVyLkxvY2FsTmFtZSgpICE9ICJwcmVmaXgiIG9yIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOnByZWZpeCIgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIgb3IgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMjoKICAgIHByaW50ICJ0ZXN0NzogZmFpbGVkIHRvIHJlYWQgdGhlIG5hbWVzcGFjZSBub2RlIgogICAgc3lzLmV4aXQoMSkKCiMKIyBUZXN0IGZvciBhIGxpbWl0IGNhc2U6CiMKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxhLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0OCIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDg6IGZhaWxlZCB0byByZWFkIHRoZSBub2RlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMToKICAgIHByaW50ICJ0ZXN0ODogZmFpbGVkIHRvIGFuYWx5emUgdGhlIG5vZGUiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAwOgogICAgcHJpbnQgInRlc3Q4OiBmYWlsZWQgdG8gZGV0ZWN0IHRoZSBFT0YiCiAgICBzeXMuZXhpdCgxKQoKIwojIEFub3RoZXIgdGVzdCBwcm92aWRlZCBieSBTdOlwaGFuZSBCaWRvdWwgYW5kIGNoZWNrZWQgd2l0aCBDIwojCmRlZiB0c3RfcmVhZGVyKHMpOgogICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKHMpCiAgICBpbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKICAgIHJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRzdCIpCiAgICByZXMgPSAiIgogICAgd2hpbGUgcmVhZGVyLlJlYWQoKToKICAgICAgICByZXM9cmVzICsgIiVzICglcykgWyVzXSAlZCAlZFxuIiAlIChyZWFkZXIuTm9kZVR5cGUoKSxyZWFkZXIuTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5WYWx1ZSgpLCByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuRGVwdGgoKSkKICAgICAgICBpZiByZWFkZXIuTm9kZVR5cGUoKSA9PSAxOiAjIEVsZW1lbnQKICAgICAgICAgICAgd2hpbGUgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKToKICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICItLSAlcyAoJXMpIFslc10gJWQgJWRcbiIgJSAocmVhZGVyLk5vZGVUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5OYW1lKCkscmVhZGVyLlZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpLCByZWFkZXIuRGVwdGgoKSkKICAgIHJldHVybiByZXMKICAgIApkb2M9IiIiPGE+PGIgYjE9ImIxIi8+PGM+Y29udGVudCBvZiBjPC9jPjwvYT4iIiIKZXhwZWN0PSIiIjEgKGEpIFtOb25lXSAwIDAKMSAoYikgW05vbmVdIDEgMQotLSAyIChiMSkgW2IxXSAwIDIKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NvbnRlbnQgb2YgY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0NSBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PGIvPjxjLz48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAxIDEKMSAoYykgW05vbmVdIDEgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDkgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjxhPjxiPmJiYjwvYj48Yz5jY2M8L2M+PC9hPiIiIgpleHBlY3Q9IiIiMSAoYSkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbYmJiXSAwIDIKMTUgKGIpIFtOb25lXSAwIDEKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NjY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0MTAgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0IGE9ImEiLz4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAxIDAKLS0gMiAoYSkgW2FdIDAgMQoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDExIGZhaWxlZCIKICAgIHByaW50IHJlcwogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdD48YT5hYWE8L2E+PGIvPjwvdGVzdD4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAwIDAKMSAoYSkgW05vbmVdIDAgMQozICgjdGV4dCkgW2FhYV0gMCAyCjE1IChhKSBbTm9uZV0gMCAxCjEgKGIpIFtOb25lXSAxIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQgInRlc3QxMiBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PHA+PC9wPjwvdGVzdD4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAwIDAKMSAocCkgW05vbmVdIDAgMQoxNSAocCkgW05vbmVdIDAgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDEzIGZhaWxlZCIKICAgIHByaW50IHJlcwogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8cD48L3A+IiIiCmV4cGVjdD0iIiIxIChwKSBbTm9uZV0gMCAwCjE1IChwKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0MTQgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKIwojIHRlc3QgZnJvbSBidWcgIzEwODgwMSAKIwpkb2M9IiIiPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbCl0+Cgo8YXJ0aWNsZT4KeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKPC9hcnRpY2xlPgoiIiIKZXhwZWN0PSIiIjEwIChhcnRpY2xlKSBbTm9uZV0gMCAwCjEgKGFydGljbGUpIFtOb25lXSAwIDAKMyAoI3RleHQpIFsKeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgKXSAwIDEKMTUgKGFydGljbGUpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQgInRlc3QxNSBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgojCiMgY2xlYW51cCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gY291bnRpbmcKIwpkZWwgZgpkZWwgaW5wdXQKZGVsIHJlYWRlcgoKIyBNZW1vcnkgZGVidWcgc3BlY2lmaWMKbGlieG1sMi5jbGVhbnVwUGFyc2VyKCkKaWYgbGlieG1sMi5kZWJ1Z01lbW9yeSgxKSA9PSAwOgogICAgcHJpbnQgIk9LIgplbHNlOgogICAgcHJpbnQgIk1lbW9yeSBsZWFrICVkIGJ5dGVzIiAlIChsaWJ4bWwyLmRlYnVnTWVtb3J5KDEpKQogICAgbGlieG1sMi5kdW1wTWVtb3J5KCkK