UserColor
5.0.4
tuxwerk OHG
https://github.com/tuxwerk/OTRS-UserColor
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Colors for agents in backend views.
Benutzerfarben für Agenten im Backend.
5.0.x
2019-09-26 12:47:00
yourhost.example.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CgogIDxDb25maWdJdGVtIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjVXNlckNvbG9yIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgY29uZmlnIHBhcmFtZXRlcnMgb2YgdGhpcyBpdGVtLCB0byBiZSBzaG93biBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICA8U2V0dGluZz4KICAgICAgPEhhc2g+CiAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICA8SXRlbSBLZXk9IkNvbHVtbiI+T3RoZXIgU2V0dGluZ3M8L0l0ZW0+CiAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5Vc2VyIENvbG9yPC9JdGVtPgogICAgICAgIDxJdGVtIEtleT0iS2V5IiBUcmFuc2xhdGFibGU9IjEiPlVzZXIgQ29sb3I8L0l0ZW0+CiAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+SW5wdXQ8L0l0ZW0+CiAgICAgICAgPEl0ZW0gS2V5PSJEYXRhIj5bJSBFbnYoIlVzZXJDb2xvciIpICVdPC9JdGVtPgogICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+VXNlckNvbG9yPC9JdGVtPgogICAgICAgIDxJdGVtIEtleT0iUHJpbyI+NzAwMDwvSXRlbT4KICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgPC9IYXNoPgogICAgPC9TZXR0aW5nPgogIDwvQ29uZmlnSXRlbT4KICAKICA8Q29uZmlnSXRlbSBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzI1MC1Vc2VyQ29sb3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5CZW51dHplcmZhcmJlbiBmw7xyIFRpY2tldCBRdWV1ZXM8L0Rlc2NyaXB0aW9uPgogICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICA8U3ViR3JvdXA+Q29yZTo6V2ViPC9TdWJHcm91cD4KICAgIDxTZXR0aW5nPgogICAgICA8QXJyYXk+Cgk8SXRlbT50aGlyZHBhcnR5L2NvbG9yd2hlZWwvcmFwaGFlbC5qczwvSXRlbT4KCTxJdGVtPnRoaXJkcGFydHkvY29sb3J3aGVlbC9jb2xvcndoZWVsLmpzPC9JdGVtPgoJPEl0ZW0+VFguVXNlckNvbG9yLmpzPC9JdGVtPgogICAgICA8L0FycmF5PgogICAgPC9TZXR0aW5nPgogIDwvQ29uZmlnSXRlbT4KICAKICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjVXNlckNvbG9yQ3NzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgPEdyb3VwPlVzZXJDb2xvckNzczwvR3JvdXA+CiAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgPFNldHRpbmc+CiAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KCTxEZXNjcmlwdGlvbj5Vc2VyQ29sb3JDc3M8L0Rlc2NyaXB0aW9uPgoJPFRpdGxlPlVzZXJDb2xvckNzczwvVGl0bGU+CiAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICA8L1NldHRpbmc+CiAgPC9Db25maWdJdGVtPgoKPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL1VzZXJDb2xvckNzcy5wbSAtIGNyZWF0ZXMgdGhlIGNzcwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IHR1eHdlcmsgLSBodHRwOi8vd3d3LnR1eHdlcmsuZGUKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpVc2VyQ29sb3JDc3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE3ICQpIFsxXTsKCnN1YiBuZXcgewogIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogIG15ICRTZWxmID0geyVQYXJhbX07CiAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICBteSAkT3V0cHV0ID0gPDwiRU9UIjsKQ29udGVudC1UeXBlOiB0ZXh0L2NzczsgY2hhcnNldD11dGYtODsKCkVPVAoKICBteSAldXNlcnMgPSAkVXNlck9iamVjdC0+VXNlckxpc3QoVmFsaWQgPT4gMSk7CiAgZm9yIChrZXlzICV1c2VycykgewogICAgbXkgJGxvZ2luID0gJHVzZXJzeyRffTsKICAgIG15ICVwcmVmcyA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YShVc2VySUQgPT4gJF8pOwogICAgbXkgJGVtYWlsID0gJHByZWZzeyJVc2VyRW1haWwifTsKICAgIG15ICRjb2xvciA9ICRwcmVmc3siVXNlckNvbG9yIn07CiAgICAjIG1hdGNoIHRoZSB0aHJlZSBoZXggdmFsdWVzIG9mICMxYWI0MjMKICAgICMgYmxhY2sgaXMgc2F2ZWQgYXMgIzAwMCwgdGhpcyBtdXN0IGFsc28gYmUgYWNjb3VudGVkIGZvcgogICAgbmV4dCB1bmxlc3MgKCRjb2xvciAmJiAkY29sb3IgPX4gL14jKC4uPykoLi4/KSguLj8pJC8pOwogICAgbXkgJGludGVuc2l0eSA9IChoZXgoJDEpK2hleCgkMikraGV4KCQzKSkvKDMqMjU1LjApOwogICAgbXkgJGZvcmVncm91bmRjb2xvciA9ICgkaW50ZW5zaXR5IDwgMC41KSA/ICcjZmZmJyA6ICcjMDAwJzsKICAgICRPdXRwdXQgLj0gPDwiRU9UIjsKW3RpdGxlfj0iKCRsb2dpbikiXSwgW3RpdGxlPSIkZW1haWwiXSB7CmJhY2tncm91bmQtY29sb3I6ICRjb2xvciAhaW1wb3J0YW50Owpjb2xvcjogJGZvcmVncm91bmRjb2xvciAhaW1wb3J0YW50OwpkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9Ci5EYXNoYm9hcmRVc2VyT25saW5lIFt0aXRsZT0iJGVtYWlsIl0gPiBzcGFuIHsKYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yICFpbXBvcnRhbnQ7CmNvbG9yOiAkZm9yZWdyb3VuZGNvbG9yICFpbXBvcnRhbnQ7CndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Cn0KRU9UCiAgfQogIHJldHVybiAkT3V0cHV0Owp9CjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE5IE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgoKICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPgogICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhpc3Rvcnkgb2YgJXMlcyVzIiwgQ29uZmlnKCdUaWNrZXQ6Okhvb2snKSwgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyksIERhdGEuVGlja2V0TnVtYmVyKSB8IGh0bWwgJV0gJm1kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICAgICAgPHA+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIj5bJSBUcmFuc2xhdGUoIkNsb3NlIGRpYWxvZyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICA8L3A+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSGlzdG9yeSBDb250ZW50IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJBY3Rpb24iKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJab29tIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlVzZXIiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRldGltZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5IaXN0b3J5VHlwZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IHRydW5jYXRlKDEwMCkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0xpbmtab29tIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtClslIFJlbmRlckJsb2NrRW5kKCJOb0xpbmtab29tIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2hvd0xpbmtab29tIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTGlua1pvb21WaWV3IEFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZSgiWm9vbSB2aWV3IikgfCBodG1sICVdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2hvd0xpbmtab29tIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuVXNlckVtYWlsIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93IikgJV0KCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnYS5MaW5rWm9vbVZpZXcnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5FeGVjdXRlSW5QYXJlbnRXaW5kb3coZnVuY3Rpb24oV2luZG93T2JqZWN0KSB7CiAgICAgICAgICAgIFdpbmRvd09iamVjdC5Db3JlLlVJLlBvcHVwLkZpcmVQb3B1cEV2ZW50KCdVUkwnLCB7IFVSTDogJCh0aGF0KS5hdHRyKCdocmVmJyl9KTsKICAgICAgICB9KTsKICAgICAgICBDb3JlLlVJLlBvcHVwLkNsb3NlUG9wdXAoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K
LyohCiAqIFJhcGhhZWwgMS4zLjIgLSBKYXZhU2NyaXB0IFZlY3RvciBMaWJyYXJ5CiAqCiAqIENvcHlyaWdodCAoYykgMjAwOSBEbWl0cnkgQmFyYW5vdnNraXkgKGh0dHA6Ly9yYXBoYWVsanMuY29tKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkgbGljZW5zZS4KICovCiAKUmFwaGFlbCA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2VwYXJhdG9yID0gL1ssIF0rLywKICAgICAgICBlbGVtZW50cyA9IC9eKGNpcmNsZXxyZWN0fHBhdGh8ZWxsaXBzZXx0ZXh0fGltYWdlKSQvLAogICAgICAgIHByb3RvID0gInByb3RvdHlwZSIsCiAgICAgICAgaGFzID0gImhhc093blByb3BlcnR5IiwKICAgICAgICBkb2MgPSBkb2N1bWVudCwKICAgICAgICB3aW4gPSB3aW5kb3csCiAgICAgICAgb2xkUmFwaGFlbCA9IHsKICAgICAgICAgICAgd2FzOiBPYmplY3RbcHJvdG9dW2hhc10uY2FsbCh3aW4sICJSYXBoYWVsIiksCiAgICAgICAgICAgIGlzOiB3aW4uUmFwaGFlbAogICAgICAgIH0sCiAgICAgICAgUiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKFIuaXMoYXJndW1lbnRzWzBdLCAiYXJyYXkiKSkgewogICAgICAgICAgICAgICAgdmFyIGEgPSBhcmd1bWVudHNbMF0sCiAgICAgICAgICAgICAgICAgICAgY252ID0gY3JlYXRlW2FwcGx5XShSLCBhLnNwbGljZSgwLCAzICsgUi5pcyhhWzBdLCBudSkpKSwKICAgICAgICAgICAgICAgICAgICByZXMgPSBjbnYuc2V0KCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBhW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBhW2ldIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnRlc3Qoai50eXBlKSAmJiByZXNbcHVzaF0oY252W2oudHlwZV0oKS5hdHRyKGopKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVthcHBseV0oUiwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIFBhcGVyID0gZnVuY3Rpb24gKCkge30sCiAgICAgICAgYXBwZW5kQ2hpbGQgPSAiYXBwZW5kQ2hpbGQiLAogICAgICAgIGFwcGx5ID0gImFwcGx5IiwKICAgICAgICBjb25jYXQgPSAiY29uY2F0IiwKICAgICAgICBFID0gIiIsCiAgICAgICAgUyA9ICIgIiwKICAgICAgICBzcGxpdCA9ICJzcGxpdCIsCiAgICAgICAgZXZlbnRzID0gImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZW1vdmUgbW91c2VvdXQgbW91c2VvdmVyIG1vdXNldXAiW3NwbGl0XShTKSwKICAgICAgICBqb2luID0gImpvaW4iLAogICAgICAgIGxlbmd0aCA9ICJsZW5ndGgiLAogICAgICAgIGxvd2VyQ2FzZSA9IFN0cmluZ1twcm90b10udG9Mb3dlckNhc2UsCiAgICAgICAgbWF0aCA9IE1hdGgsCiAgICAgICAgbW1heCA9IG1hdGgubWF4LAogICAgICAgIG1taW4gPSBtYXRoLm1pbiwKICAgICAgICBudSA9ICJudW1iZXIiLAogICAgICAgIHRvU3RyaW5nID0gInRvU3RyaW5nIiwKICAgICAgICBvYmplY3RUb1N0cmluZyA9IE9iamVjdFtwcm90b11bdG9TdHJpbmddLAogICAgICAgIHBhcGVyID0ge30sCiAgICAgICAgcG93ID0gbWF0aC5wb3csCiAgICAgICAgcHVzaCA9ICJwdXNoIiwKICAgICAgICByZyA9IC9eKD89W1xkYS1mXSQpLywKICAgICAgICBJU1VSTCA9IC9edXJsXChbJyJdPyhbXlwpXSs/KVsnIl0/XCkkL2ksCiAgICAgICAgY29sb3VyUmVnRXhwID0gL15ccyooKCNbYS1mXGRdezZ9KXwoI1thLWZcZF17M30pfHJnYlwoXHMqKFtcZFwuXStccyosXHMqW1xkXC5dK1xzKixccypbXGRcLl0rKVxzKlwpfHJnYlwoXHMqKFtcZFwuXSslXHMqLFxzKltcZFwuXSslXHMqLFxzKltcZFwuXSslKVxzKlwpfGhzW2JsXVwoXHMqKFtcZFwuXStccyosXHMqW1xkXC5dK1xzKixccypbXGRcLl0rKVxzKlwpfGhzW2JsXVwoXHMqKFtcZFwuXSslXHMqLFxzKltcZFwuXSslXHMqLFxzKltcZFwuXSslKVxzKlwpKVxzKiQvaSwKICAgICAgICByb3VuZCA9IG1hdGgucm91bmQsCiAgICAgICAgc2V0QXR0cmlidXRlID0gInNldEF0dHJpYnV0ZSIsCiAgICAgICAgdG9GbG9hdCA9IHBhcnNlRmxvYXQsCiAgICAgICAgdG9JbnQgPSBwYXJzZUludCwKICAgICAgICB1cHBlckNhc2UgPSBTdHJpbmdbcHJvdG9dLnRvVXBwZXJDYXNlLAogICAgICAgIGF2YWlsYWJsZUF0dHJzID0ge2JsdXI6IDAsICJjbGlwLXJlY3QiOiAiMCAwIDFlOSAxZTkiLCBjdXJzb3I6ICJkZWZhdWx0IiwgY3g6IDAsIGN5OiAwLCBmaWxsOiAiI2ZmZiIsICJmaWxsLW9wYWNpdHkiOiAxLCBmb250OiAnMTBweCAiQXJpYWwiJywgImZvbnQtZmFtaWx5IjogJyJBcmlhbCInLCAiZm9udC1zaXplIjogIjEwIiwgImZvbnQtc3R5bGUiOiAibm9ybWFsIiwgImZvbnQtd2VpZ2h0IjogNDAwLCBncmFkaWVudDogMCwgaGVpZ2h0OiAwLCBocmVmOiAiaHR0cDovL3JhcGhhZWxqcy5jb20vIiwgb3BhY2l0eTogMSwgcGF0aDogIk0wLDAiLCByOiAwLCByb3RhdGlvbjogMCwgcng6IDAsIHJ5OiAwLCBzY2FsZTogIjEgMSIsIHNyYzogIiIsIHN0cm9rZTogIiMwMDAiLCAic3Ryb2tlLWRhc2hhcnJheSI6ICIiLCAic3Ryb2tlLWxpbmVjYXAiOiAiYnV0dCIsICJzdHJva2UtbGluZWpvaW4iOiAiYnV0dCIsICJzdHJva2UtbWl0ZXJsaW1pdCI6IDAsICJzdHJva2Utb3BhY2l0eSI6IDEsICJzdHJva2Utd2lkdGgiOiAxLCB0YXJnZXQ6ICJfYmxhbmsiLCAidGV4dC1hbmNob3IiOiAibWlkZGxlIiwgdGl0bGU6ICJSYXBoYWVsIiwgdHJhbnNsYXRpb246ICIwIDAiLCB3aWR0aDogMCwgeDogMCwgeTogMH0sCiAgICAgICAgYXZhaWxhYmxlQW5pbUF0dHJzID0ge2Fsb25nOiAiYWxvbmciLCBibHVyOiBudSwgImNsaXAtcmVjdCI6ICJjc3YiLCBjeDogbnUsIGN5OiBudSwgZmlsbDogImNvbG91ciIsICJmaWxsLW9wYWNpdHkiOiBudSwgImZvbnQtc2l6ZSI6IG51LCBoZWlnaHQ6IG51LCBvcGFjaXR5OiBudSwgcGF0aDogInBhdGgiLCByOiBudSwgcm90YXRpb246ICJjc3YiLCByeDogbnUsIHJ5OiBudSwgc2NhbGU6ICJjc3YiLCBzdHJva2U6ICJjb2xvdXIiLCAic3Ryb2tlLW9wYWNpdHkiOiBudSwgInN0cm9rZS13aWR0aCI6IG51LCB0cmFuc2xhdGlvbjogImNzdiIsIHdpZHRoOiBudSwgeDogbnUsIHk6IG51fSwKICAgICAgICBycCA9ICJyZXBsYWNlIjsKICAgIFIudmVyc2lvbiA9ICIxLjMuMiI7CiAgICBSLnR5cGUgPSAod2luLlNWR0FuZ2xlIHx8IGRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwgIjEuMSIpID8gIlNWRyIgOiAiVk1MIik7CiAgICBpZiAoUi50eXBlID09ICJWTUwiKSB7CiAgICAgICAgdmFyIGQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgZC5pbm5lckhUTUwgPSAnPCEtLVtpZiB2bWxdPjxicj48YnI+PCFbZW5kaWZdLS0+JzsKICAgICAgICBpZiAoZC5jaGlsZE5vZGVzW2xlbmd0aF0gIT0gMikgewogICAgICAgICAgICByZXR1cm4gUi50eXBlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZCA9IG51bGw7CiAgICB9CiAgICBSLnN2ZyA9ICEoUi52bWwgPSBSLnR5cGUgPT0gIlZNTCIpOwogICAgUGFwZXJbcHJvdG9dID0gUltwcm90b107CiAgICBSLl9pZCA9IDA7CiAgICBSLl9vaWQgPSAwOwogICAgUi5mbiA9IHt9OwogICAgUi5pcyA9IGZ1bmN0aW9uIChvLCB0eXBlKSB7CiAgICAgICAgdHlwZSA9IGxvd2VyQ2FzZS5jYWxsKHR5cGUpOwogICAgICAgIHJldHVybiAoKHR5cGUgPT0gIm9iamVjdCIgfHwgdHlwZSA9PSAidW5kZWZpbmVkIikgJiYgdHlwZW9mIG8gPT0gdHlwZSkgfHwgKG8gPT0gbnVsbCAmJiB0eXBlID09ICJudWxsIikgfHwgbG93ZXJDYXNlLmNhbGwob2JqZWN0VG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSkpID09IHR5cGU7CiAgICB9OwogICAgUi5zZXRXaW5kb3cgPSBmdW5jdGlvbiAobmV3d2luKSB7CiAgICAgICAgd2luID0gbmV3d2luOwogICAgICAgIGRvYyA9IHdpbi5kb2N1bWVudDsKICAgIH07CiAgICAvLyBjb2xvdXIgdXRpbGl0aWVzCiAgICB2YXIgdG9IZXggPSBmdW5jdGlvbiAoY29sb3IpIHsKICAgICAgICBpZiAoUi52bWwpIHsKICAgICAgICAgICAgLy8gaHR0cDovL2RlYW4uZWR3YXJkcy5uYW1lL3dlYmxvZy8yMDA5LzEwL2NvbnZlcnQtYW55LWNvbG91ci12YWx1ZS10by1oZXgtaW4tbXNpZS8KICAgICAgICAgICAgdmFyIHRyaW0gPSAvXlxzK3xccyskL2c7CiAgICAgICAgICAgIHRvSGV4ID0gY2FjaGVyKGZ1bmN0aW9uIChjb2xvcikgewogICAgICAgICAgICAgICAgdmFyIGJvZDsKICAgICAgICAgICAgICAgIGNvbG9yID0gKGNvbG9yICsgRSlbcnBdKHRyaW0sIEUpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW0gPSBuZXcgd2luLkFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIik7CiAgICAgICAgICAgICAgICAgICAgZG9jdW0ud3JpdGUoIjxib2R5PiIpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgYm9kID0gZG9jdW0uYm9keTsKICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgICAgICAgICAgIGJvZCA9IHdpbi5jcmVhdGVQb3B1cCgpLmRvY3VtZW50LmJvZHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBib2QuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGJvZC5zdHlsZS5jb2xvciA9IGNvbG9yOwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCJGb3JlQ29sb3IiKTsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgodmFsdWUgJiAyNTUpIDw8IDE2KSB8ICh2YWx1ZSAmIDY1MjgwKSB8ICgodmFsdWUgJiAxNjcxMTY4MCkgPj4+IDE2KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMiICsgKCIwMDAwMDAiICsgdmFsdWVbdG9TdHJpbmddKDE2KSkuc2xpY2UoLTYpOwogICAgICAgICAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJub25lIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGkgPSBkb2MuY3JlYXRlRWxlbWVudCgiaSIpOwogICAgICAgICAgICBpLnRpdGxlID0gIlJhcGhhXHhlYmwgQ29sb3VyIFBpY2tlciI7CiAgICAgICAgICAgIGkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgZG9jLmJvZHlbYXBwZW5kQ2hpbGRdKGkpOwogICAgICAgICAgICB0b0hleCA9IGNhY2hlcihmdW5jdGlvbiAoY29sb3IpIHsKICAgICAgICAgICAgICAgIGkuc3R5bGUuY29sb3IgPSBjb2xvcjsKICAgICAgICAgICAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShpLCBFKS5nZXRQcm9wZXJ0eVZhbHVlKCJjb2xvciIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvSGV4KGNvbG9yKTsKICAgIH07CiAgICB2YXIgaHNidG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuICJoc2IoIiArIFt0aGlzLmgsIHRoaXMucywgdGhpcy5iXSArICIpIjsKICAgIH0sCiAgICByZ2J0b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy5oZXg7CiAgICB9OwogICAgUi5oc2IycmdiID0gY2FjaGVyKGZ1bmN0aW9uIChodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpIHsKICAgICAgICBpZiAoUi5pcyhodWUsICJvYmplY3QiKSAmJiAiaCIgaW4gaHVlICYmICJzIiBpbiBodWUgJiYgImIiIGluIGh1ZSkgewogICAgICAgICAgICBicmlnaHRuZXNzID0gaHVlLmI7CiAgICAgICAgICAgIHNhdHVyYXRpb24gPSBodWUuczsKICAgICAgICAgICAgaHVlID0gaHVlLmg7CiAgICAgICAgfQogICAgICAgIHZhciByZWQsCiAgICAgICAgICAgIGdyZWVuLAogICAgICAgICAgICBibHVlOwogICAgICAgIGlmIChicmlnaHRuZXNzID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHtyOiAwLCBnOiAwLCBiOiAwLCBoZXg6ICIjMDAwIn07CiAgICAgICAgfQogICAgICAgIGlmIChodWUgPiAxIHx8IHNhdHVyYXRpb24gPiAxIHx8IGJyaWdodG5lc3MgPiAxKSB7CiAgICAgICAgICAgIGh1ZSAvPSAyNTU7CiAgICAgICAgICAgIHNhdHVyYXRpb24gLz0gMjU1OwogICAgICAgICAgICBicmlnaHRuZXNzIC89IDI1NTsKICAgICAgICB9CiAgICAgICAgdmFyIGkgPSB+fihodWUgKiA2KSwKICAgICAgICAgICAgZiA9IChodWUgKiA2KSAtIGksCiAgICAgICAgICAgIHAgPSBicmlnaHRuZXNzICogKDEgLSBzYXR1cmF0aW9uKSwKICAgICAgICAgICAgcSA9IGJyaWdodG5lc3MgKiAoMSAtIChzYXR1cmF0aW9uICogZikpLAogICAgICAgICAgICB0ID0gYnJpZ2h0bmVzcyAqICgxIC0gKHNhdHVyYXRpb24gKiAoMSAtIGYpKSk7CiAgICAgICAgcmVkID0gW2JyaWdodG5lc3MsIHEsIHAsIHAsIHQsIGJyaWdodG5lc3MsIGJyaWdodG5lc3NdW2ldOwogICAgICAgIGdyZWVuID0gW3QsIGJyaWdodG5lc3MsIGJyaWdodG5lc3MsIHEsIHAsIHAsIHRdW2ldOwogICAgICAgIGJsdWUgPSBbcCwgcCwgdCwgYnJpZ2h0bmVzcywgYnJpZ2h0bmVzcywgcSwgcF1baV07CiAgICAgICAgcmVkICo9IDI1NTsKICAgICAgICBncmVlbiAqPSAyNTU7CiAgICAgICAgYmx1ZSAqPSAyNTU7CiAgICAgICAgdmFyIHJnYiA9IHtyOiByZWQsIGc6IGdyZWVuLCBiOiBibHVlLCB0b1N0cmluZzogcmdidG9TdHJpbmd9LAogICAgICAgICAgICByID0gKH5+cmVkKVt0b1N0cmluZ10oMTYpLAogICAgICAgICAgICBnID0gKH5+Z3JlZW4pW3RvU3RyaW5nXSgxNiksCiAgICAgICAgICAgIGIgPSAofn5ibHVlKVt0b1N0cmluZ10oMTYpOwogICAgICAgIHIgPSByW3JwXShyZywgIjAiKTsKICAgICAgICBnID0gZ1tycF0ocmcsICIwIik7CiAgICAgICAgYiA9IGJbcnBdKHJnLCAiMCIpOwogICAgICAgIHJnYi5oZXggPSAiIyIgKyByICsgZyArIGI7CiAgICAgICAgcmV0dXJuIHJnYjsKICAgIH0sIFIpOwogICAgUi5yZ2IyaHNiID0gY2FjaGVyKGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7CiAgICAgICAgaWYgKFIuaXMocmVkLCAib2JqZWN0IikgJiYgInIiIGluIHJlZCAmJiAiZyIgaW4gcmVkICYmICJiIiBpbiByZWQpIHsKICAgICAgICAgICAgYmx1ZSA9IHJlZC5iOwogICAgICAgICAgICBncmVlbiA9IHJlZC5nOwogICAgICAgICAgICByZWQgPSByZWQucjsKICAgICAgICB9CiAgICAgICAgaWYgKFIuaXMocmVkLCAic3RyaW5nIikpIHsKICAgICAgICAgICAgdmFyIGNsciA9IFIuZ2V0UkdCKHJlZCk7CiAgICAgICAgICAgIHJlZCA9IGNsci5yOwogICAgICAgICAgICBncmVlbiA9IGNsci5nOwogICAgICAgICAgICBibHVlID0gY2xyLmI7CiAgICAgICAgfQogICAgICAgIGlmIChyZWQgPiAxIHx8IGdyZWVuID4gMSB8fCBibHVlID4gMSkgewogICAgICAgICAgICByZWQgLz0gMjU1OwogICAgICAgICAgICBncmVlbiAvPSAyNTU7CiAgICAgICAgICAgIGJsdWUgLz0gMjU1OwogICAgICAgIH0KICAgICAgICB2YXIgbWF4ID0gbW1heChyZWQsIGdyZWVuLCBibHVlKSwKICAgICAgICAgICAgbWluID0gbW1pbihyZWQsIGdyZWVuLCBibHVlKSwKICAgICAgICAgICAgaHVlLAogICAgICAgICAgICBzYXR1cmF0aW9uLAogICAgICAgICAgICBicmlnaHRuZXNzID0gbWF4OwogICAgICAgIGlmIChtaW4gPT0gbWF4KSB7CiAgICAgICAgICAgIHJldHVybiB7aDogMCwgczogMCwgYjogbWF4fTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgZGVsdGEgPSAobWF4IC0gbWluKTsKICAgICAgICAgICAgc2F0dXJhdGlvbiA9IGRlbHRhIC8gbWF4OwogICAgICAgICAgICBpZiAocmVkID09IG1heCkgewogICAgICAgICAgICAgICAgaHVlID0gKGdyZWVuIC0gYmx1ZSkgLyBkZWx0YTsKICAgICAgICAgICAgfSBlbHNlIGlmIChncmVlbiA9PSBtYXgpIHsKICAgICAgICAgICAgICAgIGh1ZSA9IDIgKyAoKGJsdWUgLSByZWQpIC8gZGVsdGEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaHVlID0gNCArICgocmVkIC0gZ3JlZW4pIC8gZGVsdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh1ZSAvPSA2OwogICAgICAgICAgICBodWUgPCAwICYmIGh1ZSsrOwogICAgICAgICAgICBodWUgPiAxICYmIGh1ZS0tOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge2g6IGh1ZSwgczogc2F0dXJhdGlvbiwgYjogYnJpZ2h0bmVzcywgdG9TdHJpbmc6IGhzYnRvU3RyaW5nfTsKICAgIH0sIFIpOwogICAgdmFyIHAycyA9IC8sPyhbYWNobG1xcnN0dnh6XSksPy9naTsKICAgIFIuX3BhdGgyc3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLmpvaW4oIiwiKVtycF0ocDJzLCAiJDEiKTsKICAgIH07CiAgICBmdW5jdGlvbiBjYWNoZXIoZiwgc2NvcGUsIHBvc3Rwcm9jZXNzb3IpIHsKICAgICAgICBmdW5jdGlvbiBuZXdmKCkgewogICAgICAgICAgICB2YXIgYXJnID0gQXJyYXlbcHJvdG9dLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSwKICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdbam9pbl0oIlx1MjViYSIpLAogICAgICAgICAgICAgICAgY2FjaGUgPSBuZXdmLmNhY2hlID0gbmV3Zi5jYWNoZSB8fCB7fSwKICAgICAgICAgICAgICAgIGNvdW50ID0gbmV3Zi5jb3VudCA9IG5ld2YuY291bnQgfHwgW107CiAgICAgICAgICAgIGlmIChjYWNoZVtoYXNdKGFyZ3MpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcG9zdHByb2Nlc3NvciA/IHBvc3Rwcm9jZXNzb3IoY2FjaGVbYXJnc10pIDogY2FjaGVbYXJnc107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291bnRbbGVuZ3RoXSA+PSAxZTMgJiYgZGVsZXRlIGNhY2hlW2NvdW50LnNoaWZ0KCldOwogICAgICAgICAgICBjb3VudFtwdXNoXShhcmdzKTsKICAgICAgICAgICAgY2FjaGVbYXJnc10gPSBmW2FwcGx5XShzY29wZSwgYXJnKTsKICAgICAgICAgICAgcmV0dXJuIHBvc3Rwcm9jZXNzb3IgPyBwb3N0cHJvY2Vzc29yKGNhY2hlW2FyZ3NdKSA6IGNhY2hlW2FyZ3NdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3ZjsKICAgIH0KIAogICAgUi5nZXRSR0IgPSBjYWNoZXIoZnVuY3Rpb24gKGNvbG91cikgewogICAgICAgIGlmICghY29sb3VyIHx8ICEhKChjb2xvdXIgPSBjb2xvdXIgKyBFKS5pbmRleE9mKCItIikgKyAxKSkgewogICAgICAgICAgICByZXR1cm4ge3I6IC0xLCBnOiAtMSwgYjogLTEsIGhleDogIm5vbmUiLCBlcnJvcjogMX07CiAgICAgICAgfQogICAgICAgIGlmIChjb2xvdXIgPT0gIm5vbmUiKSB7CiAgICAgICAgICAgIHJldHVybiB7cjogLTEsIGc6IC0xLCBiOiAtMSwgaGV4OiAibm9uZSJ9OwogICAgICAgIH0KICAgICAgICAhKCh7aHM6IDEsIHJnOiAxfSlbaGFzXShjb2xvdXIuc3Vic3RyaW5nKDAsIDIpKSB8fCBjb2xvdXIuY2hhckF0KCkgPT0gIiMiKSAmJiAoY29sb3VyID0gdG9IZXgoY29sb3VyKSk7CiAgICAgICAgdmFyIHJlcywKICAgICAgICAgICAgcmVkLAogICAgICAgICAgICBncmVlbiwKICAgICAgICAgICAgYmx1ZSwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgcmdiID0gY29sb3VyLm1hdGNoKGNvbG91clJlZ0V4cCk7CiAgICAgICAgaWYgKHJnYikgewogICAgICAgICAgICBpZiAocmdiWzJdKSB7CiAgICAgICAgICAgICAgICBibHVlID0gdG9JbnQocmdiWzJdLnN1YnN0cmluZyg1KSwgMTYpOwogICAgICAgICAgICAgICAgZ3JlZW4gPSB0b0ludChyZ2JbMl0uc3Vic3RyaW5nKDMsIDUpLCAxNik7CiAgICAgICAgICAgICAgICByZWQgPSB0b0ludChyZ2JbMl0uc3Vic3RyaW5nKDEsIDMpLCAxNik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJnYlszXSkgewogICAgICAgICAgICAgICAgYmx1ZSA9IHRvSW50KCh0ID0gcmdiWzNdLmNoYXJBdCgzKSkgKyB0LCAxNik7CiAgICAgICAgICAgICAgICBncmVlbiA9IHRvSW50KCh0ID0gcmdiWzNdLmNoYXJBdCgyKSkgKyB0LCAxNik7CiAgICAgICAgICAgICAgICByZWQgPSB0b0ludCgodCA9IHJnYlszXS5jaGFyQXQoMSkpICsgdCwgMTYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZ2JbNF0pIHsKICAgICAgICAgICAgICAgIHJnYiA9IHJnYls0XVtzcGxpdF0oL1xzKixccyovKTsKICAgICAgICAgICAgICAgIHJlZCA9IHRvRmxvYXQocmdiWzBdKTsKICAgICAgICAgICAgICAgIGdyZWVuID0gdG9GbG9hdChyZ2JbMV0pOwogICAgICAgICAgICAgICAgYmx1ZSA9IHRvRmxvYXQocmdiWzJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmdiWzVdKSB7CiAgICAgICAgICAgICAgICByZ2IgPSByZ2JbNV1bc3BsaXRdKC9ccyosXHMqLyk7CiAgICAgICAgICAgICAgICByZWQgPSB0b0Zsb2F0KHJnYlswXSkgKiAyLjU1OwogICAgICAgICAgICAgICAgZ3JlZW4gPSB0b0Zsb2F0KHJnYlsxXSkgKiAyLjU1OwogICAgICAgICAgICAgICAgYmx1ZSA9IHRvRmxvYXQocmdiWzJdKSAqIDIuNTU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJnYls2XSkgewogICAgICAgICAgICAgICAgcmdiID0gcmdiWzZdW3NwbGl0XSgvXHMqLFxzKi8pOwogICAgICAgICAgICAgICAgcmVkID0gdG9GbG9hdChyZ2JbMF0pOwogICAgICAgICAgICAgICAgZ3JlZW4gPSB0b0Zsb2F0KHJnYlsxXSk7CiAgICAgICAgICAgICAgICBibHVlID0gdG9GbG9hdChyZ2JbMl0pOwogICAgICAgICAgICAgICAgcmV0dXJuIFIuaHNiMnJnYihyZWQsIGdyZWVuLCBibHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmdiWzddKSB7CiAgICAgICAgICAgICAgICByZ2IgPSByZ2JbN11bc3BsaXRdKC9ccyosXHMqLyk7CiAgICAgICAgICAgICAgICByZWQgPSB0b0Zsb2F0KHJnYlswXSkgKiAyLjU1OwogICAgICAgICAgICAgICAgZ3JlZW4gPSB0b0Zsb2F0KHJnYlsxXSkgKiAyLjU1OwogICAgICAgICAgICAgICAgYmx1ZSA9IHRvRmxvYXQocmdiWzJdKSAqIDIuNTU7CiAgICAgICAgICAgICAgICByZXR1cm4gUi5oc2IycmdiKHJlZCwgZ3JlZW4sIGJsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJnYiA9IHtyOiByZWQsIGc6IGdyZWVuLCBiOiBibHVlfTsKICAgICAgICAgICAgdmFyIHIgPSAofn5yZWQpW3RvU3RyaW5nXSgxNiksCiAgICAgICAgICAgICAgICBnID0gKH5+Z3JlZW4pW3RvU3RyaW5nXSgxNiksCiAgICAgICAgICAgICAgICBiID0gKH5+Ymx1ZSlbdG9TdHJpbmddKDE2KTsKICAgICAgICAgICAgciA9IHJbcnBdKHJnLCAiMCIpOwogICAgICAgICAgICBnID0gZ1tycF0ocmcsICIwIik7CiAgICAgICAgICAgIGIgPSBiW3JwXShyZywgIjAiKTsKICAgICAgICAgICAgcmdiLmhleCA9ICIjIiArIHIgKyBnICsgYjsKICAgICAgICAgICAgcmV0dXJuIHJnYjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtyOiAtMSwgZzogLTEsIGI6IC0xLCBoZXg6ICJub25lIiwgZXJyb3I6IDF9OwogICAgfSwgUik7CiAgICBSLmdldENvbG9yID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5nZXRDb2xvci5zdGFydCA9IHRoaXMuZ2V0Q29sb3Iuc3RhcnQgfHwge2g6IDAsIHM6IDEsIGI6IHZhbHVlIHx8IC43NX0sCiAgICAgICAgICAgIHJnYiA9IHRoaXMuaHNiMnJnYihzdGFydC5oLCBzdGFydC5zLCBzdGFydC5iKTsKICAgICAgICBzdGFydC5oICs9IC4wNzU7CiAgICAgICAgaWYgKHN0YXJ0LmggPiAxKSB7CiAgICAgICAgICAgIHN0YXJ0LmggPSAwOwogICAgICAgICAgICBzdGFydC5zIC09IC4yOwogICAgICAgICAgICBzdGFydC5zIDw9IDAgJiYgKHRoaXMuZ2V0Q29sb3Iuc3RhcnQgPSB7aDogMCwgczogMSwgYjogc3RhcnQuYn0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmdiLmhleDsKICAgIH07CiAgICBSLmdldENvbG9yLnJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGRlbGV0ZSB0aGlzLnN0YXJ0OwogICAgfTsKICAgIC8vIHBhdGggdXRpbGl0aWVzCiAgICB2YXIgcGF0aENvbW1hbmQgPSAvKFthY2hsbXFzdHZ6XSlbXHMsXSooKC0/XGQqXC4/XGQqKD86ZVstK10/XGQrKT9ccyosP1xzKikrKS9pZywKICAgICAgICBwYXRoVmFsdWVzID0gLygtP1xkKlwuP1xkKig/OmVbLStdP1xkKyk/KVxzKiw/XHMqL2lnOwogICAgUi5wYXJzZVBhdGhTdHJpbmcgPSBjYWNoZXIoZnVuY3Rpb24gKHBhdGhTdHJpbmcpIHsKICAgICAgICBpZiAoIXBhdGhTdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciBwYXJhbUNvdW50cyA9IHthOiA3LCBjOiA2LCBoOiAxLCBsOiAyLCBtOiAyLCBxOiA0LCBzOiA0LCB0OiAyLCB2OiAxLCB6OiAwfSwKICAgICAgICAgICAgZGF0YSA9IFtdOwogICAgICAgIGlmIChSLmlzKHBhdGhTdHJpbmcsICJhcnJheSIpICYmIFIuaXMocGF0aFN0cmluZ1swXSwgImFycmF5IikpIHsgLy8gcm91Z2ggYXNzdW1wdGlvbgogICAgICAgICAgICBkYXRhID0gcGF0aENsb25lKHBhdGhTdHJpbmcpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRhdGFbbGVuZ3RoXSkgewogICAgICAgICAgICAocGF0aFN0cmluZyArIEUpW3JwXShwYXRoQ29tbWFuZCwgZnVuY3Rpb24gKGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBbXSwKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbG93ZXJDYXNlLmNhbGwoYik7CiAgICAgICAgICAgICAgICBjW3JwXShwYXRoVmFsdWVzLCBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIGIgJiYgcGFyYW1zW3B1c2hdKCtiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gIm0iICYmIHBhcmFtc1tsZW5ndGhdID4gMikgewogICAgICAgICAgICAgICAgICAgIGRhdGFbcHVzaF0oW2JdW2NvbmNhdF0ocGFyYW1zLnNwbGljZSgwLCAyKSkpOwogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAibCI7CiAgICAgICAgICAgICAgICAgICAgYiA9IGIgPT0gIm0iID8gImwiIDogIkwiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtc1tsZW5ndGhdID49IHBhcmFtQ291bnRzW25hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YVtwdXNoXShbYl1bY29uY2F0XShwYXJhbXMuc3BsaWNlKDAsIHBhcmFtQ291bnRzW25hbWVdKSkpOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Db3VudHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZGF0YVt0b1N0cmluZ10gPSBSLl9wYXRoMnN0cmluZzsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0pOwogICAgUi5maW5kRG90c0F0U2VnbWVudCA9IGZ1bmN0aW9uIChwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSwgdCkgewogICAgICAgIHZhciB0MSA9IDEgLSB0LAogICAgICAgICAgICB4ID0gcG93KHQxLCAzKSAqIHAxeCArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeCArIHQxICogMyAqIHQgKiB0ICogYzJ4ICsgcG93KHQsIDMpICogcDJ4LAogICAgICAgICAgICB5ID0gcG93KHQxLCAzKSAqIHAxeSArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeSArIHQxICogMyAqIHQgKiB0ICogYzJ5ICsgcG93KHQsIDMpICogcDJ5LAogICAgICAgICAgICBteCA9IHAxeCArIDIgKiB0ICogKGMxeCAtIHAxeCkgKyB0ICogdCAqIChjMnggLSAyICogYzF4ICsgcDF4KSwKICAgICAgICAgICAgbXkgPSBwMXkgKyAyICogdCAqIChjMXkgLSBwMXkpICsgdCAqIHQgKiAoYzJ5IC0gMiAqIGMxeSArIHAxeSksCiAgICAgICAgICAgIG54ID0gYzF4ICsgMiAqIHQgKiAoYzJ4IC0gYzF4KSArIHQgKiB0ICogKHAyeCAtIDIgKiBjMnggKyBjMXgpLAogICAgICAgICAgICBueSA9IGMxeSArIDIgKiB0ICogKGMyeSAtIGMxeSkgKyB0ICogdCAqIChwMnkgLSAyICogYzJ5ICsgYzF5KSwKICAgICAgICAgICAgYXggPSAoMSAtIHQpICogcDF4ICsgdCAqIGMxeCwKICAgICAgICAgICAgYXkgPSAoMSAtIHQpICogcDF5ICsgdCAqIGMxeSwKICAgICAgICAgICAgY3ggPSAoMSAtIHQpICogYzJ4ICsgdCAqIHAyeCwKICAgICAgICAgICAgY3kgPSAoMSAtIHQpICogYzJ5ICsgdCAqIHAyeSwKICAgICAgICAgICAgYWxwaGEgPSAoOTAgLSBtYXRoLmF0YW4oKG14IC0gbngpIC8gKG15IC0gbnkpKSAqIDE4MCAvIG1hdGguUEkpOwogICAgICAgIChteCA+IG54IHx8IG15IDwgbnkpICYmIChhbHBoYSArPSAxODApOwogICAgICAgIHJldHVybiB7eDogeCwgeTogeSwgbToge3g6IG14LCB5OiBteX0sIG46IHt4OiBueCwgeTogbnl9LCBzdGFydDoge3g6IGF4LCB5OiBheX0sIGVuZDoge3g6IGN4LCB5OiBjeX0sIGFscGhhOiBhbHBoYX07CiAgICB9OwogICAgdmFyIHBhdGhEaW1lbnNpb25zID0gY2FjaGVyKGZ1bmN0aW9uIChwYXRoKSB7CiAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiB7eDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMH07CiAgICAgICAgfQogICAgICAgIHBhdGggPSBwYXRoMmN1cnZlKHBhdGgpOwogICAgICAgIHZhciB4ID0gMCwgCiAgICAgICAgICAgIHkgPSAwLAogICAgICAgICAgICBYID0gW10sCiAgICAgICAgICAgIFkgPSBbXSwKICAgICAgICAgICAgcDsKICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIHAgPSBwYXRoW2ldOwogICAgICAgICAgICBpZiAocFswXSA9PSAiTSIpIHsKICAgICAgICAgICAgICAgIHggPSBwWzFdOwogICAgICAgICAgICAgICAgeSA9IHBbMl07CiAgICAgICAgICAgICAgICBYW3B1c2hdKHgpOwogICAgICAgICAgICAgICAgWVtwdXNoXSh5KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBkaW0gPSBjdXJ2ZURpbSh4LCB5LCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdKTsKICAgICAgICAgICAgICAgIFggPSBYW2NvbmNhdF0oZGltLm1pbi54LCBkaW0ubWF4LngpOwogICAgICAgICAgICAgICAgWSA9IFlbY29uY2F0XShkaW0ubWluLnksIGRpbS5tYXgueSk7CiAgICAgICAgICAgICAgICB4ID0gcFs1XTsKICAgICAgICAgICAgICAgIHkgPSBwWzZdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciB4bWluID0gbW1pblthcHBseV0oMCwgWCksCiAgICAgICAgICAgIHltaW4gPSBtbWluW2FwcGx5XSgwLCBZKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB4OiB4bWluLAogICAgICAgICAgICB5OiB5bWluLAogICAgICAgICAgICB3aWR0aDogbW1heFthcHBseV0oMCwgWCkgLSB4bWluLAogICAgICAgICAgICBoZWlnaHQ6IG1tYXhbYXBwbHldKDAsIFkpIC0geW1pbgogICAgICAgIH07CiAgICB9KSwKICAgICAgICBwYXRoQ2xvbmUgPSBmdW5jdGlvbiAocGF0aEFycmF5KSB7CiAgICAgICAgICAgIHZhciByZXMgPSBbXTsKICAgICAgICAgICAgaWYgKCFSLmlzKHBhdGhBcnJheSwgImFycmF5IikgfHwgIVIuaXMocGF0aEFycmF5ICYmIHBhdGhBcnJheVswXSwgImFycmF5IikpIHsgLy8gcm91Z2ggYXNzdW1wdGlvbgogICAgICAgICAgICAgICAgcGF0aEFycmF5ID0gUi5wYXJzZVBhdGhTdHJpbmcocGF0aEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoQXJyYXlbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgIHJlc1tpXSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gcGF0aEFycmF5W2ldW2xlbmd0aF07IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzW2ldW2pdID0gcGF0aEFycmF5W2ldW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc1t0b1N0cmluZ10gPSBSLl9wYXRoMnN0cmluZzsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9LAogICAgICAgIHBhdGhUb1JlbGF0aXZlID0gY2FjaGVyKGZ1bmN0aW9uIChwYXRoQXJyYXkpIHsKICAgICAgICAgICAgaWYgKCFSLmlzKHBhdGhBcnJheSwgImFycmF5IikgfHwgIVIuaXMocGF0aEFycmF5ICYmIHBhdGhBcnJheVswXSwgImFycmF5IikpIHsgLy8gcm91Z2ggYXNzdW1wdGlvbgogICAgICAgICAgICAgICAgcGF0aEFycmF5ID0gUi5wYXJzZVBhdGhTdHJpbmcocGF0aEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzID0gW10sCiAgICAgICAgICAgICAgICB4ID0gMCwKICAgICAgICAgICAgICAgIHkgPSAwLAogICAgICAgICAgICAgICAgbXggPSAwLAogICAgICAgICAgICAgICAgbXkgPSAwLAogICAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICBpZiAocGF0aEFycmF5WzBdWzBdID09ICJNIikgewogICAgICAgICAgICAgICAgeCA9IHBhdGhBcnJheVswXVsxXTsKICAgICAgICAgICAgICAgIHkgPSBwYXRoQXJyYXlbMF1bMl07CiAgICAgICAgICAgICAgICBteCA9IHg7CiAgICAgICAgICAgICAgICBteSA9IHk7CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgICAgcmVzW3B1c2hdKFsiTSIsIHgsIHldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQsIGlpID0gcGF0aEFycmF5W2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IHJlc1tpXSA9IFtdLAogICAgICAgICAgICAgICAgICAgIHBhID0gcGF0aEFycmF5W2ldOwogICAgICAgICAgICAgICAgaWYgKHBhWzBdICE9IGxvd2VyQ2FzZS5jYWxsKHBhWzBdKSkgewogICAgICAgICAgICAgICAgICAgIHJbMF0gPSBsb3dlckNhc2UuY2FsbChwYVswXSk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgclsxXSA9IHBhWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgclsyXSA9IHBhWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgclszXSA9IHBhWzNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcls0XSA9IHBhWzRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcls1XSA9IHBhWzVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcls2XSA9ICsocGFbNl0gLSB4KS50b0ZpeGVkKDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcls3XSA9ICsocGFbN10gLSB5KS50b0ZpeGVkKDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInYiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgclsxXSA9ICsocGFbMV0gLSB5KS50b0ZpeGVkKDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIm0iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXggPSBwYVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gcGFbMl07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMSwgamogPSBwYVtsZW5ndGhdOyBqIDwgamo7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbal0gPSArKHBhW2pdIC0gKChqICUgMikgPyB4IDogeSkpLnRvRml4ZWQoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByID0gcmVzW2ldID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhWzBdID09ICJtIikgewogICAgICAgICAgICAgICAgICAgICAgICBteCA9IHBhWzFdICsgeDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBwYVsyXSArIHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwLCBrayA9IHBhW2xlbmd0aF07IGsgPCBrazsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpXVtrXSA9IHBhW2tdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsZW4gPSByZXNbaV1bbGVuZ3RoXTsKICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzW2ldWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAieiI6CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBteDsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG15OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJoIjoKICAgICAgICAgICAgICAgICAgICAgICAgeCArPSArcmVzW2ldW2xlbiAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ2IjoKICAgICAgICAgICAgICAgICAgICAgICAgeSArPSArcmVzW2ldW2xlbiAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICB4ICs9ICtyZXNbaV1bbGVuIC0gMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gK3Jlc1tpXVtsZW4gLSAxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXNbdG9TdHJpbmddID0gUi5fcGF0aDJzdHJpbmc7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfSwgMCwgcGF0aENsb25lKSwKICAgICAgICBwYXRoVG9BYnNvbHV0ZSA9IGNhY2hlcihmdW5jdGlvbiAocGF0aEFycmF5KSB7CiAgICAgICAgICAgIGlmICghUi5pcyhwYXRoQXJyYXksICJhcnJheSIpIHx8ICFSLmlzKHBhdGhBcnJheSAmJiBwYXRoQXJyYXlbMF0sICJhcnJheSIpKSB7IC8vIHJvdWdoIGFzc3VtcHRpb24KICAgICAgICAgICAgICAgIHBhdGhBcnJheSA9IFIucGFyc2VQYXRoU3RyaW5nKHBhdGhBcnJheSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlcyA9IFtdLAogICAgICAgICAgICAgICAgeCA9IDAsCiAgICAgICAgICAgICAgICB5ID0gMCwKICAgICAgICAgICAgICAgIG14ID0gMCwKICAgICAgICAgICAgICAgIG15ID0gMCwKICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgaWYgKHBhdGhBcnJheVswXVswXSA9PSAiTSIpIHsKICAgICAgICAgICAgICAgIHggPSArcGF0aEFycmF5WzBdWzFdOwogICAgICAgICAgICAgICAgeSA9ICtwYXRoQXJyYXlbMF1bMl07CiAgICAgICAgICAgICAgICBteCA9IHg7CiAgICAgICAgICAgICAgICBteSA9IHk7CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgICAgcmVzWzBdID0gWyJNIiwgeCwgeV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBpaSA9IHBhdGhBcnJheVtsZW5ndGhdOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHIgPSByZXNbaV0gPSBbXSwKICAgICAgICAgICAgICAgICAgICBwYSA9IHBhdGhBcnJheVtpXTsKICAgICAgICAgICAgICAgIGlmIChwYVswXSAhPSB1cHBlckNhc2UuY2FsbChwYVswXSkpIHsKICAgICAgICAgICAgICAgICAgICByWzBdID0gdXBwZXJDYXNlLmNhbGwocGFbMF0pOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoclswXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJBIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMV0gPSBwYVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSBwYVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbM10gPSBwYVszXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbNF0gPSBwYVs0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbNV0gPSBwYVs1XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbNl0gPSArKHBhWzZdICsgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByWzddID0gKyhwYVs3XSArIHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIlYiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgclsxXSA9ICtwYVsxXSArIHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiSCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByWzFdID0gK3BhWzFdICsgeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gK3BhWzFdICsgeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ID0gK3BhWzJdICsgeTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxLCBqaiA9IHBhW2xlbmd0aF07IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltqXSA9ICtwYVtqXSArICgoaiAlIDIpID8geCA6IHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDAsIGtrID0gcGFbbGVuZ3RoXTsgayA8IGtrOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldW2tdID0gcGFba107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoIChyWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiWiI6CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBteDsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG15OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJIIjoKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIlYiOgogICAgICAgICAgICAgICAgICAgICAgICB5ID0gclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJlc1tpXVtyZXNbaV1bbGVuZ3RoXSAtIDJdOwogICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVzW2ldW3Jlc1tpXVtsZW5ndGhdIC0gMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzW3RvU3RyaW5nXSA9IFIuX3BhdGgyc3RyaW5nOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH0sIG51bGwsIHBhdGhDbG9uZSksCiAgICAgICAgbDJjID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7CiAgICAgICAgICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTIsIHgyLCB5Ml07CiAgICAgICAgfSwKICAgICAgICBxMmMgPSBmdW5jdGlvbiAoeDEsIHkxLCBheCwgYXksIHgyLCB5MikgewogICAgICAgICAgICB2YXIgXzEzID0gMSAvIDMsCiAgICAgICAgICAgICAgICBfMjMgPSAyIC8gMzsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICBfMTMgKiB4MSArIF8yMyAqIGF4LAogICAgICAgICAgICAgICAgICAgIF8xMyAqIHkxICsgXzIzICogYXksCiAgICAgICAgICAgICAgICAgICAgXzEzICogeDIgKyBfMjMgKiBheCwKICAgICAgICAgICAgICAgICAgICBfMTMgKiB5MiArIF8yMyAqIGF5LAogICAgICAgICAgICAgICAgICAgIHgyLAogICAgICAgICAgICAgICAgICAgIHkyCiAgICAgICAgICAgICAgICBdOwogICAgICAgIH0sCiAgICAgICAgYTJjID0gZnVuY3Rpb24gKHgxLCB5MSwgcngsIHJ5LCBhbmdsZSwgbGFyZ2VfYXJjX2ZsYWcsIHN3ZWVwX2ZsYWcsIHgyLCB5MiwgcmVjdXJzaXZlKSB7CiAgICAgICAgICAgIC8vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9mIHdoZXJlIHRoaXMgbWF0aCBjYW1lIGZyb20gdmlzaXQ6CiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ltcGxub3RlLmh0bWwjQXJjSW1wbGVtZW50YXRpb25Ob3RlcwogICAgICAgICAgICB2YXIgUEkgPSBtYXRoLlBJLAogICAgICAgICAgICAgICAgXzEyMCA9IFBJICogMTIwIC8gMTgwLAogICAgICAgICAgICAgICAgcmFkID0gUEkgLyAxODAgKiAoK2FuZ2xlIHx8IDApLAogICAgICAgICAgICAgICAgcmVzID0gW10sCiAgICAgICAgICAgICAgICB4eSwKICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNhY2hlcihmdW5jdGlvbiAoeCwgeSwgcmFkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFggPSB4ICogbWF0aC5jb3MocmFkKSAtIHkgKiBtYXRoLnNpbihyYWQpLAogICAgICAgICAgICAgICAgICAgICAgICBZID0geCAqIG1hdGguc2luKHJhZCkgKyB5ICogbWF0aC5jb3MocmFkKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3g6IFgsIHk6IFl9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcmVjdXJzaXZlKSB7CiAgICAgICAgICAgICAgICB4eSA9IHJvdGF0ZSh4MSwgeTEsIC1yYWQpOwogICAgICAgICAgICAgICAgeDEgPSB4eS54OwogICAgICAgICAgICAgICAgeTEgPSB4eS55OwogICAgICAgICAgICAgICAgeHkgPSByb3RhdGUoeDIsIHkyLCAtcmFkKTsKICAgICAgICAgICAgICAgIHgyID0geHkueDsKICAgICAgICAgICAgICAgIHkyID0geHkueTsKICAgICAgICAgICAgICAgIHZhciBjb3MgPSBtYXRoLmNvcyhQSSAvIDE4MCAqIGFuZ2xlKSwKICAgICAgICAgICAgICAgICAgICBzaW4gPSBtYXRoLnNpbihQSSAvIDE4MCAqIGFuZ2xlKSwKICAgICAgICAgICAgICAgICAgICB4ID0gKHgxIC0geDIpIC8gMiwKICAgICAgICAgICAgICAgICAgICB5ID0gKHkxIC0geTIpIC8gMjsKICAgICAgICAgICAgICAgIC8vIHJ4ID0gbW1heChyeCwgbWF0aC5hYnMoeCkpOwogICAgICAgICAgICAgICAgLy8gcnkgPSBtbWF4KHJ5LCBtYXRoLmFicyh5KSk7CiAgICAgICAgICAgICAgICB2YXIgaCA9ICh4ICogeCkgLyAocnggKiByeCkgKyAoeSAqIHkpIC8gKHJ5ICogcnkpOwogICAgICAgICAgICAgICAgaWYgKGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgaCA9IG1hdGguc3FydChoKTsKICAgICAgICAgICAgICAgICAgICByeCA9IGggKiByeDsKICAgICAgICAgICAgICAgICAgICByeSA9IGggKiByeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByeDIgPSByeCAqIHJ4LAogICAgICAgICAgICAgICAgICAgIHJ5MiA9IHJ5ICogcnksCiAgICAgICAgICAgICAgICAgICAgayA9IChsYXJnZV9hcmNfZmxhZyA9PSBzd2VlcF9mbGFnID8gLTEgOiAxKSAqCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGguc3FydChtYXRoLmFicygocngyICogcnkyIC0gcngyICogeSAqIHkgLSByeTIgKiB4ICogeCkgLyAocngyICogeSAqIHkgKyByeTIgKiB4ICogeCkpKSwKICAgICAgICAgICAgICAgICAgICBjeCA9IGsgKiByeCAqIHkgLyByeSArICh4MSArIHgyKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgY3kgPSBrICogLXJ5ICogeCAvIHJ4ICsgKHkxICsgeTIpIC8gMiwKICAgICAgICAgICAgICAgICAgICBmMSA9IG1hdGguYXNpbigoKHkxIC0gY3kpIC8gcnkpLnRvRml4ZWQoNykpLAogICAgICAgICAgICAgICAgICAgIGYyID0gbWF0aC5hc2luKCgoeTIgLSBjeSkgLyByeSkudG9GaXhlZCg3KSk7CgogICAgICAgICAgICAgICAgZjEgPSB4MSA8IGN4ID8gUEkgLSBmMSA6IGYxOwogICAgICAgICAgICAgICAgZjIgPSB4MiA8IGN4ID8gUEkgLSBmMiA6IGYyOwogICAgICAgICAgICAgICAgZjEgPCAwICYmIChmMSA9IFBJICogMiArIGYxKTsKICAgICAgICAgICAgICAgIGYyIDwgMCAmJiAoZjIgPSBQSSAqIDIgKyBmMik7CiAgICAgICAgICAgICAgICBpZiAoc3dlZXBfZmxhZyAmJiBmMSA+IGYyKSB7CiAgICAgICAgICAgICAgICAgICAgZjEgPSBmMSAtIFBJICogMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc3dlZXBfZmxhZyAmJiBmMiA+IGYxKSB7CiAgICAgICAgICAgICAgICAgICAgZjIgPSBmMiAtIFBJICogMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGYxID0gcmVjdXJzaXZlWzBdOwogICAgICAgICAgICAgICAgZjIgPSByZWN1cnNpdmVbMV07CiAgICAgICAgICAgICAgICBjeCA9IHJlY3Vyc2l2ZVsyXTsKICAgICAgICAgICAgICAgIGN5ID0gcmVjdXJzaXZlWzNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkZiA9IGYyIC0gZjE7CiAgICAgICAgICAgIGlmIChtYXRoLmFicyhkZikgPiBfMTIwKSB7CiAgICAgICAgICAgICAgICB2YXIgZjJvbGQgPSBmMiwKICAgICAgICAgICAgICAgICAgICB4Mm9sZCA9IHgyLAogICAgICAgICAgICAgICAgICAgIHkyb2xkID0geTI7CiAgICAgICAgICAgICAgICBmMiA9IGYxICsgXzEyMCAqIChzd2VlcF9mbGFnICYmIGYyID4gZjEgPyAxIDogLTEpOwogICAgICAgICAgICAgICAgeDIgPSBjeCArIHJ4ICogbWF0aC5jb3MoZjIpOwogICAgICAgICAgICAgICAgeTIgPSBjeSArIHJ5ICogbWF0aC5zaW4oZjIpOwogICAgICAgICAgICAgICAgcmVzID0gYTJjKHgyLCB5MiwgcngsIHJ5LCBhbmdsZSwgMCwgc3dlZXBfZmxhZywgeDJvbGQsIHkyb2xkLCBbZjIsIGYyb2xkLCBjeCwgY3ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZiA9IGYyIC0gZjE7CiAgICAgICAgICAgIHZhciBjMSA9IG1hdGguY29zKGYxKSwKICAgICAgICAgICAgICAgIHMxID0gbWF0aC5zaW4oZjEpLAogICAgICAgICAgICAgICAgYzIgPSBtYXRoLmNvcyhmMiksCiAgICAgICAgICAgICAgICBzMiA9IG1hdGguc2luKGYyKSwKICAgICAgICAgICAgICAgIHQgPSBtYXRoLnRhbihkZiAvIDQpLAogICAgICAgICAgICAgICAgaHggPSA0IC8gMyAqIHJ4ICogdCwKICAgICAgICAgICAgICAgIGh5ID0gNCAvIDMgKiByeSAqIHQsCiAgICAgICAgICAgICAgICBtMSA9IFt4MSwgeTFdLAogICAgICAgICAgICAgICAgbTIgPSBbeDEgKyBoeCAqIHMxLCB5MSAtIGh5ICogYzFdLAogICAgICAgICAgICAgICAgbTMgPSBbeDIgKyBoeCAqIHMyLCB5MiAtIGh5ICogYzJdLAogICAgICAgICAgICAgICAgbTQgPSBbeDIsIHkyXTsKICAgICAgICAgICAgbTJbMF0gPSAyICogbTFbMF0gLSBtMlswXTsKICAgICAgICAgICAgbTJbMV0gPSAyICogbTFbMV0gLSBtMlsxXTsKICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFttMiwgbTMsIG00XVtjb25jYXRdKHJlcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXMgPSBbbTIsIG0zLCBtNF1bY29uY2F0XShyZXMpW2pvaW5dKClbc3BsaXRdKCIsIik7CiAgICAgICAgICAgICAgICB2YXIgbmV3cmVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZXNbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBuZXdyZXNbaV0gPSBpICUgMiA/IHJvdGF0ZShyZXNbaSAtIDFdLCByZXNbaV0sIHJhZCkueSA6IHJvdGF0ZShyZXNbaV0sIHJlc1tpICsgMV0sIHJhZCkueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGFsZXJ0KG5ld3Jlcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3cmVzOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmaW5kRG90QXRTZWdtZW50ID0gZnVuY3Rpb24gKHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCB0KSB7CiAgICAgICAgICAgIHZhciB0MSA9IDEgLSB0OwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogcG93KHQxLCAzKSAqIHAxeCArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeCArIHQxICogMyAqIHQgKiB0ICogYzJ4ICsgcG93KHQsIDMpICogcDJ4LAogICAgICAgICAgICAgICAgeTogcG93KHQxLCAzKSAqIHAxeSArIHBvdyh0MSwgMikgKiAzICogdCAqIGMxeSArIHQxICogMyAqIHQgKiB0ICogYzJ5ICsgcG93KHQsIDMpICogcDJ5CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICBjdXJ2ZURpbSA9IGNhY2hlcihmdW5jdGlvbiAocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnkpIHsKICAgICAgICAgICAgdmFyIGEgPSAoYzJ4IC0gMiAqIGMxeCArIHAxeCkgLSAocDJ4IC0gMiAqIGMyeCArIGMxeCksCiAgICAgICAgICAgICAgICBiID0gMiAqIChjMXggLSBwMXgpIC0gMiAqIChjMnggLSBjMXgpLAogICAgICAgICAgICAgICAgYyA9IHAxeCAtIGMxeCwKICAgICAgICAgICAgICAgIHQxID0gKC1iICsgbWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAyIC8gYSwKICAgICAgICAgICAgICAgIHQyID0gKC1iIC0gbWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAyIC8gYSwKICAgICAgICAgICAgICAgIHkgPSBbcDF5LCBwMnldLAogICAgICAgICAgICAgICAgeCA9IFtwMXgsIHAyeF0sCiAgICAgICAgICAgICAgICBkb3Q7CiAgICAgICAgICAgIG1hdGguYWJzKHQxKSA+IDFlMTIgJiYgKHQxID0gLjUpOwogICAgICAgICAgICBtYXRoLmFicyh0MikgPiAxZTEyICYmICh0MiA9IC41KTsKICAgICAgICAgICAgaWYgKHQxID4gMCAmJiB0MSA8IDEpIHsKICAgICAgICAgICAgICAgIGRvdCA9IGZpbmREb3RBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQxKTsKICAgICAgICAgICAgICAgIHhbcHVzaF0oZG90LngpOwogICAgICAgICAgICAgICAgeVtwdXNoXShkb3QueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQyID4gMCAmJiB0MiA8IDEpIHsKICAgICAgICAgICAgICAgIGRvdCA9IGZpbmREb3RBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQyKTsKICAgICAgICAgICAgICAgIHhbcHVzaF0oZG90LngpOwogICAgICAgICAgICAgICAgeVtwdXNoXShkb3QueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSA9IChjMnkgLSAyICogYzF5ICsgcDF5KSAtIChwMnkgLSAyICogYzJ5ICsgYzF5KTsKICAgICAgICAgICAgYiA9IDIgKiAoYzF5IC0gcDF5KSAtIDIgKiAoYzJ5IC0gYzF5KTsKICAgICAgICAgICAgYyA9IHAxeSAtIGMxeTsKICAgICAgICAgICAgdDEgPSAoLWIgKyBtYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvIDIgLyBhOwogICAgICAgICAgICB0MiA9ICgtYiAtIG1hdGguc3FydChiICogYiAtIDQgKiBhICogYykpIC8gMiAvIGE7CiAgICAgICAgICAgIG1hdGguYWJzKHQxKSA+IDFlMTIgJiYgKHQxID0gLjUpOwogICAgICAgICAgICBtYXRoLmFicyh0MikgPiAxZTEyICYmICh0MiA9IC41KTsKICAgICAgICAgICAgaWYgKHQxID4gMCAmJiB0MSA8IDEpIHsKICAgICAgICAgICAgICAgIGRvdCA9IGZpbmREb3RBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQxKTsKICAgICAgICAgICAgICAgIHhbcHVzaF0oZG90LngpOwogICAgICAgICAgICAgICAgeVtwdXNoXShkb3QueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQyID4gMCAmJiB0MiA8IDEpIHsKICAgICAgICAgICAgICAgIGRvdCA9IGZpbmREb3RBdFNlZ21lbnQocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnksIHQyKTsKICAgICAgICAgICAgICAgIHhbcHVzaF0oZG90LngpOwogICAgICAgICAgICAgICAgeVtwdXNoXShkb3QueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG1pbjoge3g6IG1taW5bYXBwbHldKDAsIHgpLCB5OiBtbWluW2FwcGx5XSgwLCB5KX0sCiAgICAgICAgICAgICAgICBtYXg6IHt4OiBtbWF4W2FwcGx5XSgwLCB4KSwgeTogbW1heFthcHBseV0oMCwgeSl9CiAgICAgICAgICAgIH07CiAgICAgICAgfSksCiAgICAgICAgcGF0aDJjdXJ2ZSA9IGNhY2hlcihmdW5jdGlvbiAocGF0aCwgcGF0aDIpIHsKICAgICAgICAgICAgdmFyIHAgPSBwYXRoVG9BYnNvbHV0ZShwYXRoKSwKICAgICAgICAgICAgICAgIHAyID0gcGF0aDIgJiYgcGF0aFRvQWJzb2x1dGUocGF0aDIpLAogICAgICAgICAgICAgICAgYXR0cnMgPSB7eDogMCwgeTogMCwgYng6IDAsIGJ5OiAwLCBYOiAwLCBZOiAwLCBxeDogbnVsbCwgcXk6IG51bGx9LAogICAgICAgICAgICAgICAgYXR0cnMyID0ge3g6IDAsIHk6IDAsIGJ4OiAwLCBieTogMCwgWDogMCwgWTogMCwgcXg6IG51bGwsIHF5OiBudWxsfSwKICAgICAgICAgICAgICAgIHByb2Nlc3NQYXRoID0gZnVuY3Rpb24gKHBhdGgsIGQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbngsIG55OwogICAgICAgICAgICAgICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyJDIiwgZC54LCBkLnksIGQueCwgZC55LCBkLngsIGQueV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICEocGF0aFswXSBpbiB7VDoxLCBROjF9KSAmJiAoZC5xeCA9IGQucXkgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhdGhbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLlggPSBwYXRoWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5ZID0gcGF0aFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJBIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBbIkMiXVtjb25jYXRdKGEyY1thcHBseV0oMCwgW2QueCwgZC55XVtjb25jYXRdKHBhdGguc2xpY2UoMSkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiUyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBueCA9IGQueCArIChkLnggLSAoZC5ieCB8fCBkLngpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG55ID0gZC55ICsgKGQueSAtIChkLmJ5IHx8IGQueSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFsiQyIsIG54LCBueV1bY29uY2F0XShwYXRoLnNsaWNlKDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJUIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucXggPSBkLnggKyAoZC54IC0gKGQucXggfHwgZC54KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnF5ID0gZC55ICsgKGQueSAtIChkLnF5IHx8IGQueSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFsiQyJdW2NvbmNhdF0ocTJjKGQueCwgZC55LCBkLnF4LCBkLnF5LCBwYXRoWzFdLCBwYXRoWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiUSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnF4ID0gcGF0aFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucXkgPSBwYXRoWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFsiQyJdW2NvbmNhdF0ocTJjKGQueCwgZC55LCBwYXRoWzFdLCBwYXRoWzJdLCBwYXRoWzNdLCBwYXRoWzRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiTCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gWyJDIl1bY29uY2F0XShsMmMoZC54LCBkLnksIHBhdGhbMV0sIHBhdGhbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJIIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBbIkMiXVtjb25jYXRdKGwyYyhkLngsIGQueSwgcGF0aFsxXSwgZC55KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiViI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gWyJDIl1bY29uY2F0XShsMmMoZC54LCBkLnksIGQueCwgcGF0aFsxXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIloiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFsiQyJdW2NvbmNhdF0obDJjKGQueCwgZC55LCBkLlgsIGQuWSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZpeEFyYyA9IGZ1bmN0aW9uIChwcCwgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChwcFtpXVtsZW5ndGhdID4gNykgewogICAgICAgICAgICAgICAgICAgICAgICBwcFtpXS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGkgPSBwcFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpW2xlbmd0aF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLnNwbGljZShpKyssIDAsIFsiQyJdW2NvbmNhdF0ocGkuc3BsaWNlKDAsIDYpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHAuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpaSA9IG1tYXgocFtsZW5ndGhdLCBwMiAmJiBwMltsZW5ndGhdIHx8IDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmaXhNID0gZnVuY3Rpb24gKHBhdGgxLCBwYXRoMiwgYTEsIGEyLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgxICYmIHBhdGgyICYmIHBhdGgxW2ldWzBdID09ICJNIiAmJiBwYXRoMltpXVswXSAhPSAiTSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDIuc3BsaWNlKGksIDAsIFsiTSIsIGEyLngsIGEyLnldKTsKICAgICAgICAgICAgICAgICAgICAgICAgYTEuYnggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBhMS5ieSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGExLnggPSBwYXRoMVtpXVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgYTEueSA9IHBhdGgxW2ldWzJdOwogICAgICAgICAgICAgICAgICAgICAgICBpaSA9IG1tYXgocFtsZW5ndGhdLCBwMiAmJiBwMltsZW5ndGhdIHx8IDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG1tYXgocFtsZW5ndGhdLCBwMiAmJiBwMltsZW5ndGhdIHx8IDApOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgcFtpXSA9IHByb2Nlc3NQYXRoKHBbaV0sIGF0dHJzKTsKICAgICAgICAgICAgICAgIGZpeEFyYyhwLCBpKTsKICAgICAgICAgICAgICAgIHAyICYmIChwMltpXSA9IHByb2Nlc3NQYXRoKHAyW2ldLCBhdHRyczIpKTsKICAgICAgICAgICAgICAgIHAyICYmIGZpeEFyYyhwMiwgaSk7CiAgICAgICAgICAgICAgICBmaXhNKHAsIHAyLCBhdHRycywgYXR0cnMyLCBpKTsKICAgICAgICAgICAgICAgIGZpeE0ocDIsIHAsIGF0dHJzMiwgYXR0cnMsIGkpOwogICAgICAgICAgICAgICAgdmFyIHNlZyA9IHBbaV0sCiAgICAgICAgICAgICAgICAgICAgc2VnMiA9IHAyICYmIHAyW2ldLAogICAgICAgICAgICAgICAgICAgIHNlZ2xlbiA9IHNlZ1tsZW5ndGhdLAogICAgICAgICAgICAgICAgICAgIHNlZzJsZW4gPSBwMiAmJiBzZWcyW2xlbmd0aF07CiAgICAgICAgICAgICAgICBhdHRycy54ID0gc2VnW3NlZ2xlbiAtIDJdOwogICAgICAgICAgICAgICAgYXR0cnMueSA9IHNlZ1tzZWdsZW4gLSAxXTsKICAgICAgICAgICAgICAgIGF0dHJzLmJ4ID0gdG9GbG9hdChzZWdbc2VnbGVuIC0gNF0pIHx8IGF0dHJzLng7CiAgICAgICAgICAgICAgICBhdHRycy5ieSA9IHRvRmxvYXQoc2VnW3NlZ2xlbiAtIDNdKSB8fCBhdHRycy55OwogICAgICAgICAgICAgICAgYXR0cnMyLmJ4ID0gcDIgJiYgKHRvRmxvYXQoc2VnMltzZWcybGVuIC0gNF0pIHx8IGF0dHJzMi54KTsKICAgICAgICAgICAgICAgIGF0dHJzMi5ieSA9IHAyICYmICh0b0Zsb2F0KHNlZzJbc2VnMmxlbiAtIDNdKSB8fCBhdHRyczIueSk7CiAgICAgICAgICAgICAgICBhdHRyczIueCA9IHAyICYmIHNlZzJbc2VnMmxlbiAtIDJdOwogICAgICAgICAgICAgICAgYXR0cnMyLnkgPSBwMiAmJiBzZWcyW3NlZzJsZW4gLSAxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcDIgPyBbcCwgcDJdIDogcDsKICAgICAgICB9LCBudWxsLCBwYXRoQ2xvbmUpLAogICAgICAgIHBhcnNlRG90cyA9IGNhY2hlcihmdW5jdGlvbiAoZ3JhZGllbnQpIHsKICAgICAgICAgICAgdmFyIGRvdHMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZ3JhZGllbnRbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBkb3QgPSB7fSwKICAgICAgICAgICAgICAgICAgICBwYXIgPSBncmFkaWVudFtpXS5tYXRjaCgvXihbXjpdKik6PyhbXGRcLl0qKS8pOwogICAgICAgICAgICAgICAgZG90LmNvbG9yID0gUi5nZXRSR0IocGFyWzFdKTsKICAgICAgICAgICAgICAgIGlmIChkb3QuY29sb3IuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvdC5jb2xvciA9IGRvdC5jb2xvci5oZXg7CiAgICAgICAgICAgICAgICBwYXJbMl0gJiYgKGRvdC5vZmZzZXQgPSBwYXJbMl0gKyAiJSIpOwogICAgICAgICAgICAgICAgZG90c1twdXNoXShkb3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaSA9IDEsIGlpID0gZG90c1tsZW5ndGhdIC0gMTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghZG90c1tpXS5vZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB0b0Zsb2F0KGRvdHNbaSAtIDFdLm9mZnNldCB8fCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gaSArIDE7IGogPCBpaTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3RzW2pdLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZG90c1tqXS5vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW5kID0gdG9GbG9hdChlbmQpOwogICAgICAgICAgICAgICAgICAgIHZhciBkID0gKGVuZCAtIHN0YXJ0KSAvIChqIC0gaSArIDEpOwogICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgajsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHNbaV0ub2Zmc2V0ID0gc3RhcnQgKyAiJSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkb3RzOwogICAgICAgIH0pLAogICAgICAgIGdldENvbnRhaW5lciA9IGZ1bmN0aW9uICh4LCB5LCB3LCBoKSB7CiAgICAgICAgICAgIHZhciBjb250YWluZXI7CiAgICAgICAgICAgIGlmIChSLmlzKHgsICJzdHJpbmciKSB8fCBSLmlzKHgsICJvYmplY3QiKSkgewogICAgICAgICAgICAgICAgY29udGFpbmVyID0gUi5pcyh4LCAic3RyaW5nIikgPyBkb2MuZ2V0RWxlbWVudEJ5SWQoeCkgOiB4OwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci50YWdOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29udGFpbmVyLnN0eWxlLnBpeGVsV2lkdGggfHwgY29udGFpbmVyLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuc3R5bGUucGl4ZWxIZWlnaHQgfHwgY29udGFpbmVyLm9mZnNldEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Y29udGFpbmVyOiBjb250YWluZXIsIHdpZHRoOiB5LCBoZWlnaHQ6IHd9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChSLmlzKHgsIG51KSAmJiBoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7Y29udGFpbmVyOiAxLCB4OiB4LCB5OiB5LCB3aWR0aDogdywgaGVpZ2h0OiBofTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcGx1Z2lucyA9IGZ1bmN0aW9uIChjb24sIGFkZCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gYWRkKSB7CiAgICAgICAgICAgICAgICBpZiAoYWRkW2hhc10ocHJvcCkgJiYgIShwcm9wIGluIGNvbikpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhZGRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZnVuY3Rpb24iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uW3Byb3BdID0gY29uID09PSB0aGF0ID8gZiA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZbYXBwbHldKHRoYXQsIGFyZ3VtZW50cyk7IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShhZGRbcHJvcF0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbltwcm9wXSA9IGNvbltwcm9wXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnMuY2FsbCh0aGlzLCBjb25bcHJvcF0sIGFkZFtwcm9wXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uW3Byb3BdID0gYWRkW3Byb3BdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHRlYXIgPSBmdW5jdGlvbiAoZWwsIHBhcGVyKSB7CiAgICAgICAgICAgIGVsID09IHBhcGVyLnRvcCAmJiAocGFwZXIudG9wID0gZWwucHJldik7CiAgICAgICAgICAgIGVsID09IHBhcGVyLmJvdHRvbSAmJiAocGFwZXIuYm90dG9tID0gZWwubmV4dCk7CiAgICAgICAgICAgIGVsLm5leHQgJiYgKGVsLm5leHQucHJldiA9IGVsLnByZXYpOwogICAgICAgICAgICBlbC5wcmV2ICYmIChlbC5wcmV2Lm5leHQgPSBlbC5uZXh0KTsKICAgICAgICB9LAogICAgICAgIHRvZnJvbnQgPSBmdW5jdGlvbiAoZWwsIHBhcGVyKSB7CiAgICAgICAgICAgIGlmIChwYXBlci50b3AgPT09IGVsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVhcihlbCwgcGFwZXIpOwogICAgICAgICAgICBlbC5uZXh0ID0gbnVsbDsKICAgICAgICAgICAgZWwucHJldiA9IHBhcGVyLnRvcDsKICAgICAgICAgICAgcGFwZXIudG9wLm5leHQgPSBlbDsKICAgICAgICAgICAgcGFwZXIudG9wID0gZWw7CiAgICAgICAgfSwKICAgICAgICB0b2JhY2sgPSBmdW5jdGlvbiAoZWwsIHBhcGVyKSB7CiAgICAgICAgICAgIGlmIChwYXBlci5ib3R0b20gPT09IGVsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVhcihlbCwgcGFwZXIpOwogICAgICAgICAgICBlbC5uZXh0ID0gcGFwZXIuYm90dG9tOwogICAgICAgICAgICBlbC5wcmV2ID0gbnVsbDsKICAgICAgICAgICAgcGFwZXIuYm90dG9tLnByZXYgPSBlbDsKICAgICAgICAgICAgcGFwZXIuYm90dG9tID0gZWw7CiAgICAgICAgfSwKICAgICAgICBpbnNlcnRhZnRlciA9IGZ1bmN0aW9uIChlbCwgZWwyLCBwYXBlcikgewogICAgICAgICAgICB0ZWFyKGVsLCBwYXBlcik7CiAgICAgICAgICAgIGVsMiA9PSBwYXBlci50b3AgJiYgKHBhcGVyLnRvcCA9IGVsKTsKICAgICAgICAgICAgZWwyLm5leHQgJiYgKGVsMi5uZXh0LnByZXYgPSBlbCk7CiAgICAgICAgICAgIGVsLm5leHQgPSBlbDIubmV4dDsKICAgICAgICAgICAgZWwucHJldiA9IGVsMjsKICAgICAgICAgICAgZWwyLm5leHQgPSBlbDsKICAgICAgICB9LAogICAgICAgIGluc2VydGJlZm9yZSA9IGZ1bmN0aW9uIChlbCwgZWwyLCBwYXBlcikgewogICAgICAgICAgICB0ZWFyKGVsLCBwYXBlcik7CiAgICAgICAgICAgIGVsMiA9PSBwYXBlci5ib3R0b20gJiYgKHBhcGVyLmJvdHRvbSA9IGVsKTsKICAgICAgICAgICAgZWwyLnByZXYgJiYgKGVsMi5wcmV2Lm5leHQgPSBlbCk7CiAgICAgICAgICAgIGVsLnByZXYgPSBlbDIucHJldjsKICAgICAgICAgICAgZWwyLnByZXYgPSBlbDsKICAgICAgICAgICAgZWwubmV4dCA9IGVsMjsKICAgICAgICB9LAogICAgICAgIHJlbW92ZWQgPSBmdW5jdGlvbiAobWV0aG9kbmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSYXBoYVx4ZWJsOiB5b3UgYXJlIGNhbGxpbmcgdG8gbWV0aG9kIFx1MjAxYyIgKyBtZXRob2RuYW1lICsgIlx1MjAxZCBvZiByZW1vdmVkIG9iamVjdCIpOwogICAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgcmFkaWFsX2dyYWRpZW50ID0gL15yKD86XCgoW14sXSs/KVxzKixccyooW15cKV0rPylcKSk/LzsKIAogICAgLy8gU1ZHCiAgICBpZiAoUi5zdmcpIHsKICAgICAgICBQYXBlcltwcm90b10uc3ZnbnMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciOwogICAgICAgIFBhcGVyW3Byb3RvXS54bGluayA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIjsKICAgICAgICByb3VuZCA9IGZ1bmN0aW9uIChudW0pIHsKICAgICAgICAgICAgcmV0dXJuICtudW0gKyAofn5udW0gPT09IG51bSkgKiAuNTsKICAgICAgICB9OwogICAgICAgIHZhciByb3VuZFBhdGggPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXRoW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobG93ZXJDYXNlLmNhbGwocGF0aFtpXVswXSkgIT0gImEiKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDEsIGpqID0gcGF0aFtpXVtsZW5ndGhdOyBqIDwgamo7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2ldW2pdID0gcm91bmQocGF0aFtpXVtqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwYXRoW2ldWzZdID0gcm91bmQocGF0aFtpXVs2XSk7CiAgICAgICAgICAgICAgICAgICAgcGF0aFtpXVs3XSA9IHJvdW5kKHBhdGhbaV1bN10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgIH0sCiAgICAgICAgJCA9IGZ1bmN0aW9uIChlbCwgYXR0cikgewogICAgICAgICAgICBpZiAoYXR0cikgewogICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cltoYXNdKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxbc2V0QXR0cmlidXRlXShrZXksIGF0dHJba2V5XSArIEUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudE5TKFBhcGVyW3Byb3RvXS5zdmducywgZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBSW3RvU3RyaW5nXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICAiWW91ciBicm93c2VyIHN1cHBvcnRzIFNWRy5cbllvdSBhcmUgcnVubmluZyBSYXBoYVx4ZWJsICIgKyB0aGlzLnZlcnNpb247CiAgICAgICAgfTsKICAgICAgICB2YXIgdGhlUGF0aCA9IGZ1bmN0aW9uIChwYXRoU3RyaW5nLCBTVkcpIHsKICAgICAgICAgICAgdmFyIGVsID0gJCgicGF0aCIpOwogICAgICAgICAgICBTVkcuY2FudmFzICYmIFNWRy5jYW52YXNbYXBwZW5kQ2hpbGRdKGVsKTsKICAgICAgICAgICAgdmFyIHAgPSBuZXcgRWxlbWVudChlbCwgU1ZHKTsKICAgICAgICAgICAgcC50eXBlID0gInBhdGgiOwogICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHAsIHtmaWxsOiAibm9uZSIsIHN0cm9rZTogIiMwMDAiLCBwYXRoOiBwYXRoU3RyaW5nfSk7CiAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH07CiAgICAgICAgdmFyIGFkZEdyYWRpZW50RmlsbCA9IGZ1bmN0aW9uIChvLCBncmFkaWVudCwgU1ZHKSB7CiAgICAgICAgICAgIHZhciB0eXBlID0gImxpbmVhciIsCiAgICAgICAgICAgICAgICBmeCA9IC41LCBmeSA9IC41LAogICAgICAgICAgICAgICAgcyA9IG8uc3R5bGU7CiAgICAgICAgICAgIGdyYWRpZW50ID0gKGdyYWRpZW50ICsgRSlbcnBdKHJhZGlhbF9ncmFkaWVudCwgZnVuY3Rpb24gKGFsbCwgX2Z4LCBfZnkpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSAicmFkaWFsIjsKICAgICAgICAgICAgICAgIGlmIChfZnggJiYgX2Z5KSB7CiAgICAgICAgICAgICAgICAgICAgZnggPSB0b0Zsb2F0KF9meCk7CiAgICAgICAgICAgICAgICAgICAgZnkgPSB0b0Zsb2F0KF9meSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpciA9ICgoZnkgPiAuNSkgKiAyIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgcG93KGZ4IC0gLjUsIDIpICsgcG93KGZ5IC0gLjUsIDIpID4gLjI1ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChmeSA9IG1hdGguc3FydCguMjUgLSBwb3coZnggLSAuNSwgMikpICogZGlyICsgLjUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGZ5ICE9IC41ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChmeSA9IGZ5LnRvRml4ZWQoNSkgLSAxZS01ICogZGlyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBFOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZ3JhZGllbnQgPSBncmFkaWVudFtzcGxpdF0oL1xzKlwtXHMqLyk7CiAgICAgICAgICAgIGlmICh0eXBlID09ICJsaW5lYXIiKSB7CiAgICAgICAgICAgICAgICB2YXIgYW5nbGUgPSBncmFkaWVudC5zaGlmdCgpOwogICAgICAgICAgICAgICAgYW5nbGUgPSAtdG9GbG9hdChhbmdsZSk7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oYW5nbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdmVjdG9yID0gWzAsIDAsIG1hdGguY29zKGFuZ2xlICogbWF0aC5QSSAvIDE4MCksIG1hdGguc2luKGFuZ2xlICogbWF0aC5QSSAvIDE4MCldLAogICAgICAgICAgICAgICAgICAgIG1heCA9IDEgLyAobW1heChtYXRoLmFicyh2ZWN0b3JbMl0pLCBtYXRoLmFicyh2ZWN0b3JbM10pKSB8fCAxKTsKICAgICAgICAgICAgICAgIHZlY3RvclsyXSAqPSBtYXg7CiAgICAgICAgICAgICAgICB2ZWN0b3JbM10gKj0gbWF4OwogICAgICAgICAgICAgICAgaWYgKHZlY3RvclsyXSA8IDApIHsKICAgICAgICAgICAgICAgICAgICB2ZWN0b3JbMF0gPSAtdmVjdG9yWzJdOwogICAgICAgICAgICAgICAgICAgIHZlY3RvclsyXSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodmVjdG9yWzNdIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHZlY3RvclsxXSA9IC12ZWN0b3JbM107CiAgICAgICAgICAgICAgICAgICAgdmVjdG9yWzNdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZG90cyA9IHBhcnNlRG90cyhncmFkaWVudCk7CiAgICAgICAgICAgIGlmICghZG90cykgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlkID0gby5nZXRBdHRyaWJ1dGUoImZpbGwiKTsKICAgICAgICAgICAgaWQgPSBpZC5tYXRjaCgvXnVybFwoIyguKilcKSQvKTsKICAgICAgICAgICAgaWQgJiYgU1ZHLmRlZnMucmVtb3ZlQ2hpbGQoZG9jLmdldEVsZW1lbnRCeUlkKGlkWzFdKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZWwgPSAkKHR5cGUgKyAiR3JhZGllbnQiKTsKICAgICAgICAgICAgZWwuaWQgPSAiciIgKyAoUi5faWQrKylbdG9TdHJpbmddKDM2KTsKICAgICAgICAgICAgJChlbCwgdHlwZSA9PSAicmFkaWFsIiA/IHtmeDogZngsIGZ5OiBmeX0gOiB7eDE6IHZlY3RvclswXSwgeTE6IHZlY3RvclsxXSwgeDI6IHZlY3RvclsyXSwgeTI6IHZlY3RvclszXX0pOwogICAgICAgICAgICBTVkcuZGVmc1thcHBlbmRDaGlsZF0oZWwpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb3RzW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RvcCA9ICQoInN0b3AiKTsKICAgICAgICAgICAgICAgICQoc3RvcCwgewogICAgICAgICAgICAgICAgICAgIG9mZnNldDogZG90c1tpXS5vZmZzZXQgPyBkb3RzW2ldLm9mZnNldCA6ICFpID8gIjAlIiA6ICIxMDAlIiwKICAgICAgICAgICAgICAgICAgICAic3RvcC1jb2xvciI6IGRvdHNbaV0uY29sb3IgfHwgIiNmZmYiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGVsW2FwcGVuZENoaWxkXShzdG9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkKG8sIHsKICAgICAgICAgICAgICAgIGZpbGw6ICJ1cmwoIyIgKyBlbC5pZCArICIpIiwKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAiZmlsbC1vcGFjaXR5IjogMQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcy5maWxsID0gRTsKICAgICAgICAgICAgcy5vcGFjaXR5ID0gMTsKICAgICAgICAgICAgcy5maWxsT3BhY2l0eSA9IDE7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH07CiAgICAgICAgdmFyIHVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgdmFyIGJib3ggPSBvLmdldEJCb3goKTsKICAgICAgICAgICAgJChvLnBhdHRlcm4sIHtwYXR0ZXJuVHJhbnNmb3JtOiBSLmZvcm1hdCgidHJhbnNsYXRlKHswfSx7MX0pIiwgYmJveC54LCBiYm94LnkpfSk7CiAgICAgICAgfTsKICAgICAgICB2YXIgc2V0RmlsbEFuZFN0cm9rZSA9IGZ1bmN0aW9uIChvLCBwYXJhbXMpIHsKICAgICAgICAgICAgdmFyIGRhc2hhcnJheSA9IHsKICAgICAgICAgICAgICAgICAgICAiIjogWzBdLAogICAgICAgICAgICAgICAgICAgICJub25lIjogWzBdLAogICAgICAgICAgICAgICAgICAgICItIjogWzMsIDFdLAogICAgICAgICAgICAgICAgICAgICIuIjogWzEsIDFdLAogICAgICAgICAgICAgICAgICAgICItLiI6IFszLCAxLCAxLCAxXSwKICAgICAgICAgICAgICAgICAgICAiLS4uIjogWzMsIDEsIDEsIDEsIDEsIDFdLAogICAgICAgICAgICAgICAgICAgICIuICI6IFsxLCAzXSwKICAgICAgICAgICAgICAgICAgICAiLSAiOiBbNCwgM10sCiAgICAgICAgICAgICAgICAgICAgIi0tIjogWzgsIDNdLAogICAgICAgICAgICAgICAgICAgICItIC4iOiBbNCwgMywgMSwgM10sCiAgICAgICAgICAgICAgICAgICAgIi0tLiI6IFs4LCAzLCAxLCAzXSwKICAgICAgICAgICAgICAgICAgICAiLS0uLiI6IFs4LCAzLCAxLCAzLCAxLCAzXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG5vZGUgPSBvLm5vZGUsCiAgICAgICAgICAgICAgICBhdHRycyA9IG8uYXR0cnMsCiAgICAgICAgICAgICAgICByb3QgPSBvLnJvdGF0ZSgpLAogICAgICAgICAgICAgICAgYWRkRGFzaGVzID0gZnVuY3Rpb24gKG8sIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXNoYXJyYXlbbG93ZXJDYXNlLmNhbGwodmFsdWUpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gby5hdHRyc1sic3Ryb2tlLXdpZHRoIl0gfHwgIjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dCA9IHtyb3VuZDogd2lkdGgsIHNxdWFyZTogd2lkdGgsIGJ1dHQ6IDB9W28uYXR0cnNbInN0cm9rZS1saW5lY2FwIl0gfHwgcGFyYW1zWyJzdHJva2UtbGluZWNhcCJdXSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGVzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdmFsdWVbbGVuZ3RoXTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGVzW2ldID0gdmFsdWVbaV0gKiB3aWR0aCArICgoaSAlIDIpID8gMSA6IC0xKSAqIGJ1dHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJChub2RlLCB7InN0cm9rZS1kYXNoYXJyYXkiOiBkYXNoZXNbam9pbl0oIiwiKX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtc1toYXNdKCJyb3RhdGlvbiIpICYmIChyb3QgPSBwYXJhbXMucm90YXRpb24pOwogICAgICAgICAgICB2YXIgcm90eHkgPSAocm90ICsgRSlbc3BsaXRdKHNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmICghKHJvdHh5Lmxlbmd0aCAtIDEpKSB7CiAgICAgICAgICAgICAgICByb3R4eSA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByb3R4eVsxXSA9ICtyb3R4eVsxXTsKICAgICAgICAgICAgICAgIHJvdHh5WzJdID0gK3JvdHh5WzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRvRmxvYXQocm90KSAmJiBvLnJvdGF0ZSgwLCB0cnVlKTsKICAgICAgICAgICAgZm9yICh2YXIgYXR0IGluIHBhcmFtcykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtc1toYXNdKGF0dCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUF0dHJzW2hhc10oYXR0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1zW2F0dF07CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYXR0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImJsdXIiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5ibHVyKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJyb3RhdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnJvdGF0ZSh2YWx1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSHlwZXJsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImhyZWYiOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0aXRsZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRhcmdldCI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG4gPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG93ZXJDYXNlLmNhbGwocG4udGFnTmFtZSkgIT0gImEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhsID0gJCgiYSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuLmluc2VydEJlZm9yZShobCwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxbYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuID0gaGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbi5zZXRBdHRyaWJ1dGVOUyhvLnBhcGVyLnhsaW5rLCBhdHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjdXJzb3IiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5jdXJzb3IgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGlwLXJlY3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlY3QgPSAodmFsdWUgKyBFKVtzcGxpdF0oc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWN0W2xlbmd0aF0gPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY2xpcCAmJiBvLmNsaXAucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8uY2xpcC5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSAkKCJjbGlwUGF0aCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICQoInJlY3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5pZCA9ICJyIiArIChSLl9pZCsrKVt0b1N0cmluZ10oMzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocmMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcmVjdFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcmVjdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3RbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcmVjdFszXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsW2FwcGVuZENoaWxkXShyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5wYXBlci5kZWZzW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChub2RlLCB7ImNsaXAtcGF0aCI6ICJ1cmwoIyIgKyBlbC5pZCArICIpIn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY2xpcCA9IHJjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGlwID0gZG9jLmdldEVsZW1lbnRCeUlkKG5vZGUuZ2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiKVtycF0oLyhedXJsXCgjfFwpJCkvZywgRSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgJiYgY2xpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsaXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobm9kZSwgeyJjbGlwLXBhdGgiOiBFfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG8uY2xpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInBhdGgiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8udHlwZSA9PSAicGF0aCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5vZGUsIHtkOiB2YWx1ZSA/IGF0dHJzLnBhdGggPSByb3VuZFBhdGgocGF0aFRvQWJzb2x1dGUodmFsdWUpKSA6ICJNMCwwIn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5meCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCA9ICJ4IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJzLng7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ4IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5meCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gLWF0dHJzLnggLSAoYXR0cnMud2lkdGggfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJ4IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHQgPT0gInJ4IiAmJiBvLnR5cGUgPT0gInJlY3QiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImN4IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdHh5ICYmIChhdHQgPT0gIngiIHx8IGF0dCA9PSAiY3giKSAmJiAocm90eHlbMV0gKz0gdmFsdWUgLSBhdHRyc1thdHRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIHJvdW5kKHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnBhdHRlcm4gJiYgdXBkYXRlUG9zaXRpb24obyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiaGVpZ2h0IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5meSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dCA9ICJ5IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJzLnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ5IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRycy5meSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gLWF0dHJzLnkgLSAoYXR0cnMuaGVpZ2h0IHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJyeSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ID09ICJyeSIgJiYgby50eXBlID09ICJyZWN0IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjeSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3R4eSAmJiAoYXR0ID09ICJ5IiB8fCBhdHQgPT0gImN5IikgJiYgKHJvdHh5WzJdICs9IHZhbHVlIC0gYXR0cnNbYXR0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlW3NldEF0dHJpYnV0ZV0oYXR0LCByb3VuZCh2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5wYXR0ZXJuICYmIHVwZGF0ZVBvc2l0aW9uKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInIiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8udHlwZSA9PSAicmVjdCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5vZGUsIHtyeDogdmFsdWUsIHJ5OiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlW3NldEF0dHJpYnV0ZV0oYXR0LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3JjIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLnR5cGUgPT0gImltYWdlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoby5wYXBlci54bGluaywgImhyZWYiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3Ryb2tlLXdpZHRoIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuc3Ryb2tlV2lkdGggPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgZm9sbG93aW5nIGxpbmUgZm9yIEZpcmVmb3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyc1sic3Ryb2tlLWRhc2hhcnJheSJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGFzaGVzKG8sIGF0dHJzWyJzdHJva2UtZGFzaGFycmF5Il0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInN0cm9rZS1kYXNoYXJyYXkiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGFzaGVzKG8sIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0cmFuc2xhdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeHkgPSAodmFsdWUgKyBFKVtzcGxpdF0oc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5WzBdID0gK3h5WzBdIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eVsxXSA9ICt4eVsxXSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdHh5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90eHlbMV0gKz0geHlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90eHlbMl0gKz0geHlbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUuY2FsbChvLCB4eVswXSwgeHlbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInNjYWxlIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5ID0gKHZhbHVlICsgRSlbc3BsaXRdKHNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnNjYWxlKCt4eVswXSB8fCAxLCAreHlbMV0gfHwgK3h5WzBdIHx8IDEsIGlzTmFOKHRvRmxvYXQoeHlbMl0pKSA/IG51bGwgOiAreHlbMl0sIGlzTmFOKHRvRmxvYXQoeHlbM10pKSA/IG51bGwgOiAreHlbM10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImZpbGwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzVVJMID0gKHZhbHVlICsgRSkubWF0Y2goSVNVUkwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVVJMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSAkKCJwYXR0ZXJuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlnID0gJCgiaW1hZ2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5pZCA9ICJyIiArIChSLl9pZCsrKVt0b1N0cmluZ10oMzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZWwsIHt4OiAwLCB5OiAwLCBwYXR0ZXJuVW5pdHM6ICJ1c2VyU3BhY2VPblVzZSIsIGhlaWdodDogMSwgd2lkdGg6IDF9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGlnLCB7eDogMCwgeTogMH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnLnNldEF0dHJpYnV0ZU5TKG8ucGFwZXIueGxpbmssICJocmVmIiwgaXNVUkxbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsW2FwcGVuZENoaWxkXShpZyk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1nID0gZG9jLmNyZWF0ZUVsZW1lbnQoImltZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3AtOTk5OWVtIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGVsLCB7d2lkdGg6IHRoaXMub2Zmc2V0V2lkdGgsIGhlaWdodDogdGhpcy5vZmZzZXRIZWlnaHR9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpZywge3dpZHRoOiB0aGlzLm9mZnNldFdpZHRoLCBoZWlnaHQ6IHRoaXMub2Zmc2V0SGVpZ2h0fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnBhcGVyLnNhZmFyaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLmJvZHlbYXBwZW5kQ2hpbGRdKGltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IGlzVVJMWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucGFwZXIuZGVmc1thcHBlbmRDaGlsZF0oZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuZmlsbCA9ICJ1cmwoIyIgKyBlbC5pZCArICIpIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG5vZGUsIHtmaWxsOiAidXJsKCMiICsgZWwuaWQgKyAiKSJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnBhdHRlcm4gPSBlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnBhdHRlcm4gJiYgdXBkYXRlUG9zaXRpb24obyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVIuZ2V0UkdCKHZhbHVlKS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuZ3JhZGllbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dHJzLmdyYWRpZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFSLmlzKGF0dHJzLm9wYWNpdHksICJ1bmRlZmluZWQiKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmlzKHBhcmFtcy5vcGFjaXR5LCAidW5kZWZpbmVkIikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChub2RlLCB7b3BhY2l0eTogYXR0cnMub3BhY2l0eX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFSLmlzKGF0dHJzWyJmaWxsLW9wYWNpdHkiXSwgInVuZGVmaW5lZCIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuaXMocGFyYW1zWyJmaWxsLW9wYWNpdHkiXSwgInVuZGVmaW5lZCIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobm9kZSwgeyJmaWxsLW9wYWNpdHkiOiBhdHRyc1siZmlsbC1vcGFjaXR5Il19KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCh7Y2lyY2xlOiAxLCBlbGxpcHNlOiAxfSlbaGFzXShvLnR5cGUpIHx8ICh2YWx1ZSArIEUpLmNoYXJBdCgpICE9ICJyIikgJiYgYWRkR3JhZGllbnRGaWxsKG5vZGUsIHZhbHVlLCBvLnBhcGVyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdyYWRpZW50ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZmlsbCA9ICJub25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3Ryb2tlIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIFIuZ2V0UkdCKHZhbHVlKS5oZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImdyYWRpZW50IjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoe2NpcmNsZTogMSwgZWxsaXBzZTogMX0pW2hhc10oby50eXBlKSB8fCAodmFsdWUgKyBFKS5jaGFyQXQoKSAhPSAiciIpICYmIGFkZEdyYWRpZW50RmlsbChub2RlLCB2YWx1ZSwgby5wYXBlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAib3BhY2l0eSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImZpbGwtb3BhY2l0eSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMuZ3JhZGllbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JhZGllbnQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQobm9kZS5nZXRBdHRyaWJ1dGUoImZpbGwiKVtycF0oL151cmxcKCN8XCkkL2csIEUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhZGllbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3BzID0gZ3JhZGllbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0b3AiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbc3RvcHNbbGVuZ3RoXSAtIDFdW3NldEF0dHJpYnV0ZV0oInN0b3Atb3BhY2l0eSIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQgPT0gImZvbnQtc2l6ZSIgJiYgKHZhbHVlID0gdG9JbnQodmFsdWUsIDEwKSArICJweCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzc3J1bGUgPSBhdHRbcnBdKC8oXC0uKS9nLCBmdW5jdGlvbiAodykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cHBlckNhc2UuY2FsbCh3LnN1YnN0cmluZygxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGVbY3NzcnVsZV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgZm9sbG93aW5nIGxpbmUgZm9yIEZpcmVmb3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbc2V0QXR0cmlidXRlXShhdHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdHVuZVRleHQobywgcGFyYW1zKTsKICAgICAgICAgICAgaWYgKHJvdHh5KSB7CiAgICAgICAgICAgICAgICBvLnJvdGF0ZShyb3R4eS5qb2luKFMpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRvRmxvYXQocm90KSAmJiBvLnJvdGF0ZShyb3QsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgbGVhZGluZyA9IDEuMiwKICAgICAgICB0dW5lVGV4dCA9IGZ1bmN0aW9uIChlbCwgcGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChlbC50eXBlICE9ICJ0ZXh0IiB8fCAhKHBhcmFtc1toYXNdKCJ0ZXh0IikgfHwgcGFyYW1zW2hhc10oImZvbnQiKSB8fCBwYXJhbXNbaGFzXSgiZm9udC1zaXplIikgfHwgcGFyYW1zW2hhc10oIngiKSB8fCBwYXJhbXNbaGFzXSgieSIpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhID0gZWwuYXR0cnMsCiAgICAgICAgICAgICAgICBub2RlID0gZWwubm9kZSwKICAgICAgICAgICAgICAgIGZvbnRTaXplID0gbm9kZS5maXJzdENoaWxkID8gdG9JbnQoZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZS5maXJzdENoaWxkLCBFKS5nZXRQcm9wZXJ0eVZhbHVlKCJmb250LXNpemUiKSwgMTApIDogMTA7CiAKICAgICAgICAgICAgaWYgKHBhcmFtc1toYXNdKCJ0ZXh0IikpIHsKICAgICAgICAgICAgICAgIGEudGV4dCA9IHBhcmFtcy50ZXh0OwogICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0ZXh0cyA9IChwYXJhbXMudGV4dCArIEUpW3NwbGl0XSgiXG4iKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRleHRzW2xlbmd0aF07IGkgPCBpaTsgaSsrKSBpZiAodGV4dHNbaV0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdHNwYW4gPSAkKCJ0c3BhbiIpOwogICAgICAgICAgICAgICAgICAgIGkgJiYgJCh0c3Bhbiwge2R5OiBmb250U2l6ZSAqIGxlYWRpbmcsIHg6IGEueH0pOwogICAgICAgICAgICAgICAgICAgIHRzcGFuW2FwcGVuZENoaWxkXShkb2MuY3JlYXRlVGV4dE5vZGUodGV4dHNbaV0pKTsKICAgICAgICAgICAgICAgICAgICBub2RlW2FwcGVuZENoaWxkXSh0c3Bhbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0ZXh0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRzcGFuIik7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHRleHRzW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaSAmJiAkKHRleHRzW2ldLCB7ZHk6IGZvbnRTaXplICogbGVhZGluZywgeDogYS54fSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJChub2RlLCB7eTogYS55fSk7CiAgICAgICAgICAgIHZhciBiYiA9IGVsLmdldEJCb3goKSwKICAgICAgICAgICAgICAgIGRpZiA9IGEueSAtIChiYi55ICsgYmIuaGVpZ2h0IC8gMik7CiAgICAgICAgICAgIGRpZiAmJiBpc0Zpbml0ZShkaWYpICYmICQobm9kZSwge3k6IGEueSArIGRpZn0pOwogICAgICAgIH0sCiAgICAgICAgRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBzdmcpIHsKICAgICAgICAgICAgdmFyIFggPSAwLAogICAgICAgICAgICAgICAgWSA9IDA7CiAgICAgICAgICAgIHRoaXNbMF0gPSBub2RlOwogICAgICAgICAgICB0aGlzLmlkID0gUi5fb2lkKys7CiAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICAgICAgICAgIG5vZGUucmFwaGFlbCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMucGFwZXIgPSBzdmc7CiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSB0aGlzLmF0dHJzIHx8IHt9OwogICAgICAgICAgICB0aGlzLnRyYW5zZm9ybWF0aW9ucyA9IFtdOyAvLyByb3RhdGUsIHRyYW5zbGF0ZSwgc2NhbGUKICAgICAgICAgICAgdGhpcy5fID0gewogICAgICAgICAgICAgICAgdHg6IDAsCiAgICAgICAgICAgICAgICB0eTogMCwKICAgICAgICAgICAgICAgIHJ0OiB7ZGVnOiAwLCBjeDogMCwgY3k6IDB9LAogICAgICAgICAgICAgICAgc3g6IDEsCiAgICAgICAgICAgICAgICBzeTogMQogICAgICAgICAgICB9OwogICAgICAgICAgICAhc3ZnLmJvdHRvbSAmJiAoc3ZnLmJvdHRvbSA9IHRoaXMpOwogICAgICAgICAgICB0aGlzLnByZXYgPSBzdmcudG9wOwogICAgICAgICAgICBzdmcudG9wICYmIChzdmcudG9wLm5leHQgPSB0aGlzKTsKICAgICAgICAgICAgc3ZnLnRvcCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMubmV4dCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS5yb3RhdGUgPSBmdW5jdGlvbiAoZGVnLCBjeCwgY3kpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fLnJ0LmN4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl8ucnQuZGVnLCB0aGlzLl8ucnQuY3gsIHRoaXMuXy5ydC5jeV1bam9pbl0oUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fLnJ0LmRlZzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYmJveCA9IHRoaXMuZ2V0QkJveCgpOwogICAgICAgICAgICBkZWcgPSAoZGVnICsgRSlbc3BsaXRdKHNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmIChkZWdbbGVuZ3RoXSAtIDEpIHsKICAgICAgICAgICAgICAgIGN4ID0gdG9GbG9hdChkZWdbMV0pOwogICAgICAgICAgICAgICAgY3kgPSB0b0Zsb2F0KGRlZ1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVnID0gdG9GbG9hdChkZWdbMF0pOwogICAgICAgICAgICBpZiAoY3ggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fLnJ0LmRlZyA9IGRlZzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuXy5ydC5kZWcgKz0gZGVnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIChjeSA9PSBudWxsKSAmJiAoY3ggPSBudWxsKTsKICAgICAgICAgICAgdGhpcy5fLnJ0LmN4ID0gY3g7CiAgICAgICAgICAgIHRoaXMuXy5ydC5jeSA9IGN5OwogICAgICAgICAgICBjeCA9IGN4ID09IG51bGwgPyBiYm94LnggKyBiYm94LndpZHRoIC8gMiA6IGN4OwogICAgICAgICAgICBjeSA9IGN5ID09IG51bGwgPyBiYm94LnkgKyBiYm94LmhlaWdodCAvIDIgOiBjeTsKICAgICAgICAgICAgaWYgKHRoaXMuXy5ydC5kZWcpIHsKICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtYXRpb25zWzBdID0gUi5mb3JtYXQoInJvdGF0ZSh7MH0gezF9IHsyfSkiLCB0aGlzLl8ucnQuZGVnLCBjeCwgY3kpOwogICAgICAgICAgICAgICAgdGhpcy5jbGlwICYmICQodGhpcy5jbGlwLCB7dHJhbnNmb3JtOiBSLmZvcm1hdCgicm90YXRlKHswfSB7MX0gezJ9KSIsIC10aGlzLl8ucnQuZGVnLCBjeCwgY3kpfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybWF0aW9uc1swXSA9IEU7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXAgJiYgJCh0aGlzLmNsaXAsIHt0cmFuc2Zvcm06IEV9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkKHRoaXMubm9kZSwge3RyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm1hdGlvbnNbam9pbl0oUyl9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS5oaWRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAhdGhpcy5yZW1vdmVkICYmICh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uc2hvdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgIXRoaXMucmVtb3ZlZCAmJiAodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXkgPSAiIik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10ucmVtb3ZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVhcih0aGlzLCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgdGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1tpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlbW92ZWQgPSB0cnVlOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uZ2V0QkJveCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAicGF0aCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwYXRoRGltZW5zaW9ucyh0aGlzLmF0dHJzLnBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpOwogICAgICAgICAgICAgICAgdmFyIGhpZGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBiYm94ID0ge307CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBiYm94ID0gdGhpcy5ub2RlLmdldEJCb3goKTsKICAgICAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IDMuMC54IHBsYXlzIGJhZGx5IGhlcmUKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGJib3ggPSBiYm94IHx8IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gInRleHQiKSB7CiAgICAgICAgICAgICAgICBiYm94ID0ge3g6IGJib3gueCwgeTogSW5maW5pdHksIHdpZHRoOiAwLCBoZWlnaHQ6IDB9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5ub2RlLmdldE51bWJlck9mQ2hhcnMoKTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmIgPSB0aGlzLm5vZGUuZ2V0RXh0ZW50T2ZDaGFyKGkpOwogICAgICAgICAgICAgICAgICAgIChiYi55IDwgYmJveC55KSAmJiAoYmJveC55ID0gYmIueSk7CiAgICAgICAgICAgICAgICAgICAgKGJiLnkgKyBiYi5oZWlnaHQgLSBiYm94LnkgPiBiYm94LmhlaWdodCkgJiYgKGJib3guaGVpZ2h0ID0gYmIueSArIGJiLmhlaWdodCAtIGJib3gueSk7CiAgICAgICAgICAgICAgICAgICAgKGJiLnggKyBiYi53aWR0aCAtIGJib3gueCA+IGJib3gud2lkdGgpICYmIChiYm94LndpZHRoID0gYmIueCArIGJiLndpZHRoIC0gYmJveC54KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoaWRlICYmIHRoaXMuaGlkZSgpOwogICAgICAgICAgICByZXR1cm4gYmJveDsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLmF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmF0dHJzKSBpZiAodGhpcy5hdHRyc1toYXNdKGkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gdGhpcy5hdHRyc1tpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuXy5ydC5kZWcgJiYgKHJlcy5yb3RhdGlvbiA9IHRoaXMucm90YXRlKCkpOwogICAgICAgICAgICAgICAgKHRoaXMuXy5zeCAhPSAxIHx8IHRoaXMuXy5zeSAhPSAxKSAmJiAocmVzLnNjYWxlID0gdGhpcy5zY2FsZSgpKTsKICAgICAgICAgICAgICAgIHJlcy5ncmFkaWVudCAmJiByZXMuZmlsbCA9PSAibm9uZSIgJiYgKHJlcy5maWxsID0gcmVzLmdyYWRpZW50KSAmJiBkZWxldGUgcmVzLmdyYWRpZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBSLmlzKG5hbWUsICJzdHJpbmciKSkgewogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gInRyYW5zbGF0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJyb3RhdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJzY2FsZSIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gImZpbGwiICYmIHRoaXMuYXR0cnMuZmlsbCA9PSAibm9uZSIgJiYgdGhpcy5hdHRycy5ncmFkaWVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dHJzLmdyYWRpZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0cnNbbmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgUi5pcyhuYW1lLCAiYXJyYXkiKSkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gbmFtZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW25hbWVbal1dID0gdGhpcy5hdHRyKG5hbWVbal0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHRoaXMsIHBhcmFtcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsICYmIFIuaXMobmFtZSwgIm9iamVjdCIpKSB7CiAgICAgICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHRoaXMsIG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10udG9Gcm9udCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ub2RlLnBhcmVudE5vZGVbYXBwZW5kQ2hpbGRdKHRoaXMubm9kZSk7CiAgICAgICAgICAgIHZhciBzdmcgPSB0aGlzLnBhcGVyOwogICAgICAgICAgICBzdmcudG9wICE9IHRoaXMgJiYgdG9mcm9udCh0aGlzLCBzdmcpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLnRvQmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQgIT0gdGhpcy5ub2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLCB0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIHRvYmFjayh0aGlzLCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgICAgIHZhciBzdmcgPSB0aGlzLnBhcGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkgewogICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9kZSA9IGVsZW1lbnQubm9kZTsKICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLCBub2RlLm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZVthcHBlbmRDaGlsZF0odGhpcy5ub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnNlcnRhZnRlcih0aGlzLCBlbGVtZW50LCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAoZWxlbWVudCkgewogICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbm9kZSA9IGVsZW1lbnQubm9kZTsKICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsIG5vZGUpOwogICAgICAgICAgICBpbnNlcnRiZWZvcmUodGhpcywgZWxlbWVudCwgdGhpcy5wYXBlcik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uYmx1ciA9IGZ1bmN0aW9uIChzaXplKSB7CiAgICAgICAgICAgIC8vIEV4cGVyaW1lbnRhbC4gTm8gU2FmYXJpIHN1cHBvcnQuIFVzZSBpdCBvbiB5b3VyIG93biByaXNrLgogICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgIGlmICgrc2l6ZSAhPT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGZsdHIgPSAkKCJmaWx0ZXIiKSwKICAgICAgICAgICAgICAgICAgICBibHVyID0gJCgiZmVHYXVzc2lhbkJsdXIiKTsKICAgICAgICAgICAgICAgIHQuYXR0cnMuYmx1ciA9IHNpemU7CiAgICAgICAgICAgICAgICBmbHRyLmlkID0gInIiICsgKFIuX2lkKyspW3RvU3RyaW5nXSgzNik7CiAgICAgICAgICAgICAgICAkKGJsdXIsIHtzdGREZXZpYXRpb246ICtzaXplIHx8IDEuNX0pOwogICAgICAgICAgICAgICAgZmx0ci5hcHBlbmRDaGlsZChibHVyKTsKICAgICAgICAgICAgICAgIHQucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChmbHRyKTsKICAgICAgICAgICAgICAgIHQuX2JsdXIgPSBmbHRyOwogICAgICAgICAgICAgICAgJCh0Lm5vZGUsIHtmaWx0ZXI6ICJ1cmwoIyIgKyBmbHRyLmlkICsgIikifSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodC5fYmx1cikgewogICAgICAgICAgICAgICAgICAgIHQuX2JsdXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0Ll9ibHVyKTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdC5fYmx1cjsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdC5hdHRycy5ibHVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5ub2RlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciB0aGVDaXJjbGUgPSBmdW5jdGlvbiAoc3ZnLCB4LCB5LCByKSB7CiAgICAgICAgICAgIHggPSByb3VuZCh4KTsKICAgICAgICAgICAgeSA9IHJvdW5kKHkpOwogICAgICAgICAgICB2YXIgZWwgPSAkKCJjaXJjbGUiKTsKICAgICAgICAgICAgc3ZnLmNhbnZhcyAmJiBzdmcuY2FudmFzW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRWxlbWVudChlbCwgc3ZnKTsKICAgICAgICAgICAgcmVzLmF0dHJzID0ge2N4OiB4LCBjeTogeSwgcjogciwgZmlsbDogIm5vbmUiLCBzdHJva2U6ICIjMDAwIn07CiAgICAgICAgICAgIHJlcy50eXBlID0gImNpcmNsZSI7CiAgICAgICAgICAgICQoZWwsIHJlcy5hdHRycyk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgICAgICB2YXIgdGhlUmVjdCA9IGZ1bmN0aW9uIChzdmcsIHgsIHksIHcsIGgsIHIpIHsKICAgICAgICAgICAgeCA9IHJvdW5kKHgpOwogICAgICAgICAgICB5ID0gcm91bmQoeSk7CiAgICAgICAgICAgIHZhciBlbCA9ICQoInJlY3QiKTsKICAgICAgICAgICAgc3ZnLmNhbnZhcyAmJiBzdmcuY2FudmFzW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRWxlbWVudChlbCwgc3ZnKTsKICAgICAgICAgICAgcmVzLmF0dHJzID0ge3g6IHgsIHk6IHksIHdpZHRoOiB3LCBoZWlnaHQ6IGgsIHI6IHIgfHwgMCwgcng6IHIgfHwgMCwgcnk6IHIgfHwgMCwgZmlsbDogIm5vbmUiLCBzdHJva2U6ICIjMDAwIn07CiAgICAgICAgICAgIHJlcy50eXBlID0gInJlY3QiOwogICAgICAgICAgICAkKGVsLCByZXMuYXR0cnMpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH07CiAgICAgICAgdmFyIHRoZUVsbGlwc2UgPSBmdW5jdGlvbiAoc3ZnLCB4LCB5LCByeCwgcnkpIHsKICAgICAgICAgICAgeCA9IHJvdW5kKHgpOwogICAgICAgICAgICB5ID0gcm91bmQoeSk7CiAgICAgICAgICAgIHZhciBlbCA9ICQoImVsbGlwc2UiKTsKICAgICAgICAgICAgc3ZnLmNhbnZhcyAmJiBzdmcuY2FudmFzW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRWxlbWVudChlbCwgc3ZnKTsKICAgICAgICAgICAgcmVzLmF0dHJzID0ge2N4OiB4LCBjeTogeSwgcng6IHJ4LCByeTogcnksIGZpbGw6ICJub25lIiwgc3Ryb2tlOiAiIzAwMCJ9OwogICAgICAgICAgICByZXMudHlwZSA9ICJlbGxpcHNlIjsKICAgICAgICAgICAgJChlbCwgcmVzLmF0dHJzKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIHZhciB0aGVJbWFnZSA9IGZ1bmN0aW9uIChzdmcsIHNyYywgeCwgeSwgdywgaCkgewogICAgICAgICAgICB2YXIgZWwgPSAkKCJpbWFnZSIpOwogICAgICAgICAgICAkKGVsLCB7eDogeCwgeTogeSwgd2lkdGg6IHcsIGhlaWdodDogaCwgcHJlc2VydmVBc3BlY3RSYXRpbzogIm5vbmUifSk7CiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHN2Zy54bGluaywgImhyZWYiLCBzcmMpOwogICAgICAgICAgICBzdmcuY2FudmFzICYmIHN2Zy5jYW52YXNbYXBwZW5kQ2hpbGRdKGVsKTsKICAgICAgICAgICAgdmFyIHJlcyA9IG5ldyBFbGVtZW50KGVsLCBzdmcpOwogICAgICAgICAgICByZXMuYXR0cnMgPSB7eDogeCwgeTogeSwgd2lkdGg6IHcsIGhlaWdodDogaCwgc3JjOiBzcmN9OwogICAgICAgICAgICByZXMudHlwZSA9ICJpbWFnZSI7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgICAgICB2YXIgdGhlVGV4dCA9IGZ1bmN0aW9uIChzdmcsIHgsIHksIHRleHQpIHsKICAgICAgICAgICAgdmFyIGVsID0gJCgidGV4dCIpOwogICAgICAgICAgICAkKGVsLCB7eDogeCwgeTogeSwgInRleHQtYW5jaG9yIjogIm1pZGRsZSJ9KTsKICAgICAgICAgICAgc3ZnLmNhbnZhcyAmJiBzdmcuY2FudmFzW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRWxlbWVudChlbCwgc3ZnKTsKICAgICAgICAgICAgcmVzLmF0dHJzID0ge3g6IHgsIHk6IHksICJ0ZXh0LWFuY2hvciI6ICJtaWRkbGUiLCB0ZXh0OiB0ZXh0LCBmb250OiBhdmFpbGFibGVBdHRycy5mb250LCBzdHJva2U6ICJub25lIiwgZmlsbDogIiMwMDAifTsKICAgICAgICAgICAgcmVzLnR5cGUgPSAidGV4dCI7CiAgICAgICAgICAgIHNldEZpbGxBbmRTdHJva2UocmVzLCByZXMuYXR0cnMpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH07CiAgICAgICAgdmFyIHNldFNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggfHwgdGhpcy53aWR0aDsKICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgfHwgdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuY2FudmFzW3NldEF0dHJpYnV0ZV0oIndpZHRoIiwgdGhpcy53aWR0aCk7CiAgICAgICAgICAgIHRoaXMuY2FudmFzW3NldEF0dHJpYnV0ZV0oImhlaWdodCIsIHRoaXMuaGVpZ2h0KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICB2YXIgY3JlYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY29uID0gZ2V0Q29udGFpbmVyW2FwcGx5XSgwLCBhcmd1bWVudHMpLAogICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29uICYmIGNvbi5jb250YWluZXIsCiAgICAgICAgICAgICAgICB4ID0gY29uLngsCiAgICAgICAgICAgICAgICB5ID0gY29uLnksCiAgICAgICAgICAgICAgICB3aWR0aCA9IGNvbi53aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodCA9IGNvbi5oZWlnaHQ7CiAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlNWRyBjb250YWluZXIgbm90IGZvdW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjbnZzID0gJCgic3ZnIik7CiAgICAgICAgICAgIHdpZHRoID0gd2lkdGggfHwgNTEyOwogICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHQgfHwgMzQyOwogICAgICAgICAgICAkKGNudnMsIHsKICAgICAgICAgICAgICAgIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgICAgICAgICAgICAgdmVyc2lvbjogMS4xLAogICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gMSkgewogICAgICAgICAgICAgICAgY252cy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6IiArIHggKyAicHg7dG9wOiIgKyB5ICsgInB4IjsKICAgICAgICAgICAgICAgIGRvYy5ib2R5W2FwcGVuZENoaWxkXShjbnZzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY252cywgY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbYXBwZW5kQ2hpbGRdKGNudnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRhaW5lciA9IG5ldyBQYXBlcjsKICAgICAgICAgICAgY29udGFpbmVyLndpZHRoID0gd2lkdGg7CiAgICAgICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIGNvbnRhaW5lci5jYW52YXMgPSBjbnZzOwogICAgICAgICAgICBwbHVnaW5zLmNhbGwoY29udGFpbmVyLCBjb250YWluZXIsIFIuZm4pOwogICAgICAgICAgICBjb250YWluZXIuY2xlYXIoKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgICAgICB9OwogICAgICAgIFBhcGVyW3Byb3RvXS5jbGVhciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmNhbnZhczsKICAgICAgICAgICAgd2hpbGUgKGMuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gdGhpcy50b3AgPSBudWxsOwogICAgICAgICAgICAodGhpcy5kZXNjID0gJCgiZGVzYyIpKVthcHBlbmRDaGlsZF0oZG9jLmNyZWF0ZVRleHROb2RlKCJDcmVhdGVkIHdpdGggUmFwaGFceGVibCIpKTsKICAgICAgICAgICAgY1thcHBlbmRDaGlsZF0odGhpcy5kZXNjKTsKICAgICAgICAgICAgY1thcHBlbmRDaGlsZF0odGhpcy5kZWZzID0gJCgiZGVmcyIpKTsKICAgICAgICB9OwogICAgICAgIFBhcGVyW3Byb3RvXS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUgJiYgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykgewogICAgICAgICAgICAgICAgdGhpc1tpXSA9IHJlbW92ZWQoaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKICAgIC8vIFZNTAogICAgaWYgKFIudm1sKSB7CiAgICAgICAgdmFyIG1hcCA9IHtNOiAibSIsIEw6ICJsIiwgQzogImMiLCBaOiAieCIsIG06ICJ0IiwgbDogInIiLCBjOiAidiIsIHo6ICJ4In0sCiAgICAgICAgICAgIGJpdGVzID0gLyhbY2xtel0pLD8oW15jbG16XSopL2dpLAogICAgICAgICAgICB2YWwgPSAvLT9bXixccy1dKy9nLAogICAgICAgICAgICBjb29yZHNpemUgPSAxZTMgKyBTICsgMWUzLAogICAgICAgICAgICB6b29tID0gMTAsCiAgICAgICAgICAgIHBhdGgydm1sID0gZnVuY3Rpb24gKHBhdGgpIHsKICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9ICAvW2FocXN0dl0vaWcsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHBhdGhUb0Fic29sdXRlOwogICAgICAgICAgICAgICAgKHBhdGggKyBFKS5tYXRjaCh0b3RhbCkgJiYgKGNvbW1hbmQgPSBwYXRoMmN1cnZlKTsKICAgICAgICAgICAgICAgIHRvdGFsID0gL1tjbG16XS9nOwogICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gcGF0aFRvQWJzb2x1dGUgJiYgIShwYXRoICsgRSkubWF0Y2godG90YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IChwYXRoICsgRSlbcnBdKGJpdGVzLCBmdW5jdGlvbiAoYWxsLCBjb21tYW5kLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSBsb3dlckNhc2UuY2FsbChjb21tYW5kKSA9PSAibSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBtYXBbY29tbWFuZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbcnBdKHZhbCwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNb3ZlICYmIHZhbHNbbGVuZ3RoXSA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IHZhbHMgKyBtYXBbY29tbWFuZCA9PSAibSIgPyAibCIgOiAiTCJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbcHVzaF0ocm91bmQodmFsdWUgKiB6b29tKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzICsgdmFsczsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHBhID0gY29tbWFuZChwYXRoKSwgcCwgcjsKICAgICAgICAgICAgICAgIHJlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGFbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBwID0gcGFbaV07CiAgICAgICAgICAgICAgICAgICAgciA9IGxvd2VyQ2FzZS5jYWxsKHBhW2ldWzBdKTsKICAgICAgICAgICAgICAgICAgICByID09ICJ6IiAmJiAociA9ICJ4Iik7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDEsIGpqID0gcFtsZW5ndGhdOyBqIDwgamo7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICByICs9IHJvdW5kKHBbal0gKiB6b29tKSArIChqICE9IGpqIC0gMSA/ICIsIiA6IEUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNbcHVzaF0ocik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzW2pvaW5dKFMpOwogICAgICAgICAgICB9OwogICAgICAgIAogICAgICAgIFJbdG9TdHJpbmddID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gICJZb3VyIGJyb3dzZXIgZG9lc25cdTIwMTl0IHN1cHBvcnQgU1ZHLiBGYWxsaW5nIGRvd24gdG8gVk1MLlxuWW91IGFyZSBydW5uaW5nIFJhcGhhXHhlYmwgIiArIHRoaXMudmVyc2lvbjsKICAgICAgICB9OwogICAgICAgIHRoZVBhdGggPSBmdW5jdGlvbiAocGF0aFN0cmluZywgdm1sKSB7CiAgICAgICAgICAgIHZhciBnID0gY3JlYXRlTm9kZSgiZ3JvdXAiKTsKICAgICAgICAgICAgZy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoiICsgdm1sLndpZHRoICsgInB4O2hlaWdodDoiICsgdm1sLmhlaWdodCArICJweCI7CiAgICAgICAgICAgIGcuY29vcmRzaXplID0gdm1sLmNvb3Jkc2l6ZTsKICAgICAgICAgICAgZy5jb29yZG9yaWdpbiA9IHZtbC5jb29yZG9yaWdpbjsKICAgICAgICAgICAgdmFyIGVsID0gY3JlYXRlTm9kZSgic2hhcGUiKSwgb2wgPSBlbC5zdHlsZTsKICAgICAgICAgICAgb2wud2lkdGggPSB2bWwud2lkdGggKyAicHgiOwogICAgICAgICAgICBvbC5oZWlnaHQgPSB2bWwuaGVpZ2h0ICsgInB4IjsKICAgICAgICAgICAgZWwuY29vcmRzaXplID0gY29vcmRzaXplOwogICAgICAgICAgICBlbC5jb29yZG9yaWdpbiA9IHZtbC5jb29yZG9yaWdpbjsKICAgICAgICAgICAgZ1thcHBlbmRDaGlsZF0oZWwpOwogICAgICAgICAgICB2YXIgcCA9IG5ldyBFbGVtZW50KGVsLCBnLCB2bWwpLAogICAgICAgICAgICAgICAgYXR0ciA9IHtmaWxsOiAibm9uZSIsIHN0cm9rZTogIiMwMDAifTsKICAgICAgICAgICAgcGF0aFN0cmluZyAmJiAoYXR0ci5wYXRoID0gcGF0aFN0cmluZyk7CiAgICAgICAgICAgIHAuaXNBYnNvbHV0ZSA9IHRydWU7CiAgICAgICAgICAgIHAudHlwZSA9ICJwYXRoIjsKICAgICAgICAgICAgcC5wYXRoID0gW107CiAgICAgICAgICAgIHAuUGF0aCA9IEU7CiAgICAgICAgICAgIHNldEZpbGxBbmRTdHJva2UocCwgYXR0cik7CiAgICAgICAgICAgIHZtbC5jYW52YXNbYXBwZW5kQ2hpbGRdKGcpOwogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9OwogICAgICAgIHNldEZpbGxBbmRTdHJva2UgPSBmdW5jdGlvbiAobywgcGFyYW1zKSB7CiAgICAgICAgICAgIG8uYXR0cnMgPSBvLmF0dHJzIHx8IHt9OwogICAgICAgICAgICB2YXIgbm9kZSA9IG8ubm9kZSwKICAgICAgICAgICAgICAgIGEgPSBvLmF0dHJzLAogICAgICAgICAgICAgICAgcyA9IG5vZGUuc3R5bGUsCiAgICAgICAgICAgICAgICB4eSwKICAgICAgICAgICAgICAgIHJlcyA9IG87CiAgICAgICAgICAgIGZvciAodmFyIHBhciBpbiBwYXJhbXMpIGlmIChwYXJhbXNbaGFzXShwYXIpKSB7CiAgICAgICAgICAgICAgICBhW3Bhcl0gPSBwYXJhbXNbcGFyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbXMuaHJlZiAmJiAobm9kZS5ocmVmID0gcGFyYW1zLmhyZWYpOwogICAgICAgICAgICBwYXJhbXMudGl0bGUgJiYgKG5vZGUudGl0bGUgPSBwYXJhbXMudGl0bGUpOwogICAgICAgICAgICBwYXJhbXMudGFyZ2V0ICYmIChub2RlLnRhcmdldCA9IHBhcmFtcy50YXJnZXQpOwogICAgICAgICAgICBwYXJhbXMuY3Vyc29yICYmIChzLmN1cnNvciA9IHBhcmFtcy5jdXJzb3IpOwogICAgICAgICAgICAiYmx1ciIgaW4gcGFyYW1zICYmIG8uYmx1cihwYXJhbXMuYmx1cik7CiAgICAgICAgICAgIGlmIChwYXJhbXMucGF0aCAmJiBvLnR5cGUgPT0gInBhdGgiKSB7CiAgICAgICAgICAgICAgICBhLnBhdGggPSBwYXJhbXMucGF0aDsKICAgICAgICAgICAgICAgIG5vZGUucGF0aCA9IHBhdGgydm1sKGEucGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtcy5yb3RhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBvLnJvdGF0ZShwYXJhbXMucm90YXRpb24sIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJhbXMudHJhbnNsYXRpb24pIHsKICAgICAgICAgICAgICAgIHh5ID0gKHBhcmFtcy50cmFuc2xhdGlvbiArIEUpW3NwbGl0XShzZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgdHJhbnNsYXRlLmNhbGwobywgeHlbMF0sIHh5WzFdKTsKICAgICAgICAgICAgICAgIGlmIChvLl8ucnQuY3ggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG8uXy5ydC5jeCArPSsgeHlbMF07CiAgICAgICAgICAgICAgICAgICAgby5fLnJ0LmN5ICs9KyB4eVsxXTsKICAgICAgICAgICAgICAgICAgICBvLnNldEJveChvLmF0dHJzLCB4eVswXSwgeHlbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJhbXMuc2NhbGUpIHsKICAgICAgICAgICAgICAgIHh5ID0gKHBhcmFtcy5zY2FsZSArIEUpW3NwbGl0XShzZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgby5zY2FsZSgreHlbMF0gfHwgMSwgK3h5WzFdIHx8ICt4eVswXSB8fCAxLCAreHlbMl0gfHwgbnVsbCwgK3h5WzNdIHx8IG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgiY2xpcC1yZWN0IiBpbiBwYXJhbXMpIHsKICAgICAgICAgICAgICAgIHZhciByZWN0ID0gKHBhcmFtc1siY2xpcC1yZWN0Il0gKyBFKVtzcGxpdF0oc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgIGlmIChyZWN0W2xlbmd0aF0gPT0gNCkgewogICAgICAgICAgICAgICAgICAgIHJlY3RbMl0gPSArcmVjdFsyXSArICgrcmVjdFswXSk7CiAgICAgICAgICAgICAgICAgICAgcmVjdFszXSA9ICtyZWN0WzNdICsgKCtyZWN0WzFdKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGl2ID0gbm9kZS5jbGlwUmVjdCB8fCBkb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksCiAgICAgICAgICAgICAgICAgICAgICAgIGRzdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgZHN0eWxlLmNsaXAgPSBSLmZvcm1hdCgicmVjdCh7MX1weCB7Mn1weCB7M31weCB7MH1weCkiLCByZWN0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuY2xpcFJlY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICAgICAgICAgICAgICAgICAgZHN0eWxlLnRvcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRzdHlsZS5sZWZ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZHN0eWxlLndpZHRoID0gby5wYXBlci53aWR0aCArICJweCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRzdHlsZS5oZWlnaHQgPSBvLnBhcGVyLmhlaWdodCArICJweCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZ3JvdXApOwogICAgICAgICAgICAgICAgICAgICAgICBkaXZbYXBwZW5kQ2hpbGRdKGdyb3VwKTsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jbGlwUmVjdCA9IGRpdjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1siY2xpcC1yZWN0Il0pIHsKICAgICAgICAgICAgICAgICAgICBub2RlLmNsaXBSZWN0ICYmIChub2RlLmNsaXBSZWN0LnN0eWxlLmNsaXAgPSBFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoby50eXBlID09ICJpbWFnZSIgJiYgcGFyYW1zLnNyYykgewogICAgICAgICAgICAgICAgbm9kZS5zcmMgPSBwYXJhbXMuc3JjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvLnR5cGUgPT0gImltYWdlIiAmJiBwYXJhbXMub3BhY2l0eSkgewogICAgICAgICAgICAgICAgbm9kZS5maWx0ZXJPcGFjaXR5ID0gIiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEob3BhY2l0eT0iICsgKHBhcmFtcy5vcGFjaXR5ICogMTAwKSArICIpIjsKICAgICAgICAgICAgICAgIHMuZmlsdGVyID0gKG5vZGUuZmlsdGVyTWF0cml4IHx8IEUpICsgKG5vZGUuZmlsdGVyT3BhY2l0eSB8fCBFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbXMuZm9udCAmJiAocy5mb250ID0gcGFyYW1zLmZvbnQpOwogICAgICAgICAgICBwYXJhbXNbImZvbnQtZmFtaWx5Il0gJiYgKHMuZm9udEZhbWlseSA9ICciJyArIHBhcmFtc1siZm9udC1mYW1pbHkiXVtzcGxpdF0oIiwiKVswXVtycF0oL15bJyJdK3xbJyJdKyQvZywgRSkgKyAnIicpOwogICAgICAgICAgICBwYXJhbXNbImZvbnQtc2l6ZSJdICYmIChzLmZvbnRTaXplID0gcGFyYW1zWyJmb250LXNpemUiXSk7CiAgICAgICAgICAgIHBhcmFtc1siZm9udC13ZWlnaHQiXSAmJiAocy5mb250V2VpZ2h0ID0gcGFyYW1zWyJmb250LXdlaWdodCJdKTsKICAgICAgICAgICAgcGFyYW1zWyJmb250LXN0eWxlIl0gJiYgKHMuZm9udFN0eWxlID0gcGFyYW1zWyJmb250LXN0eWxlIl0pOwogICAgICAgICAgICBpZiAocGFyYW1zLm9wYWNpdHkgIT0gbnVsbCB8fCAKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLXdpZHRoIl0gIT0gbnVsbCB8fAogICAgICAgICAgICAgICAgcGFyYW1zLmZpbGwgIT0gbnVsbCB8fAogICAgICAgICAgICAgICAgcGFyYW1zLnN0cm9rZSAhPSBudWxsIHx8CiAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS13aWR0aCJdICE9IG51bGwgfHwKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLW9wYWNpdHkiXSAhPSBudWxsIHx8CiAgICAgICAgICAgICAgICBwYXJhbXNbImZpbGwtb3BhY2l0eSJdICE9IG51bGwgfHwKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLWRhc2hhcnJheSJdICE9IG51bGwgfHwKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLW1pdGVybGltaXQiXSAhPSBudWxsIHx8CiAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS1saW5lam9pbiJdICE9IG51bGwgfHwKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLWxpbmVjYXAiXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBub2RlID0gby5zaGFwZSB8fCBub2RlOwogICAgICAgICAgICAgICAgdmFyIGZpbGwgPSAobm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZmlsbCIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZpbGwiKVswXSksCiAgICAgICAgICAgICAgICAgICAgbmV3ZmlsbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIWZpbGwgJiYgKG5ld2ZpbGwgPSBmaWxsID0gY3JlYXRlTm9kZSgiZmlsbCIpKTsKICAgICAgICAgICAgICAgIGlmICgiZmlsbC1vcGFjaXR5IiBpbiBwYXJhbXMgfHwgIm9wYWNpdHkiIGluIHBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHZhciBvcGFjaXR5ID0gKCgrYVsiZmlsbC1vcGFjaXR5Il0gKyAxIHx8IDIpIC0gMSkgKiAoKCthLm9wYWNpdHkgKyAxIHx8IDIpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA8IDAgJiYgKG9wYWNpdHkgPSAwKTsKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID4gMSAmJiAob3BhY2l0eSA9IDEpOwogICAgICAgICAgICAgICAgICAgIGZpbGwub3BhY2l0eSA9IG9wYWNpdHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXJhbXMuZmlsbCAmJiAoZmlsbC5vbiA9IHRydWUpOwogICAgICAgICAgICAgICAgaWYgKGZpbGwub24gPT0gbnVsbCB8fCBwYXJhbXMuZmlsbCA9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgICAgICBmaWxsLm9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlsbC5vbiAmJiBwYXJhbXMuZmlsbCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc1VSTCA9IHBhcmFtcy5maWxsLm1hdGNoKElTVVJMKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC5zcmMgPSBpc1VSTFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC50eXBlID0gInRpbGUiOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwuY29sb3IgPSBSLmdldFJHQihwYXJhbXMuZmlsbCkuaGV4OwogICAgICAgICAgICAgICAgICAgICAgICBmaWxsLnNyYyA9IEU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwudHlwZSA9ICJzb2xpZCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSLmdldFJHQihwYXJhbXMuZmlsbCkuZXJyb3IgJiYgKHJlcy50eXBlIGluIHtjaXJjbGU6IDEsIGVsbGlwc2U6IDF9IHx8IChwYXJhbXMuZmlsbCArIEUpLmNoYXJBdCgpICE9ICJyIikgJiYgYWRkR3JhZGllbnRGaWxsKHJlcywgcGFyYW1zLmZpbGwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmZpbGwgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdyYWRpZW50ID0gcGFyYW1zLmZpbGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXdmaWxsICYmIG5vZGVbYXBwZW5kQ2hpbGRdKGZpbGwpOwogICAgICAgICAgICAgICAgdmFyIHN0cm9rZSA9IChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKSAmJiBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKVswXSksCiAgICAgICAgICAgICAgICBuZXdzdHJva2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICFzdHJva2UgJiYgKG5ld3N0cm9rZSA9IHN0cm9rZSA9IGNyZWF0ZU5vZGUoInN0cm9rZSIpKTsKICAgICAgICAgICAgICAgIGlmICgocGFyYW1zLnN0cm9rZSAmJiBwYXJhbXMuc3Ryb2tlICE9ICJub25lIikgfHwKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS13aWR0aCJdIHx8CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJzdHJva2Utb3BhY2l0eSJdICE9IG51bGwgfHwKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS1kYXNoYXJyYXkiXSB8fAogICAgICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLW1pdGVybGltaXQiXSB8fAogICAgICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLWxpbmVqb2luIl0gfHwKICAgICAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS1saW5lY2FwIl0pIHsKICAgICAgICAgICAgICAgICAgICBzdHJva2Uub24gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKHBhcmFtcy5zdHJva2UgPT0gIm5vbmUiIHx8IHN0cm9rZS5vbiA9PSBudWxsIHx8IHBhcmFtcy5zdHJva2UgPT0gMCB8fCBwYXJhbXNbInN0cm9rZS13aWR0aCJdID09IDApICYmIChzdHJva2Uub24gPSBmYWxzZSk7CiAgICAgICAgICAgICAgICBzdHJva2Uub24gJiYgcGFyYW1zLnN0cm9rZSAmJiAoc3Ryb2tlLmNvbG9yID0gUi5nZXRSR0IocGFyYW1zLnN0cm9rZSkuaGV4KTsKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAoKCthWyJzdHJva2Utb3BhY2l0eSJdICsgMSB8fCAyKSAtIDEpICogKCgrYS5vcGFjaXR5ICsgMSB8fCAyKSAtIDEpOwogICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gKHRvRmxvYXQocGFyYW1zWyJzdHJva2Utd2lkdGgiXSkgfHwgMSkgKiAuNzU7CiAgICAgICAgICAgICAgICBvcGFjaXR5IDwgMCAmJiAob3BhY2l0eSA9IDApOwogICAgICAgICAgICAgICAgb3BhY2l0eSA+IDEgJiYgKG9wYWNpdHkgPSAxKTsKICAgICAgICAgICAgICAgIHBhcmFtc1sic3Ryb2tlLXdpZHRoIl0gPT0gbnVsbCAmJiAod2lkdGggPSBhWyJzdHJva2Utd2lkdGgiXSk7CiAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS13aWR0aCJdICYmIChzdHJva2Uud2VpZ2h0ID0gd2lkdGgpOwogICAgICAgICAgICAgICAgd2lkdGggJiYgd2lkdGggPCAxICYmIChvcGFjaXR5ICo9IHdpZHRoKSAmJiAoc3Ryb2tlLndlaWdodCA9IDEpOwogICAgICAgICAgICAgICAgc3Ryb2tlLm9wYWNpdHkgPSBvcGFjaXR5OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS1saW5lam9pbiJdICYmIChzdHJva2Uuam9pbnN0eWxlID0gcGFyYW1zWyJzdHJva2UtbGluZWpvaW4iXSB8fCAibWl0ZXIiKTsKICAgICAgICAgICAgICAgIHN0cm9rZS5taXRlcmxpbWl0ID0gcGFyYW1zWyJzdHJva2UtbWl0ZXJsaW1pdCJdIHx8IDg7CiAgICAgICAgICAgICAgICBwYXJhbXNbInN0cm9rZS1saW5lY2FwIl0gJiYgKHN0cm9rZS5lbmRjYXAgPSBwYXJhbXNbInN0cm9rZS1saW5lY2FwIl0gPT0gImJ1dHQiID8gImZsYXQiIDogcGFyYW1zWyJzdHJva2UtbGluZWNhcCJdID09ICJzcXVhcmUiID8gInNxdWFyZSIgOiAicm91bmQiKTsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbInN0cm9rZS1kYXNoYXJyYXkiXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBkYXNoYXJyYXkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICItIjogInNob3J0ZGFzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICIuIjogInNob3J0ZG90IiwKICAgICAgICAgICAgICAgICAgICAgICAgIi0uIjogInNob3J0ZGFzaGRvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICItLi4iOiAic2hvcnRkYXNoZG90ZG90IiwKICAgICAgICAgICAgICAgICAgICAgICAgIi4gIjogImRvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICItICI6ICJkYXNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgIi0tIjogImxvbmdkYXNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgIi0gLiI6ICJkYXNoZG90IiwKICAgICAgICAgICAgICAgICAgICAgICAgIi0tLiI6ICJsb25nZGFzaGRvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICItLS4uIjogImxvbmdkYXNoZG90ZG90IgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLmRhc2hzdHlsZSA9IGRhc2hhcnJheVtoYXNdKHBhcmFtc1sic3Ryb2tlLWRhc2hhcnJheSJdKSA/IGRhc2hhcnJheVtwYXJhbXNbInN0cm9rZS1kYXNoYXJyYXkiXV0gOiBFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV3c3Ryb2tlICYmIG5vZGVbYXBwZW5kQ2hpbGRdKHN0cm9rZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlcy50eXBlID09ICJ0ZXh0IikgewogICAgICAgICAgICAgICAgcyA9IHJlcy5wYXBlci5zcGFuLnN0eWxlOwogICAgICAgICAgICAgICAgYS5mb250ICYmIChzLmZvbnQgPSBhLmZvbnQpOwogICAgICAgICAgICAgICAgYVsiZm9udC1mYW1pbHkiXSAmJiAocy5mb250RmFtaWx5ID0gYVsiZm9udC1mYW1pbHkiXSk7CiAgICAgICAgICAgICAgICBhWyJmb250LXNpemUiXSAmJiAocy5mb250U2l6ZSA9IGFbImZvbnQtc2l6ZSJdKTsKICAgICAgICAgICAgICAgIGFbImZvbnQtd2VpZ2h0Il0gJiYgKHMuZm9udFdlaWdodCA9IGFbImZvbnQtd2VpZ2h0Il0pOwogICAgICAgICAgICAgICAgYVsiZm9udC1zdHlsZSJdICYmIChzLmZvbnRTdHlsZSA9IGFbImZvbnQtc3R5bGUiXSk7CiAgICAgICAgICAgICAgICByZXMubm9kZS5zdHJpbmcgJiYgKHJlcy5wYXBlci5zcGFuLmlubmVySFRNTCA9IChyZXMubm9kZS5zdHJpbmcgKyBFKVtycF0oLzwvZywgIiYjNjA7IilbcnBdKC8mL2csICImIzM4OyIpW3JwXSgvXG4vZywgIjxicj4iKSk7CiAgICAgICAgICAgICAgICByZXMuVyA9IGEudyA9IHJlcy5wYXBlci5zcGFuLm9mZnNldFdpZHRoOwogICAgICAgICAgICAgICAgcmVzLkggPSBhLmggPSByZXMucGFwZXIuc3Bhbi5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICByZXMuWCA9IGEueDsKICAgICAgICAgICAgICAgIHJlcy5ZID0gYS55ICsgcm91bmQocmVzLkggLyAyKTsKIAogICAgICAgICAgICAgICAgLy8gdGV4dC1hbmNob3IgZW11bGF0aW9ubQogICAgICAgICAgICAgICAgc3dpdGNoIChhWyJ0ZXh0LWFuY2hvciJdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAic3RhcnQiOgogICAgICAgICAgICAgICAgICAgICAgICByZXMubm9kZS5zdHlsZVsidi10ZXh0LWFsaWduIl0gPSAibGVmdCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5iYnggPSByb3VuZChyZXMuVyAvIDIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5ub2RlLnN0eWxlWyJ2LXRleHQtYWxpZ24iXSA9ICJyaWdodCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5iYnggPSAtcm91bmQocmVzLlcgLyAyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICByZXMubm9kZS5zdHlsZVsidi10ZXh0LWFsaWduIl0gPSAiY2VudGVyIjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYWRkR3JhZGllbnRGaWxsID0gZnVuY3Rpb24gKG8sIGdyYWRpZW50KSB7CiAgICAgICAgICAgIG8uYXR0cnMgPSBvLmF0dHJzIHx8IHt9OwogICAgICAgICAgICB2YXIgYXR0cnMgPSBvLmF0dHJzLAogICAgICAgICAgICAgICAgZmlsbCA9IG8ubm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZmlsbCIpLAogICAgICAgICAgICAgICAgdHlwZSA9ICJsaW5lYXIiLAogICAgICAgICAgICAgICAgZnhmeSA9ICIuNSAuNSI7CiAgICAgICAgICAgIG8uYXR0cnMuZ3JhZGllbnQgPSBncmFkaWVudDsKICAgICAgICAgICAgZ3JhZGllbnQgPSAoZ3JhZGllbnQgKyBFKVtycF0ocmFkaWFsX2dyYWRpZW50LCBmdW5jdGlvbiAoYWxsLCBmeCwgZnkpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSAicmFkaWFsIjsKICAgICAgICAgICAgICAgIGlmIChmeCAmJiBmeSkgewogICAgICAgICAgICAgICAgICAgIGZ4ID0gdG9GbG9hdChmeCk7CiAgICAgICAgICAgICAgICAgICAgZnkgPSB0b0Zsb2F0KGZ5KTsKICAgICAgICAgICAgICAgICAgICBwb3coZnggLSAuNSwgMikgKyBwb3coZnkgLSAuNSwgMikgPiAuMjUgJiYgKGZ5ID0gbWF0aC5zcXJ0KC4yNSAtIHBvdyhmeCAtIC41LCAyKSkgKiAoKGZ5ID4gLjUpICogMiAtIDEpICsgLjUpOwogICAgICAgICAgICAgICAgICAgIGZ4ZnkgPSBmeCArIFMgKyBmeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBFOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZ3JhZGllbnQgPSBncmFkaWVudFtzcGxpdF0oL1xzKlwtXHMqLyk7CiAgICAgICAgICAgIGlmICh0eXBlID09ICJsaW5lYXIiKSB7CiAgICAgICAgICAgICAgICB2YXIgYW5nbGUgPSBncmFkaWVudC5zaGlmdCgpOwogICAgICAgICAgICAgICAgYW5nbGUgPSAtdG9GbG9hdChhbmdsZSk7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oYW5nbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRvdHMgPSBwYXJzZURvdHMoZ3JhZGllbnQpOwogICAgICAgICAgICBpZiAoIWRvdHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG8gPSBvLnNoYXBlIHx8IG8ubm9kZTsKICAgICAgICAgICAgZmlsbCA9IGZpbGxbMF0gfHwgY3JlYXRlTm9kZSgiZmlsbCIpOwogICAgICAgICAgICBpZiAoZG90c1tsZW5ndGhdKSB7CiAgICAgICAgICAgICAgICBmaWxsLm9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZpbGwubWV0aG9kID0gIm5vbmUiOwogICAgICAgICAgICAgICAgZmlsbC50eXBlID0gKHR5cGUgPT0gInJhZGlhbCIpID8gImdyYWRpZW50cmFkaWFsIiA6ICJncmFkaWVudCI7CiAgICAgICAgICAgICAgICBmaWxsLmNvbG9yID0gZG90c1swXS5jb2xvcjsKICAgICAgICAgICAgICAgIGZpbGwuY29sb3IyID0gZG90c1tkb3RzW2xlbmd0aF0gLSAxXS5jb2xvcjsKICAgICAgICAgICAgICAgIHZhciBjbHJzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkb3RzW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZG90c1tpXS5vZmZzZXQgJiYgY2xyc1twdXNoXShkb3RzW2ldLm9mZnNldCArIFMgKyBkb3RzW2ldLmNvbG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbGwuY29sb3JzICYmIChmaWxsLmNvbG9ycy52YWx1ZSA9IGNscnNbbGVuZ3RoXSA/IGNscnNbam9pbl0oIiwiKSA6ICIwJSAiICsgZmlsbC5jb2xvcik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAicmFkaWFsIikgewogICAgICAgICAgICAgICAgICAgIGZpbGwuZm9jdXMgPSAiMTAwJSI7CiAgICAgICAgICAgICAgICAgICAgZmlsbC5mb2N1c3NpemUgPSBmeGZ5OwogICAgICAgICAgICAgICAgICAgIGZpbGwuZm9jdXNwb3NpdGlvbiA9IGZ4Znk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZpbGwuYW5nbGUgPSAoMjcwIC0gYW5nbGUpICUgMzYwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBncm91cCwgdm1sKSB7CiAgICAgICAgICAgIHZhciBSb3RhdGlvbiA9IDAsCiAgICAgICAgICAgICAgICBSb3RYID0gMCwKICAgICAgICAgICAgICAgIFJvdFkgPSAwLAogICAgICAgICAgICAgICAgU2NhbGUgPSAxOwogICAgICAgICAgICB0aGlzWzBdID0gbm9kZTsKICAgICAgICAgICAgdGhpcy5pZCA9IFIuX29pZCsrOwogICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgICAgICBub2RlLnJhcGhhZWwgPSB0aGlzOwogICAgICAgICAgICB0aGlzLlggPSAwOwogICAgICAgICAgICB0aGlzLlkgPSAwOwogICAgICAgICAgICB0aGlzLmF0dHJzID0ge307CiAgICAgICAgICAgIHRoaXMuR3JvdXAgPSBncm91cDsKICAgICAgICAgICAgdGhpcy5wYXBlciA9IHZtbDsKICAgICAgICAgICAgdGhpcy5fID0gewogICAgICAgICAgICAgICAgdHg6IDAsCiAgICAgICAgICAgICAgICB0eTogMCwKICAgICAgICAgICAgICAgIHJ0OiB7ZGVnOjB9LAogICAgICAgICAgICAgICAgc3g6IDEsCiAgICAgICAgICAgICAgICBzeTogMQogICAgICAgICAgICB9OwogICAgICAgICAgICAhdm1sLmJvdHRvbSAmJiAodm1sLmJvdHRvbSA9IHRoaXMpOwogICAgICAgICAgICB0aGlzLnByZXYgPSB2bWwudG9wOwogICAgICAgICAgICB2bWwudG9wICYmICh2bWwudG9wLm5leHQgPSB0aGlzKTsKICAgICAgICAgICAgdm1sLnRvcCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMubmV4dCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS5yb3RhdGUgPSBmdW5jdGlvbiAoZGVnLCBjeCwgY3kpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fLnJ0LmN4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl8ucnQuZGVnLCB0aGlzLl8ucnQuY3gsIHRoaXMuXy5ydC5jeV1bam9pbl0oUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fLnJ0LmRlZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWcgPSAoZGVnICsgRSlbc3BsaXRdKHNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmIChkZWdbbGVuZ3RoXSAtIDEpIHsKICAgICAgICAgICAgICAgIGN4ID0gdG9GbG9hdChkZWdbMV0pOwogICAgICAgICAgICAgICAgY3kgPSB0b0Zsb2F0KGRlZ1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVnID0gdG9GbG9hdChkZWdbMF0pOwogICAgICAgICAgICBpZiAoY3ggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fLnJ0LmRlZyA9IGRlZzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuXy5ydC5kZWcgKz0gZGVnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN5ID09IG51bGwgJiYgKGN4ID0gbnVsbCk7CiAgICAgICAgICAgIHRoaXMuXy5ydC5jeCA9IGN4OwogICAgICAgICAgICB0aGlzLl8ucnQuY3kgPSBjeTsKICAgICAgICAgICAgdGhpcy5zZXRCb3godGhpcy5hdHRycywgY3gsIGN5KTsKICAgICAgICAgICAgdGhpcy5Hcm91cC5zdHlsZS5yb3RhdGlvbiA9IHRoaXMuXy5ydC5kZWc7CiAgICAgICAgICAgIC8vIGdyYWRpZW50IGZpeCBmb3Igcm90YXRpb24uIFRPRE8KICAgICAgICAgICAgLy8gdmFyIGZpbGwgPSAodGhpcy5zaGFwZSB8fCB0aGlzLm5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWxsIik7CiAgICAgICAgICAgIC8vIGZpbGwgPSBmaWxsWzBdIHx8IHt9OwogICAgICAgICAgICAvLyB2YXIgYiA9ICgoMzYwIC0gdGhpcy5fLnJ0LmRlZykgLSAyNzApICUgMzYwOwogICAgICAgICAgICAvLyAhUi5pcyhmaWxsLmFuZ2xlLCAidW5kZWZpbmVkIikgJiYgKGZpbGwuYW5nbGUgPSBiKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS5zZXRCb3ggPSBmdW5jdGlvbiAocGFyYW1zLCBjeCwgY3kpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGdzID0gdGhpcy5Hcm91cC5zdHlsZSwKICAgICAgICAgICAgICAgIG9zID0gKHRoaXMuc2hhcGUgJiYgdGhpcy5zaGFwZS5zdHlsZSkgfHwgdGhpcy5ub2RlLnN0eWxlOwogICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFyYW1zKSBpZiAocGFyYW1zW2hhc10oaSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuYXR0cnNbaV0gPSBwYXJhbXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3ggPSBjeCB8fCB0aGlzLl8ucnQuY3g7CiAgICAgICAgICAgIGN5ID0gY3kgfHwgdGhpcy5fLnJ0LmN5OwogICAgICAgICAgICB2YXIgYXR0ciA9IHRoaXMuYXR0cnMsCiAgICAgICAgICAgICAgICB4LAogICAgICAgICAgICAgICAgeSwKICAgICAgICAgICAgICAgIHcsCiAgICAgICAgICAgICAgICBoOwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiY2lyY2xlIjoKICAgICAgICAgICAgICAgICAgICB4ID0gYXR0ci5jeCAtIGF0dHIucjsKICAgICAgICAgICAgICAgICAgICB5ID0gYXR0ci5jeSAtIGF0dHIucjsKICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IGF0dHIuciAqIDI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJlbGxpcHNlIjoKICAgICAgICAgICAgICAgICAgICB4ID0gYXR0ci5jeCAtIGF0dHIucng7CiAgICAgICAgICAgICAgICAgICAgeSA9IGF0dHIuY3kgLSBhdHRyLnJ5OwogICAgICAgICAgICAgICAgICAgIHcgPSBhdHRyLnJ4ICogMjsKICAgICAgICAgICAgICAgICAgICBoID0gYXR0ci5yeSAqIDI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJyZWN0IjoKICAgICAgICAgICAgICAgIGNhc2UgImltYWdlIjoKICAgICAgICAgICAgICAgICAgICB4ID0gK2F0dHIueDsKICAgICAgICAgICAgICAgICAgICB5ID0gK2F0dHIueTsKICAgICAgICAgICAgICAgICAgICB3ID0gYXR0ci53aWR0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgIGggPSBhdHRyLmhlaWdodCB8fCAwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAidGV4dCI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0cGF0aC52ID0gWyJtIiwgcm91bmQoYXR0ci54KSwgIiwgIiwgcm91bmQoYXR0ci55IC0gMiksICJsIiwgcm91bmQoYXR0ci54KSArIDEsICIsICIsIHJvdW5kKGF0dHIueSAtIDIpXVtqb2luXShFKTsKICAgICAgICAgICAgICAgICAgICB4ID0gYXR0ci54IC0gcm91bmQodGhpcy5XIC8gMik7CiAgICAgICAgICAgICAgICAgICAgeSA9IGF0dHIueSAtIHRoaXMuSCAvIDI7CiAgICAgICAgICAgICAgICAgICAgdyA9IHRoaXMuVzsKICAgICAgICAgICAgICAgICAgICBoID0gdGhpcy5IOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicGF0aCI6CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0dHJzLnBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB3ID0gdGhpcy5wYXBlci53aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IHRoaXMucGFwZXIuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaW0gPSBwYXRoRGltZW5zaW9ucyh0aGlzLmF0dHJzLnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB4ID0gZGltLng7CiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkaW0ueTsKICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGRpbS53aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpbS5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgICAgICAgICB5ID0gMDsKICAgICAgICAgICAgICAgICAgICB3ID0gdGhpcy5wYXBlci53aWR0aDsKICAgICAgICAgICAgICAgICAgICBoID0gdGhpcy5wYXBlci5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3ggPSAoY3ggPT0gbnVsbCkgPyB4ICsgdyAvIDIgOiBjeDsKICAgICAgICAgICAgY3kgPSAoY3kgPT0gbnVsbCkgPyB5ICsgaCAvIDIgOiBjeTsKICAgICAgICAgICAgdmFyIGxlZnQgPSBjeCAtIHRoaXMucGFwZXIud2lkdGggLyAyLAogICAgICAgICAgICAgICAgdG9wID0gY3kgLSB0aGlzLnBhcGVyLmhlaWdodCAvIDIsIHQ7CiAgICAgICAgICAgIGdzLmxlZnQgIT0gKHQgPSBsZWZ0ICsgInB4IikgJiYgKGdzLmxlZnQgPSB0KTsKICAgICAgICAgICAgZ3MudG9wICE9ICh0ID0gdG9wICsgInB4IikgJiYgKGdzLnRvcCA9IHQpOwogICAgICAgICAgICB0aGlzLlggPSB0aGlzLnR5cGUgPT0gInBhdGgiID8gLWxlZnQgOiB4OwogICAgICAgICAgICB0aGlzLlkgPSB0aGlzLnR5cGUgPT0gInBhdGgiID8gLXRvcCA6IHk7CiAgICAgICAgICAgIHRoaXMuVyA9IHc7CiAgICAgICAgICAgIHRoaXMuSCA9IGg7CiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gInBhdGgiKSB7CiAgICAgICAgICAgICAgICBvcy5sZWZ0ICE9ICh0ID0gLWxlZnQgKiB6b29tICsgInB4IikgJiYgKG9zLmxlZnQgPSB0KTsKICAgICAgICAgICAgICAgIG9zLnRvcCAhPSAodCA9IC10b3AgKiB6b29tICsgInB4IikgJiYgKG9zLnRvcCA9IHQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSAidGV4dCIpIHsKICAgICAgICAgICAgICAgIG9zLmxlZnQgIT0gKHQgPSAtbGVmdCArICJweCIpICYmIChvcy5sZWZ0ID0gdCk7CiAgICAgICAgICAgICAgICBvcy50b3AgIT0gKHQgPSAtdG9wICsgInB4IikgJiYgKG9zLnRvcCA9IHQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ3Mud2lkdGggIT0gKHQgPSB0aGlzLnBhcGVyLndpZHRoICsgInB4IikgJiYgKGdzLndpZHRoID0gdCk7CiAgICAgICAgICAgICAgICBncy5oZWlnaHQgIT0gKHQgPSB0aGlzLnBhcGVyLmhlaWdodCArICJweCIpICYmIChncy5oZWlnaHQgPSB0KTsKICAgICAgICAgICAgICAgIG9zLmxlZnQgIT0gKHQgPSB4IC0gbGVmdCArICJweCIpICYmIChvcy5sZWZ0ID0gdCk7CiAgICAgICAgICAgICAgICBvcy50b3AgIT0gKHQgPSB5IC0gdG9wICsgInB4IikgJiYgKG9zLnRvcCA9IHQpOwogICAgICAgICAgICAgICAgb3Mud2lkdGggIT0gKHQgPSB3ICsgInB4IikgJiYgKG9zLndpZHRoID0gdCk7CiAgICAgICAgICAgICAgICBvcy5oZWlnaHQgIT0gKHQgPSBoICsgInB4IikgJiYgKG9zLmhlaWdodCA9IHQpOwogICAgICAgICAgICAgICAgdmFyIGFyY3NpemUgPSAoK3BhcmFtcy5yIHx8IDApIC8gbW1pbih3LCBoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gInJlY3QiICYmIHRoaXMuYXJjc2l6ZS50b0ZpeGVkKDQpICE9IGFyY3NpemUudG9GaXhlZCg0KSAmJiAoYXJjc2l6ZSB8fCB0aGlzLmFyY3NpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHJlcGxhY2UgZWxlbWVudCB3aXRoIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBjcmVhdGVOb2RlKCJyb3VuZHJlY3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHt9LAogICAgICAgICAgICAgICAgICAgICAgICBpaSA9IHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW2xlbmd0aF07CiAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgby5hcmNzaXplID0gYXJjc2l6ZTsKICAgICAgICAgICAgICAgICAgICBvLnJhcGhhZWwgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBbYXBwZW5kQ2hpbGRdKG8pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuR3JvdXAucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzWzBdID0gdGhpcy5ub2RlID0gbzsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFyY3NpemUgPSBhcmNzaXplOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBhdHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFbaV0gPSBhdHRyW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgYS5zY2FsZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoYSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXZlbnRzKSBmb3IgKDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbaV0udW5iaW5kID0gYWRkRXZlbnQodGhpcy5ub2RlLCB0aGlzLmV2ZW50c1tpXS5uYW1lLCB0aGlzLmV2ZW50c1tpXS5mLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLmhpZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICF0aGlzLnJlbW92ZWQgJiYgKHRoaXMuR3JvdXAuc3R5bGUuZGlzcGxheSA9ICJub25lIik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uc2hvdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgIXRoaXMucmVtb3ZlZCAmJiAodGhpcy5Hcm91cC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRWxlbWVudFtwcm90b10uZ2V0QkJveCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAicGF0aCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwYXRoRGltZW5zaW9ucyh0aGlzLmF0dHJzLnBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiB0aGlzLlggKyAodGhpcy5iYnggfHwgMCksCiAgICAgICAgICAgICAgICB5OiB0aGlzLlksCiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5XLAogICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLkgKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRlYXIodGhpcywgdGhpcy5wYXBlcik7CiAgICAgICAgICAgIHRoaXMubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZSk7CiAgICAgICAgICAgIHRoaXMuR3JvdXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkdyb3VwKTsKICAgICAgICAgICAgdGhpcy5zaGFwZSAmJiB0aGlzLnNoYXBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zaGFwZSk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVkID0gdHJ1ZTsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLmF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmF0dHJzKSBpZiAodGhpcy5hdHRyc1toYXNdKGkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gdGhpcy5hdHRyc1tpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuXy5ydC5kZWcgJiYgKHJlcy5yb3RhdGlvbiA9IHRoaXMucm90YXRlKCkpOwogICAgICAgICAgICAgICAgKHRoaXMuXy5zeCAhPSAxIHx8IHRoaXMuXy5zeSAhPSAxKSAmJiAocmVzLnNjYWxlID0gdGhpcy5zY2FsZSgpKTsKICAgICAgICAgICAgICAgIHJlcy5ncmFkaWVudCAmJiByZXMuZmlsbCA9PSAibm9uZSIgJiYgKHJlcy5maWxsID0gcmVzLmdyYWRpZW50KSAmJiBkZWxldGUgcmVzLmdyYWRpZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBSLmlzKG5hbWUsICJzdHJpbmciKSkgewogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gInRyYW5zbGF0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJyb3RhdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJzY2FsZSIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gImZpbGwiICYmIHRoaXMuYXR0cnMuZmlsbCA9PSAibm9uZSIgJiYgdGhpcy5hdHRycy5ncmFkaWVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dHJzLmdyYWRpZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0cnNbbmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYXR0cnMgJiYgdmFsdWUgPT0gbnVsbCAmJiBSLmlzKG5hbWUsICJhcnJheSIpKSB7CiAgICAgICAgICAgICAgICB2YXIgaWksIHZhbHVlcyA9IHt9OwogICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaWkgPSBuYW1lW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW25hbWVbaV1dID0gdGhpcy5hdHRyKG5hbWVbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcGFyYW1zOwogICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcGFyYW1zID0ge307CiAgICAgICAgICAgICAgICBwYXJhbXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWx1ZSA9PSBudWxsICYmIFIuaXMobmFtZSwgIm9iamVjdCIpICYmIChwYXJhbXMgPSBuYW1lKTsKICAgICAgICAgICAgaWYgKHBhcmFtcykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtcy50ZXh0ICYmIHRoaXMudHlwZSA9PSAidGV4dCIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUuc3RyaW5nID0gcGFyYW1zLnRleHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHRoaXMsIHBhcmFtcyk7CiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmdyYWRpZW50ICYmICgoe2NpcmNsZTogMSwgZWxsaXBzZTogMX0pW2hhc10odGhpcy50eXBlKSB8fCAocGFyYW1zLmdyYWRpZW50ICsgRSkuY2hhckF0KCkgIT0gInIiKSkgewogICAgICAgICAgICAgICAgICAgIGFkZEdyYWRpZW50RmlsbCh0aGlzLCBwYXJhbXMuZ3JhZGllbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKHRoaXMudHlwZSAhPSAicGF0aCIgfHwgdGhpcy5fLnJ0LmRlZykgJiYgdGhpcy5zZXRCb3godGhpcy5hdHRycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS50b0Zyb250ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAhdGhpcy5yZW1vdmVkICYmIHRoaXMuR3JvdXAucGFyZW50Tm9kZVthcHBlbmRDaGlsZF0odGhpcy5Hcm91cCk7CiAgICAgICAgICAgIHRoaXMucGFwZXIudG9wICE9IHRoaXMgJiYgdG9mcm9udCh0aGlzLCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBFbGVtZW50W3Byb3RvXS50b0JhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLkdyb3VwLnBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSB0aGlzLkdyb3VwKSB7CiAgICAgICAgICAgICAgICB0aGlzLkdyb3VwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuR3JvdXAsIHRoaXMuR3JvdXAucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIHRvYmFjayh0aGlzLCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLmluc2VydEFmdGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVsZW1lbnQuR3JvdXAubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuR3JvdXAucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5Hcm91cCwgZWxlbWVudC5Hcm91cC5uZXh0U2libGluZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbGVtZW50Lkdyb3VwLnBhcmVudE5vZGVbYXBwZW5kQ2hpbGRdKHRoaXMuR3JvdXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluc2VydGFmdGVyKHRoaXMsIGVsZW1lbnQsIHRoaXMucGFwZXIpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEVsZW1lbnRbcHJvdG9dLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQuR3JvdXAucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5Hcm91cCwgZWxlbWVudC5Hcm91cCk7CiAgICAgICAgICAgIGluc2VydGJlZm9yZSh0aGlzLCBlbGVtZW50LCB0aGlzLnBhcGVyKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICB2YXIgYmx1cnJlZ2V4cCA9IC8gcHJvZ2lkOlxTK0JsdXJcKFteXCldK1wpL2c7CiAgICAgICAgRWxlbWVudFtwcm90b10uYmx1ciA9IGZ1bmN0aW9uIChzaXplKSB7CiAgICAgICAgICAgIHZhciBzID0gdGhpcy5ub2RlLnN0eWxlLAogICAgICAgICAgICAgICAgZiA9IHMuZmlsdGVyOwogICAgICAgICAgICBmID0gZi5yZXBsYWNlKGJsdXJyZWdleHAsICIiKTsKICAgICAgICAgICAgaWYgKCtzaXplICE9PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHJzLmJsdXIgPSBzaXplOwogICAgICAgICAgICAgICAgcy5maWx0ZXIgPSBmICsgIiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmx1cihwaXhlbHJhZGl1cz0iICsgKCtzaXplIHx8IDEuNSkgKyAiKSI7CiAgICAgICAgICAgICAgICBzLm1hcmdpbiA9IFJhcGhhZWwuZm9ybWF0KCItezB9cHggMCAwIC17MH1weCIsIE1hdGgucm91bmQoK3NpemUgfHwgMS41KSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzLmZpbHRlciA9IGY7CiAgICAgICAgICAgICAgICBzLm1hcmdpbiA9IDA7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hdHRycy5ibHVyOwogICAgICAgICAgICB9CiAgICAgICAgfTsKIAogICAgICAgIHRoZUNpcmNsZSA9IGZ1bmN0aW9uICh2bWwsIHgsIHksIHIpIHsKICAgICAgICAgICAgdmFyIGcgPSBjcmVhdGVOb2RlKCJncm91cCIpLAogICAgICAgICAgICAgICAgbyA9IGNyZWF0ZU5vZGUoIm92YWwiKSwKICAgICAgICAgICAgICAgIG9sID0gby5zdHlsZTsKICAgICAgICAgICAgZy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoiICsgdm1sLndpZHRoICsgInB4O2hlaWdodDoiICsgdm1sLmhlaWdodCArICJweCI7CiAgICAgICAgICAgIGcuY29vcmRzaXplID0gY29vcmRzaXplOwogICAgICAgICAgICBnLmNvb3Jkb3JpZ2luID0gdm1sLmNvb3Jkb3JpZ2luOwogICAgICAgICAgICBnW2FwcGVuZENoaWxkXShvKTsKICAgICAgICAgICAgdmFyIHJlcyA9IG5ldyBFbGVtZW50KG8sIGcsIHZtbCk7CiAgICAgICAgICAgIHJlcy50eXBlID0gImNpcmNsZSI7CiAgICAgICAgICAgIHNldEZpbGxBbmRTdHJva2UocmVzLCB7c3Ryb2tlOiAiIzAwMCIsIGZpbGw6ICJub25lIn0pOwogICAgICAgICAgICByZXMuYXR0cnMuY3ggPSB4OwogICAgICAgICAgICByZXMuYXR0cnMuY3kgPSB5OwogICAgICAgICAgICByZXMuYXR0cnMuciA9IHI7CiAgICAgICAgICAgIHJlcy5zZXRCb3goe3g6IHggLSByLCB5OiB5IC0gciwgd2lkdGg6IHIgKiAyLCBoZWlnaHQ6IHIgKiAyfSk7CiAgICAgICAgICAgIHZtbC5jYW52YXNbYXBwZW5kQ2hpbGRdKGcpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH07CiAgICAgICAgdGhlUmVjdCA9IGZ1bmN0aW9uICh2bWwsIHgsIHksIHcsIGgsIHIpIHsKICAgICAgICAgICAgdmFyIGcgPSBjcmVhdGVOb2RlKCJncm91cCIpLAogICAgICAgICAgICAgICAgbyA9IGNyZWF0ZU5vZGUoInJvdW5kcmVjdCIpLAogICAgICAgICAgICAgICAgYXJjc2l6ZSA9ICgrciB8fCAwKSAvIChtbWluKHcsIGgpKTsKICAgICAgICAgICAgZy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoiICsgdm1sLndpZHRoICsgInB4O2hlaWdodDoiICsgdm1sLmhlaWdodCArICJweCI7CiAgICAgICAgICAgIGcuY29vcmRzaXplID0gY29vcmRzaXplOwogICAgICAgICAgICBnLmNvb3Jkb3JpZ2luID0gdm1sLmNvb3Jkb3JpZ2luOwogICAgICAgICAgICBnW2FwcGVuZENoaWxkXShvKTsKICAgICAgICAgICAgby5hcmNzaXplID0gYXJjc2l6ZTsKICAgICAgICAgICAgdmFyIHJlcyA9IG5ldyBFbGVtZW50KG8sIGcsIHZtbCk7CiAgICAgICAgICAgIHJlcy50eXBlID0gInJlY3QiOwogICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHJlcywge3N0cm9rZTogIiMwMDAifSk7CiAgICAgICAgICAgIHJlcy5hcmNzaXplID0gYXJjc2l6ZTsKICAgICAgICAgICAgcmVzLnNldEJveCh7eDogeCwgeTogeSwgd2lkdGg6IHcsIGhlaWdodDogaCwgcjogcn0pOwogICAgICAgICAgICB2bWwuY2FudmFzW2FwcGVuZENoaWxkXShnKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIHRoZUVsbGlwc2UgPSBmdW5jdGlvbiAodm1sLCB4LCB5LCByeCwgcnkpIHsKICAgICAgICAgICAgdmFyIGcgPSBjcmVhdGVOb2RlKCJncm91cCIpLAogICAgICAgICAgICAgICAgbyA9IGNyZWF0ZU5vZGUoIm92YWwiKSwKICAgICAgICAgICAgICAgIG9sID0gby5zdHlsZTsKICAgICAgICAgICAgZy5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoiICsgdm1sLndpZHRoICsgInB4O2hlaWdodDoiICsgdm1sLmhlaWdodCArICJweCI7CiAgICAgICAgICAgIGcuY29vcmRzaXplID0gY29vcmRzaXplOwogICAgICAgICAgICBnLmNvb3Jkb3JpZ2luID0gdm1sLmNvb3Jkb3JpZ2luOwogICAgICAgICAgICBnW2FwcGVuZENoaWxkXShvKTsKICAgICAgICAgICAgdmFyIHJlcyA9IG5ldyBFbGVtZW50KG8sIGcsIHZtbCk7CiAgICAgICAgICAgIHJlcy50eXBlID0gImVsbGlwc2UiOwogICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHJlcywge3N0cm9rZTogIiMwMDAifSk7CiAgICAgICAgICAgIHJlcy5hdHRycy5jeCA9IHg7CiAgICAgICAgICAgIHJlcy5hdHRycy5jeSA9IHk7CiAgICAgICAgICAgIHJlcy5hdHRycy5yeCA9IHJ4OwogICAgICAgICAgICByZXMuYXR0cnMucnkgPSByeTsKICAgICAgICAgICAgcmVzLnNldEJveCh7eDogeCAtIHJ4LCB5OiB5IC0gcnksIHdpZHRoOiByeCAqIDIsIGhlaWdodDogcnkgKiAyfSk7CiAgICAgICAgICAgIHZtbC5jYW52YXNbYXBwZW5kQ2hpbGRdKGcpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH07CiAgICAgICAgdGhlSW1hZ2UgPSBmdW5jdGlvbiAodm1sLCBzcmMsIHgsIHksIHcsIGgpIHsKICAgICAgICAgICAgdmFyIGcgPSBjcmVhdGVOb2RlKCJncm91cCIpLAogICAgICAgICAgICAgICAgbyA9IGNyZWF0ZU5vZGUoImltYWdlIiksCiAgICAgICAgICAgICAgICBvbCA9IG8uc3R5bGU7CiAgICAgICAgICAgIGcuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6IiArIHZtbC53aWR0aCArICJweDtoZWlnaHQ6IiArIHZtbC5oZWlnaHQgKyAicHgiOwogICAgICAgICAgICBnLmNvb3Jkc2l6ZSA9IGNvb3Jkc2l6ZTsKICAgICAgICAgICAgZy5jb29yZG9yaWdpbiA9IHZtbC5jb29yZG9yaWdpbjsKICAgICAgICAgICAgby5zcmMgPSBzcmM7CiAgICAgICAgICAgIGdbYXBwZW5kQ2hpbGRdKG8pOwogICAgICAgICAgICB2YXIgcmVzID0gbmV3IEVsZW1lbnQobywgZywgdm1sKTsKICAgICAgICAgICAgcmVzLnR5cGUgPSAiaW1hZ2UiOwogICAgICAgICAgICByZXMuYXR0cnMuc3JjID0gc3JjOwogICAgICAgICAgICByZXMuYXR0cnMueCA9IHg7CiAgICAgICAgICAgIHJlcy5hdHRycy55ID0geTsKICAgICAgICAgICAgcmVzLmF0dHJzLncgPSB3OwogICAgICAgICAgICByZXMuYXR0cnMuaCA9IGg7CiAgICAgICAgICAgIHJlcy5zZXRCb3goe3g6IHgsIHk6IHksIHdpZHRoOiB3LCBoZWlnaHQ6IGh9KTsKICAgICAgICAgICAgdm1sLmNhbnZhc1thcHBlbmRDaGlsZF0oZyk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgICAgICB0aGVUZXh0ID0gZnVuY3Rpb24gKHZtbCwgeCwgeSwgdGV4dCkgewogICAgICAgICAgICB2YXIgZyA9IGNyZWF0ZU5vZGUoImdyb3VwIiksCiAgICAgICAgICAgICAgICBlbCA9IGNyZWF0ZU5vZGUoInNoYXBlIiksCiAgICAgICAgICAgICAgICBvbCA9IGVsLnN0eWxlLAogICAgICAgICAgICAgICAgcGF0aCA9IGNyZWF0ZU5vZGUoInBhdGgiKSwKICAgICAgICAgICAgICAgIHBzID0gcGF0aC5zdHlsZSwKICAgICAgICAgICAgICAgIG8gPSBjcmVhdGVOb2RlKCJ0ZXh0cGF0aCIpOwogICAgICAgICAgICBnLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOiIgKyB2bWwud2lkdGggKyAicHg7aGVpZ2h0OiIgKyB2bWwuaGVpZ2h0ICsgInB4IjsKICAgICAgICAgICAgZy5jb29yZHNpemUgPSBjb29yZHNpemU7CiAgICAgICAgICAgIGcuY29vcmRvcmlnaW4gPSB2bWwuY29vcmRvcmlnaW47CiAgICAgICAgICAgIHBhdGgudiA9IFIuZm9ybWF0KCJtezB9LHsxfWx7Mn0sezF9Iiwgcm91bmQoeCAqIDEwKSwgcm91bmQoeSAqIDEwKSwgcm91bmQoeCAqIDEwKSArIDEpOwogICAgICAgICAgICBwYXRoLnRleHRwYXRob2sgPSB0cnVlOwogICAgICAgICAgICBvbC53aWR0aCA9IHZtbC53aWR0aDsKICAgICAgICAgICAgb2wuaGVpZ2h0ID0gdm1sLmhlaWdodDsKICAgICAgICAgICAgby5zdHJpbmcgPSB0ZXh0ICsgRTsKICAgICAgICAgICAgby5vbiA9IHRydWU7CiAgICAgICAgICAgIGVsW2FwcGVuZENoaWxkXShvKTsKICAgICAgICAgICAgZWxbYXBwZW5kQ2hpbGRdKHBhdGgpOwogICAgICAgICAgICBnW2FwcGVuZENoaWxkXShlbCk7CiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRWxlbWVudChvLCBnLCB2bWwpOwogICAgICAgICAgICByZXMuc2hhcGUgPSBlbDsKICAgICAgICAgICAgcmVzLnRleHRwYXRoID0gcGF0aDsKICAgICAgICAgICAgcmVzLnR5cGUgPSAidGV4dCI7CiAgICAgICAgICAgIHJlcy5hdHRycy50ZXh0ID0gdGV4dDsKICAgICAgICAgICAgcmVzLmF0dHJzLnggPSB4OwogICAgICAgICAgICByZXMuYXR0cnMueSA9IHk7CiAgICAgICAgICAgIHJlcy5hdHRycy53ID0gMTsKICAgICAgICAgICAgcmVzLmF0dHJzLmggPSAxOwogICAgICAgICAgICBzZXRGaWxsQW5kU3Ryb2tlKHJlcywge2ZvbnQ6IGF2YWlsYWJsZUF0dHJzLmZvbnQsIHN0cm9rZTogIm5vbmUiLCBmaWxsOiAiIzAwMCJ9KTsKICAgICAgICAgICAgcmVzLnNldEJveCgpOwogICAgICAgICAgICB2bWwuY2FudmFzW2FwcGVuZENoaWxkXShnKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIHNldFNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICB2YXIgY3MgPSB0aGlzLmNhbnZhcy5zdHlsZTsKICAgICAgICAgICAgd2lkdGggPT0gK3dpZHRoICYmICh3aWR0aCArPSAicHgiKTsKICAgICAgICAgICAgaGVpZ2h0ID09ICtoZWlnaHQgJiYgKGhlaWdodCArPSAicHgiKTsKICAgICAgICAgICAgY3Mud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY3MuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICBjcy5jbGlwID0gInJlY3QoMCAiICsgd2lkdGggKyAiICIgKyBoZWlnaHQgKyAiIDApIjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICB2YXIgY3JlYXRlTm9kZTsKICAgICAgICBkb2MuY3JlYXRlU3R5bGVTaGVldCgpLmFkZFJ1bGUoIi5ydm1sIiwgImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIWRvYy5uYW1lc3BhY2VzLnJ2bWwgJiYgZG9jLm5hbWVzcGFjZXMuYWRkKCJydm1sIiwgInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIik7CiAgICAgICAgICAgIGNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAodGFnTmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KCc8cnZtbDonICsgdGFnTmFtZSArICcgY2xhc3M9InJ2bWwiPicpOwogICAgICAgICAgICB9OwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY3JlYXRlTm9kZSA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQoJzwnICsgdGFnTmFtZSArICcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC5jb206dm1sIiBjbGFzcz0icnZtbCI+Jyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGNvbiA9IGdldENvbnRhaW5lclthcHBseV0oMCwgYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbi5jb250YWluZXIsCiAgICAgICAgICAgICAgICBoZWlnaHQgPSBjb24uaGVpZ2h0LAogICAgICAgICAgICAgICAgcywKICAgICAgICAgICAgICAgIHdpZHRoID0gY29uLndpZHRoLAogICAgICAgICAgICAgICAgeCA9IGNvbi54LAogICAgICAgICAgICAgICAgeSA9IGNvbi55OwogICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJWTUwgY29udGFpbmVyIG5vdCBmb3VuZC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzID0gbmV3IFBhcGVyLAogICAgICAgICAgICAgICAgYyA9IHJlcy5jYW52YXMgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksCiAgICAgICAgICAgICAgICBjcyA9IGMuc3R5bGU7CiAgICAgICAgICAgIHdpZHRoID0gd2lkdGggfHwgNTEyOwogICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHQgfHwgMzQyOwogICAgICAgICAgICB3aWR0aCA9PSArd2lkdGggJiYgKHdpZHRoICs9ICJweCIpOwogICAgICAgICAgICBoZWlnaHQgPT0gK2hlaWdodCAmJiAoaGVpZ2h0ICs9ICJweCIpOwogICAgICAgICAgICByZXMud2lkdGggPSAxZTM7CiAgICAgICAgICAgIHJlcy5oZWlnaHQgPSAxZTM7CiAgICAgICAgICAgIHJlcy5jb29yZHNpemUgPSB6b29tICogMWUzICsgUyArIHpvb20gKiAxZTM7CiAgICAgICAgICAgIHJlcy5jb29yZG9yaWdpbiA9ICIwIDAiOwogICAgICAgICAgICByZXMuc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgIHJlcy5zcGFuLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OWVtO3RvcDotOTk5OWVtO3BhZGRpbmc6MDttYXJnaW46MDtsaW5lLWhlaWdodDoxO2Rpc3BsYXk6aW5saW5lOyI7CiAgICAgICAgICAgIGNbYXBwZW5kQ2hpbGRdKHJlcy5zcGFuKTsKICAgICAgICAgICAgY3MuY3NzVGV4dCA9IFIuZm9ybWF0KCJ3aWR0aDp7MH07aGVpZ2h0OnsxfTtwb3NpdGlvbjphYnNvbHV0ZTtjbGlwOnJlY3QoMCB7MH0gezF9IDApO292ZXJmbG93OmhpZGRlbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICBpZiAoY29udGFpbmVyID09IDEpIHsKICAgICAgICAgICAgICAgIGRvYy5ib2R5W2FwcGVuZENoaWxkXShjKTsKICAgICAgICAgICAgICAgIGNzLmxlZnQgPSB4ICsgInB4IjsKICAgICAgICAgICAgICAgIGNzLnRvcCA9IHkgKyAicHgiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGg7CiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjLCBjb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclthcHBlbmRDaGlsZF0oYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGx1Z2lucy5jYWxsKHJlcywgcmVzLCBSLmZuKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIFBhcGVyW3Byb3RvXS5jbGVhciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5jYW52YXMuaW5uZXJIVE1MID0gRTsKICAgICAgICAgICAgdGhpcy5zcGFuID0gZG9jLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgdGhpcy5zcGFuLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OWVtO3RvcDotOTk5OWVtO3BhZGRpbmc6MDttYXJnaW46MDtsaW5lLWhlaWdodDoxO2Rpc3BsYXk6aW5saW5lOyI7CiAgICAgICAgICAgIHRoaXMuY2FudmFzW2FwcGVuZENoaWxkXSh0aGlzLnNwYW4pOwogICAgICAgICAgICB0aGlzLmJvdHRvbSA9IHRoaXMudG9wID0gbnVsbDsKICAgICAgICB9OwogICAgICAgIFBhcGVyW3Byb3RvXS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHsKICAgICAgICAgICAgICAgIHRoaXNbaV0gPSByZW1vdmVkKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICB9CiAKICAgIC8vIHJlc3QKICAgIC8vIFNhZmFyaSBvciBDaHJvbWUgKFdlYktpdCkgcmVuZGVyaW5nIGJ1ZyB3b3JrYXJvdW5kIG1ldGhvZAogICAgaWYgKCgvXkFwcGxlfF5Hb29nbGUvKS50ZXN0KHdpbi5uYXZpZ2F0b3IudmVuZG9yKSAmJiAhKHdpbi5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlZlcnNpb24vNC4wIikgKyAxKSkgewogICAgICAgIFBhcGVyW3Byb3RvXS5zYWZhcmkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciByZWN0ID0gdGhpcy5yZWN0KC05OSwgLTk5LCB0aGlzLndpZHRoICsgOTksIHRoaXMuaGVpZ2h0ICsgOTkpOwogICAgICAgICAgICB3aW4uc2V0VGltZW91dChmdW5jdGlvbiAoKSB7cmVjdC5yZW1vdmUoKTt9KTsKICAgICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgICBQYXBlcltwcm90b10uc2FmYXJpID0gZnVuY3Rpb24gKCkge307CiAgICB9CiAKICAgIC8vIEV2ZW50cwogICAgdmFyIGFkZEV2ZW50ID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoZG9jLmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIHR5cGUsIGZuLCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLmNhbGwoZWxlbWVudCwgZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAoZG9jLmF0dGFjaEV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqLCB0eXBlLCBmbiwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5jYWxsKGVsZW1lbnQsIGUgfHwgd2luLmV2ZW50KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBvYmouYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGYpOwogICAgICAgICAgICAgICAgdmFyIGRldGFjaGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG9iai5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgZik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRldGFjaGVyOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pKCk7CiAgICBmb3IgKHZhciBpID0gZXZlbnRzW2xlbmd0aF07IGktLTspIHsKICAgICAgICAoZnVuY3Rpb24gKGV2ZW50TmFtZSkgewogICAgICAgICAgICBFbGVtZW50W3Byb3RvXVtldmVudE5hbWVdID0gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgICAgICAgICBpZiAoUi5pcyhmbiwgImZ1bmN0aW9uIikpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuZXZlbnRzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2goe25hbWU6IGV2ZW50TmFtZSwgZjogZm4sIHVuYmluZDogYWRkRXZlbnQodGhpcy5zaGFwZSB8fCB0aGlzLm5vZGUsIGV2ZW50TmFtZSwgZm4sIHRoaXMpfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgRWxlbWVudFtwcm90b11bInVuIiArIGV2ZW50TmFtZV0gPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cywKICAgICAgICAgICAgICAgICAgICBsID0gZXZlbnRzW2xlbmd0aF07CiAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSBpZiAoZXZlbnRzW2xdLm5hbWUgPT0gZXZlbnROYW1lICYmIGV2ZW50c1tsXS5mID09IGZuKSB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzW2xdLnVuYmluZCgpOwogICAgICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UobCwgMSk7CiAgICAgICAgICAgICAgICAgICAgIWV2ZW50cy5sZW5ndGggJiYgZGVsZXRlIHRoaXMuZXZlbnRzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH07CiAgICAgICAgfSkoZXZlbnRzW2ldKTsKICAgIH0KICAgIEVsZW1lbnRbcHJvdG9dLmhvdmVyID0gZnVuY3Rpb24gKGZfaW4sIGZfb3V0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubW91c2VvdmVyKGZfaW4pLm1vdXNlb3V0KGZfb3V0KTsKICAgIH07CiAgICBFbGVtZW50W3Byb3RvXS51bmhvdmVyID0gZnVuY3Rpb24gKGZfaW4sIGZfb3V0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudW5tb3VzZW92ZXIoZl9pbikudW5tb3VzZW91dChmX291dCk7CiAgICB9OwogICAgUGFwZXJbcHJvdG9dLmNpcmNsZSA9IGZ1bmN0aW9uICh4LCB5LCByKSB7CiAgICAgICAgcmV0dXJuIHRoZUNpcmNsZSh0aGlzLCB4IHx8IDAsIHkgfHwgMCwgciB8fCAwKTsKICAgIH07CiAgICBQYXBlcltwcm90b10ucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3LCBoLCByKSB7CiAgICAgICAgcmV0dXJuIHRoZVJlY3QodGhpcywgeCB8fCAwLCB5IHx8IDAsIHcgfHwgMCwgaCB8fCAwLCByIHx8IDApOwogICAgfTsKICAgIFBhcGVyW3Byb3RvXS5lbGxpcHNlID0gZnVuY3Rpb24gKHgsIHksIHJ4LCByeSkgewogICAgICAgIHJldHVybiB0aGVFbGxpcHNlKHRoaXMsIHggfHwgMCwgeSB8fCAwLCByeCB8fCAwLCByeSB8fCAwKTsKICAgIH07CiAgICBQYXBlcltwcm90b10ucGF0aCA9IGZ1bmN0aW9uIChwYXRoU3RyaW5nKSB7CiAgICAgICAgcGF0aFN0cmluZyAmJiAhUi5pcyhwYXRoU3RyaW5nLCAic3RyaW5nIikgJiYgIVIuaXMocGF0aFN0cmluZ1swXSwgImFycmF5IikgJiYgKHBhdGhTdHJpbmcgKz0gRSk7CiAgICAgICAgcmV0dXJuIHRoZVBhdGgoUi5mb3JtYXRbYXBwbHldKFIsIGFyZ3VtZW50cyksIHRoaXMpOwogICAgfTsKICAgIFBhcGVyW3Byb3RvXS5pbWFnZSA9IGZ1bmN0aW9uIChzcmMsIHgsIHksIHcsIGgpIHsKICAgICAgICByZXR1cm4gdGhlSW1hZ2UodGhpcywgc3JjIHx8ICJhYm91dDpibGFuayIsIHggfHwgMCwgeSB8fCAwLCB3IHx8IDAsIGggfHwgMCk7CiAgICB9OwogICAgUGFwZXJbcHJvdG9dLnRleHQgPSBmdW5jdGlvbiAoeCwgeSwgdGV4dCkgewogICAgICAgIHJldHVybiB0aGVUZXh0KHRoaXMsIHggfHwgMCwgeSB8fCAwLCB0ZXh0IHx8IEUpOwogICAgfTsKICAgIFBhcGVyW3Byb3RvXS5zZXQgPSBmdW5jdGlvbiAoaXRlbXNBcnJheSkgewogICAgICAgIGFyZ3VtZW50c1tsZW5ndGhdID4gMSAmJiAoaXRlbXNBcnJheSA9IEFycmF5W3Byb3RvXS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDAsIGFyZ3VtZW50c1tsZW5ndGhdKSk7CiAgICAgICAgcmV0dXJuIG5ldyBTZXQoaXRlbXNBcnJheSk7CiAgICB9OwogICAgUGFwZXJbcHJvdG9dLnNldFNpemUgPSBzZXRTaXplOwogICAgUGFwZXJbcHJvdG9dLnRvcCA9IFBhcGVyW3Byb3RvXS5ib3R0b20gPSBudWxsOwogICAgUGFwZXJbcHJvdG9dLnJhcGhhZWwgPSBSOwogICAgZnVuY3Rpb24geF95KCkgewogICAgICAgIHJldHVybiB0aGlzLnggKyBTICsgdGhpcy55OwogICAgfQogICAgRWxlbWVudFtwcm90b10uc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSwgY3gsIGN5KSB7CiAgICAgICAgaWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IHRoaXMuXy5zeCwKICAgICAgICAgICAgICAgIHk6IHRoaXMuXy5zeSwKICAgICAgICAgICAgICAgIHRvU3RyaW5nOiB4X3kKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgeSA9IHkgfHwgeDsKICAgICAgICAhK3kgJiYgKHkgPSB4KTsKICAgICAgICB2YXIgZHgsCiAgICAgICAgICAgIGR5LAogICAgICAgICAgICBkY3gsCiAgICAgICAgICAgIGRjeSwKICAgICAgICAgICAgYSA9IHRoaXMuYXR0cnM7CiAgICAgICAgaWYgKHggIT0gMCkgewogICAgICAgICAgICB2YXIgYmIgPSB0aGlzLmdldEJCb3goKSwKICAgICAgICAgICAgICAgIHJjeCA9IGJiLnggKyBiYi53aWR0aCAvIDIsCiAgICAgICAgICAgICAgICByY3kgPSBiYi55ICsgYmIuaGVpZ2h0IC8gMiwKICAgICAgICAgICAgICAgIGt4ID0geCAvIHRoaXMuXy5zeCwKICAgICAgICAgICAgICAgIGt5ID0geSAvIHRoaXMuXy5zeTsKICAgICAgICAgICAgY3ggPSAoK2N4IHx8IGN4ID09IDApID8gY3ggOiByY3g7CiAgICAgICAgICAgIGN5ID0gKCtjeSB8fCBjeSA9PSAwKSA/IGN5IDogcmN5OwogICAgICAgICAgICB2YXIgZGlyeCA9IH5+KHggLyBtYXRoLmFicyh4KSksCiAgICAgICAgICAgICAgICBkaXJ5ID0gfn4oeSAvIG1hdGguYWJzKHkpKSwKICAgICAgICAgICAgICAgIHMgPSB0aGlzLm5vZGUuc3R5bGUsCiAgICAgICAgICAgICAgICBuY3ggPSBjeCArIChyY3ggLSBjeCkgKiBreCwKICAgICAgICAgICAgICAgIG5jeSA9IGN5ICsgKHJjeSAtIGN5KSAqIGt5OwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAicmVjdCI6CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld3cgPSBhLndpZHRoICogZGlyeCAqIGt4LAogICAgICAgICAgICAgICAgICAgICAgICBuZXdoID0gYS5oZWlnaHQgKiBkaXJ5ICoga3k7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyKHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuZXdoLAogICAgICAgICAgICAgICAgICAgICAgICByOiBhLnIgKiBtbWluKGRpcnggKiBreCwgZGlyeSAqIGt5KSwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG5ld3csCiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG5jeCAtIG5ld3cgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICB5OiBuY3kgLSBuZXdoIC8gMgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiY2lyY2xlIjoKICAgICAgICAgICAgICAgIGNhc2UgImVsbGlwc2UiOgogICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cih7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4OiBhLnJ4ICogZGlyeCAqIGt4LAogICAgICAgICAgICAgICAgICAgICAgICByeTogYS5yeSAqIGRpcnkgKiBreSwKICAgICAgICAgICAgICAgICAgICAgICAgcjogYS5yICogbW1pbihkaXJ4ICoga3gsIGRpcnkgKiBreSksCiAgICAgICAgICAgICAgICAgICAgICAgIGN4OiBuY3gsCiAgICAgICAgICAgICAgICAgICAgICAgIGN5OiBuY3kKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInBhdGgiOgogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gcGF0aFRvUmVsYXRpdmUoYS5wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGF0aFtsZW5ndGhdOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHBhdGhbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQMCA9IHVwcGVyQ2FzZS5jYWxsKHBbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUDAgPT0gIk0iICYmIHNraXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQMCA9PSAiQSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbcGF0aFtpXVtsZW5ndGhdIC0gMl0gKj0ga3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW3BhdGhbaV1bbGVuZ3RoXSAtIDFdICo9IGt5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFsxXSAqPSBkaXJ4ICoga3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWzJdICo9IGRpcnkgKiBreTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbNV0gPSArIShkaXJ4ICsgZGlyeSA/ICErcFs1XSA6ICtwWzVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQMCA9PSAiSCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxLCBqaiA9IHBbbGVuZ3RoXTsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW2pdICo9IGt4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFAwID09ICJWIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMSwgamogPSBwW2xlbmd0aF07IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFtqXSAqPSBreTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAxLCBqaiA9IHBbbGVuZ3RoXTsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW2pdICo9IChqICUgMikgPyBreCA6IGt5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBkaW0yID0gcGF0aERpbWVuc2lvbnMocGF0aCk7CiAgICAgICAgICAgICAgICAgICAgZHggPSBuY3ggLSBkaW0yLnggLSBkaW0yLndpZHRoIC8gMjsKICAgICAgICAgICAgICAgICAgICBkeSA9IG5jeSAtIGRpbTIueSAtIGRpbTIuaGVpZ2h0IC8gMjsKICAgICAgICAgICAgICAgICAgICBwYXRoWzBdWzFdICs9IGR4OwogICAgICAgICAgICAgICAgICAgIHBhdGhbMF1bMl0gKz0gZHk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyKHtwYXRoOiBwYXRofSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy50eXBlIGluIHt0ZXh0OiAxLCBpbWFnZToxfSAmJiAoZGlyeCAhPSAxIHx8IGRpcnkgIT0gMSkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybWF0aW9ucykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtYXRpb25zWzJdID0gInNjYWxlKCJbY29uY2F0XShkaXJ4LCAiLCIsIGRpcnksICIpIik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlW3NldEF0dHJpYnV0ZV0oInRyYW5zZm9ybSIsIHRoaXMudHJhbnNmb3JtYXRpb25zW2pvaW5dKFMpKTsKICAgICAgICAgICAgICAgICAgICBkeCA9IChkaXJ4ID09IC0xKSA/IC1hLnggLSAobmV3dyB8fCAwKSA6IGEueDsKICAgICAgICAgICAgICAgICAgICBkeSA9IChkaXJ5ID09IC0xKSA/IC1hLnkgLSAobmV3aCB8fCAwKSA6IGEueTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoe3g6IGR4LCB5OiBkeX0pOwogICAgICAgICAgICAgICAgICAgIGEuZnggPSBkaXJ4IC0gMTsKICAgICAgICAgICAgICAgICAgICBhLmZ5ID0gZGlyeSAtIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5maWx0ZXJNYXRyaXggPSAiIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPSJbY29uY2F0XShkaXJ4LAogICAgICAgICAgICAgICAgICAgICAgICAiLCBNMTI9MCwgTTIxPTAsIE0yMj0iLCBkaXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAiLCBEeD0wLCBEeT0wLCBzaXppbmdtZXRob2Q9J2F1dG8gZXhwYW5kJywgZmlsdGVydHlwZT0nYmlsaW5lYXInKSIpOwogICAgICAgICAgICAgICAgICAgIHMuZmlsdGVyID0gKHRoaXMubm9kZS5maWx0ZXJNYXRyaXggfHwgRSkgKyAodGhpcy5ub2RlLmZpbHRlck9wYWNpdHkgfHwgRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1hdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybWF0aW9uc1syXSA9IEU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlW3NldEF0dHJpYnV0ZV0oInRyYW5zZm9ybSIsIHRoaXMudHJhbnNmb3JtYXRpb25zW2pvaW5dKFMpKTsKICAgICAgICAgICAgICAgICAgICBhLmZ4ID0gMDsKICAgICAgICAgICAgICAgICAgICBhLmZ5ID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLmZpbHRlck1hdHJpeCA9IEU7CiAgICAgICAgICAgICAgICAgICAgcy5maWx0ZXIgPSAodGhpcy5ub2RlLmZpbHRlck1hdHJpeCB8fCBFKSArICh0aGlzLm5vZGUuZmlsdGVyT3BhY2l0eSB8fCBFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhLnNjYWxlID0gW3gsIHksIGN4LCBjeV1bam9pbl0oUyk7CiAgICAgICAgICAgIHRoaXMuXy5zeCA9IHg7CiAgICAgICAgICAgIHRoaXMuXy5zeSA9IHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEVsZW1lbnRbcHJvdG9dLmNsb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBhdHRyID0gdGhpcy5hdHRyKCk7CiAgICAgICAgZGVsZXRlIGF0dHIuc2NhbGU7CiAgICAgICAgZGVsZXRlIGF0dHIudHJhbnNsYXRpb247CiAgICAgICAgcmV0dXJuIHRoaXMucGFwZXJbdGhpcy50eXBlXSgpLmF0dHIoYXR0cik7CiAgICB9OwogICAgdmFyIGdldFBvaW50QXRTZWdtZW50TGVuZ3RoID0gY2FjaGVyKGZ1bmN0aW9uIChwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGxlbiA9IDAsCiAgICAgICAgICAgIG9sZDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEuMDAxOyBpKz0uMDAxKSB7CiAgICAgICAgICAgIHZhciBkb3QgPSBSLmZpbmREb3RzQXRTZWdtZW50KHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCBpKTsKICAgICAgICAgICAgaSAmJiAobGVuICs9IHBvdyhwb3cob2xkLnggLSBkb3QueCwgMikgKyBwb3cob2xkLnkgLSBkb3QueSwgMiksIC41KSk7CiAgICAgICAgICAgIGlmIChsZW4gPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG90OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9sZCA9IGRvdDsKICAgICAgICB9CiAgICB9KSwKICAgIGdldExlbmd0aEZhY3RvcnkgPSBmdW5jdGlvbiAoaXN0b3RhbCwgc3VicGF0aCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAocGF0aCwgbGVuZ3RoLCBvbmx5c3RhcnQpIHsKICAgICAgICAgICAgcGF0aCA9IHBhdGgyY3VydmUocGF0aCk7CiAgICAgICAgICAgIHZhciB4LCB5LCBwLCBsLCBzcCA9ICIiLCBzdWJwYXRocyA9IHt9LCBwb2ludCwKICAgICAgICAgICAgICAgIGxlbiA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdGgubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgcCA9IHBhdGhbaV07CiAgICAgICAgICAgICAgICBpZiAocFswXSA9PSAiTSIpIHsKICAgICAgICAgICAgICAgICAgICB4ID0gK3BbMV07CiAgICAgICAgICAgICAgICAgICAgeSA9ICtwWzJdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsID0gc2VnbWVudExlbmd0aCh4LCB5LCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuICsgbCA+IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VicGF0aCAmJiAhc3VicGF0aHMuc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ID0gZ2V0UG9pbnRBdFNlZ21lbnRMZW5ndGgoeCwgeSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgbGVuZ3RoIC0gbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwICs9IFsiQyIsIHBvaW50LnN0YXJ0LngsIHBvaW50LnN0YXJ0LnksIHBvaW50Lm0ueCwgcG9pbnQubS55LCBwb2ludC54LCBwb2ludC55XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmx5c3RhcnQpIHtyZXR1cm4gc3A7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0aHMuc3RhcnQgPSBzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gWyJNIiwgcG9pbnQueCwgcG9pbnQueSArICJDIiwgcG9pbnQubi54LCBwb2ludC5uLnksIHBvaW50LmVuZC54LCBwb2ludC5lbmQueSwgcFs1XSwgcFs2XV1bam9pbl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICtwWzVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICtwWzZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3RvdGFsICYmICFzdWJwYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCA9IGdldFBvaW50QXRTZWdtZW50TGVuZ3RoKHgsIHksIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIHBbNl0sIGxlbmd0aCAtIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHBvaW50LngsIHk6IHBvaW50LnksIGFscGhhOiBwb2ludC5hbHBoYX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGVuICs9IGw7CiAgICAgICAgICAgICAgICAgICAgeCA9ICtwWzVdOwogICAgICAgICAgICAgICAgICAgIHkgPSArcFs2XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNwICs9IHA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VicGF0aHMuZW5kID0gc3A7CiAgICAgICAgICAgIHBvaW50ID0gaXN0b3RhbCA/IGxlbiA6IHN1YnBhdGggPyBzdWJwYXRocyA6IFIuZmluZERvdHNBdFNlZ21lbnQoeCwgeSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgMSk7CiAgICAgICAgICAgIHBvaW50LmFscGhhICYmIChwb2ludCA9IHt4OiBwb2ludC54LCB5OiBwb2ludC55LCBhbHBoYTogcG9pbnQuYWxwaGF9KTsKICAgICAgICAgICAgcmV0dXJuIHBvaW50OwogICAgICAgIH07CiAgICB9LAogICAgc2VnbWVudExlbmd0aCA9IGNhY2hlcihmdW5jdGlvbiAocDF4LCBwMXksIGMxeCwgYzF5LCBjMngsIGMyeSwgcDJ4LCBwMnkpIHsKICAgICAgICB2YXIgb2xkID0ge3g6IDAsIHk6IDB9LAogICAgICAgICAgICBsZW4gPSAwOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMS4wMTsgaSs9LjAxKSB7CiAgICAgICAgICAgIHZhciBkb3QgPSBmaW5kRG90QXRTZWdtZW50KHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCBpKTsKICAgICAgICAgICAgaSAmJiAobGVuICs9IHBvdyhwb3cob2xkLnggLSBkb3QueCwgMikgKyBwb3cob2xkLnkgLSBkb3QueSwgMiksIC41KSk7CiAgICAgICAgICAgIG9sZCA9IGRvdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlbjsKICAgIH0pOwogICAgdmFyIGdldFRvdGFsTGVuZ3RoID0gZ2V0TGVuZ3RoRmFjdG9yeSgxKSwKICAgICAgICBnZXRQb2ludEF0TGVuZ3RoID0gZ2V0TGVuZ3RoRmFjdG9yeSgpLAogICAgICAgIGdldFN1YnBhdGhzQXRMZW5ndGggPSBnZXRMZW5ndGhGYWN0b3J5KDAsIDEpOwogICAgRWxlbWVudFtwcm90b10uZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHRoaXMudHlwZSAhPSAicGF0aCIpIHtyZXR1cm47fQogICAgICAgIHJldHVybiBnZXRUb3RhbExlbmd0aCh0aGlzLmF0dHJzLnBhdGgpOwogICAgfTsKICAgIEVsZW1lbnRbcHJvdG9dLmdldFBvaW50QXRMZW5ndGggPSBmdW5jdGlvbiAobGVuZ3RoKSB7CiAgICAgICAgaWYgKHRoaXMudHlwZSAhPSAicGF0aCIpIHtyZXR1cm47fQogICAgICAgIHJldHVybiBnZXRQb2ludEF0TGVuZ3RoKHRoaXMuYXR0cnMucGF0aCwgbGVuZ3RoKTsKICAgIH07CiAgICBFbGVtZW50W3Byb3RvXS5nZXRTdWJwYXRoID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7CiAgICAgICAgaWYgKHRoaXMudHlwZSAhPSAicGF0aCIpIHtyZXR1cm47fQogICAgICAgIGlmIChtYXRoLmFicyh0aGlzLmdldFRvdGFsTGVuZ3RoKCkgLSB0bykgPCAxZS02KSB7CiAgICAgICAgICAgIHJldHVybiBnZXRTdWJwYXRoc0F0TGVuZ3RoKHRoaXMuYXR0cnMucGF0aCwgZnJvbSkuZW5kOwogICAgICAgIH0KICAgICAgICB2YXIgYSA9IGdldFN1YnBhdGhzQXRMZW5ndGgodGhpcy5hdHRycy5wYXRoLCB0bywgMSk7CiAgICAgICAgcmV0dXJuIGZyb20gPyBnZXRTdWJwYXRoc0F0TGVuZ3RoKGEsIGZyb20pLmVuZCA6IGE7CiAgICB9OwoKICAgIC8vIGFuaW1hdGlvbiBlYXNpbmcgZm9ybXVsYXMKICAgIFIuZWFzaW5nX2Zvcm11bGFzID0gewogICAgICAgIGxpbmVhcjogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfSwKICAgICAgICAiPCI6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIHJldHVybiBwb3cobiwgMyk7CiAgICAgICAgfSwKICAgICAgICAiPiI6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIHJldHVybiBwb3cobiAtIDEsIDMpICsgMTsKICAgICAgICB9LAogICAgICAgICI8PiI6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIG4gPSBuICogMjsKICAgICAgICAgICAgaWYgKG4gPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcG93KG4sIDMpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBuIC09IDI7CiAgICAgICAgICAgIHJldHVybiAocG93KG4sIDMpICsgMikgLyAyOwogICAgICAgIH0sCiAgICAgICAgYmFja0luOiBmdW5jdGlvbiAobikgewogICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTg7CiAgICAgICAgICAgIHJldHVybiBuICogbiAqICgocyArIDEpICogbiAtIHMpOwogICAgICAgIH0sCiAgICAgICAgYmFja091dDogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgbiA9IG4gLSAxOwogICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTg7CiAgICAgICAgICAgIHJldHVybiBuICogbiAqICgocyArIDEpICogbiArIHMpICsgMTsKICAgICAgICB9LAogICAgICAgIGVsYXN0aWM6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIGlmIChuID09IDAgfHwgbiA9PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcCA9IC4zLAogICAgICAgICAgICAgICAgcyA9IHAgLyA0OwogICAgICAgICAgICByZXR1cm4gcG93KDIsIC0xMCAqIG4pICogbWF0aC5zaW4oKG4gLSBzKSAqICgyICogbWF0aC5QSSkgLyBwKSArIDE7CiAgICAgICAgfSwKICAgICAgICBib3VuY2U6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgIHZhciBzID0gNy41NjI1LAogICAgICAgICAgICAgICAgcCA9IDIuNzUsCiAgICAgICAgICAgICAgICBsOwogICAgICAgICAgICBpZiAobiA8ICgxIC8gcCkpIHsKICAgICAgICAgICAgICAgIGwgPSBzICogbiAqIG47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobiA8ICgyIC8gcCkpIHsKICAgICAgICAgICAgICAgICAgICBuIC09ICgxLjUgLyBwKTsKICAgICAgICAgICAgICAgICAgICBsID0gcyAqIG4gKiBuICsgLjc1OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAobiA8ICgyLjUgLyBwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuIC09ICgyLjI1IC8gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBzICogbiAqIG4gKyAuOTM3NTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBuIC09ICgyLjYyNSAvIHApOwogICAgICAgICAgICAgICAgICAgICAgICBsID0gcyAqIG4gKiBuICsgLjk4NDM3NTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgfQogICAgfTsKIAogICAgdmFyIGFuaW1hdGlvbkVsZW1lbnRzID0ge2xlbmd0aCA6IDB9LAogICAgICAgIGFuaW1hdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIE5vdyA9ICtuZXcgRGF0ZTsKICAgICAgICAgICAgZm9yICh2YXIgbCBpbiBhbmltYXRpb25FbGVtZW50cykgaWYgKGwgIT0gImxlbmd0aCIgJiYgYW5pbWF0aW9uRWxlbWVudHNbaGFzXShsKSkgewogICAgICAgICAgICAgICAgdmFyIGUgPSBhbmltYXRpb25FbGVtZW50c1tsXTsKICAgICAgICAgICAgICAgIGlmIChlLnN0b3AgfHwgZS5lbC5yZW1vdmVkKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFuaW1hdGlvbkVsZW1lbnRzW2xdOwogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkVsZW1lbnRzW2xlbmd0aF0tLTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aW1lID0gTm93IC0gZS5zdGFydCwKICAgICAgICAgICAgICAgICAgICBtcyA9IGUubXMsCiAgICAgICAgICAgICAgICAgICAgZWFzaW5nID0gZS5lYXNpbmcsCiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IGUuZnJvbSwKICAgICAgICAgICAgICAgICAgICBkaWZmID0gZS5kaWZmLAogICAgICAgICAgICAgICAgICAgIHRvID0gZS50bywKICAgICAgICAgICAgICAgICAgICB0ID0gZS50LAogICAgICAgICAgICAgICAgICAgIHByZXYgPSBlLnByZXYgfHwgMCwKICAgICAgICAgICAgICAgICAgICB0aGF0ID0gZS5lbCwKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGUuY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgc2V0ID0ge30sCiAgICAgICAgICAgICAgICAgICAgbm93OwogICAgICAgICAgICAgICAgaWYgKHRpbWUgPCBtcykgewogICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBSLmVhc2luZ19mb3JtdWxhc1tlYXNpbmddID8gUi5lYXNpbmdfZm9ybXVsYXNbZWFzaW5nXSh0aW1lIC8gbXMpIDogdGltZSAvIG1zOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dHIgaW4gZnJvbSkgaWYgKGZyb21baGFzXShhdHRyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF2YWlsYWJsZUFuaW1BdHRyc1thdHRyXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYWxvbmciOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA9IHBvcyAqIG1zICogZGlmZlthdHRyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5iYWNrICYmIChub3cgPSB0by5sZW4gLSBub3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50QXRMZW5ndGgodG9bYXR0cl0sIG5vdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC50cmFuc2xhdGUoZGlmZi5zeCAtIGRpZmYueCB8fCAwLCBkaWZmLnN5IC0gZGlmZi55IHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYueCA9IHBvaW50Lng7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi55ID0gcG9pbnQueTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnRyYW5zbGF0ZShwb2ludC54IC0gZGlmZi5zeCwgcG9pbnQueSAtIGRpZmYuc3kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLnJvdCAmJiB0aGF0LnJvdGF0ZShkaWZmLnIgKyBwb2ludC5hbHBoYSwgcG9pbnQueCwgcG9pbnQueSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA9ICtmcm9tW2F0dHJdICsgcG9zICogbXMgKiBkaWZmW2F0dHJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiY29sb3VyIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSAicmdiKCIgKyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8yNTUocm91bmQoZnJvbVthdHRyXS5yICsgcG9zICogbXMgKiBkaWZmW2F0dHJdLnIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0bzI1NShyb3VuZChmcm9tW2F0dHJdLmcgKyBwb3MgKiBtcyAqIGRpZmZbYXR0cl0uZykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRvMjU1KHJvdW5kKGZyb21bYXR0cl0uYiArIHBvcyAqIG1zICogZGlmZlthdHRyXS5iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdW2pvaW5dKCIsIikgKyAiKSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwYXRoIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmcm9tW2F0dHJdW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1tpXSA9IFtmcm9tW2F0dHJdW2ldWzBdXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDEsIGpqID0gZnJvbVthdHRyXVtpXVtsZW5ndGhdOyBqIDwgamo7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93W2ldW2pdID0gK2Zyb21bYXR0cl1baV1bal0gKyBwb3MgKiBtcyAqIGRpZmZbYXR0cl1baV1bal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93W2ldID0gbm93W2ldW2pvaW5dKFMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSBub3dbam9pbl0oUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjc3YiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYXR0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0cmFuc2xhdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IGRpZmZbYXR0cl1bMF0gKiAodGltZSAtIHByZXYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkaWZmW2F0dHJdWzFdICogKHRpbWUgLSBwcmV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQueCArPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC55ICs9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSB4ICsgUyArIHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJyb3RhdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSArZnJvbVthdHRyXVswXSArIHBvcyAqIG1zICogZGlmZlthdHRyXVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21bYXR0cl1bMV0gJiYgKG5vdyArPSAiLCIgKyBmcm9tW2F0dHJdWzFdICsgIiwiICsgZnJvbVthdHRyXVsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJzY2FsZSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPSBbK2Zyb21bYXR0cl1bMF0gKyBwb3MgKiBtcyAqIGRpZmZbYXR0cl1bMF0sICtmcm9tW2F0dHJdWzFdICsgcG9zICogbXMgKiBkaWZmW2F0dHJdWzFdLCAoMiBpbiB0b1thdHRyXSA/IHRvW2F0dHJdWzJdIDogRSksICgzIGluIHRvW2F0dHJdID8gdG9bYXR0cl1bM10gOiBFKV1bam9pbl0oUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGlwLXJlY3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dbaV0gPSArZnJvbVthdHRyXVtpXSArIHBvcyAqIG1zICogZGlmZlthdHRyXVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFthdHRyXSA9IG5vdzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhhdC5hdHRyKHNldCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcnVuICYmIHRoYXQuX3J1bi5jYWxsKHRoYXQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG8uYWxvbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSBnZXRQb2ludEF0TGVuZ3RoKHRvLmFsb25nLCB0by5sZW4gKiAhdG8uYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQudHJhbnNsYXRlKGRpZmYuc3ggLSAoZGlmZi54IHx8IDApICsgcG9pbnQueCAtIGRpZmYuc3gsIGRpZmYuc3kgLSAoZGlmZi55IHx8IDApICsgcG9pbnQueSAtIGRpZmYuc3kpOwogICAgICAgICAgICAgICAgICAgICAgICB0by5yb3QgJiYgdGhhdC5yb3RhdGUoZGlmZi5yICsgcG9pbnQuYWxwaGEsIHBvaW50LngsIHBvaW50LnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAodC54IHx8IHQueSkgJiYgdGhhdC50cmFuc2xhdGUoLXQueCwgLXQueSk7CiAgICAgICAgICAgICAgICAgICAgdG8uc2NhbGUgJiYgKHRvLnNjYWxlID0gdG8uc2NhbGUgKyBFKTsKICAgICAgICAgICAgICAgICAgICB0aGF0LmF0dHIodG8pOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhbmltYXRpb25FbGVtZW50c1tsXTsKICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25FbGVtZW50c1tsZW5ndGhdLS07CiAgICAgICAgICAgICAgICAgICAgdGhhdC5pbl9hbmltYXRpb24gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIFIuaXMoY2FsbGJhY2ssICJmdW5jdGlvbiIpICYmIGNhbGxiYWNrLmNhbGwodGhhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLnByZXYgPSB0aW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFIuc3ZnICYmIHRoYXQgJiYgdGhhdC5wYXBlci5zYWZhcmkoKTsKICAgICAgICAgICAgYW5pbWF0aW9uRWxlbWVudHNbbGVuZ3RoXSAmJiB3aW4uc2V0VGltZW91dChhbmltYXRpb24pOwogICAgICAgIH0sCiAgICAgICAgdXB0bzI1NSA9IGZ1bmN0aW9uIChjb2xvcikgewogICAgICAgICAgICByZXR1cm4gY29sb3IgPiAyNTUgPyAyNTUgOiAoY29sb3IgPCAwID8gMCA6IGNvbG9yKTsKICAgICAgICB9LAogICAgICAgIHRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh4LCB5KSB7CiAgICAgICAgICAgIGlmICh4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7eDogdGhpcy5fLnR4LCB5OiB0aGlzLl8udHksIHRvU3RyaW5nOiB4X3l9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuXy50eCArPSAreDsKICAgICAgICAgICAgdGhpcy5fLnR5ICs9ICt5OwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiY2lyY2xlIjoKICAgICAgICAgICAgICAgIGNhc2UgImVsbGlwc2UiOgogICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cih7Y3g6ICt4ICsgdGhpcy5hdHRycy5jeCwgY3k6ICt5ICsgdGhpcy5hdHRycy5jeX0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicmVjdCI6CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICAgICAgICBjYXNlICJ0ZXh0IjoKICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoe3g6ICt4ICsgdGhpcy5hdHRycy54LCB5OiAreSArIHRoaXMuYXR0cnMueX0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicGF0aCI6CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBwYXRoVG9SZWxhdGl2ZSh0aGlzLmF0dHJzLnBhdGgpOwogICAgICAgICAgICAgICAgICAgIHBhdGhbMF1bMV0gKz0gK3g7CiAgICAgICAgICAgICAgICAgICAgcGF0aFswXVsyXSArPSAreTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoe3BhdGg6IHBhdGh9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICBFbGVtZW50W3Byb3RvXS5hbmltYXRlV2l0aCA9IGZ1bmN0aW9uIChlbGVtZW50LCBwYXJhbXMsIG1zLCBlYXNpbmcsIGNhbGxiYWNrKSB7CiAgICAgICAgYW5pbWF0aW9uRWxlbWVudHNbZWxlbWVudC5pZF0gJiYgKHBhcmFtcy5zdGFydCA9IGFuaW1hdGlvbkVsZW1lbnRzW2VsZW1lbnQuaWRdLnN0YXJ0KTsKICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHBhcmFtcywgbXMsIGVhc2luZywgY2FsbGJhY2spOwogICAgfTsKICAgIEVsZW1lbnRbcHJvdG9dLmFuaW1hdGVBbG9uZyA9IGFsb25nKCk7CiAgICBFbGVtZW50W3Byb3RvXS5hbmltYXRlQWxvbmdCYWNrID0gYWxvbmcoMSk7CiAgICBmdW5jdGlvbiBhbG9uZyhpc0JhY2spIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBhdGgsIG1zLCByb3RhdGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7YmFjazogaXNCYWNrfTsKICAgICAgICAgICAgUi5pcyhyb3RhdGUsICJmdW5jdGlvbiIpID8gKGNhbGxiYWNrID0gcm90YXRlKSA6IChwYXJhbXMucm90ID0gcm90YXRlKTsKICAgICAgICAgICAgcGF0aCAmJiBwYXRoLmNvbnN0cnVjdG9yID09IEVsZW1lbnQgJiYgKHBhdGggPSBwYXRoLmF0dHJzLnBhdGgpOwogICAgICAgICAgICBwYXRoICYmIChwYXJhbXMuYWxvbmcgPSBwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZShwYXJhbXMsIG1zLCBjYWxsYmFjayk7CiAgICAgICAgfTsKICAgIH0KICAgIEVsZW1lbnRbcHJvdG9dLm9uQW5pbWF0aW9uID0gZnVuY3Rpb24gKGYpIHsKICAgICAgICB0aGlzLl9ydW4gPSBmIHx8IDA7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgRWxlbWVudFtwcm90b10uYW5pbWF0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIG1zLCBlYXNpbmcsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKFIuaXMoZWFzaW5nLCAiZnVuY3Rpb24iKSB8fCAhZWFzaW5nKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gZWFzaW5nIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciBmcm9tID0ge30sCiAgICAgICAgICAgIHRvID0ge30sCiAgICAgICAgICAgIGRpZmYgPSB7fTsKICAgICAgICBmb3IgKHZhciBhdHRyIGluIHBhcmFtcykgaWYgKHBhcmFtc1toYXNdKGF0dHIpKSB7CiAgICAgICAgICAgIGlmIChhdmFpbGFibGVBbmltQXR0cnNbaGFzXShhdHRyKSkgewogICAgICAgICAgICAgICAgZnJvbVthdHRyXSA9IHRoaXMuYXR0cihhdHRyKTsKICAgICAgICAgICAgICAgIChmcm9tW2F0dHJdID09IG51bGwpICYmIChmcm9tW2F0dHJdID0gYXZhaWxhYmxlQXR0cnNbYXR0cl0pOwogICAgICAgICAgICAgICAgdG9bYXR0cl0gPSBwYXJhbXNbYXR0cl07CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGF2YWlsYWJsZUFuaW1BdHRyc1thdHRyXSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImFsb25nIjoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IGdldFRvdGFsTGVuZ3RoKHBhcmFtc1thdHRyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCA9IGdldFBvaW50QXRMZW5ndGgocGFyYW1zW2F0dHJdLCBsZW4gKiAhIXBhcmFtcy5iYWNrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiID0gdGhpcy5nZXRCQm94KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl0gPSBsZW4gLyBtczsKICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi50eCA9IGJiLng7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYudHkgPSBiYi55OwogICAgICAgICAgICAgICAgICAgICAgICBkaWZmLnN4ID0gcG9pbnQueDsKICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi5zeSA9IHBvaW50Lnk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvLnJvdCA9IHBhcmFtcy5yb3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvLmJhY2sgPSBwYXJhbXMuYmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgdG8ubGVuID0gbGVuOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMucm90ICYmIChkaWZmLnIgPSB0b0Zsb2F0KHRoaXMucm90YXRlKCkpIHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICAgICAgICAgICAgICBkaWZmW2F0dHJdID0gKHRvW2F0dHJdIC0gZnJvbVthdHRyXSkgLyBtczsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY29sb3VyIjoKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVthdHRyXSA9IFIuZ2V0UkdCKGZyb21bYXR0cl0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db2xvdXIgPSBSLmdldFJHQih0b1thdHRyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByOiAodG9Db2xvdXIuciAtIGZyb21bYXR0cl0ucikgLyBtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc6ICh0b0NvbG91ci5nIC0gZnJvbVthdHRyXS5nKSAvIG1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYjogKHRvQ29sb3VyLmIgLSBmcm9tW2F0dHJdLmIpIC8gbXMKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicGF0aCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoZXMgPSBwYXRoMmN1cnZlKGZyb21bYXR0cl0sIHRvW2F0dHJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVthdHRyXSA9IHBhdGhlc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvUGF0aCA9IHBhdGhlc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlthdHRyXSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmcm9tW2F0dHJdW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmW2F0dHJdW2ldID0gWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDEsIGpqID0gZnJvbVthdHRyXVtpXVtsZW5ndGhdOyBqIDwgamo7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl1baV1bal0gPSAodG9QYXRoW2ldW2pdIC0gZnJvbVthdHRyXVtpXVtqXSkgLyBtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJjc3YiOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gKHBhcmFtc1thdHRyXSArIEUpW3NwbGl0XShzZXBhcmF0b3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTIgPSAoZnJvbVthdHRyXSArIEUpW3NwbGl0XShzZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRyYW5zbGF0aW9uIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tW2F0dHJdID0gWzAsIDBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl0gPSBbdmFsdWVzWzBdIC8gbXMsIHZhbHVlc1sxXSAvIG1zXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicm90YXRpb24iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21bYXR0cl0gPSAoZnJvbTJbMV0gPT0gdmFsdWVzWzFdICYmIGZyb20yWzJdID09IHZhbHVlc1syXSkgPyBmcm9tMiA6IFswLCB2YWx1ZXNbMV0sIHZhbHVlc1syXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlthdHRyXSA9IFsodmFsdWVzWzBdIC0gZnJvbVthdHRyXVswXSkgLyBtcywgMCwgMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInNjYWxlIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbYXR0cl0gPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVthdHRyXSA9IChmcm9tW2F0dHJdICsgRSlbc3BsaXRdKHNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlthdHRyXSA9IFsodmFsdWVzWzBdIC0gZnJvbVthdHRyXVswXSkgLyBtcywgKHZhbHVlc1sxXSAtIGZyb21bYXR0cl1bMV0pIC8gbXMsIDAsIDBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGlwLXJlY3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21bYXR0cl0gPSAoZnJvbVthdHRyXSArIEUpW3NwbGl0XShzZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZbYXR0cl1baV0gPSAodmFsdWVzW2ldIC0gZnJvbVthdHRyXVtpXSkgLyBtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0b1thdHRyXSA9IHZhbHVlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICB0aGlzLmluX2FuaW1hdGlvbiA9IDE7CiAgICAgICAgYW5pbWF0aW9uRWxlbWVudHNbdGhpcy5pZF0gPSB7CiAgICAgICAgICAgIHN0YXJ0OiBwYXJhbXMuc3RhcnQgfHwgK25ldyBEYXRlLAogICAgICAgICAgICBtczogbXMsCiAgICAgICAgICAgIGVhc2luZzogZWFzaW5nLAogICAgICAgICAgICBmcm9tOiBmcm9tLAogICAgICAgICAgICBkaWZmOiBkaWZmLAogICAgICAgICAgICB0bzogdG8sCiAgICAgICAgICAgIGVsOiB0aGlzLAogICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssCiAgICAgICAgICAgIHQ6IHt4OiAwLCB5OiAwfQogICAgICAgIH07CiAgICAgICAgKythbmltYXRpb25FbGVtZW50c1tsZW5ndGhdID09IDEgJiYgYW5pbWF0aW9uKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgRWxlbWVudFtwcm90b10uc3RvcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBhbmltYXRpb25FbGVtZW50c1t0aGlzLmlkXSAmJiBhbmltYXRpb25FbGVtZW50c1tsZW5ndGhdLS07CiAgICAgICAgZGVsZXRlIGFuaW1hdGlvbkVsZW1lbnRzW3RoaXMuaWRdOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEVsZW1lbnRbcHJvdG9dLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh4LCB5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cih7dHJhbnNsYXRpb246IHggKyAiICIgKyB5fSk7CiAgICB9OwogICAgRWxlbWVudFtwcm90b11bdG9TdHJpbmddID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAiUmFwaGFceGVibFx1MjAxOXMgb2JqZWN0IjsKICAgIH07CiAgICBSLmFlID0gYW5pbWF0aW9uRWxlbWVudHM7CiAKICAgIC8vIFNldAogICAgdmFyIFNldCA9IGZ1bmN0aW9uIChpdGVtcykgewogICAgICAgIHRoaXMuaXRlbXMgPSBbXTsKICAgICAgICB0aGlzW2xlbmd0aF0gPSAwOwogICAgICAgIGlmIChpdGVtcykgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpdGVtc1tsZW5ndGhdOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGl0ZW1zW2ldICYmIChpdGVtc1tpXS5jb25zdHJ1Y3RvciA9PSBFbGVtZW50IHx8IGl0ZW1zW2ldLmNvbnN0cnVjdG9yID09IFNldCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3RoaXMuaXRlbXNbbGVuZ3RoXV0gPSB0aGlzLml0ZW1zW3RoaXMuaXRlbXNbbGVuZ3RoXV0gPSBpdGVtc1tpXTsKICAgICAgICAgICAgICAgICAgICB0aGlzW2xlbmd0aF0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICBTZXRbcHJvdG9dW3B1c2hdID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBpdGVtLAogICAgICAgICAgICBsZW47CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYXJndW1lbnRzW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGl0ZW0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGlmIChpdGVtICYmIChpdGVtLmNvbnN0cnVjdG9yID09IEVsZW1lbnQgfHwgaXRlbS5jb25zdHJ1Y3RvciA9PSBTZXQpKSB7CiAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLml0ZW1zW2xlbmd0aF07CiAgICAgICAgICAgICAgICB0aGlzW2xlbl0gPSB0aGlzLml0ZW1zW2xlbl0gPSBpdGVtOwogICAgICAgICAgICAgICAgdGhpc1tsZW5ndGhdKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgU2V0W3Byb3RvXS5wb3AgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbdGhpc1tsZW5ndGhdLS1dOwogICAgICAgIHJldHVybiB0aGlzLml0ZW1zLnBvcCgpOwogICAgfTsKICAgIGZvciAodmFyIG1ldGhvZCBpbiBFbGVtZW50W3Byb3RvXSkgaWYgKEVsZW1lbnRbcHJvdG9dW2hhc10obWV0aG9kKSkgewogICAgICAgIFNldFtwcm90b11bbWV0aG9kXSA9IChmdW5jdGlvbiAobWV0aG9kbmFtZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5pdGVtc1tsZW5ndGhdOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaV1bbWV0aG9kbmFtZV1bYXBwbHldKHRoaXMuaXRlbXNbaV0sIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfTsKICAgICAgICB9KShtZXRob2QpOwogICAgfQogICAgU2V0W3Byb3RvXS5hdHRyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgaWYgKG5hbWUgJiYgUi5pcyhuYW1lLCAiYXJyYXkiKSAmJiBSLmlzKG5hbWVbMF0sICJvYmplY3QiKSkgewogICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBuYW1lW2xlbmd0aF07IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2pdLmF0dHIobmFtZVtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLml0ZW1zW2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2ldLmF0dHIobmFtZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIFNldFtwcm90b10uYW5pbWF0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIG1zLCBlYXNpbmcsIGNhbGxiYWNrKSB7CiAgICAgICAgKFIuaXMoZWFzaW5nLCAiZnVuY3Rpb24iKSB8fCAhZWFzaW5nKSAmJiAoY2FsbGJhY2sgPSBlYXNpbmcgfHwgbnVsbCk7CiAgICAgICAgdmFyIGxlbiA9IHRoaXMuaXRlbXNbbGVuZ3RoXSwKICAgICAgICAgICAgaSA9IGxlbiwKICAgICAgICAgICAgc2V0ID0gdGhpcywKICAgICAgICAgICAgY29sbGVjdG9yOwogICAgICAgIGNhbGxiYWNrICYmIChjb2xsZWN0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICEtLWxlbiAmJiBjYWxsYmFjay5jYWxsKHNldCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5pdGVtc1stLWldLmFuaW1hdGUocGFyYW1zLCBtcywgZWFzaW5nIHx8IGNvbGxlY3RvciwgY29sbGVjdG9yKTsKICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0uYW5pbWF0ZVdpdGgodGhpcy5pdGVtc1tsZW4gLSAxXSwgcGFyYW1zLCBtcywgZWFzaW5nIHx8IGNvbGxlY3RvciwgY29sbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgU2V0W3Byb3RvXS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChlbCkgewogICAgICAgIHZhciBpID0gdGhpcy5pdGVtc1tsZW5ndGhdOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5pbnNlcnRBZnRlcihlbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIFNldFtwcm90b10uZ2V0QkJveCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgeCA9IFtdLAogICAgICAgICAgICB5ID0gW10sCiAgICAgICAgICAgIHcgPSBbXSwKICAgICAgICAgICAgaCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLml0ZW1zW2xlbmd0aF07IGktLTspIHsKICAgICAgICAgICAgdmFyIGJveCA9IHRoaXMuaXRlbXNbaV0uZ2V0QkJveCgpOwogICAgICAgICAgICB4W3B1c2hdKGJveC54KTsKICAgICAgICAgICAgeVtwdXNoXShib3gueSk7CiAgICAgICAgICAgIHdbcHVzaF0oYm94LnggKyBib3gud2lkdGgpOwogICAgICAgICAgICBoW3B1c2hdKGJveC55ICsgYm94LmhlaWdodCk7CiAgICAgICAgfQogICAgICAgIHggPSBtbWluW2FwcGx5XSgwLCB4KTsKICAgICAgICB5ID0gbW1pblthcHBseV0oMCwgeSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDogeCwKICAgICAgICAgICAgeTogeSwKICAgICAgICAgICAgd2lkdGg6IG1tYXhbYXBwbHldKDAsIHcpIC0geCwKICAgICAgICAgICAgaGVpZ2h0OiBtbWF4W2FwcGx5XSgwLCBoKSAtIHkKICAgICAgICB9OwogICAgfTsKICAgIFNldFtwcm90b10uY2xvbmUgPSBmdW5jdGlvbiAocykgewogICAgICAgIHMgPSBuZXcgU2V0OwogICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuaXRlbXNbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgc1twdXNoXSh0aGlzLml0ZW1zW2ldLmNsb25lKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgIH07CgogICAgUi5yZWdpc3RlckZvbnQgPSBmdW5jdGlvbiAoZm9udCkgewogICAgICAgIGlmICghZm9udC5mYWNlKSB7CiAgICAgICAgICAgIHJldHVybiBmb250OwogICAgICAgIH0KICAgICAgICB0aGlzLmZvbnRzID0gdGhpcy5mb250cyB8fCB7fTsKICAgICAgICB2YXIgZm9udGNvcHkgPSB7CiAgICAgICAgICAgICAgICB3OiBmb250LncsCiAgICAgICAgICAgICAgICBmYWNlOiB7fSwKICAgICAgICAgICAgICAgIGdseXBoczoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZmFtaWx5ID0gZm9udC5mYWNlWyJmb250LWZhbWlseSJdOwogICAgICAgIGZvciAodmFyIHByb3AgaW4gZm9udC5mYWNlKSBpZiAoZm9udC5mYWNlW2hhc10ocHJvcCkpIHsKICAgICAgICAgICAgZm9udGNvcHkuZmFjZVtwcm9wXSA9IGZvbnQuZmFjZVtwcm9wXTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZm9udHNbZmFtaWx5XSkgewogICAgICAgICAgICB0aGlzLmZvbnRzW2ZhbWlseV1bcHVzaF0oZm9udGNvcHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZm9udHNbZmFtaWx5XSA9IFtmb250Y29weV07CiAgICAgICAgfQogICAgICAgIGlmICghZm9udC5zdmcpIHsKICAgICAgICAgICAgZm9udGNvcHkuZmFjZVsidW5pdHMtcGVyLWVtIl0gPSB0b0ludChmb250LmZhY2VbInVuaXRzLXBlci1lbSJdLCAxMCk7CiAgICAgICAgICAgIGZvciAodmFyIGdseXBoIGluIGZvbnQuZ2x5cGhzKSBpZiAoZm9udC5nbHlwaHNbaGFzXShnbHlwaCkpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoID0gZm9udC5nbHlwaHNbZ2x5cGhdOwogICAgICAgICAgICAgICAgZm9udGNvcHkuZ2x5cGhzW2dseXBoXSA9IHsKICAgICAgICAgICAgICAgICAgICB3OiBwYXRoLncsCiAgICAgICAgICAgICAgICAgICAgazoge30sCiAgICAgICAgICAgICAgICAgICAgZDogcGF0aC5kICYmICJNIiArIHBhdGguZFtycF0oL1ttbGN4dHJ2XS9nLCBmdW5jdGlvbiAoY29tbWFuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtsOiAiTCIsIGM6ICJDIiwgeDogInoiLCB0OiAibSIsIHI6ICJsIiwgdjogImMifVtjb21tYW5kXSB8fCAiTSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICsgInoiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHBhdGguaykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcGF0aC5rKSBpZiAocGF0aFtoYXNdKGspKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRjb3B5LmdseXBoc1tnbHlwaF0ua1trXSA9IHBhdGgua1trXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9OwogICAgUGFwZXJbcHJvdG9dLmdldEZvbnQgPSBmdW5jdGlvbiAoZmFtaWx5LCB3ZWlnaHQsIHN0eWxlLCBzdHJldGNoKSB7CiAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggfHwgIm5vcm1hbCI7CiAgICAgICAgc3R5bGUgPSBzdHlsZSB8fCAibm9ybWFsIjsKICAgICAgICB3ZWlnaHQgPSArd2VpZ2h0IHx8IHtub3JtYWw6IDQwMCwgYm9sZDogNzAwLCBsaWdodGVyOiAzMDAsIGJvbGRlcjogODAwfVt3ZWlnaHRdIHx8IDQwMDsKICAgICAgICB2YXIgZm9udCA9IFIuZm9udHNbZmFtaWx5XTsKICAgICAgICBpZiAoIWZvbnQpIHsKICAgICAgICAgICAgdmFyIG5hbWUgPSBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGZhbWlseVtycF0oL1teXHdcZFxzKyF+LjpfLV0vZywgRSkgKyAiKFxcc3wkKSIsICJpIik7CiAgICAgICAgICAgIGZvciAodmFyIGZvbnROYW1lIGluIFIuZm9udHMpIGlmIChSLmZvbnRzW2hhc10oZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZS50ZXN0KGZvbnROYW1lKSkgewogICAgICAgICAgICAgICAgICAgIGZvbnQgPSBSLmZvbnRzW2ZvbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgdGhlZm9udDsKICAgICAgICBpZiAoZm9udCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBmb250W2xlbmd0aF07IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGVmb250ID0gZm9udFtpXTsKICAgICAgICAgICAgICAgIGlmICh0aGVmb250LmZhY2VbImZvbnQtd2VpZ2h0Il0gPT0gd2VpZ2h0ICYmICh0aGVmb250LmZhY2VbImZvbnQtc3R5bGUiXSA9PSBzdHlsZSB8fCAhdGhlZm9udC5mYWNlWyJmb250LXN0eWxlIl0pICYmIHRoZWZvbnQuZmFjZVsiZm9udC1zdHJldGNoIl0gPT0gc3RyZXRjaCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGVmb250OwogICAgfTsKICAgIFBhcGVyW3Byb3RvXS5wcmludCA9IGZ1bmN0aW9uICh4LCB5LCBzdHJpbmcsIGZvbnQsIHNpemUsIG9yaWdpbikgewogICAgICAgIG9yaWdpbiA9IG9yaWdpbiB8fCAibWlkZGxlIjsgLy8gYmFzZWxpbmV8bWlkZGxlCiAgICAgICAgdmFyIG91dCA9IHRoaXMuc2V0KCksCiAgICAgICAgICAgIGxldHRlcnMgPSAoc3RyaW5nICsgRSlbc3BsaXRdKEUpLAogICAgICAgICAgICBzaGlmdCA9IDAsCiAgICAgICAgICAgIHBhdGggPSBFLAogICAgICAgICAgICBzY2FsZTsKICAgICAgICBSLmlzKGZvbnQsICJzdHJpbmciKSAmJiAoZm9udCA9IHRoaXMuZ2V0Rm9udChmb250KSk7CiAgICAgICAgaWYgKGZvbnQpIHsKICAgICAgICAgICAgc2NhbGUgPSAoc2l6ZSB8fCAxNikgLyBmb250LmZhY2VbInVuaXRzLXBlci1lbSJdOwogICAgICAgICAgICB2YXIgYmIgPSBmb250LmZhY2UuYmJveC5zcGxpdChzZXBhcmF0b3IpLAogICAgICAgICAgICAgICAgdG9wID0gK2JiWzBdLAogICAgICAgICAgICAgICAgaGVpZ2h0ID0gK2JiWzFdICsgKG9yaWdpbiA9PSAiYmFzZWxpbmUiID8gYmJbM10gLSBiYlsxXSArICgrZm9udC5mYWNlLmRlc2NlbnQpIDogKGJiWzNdIC0gYmJbMV0pIC8gMik7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGxldHRlcnNbbGVuZ3RoXTsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gaSAmJiBmb250LmdseXBoc1tsZXR0ZXJzW2kgLSAxXV0gfHwge30sCiAgICAgICAgICAgICAgICAgICAgY3VyciA9IGZvbnQuZ2x5cGhzW2xldHRlcnNbaV1dOwogICAgICAgICAgICAgICAgc2hpZnQgKz0gaSA/IChwcmV2LncgfHwgZm9udC53KSArIChwcmV2LmsgJiYgcHJldi5rW2xldHRlcnNbaV1dIHx8IDApIDogMDsKICAgICAgICAgICAgICAgIGN1cnIgJiYgY3Vyci5kICYmIG91dFtwdXNoXSh0aGlzLnBhdGgoY3Vyci5kKS5hdHRyKHtmaWxsOiAiIzAwMCIsIHN0cm9rZTogIm5vbmUiLCB0cmFuc2xhdGlvbjogW3NoaWZ0LCAwXX0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXQuc2NhbGUoc2NhbGUsIHNjYWxlLCB0b3AsIGhlaWdodCkudHJhbnNsYXRlKHggLSB0b3AsIHkgLSBoZWlnaHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgfTsKCiAgICB2YXIgZm9ybWF0cmcgPSAvXHsoXGQrKVx9L2c7CiAgICBSLmZvcm1hdCA9IGZ1bmN0aW9uICh0b2tlbiwgYXJyYXkpIHsKICAgICAgICB2YXIgYXJncyA9IFIuaXMoYXJyYXksICJhcnJheSIpID8gWzBdW2NvbmNhdF0oYXJyYXkpIDogYXJndW1lbnRzOwogICAgICAgIHRva2VuICYmIFIuaXModG9rZW4sICJzdHJpbmciKSAmJiBhcmdzW2xlbmd0aF0gLSAxICYmICh0b2tlbiA9IHRva2VuW3JwXShmb3JtYXRyZywgZnVuY3Rpb24gKHN0ciwgaSkgewogICAgICAgICAgICByZXR1cm4gYXJnc1srK2ldID09IG51bGwgPyBFIDogYXJnc1tpXTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHRva2VuIHx8IEU7CiAgICB9OwogICAgUi5uaW5qYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBvbGRSYXBoYWVsLndhcyA/IChSYXBoYWVsID0gb2xkUmFwaGFlbC5pcykgOiBkZWxldGUgUmFwaGFlbDsKICAgICAgICByZXR1cm4gUjsKICAgIH07CiAgICBSLmVsID0gRWxlbWVudFtwcm90b107CiAgICByZXR1cm4gUjsKfSkoKTs=
LyoKKiBDb2xvcndoZWVsCiogQ29weXJpZ2h0IChjKSAyMDEwIEpvaG4gV2VpciAoaHR0cDovL2ZhbWVkcml2ZXIuY29tKQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKSBsaWNlbnNlLgoqCiogcmVxdWlyZXMgalF1ZXJ5ICYgUmFwaGFlbAoqICAgaHR0cDovL2pxdWVyeS5jb20gaHR0cDovL3JhcGhhZWxqcy5jb20KKgoqIHNlZSBodHRwOi8vandlaXIuZ2l0aHViLmNvbS9jb2xvcndoZWVsIGZvciBVc2FnZQoqCiovCgpSYXBoYWVsLmNvbG9yd2hlZWwgPSBmdW5jdGlvbih0YXJnZXQsIGNvbG9yX3doZWVsX3NpemUsIG5vX3NlZ21lbnRzKXsKICB2YXIgY2FudmFzLAogICAgICBjdXJyZW50X2NvbG9yLAogICAgICBzaXplLAogICAgICBzZWdtZW50cyA9IG5vX3NlZ21lbnRzIHx8IDYwLAogICAgICBic19zcXVhcmUgPSB7fSwKICAgICAgaHVlX3JpbmcgPSB7fSwKICAgICAgdHJpX3NpemUsCiAgICAgIGN1cnNvciA9IHt9LAogICAgICBkcmFnX3RhcmdldCwKICAgICAgaW5wdXRfdGFyZ2V0LAogICAgICBjZW50ZXIsCiAgICAgIHBhcmVudCwKICAgICAgY2hhbmdlX2NhbGxiYWNrLAogICAgICBkcmFnX2NhbGxiYWNrcyA9IFtmdW5jdGlvbigpe30sIGZ1bmN0aW9uKCl7fV0sCiAgICAgIG9mZnNldCwKICAgICAgcGFkZGluZyA9IDIsCiAgICAgIHNkaW07IC8vIGhvbGRzIHRoZSBkaW1lbnNpb25zIGZvciB0aGUgc2F0dXJhdGlvbiBzcXVhcmUKCiAgZnVuY3Rpb24gcG9pbnQoeCwgeSl7IHJldHVybiB7eDp4LCB5Onl9O30KICBmdW5jdGlvbiByYWRpYW5zKGEpeyByZXR1cm4gYSAqIChNYXRoLlBJLzE4MCk7fQoKICBmdW5jdGlvbiBhbmdsZSh4LHkpewogICAgdmFyIHEgPSB4ID4gMCA/IDAgOiAxODA7CiAgICByZXR1cm4gcStNYXRoLmF0YW4oKDAgLSB5KS8oMCAtIHgpKSoxODAvKE1hdGguUEkpOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldCwgY29sb3Jfd2hlZWxfc2l6ZSl7CiAgICBzaXplICAgICA9IGNvbG9yX3doZWVsX3NpemU7CiAgICB0cmlfc2l6ZSA9IHNpemUvMjA7CiAgICBjZW50ZXIgICA9IHNpemUvMjsKICAgIHBhcmVudCAgID0gJCh0YXJnZXQpOwogICAgY2FudmFzICAgPSBSYXBoYWVsKHBhcmVudFswXSxzaXplLCBzaXplKTsKICAgIGNhbnZhcy5zYWZhcmkoKTsKCiAgICBjcmVhdGVfYnNfc3F1YXJlKCk7CiAgICBjcmVhdGVfaHVlX3JpbmcoKTsKICAgIGh1ZV9yaW5nLmN1cnNvciA9IGN1cnNvcl9jcmVhdGUodHJpX3NpemUpOwogICAgYnNfc3F1YXJlLmN1cnNvciA9IGN1cnNvcl9jcmVhdGUodHJpX3NpemUqMC41KTsKICAgIGV2ZW50c19zZXR1cCgpOwogICAgcGFyZW50LmNzcyh7aGVpZ2h0OnNpemUrInB4Iiwgd2lkdGg6c2l6ZSsicHgifSk7CiAgICBkaXNhYmxlX3NlbGVjdChwYXJlbnQpOwogICAgcmV0dXJuIHB1YmxpY19tZXRob2RzKCk7CiAgfQoKICBmdW5jdGlvbiBkaXNhYmxlX3NlbGVjdCh0YXJnZXQpewogICAgJCh0YXJnZXQpLmNzcyh7InVuc2VsZWN0YWJsZSI6ICJvbiIsIi1tb3otdXNlci1zZWxlY3QiOiAibm9uZSIsIi13ZWJraXQtdXNlci1zZWxlY3QiOiAibm9uZSJ9KTsKICB9CgogIGZ1bmN0aW9uIHB1YmxpY19tZXRob2RzKCl7CiAgICByZXR1cm4gewogICAgICBpbnB1dDogaW5wdXQsCiAgICAgIG9uY2hhbmdlOiBvbmNoYW5nZSwKICAgICAgb25kcmFnIDogb25kcmFnLAogICAgICBjb2xvciA6IHB1YmxpY19zZXRfY29sb3IKICAgIH07CiAgfQoKICAvLyBTZXRzIGEgdGV4dGZpZWxkIGZvciB1c2VyIGlucHV0IG9mIGhleCBjb2xvciB2YWx1ZXMKICAvLyBUT0RPIGRvbid0IGNsZWFyIHRoZSBjaGFuZ2UgY2FsbGJhY2sKICAvLyBUT0RPIGFsbG93IGEgbnVsbCB0YXJnZXQgdG8gdW5iaW5kIHRoZSBpbnB1dAogIGZ1bmN0aW9uIGlucHV0KHRhcmdldCl7CiAgICBjaGFuZ2VfY2FsbGJhY2sgPSBudWxsOwogICAgaW5wdXRfdGFyZ2V0ID0gdGFyZ2V0OwogICAgJCh0YXJnZXQpLmtleXVwKGZ1bmN0aW9uKCl7CiAgICAgIGlmKHRoaXMudmFsdWUubWF0Y2goL14jKFswLTlBLUZdKXszfSR8XiMoWzAtOUEtRl0pezZ9JC9pbWcpKXsKICAgICAgICBzZXRfY29sb3IodGhpcy52YWx1ZSk7CiAgICAgICAgdXBkYXRlX2NvbG9yKHRydWUpOwoJCXJ1bl9vbmNoYW5nZV9ldmVudCgpOwogICAgICB9CiAgICB9KTsKICAgIHNldF9jb2xvcih0YXJnZXQudmFsdWUpOwogICAgdXBkYXRlX2NvbG9yKHRydWUpOwoKICAgIHJldHVybiBwdWJsaWNfbWV0aG9kcygpOwogIH0KCiAgZnVuY3Rpb24gb25jaGFuZ2UoY2FsbGJhY2spewogICAgY2hhbmdlX2NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB1cGRhdGVfY29sb3IoZmFsc2UpOwogICAgcmV0dXJuIHB1YmxpY19tZXRob2RzKCk7CiAgfQoKICBmdW5jdGlvbiBvbmRyYWcoc3RhcnRfY2FsbGJhY2ssIGVuZF9jYWxsYmFjayl7CiAgICBkcmFnX2NhbGxiYWNrcyA9IFtzdGFydF9jYWxsYmFjayB8fCBmdW5jdGlvbigpe30sIGVuZF9jYWxsYmFjayB8fCBmdW5jdGlvbigpe31dOwogICAgcmV0dXJuIHB1YmxpY19tZXRob2RzKCk7CiAgfQoKICBmdW5jdGlvbiBkcmFnKGUpewogICAgdmFyIHggPSBlLnBhZ2VYIC0gKHBhcmVudC5vZmZzZXQoKS5sZWZ0ICsgY2VudGVyKSwKICAgICAgICB5ID0gZS5wYWdlWSAtIChwYXJlbnQub2Zmc2V0KCkudG9wICsgY2VudGVyKTsKCiAgICBpZihkcmFnX3RhcmdldCA9PSBodWVfcmluZyl7CiAgICAgIHNldF9odWVfY3Vyc29yKHgseSk7CiAgICAgIHVwZGF0ZV9jb2xvcigpOwoJICBydW5fb25jaGFuZ2VfZXZlbnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZihkcmFnX3RhcmdldCA9PSBic19zcXVhcmUpewogICAgICBzZXRfYnNfY3Vyc29yKHgseSk7CiAgICAgIHVwZGF0ZV9jb2xvcigpOwoJICBydW5fb25jaGFuZ2VfZXZlbnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdGFydF9kcmFnKGV2ZW50LCB0YXJnZXQpewogICAgJChkb2N1bWVudCkubW91c2V1cChzdG9wX2RyYWcpOwogICAgJChkb2N1bWVudCkubW91c2Vtb3ZlKGRyYWcpOwogICAgZHJhZ190YXJnZXQgPSB0YXJnZXQ7CiAgICBkcmFnKGV2ZW50KTsKICAgIGRyYWdfY2FsbGJhY2tzWzBdKGN1cnJlbnRfY29sb3IpOwogIH0KCiAgZnVuY3Rpb24gc3RvcF9kcmFnKCl7CiAgICAkKGRvY3VtZW50KS51bmJpbmQoIm1vdXNldXAiLHN0b3BfZHJhZyk7CiAgICAkKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZSIsZHJhZyk7CiAgICBkcmFnX2NhbGxiYWNrc1sxXShjdXJyZW50X2NvbG9yKTsKCXJ1bl9vbmNoYW5nZV9ldmVudCgpOwogIH0KCiAgZnVuY3Rpb24gZXZlbnRfZHJhZ19zdG9wKGV2ZW50LG8pewogICAgby5tb3VzZW1vdmUgPSBudWxsOwogICAgZHJhZ190YXJnZXQ9bnVsbDsKICB9CgogIGZ1bmN0aW9uIGV2ZW50c19zZXR1cCgpewogICAgJChbaHVlX3JpbmcuZXZlbnQubm9kZSxodWVfcmluZy5jdXJzb3JbMF0ubm9kZV0pLm1vdXNlZG93bihmdW5jdGlvbihlKXtzdGFydF9kcmFnKGUsaHVlX3JpbmcpO30pOwogICAgJChbYnNfc3F1YXJlLmIubm9kZSwgYnNfc3F1YXJlLmN1cnNvclswXS5ub2RlXSkubW91c2Vkb3duKGZ1bmN0aW9uKGUpe3N0YXJ0X2RyYWcoZSxic19zcXVhcmUpO30pOwogIH0KCiAgZnVuY3Rpb24gY3Vyc29yX2NyZWF0ZShzaXplKXsKICAgIHZhciBzZXQgPSBjYW52YXMuc2V0KCkucHVzaCgKICAgICAgICBjYW52YXMuY2lyY2xlKDAsIDAsIHNpemUpLmF0dHIoeyJzdHJva2Utd2lkdGgiOjQsIHN0cm9rZToiIzMzMyJ9KSwKICAgICAgICBjYW52YXMuY2lyY2xlKDAsIDAsIHNpemUrMikuYXR0cih7InN0cm9rZS13aWR0aCI6MSwgc3Ryb2tlOiIjRkZGIiwgb3BhY2l0eTowLjV9KQogICAgKTsKCiAgICBzZXRbMF0ubm9kZS5zdHlsZS5jdXJzb3IgPSAiY3Jvc3NoYWlyIjsKCiAgICByZXR1cm4gc2V0OwogIH0KCiAgZnVuY3Rpb24gc2V0X2JzX2N1cnNvcih4LHkpewogICAgeCA9IHgrY2VudGVyOwogICAgeSA9IHkrY2VudGVyOwogICAgaWYoeCA8IHNkaW0ueCkgeCA9IHNkaW0ueDsKICAgIGlmKHggPiBzZGltLngrc2RpbS5sKSB4ID0gc2RpbS54K3NkaW0ubDsKICAgIGlmKHkgPCBzZGltLnkpIHkgPSBzZGltLnk7CiAgICBpZih5ID4gc2RpbS55K3NkaW0ubCkgeSA9IHNkaW0ueSArIHNkaW0ubDsKCiAgICBic19zcXVhcmUuY3Vyc29yLmF0dHIoe2N4OngsIGN5Onl9KS50cmFuc2xhdGUoMCwwKTsKICB9CgoKICBmdW5jdGlvbiBzZXRfaHVlKGNvbG9yKXsKICAgIHZhciBoZXggPSBSYXBoYWVsLmdldFJHQihjb2xvcikuaGV4OwogICAgYnNfc3F1YXJlLmguYXR0cigiZmlsbCIsIGhleCk7CiAgfQoKICBmdW5jdGlvbiBodWUoKXsKICAgIHJldHVybiBSYXBoYWVsLnJnYjJoc2IoYnNfc3F1YXJlLmguYXR0cigiZmlsbCIpKS5oOwogIH0KCiAgZnVuY3Rpb24gcHVibGljX3NldF9jb2xvcih2YWx1ZSl7CiAgICB2YXIgcmV0ID0gc2V0X2NvbG9yKHZhbHVlKTsKICAgIHVwZGF0ZV9jb2xvcihmYWxzZSk7CiAgICByZXR1cm4gcmV0OwogIH0KCiAgZnVuY3Rpb24gc2V0X2NvbG9yKHZhbHVlKXsKICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpeyByZXR1cm4gY3VycmVudF9jb2xvcjsgfQoKICAgIHZhciB0ZW1wID0gY2FudmFzLnJlY3QoMSwxLDEsMSkuYXR0cih7ZmlsbDp2YWx1ZX0pLAogICAgICAgIGhzYiA9IGNhbnZhcy5yYXBoYWVsLnJnYjJoc2IodGVtcC5hdHRyKCJmaWxsIikpOwoKICAgIHNldF9ic19jdXJzb3IoCiAgICAgICgwLXNkaW0ubC8yKSArIChzZGltLmwqaHNiLnMpLAogICAgICBzZGltLmwvMiAtIChzZGltLmwqaHNiLmIpKTsKICAgIHNldF9odWVfY3Vyc29yKCgzNjAqKGhzYi5oKSktOTApOwogICAgdGVtcC5yZW1vdmUoKTsKICAgIHJldHVybiBwdWJsaWNfbWV0aG9kcygpOwogIH0KCiAgLy8gQ291bGQgb3B0aW1pemUgdGhpcyBtZXRob2QKICBmdW5jdGlvbiB1cGRhdGVfY29sb3IoZG9udF9yZXBsYWNlX2lucHV0X3ZhbHVlKXsKICAgIHZhciB4ID0gYnNfc3F1YXJlLmN1cnNvci5pdGVtc1swXS5hdHRyKCJjeCIpLAogICAgICAgIHkgPSBic19zcXVhcmUuY3Vyc29yLml0ZW1zWzBdLmF0dHIoImN5IiksCiAgICAgICAgaHNiID0gewogICAgICAgICAgYjogMS0oeS1zZGltLnkpL3NkaW0ubCwKICAgICAgICAgIHM6ICh4LXNkaW0ueCkvc2RpbS5sLAogICAgICAgICAgaDogaHVlKCkKICAgICAgICB9OwoKICAgIGN1cnJlbnRfY29sb3IgPSBSYXBoYWVsLmhzYjJyZ2IoaHNiLmgsIGhzYi5zLGhzYi5iKTsKCiAgICBpZihpbnB1dF90YXJnZXQpewogICAgICB2YXIgYyA9IGN1cnJlbnRfY29sb3IuaGV4OwogICAgICBpZihkb250X3JlcGxhY2VfaW5wdXRfdmFsdWUgIT0gdHJ1ZSkgeyBpbnB1dF90YXJnZXQudmFsdWUgPSBjO30KICAgICAgIGlmKGhzYi5iIDwgMC41KXsKICAgICAgICAkKGlucHV0X3RhcmdldCkuY3NzKCJjb2xvciIsICIjRkZGIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJChpbnB1dF90YXJnZXQpLmNzcygiY29sb3IiLCAiIzAwMCIpOwogICAgICB9CiAgICAgIGlucHV0X3RhcmdldC5zdHlsZS5iYWNrZ3JvdW5kID0gYzsKICAgIH0KCiAgfQoKICAvLyBhY2NlcHRzIGVpdGhlciB4LHkgb3IgZCAoZGVncmVlcykKICBmdW5jdGlvbiBzZXRfaHVlX2N1cnNvcihtaXhlZF9hcmdzKXsKICAgIHZhciBkOwogICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAyKXsKICAgICAgZCA9IGFuZ2xlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOwogICAgfSBlbHNlIHsKICAgICAgZCA9IGFyZ3VtZW50c1swXTsKICAgIH0KCiAgICB2YXIgeCA9IE1hdGguY29zKHJhZGlhbnMoZCkpICogKGNlbnRlci10cmlfc2l6ZS1wYWRkaW5nKTsKICAgIHZhciB5ID0gTWF0aC5zaW4ocmFkaWFucyhkKSkgKiAoY2VudGVyLXRyaV9zaXplLXBhZGRpbmcpOwogICAgaHVlX3JpbmcuY3Vyc29yLmF0dHIoe2N4OngrY2VudGVyLCBjeTp5K2NlbnRlcn0pLnRyYW5zbGF0ZSgwLDApOwogICAgc2V0X2h1ZSgiaHNiKCIrKGQrOTApLzM2MCsiLDEsMSkiKTsKICB9CgogIGZ1bmN0aW9uIGJzX3NxdWFyZV9kaW0oKXsKICAgIGlmKHNkaW0peyByZXR1cm4gc2RpbTt9CiAgICB2YXIgcyA9IHNpemUgLSAodHJpX3NpemUgKiA0KTsKICAgIHNkaW0gPSB7CiAgICAgIHg6KHMvNikrdHJpX3NpemUqMitwYWRkaW5nLAogICAgICB5OihzLzYpK3RyaV9zaXplKjIrcGFkZGluZywKICAgICAgbDoocyAqIDIvMyktcGFkZGluZyoyCiAgICB9OwogICAgcmV0dXJuIHNkaW07CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVfYnNfc3F1YXJlKCl7CiAgICBic19zcXVhcmVfZGltKCk7CiAgICBib3ggPSBbc2RpbS54LCBzZGltLnksIHNkaW0ubCwgc2RpbS5sXTsKCiAgICBic19zcXVhcmUuaCA9IGNhbnZhcy5yZWN0LmFwcGx5KGNhbnZhcywgYm94KS5hdHRyKHsKICAgICAgc3Ryb2tlOiIjRUVFIiwgZ3JhZGllbnQ6ICIwLSNGRkYtIzAwMCIsIG9wYWNpdHk6MX0pOwogICAgYnNfc3F1YXJlLnMgPSBjYW52YXMucmVjdC5hcHBseShjYW52YXMsIGJveCkuYXR0cih7CiAgICAgIHN0cm9rZTpudWxsLCBncmFkaWVudDogIjAtI0ZGRi0jRkZGIiwgb3BhY2l0eTowfSk7CiAgICBic19zcXVhcmUuYiA9IGNhbnZhcy5yZWN0LmFwcGx5KGNhbnZhcywgYm94KS5hdHRyKHsKICAgICAgc3Ryb2tlOm51bGwsIGdyYWRpZW50OiAiOTAtIzAwMC0jRkZGIiwgb3BhY2l0eTowfSk7CiAgICBic19zcXVhcmUuYi5ub2RlLnN0eWxlLmN1cnNvciA9ICJjcm9zc2hhaXIiOwogIH0KCiAgZnVuY3Rpb24gaHVlX3NlZ2VtZW50X3NoYXBlKCl7CiAgICB2YXIgcGF0aCA9ICJNIC1AVyAwIEwgQFcgMCBMIEBXIEBIIEwgLUBXIEBIIHoiOwogICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvQEgvaW1nLCB0cmlfc2l6ZSoyKS5yZXBsYWNlKC9AVy9pbWcsdHJpX3NpemUpOwogIH0KCiAgZnVuY3Rpb24gY29weV9zZWdtZW50KHIsIGQsIGspewogICAgdmFyIG4gPSByLmNsb25lKCk7CiAgICB2YXIgaHVlID0gZCooMjU1L2spOwoKICAgIG4ucm90YXRlKCgzNjAvaykqZCwgKHNpemUvMiksIHNpemUvMik7CiAgICBuLmF0dHIoeyJzdHJva2Utd2lkdGgiOjAsIGZpbGw6ImhzYigiK2QqKDEvaykrIiwgMSwgMC44NSkifSk7CiAgICBodWVfcmluZy5odWVzLnB1c2gobik7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVfaHVlX3JpbmcoKXsKICAgIHZhciBzID0gaHVlX3NlZ2VtZW50X3NoYXBlKCksCiAgICAgICAgdHJpID0gY2FudmFzLnBhdGgocykuYXR0cih7c3Ryb2tlOm51bGx9KS50cmFuc2xhdGUoc2l6ZS8yLCBwYWRkaW5nKSwKICAgICAgICBrID0gc2VnbWVudHM7IC8vICMgb2Ygc2VnbWVudHMgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBodWVzCgogICAgaHVlX3JpbmcuaHVlcyA9IGNhbnZhcy5zZXQoKTsKCiAgICBmb3Iobj0wOyBuPGs7IG4rKyl7IGNvcHlfc2VnbWVudCh0cmksIG4sIGspOyB9CgogICAgLy8gSUUgbmVlZHMgYSBzbGlnaHQgb3BhY2l0eSB0byBhc3NpZ24gZXZlbnRzCiAgICBodWVfcmluZy5ldmVudCA9IGNhbnZhcy5jaXJjbGUoCiAgICAgIGNlbnRlciwKICAgICAgY2VudGVyLAogICAgICBjZW50ZXItdHJpX3NpemUtcGFkZGluZykuYXR0cih7InN0cm9rZS13aWR0aCI6dHJpX3NpemUqMiwgb3BhY2l0eTowLjAxfSk7CgogICAgaHVlX3Jpbmcub3V0bGluZSA9IGNhbnZhcy5jaXJjbGUoCiAgICAgIGNlbnRlciwKICAgICAgY2VudGVyLAogICAgICBjZW50ZXItdHJpX3NpemUtcGFkZGluZykuYXR0cih7InN0cm9rZSI6IiMwMDAiLCAic3Ryb2tlLXdpZHRoIjoodHJpX3NpemUqMikrMywgb3BhY2l0eTowLjF9KTsKICAgIGh1ZV9yaW5nLm91dGxpbmUudG9CYWNrKCk7CiAgICBodWVfcmluZy5ldmVudC5ub2RlLnN0eWxlLmN1cnNvciA9ICJjcm9zc2hhaXIiOwogIH0KCiAgZnVuY3Rpb24gcnVuX29uY2hhbmdlX2V2ZW50KCl7CglpZiAoY2hhbmdlX2NhbGxiYWNrICE9IHVuZGVmaW5lZCl7CiAgICAgIGNoYW5nZV9jYWxsYmFjayhjdXJyZW50X2NvbG9yKTsKICAgIH0JCiAgfQoKICByZXR1cm4gY3JlYXRlKHRhcmdldCwgY29sb3Jfd2hlZWxfc2l6ZSk7Cn07Cg==
Ly8gLS0KLy8gVFguVXNlckNvbG9yLmpzIC0gYmVsb25ncyB0byBNb2R1bGUgQ3NzVXNlckNvbG9ycy5wbQovLyAKLy8gcHJlcmVxdWVzaXRlczoKLy8gIGpxdWVyeQovLyAgY29sb3J3aGVlbC5qcyAoIHdoaWNoIG5lZWRzIHJhcGhhZWwgYW5kIGpxdWVyeSApCi8vCi8vIGZ1bmN0aW9uczoKLy8gLSBsb2FkcyBjc3Mgd2l0aCB1c2VyIGNvbG9ycwovLyAtIGF1Z21lbnRzIGFkbWluIHVzZXIgY29sb3IgaW5wdXQgd2l0aCBjb2xvcndoZWVsCi8vCi8vIENvcHlyaWdodCAoQykgMjAxMiB0dXh3ZXJrIC0gaHR0cDovL3d3dy50dXh3ZXJrLmRlCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi8vIC0tCgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAkKCdoZWFkJykuYXBwZW5kKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyc/QWN0aW9uPVVzZXJDb2xvckNzcyIgLz4nKTsKICAvL1Rlc3QgZm9yIGh0bWw1IGlucHV0IHR5cGUgY29sb3Igc3VwcG9ydAogIHZhciBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICBpLnNldEF0dHJpYnV0ZSgidHlwZSIsImNvbG9yIik7CiAgdmFyIGlucHV0X2NvbG9yX3N1cHBvcnQgPSAoaS50eXBlID09PSAiY29sb3IiKTsKICBpZiAoICQoJ2lucHV0I1VzZXJDb2xvcicpLmxlbmd0aCA+IDAgKSB7CiAgICBpZiAoaW5wdXRfY29sb3Jfc3VwcG9ydCkgewogICAgICAkKCdpbnB1dCNVc2VyQ29sb3InKVswXS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCdjb2xvcicpOwogICAgfSBlbHNlIHsKICAgICAgJCgnI1VzZXJDb2xvcicpLmJlZm9yZSgnPGRpdiBpZD0iY29sb3J3aGVlbCI+PC9kaXY+Jyk7CiAgICAgIHZhciBjb2xvcndoZWVsID0gUmFwaGFlbC5jb2xvcndoZWVsKCQoIiNjb2xvcndoZWVsIilbMF0sIDE1MCk7CiAgICAgIGNvbG9yd2hlZWwuaW5wdXQoJCgiI1VzZXJDb2xvciIpWzBdKTsKICAgIH07CiAgfTsKfSk7Cg==