IiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KCldyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgoKKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KCiIiIiMiCmZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RGYWlsZWQKaW1wb3J0IHN5cwoKaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAjIFRlc3QgYmFzaWMgc2FuaXR5IG9mIHJlcHIoKQogICAgdmVyaWZ5KHJlcHIodSdhYmMnKSA9PSAidSdhYmMnIikKICAgIHZlcmlmeShyZXByKHUnYWJcXGMnKSA9PSAidSdhYlxcXFxjJyIpCiAgICB2ZXJpZnkocmVwcih1J2FiXFwnKSA9PSAidSdhYlxcXFwnIikKICAgIHZlcmlmeShyZXByKHUnXFxjJykgPT0gInUnXFxcXGMnIikKICAgIHZlcmlmeShyZXByKHUnXFwnKSA9PSAidSdcXFxcJyIpCiAgICB2ZXJpZnkocmVwcih1J1xuJykgPT0gInUnXFxuJyIpCiAgICB2ZXJpZnkocmVwcih1J1xyJykgPT0gInUnXFxyJyIpCiAgICB2ZXJpZnkocmVwcih1J1x0JykgPT0gInUnXFx0JyIpCiAgICB2ZXJpZnkocmVwcih1J1xiJykgPT0gInUnXFx4MDgnIikKICAgIHZlcmlmeShyZXByKHUiJ1wiIikgPT0gIiIidSdcXCciJyIiIikKICAgIHZlcmlmeShyZXByKHUiJ1wiIikgPT0gIiIidSdcXCciJyIiIikKICAgIHZlcmlmeShyZXByKHUiJyIpID09ICcnJ3UiJyInJycpCiAgICB2ZXJpZnkocmVwcih1JyInKSA9PSAiIiJ1JyInIiIiKQogICAgdmVyaWZ5KHJlcHIodScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2KSkpKSA9PQogICAgICAgInUnXFx4MDBcXHgwMVxceDAyXFx4MDNcXHgwNFxceDA1XFx4MDZcXHgwN1xceDA4XFx0XFxuXFx4MGJcXHgwY1xcciIKICAgICAgICJcXHgwZVxceDBmXFx4MTBcXHgxMVxceDEyXFx4MTNcXHgxNFxceDE1XFx4MTZcXHgxN1xceDE4XFx4MTlcXHgxYSIKICAgICAgICJcXHgxYlxceDFjXFx4MWRcXHgxZVxceDFmICFcIiMkJSZcXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJIgogICAgICAgIkpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XFx4N2YiCiAgICAgICAiXFx4ODBcXHg4MVxceDgyXFx4ODNcXHg4NFxceDg1XFx4ODZcXHg4N1xceDg4XFx4ODlcXHg4YVxceDhiXFx4OGNcXHg4ZCIKICAgICAgICJcXHg4ZVxceDhmXFx4OTBcXHg5MVxceDkyXFx4OTNcXHg5NFxceDk1XFx4OTZcXHg5N1xceDk4XFx4OTlcXHg5YVxceDliIgogICAgICAgIlxceDljXFx4OWRcXHg5ZVxceDlmXFx4YTBcXHhhMVxceGEyXFx4YTNcXHhhNFxceGE1XFx4YTZcXHhhN1xceGE4XFx4YTkiCiAgICAgICAiXFx4YWFcXHhhYlxceGFjXFx4YWRcXHhhZVxceGFmXFx4YjBcXHhiMVxceGIyXFx4YjNcXHhiNFxceGI1XFx4YjZcXHhiNyIKICAgICAgICJcXHhiOFxceGI5XFx4YmFcXHhiYlxceGJjXFx4YmRcXHhiZVxceGJmXFx4YzBcXHhjMVxceGMyXFx4YzNcXHhjNFxceGM1IgogICAgICAgIlxceGM2XFx4YzdcXHhjOFxceGM5XFx4Y2FcXHhjYlxceGNjXFx4Y2RcXHhjZVxceGNmXFx4ZDBcXHhkMVxceGQyXFx4ZDMiCiAgICAgICAiXFx4ZDRcXHhkNVxceGQ2XFx4ZDdcXHhkOFxceGQ5XFx4ZGFcXHhkYlxceGRjXFx4ZGRcXHhkZVxceGRmXFx4ZTBcXHhlMSIKICAgICAgICJcXHhlMlxceGUzXFx4ZTRcXHhlNVxceGU2XFx4ZTdcXHhlOFxceGU5XFx4ZWFcXHhlYlxceGVjXFx4ZWRcXHhlZVxceGVmIgogICAgICAgIlxceGYwXFx4ZjFcXHhmMlxceGYzXFx4ZjRcXHhmNVxceGY2XFx4ZjdcXHhmOFxceGY5XFx4ZmFcXHhmYlxceGZjXFx4ZmQiCiAgICAgICAiXFx4ZmVcXHhmZiciKQoKZGVmIHRlc3QobWV0aG9kLCBpbnB1dCwgb3V0cHV0LCAqYXJncyk6CiAgICBpZiB2ZXJib3NlOgogICAgICAgIHByaW50ICclcy4lcyVzID0/ICVzLi4uICcgJSAocmVwcihpbnB1dCksIG1ldGhvZCwgYXJncywgcmVwcihvdXRwdXQpKSwKICAgIHRyeToKICAgICAgICBmID0gZ2V0YXR0cihpbnB1dCwgbWV0aG9kKQogICAgICAgIHZhbHVlID0gYXBwbHkoZiwgYXJncykKICAgIGV4Y2VwdDoKICAgICAgICB2YWx1ZSA9IHN5cy5leGNfdHlwZQogICAgICAgIGV4YyA9IHN5cy5leGNfaW5mbygpWzoyXQogICAgZWxzZToKICAgICAgICBleGMgPSBOb25lCiAgICBpZiB2YWx1ZSAhPSBvdXRwdXQgb3IgdHlwZSh2YWx1ZSkgaXMgbm90IHR5cGUob3V0cHV0KToKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBwcmludCAnbm8nCiAgICAgICAgcHJpbnQgJyonLGYsIGBpbnB1dGAsIGBvdXRwdXRgLCBgdmFsdWVgCiAgICAgICAgaWYgZXhjOgogICAgICAgICAgICBwcmludCAnICB2YWx1ZSA9PSAlczogJXMnICUgKGV4YykKICAgIGVsc2U6CiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgcHJpbnQgJ3llcycKCnRlc3QoJ2NhcGl0YWxpemUnLCB1JyBoZWxsbyAnLCB1JyBoZWxsbyAnKQp0ZXN0KCdjYXBpdGFsaXplJywgdSdoZWxsbyAnLCB1J0hlbGxvICcpCnRlc3QoJ2NhcGl0YWxpemUnLCB1J2FhYWEnLCB1J0FhYWEnKQp0ZXN0KCdjYXBpdGFsaXplJywgdSdBYUFhJywgdSdBYWFhJykKCnRlc3QoJ2NvdW50JywgdSdhYWEnLCAzLCB1J2EnKQp0ZXN0KCdjb3VudCcsIHUnYWFhJywgMCwgdSdiJykKdGVzdCgnY291bnQnLCAnYWFhJywgMywgdSdhJykKdGVzdCgnY291bnQnLCAnYWFhJywgMCwgdSdiJykKdGVzdCgnY291bnQnLCB1J2FhYScsIDMsICdhJykKdGVzdCgnY291bnQnLCB1J2FhYScsIDAsICdiJykKCnRlc3QoJ3RpdGxlJywgdScgaGVsbG8gJywgdScgSGVsbG8gJykKdGVzdCgndGl0bGUnLCB1J2hlbGxvICcsIHUnSGVsbG8gJykKdGVzdCgndGl0bGUnLCB1ImZPck1hVCB0aElzIGFTIHRpdExlIFN0cmluZyIsIHUnRm9ybWF0IFRoaXMgQXMgVGl0bGUgU3RyaW5nJykKdGVzdCgndGl0bGUnLCB1ImZPck1hVCx0aElzLWFTKnRpdExlO1N0cmluZyIsIHUnRm9ybWF0LFRoaXMtQXMqVGl0bGU7U3RyaW5nJykKdGVzdCgndGl0bGUnLCB1ImdldEludCIsIHUnR2V0aW50JykKCnRlc3QoJ2ZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIDAsIHUnYWJjJykKdGVzdCgnZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgOSwgdSdhYmMnLCAxKQp0ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAtMSwgdSdkZWYnLCA0KQoKdGVzdCgncmZpbmQnLCB1J2FiY2RlZmdoaWFiYycsIDksIHUnYWJjJykKCnRlc3QoJ2xvd2VyJywgdSdIZUxMbycsIHUnaGVsbG8nKQp0ZXN0KCdsb3dlcicsIHUnaGVsbG8nLCB1J2hlbGxvJykKCnRlc3QoJ3VwcGVyJywgdSdIZUxMbycsIHUnSEVMTE8nKQp0ZXN0KCd1cHBlcicsIHUnSEVMTE8nLCB1J0hFTExPJykKCmlmIDA6CiAgICB0cmFuc3RhYmxlID0gJ1wwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3ICEiIyQlJlwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYHh5emRlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flwxNzdcMjAwXDIwMVwyMDJcMjAzXDIwNFwyMDVcMjA2XDIwN1wyMTBcMjExXDIxMlwyMTNcMjE0XDIxNVwyMTZcMjE3XDIyMFwyMjFcMjIyXDIyM1wyMjRcMjI1XDIyNlwyMjdcMjMwXDIzMVwyMzJcMjMzXDIzNFwyMzVcMjM2XDIzN1wyNDBcMjQxXDI0MlwyNDNcMjQ0XDI0NVwyNDZcMjQ3XDI1MFwyNTFcMjUyXDI1M1wyNTRcMjU1XDI1NlwyNTdcMjYwXDI2MVwyNjJcMjYzXDI2NFwyNjVcMjY2XDI2N1wyNzBcMjcxXDI3MlwyNzNcMjc0XDI3NVwyNzZcMjc3XDMwMFwzMDFcMzAyXDMwM1wzMDRcMzA1XDMwNlwzMDdcMzEwXDMxMVwzMTJcMzEzXDMxNFwzMTVcMzE2XDMxN1wzMjBcMzIxXDMyMlwzMjNcMzI0XDMyNVwzMjZcMzI3XDMzMFwzMzFcMzMyXDMzM1wzMzRcMzM1XDMzNlwzMzdcMzQwXDM0MVwzNDJcMzQzXDM0NFwzNDVcMzQ2XDM0N1wzNTBcMzUxXDM1MlwzNTNcMzU0XDM1NVwzNTZcMzU3XDM2MFwzNjFcMzYyXDM2M1wzNjRcMzY1XDM2NlwzNjdcMzcwXDM3MVwzNzJcMzczXDM3NFwzNzVcMzc2XDM3NycKCiAgICB0ZXN0KCdtYWtldHJhbnMnLCB1J2FiYycsIHRyYW5zdGFibGUsIHUneHl6JykKICAgIHRlc3QoJ21ha2V0cmFucycsIHUnYWJjJywgVmFsdWVFcnJvciwgdSd4eXpxJykKCnRlc3QoJ3NwbGl0JywgdSd0aGlzIGlzIHRoZSBzcGxpdCBmdW5jdGlvbicsCiAgICAgW3UndGhpcycsIHUnaXMnLCB1J3RoZScsIHUnc3BsaXQnLCB1J2Z1bmN0aW9uJ10pCnRlc3QoJ3NwbGl0JywgdSdhfGJ8Y3xkJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddLCB1J3wnKQp0ZXN0KCdzcGxpdCcsIHUnYXxifGN8ZCcsIFt1J2EnLCB1J2InLCB1J2N8ZCddLCB1J3wnLCAyKQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2IgYyBkJ10sIE5vbmUsIDEpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYScsIHUnYicsIHUnYyBkJ10sIE5vbmUsIDIpCnRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddLCBOb25lLCAzKQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgTm9uZSwgNCkKdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhIGIgYyBkJ10sIE5vbmUsIDApCnRlc3QoJ3NwbGl0JywgdSdhICBiICBjICBkJywgW3UnYScsIHUnYicsIHUnYyAgZCddLCBOb25lLCAyKQp0ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCAnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCnRlc3QoJ3NwbGl0JywgdSdhLy9iLy9jLy9kJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddLCB1Jy8vJykKdGVzdCgnc3BsaXQnLCB1J2EvL2IvL2MvL2QnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sICcvLycpCnRlc3QoJ3NwbGl0JywgJ2EvL2IvL2MvL2QnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIHUnLy8nKQp0ZXN0KCdzcGxpdCcsIHUnZW5kY2FzZSB0ZXN0JywgW3UnZW5kY2FzZSAnLCB1JyddLCB1J3Rlc3QnKQp0ZXN0KCdzcGxpdCcsIHUnZW5kY2FzZSB0ZXN0JywgW3UnZW5kY2FzZSAnLCB1JyddLCAndGVzdCcpCnRlc3QoJ3NwbGl0JywgJ2VuZGNhc2UgdGVzdCcsIFt1J2VuZGNhc2UgJywgdScnXSwgdSd0ZXN0JykKCgojIGpvaW4gbm93IHdvcmtzIHdpdGggYW55IHNlcXVlbmNlIHR5cGUKY2xhc3MgU2VxdWVuY2U6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxKTogc2VsZi5zZXEgPSBzZXEKICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOiByZXR1cm4gc2VsZi5zZXFbaV0KCnRlc3QoJ2pvaW4nLCB1JyAnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCnRlc3QoJ2pvaW4nLCB1JyAnLCB1J2EgYiBjIGQnLCBbJ2EnLCAnYicsIHUnYycsIHUnZCddKQp0ZXN0KCdqb2luJywgdScnLCB1J2FiY2QnLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCnRlc3QoJ2pvaW4nLCB1JyAnLCB1J3cgeCB5IHonLCBTZXF1ZW5jZSgnd3h5eicpKQp0ZXN0KCdqb2luJywgdScgJywgVHlwZUVycm9yLCA3KQp0ZXN0KCdqb2luJywgdScgJywgVHlwZUVycm9yLCBTZXF1ZW5jZShbNywgdSdoZWxsbycsIDEyM0xdKSkKdGVzdCgnam9pbicsICcgJywgdSdhIGIgYyBkJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddKQp0ZXN0KCdqb2luJywgJyAnLCB1J2EgYiBjIGQnLCBbJ2EnLCAnYicsIHUnYycsIHUnZCddKQp0ZXN0KCdqb2luJywgJycsIHUnYWJjZCcsICh1J2EnLCB1J2InLCB1J2MnLCB1J2QnKSkKdGVzdCgnam9pbicsICcgJywgdSd3IHggeSB6JywgU2VxdWVuY2UodSd3eHl6JykpCnRlc3QoJ2pvaW4nLCAnICcsIFR5cGVFcnJvciwgNykKCnJlc3VsdCA9IHUnJwpmb3IgaSBpbiByYW5nZSgxMCk6CiAgICBpZiBpID4gMDoKICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB1JzonCiAgICByZXN1bHQgPSByZXN1bHQgKyB1J3gnKjEwCnRlc3QoJ2pvaW4nLCB1JzonLCByZXN1bHQsIFt1J3gnICogMTBdICogMTApCnRlc3QoJ2pvaW4nLCB1JzonLCByZXN1bHQsICh1J3gnICogMTAsKSAqIDEwKQoKdGVzdCgnc3RyaXAnLCB1JyAgIGhlbGxvICAgJywgdSdoZWxsbycpCnRlc3QoJ2xzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvICAgJykKdGVzdCgncnN0cmlwJywgdScgICBoZWxsbyAgICcsIHUnICAgaGVsbG8nKQp0ZXN0KCdzdHJpcCcsIHUnaGVsbG8nLCB1J2hlbGxvJykKCnRlc3QoJ3N3YXBjYXNlJywgdSdIZUxMbyBjT21wVXRlUnMnLCB1J2hFbGxPIENvTVB1VEVyUycpCgppZiAwOgogICAgdGVzdCgndHJhbnNsYXRlJywgdSd4eXphYmNkZWYnLCB1J3h5enh5eicsIHRyYW5zdGFibGUsIHUnZGVmJykKCiAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCB1J0EnKQogICAgdGVzdCgndHJhbnNsYXRlJywgdSdhYmMnLCB1J0FiYycsIHRhYmxlKQogICAgdGVzdCgndHJhbnNsYXRlJywgdSd4eXonLCB1J3h5eicsIHRhYmxlKQoKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d28hdGhyZWUhJywgdSchJywgdSdAJywgMSkKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZXR3b3RocmVlJywgJyEnLCAnJykKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWUhJywgdSchJywgdSdAJywgMikKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWVAJywgdSchJywgdSdAJywgMykKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWVAJywgdSchJywgdSdAJywgNCkKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSchJywgdSdAJywgMCkKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWVAJywgdSchJywgdSdAJykKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSd4JywgdSdAJykKdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSd4JywgdSdAJywgMikKCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdoZScpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdoZWxsbycpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMCwgdSdoZWxsbyB3b3JsZCcpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdScnKQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnZWxsbycpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdlbGxvJywgMSkKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1J28nLCA0KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnbycsIDUpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdScnLCA1KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnbG8nLCA2KQp0ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMykKdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDEsIHUnbG93bycsIDMsIDcpCnRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCAzLCA2KQoKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgMSwgdSdsbycpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGUnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGVsbG8gd29ybGQnKQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDAsIHUnd29ybCcpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsJywgMywgOSkKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J3dvcmxkJywgMywgMTIpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMSwgNykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAyLCA3KQp0ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDEsIHUnbG93bycsIDMsIDcpCnRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSdsb3dvJywgNCwgNykKdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCAzLCA4KQp0ZXN0KCdlbmRzd2l0aCcsIHUnYWInLCAwLCB1J2FiJywgMCwgMSkKdGVzdCgnZW5kc3dpdGgnLCB1J2FiJywgMCwgdSdhYicsIDAsIDApCgp0ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJykKdGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsIDgpCnRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgNCkKdGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJcbmFiXHRkZWZcbmdcdGhpJywgdSdhYmNcclxuYWIgIGRlZlxuZyAgIGhpJywgNCkKCmlmIDA6CiAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjIGRlZiBnaGknLCB1J0FiYyBEZWYgR2hpJykKICAgIHRlc3QoJ2NhcHdvcmRzJywgdSdhYmNcdGRlZlxuZ2hpJywgdSdBYmMgRGVmIEdoaScpCiAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjXHQgICBkZWYgIFxuZ2hpJywgdSdBYmMgRGVmIEdoaScpCgojIENvbXBhcmlzb25zOgpwcmludCAnVGVzdGluZyBVbmljb2RlIGNvbXBhcmlzb25zLi4uJywKdmVyaWZ5KHUnYWJjJyA9PSAnYWJjJykKdmVyaWZ5KCdhYmMnID09IHUnYWJjJykKdmVyaWZ5KHUnYWJjJyA9PSB1J2FiYycpCnZlcmlmeSh1J2FiY2QnID4gJ2FiYycpCnZlcmlmeSgnYWJjZCcgPiB1J2FiYycpCnZlcmlmeSh1J2FiY2QnID4gdSdhYmMnKQp2ZXJpZnkodSdhYmMnIDwgJ2FiY2QnKQp2ZXJpZnkoJ2FiYycgPCB1J2FiY2QnKQp2ZXJpZnkodSdhYmMnIDwgdSdhYmNkJykKcHJpbnQgJ2RvbmUuJwoKaWYgMDoKICAgICMgTW92ZSB0aGVzZSB0ZXN0cyB0byBhIFVuaWNvZGUgY29sbGF0aW9uIG1vZHVsZSB0ZXN0Li4uCgogICAgcHJpbnQgJ1Rlc3RpbmcgVVRGLTE2IGNvZGUgcG9pbnQgb3JkZXIgY29tcGFyaXNvbnMuLi4nLAogICAgI05vIHN1cnJvZ2F0ZXMsIG5vIGZpeHVwIHJlcXVpcmVkLgogICAgdmVyaWZ5KHUnXHUwMDYxJyA8IHUnXHUyMGFjJykKICAgICMgTm9uIHN1cnJvZ2F0ZSBiZWxvdyBzdXJyb2dhdGUgdmFsdWUsIG5vIGZpeHVwIHJlcXVpcmVkCiAgICB2ZXJpZnkodSdcdTAwNjEnIDwgdSdcdWQ4MDBcdWRjMDInKQoKICAgICMgTm9uIHN1cnJvZ2F0ZSBhYm92ZSBzdXJyb2dhdGUgdmFsdWUsIGZpeHVwIHJlcXVpcmVkCiAgICBkZWYgdGVzdF9sZWNtcChzLCBzMik6CiAgICAgICAgdmVyaWZ5KHMgPCAgczIgLCAiY29tcGFyaXNvbiBmYWlsZWQgb24gJXMgPCAlcyIgJSAocywgczIpKQoKICAgIGRlZiB0ZXN0X2ZpeHVwKHMpOgogICAgICAgIHMyID0gdSdcdWQ4MDBcdWRjMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkOTAwXHVkYzAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGMwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWRiMDBcdWRjMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkODAwXHVkZDAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZDkwMFx1ZGQwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWRhMDBcdWRkMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkYjAwXHVkZDAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGUwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWQ5MDBcdWRlMDEnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkYTAwXHVkZTAxJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGUwMScKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWQ4MDBcdWRmZmYnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKICAgICAgICBzMiA9IHUnXHVkOTAwXHVkZmZmJwogICAgICAgIHRlc3RfbGVjbXAocywgczIpCiAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGZmZicKICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQogICAgICAgIHMyID0gdSdcdWRiMDBcdWRmZmYnCiAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKCiAgICB0ZXN0X2ZpeHVwKHUnXHVlMDAwJykKICAgIHRlc3RfZml4dXAodSdcdWZmNjEnKQoKICAgICMgU3Vycm9nYXRlcyBvbiBib3RoIHNpZGVzLCBubyBmaXh1cCByZXF1aXJlZAogICAgdmVyaWZ5KHUnXHVkODAwXHVkYzAyJyA8IHUnXHVkODRkXHVkYzU2JykKICAgIHByaW50ICdkb25lLicKCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCAgdSdhYmMgICAgICAgJywgMTApCnRlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICAgICAgYWJjJywgMTApCnRlc3QoJ2NlbnRlcicsIHUnYWJjJywgdScgICBhYmMgICAgJywgMTApCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCAgdSdhYmMgICAnLCA2KQp0ZXN0KCdyanVzdCcsIHUnYWJjJywgIHUnICAgYWJjJywgNikKdGVzdCgnY2VudGVyJywgdSdhYmMnLCB1JyBhYmMgICcsIDYpCnRlc3QoJ2xqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCnRlc3QoJ3JqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCnRlc3QoJ2NlbnRlcicsIHUnYWJjJywgdSdhYmMnLCAyKQoKdGVzdCgnaXNsb3dlcicsIHUnYScsIDEpCnRlc3QoJ2lzbG93ZXInLCB1J0EnLCAwKQp0ZXN0KCdpc2xvd2VyJywgdSdcbicsIDApCnRlc3QoJ2lzbG93ZXInLCB1J1x1MUZGYycsIDApCnRlc3QoJ2lzbG93ZXInLCB1J2FiYycsIDEpCnRlc3QoJ2lzbG93ZXInLCB1J2FCYycsIDApCnRlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgMSkKCnRlc3QoJ2lzdXBwZXInLCB1J2EnLCAwKQp0ZXN0KCdpc3VwcGVyJywgdSdBJywgMSkKdGVzdCgnaXN1cHBlcicsIHUnXG4nLCAwKQppZiBzeXMucGxhdGZvcm1bOjRdICE9ICdqYXZhJzoKICAgIHRlc3QoJ2lzdXBwZXInLCB1J1x1MUZGYycsIDApCnRlc3QoJ2lzdXBwZXInLCB1J0FCQycsIDEpCnRlc3QoJ2lzdXBwZXInLCB1J0FiQycsIDApCnRlc3QoJ2lzdXBwZXInLCB1J0FCQ1xuJywgMSkKCnRlc3QoJ2lzdGl0bGUnLCB1J2EnLCAwKQp0ZXN0KCdpc3RpdGxlJywgdSdBJywgMSkKdGVzdCgnaXN0aXRsZScsIHUnXG4nLCAwKQp0ZXN0KCdpc3RpdGxlJywgdSdcdTFGRmMnLCAxKQp0ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQgTGluZScsIDEpCnRlc3QoJ2lzdGl0bGUnLCB1J0FcblRpdGxlY2FzZWQgTGluZScsIDEpCnRlc3QoJ2lzdGl0bGUnLCB1J0EgVGl0bGVjYXNlZCwgTGluZScsIDEpCnRlc3QoJ2lzdGl0bGUnLCB1J0dyZWVrIFx1MUZGY2l0bGVjYXNlcyAuLi4nLCAxKQp0ZXN0KCdpc3RpdGxlJywgdSdOb3QgYSBjYXBpdGFsaXplZCBTdHJpbmcnLCAwKQp0ZXN0KCdpc3RpdGxlJywgdSdOb3RcdGEgVGl0bGVjYXNlIFN0cmluZycsIDApCnRlc3QoJ2lzdGl0bGUnLCB1J05vdC0tYSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKCnRlc3QoJ2lzYWxwaGEnLCB1J2EnLCAxKQp0ZXN0KCdpc2FscGhhJywgdSdBJywgMSkKdGVzdCgnaXNhbHBoYScsIHUnXG4nLCAwKQp0ZXN0KCdpc2FscGhhJywgdSdcdTFGRmMnLCAxKQp0ZXN0KCdpc2FscGhhJywgdSdhYmMnLCAxKQp0ZXN0KCdpc2FscGhhJywgdSdhQmMxMjMnLCAwKQp0ZXN0KCdpc2FscGhhJywgdSdhYmNcbicsIDApCgp0ZXN0KCdpc2FsbnVtJywgdSdhJywgMSkKdGVzdCgnaXNhbG51bScsIHUnQScsIDEpCnRlc3QoJ2lzYWxudW0nLCB1J1xuJywgMCkKdGVzdCgnaXNhbG51bScsIHUnMTIzYWJjNDU2JywgMSkKdGVzdCgnaXNhbG51bScsIHUnYTFiM2MnLCAxKQp0ZXN0KCdpc2FsbnVtJywgdSdhQmMwMDAgJywgMCkKdGVzdCgnaXNhbG51bScsIHUnYWJjXG4nLCAwKQoKdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcblxyZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXG5cclxuZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdSdnaGknXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpXG4iLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCnRlc3QoJ3NwbGl0bGluZXMnLCB1ImFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJywgdScnXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnJywgdSdhYmMnLCB1J2RlZicsIHUnZ2hpJywgdScnXSkKdGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnXG4nLCB1J2FiY1xuJywgdSdkZWZcclxuJywgdSdnaGlcbicsIHUnXHInXSwgMSkKCnRlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnYmJiYycsIHtvcmQoJ2EnKTpOb25lfSkKdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWljJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWl4Jywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpLCBvcmQoJ2MnKTp1J3gnfSkKCiMgQ29udGFpbnM6CnByaW50ICdUZXN0aW5nIFVuaWNvZGUgY29udGFpbnMgbWV0aG9kLi4uJywKdmVyaWZ5KCgnYScgaW4gdSdhYmRiJykgPT0gMSkKdmVyaWZ5KCgnYScgaW4gdSdiZGFiJykgPT0gMSkKdmVyaWZ5KCgnYScgaW4gdSdiZGFiYScpID09IDEpCnZlcmlmeSgoJ2EnIGluIHUnYmRiYScpID09IDEpCnZlcmlmeSgoJ2EnIGluIHUnYmRiYScpID09IDEpCnZlcmlmeSgodSdhJyBpbiB1J2JkYmEnKSA9PSAxKQp2ZXJpZnkoKHUnYScgaW4gdSdiZGInKSA9PSAwKQp2ZXJpZnkoKHUnYScgaW4gJ2JkYicpID09IDApCnZlcmlmeSgodSdhJyBpbiAnYmRiYScpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoJ2EnLDEsTm9uZSkpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoMSxOb25lLCdhJykpID09IDEpCnZlcmlmeSgodSdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxKQp2ZXJpZnkoKCdhJyBpbiAoJ2EnLDEsTm9uZSkpID09IDEpCnZlcmlmeSgoJ2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMSkKdmVyaWZ5KCgnYScgaW4gKDEsTm9uZSx1J2EnKSkgPT0gMSkKdmVyaWZ5KCgnYScgaW4gKCd4JywxLHUneScpKSA9PSAwKQp2ZXJpZnkoKCdhJyBpbiAoJ3gnLDEsTm9uZSkpID09IDApCnByaW50ICdkb25lLicKCiMgRm9ybWF0dGluZzoKcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBmb3JtYXR0aW5nIHN0cmluZ3MuLi4nLAp2ZXJpZnkodSIlcywgJXMiICUgKHUiYWJjIiwgImFiYyIpID09IHUnYWJjLCBhYmMnKQp2ZXJpZnkodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpID09IHUnYWJjLCBhYmMsIDEsIDIuMDAwMDAwLCAgMy4wMCcpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnKQp2ZXJpZnkodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41NycpCnZlcmlmeSh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JykKdmVyaWZ5KHUiJWMiICUgKHUiYSIsKSA9PSB1J2EnKQp2ZXJpZnkodSIlYyIgJSAoImEiLCkgPT0gdSdhJykKdmVyaWZ5KHUiJWMiICUgKDM0LCkgPT0gdSciJykKdmVyaWZ5KHUiJWMiICUgKDM2LCkgPT0gdSckJykKaWYgc3lzLnBsYXRmb3JtWzo0XSAhPSAnamF2YSc6CiAgICB2YWx1ZSA9IHUiJXIsICVyIiAlICh1ImFiYyIsICJhYmMiKQogICAgaWYgdmFsdWUgIT0gdSJ1J2FiYycsICdhYmMnIjoKICAgICAgICBwcmludCAnKioqIGZvcm1hdHRpbmcgZmFpbGVkIGZvciAiJXMiJyAlICd1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIiknCgp2ZXJpZnkodSIlKHgpcywgJSh5KXMiICUgeyd4Jzp1ImFiYyIsICd5JzoiZGVmIn0gPT0gdSdhYmMsIGRlZicpCnRyeToKICAgIHZhbHVlID0gdSIlKHgpcywgJSjkKXMiICUgeyd4Jzp1ImFiYyIsIHUn5Cc6ImRlZiJ9CmV4Y2VwdCBLZXlFcnJvcjoKICAgIHByaW50ICcqKiogZm9ybWF0dGluZyBmYWlsZWQgZm9yICIlcyInICUgInUnYWJjLCBkZWYnIgplbHNlOgogICAgdmVyaWZ5KHZhbHVlID09IHUnYWJjLCBkZWYnKQoKIyBmb3JtYXR0aW5nIGpvYnMgZGVsZWdhdGVkIGZyb20gdGhlIHN0cmluZyBpbXBsZW1lbnRhdGlvbjoKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzp1ImFiYyJ9ID09IHUnLi4uYWJjLi4uJykKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOiJhYmMifSA9PSAnLi4uYWJjLi4uJykKdmVyaWZ5KCcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIiwnZGVmJzoxMjN9ID09ICB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIix1J2RlZic6MTIzfSA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnLi4uJXMuLi4lcy4uLiVzLi4uJXMuLi4nICUgKDEsMiwzLHUiYWJjIikgPT0gdScuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQp2ZXJpZnkoJy4uLiUlLi4uJSVzLi4uJXMuLi4lcy4uLiVzLi4uJXMuLi4nICUgKDEsMiwzLHUiYWJjIikgPT0gdScuLi4lLi4uJXMuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQp2ZXJpZnkoJy4uLiVzLi4uJyAlIHUiYWJjIiA9PSB1Jy4uLmFiYy4uLicpCnZlcmlmeSgnJSpzJyAlICg1LHUnYWJjJywpID09IHUnICBhYmMnKQp2ZXJpZnkoJyUqcycgJSAoLTUsdSdhYmMnLCkgPT0gdSdhYmMgICcpCnZlcmlmeSgnJSouKnMnICUgKDUsMix1J2FiYycsKSA9PSB1JyAgIGFiJykKdmVyaWZ5KCclKi4qcycgJSAoNSwzLHUnYWJjJywpID09IHUnICBhYmMnKQp2ZXJpZnkoJyVpICUqLipzJyAlICgxMCwgNSwzLHUnYWJjJywpID09IHUnMTAgICBhYmMnKQp2ZXJpZnkoJyVpJXMgJSouKnMnICUgKDEwLCAzLCA1LDMsdSdhYmMnLCkgPT0gdScxMDMgICBhYmMnKQpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBidWlsdGluIHVuaWNvZGUoKS4uLicsCgojIHVuaWNvZGUob2JqKSB0ZXN0cyAodGhpcyBtYXBzIHRvIFB5T2JqZWN0X1VuaWNvZGUoKSBhdCBDIGxldmVsKQoKdmVyaWZ5KHVuaWNvZGUodSd1bmljb2RlIHJlbWFpbnMgdW5pY29kZScpID09IHUndW5pY29kZSByZW1haW5zIHVuaWNvZGUnKQoKY2xhc3MgVW5pY29kZVN1YmNsYXNzKHVuaWNvZGUpOgogICAgcGFzcwoKdmVyaWZ5KHVuaWNvZGUoVW5pY29kZVN1YmNsYXNzKCd1bmljb2RlIHN1YmNsYXNzIGJlY29tZXMgdW5pY29kZScpKQogICAgICAgPT0gdSd1bmljb2RlIHN1YmNsYXNzIGJlY29tZXMgdW5pY29kZScpCgp2ZXJpZnkodW5pY29kZSgnc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHVuaWNvZGUnKQogICAgICAgPT0gdSdzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gdW5pY29kZScpCgpjbGFzcyBVbmljb2RlQ29tcGF0OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgogICAgICAgIHNlbGYueCA9IHgKICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi54Cgp2ZXJpZnkodW5pY29kZShVbmljb2RlQ29tcGF0KCdfX3VuaWNvZGVfXyBjb21wYXRpYmxlIG9iamVjdHMgYXJlIHJlY29nbml6ZWQnKSkKICAgICAgID09IHUnX191bmljb2RlX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykKCmNsYXNzIFN0cmluZ0NvbXBhdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKICAgICAgICBzZWxmLnggPSB4CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi54Cgp2ZXJpZnkodW5pY29kZShTdHJpbmdDb21wYXQoJ19fc3RyX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykpCiAgICAgICA9PSB1J19fc3RyX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykKCiMgdW5pY29kZShvYmopIGlzIGNvbXBhdGlibGUgdG8gc3RyKCk6CgpvID0gU3RyaW5nQ29tcGF0KCd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCnZlcmlmeSh1bmljb2RlKG8pID09IHUndW5pY29kZShvYmopIGlzIGNvbXBhdGlibGUgdG8gc3RyKCknKQp2ZXJpZnkoc3RyKG8pID09ICd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCgpmb3Igb2JqIGluICgxMjMsIDEyMy40NSwgMTIzTCk6CiAgICB2ZXJpZnkodW5pY29kZShvYmopID09IHVuaWNvZGUoc3RyKG9iaikpKQoKIyB1bmljb2RlKG9iaiwgZW5jb2RpbmcsIGVycm9yKSB0ZXN0cyAodGhpcyBtYXBzIHRvCiMgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgYXQgQyBsZXZlbCkKCmlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgdHJ5OgogICAgICAgIHVuaWNvZGUodSdkZWNvZGluZyB1bmljb2RlIGlzIG5vdCBzdXBwb3J0ZWQnLCAndXRmLTgnLCAnc3RyaWN0JykKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiZGVjb2RpbmcgdW5pY29kZSBzaG91bGQgTk9UIGJlIHN1cHBvcnRlZCIKCnZlcmlmeSh1bmljb2RlKCdzdHJpbmdzIGFyZSBkZWNvZGVkIHRvIHVuaWNvZGUnLCAndXRmLTgnLCAnc3RyaWN0JykKICAgICAgID09IHUnc3RyaW5ncyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJykKCmlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgdmVyaWZ5KHVuaWNvZGUoYnVmZmVyKCdjaGFyYWN0ZXIgYnVmZmVycyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJyksCiAgICAgICAgICAgICAgICAgICAndXRmLTgnLCAnc3RyaWN0JykKICAgICAgICAgICA9PSB1J2NoYXJhY3RlciBidWZmZXJzIGFyZSBkZWNvZGVkIHRvIHVuaWNvZGUnKQoKcHJpbnQgJ2RvbmUuJwoKIyBUZXN0IGJ1aWx0aW4gY29kZWNzCnByaW50ICdUZXN0aW5nIGJ1aWx0aW4gY29kZWNzLi4uJywKCiMgVVRGLTcgc3BlY2lmaWMgZW5jb2RpbmcgdGVzdHM6CnV0ZlRlc3RzID0gWyh1J0FcdTIyNjJcdTAzOTEuJywgJ0ErSW1JRGtRLicpLCAgIyBSRkMyMTUyIGV4YW1wbGUKICh1J0hpIE1vbSAtXHUyNjNhLSEnLCAnSGkgTW9tIC0rSmpvLS0hJyksICAgICAjIFJGQzIxNTIgZXhhbXBsZQogKHUnXHU2NUU1XHU2NzJDXHU4QTlFJywgJytaZVZuTElxZS0nKSwgICAgICAgICMgUkZDMjE1MiBleGFtcGxlCiAodSdJdGVtIDMgaXMgXHUwMGEzMS4nLCAnSXRlbSAzIGlzICtBS00tMS4nKSwgIyBSRkMyMTUyIGV4YW1wbGUKICh1JysnLCAnKy0nKSwKICh1JystJywgJystLScpLAogKHUnKz8nLCAnKy0/JyksCiAodSdcPycsICcrQUZ3PycpLAogKHUnKz8nLCAnKy0/JyksCiAodXInXFw/JywgJytBRndBWEE/JyksCiAodXInXFxcPycsICcrQUZ3QVhBQmM/JyksCiAodXInKystLScsICcrLSstLS0nKV0KCmZvciB4LHkgaW4gdXRmVGVzdHM6CiAgICB2ZXJpZnkoIHguZW5jb2RlKCd1dGYtNycpID09IHkgKQoKdHJ5OgogICAgdW5pY29kZSgnKzNBRFlBQS0nLCAndXRmLTcnKSAjIHN1cnJvZ2F0ZXMgbm90IHN1cHBvcnRlZApleGNlcHQgVW5pY29kZUVycm9yOgogICAgcGFzcwplbHNlOgogICAgcmFpc2UgVGVzdEZhaWxlZCwgInVuaWNvZGUoJyszQURZQUEtJywgJ3V0Zi03JykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKCnZlcmlmeSh1bmljb2RlKCcrM0FEWUFBLScsICd1dGYtNycsICdyZXBsYWNlJykgPT0gdSdcdWZmZmQnKQoKIyBVVEYtOCBzcGVjaWZpYyBlbmNvZGluZyB0ZXN0czoKdmVyaWZ5KHUnXHUyMGFjJy5lbmNvZGUoJ3V0Zi04JykgPT0gXAogICAgICAgJycuam9pbigoY2hyKDB4ZTIpLCBjaHIoMHg4MiksIGNocigweGFjKSkpICkKdmVyaWZ5KHUnXHVkODAwXHVkYzAyJy5lbmNvZGUoJ3V0Zi04JykgPT0gXAogICAgICAgJycuam9pbigoY2hyKDB4ZjApLCBjaHIoMHg5MCksIGNocigweDgwKSwgY2hyKDB4ODIpKSkgKQp2ZXJpZnkodSdcdWQ4NGRcdWRjNTYnLmVuY29kZSgndXRmLTgnKSA9PSBcCiAgICAgICAnJy5qb2luKChjaHIoMHhmMCksIGNocigweGEzKSwgY2hyKDB4OTEpLCBjaHIoMHg5NikpKSApCiMgVVRGLTggc3BlY2lmaWMgZGVjb2RpbmcgdGVzdHMKdmVyaWZ5KHVuaWNvZGUoJycuam9pbigoY2hyKDB4ZjApLCBjaHIoMHhhMyksIGNocigweDkxKSwgY2hyKDB4OTYpKSksCiAgICAgICAgICAgICAgICd1dGYtOCcpID09IHUnXFUwMDAyMzQ1NicgKQp2ZXJpZnkodW5pY29kZSgnJy5qb2luKChjaHIoMHhmMCksIGNocigweDkwKSwgY2hyKDB4ODApLCBjaHIoMHg4MikpKSwKICAgICAgICAgICAgICAgJ3V0Zi04JykgPT0gdSdcVTAwMDEwMDAyJyApCnZlcmlmeSh1bmljb2RlKCcnLmpvaW4oKGNocigweGUyKSwgY2hyKDB4ODIpLCBjaHIoMHhhYykpKSwKICAgICAgICAgICAgICAgJ3V0Zi04JykgPT0gdSdcdTIwYWMnICkKCiMgT3RoZXIgcG9zc2libGUgdXRmLTggdGVzdCBjYXNlczoKIyAqIHN0cmljdCBkZWNvZGluZyB0ZXN0aW5nIGZvciBhbGwgb2YgdGhlCiMgICBVVEY4X0VSUk9SIGNhc2VzIGluIFB5VW5pY29kZV9EZWNvZGVVVEY4Cgp2ZXJpZnkodW5pY29kZSgnaGVsbG8nLCdhc2NpaScpID09IHUnaGVsbG8nKQp2ZXJpZnkodW5pY29kZSgnaGVsbG8nLCd1dGYtOCcpID09IHUnaGVsbG8nKQp2ZXJpZnkodW5pY29kZSgnaGVsbG8nLCd1dGY4JykgPT0gdSdoZWxsbycpCnZlcmlmeSh1bmljb2RlKCdoZWxsbycsJ2xhdGluLTEnKSA9PSB1J2hlbGxvJykKCiMgRXJyb3IgaGFuZGxpbmcKdHJ5OgogICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJykKICAgIHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ3N0cmljdCcpCmV4Y2VwdCBWYWx1ZUVycm9yOgogICAgcGFzcwplbHNlOgogICAgcmFpc2UgVGVzdEZhaWxlZCwgInUnQW5kclwyMDInLmVuY29kZSgnYXNjaWknKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgp2ZXJpZnkodSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywnaWdub3JlJykgPT0gIkFuZHIgeCIpCnZlcmlmeSh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdyZXBsYWNlJykgPT0gIkFuZHI/IHgiKQoKdHJ5OgogICAgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJykKICAgIHVuaWNvZGUoJ0FuZHJcMjAyIHgnLCdhc2NpaScsJ3N0cmljdCcpCmV4Y2VwdCBWYWx1ZUVycm9yOgogICAgcGFzcwplbHNlOgogICAgcmFpc2UgVGVzdEZhaWxlZCwgInVuaWNvZGUoJ0FuZHJcMjAyJykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKdmVyaWZ5KHVuaWNvZGUoJ0FuZHJcMjAyIHgnLCdhc2NpaScsJ2lnbm9yZScpID09IHUiQW5kciB4IikKdmVyaWZ5KHVuaWNvZGUoJ0FuZHJcMjAyIHgnLCdhc2NpaScsJ3JlcGxhY2UnKSA9PSB1J0FuZHJcdUZGRkQgeCcpCgp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCdhc2NpaScpID09ICdoZWxsbycpCnZlcmlmeSh1J2hlbGxvJy5lbmNvZGUoJ3V0Zi03JykgPT0gJ2hlbGxvJykKdmVyaWZ5KHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nKQp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCd1dGY4JykgPT0gJ2hlbGxvJykKdmVyaWZ5KHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJykgPT0gJ2hcMDAwZVwwMDBsXDAwMGxcMDAwb1wwMDAnKQp2ZXJpZnkodSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycpCnZlcmlmeSh1J2hlbGxvJy5lbmNvZGUoJ2xhdGluLTEnKSA9PSAnaGVsbG8nKQoKIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBCTVAgKGp1c3QgdGhlIGZpcnN0IDEwMjQgY2hhcnMpCnUgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCmZvciBlbmNvZGluZyBpbiAoJ3V0Zi03JywgJ3V0Zi04JywgJ3V0Zi0xNicsICd1dGYtMTYtbGUnLCAndXRmLTE2LWJlJywKICAgICAgICAgICAgICAgICAncmF3X3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfaW50ZXJuYWwnKToKICAgIHZlcmlmeSh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdSkKCiMgUm91bmR0cmlwIHNhZmV0eSBmb3Igbm9uLUJNUCAoanVzdCBhIGZldyBjaGFycykKdSA9IHUnXFUwMDAxMDAwMVxVMDAwMjAwMDJcVTAwMDMwMDAzXFUwMDA0MDAwNFxVMDAwNTAwMDUnCmZvciBlbmNvZGluZyBpbiAoJ3V0Zi04JywKICAgICAgICAgICAgICAgICAndXRmLTE2JywgJ3V0Zi0xNi1sZScsICd1dGYtMTYtYmUnLAogICAgICAgICAgICAgICAgICMncmF3X3VuaWNvZGVfZXNjYXBlJywKICAgICAgICAgICAgICAgICAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgogICAgdmVyaWZ5KHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1KQoKdSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDI1NikpKQpmb3IgZW5jb2RpbmcgaW4gKAogICAgJ2xhdGluLTEnLAogICAgKToKICAgIHRyeToKICAgICAgICB2ZXJpZnkodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUpCiAgICBleGNlcHQgVGVzdEZhaWxlZDoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgp1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMTI4KSkpCmZvciBlbmNvZGluZyBpbiAoCiAgICAnYXNjaWknLAogICAgKToKICAgIHRyeToKICAgICAgICB2ZXJpZnkodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUpCiAgICBleGNlcHQgVGVzdEZhaWxlZDoKICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCgpwcmludCAnZG9uZS4nCgpwcmludCAnVGVzdGluZyBzdGFuZGFyZCBtYXBwaW5nIGNvZGVjcy4uLicsCgpwcmludCAnMC0xMjcuLi4nLApzID0gJycuam9pbihtYXAoY2hyLCByYW5nZSgxMjgpKSkKZm9yIGVuY29kaW5nIGluICgKICAgICdjcDAzNycsICdjcDEwMjYnLAogICAgJ2NwNDM3JywgJ2NwNTAwJywgJ2NwNzM3JywgJ2NwNzc1JywgJ2NwODUwJywKICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCiAgICAnY3A4NjMnLCAnY3A4NjUnLCAnY3A4NjYnLAogICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAogICAgJ2lzbzg4NTlfMicsICdpc284ODU5XzMnLCAnaXNvODg1OV80JywgJ2lzbzg4NTlfNScsICdpc284ODU5XzYnLAogICAgJ2lzbzg4NTlfNycsICdpc284ODU5XzknLCAna29pOF9yJywgJ2xhdGluXzEnLAogICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKCiAgICAnY3AxMjUwJywgJ2NwMTI1MScsICdjcDEyNTInLCAnY3AxMjUzJywgJ2NwMTI1NCcsICdjcDEyNTUnLAogICAgJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKICAgICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCgogICAgJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCiAgICAnY3AxMDA2JywgJ2lzbzg4NTlfOCcsCgogICAgIyMjIFRoZXNlIGhhdmUgdW5kZWZpbmVkIG1hcHBpbmdzOgogICAgIydjcDQyNCcsCgogICAgIyMjIFRoZXNlIGZhaWwgdGhlIHJvdW5kLXRyaXA6CiAgICAjJ2NwODc1JwoKICAgICk6CiAgICB0cnk6CiAgICAgICAgdmVyaWZ5KHVuaWNvZGUocyxlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSA9PSBzKQogICAgZXhjZXB0IFRlc3RGYWlsZWQ6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCiAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQoKcHJpbnQgJzEyOC0yNTUuLi4nLApzID0gJycuam9pbihtYXAoY2hyLCByYW5nZSgxMjgsMjU2KSkpCmZvciBlbmNvZGluZyBpbiAoCiAgICAnY3AwMzcnLCAnY3AxMDI2JywKICAgICdjcDQzNycsICdjcDUwMCcsICdjcDczNycsICdjcDc3NScsICdjcDg1MCcsCiAgICAnY3A4NTInLCAnY3A4NTUnLCAnY3A4NjAnLCAnY3A4NjEnLCAnY3A4NjInLAogICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywKICAgICdpc284ODU5XzEwJywgJ2lzbzg4NTlfMTMnLCAnaXNvODg1OV8xNCcsICdpc284ODU5XzE1JywKICAgICdpc284ODU5XzInLCAnaXNvODg1OV80JywgJ2lzbzg4NTlfNScsCiAgICAnaXNvODg1OV85JywgJ2tvaThfcicsICdsYXRpbl8xJywKICAgICdtYWNfY3lyaWxsaWMnLCAnbWFjX2xhdGluMicsCgogICAgIyMjIFRoZXNlIGhhdmUgdW5kZWZpbmVkIG1hcHBpbmdzOgogICAgIydjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCiAgICAjJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKICAgICMnY3A0MjQnLCAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAogICAgIydpc284ODU5XzMnLCAnaXNvODg1OV82JywgJ2lzbzg4NTlfNycsCiAgICAjJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCgogICAgIyMjIFRoZXNlIGZhaWwgdGhlIHJvdW5kLXRyaXA6CiAgICAjJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAoKICAgICk6CiAgICB0cnk6CiAgICAgICAgdmVyaWZ5KHVuaWNvZGUocyxlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSA9PSBzKQogICAgZXhjZXB0IFRlc3RGYWlsZWQ6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCiAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6CiAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQoKcHJpbnQgJ2RvbmUuJwoKcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4uLicsCnZlcmlmeSgodSJhYmMiIHUiZGVmIikgPT0gdSJhYmNkZWYiKQp2ZXJpZnkoKCJhYmMiIHUiZGVmIikgPT0gdSJhYmNkZWYiKQp2ZXJpZnkoKHUiYWJjIiAiZGVmIikgPT0gdSJhYmNkZWYiKQp2ZXJpZnkoKHUiYWJjIiB1ImRlZiIgImdoaSIpID09IHUiYWJjZGVmZ2hpIikKdmVyaWZ5KCgiYWJjIiAiZGVmIiB1ImdoaSIpID09IHUiYWJjZGVmZ2hpIikKcHJpbnQgJ2RvbmUuJwoKcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBwcmludGluZy4uLicsCnByaW50IHUnYWJjJwpwcmludCB1J2FiYycsIHUnZGVmJwpwcmludCB1J2FiYycsICdkZWYnCnByaW50ICdhYmMnLCB1J2RlZicKcHJpbnQgdSdhYmNcbicKcHJpbnQgdSdhYmNcbicsCnByaW50IHUnYWJjXG4nLApwcmludCB1J2RlZlxuJwpwcmludCB1J2RlZlxuJwpwcmludCAnZG9uZS4nCg==