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tRvpcAkw9hZAT+qmVZMHvTTp5IGknTY1K2pG2oy0mWkzUzBQMkMz0/0wXo/Z/i6kzUibma4f7vorfPvmh51COoUwAAAAAElFTkSuQmCCPCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAKICAgICAgPHNjcmlwdD4KICAgICAgICBmdW5jdGlvbiBzZXRNZXNzYWdlKG1zZykgewogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2UnKS50ZXh0Q29udGVudCA9IG1zZzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbm90aWZ5RGlkRmluaXNoTG9hZGluZygpIHsKICAgICAgICAgIGlmIChwbHVnaW4uZGlkRmluaXNoTG9hZGluZykKICAgICAgICAgICAgcGx1Z2luLmRpZEZpbmlzaExvYWRpbmcoKTsKCiAgICAgICAgICBpZiAocGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZykKICAgICAgICAgICAgcGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZygpOwogICAgICAgIH0KICAgICAgPC9zY3JpcHQ+CiAgICAKICAgIAogICAgPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgaWQ9InQiIG9ubG9hZD0ibm90aWZ5RGlkRmluaXNoTG9hZGluZygpOyI+CiAgICA8ZGl2IGkxOG4tdmFsdWVzPSJ0aXRsZTpuYW1lIiBpZD0ib3V0ZXIiPgogICAgICA8aW1nIGNsYXNzPSJpY29uIgogICAgICAgICAgIHNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwT0hCNElpQm9aV2xuYUhROUlqUTRjSGdpSUhacFpYZENiM2c5SWpBZ01DQTBPQ0EwT0NJZ1ptbHNiRDBpSXpZeU5qSTJNaUkrQ2lBZ0lDQThjR0YwYUNCa1BTSk5NQ0F3YURRNGRqUTRTREI2SWlCbWFXeHNQU0p1YjI1bElpOCtDaUFnSUNBOGNHRjBhQ0JrUFNKTk5ERWdNakpvTFROMkxUaGpNQzB5TGpJeExURXVOemt0TkMwMExUUm9MVGhXTjJNd0xUSXVOell0TWk0eU5DMDFMVFV0TlhNdE5TQXlMakkwTFRVZ05YWXpTRGhqTFRJdU1qRWdNQzB6TGprNElERXVOemt0TXk0NU9DQTBiQzB1TURFZ055NDJTRGRqTWk0NU9DQXdJRFV1TkNBeUxqUXlJRFV1TkNBMUxqUlRPUzQ1T0NBek1pNDBJRGNnTXpJdU5FZzBMakF4VERRZ05EQmpNQ0F5TGpJeElERXVOemtnTkNBMElEUm9OeTQyZGkwell6QXRNaTQ1T0NBeUxqUXlMVFV1TkNBMUxqUXROUzQwSURJdU9UZ2dNQ0ExTGpRZ01pNDBNaUExTGpRZ05TNDBkak5JTXpSak1pNHlNU0F3SURRdE1TNDNPU0EwTFRSMkxUaG9NMk15TGpjMklEQWdOUzB5TGpJMElEVXROWE10TWk0eU5DMDFMVFV0TlhvaUx6NEtQQzl6ZG1jK0NnPT0iPgogICAgICA8aDEgaWQ9Im1lc3NhZ2UiPiRpMThue21lc3NhZ2V9PC9oMT4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KICAgIDxzdHlsZT4vKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4gKi8KCmh0bWwsIGJvZHkgewogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgaGVpZ2h0OiAxMDAlOwogIG1hcmdpbjogMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB3aWR0aDogMTAwJTsKfQoKaDEgewogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxMHB0OwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgcGFkZGluZzogMHB0IDEwcHQ7Cn0KCnAgewogIGZvbnQtc2l6ZTogOHB0OwogIHBhZGRpbmc6IDBwdCAxNHB0Owp9CgojdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICBjb2xvcjogIzY0NjQ2NDsKfQoKI291dGVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZGlzcGxheTogZmxleDsKICBoZWlnaHQ6IDEwMCU7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KCi5pY29uIHsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBvcGFjaXR5OiAuMzsKfQoKQG1lZGlhIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1pbi1oZWlnaHQ6IDJlbSkgYW5kIChtaW4td2lkdGg6IDE0ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogNTAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KCkBtZWRpYSAobWluLWhlaWdodDogN2VtKSBhbmQgKG1pbi13aWR0aDogNmVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDUwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Cjwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5IGlkPSJ0IiBvbkxvYWQ9Imluc2VydExpbmsoKSI+CiAgICA8ZGl2IGkxOG4tdmFsdWVzPSJ0aXRsZTpuYW1lIiBpZD0ib3V0ZXIiPgogICAgICA8aW1nIGNsYXNzPSJpY29uIgogICAgICAgICAgIHNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0kwT0hCNElpQm9aV2xuYUhROUlqUTRjSGdpSUhacFpYZENiM2c5SWpBZ01DQTBPQ0EwT0NJZ1ptbHNiRDBpSXpZeU5qSTJNaUkrQ2lBZ0lDQThjR0YwYUNCa1BTSk5NQ0F3YURRNGRqUTRTREI2SWlCbWFXeHNQU0p1YjI1bElpOCtDaUFnSUNBOGNHRjBhQ0JrUFNKTk5ERWdNakpvTFROMkxUaGpNQzB5TGpJeExURXVOemt0TkMwMExUUm9MVGhXTjJNd0xUSXVOell0TWk0eU5DMDFMVFV0TlhNdE5TQXlMakkwTFRVZ05YWXpTRGhqTFRJdU1qRWdNQzB6TGprNElERXVOemt0TXk0NU9DQTBiQzB1TURFZ055NDJTRGRqTWk0NU9DQXdJRFV1TkNBeUxqUXlJRFV1TkNBMUxqUlRPUzQ1T0NBek1pNDBJRGNnTXpJdU5FZzBMakF4VERRZ05EQmpNQ0F5TGpJeElERXVOemtnTkNBMElEUm9OeTQyZGkwell6QXRNaTQ1T0NBeUxqUXlMVFV1TkNBMUxqUXROUzQwSURJdU9UZ2dNQ0ExTGpRZ01pNDBNaUExTGpRZ05TNDBkak5JTXpSak1pNHlNU0F3SURRdE1TNDNPU0EwTFRSMkxUaG9NMk15TGpjMklEQWdOUzB5TGpJMElEVXROWE10TWk0eU5DMDFMVFV0TlhvaUx6NEtQQzl6ZG1jK0NnPT0iPgogICAgICA8aDEgaWQ9Im1lc3NhZ2UiPiRpMThue21lc3NhZ2V9PC9oMT4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KICAgIDxzdHlsZT4KICAgICAgaHRtbCwKICAgICAgYm9keSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBib2R5IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyAgLyogZ29vZ2xlLWdyZXktMTAwICovCiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgfQoKICAgICAgcGF0aCB7CiAgICAgICAgZmlsbDogI2JkYmRiZDsgIC8qIGdvb2dsZS1ncmV5LTQwMCAqLwogICAgICB9CgogICAgICAjaWNvbi1jb250YWluZXIgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNmb290ZXIgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDsgIC8qIGdvb2dsZS1ibHVlLTUwMCAqLwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG1heC1oZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogMjBweDsKICAgICAgICBwYWRkaW5nOiAxNHB4IDI0cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICBwLAogICAgICBhIHsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgcCB7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bzsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIGEgewogICAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8gTWVkaXVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiA0OHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgIGE6bGluaywKICAgICAgYTp2aXNpdGVkIHsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJpY29uLWNvbnRhaW5lciI+CiAgICAgIDwhLS0gTWF0ZXJpYWwgRGVzaWduIFBERiBpY29uIC0tPgogICAgICA8c3ZnIHZpZXdib3g9IjAgMCAyNCAyNCI+CiAgICAgICAgPHBhdGggZD0iTTcgMTEuNWgxdi0xSDd2MXpNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS05LjUgOC41YzAgLjgzLS42NyAxLjUtMS41IDEuNUg3djJINS41VjlIOGMuODMgMCAxLjUuNjcgMS41IDEuNXYxem0xMC0xSDE3djFoMS41VjEzSDE3djJoLTEuNVY5aDR2MS41em0tNSAzYzAgLjgzLS42NyAxLjUtMS41IDEuNWgtMi41VjlIMTNjLjgzIDAgMS41LjY3IDEuNSAxLjV2M3ptLTIuNSAwaDF2LTNoLTF2M3oiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImZvb3RlciIgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiPgogICAgICA8cD4kaTE4bntmaWxlTmFtZX08L3A+CiAgICAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9InBsdWdpbi5vcGVuUERGKCkiPlZpZXcgUERGPC9hPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlKG1zZykgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZScpLnRleHRDb250ZW50ID0gbXNnOwogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RGlkRmluaXNoTG9hZGluZygpIHsKICAgICAgaWYgKHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKQogICAgICAgIHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKCk7CgogICAgICBpZiAocGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZykKICAgICAgICBwbHVnaW4uZGlkRmluaXNoSWNvblJlcG9zaXRpb25Gb3JUZXN0aW5nKCk7CiAgICB9CiAgPC9zY3JpcHQ+CiAgPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KICA8c3R5bGU+CiAgI291dGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICB9CiAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keSBpZD0idCIgb25sb2FkPSJub3RpZnlEaWRGaW5pc2hMb2FkaW5nKCk7Ij4KICA8ZGl2IGkxOG4tdmFsdWVzPSJ0aXRsZTpuYW1lIiBpZD0ib3V0ZXIiPgogICAgPGltZyBjbGFzcz0iaWNvbiIKICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICA8aDEgaWQ9Im1lc3NhZ2UiPiRpMThue21lc3NhZ2V9PC9oMT4KICA8L2Rpdj4KICA8c2NyaXB0PgogICAgd2luZG93Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUua2V5ID09ICdFbnRlcicgfHwgZS5rZXkgPT0gJyAnKSB7CiAgICAgICAgcGx1Z2luLnNob3dQZXJtaXNzaW9uQnViYmxlKCk7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICB9OwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRlcicpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgcGx1Z2luLnNob3dQZXJtaXNzaW9uQnViYmxlKCk7CiAgICB9OwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KPCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KPHNjcmlwdD4KICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAocGx1Z2luLmRpZEZpbmlzaExvYWRpbmcpCiAgICAgIHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKCk7CiAgfTsKCiAgd2luZG93Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLmtleSA9PSAnRW50ZXInIHx8IGUua2V5ID09ICcgJykgewogICAgICBwbHVnaW4ubG9hZCgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgfTsKPC9zY3JpcHQ+CjxzdHlsZT4vKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4gKi8KCmh0bWwsIGJvZHkgewogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgaGVpZ2h0OiAxMDAlOwogIG1hcmdpbjogMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB3aWR0aDogMTAwJTsKfQoKaDEgewogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxMHB0OwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgcGFkZGluZzogMHB0IDEwcHQ7Cn0KCnAgewogIGZvbnQtc2l6ZTogOHB0OwogIHBhZGRpbmc6IDBwdCAxNHB0Owp9CgojdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICBjb2xvcjogIzY0NjQ2NDsKfQoKI291dGVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZGlzcGxheTogZmxleDsKICBoZWlnaHQ6IDEwMCU7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KCi5pY29uIHsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBvcGFjaXR5OiAuMzsKfQoKQG1lZGlhIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1pbi1oZWlnaHQ6IDJlbSkgYW5kIChtaW4td2lkdGg6IDE0ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogNTAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KCkBtZWRpYSAobWluLWhlaWdodDogN2VtKSBhbmQgKG1pbi13aWR0aDogNmVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDUwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Cjwvc3R5bGU+CjxzdHlsZT4KI291dGVyIHsKICBib3JkZXI6IG5vbmU7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCiNzaGllbGRpbmcgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsKICBoZWlnaHQ6IDEwMCU7CiAgbGVmdDogMHB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDBweDsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAyOwp9CgojcGx1Z2luLWljb24gewogIG9wYWNpdHk6IDAuODsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBtaW4td2lkdGg6IDA7CiAgbWluLWhlaWdodDogMDsKfQoKI3BsdWdpbi1pY29uOmhvdmVyIHsKICBvcGFjaXR5OiAwLjk1Owp9CgojcG9zdGVyIHsKICBoZWlnaHQ6IDEwMCU7CiAgb2JqZWN0LWZpdDogY29udGFpbjsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAxOwp9CgojaW5uZXItY29udGFpbmVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMDAlOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGxlZnQ6IDBweDsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwcHg7CiAgd2lkdGg6IDEwMCU7CiAgei1pbmRleDogMjsKfQo8L3N0eWxlPgo8YmFzZSBpMThuLXZhbHVlcz0iaHJlZjpiYXNldXJsIj4KPC9oZWFkPgoKPGJvZHk+CiAgPGRpdiBpMThuLXZhbHVlcz0idGl0bGU6bmFtZSIgaWQ9Im91dGVyIj4KICAgIDxpbWcgaWQ9InBvc3RlciIgaTE4bi12YWx1ZXM9InNyY3NldDpwb3N0ZXIiPgogICAgPGRpdiBpZD0ic2hpZWxkaW5nIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImlubmVyLWNvbnRhaW5lciIKICAgICAgICAgaTE4bi12YWx1ZXM9Ii5zdHlsZS53aWR0aDp2aXNpYmxlV2lkdGg7LnN0eWxlLmhlaWdodDp2aXNpYmxlSGVpZ2h0Ij4KICAgICAgPGltZyBpZD0icGx1Z2luLWljb24iIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFESUFBQUF5Q0FZQUFBQWVQNGl4QUFBQUFYTlNSMElBcnM0YzZRQUFBOGRKUkVGVWFBWGRXczl2RWtFVVprdlpRbG9OeEpvWTQwa3hKc0RObzlHRGlmK0JmNENIcGpFbUpQb1BlTWNlMUY0MDhkWWpRZVBCZ3ljdjN2Ukc0R0JNUFJFUExTbHBDVVdnZ04rM25jVmw2UEpyWjVhNmsweDJaMmZudmUvYmVmUG16Y3dhSWJWcEdlTEN5RXNpRzVMNFBzbzlrYnU0bmtqMUN5c1NhQVE1dHJtNXVWNnBWQjRlSHgrL2JyVmFuM3U5M3M5K3YxOUZib2xjNVRQVzhSMit5elpzSzJUSXBQRllmNkxTNlBiMjlyWDkvZjBOZ1BzSXNBM2tXVk9EYlNtRHNpZ1QyVGRDWmphYnZWeXYxNThEOWVHc3lNZThmMGlabEEweUpySzJGRTRta3hlcjFlb1RtTWp2TVlBOFZWRTJkVkFYbUhDOEtVMW1QcDlQZGpxZDc1NVF6dENZdXFnVExKVDFUclJZTE43VDJRdHUvS2lUdWtHR1k4ZFRpdTN0N1QyQ29xYWJNaCtlTjRrQkxPamQ1a3BSUWNJSHJKTlZDREl6OTR6SkxvWDRSZmFFeks0cHpHenFNUlBtSUZ2RW1KQ1J5MlZpRWc1Z3NqZWoyL1BUTzhsZ0o1V0pUYmptc2VQRnBBK2ZKR3pSOWNRSUZxNG1abkJXUFk4bUpYODRZaFFSd0puaFRGU0VIWEs3bWNyTlp2TWRHakJRMUpxSUZiMHk0c1VNQm0zUTdEbDJLcFZLZDVqeDFYYTFNZ0ZXRVdnTzlVcUVFYWdLeFNTQkw3V1N5K1d1SXJKOXIwS21td3hpaGk0dUl3WXBKa0p4dHpaVFB4ZEU3SVhWYXExV2U0YkdXa3lObU1IQW12R3BNSVFGenFwcG1nOEd0TlRjY0NYWVNDUVNiOHJsOG4yUSthVkc3RDhweEV6czlwTmxydGFtL3VRVFhuVDBpQzJmMTRndVV5TjJ5T2NTTzdUQ3BlY0VmRk5YdXhDaEh2WStUZTBwaENrek5XSW5COHVXdytId0xXclNuR3hUZTZ2UzFBVDJKWXRJSkJLNW9abUVVL3lmVENiemJXdHI2MjY3M2Y3Z3JKam5YbUMzeHZvYXVwcTdIVXJTR05PU2Nhb3l0U29FcjFsTWNITkIxdUpEV1pXcFdkaHRJajdnMXF2Q2NsdFFVVWUrcEZmVmlIUit4Qmk4MkVZOEhuK0JlOWRvZHFUbDhBTml0MXdpeDBadHVFNTdpZlBLRmN6TU95RHhDdHJtSlJFUzJQdnNrUjRXSzd1WUpaUGE0WjhxaU1JaDNFNmxVanVHWVZ6M3FwUFl5WUhkMit0MnV6KzhDcHlpUFhWeFFueWNUcWUvcUNCQm5RSzdSYVI3Y0hEd2RRb2dYbDV4bXRKTENKcmJsR1FRQWp0MzlxMmdjUjIyTnM4bU5NZlhVRHBqSHFFcDZWcWZOTVNPL29DZnpqQmVhV3psL0dvallUem9uQndkSFgwYTBQSitvODJVbk5BRTVxSERvc0FzZFVrMEVKc1BKQktZN1NDU0NjUUdIWW1FZ3JKbFNpN0IyTVFtRTZSQUhDdWNVb0VYQzhKQmowMG1FRWR2TnBsQUhJYmFaTXhDb1hEVHp3TWc2bEo5UEcyVENjUVBBellaWHYvN1h6aWNaQUx4VTQxTTZGejg1alIwMnVORU9PYzlOek40ZE16MU9iTXNYOXVQWjM4QnZ3Wnc2ejkyUEk0QUFBQUFTVVZPUks1Q1lJST0iIC8+CiAgICA8L2Rpdj4KICA8L2Rpdj4KICA8c2NyaXB0PgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bvc3RlcicpLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5oaWRkZW4gPSB0cnVlOwogICAgfTsKCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3V0ZXInKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHBsdWdpbi5sb2FkKCk7CiAgICB9OwoKICAgIHdpbmRvdy5yZXNpemVQb3N0ZXIgPSBmdW5jdGlvbihtYXJnaW5MZWZ0LCBtYXJnaW5Ub3AsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbm5lci1jb250YWluZXInKTsKICAgICAgY29udGFpbmVyLnN0eWxlLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0OwogICAgICBjb250YWluZXIuc3R5bGUubWFyZ2luVG9wID0gbWFyZ2luVG9wOwogICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSB3aWR0aDsKICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGhlaWdodDsKCiAgICAgIGlmIChwbHVnaW4uZGlkRmluaXNoSWNvblJlcG9zaXRpb25Gb3JUZXN0aW5nKSB7CiAgICAgICAgLy8gRGVmZXIgdW50aWwgcmVmbG93IGNvbXBsZXRlLgogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgcGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZygpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGFwcCBBUEkuCgp2YXIgYXBwTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2FwcCcpOwp2YXIgcHJvY2VzcyA9IHJlcXVpcmVOYXRpdmUoJ3Byb2Nlc3MnKTsKdmFyIGV4dGVuc2lvbklkID0gcHJvY2Vzcy5HZXRFeHRlbnNpb25JZCgpOwp2YXIgbG9nQWN0aXZpdHkgPSByZXF1aXJlTmF0aXZlKCdhY3Rpdml0eUxvZ2dlcicpOwoKZnVuY3Rpb24gd3JhcEZvckxvZ2dpbmcoZnVuKSB7CiAgaWYgKCFleHRlbnNpb25JZCkKICAgIHJldHVybiBmdW47ICAvLyBub3RoaW5nIGludGVyZXN0aW5nIHRvIGxvZyB3aXRob3V0IGFuIGV4dGVuc2lvbgoKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAvLyBUT0RPKGF0YWx5KTogV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBwcm90b3R5cGUgZm9yCiAgICAvLyBmdW4uYXBwbHkuIEFycmF5IHNsaWNlIGNhbiBlaXRoZXIgYmUgcmV3cml0dGVuIG9yIHNpbWlsYXJseSBkZWZpbmVkLgogICAgbG9nQWN0aXZpdHkuTG9nQVBJQ2FsbChleHRlbnNpb25JZCwgImFwcC4iICsgZnVuLm5hbWUsCiAgICAgICAgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogICAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShmdW4sIHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKfQoKLy8gVGhpcyBiZWNvbWVzIGNocm9tZS5hcHAKdmFyIGFwcCA9IHsKICBnZXRJc0luc3RhbGxlZDogd3JhcEZvckxvZ2dpbmcoYXBwTmF0aXZlcy5HZXRJc0luc3RhbGxlZCksCiAgZ2V0RGV0YWlsczogd3JhcEZvckxvZ2dpbmcoYXBwTmF0aXZlcy5HZXREZXRhaWxzKSwKICBydW5uaW5nU3RhdGU6IHdyYXBGb3JMb2dnaW5nKGFwcE5hdGl2ZXMuR2V0UnVubmluZ1N0YXRlKQp9OwoKLy8gVHJpY2t5OyAiZ2V0SXNJbnN0YWxsZWQiIGlzIGFjdHVhbGx5IGV4cG9zZWQgYXMgdGhlIGdldHRlciAiaXNJbnN0YWxsZWQiLAovLyBidXQgd2UgZG9uJ3QgaGF2ZSBhIHdheSB0byBleHByZXNzIHRoaXMgaW4gdGhlIHNjaGVtYSBKU09OIChub3IgaXMgaXQKLy8gd29ydGggaXQgZm9yIHRoaXMgb25lIHNwZWNpYWwgY2FzZSkuCi8vCi8vIFNvLCBkZWZpbmUgaXQgbWFudWFsbHksIGFuZCBsZXQgdGhlIGdldElzSW5zdGFsbGVkIGZ1bmN0aW9uIGFjdCBhcyBpdHMKLy8gZG9jdW1lbnRhdGlvbi4KdmFyIGlzSW5zdGFsbGVkID0gd3JhcEZvckxvZ2dpbmcoYXBwTmF0aXZlcy5HZXRJc0luc3RhbGxlZCk7CiRPYmplY3QuZGVmaW5lUHJvcGVydHkoCiAgICBhcHAsICdpc0luc3RhbGxlZCcsCiAgICB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaXNJbnN0YWxsZWQoKTsgfSwKICAgIH0pOwoKLy8gQ2FsbGVkIGJ5IGFwcF9iaW5kaW5ncy5jYy4KZnVuY3Rpb24gb25JbnN0YWxsU3RhdGVSZXNwb25zZShzdGF0ZSwgY2FsbGJhY2tJZCkgewogIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1tjYWxsYmFja0lkXTsKICBkZWxldGUgY2FsbGJhY2tzW2NhbGxiYWNrSWRdOwogIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJykgewogICAgdHJ5IHsKICAgICAgY2FsbGJhY2soc3RhdGUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBjb25zb2xlLmVycm9yKCdFeGNlcHRpb24gaW4gY2hyb21lLmFwcC5pbnN0YWxsU3RhdGUgcmVzcG9uc2UgaGFuZGxlcjogJyArCiAgICAgICAgICAgICAgICAgICAgZS5zdGFjayk7CiAgICB9CiAgfQp9CgovLyBUT0RPKGthbG1hbik6IG1vdmUgdGhpcyBzdHVmZiB0byBpdHMgb3duIGN1c3RvbSBiaW5kaW5ncy4KdmFyIGNhbGxiYWNrcyA9IHsgX19wcm90b19fOiBudWxsIH07CnZhciBuZXh0Q2FsbGJhY2tJZCA9IDE7CgpmdW5jdGlvbiBnZXRJbnN0YWxsU3RhdGUoY2FsbGJhY2spIHsKICB2YXIgY2FsbGJhY2tJZCA9IG5leHRDYWxsYmFja0lkKys7CiAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdID0gY2FsbGJhY2s7CiAgYXBwTmF0aXZlcy5HZXRJbnN0YWxsU3RhdGUoY2FsbGJhY2tJZCk7Cn0KCiRPYmplY3QuZGVmaW5lUHJvcGVydHkoCiAgICBhcHAsICdpbnN0YWxsU3RhdGUnLAogICAgewogICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgdmFsdWU6IHdyYXBGb3JMb2dnaW5nKGdldEluc3RhbGxTdGF0ZSksCiAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgfSk7CgpleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBhcHApOwpleHBvcnRzLiRzZXQoJ29uSW5zdGFsbFN0YXRlUmVzcG9uc2UnLCBvbkluc3RhbGxTdGF0ZVJlc3BvbnNlKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5ncyBmb3IgdGhlIGF1dG9tYXRpb24gQVBJLgp2YXIgQXV0b21hdGlvbk5vZGUgPSByZXF1aXJlKCdhdXRvbWF0aW9uTm9kZScpLkF1dG9tYXRpb25Ob2RlOwp2YXIgQXV0b21hdGlvblJvb3ROb2RlID0gcmVxdWlyZSgnYXV0b21hdGlvbk5vZGUnKS5BdXRvbWF0aW9uUm9vdE5vZGU7CnZhciBhdXRvbWF0aW9uID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnYXV0b21hdGlvbicpOwp2YXIgYXV0b21hdGlvbkludGVybmFsID0KICAgIGdldEludGVybmFsQXBpID8KICAgICAgICBnZXRJbnRlcm5hbEFwaSgnYXV0b21hdGlvbkludGVybmFsJykgOgogICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnYXV0b21hdGlvbkludGVybmFsJykuZ2VuZXJhdGUoKTsKdmFyIGV4Y2VwdGlvbkhhbmRsZXIgPSByZXF1aXJlKCd1bmNhdWdodF9leGNlcHRpb25faGFuZGxlcicpOwp2YXIgbG9nZ2luZyA9IHJlcXVpcmVOYXRpdmUoJ2xvZ2dpbmcnKTsKdmFyIG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbCA9IHJlcXVpcmVOYXRpdmUoJ2F1dG9tYXRpb25JbnRlcm5hbCcpOwp2YXIgRGVzdHJveUFjY2Vzc2liaWxpdHlUcmVlID0KICAgIG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5EZXN0cm95QWNjZXNzaWJpbGl0eVRyZWU7CnZhciBHZXRJbnRBdHRyaWJ1dGUgPSBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuR2V0SW50QXR0cmlidXRlOwp2YXIgU3RhcnRDYWNoaW5nQWNjZXNzaWJpbGl0eVRyZWVzID0KICAgIG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5TdGFydENhY2hpbmdBY2Nlc3NpYmlsaXR5VHJlZXM7CnZhciBBZGRUcmVlQ2hhbmdlT2JzZXJ2ZXIgPSBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuQWRkVHJlZUNoYW5nZU9ic2VydmVyOwp2YXIgUmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyID0KICAgIG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5SZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXI7CnZhciBHZXRGb2N1c05hdGl2ZSA9IG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5HZXRGb2N1czsKCnZhciBqc0xhc3RFcnJvciA9IGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogcmVxdWlyZSgnbGFzdEVycm9yJyk7CmZ1bmN0aW9uIGhhc0xhc3RFcnJvcigpIHsKICByZXR1cm4gYmluZGluZ1V0aWwgPwogICAgICBiaW5kaW5nVXRpbC5oYXNMYXN0RXJyb3IoKSA6IGpzTGFzdEVycm9yLmhhc0Vycm9yKGNocm9tZSk7Cn0KCi8qKgogKiBBIG5hbWVzcGFjZSB0byBleHBvcnQgdXRpbGl0eSBmdW5jdGlvbnMgdG8gb3RoZXIgZmlsZXMgaW4gYXV0b21hdGlvbi4KICovCndpbmRvdy5hdXRvbWF0aW9uVXRpbCA9IGZ1bmN0aW9uKCkge307CgovLyBUT0RPKGFib3hoYWxsKTogTG9vayBpbnRvIHVzaW5nIFdlYWtNYXAKdmFyIGlkVG9DYWxsYmFjayA9IHt9OwoKdmFyIERFU0tUT1BfVFJFRV9JRCA9IDA7CgphdXRvbWF0aW9uVXRpbC5zdG9yZVRyZWVDYWxsYmFjayA9IGZ1bmN0aW9uKGlkLCBjYWxsYmFjaykgewogIGlmICghY2FsbGJhY2spCiAgICByZXR1cm47CgogIHZhciB0YXJnZXRUcmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldChpZCk7CiAgaWYgKCF0YXJnZXRUcmVlKSB7CiAgICAvLyBJZiB3ZSBoYXZlbid0IGNhY2hlZCB0aGUgdHJlZSwgaG9sZCB0aGUgY2FsbGJhY2sgdW50aWwgdGhlIHRyZWUgaXMKICAgIC8vIHBvcHVsYXRlZCBieSB0aGUgaW5pdGlhbCBvbkFjY2Vzc2liaWxpdHlFdmVudCBjYWxsLgogICAgaWYgKGlkIGluIGlkVG9DYWxsYmFjaykKICAgICAgaWRUb0NhbGxiYWNrW2lkXS5wdXNoKGNhbGxiYWNrKTsKICAgIGVsc2UKICAgICAgaWRUb0NhbGxiYWNrW2lkXSA9IFtjYWxsYmFja107CiAgfSBlbHNlIHsKICAgIGNhbGxiYWNrKHRhcmdldFRyZWUpOwogIH0KfTsKCi8qKgogKiBHbG9iYWwgbGlzdCBvZiB0cmVlIGNoYW5nZSBvYnNlcnZlcnMuCiAqIEB0eXBlIHtPYmplY3Q8bnVtYmVyLCBUcmVlQ2hhbmdlT2JzZXJ2ZXI+fQogKi8KYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwID0ge307CgovKioKICogVGhlIGlkIG9mIHRoZSBuZXh0IHRyZWUgY2hhbmdlIG9ic2VydmVyLgogKiBAdHlwZSB7bnVtYmVyfQogKi8KYXV0b21hdGlvblV0aWwubmV4dFRyZWVDaGFuZ2VPYnNlcnZlcklkID0gMTsKCi8qKgogKiBAdHlwZSB7QXV0b21hdGlvbk5vZGV9IFRoZSBjdXJyZW50IGZvY3VzZWQgbm9kZS4gVGhpcyBpcyBvbmx5IHVwZGF0ZWQKICogICB3aGVuIGNhbGxpbmcgYXV0b21hdGlvblV0aWwudXBkYXRlRm9jdXNlZE5vZGUuCiAqLwphdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSA9IG51bGw7CgovKioKICogR2V0cyB0aGUgY3VycmVudGx5IGZvY3VzZWQgQXV0b21hdGlvbk5vZGUuCiAqIEByZXR1cm4ge0F1dG9tYXRpb25Ob2RlfQogKi8KYXV0b21hdGlvblV0aWwuZ2V0Rm9jdXMgPSBmdW5jdGlvbigpIHsKICB2YXIgZm9jdXNlZE5vZGVJbmZvID0gR2V0Rm9jdXNOYXRpdmUoREVTS1RPUF9UUkVFX0lEKTsKICBpZiAoIWZvY3VzZWROb2RlSW5mbykKICAgIHJldHVybiBudWxsOwogIHZhciB0cmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldE9yQ3JlYXRlKGZvY3VzZWROb2RlSW5mby50cmVlSWQpOwogIGlmICh0cmVlKQogICAgcmV0dXJuIHByaXZhdGVzKHRyZWUpLmltcGwuZ2V0KGZvY3VzZWROb2RlSW5mby5ub2RlSWQpOwp9OwoKLyoqCiAqIFVwZGF0ZSBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSB0byBiZSB0aGUgbm9kZSB0aGF0IGN1cnJlbnRseSBoYXMgZm9jdXMuCiAqLwphdXRvbWF0aW9uVXRpbC51cGRhdGVGb2N1c2VkTm9kZSA9IGZ1bmN0aW9uKCkgewogIGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlID0gYXV0b21hdGlvblV0aWwuZ2V0Rm9jdXMoKTsKfTsKCi8qKgogKiBVcGRhdGVzIHRoZSBmb2N1cyBvbiBibHVyLgogKi8KYXV0b21hdGlvblV0aWwudXBkYXRlRm9jdXNlZE5vZGVPbkJsdXIgPSBmdW5jdGlvbigpIHsKICB2YXIgZm9jdXMgPSBhdXRvbWF0aW9uVXRpbC5nZXRGb2N1cygpOwogIGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlID0gZm9jdXMgPyBmb2N1cy5yb290IDogbnVsbDsKfTsKCmF1dG9tYXRpb24ucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgLy8gVE9ETyhhYm94aGFsbCwgZHRzZW5nKTogTWFrZSB0aGlzIHJldHVybiB0aGUgc3BlY2VkIEF1dG9tYXRpb25Sb290Tm9kZSBvYmouCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFRyZWUnLCBmdW5jdGlvbiBnZXRUcmVlKHRhYklELCBjYWxsYmFjaykgewogICAgU3RhcnRDYWNoaW5nQWNjZXNzaWJpbGl0eVRyZWVzKCk7CgogICAgLy8gZW5hYmxlVGFiKCkgZW5zdXJlcyB0aGUgcmVuZGVyZXIgZm9yIHRoZSBhY3RpdmUgb3Igc3BlY2lmaWVkIHRhYiBoYXMKICAgIC8vIGFjY2Vzc2liaWxpdHkgZW5hYmxlZCwgYW5kIGZldGNoZXMgaXRzIGF4IHRyZWUgaWQgdG8gdXNlIGFzCiAgICAvLyBhIGtleSBpbiB0aGUgaWRUb0F1dG9tYXRpb25Sb290Tm9kZSBtYXAuIFRoZSBjYWxsYmFjayB0bwogICAgLy8gZW5hYmxlVGFiIGlzIGJvdW5kIHRvIHRoZSBjYWxsYmFjayBwYXNzZWQgaW4gdG8gZ2V0VHJlZSgpLCBzbyB0aGF0IG9uY2UKICAgIC8vIHRoZSB0cmVlIGlzIGF2YWlsYWJsZSAoZWl0aGVyIGR1ZSB0byBoYXZpbmcgYmVlbiBjYWNoZWQgZWFybGllciwgb3IgYWZ0ZXIKICAgIC8vIGFuIGFjY2Vzc2liaWxpdHkgZXZlbnQgb2NjdXJzIHdoaWNoIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBwb3B1bGF0ZWQpLCB0aGUKICAgIC8vIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQuCiAgICB2YXIgcGFyYW1zID0geyB0YWJJRDogdGFiSUQgfTsKICAgIGF1dG9tYXRpb25JbnRlcm5hbC5lbmFibGVUYWIocGFyYW1zLAogICAgICAgIGZ1bmN0aW9uIG9uRW5hYmxlKGlkKSB7CiAgICAgICAgICBpZiAoaGFzTGFzdEVycm9yKCkpIHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgYXV0b21hdGlvblV0aWwuc3RvcmVUcmVlQ2FsbGJhY2soaWQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICB9KTsKCiAgdmFyIGRlc2t0b3BUcmVlID0gbnVsbDsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0RGVza3RvcCcsIGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBTdGFydENhY2hpbmdBY2Nlc3NpYmlsaXR5VHJlZXMoKTsKICAgIGRlc2t0b3BUcmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldChERVNLVE9QX1RSRUVfSUQpOwogICAgaWYgKCFkZXNrdG9wVHJlZSkgewogICAgICBpZiAoREVTS1RPUF9UUkVFX0lEIGluIGlkVG9DYWxsYmFjaykKICAgICAgICBpZFRvQ2FsbGJhY2tbREVTS1RPUF9UUkVFX0lEXS5wdXNoKGNhbGxiYWNrKTsKICAgICAgZWxzZQogICAgICAgIGlkVG9DYWxsYmFja1tERVNLVE9QX1RSRUVfSURdID0gW2NhbGxiYWNrXTsKCiAgICAgIC8vIFRPRE8oZHRzZW5nKTogRGlzYWJsZSBkZXNrdG9wIHRyZWUgb25jZSBkZXNrdG9wIG9iamVjdCBnb2VzIG91dCBvZgogICAgICAvLyBzY29wZS4KICAgICAgYXV0b21hdGlvbkludGVybmFsLmVuYWJsZURlc2t0b3AoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGhhc0xhc3RFcnJvcigpKSB7CiAgICAgICAgICBBdXRvbWF0aW9uUm9vdE5vZGUuZGVzdHJveShERVNLVE9QX1RSRUVfSUQpOwogICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgY2FsbGJhY2soZGVza3RvcFRyZWUpOwogICAgfQogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0Rm9jdXMnLCBmdW5jdGlvbihjYWxsYmFjaykgewogICAgY2FsbGJhY2soYXV0b21hdGlvblV0aWwuZ2V0Rm9jdXMoKSk7CiAgfSk7CgogIGZ1bmN0aW9uIHJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcihvYnNlcnZlcikgewogICAgZm9yICh2YXIgaWQgaW4gYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwKSB7CiAgICAgIGlmIChhdXRvbWF0aW9uVXRpbC50cmVlQ2hhbmdlT2JzZXJ2ZXJNYXBbaWRdID09IG9ic2VydmVyKSB7CiAgICAgICAgUmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyKGlkKTsKICAgICAgICBkZWxldGUgYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwW2lkXTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3JlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcicsIGZ1bmN0aW9uKG9ic2VydmVyKSB7CiAgICByZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwogIH0pOwoKICBmdW5jdGlvbiBhZGRUcmVlQ2hhbmdlT2JzZXJ2ZXIoZmlsdGVyLCBvYnNlcnZlcikgewogICAgcmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyKG9ic2VydmVyKTsKICAgIHZhciBpZCA9IGF1dG9tYXRpb25VdGlsLm5leHRUcmVlQ2hhbmdlT2JzZXJ2ZXJJZCsrOwogICAgQWRkVHJlZUNoYW5nZU9ic2VydmVyKGlkLCBmaWx0ZXIpOwogICAgYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwW2lkXSA9IG9ic2VydmVyOwogIH0KICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnYWRkVHJlZUNoYW5nZU9ic2VydmVyJywKICAgICAgZnVuY3Rpb24oZmlsdGVyLCBvYnNlcnZlcikgewogICAgYWRkVHJlZUNoYW5nZU9ic2VydmVyKGZpbHRlciwgb2JzZXJ2ZXIpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0RG9jdW1lbnRTZWxlY3Rpb24nLCBmdW5jdGlvbihwYXJhbXMpIHsKICAgIHZhciBhbmNob3JOb2RlSW1wbCA9IHByaXZhdGVzKHBhcmFtcy5hbmNob3JPYmplY3QpLmltcGw7CiAgICB2YXIgZm9jdXNOb2RlSW1wbCA9IHByaXZhdGVzKHBhcmFtcy5mb2N1c09iamVjdCkuaW1wbDsKICAgIGlmIChhbmNob3JOb2RlSW1wbC50cmVlSUQgIT09IGZvY3VzTm9kZUltcGwudHJlZUlEKQogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbGVjdGlvbiBhbmNob3IgYW5kIGZvY3VzIG11c3QgYmUgaW4gdGhlIHNhbWUgdHJlZS4nKTsKICAgIGlmIChhbmNob3JOb2RlSW1wbC50cmVlSUQgPT09IERFU0tUT1BfVFJFRV9JRCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBBdXRvbWF0aW9uTm9kZS5zZXRTZWxlY3Rpb24gdG8gc2V0IHRoZSBzZWxlY3Rpb24gJyArCiAgICAgICAgICAnaW4gdGhlIGRlc2t0b3AgdHJlZS4nKTsKICAgIH0KICAgIGF1dG9tYXRpb25JbnRlcm5hbC5wZXJmb3JtQWN0aW9uKHsgdHJlZUlEOiBhbmNob3JOb2RlSW1wbC50cmVlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpb25Ob2RlSUQ6IGFuY2hvck5vZGVJbXBsLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiAnc2V0U2VsZWN0aW9uJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZvY3VzTm9kZUlEOiBmb2N1c05vZGVJbXBsLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JPZmZzZXQ6IHBhcmFtcy5hbmNob3JPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzT2Zmc2V0OiBwYXJhbXMuZm9jdXNPZmZzZXQgfSk7CiAgfSk7Cgp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vbkNoaWxkVHJlZUlELmFkZExpc3RlbmVyKGZ1bmN0aW9uKHRyZWVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlEKSB7CiAgdmFyIHRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUodHJlZUlEKTsKICBpZiAoIXRyZWUpCiAgICByZXR1cm47CgogIHZhciBub2RlID0gcHJpdmF0ZXModHJlZSkuaW1wbC5nZXQobm9kZUlEKTsKICBpZiAoIW5vZGUpCiAgICByZXR1cm47CgogIC8vIEEgV2ViVmlldyBpbiB0aGUgZGVza3RvcCB0cmVlIGhhcyBhIGRpZmZlcmVudCBBWCB0cmVlIGFzIGl0cyBjaGlsZC4KICAvLyBXaGVuIHdlIGVuY291bnRlciBhIFdlYlZpZXcgd2l0aCBhIGNoaWxkIEFYIHRyZWUgaWQgdGhhdCB3ZSBkb24ndAogIC8vIGN1cnJlbnRseSBoYXZlIGNhY2hlZCwgZXhwbGljaXRseSByZXF1ZXN0IHRoYXQgQVggdHJlZSBmcm9tIHRoZQogIC8vIGJyb3dzZXIgcHJvY2VzcyBhbmQgc2V0IHVwIGEgY2FsbGJhY2sgd2hlbiBpdCBsb2FkcyB0byBhdHRhY2ggdGhhdAogIC8vIHRyZWUgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUgYW5kIGZpcmUgYXBwcm9wcmlhdGUgZXZlbnRzLgogIHZhciBjaGlsZFRyZWVJRCA9IEdldEludEF0dHJpYnV0ZSh0cmVlSUQsIG5vZGVJRCwgJ2NoaWxkVHJlZUlkJyk7CiAgaWYgKCFjaGlsZFRyZWVJRCkKICAgIHJldHVybjsKCiAgdmFyIHN1YnJvb3QgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KGNoaWxkVHJlZUlEKTsKICBpZiAoIXN1YnJvb3QgfHwgc3Vicm9vdC5yb2xlID09ICd1bmtub3duJykgewogICAgYXV0b21hdGlvblV0aWwuc3RvcmVUcmVlQ2FsbGJhY2soY2hpbGRUcmVlSUQsIGZ1bmN0aW9uKHJvb3QpIHsKICAgICAgLy8gUmV0dXJuIGVhcmx5IGlmIHRoZSByb290IGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQuCiAgICAgIGlmIChyb290LnBhcmVudCkKICAgICAgICByZXR1cm47CgogICAgICBwcml2YXRlcyhyb290KS5pbXBsLnNldEhvc3ROb2RlKG5vZGUpOwoKICAgICAgaWYgKHJvb3QuZG9jTG9hZGVkKSB7CiAgICAgICAgcHJpdmF0ZXMocm9vdCkuaW1wbC5kaXNwYXRjaEV2ZW50KCdsb2FkQ29tcGxldGUnLCAncGFnZScpOwogICAgICB9CgogICAgICBwcml2YXRlcyhub2RlKS5pbXBsLmRpc3BhdGNoRXZlbnQoJ2NoaWxkcmVuQ2hhbmdlZCcsICdub25lJyk7CiAgICB9KTsKCiAgICBhdXRvbWF0aW9uSW50ZXJuYWwuZW5hYmxlRnJhbWUoY2hpbGRUcmVlSUQpOwogIH0gZWxzZSB7CiAgICBwcml2YXRlcyhzdWJyb290KS5pbXBsLnNldEhvc3ROb2RlKG5vZGUpOwogIH0KfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25UcmVlQ2hhbmdlLmFkZExpc3RlbmVyKGZ1bmN0aW9uKG9ic2VydmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUeXBlKSB7CiAgdmFyIHRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUodHJlZUlEKTsKICBpZiAoIXRyZWUpCiAgICByZXR1cm47CgogIHZhciBub2RlID0gcHJpdmF0ZXModHJlZSkuaW1wbC5nZXQobm9kZUlEKTsKICBpZiAoIW5vZGUpCiAgICByZXR1cm47CgogIHZhciBvYnNlcnZlciA9IGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcFtvYnNlcnZlcklEXTsKICBpZiAoIW9ic2VydmVyKQogICAgcmV0dXJuOwoKICB0cnkgewogICAgb2JzZXJ2ZXIoe3RhcmdldDogbm9kZSwgdHlwZTogY2hhbmdlVHlwZX0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKCdFcnJvciBpbiB0cmVlIGNoYW5nZSBvYnNlcnZlciBmb3IgJyArCiAgICAgICAgdHJlZUNoYW5nZS50eXBlLCBlKTsKICB9Cn0pOwoKYXV0b21hdGlvbkludGVybmFsLm9uTm9kZXNSZW1vdmVkLmFkZExpc3RlbmVyKGZ1bmN0aW9uKHRyZWVJRCwgbm9kZUlEcykgewogIHZhciB0cmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldE9yQ3JlYXRlKHRyZWVJRCk7CiAgaWYgKCF0cmVlKQogICAgcmV0dXJuOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVJRHMubGVuZ3RoOyBpKyspIHsKICAgIHByaXZhdGVzKHRyZWUpLmltcGwucmVtb3ZlKG5vZGVJRHNbaV0pOwogIH0KfSk7CgovKioKICogRGlzcGF0Y2ggYWNjZXNzaWJpbGl0eSBldmVudHMgZmlyZWQgb24gaW5kaXZpZHVhbCBub2RlcyB0byBpdHMKICogY29ycmVzcG9uZGluZyBBdXRvbWF0aW9uTm9kZS4gSGFuZGxlIGZvY3VzIGV2ZW50cyBzcGVjaWFsbHkKICogKHNlZSBiZWxvdykuCiAqLwphdXRvbWF0aW9uSW50ZXJuYWwub25BY2Nlc3NpYmlsaXR5RXZlbnQuYWRkTGlzdGVuZXIoZnVuY3Rpb24oZXZlbnRQYXJhbXMpIHsKICB2YXIgaWQgPSBldmVudFBhcmFtcy50cmVlSUQ7CiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUoaWQpOwogIGlmIChldmVudFBhcmFtcy5ldmVudFR5cGUgPT0gJ2JsdXInKSB7CiAgICAvLyBXb3JrIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBDaHJvbWUgc2VuZHMgdXMgJ2JsdXInIGV2ZW50cyBvbiB0aGUKICAgIC8vIHJvb3Qgbm9kZSB3aGVuIG5vdGhpbmcgaGFzIGZvY3VzLCB3ZSBuZWVkIHRvIHRyZWF0IHRob3NlIGFzIGZvY3VzCiAgICAvLyBldmVudHMgYnV0IG90aGVyd2lzZSBub3QgaGFuZGxlIGJsdXIgZXZlbnRzIHNwZWNpYWxseS4KICAgIHZhciBub2RlID0gcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5nZXQoZXZlbnRQYXJhbXMudGFyZ2V0SUQpOwogICAgaWYgKG5vZGUgPT0gbm9kZS5yb290KQogICAgICBhdXRvbWF0aW9uVXRpbC51cGRhdGVGb2N1c2VkTm9kZU9uQmx1cigpOwogIH0gZWxzZSBpZiAoZXZlbnRQYXJhbXMuZXZlbnRUeXBlID09ICdtZWRpYVN0YXJ0ZWRQbGF5aW5nJyB8fAogICAgICBldmVudFBhcmFtcy5ldmVudFR5cGUgPT0gJ21lZGlhU3RvcHBlZFBsYXlpbmcnKSB7CiAgICAvLyBUaGVzZSBldmVudHMgYXJlIGdsb2JhbCB0byB0aGUgdHJlZS4KICAgIGV2ZW50UGFyYW1zLnRhcmdldElEID0gcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5pZDsKICB9IGVsc2UgewogICAgdmFyIHByZXZpb3VzRm9jdXNlZE5vZGUgPSBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZTsKICAgIGF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlKCk7CgogICAgLy8gRmlyZSBmb2N1cyBldmVudHMgaWYgbmVjZXNzYXJ5LgogICAgaWYgKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlICYmCiAgICAgICAgYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgIT0gcHJldmlvdXNGb2N1c2VkTm9kZSkgewogICAgICB2YXIgZXZlbnRQYXJhbXNDb3B5ID0ge307CiAgICAgIGZvciAodmFyIGtleSBpbiBldmVudFBhcmFtcykKICAgICAgICBldmVudFBhcmFtc0NvcHlba2V5XSA9IGV2ZW50UGFyYW1zW2tleV07CiAgICAgIGV2ZW50UGFyYW1zQ29weVsnZXZlbnRUeXBlJ10gPSAnZm9jdXMnOwogICAgICBldmVudFBhcmFtc0NvcHlbJ3RyZWVJRCddID0KICAgICAgICAgIHByaXZhdGVzKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlLnJvb3QpLmltcGwudHJlZUlEOwogICAgICBldmVudFBhcmFtc0NvcHlbJ3RhcmdldElEJ10gPQogICAgICAgICAgcHJpdmF0ZXMoYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUpLmltcGwuaWQ7CiAgICAgIHByaXZhdGVzKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlLnJvb3QpCiAgICAgICAgICAuaW1wbC5vbkFjY2Vzc2liaWxpdHlFdmVudChldmVudFBhcmFtc0NvcHkpOwogICAgfQogIH0KCiAgLy8gTm90ZSB0aGF0IGZvY3VzIHR5cGUgZXZlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYWJvdmUgaWYgdGhlcmUgd2FzIGEKICAvLyBmb2N1c2VkIG5vZGUuIEFsbCBvdGhlciBldmVudHMsIGV2ZW4gbm9uLWZvY3VzIGV2ZW50cyB0aGF0IHRyaWdnZXJlZCBhCiAgLy8gZm9jdXMgZGlzcGF0Y2gsIHN0aWxsIG5lZWQgdG8gaGF2ZSB0aGVpciBvcmlnaW5hbCBldmVudCBmaXJlZC4KICBpZiAoKCFhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSB8fCBldmVudFBhcmFtcy5ldmVudFR5cGUgIT0gJ2ZvY3VzJykgJiYKICAgICAgIXByaXZhdGVzKHRhcmdldFRyZWUpLmltcGwub25BY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnRQYXJhbXMpKQogICAgcmV0dXJuOwoKICAvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGdldFRyZWUoKSwgd2UgY2FuIGVhcmx5IG91dCBoZXJlLgogIGlmICghKGlkIGluIGlkVG9DYWxsYmFjaykpCiAgICByZXR1cm47CgogIC8vIFdlIHVzdWFsbHkgZ2V0IGEgJ3BsYWNlaG9sZGVyJyB0cmVlIGZpcnN0LCB3aGljaCBkb2Vzbid0IGhhdmUgYW55IHVybAogIC8vIGF0dHJpYnV0ZSBvciBjaGlsZCBub2Rlcy4gSWYgd2UndmUgZ290IHRoYXQsIHdhaXQgZm9yIHRoZSBmdWxsIHRyZWUgYmVmb3JlCiAgLy8gY2FsbGluZyB0aGUgY2FsbGJhY2suCiAgLy8gVE9ETyhkbWF6em9uaSk6IERvbid0IHNlbmQgZG93biBwbGFjZWhvbGRlciAoY3JidWcuY29tLzM5NzU1MykKICBpZiAoaWQgIT0gREVTS1RPUF9UUkVFX0lEICYmICF0YXJnZXRUcmVlLnVybCAmJgogICAgICB0YXJnZXRUcmVlLmNoaWxkcmVuLmxlbmd0aCA9PSAwKQogICAgcmV0dXJuOwoKICAvLyBJZiB0aGUgdHJlZSB3YXNuJ3QgYXZhaWxhYmxlIHdoZW4gZ2V0VHJlZSgpIHdhcyBjYWxsZWQsIHRoZSBjYWxsYmFjayB3aWxsCiAgLy8gaGF2ZSBiZWVuIGNhY2hlZCBpbiBpZFRvQ2FsbGJhY2ssIHNvIGNhbGwgYW5kIGRlbGV0ZSBpdCBub3cgdGhhdCB3ZQogIC8vIGhhdmUgdGhlIGNvbXBsZXRlIHRyZWUuCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZFRvQ2FsbGJhY2tbaWRdLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBpZFRvQ2FsbGJhY2tbaWRdW2ldOwogICAgY2FsbGJhY2sodGFyZ2V0VHJlZSk7CiAgfQogIGRlbGV0ZSBpZFRvQ2FsbGJhY2tbaWRdOwp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vbkFjY2Vzc2liaWxpdHlUcmVlRGVzdHJveWVkLmFkZExpc3RlbmVyKGZ1bmN0aW9uKGlkKSB7CiAgLy8gRGVzdHJveSB0aGUgQXV0b21hdGlvblJvb3ROb2RlLgogIHZhciB0YXJnZXRUcmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldChpZCk7CiAgaWYgKHRhcmdldFRyZWUpIHsKICAgIHByaXZhdGVzKHRhcmdldFRyZWUpLmltcGwuZGVzdHJveSgpOwogICAgQXV0b21hdGlvblJvb3ROb2RlLmRlc3Ryb3koaWQpOwogIH0gZWxzZSB7CiAgICBsb2dnaW5nLldBUk5JTkcoJ25vIHRhcmdldFRyZWUgdG8gZGVzdHJveScpOwogIH0KCiAgLy8gRGVzdHJveSB0aGUgbmF0aXZlIGNhY2hlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAgRGVzdHJveUFjY2Vzc2liaWxpdHlUcmVlKGlkKTsKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25BY2Nlc3NpYmlsaXR5VHJlZVNlcmlhbGl6YXRpb25FcnJvci5hZGRMaXN0ZW5lcigKICAgIGZ1bmN0aW9uKGlkKSB7CiAgYXV0b21hdGlvbkludGVybmFsLmVuYWJsZUZyYW1lKGlkKTsKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25BY3Rpb25SZXN1bHQuYWRkTGlzdGVuZXIoCiAgICBmdW5jdGlvbih0cmVlSUQsIHJlcXVlc3RJRCwgcmVzdWx0KSB7CiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KHRyZWVJRCk7CiAgaWYgKCF0YXJnZXRUcmVlKQogICAgcmV0dXJuOwoKICBwcml2YXRlcyh0YXJnZXRUcmVlKS5pbXBsLm9uQWN0aW9uUmVzdWx0KHJlcXVlc3RJRCwgcmVzdWx0KTsKICAgIH0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYXV0b21hdGlvbi5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CgpmdW5jdGlvbiBBdXRvbWF0aW9uRXZlbnRJbXBsKHR5cGUsIHRhcmdldCwgZXZlbnRGcm9tKSB7CiAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogIHRoaXMuZXZlbnRQaGFzZSA9IEV2ZW50Lk5PTkU7CiAgdGhpcy5ldmVudEZyb20gPSBldmVudEZyb207Cn0KCkF1dG9tYXRpb25FdmVudEltcGwucHJvdG90eXBlID0gewogIF9fcHJvdG9fXzogbnVsbCwKICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlOwogIH0sCn07CgpmdW5jdGlvbiBBdXRvbWF0aW9uRXZlbnQoKSB7CiAgcHJpdmF0ZXMoQXV0b21hdGlvbkV2ZW50KS5jb25zdHJ1Y3RQcml2YXRlKHRoaXMsIGFyZ3VtZW50cyk7Cn0KdXRpbHMuZXhwb3NlKEF1dG9tYXRpb25FdmVudCwgQXV0b21hdGlvbkV2ZW50SW1wbCwgewogIGZ1bmN0aW9uczogWwogICAgJ3N0b3BQcm9wYWdhdGlvbicsCiAgXSwKICByZWFkb25seTogWwogICAgJ3R5cGUnLAogICAgJ3RhcmdldCcsCiAgICAnZXZlbnRQaGFzZScsCiAgICAnZXZlbnRGcm9tJywKICBdLAp9KTsKCmV4cG9ydHMuJHNldCgnQXV0b21hdGlvbkV2ZW50JywgQXV0b21hdGlvbkV2ZW50KTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciBBdXRvbWF0aW9uRXZlbnQgPSByZXF1aXJlKCdhdXRvbWF0aW9uRXZlbnQnKS5BdXRvbWF0aW9uRXZlbnQ7CnZhciBhdXRvbWF0aW9uSW50ZXJuYWwgPQogICAgZ2V0SW50ZXJuYWxBcGkgPwogICAgICAgIGdldEludGVybmFsQXBpKCdhdXRvbWF0aW9uSW50ZXJuYWwnKSA6CiAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdhdXRvbWF0aW9uSW50ZXJuYWwnKS5nZW5lcmF0ZSgpOwp2YXIgZXhjZXB0aW9uSGFuZGxlciA9IHJlcXVpcmUoJ3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyJyk7Cgp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2F1dG9tYXRpb25JbnRlcm5hbCcpOwoKdmFyIElzSW50ZXJhY3RQZXJtaXR0ZWQgPSBuYXRpdmVzLklzSW50ZXJhY3RQZXJtaXR0ZWQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaWQgb2YgdGhlIHJvb3Qgbm9kZS4KICovCnZhciBHZXRSb290SUQgPSBuYXRpdmVzLkdldFJvb3RJRDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQuCiAqLwp2YXIgR2V0RG9jVGl0bGUgPSBuYXRpdmVzLkdldERvY1RpdGxlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHVybCBvZiB0aGUgZG9jdW1lbnQuCiAqLwp2YXIgR2V0RG9jVVJMID0gbmF0aXZlcy5HZXREb2NVUkw7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAqLwp2YXIgR2V0RG9jTG9hZGVkID0gbmF0aXZlcy5HZXREb2NMb2FkZWQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgbG9hZGluZyBwcm9ncmVzcywgZnJvbSAwLjAgdG8gMS4wIChmdWxseSBsb2FkZWQpLgogKi8KdmFyIEdldERvY0xvYWRpbmdQcm9ncmVzcyA9CiAgICBuYXRpdmVzLkdldERvY0xvYWRpbmdQcm9ncmVzczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBJRCBvZiB0aGUgc2VsZWN0aW9uIGFuY2hvciBvYmplY3QuCiAqLwp2YXIgR2V0QW5jaG9yT2JqZWN0SUQgPSBuYXRpdmVzLkdldEFuY2hvck9iamVjdElEOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIHNlbGVjdGlvbiBhbmNob3Igb2Zmc2V0LgogKi8KdmFyIEdldEFuY2hvck9mZnNldCA9IG5hdGl2ZXMuR2V0QW5jaG9yT2Zmc2V0OwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHNlbGVjdGlvbiBhbmNob3IgYWZmaW5pdHkuCiAqLwp2YXIgR2V0QW5jaG9yQWZmaW5pdHkgPSBuYXRpdmVzLkdldEFuY2hvckFmZmluaXR5OwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIElEIG9mIHRoZSBzZWxlY3Rpb24gZm9jdXMgb2JqZWN0LgogKi8KdmFyIEdldEZvY3VzT2JqZWN0SUQgPSBuYXRpdmVzLkdldEZvY3VzT2JqZWN0SUQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgc2VsZWN0aW9uIGZvY3VzIG9mZnNldC4KICovCnZhciBHZXRGb2N1c09mZnNldCA9IG5hdGl2ZXMuR2V0Rm9jdXNPZmZzZXQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgc2VsZWN0aW9uIGZvY3VzIGFmZmluaXR5LgogKi8KdmFyIEdldEZvY3VzQWZmaW5pdHkgPSBuYXRpdmVzLkdldEZvY3VzQWZmaW5pdHk7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBpZCBvZiB0aGUgbm9kZSdzIHBhcmVudCwgb3IgdW5kZWZpbmVkIGlmIGl0J3MgdGhlCiAqICAgIHJvb3Qgb2YgaXRzIHRyZWUgb3IgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0UGFyZW50SUQgPSBuYXRpdmVzLkdldFBhcmVudElEOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBvciB1bmRlZmluZWQgaWYKICogICAgIHRoZSB0cmVlIG9yIG5vZGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldENoaWxkQ291bnQgPSBuYXRpdmVzLkdldENoaWxkQ291bnQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7bnVtYmVyfSBjaGlsZEluZGV4IEFuIGluZGV4IG9mIGEgY2hpbGQgb2YgdGhpcyBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaWQgb2YgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBpbmRleCwgb3IgdW5kZWZpbmVkCiAqICAgICBpZiB0aGUgdHJlZSBvciBub2RlIG9yIGNoaWxkIGF0IHRoYXQgaW5kZXggd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldENoaWxkSURBdEluZGV4ID0gbmF0aXZlcy5HZXRDaGlsZElEQXRJbmRleDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIGlkcyBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIG9yIHVuZGVmaW5lZAogKiAgICAgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Q2hpbGRJZHMgPSBuYXRpdmVzLkdldENoaWxkSURzOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/T2JqZWN0fSBBbiBvYmplY3QgbWFwcGluZyBodG1sIGF0dHJpYnV0ZXMgdG8gdmFsdWVzLgogKi8KdmFyIEdldEh0bWxBdHRyaWJ1dGVzID0gbmF0aXZlcy5HZXRIdG1sQXR0cmlidXRlczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIGluZGV4IG9mIHRoaXMgbm9kZSBpbiBpdHMgcGFyZW50LCBvciB1bmRlZmluZWQgaWYKICogICAgIHRoZSB0cmVlIG9yIG5vZGUgb3Igbm9kZSBwYXJlbnQgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldEluZGV4SW5QYXJlbnQgPSBuYXRpdmVzLkdldEluZGV4SW5QYXJlbnQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9PYmplY3R9IEFuIG9iamVjdCB3aXRoIGEgc3RyaW5nIGtleSBmb3IgZXZlcnkgc3RhdGUgZmxhZyBzZXQsCiAqICAgICBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3Igbm9kZSBvciBub2RlIHBhcmVudCB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0U3RhdGUgPSBuYXRpdmVzLkdldFN0YXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZXN0cmljdGlvbiwgb25lIG9mCiAqICJkaXNhYmxlZCIsICJyZWFkT25seSIgb3IgdW5kZWZpbmVkIGlmIGVuYWJsZWQgb3Igb3RoZXIgb2JqZWN0IG5vdCBkaXNhYmxlZAogKi8KdmFyIEdldFJlc3RyaWN0aW9uID0gbmF0aXZlcy5HZXRSZXN0cmljdGlvbjsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2hlY2tlZCBzdGF0ZSwgYXMgdW5kZWZpbmVkLCAidHJ1ZSIsICJmYWxzZSIgb3IgIm1peGVkIi4KICovCnZhciBHZXRDaGVja2VkID0gbmF0aXZlcy5HZXRDaGVja2VkOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb2xlIG9mIHRoZSBub2RlLCBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3IKICogICAgIG5vZGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldFJvbGUgPSBuYXRpdmVzLkdldFJvbGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9hdXRvbWF0aW9uLlJlY3R9IFRoZSBsb2NhdGlvbiBvZiB0aGUgbm9kZSwgb3IgdW5kZWZpbmVkIGlmCiAqICAgICB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRMb2NhdGlvbiA9IG5hdGl2ZXMuR2V0TG9jYXRpb247CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4IFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRJbmRleCBUaGUgZW5kIGluZGV4IG9mIHRoZSByYW5nZS4KICogQHJldHVybiB7P2F1dG9tYXRpb24uUmVjdH0gVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgc3VicmFuZ2Ugb2YgdGhpcyBub2RlLAogKiAgICAgb3IgdGhlIGxvY2F0aW9uIGlmIHRoZXJlIGFyZSBubyBzdWJyYW5nZXMsIG9yIHVuZGVmaW5lZCBpZgogKiAgICAgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Qm91bmRzRm9yUmFuZ2UgPSBuYXRpdmVzLkdldEJvdW5kc0ZvclJhbmdlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/YXV0b21hdGlvbi5SZWN0fSBUaGUgdW5jbGlwcGVkIGxvY2F0aW9uIG9mIHRoZSBub2RlLCBvcgogKiB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0VW5jbGlwcGVkTG9jYXRpb24gPSBuYXRpdmVzLkdldFVuY2xpcHBlZExvY2F0aW9uOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59IFRoZSB0ZXh0IG9mZnNldCB3aGVyZSBlYWNoIGxpbmUgc3RhcnRzLCBvciBhbiBlbXB0eQogKiAgICAgYXJyYXkgaWYgdGhpcyBub2RlIGhhcyBubyB0ZXh0IGNvbnRlbnQsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSBvciBub2RlCiAqICAgICB3YXMgbm90IGZvdW5kLgogKi8KdmFyIEdldExpbmVTdGFydE9mZnNldHMgPSByZXF1aXJlTmF0aXZlKAogICAgJ2F1dG9tYXRpb25JbnRlcm5hbCcpLkdldExpbmVTdGFydE9mZnNldHM7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGEgc3RyaW5nIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUsCiAqICAgICBub2RlLCBvciBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldFN0cmluZ0F0dHJpYnV0ZSA9IG5hdGl2ZXMuR2V0U3RyaW5nQXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9ib29sZWFufSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Qm9vbEF0dHJpYnV0ZSA9IG5hdGl2ZXMuR2V0Qm9vbEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0SW50QXR0cmlidXRlID0gbmF0aXZlcy5HZXRJbnRBdHRyaWJ1dGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUsCiAqICAgICBub2RlLCBvciBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldEZsb2F0QXR0cmlidXRlID0gbmF0aXZlcy5HZXRGbG9hdEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/QXJyYXkuPG51bWJlcj59IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkCiAqICAgICBpZiB0aGUgdHJlZSwgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRJbnRMaXN0QXR0cmlidXRlID0KICAgIG5hdGl2ZXMuR2V0SW50TGlzdEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gSFRNTCBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRIdG1sQXR0cmlidXRlID0gbmF0aXZlcy5HZXRIdG1sQXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHthdXRvbWF0aW9uLk5hbWVGcm9tVHlwZX0gVGhlIHNvdXJjZSBvZiB0aGUgbm9kZSdzIG5hbWUuCiAqLwp2YXIgR2V0TmFtZUZyb20gPSBuYXRpdmVzLkdldE5hbWVGcm9tOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtib29sZWFufQogKi8KdmFyIEdldEJvbGQgPSBuYXRpdmVzLkdldEJvbGQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqLwp2YXIgR2V0SXRhbGljID0gbmF0aXZlcy5HZXRJdGFsaWM7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqLwp2YXIgR2V0VW5kZXJsaW5lID0gbmF0aXZlcy5HZXRVbmRlcmxpbmU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqLwp2YXIgR2V0TGluZVRocm91Z2ggPSBuYXRpdmVzLkdldExpbmVUaHJvdWdoOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/QXJyYXkuPGF1dG9tYXRpb24uQ3VzdG9tQWN0aW9uPn0gTGlzdCBvZiBjdXN0b20gYWN0aW9ucyBvZiB0aGUKICogICAgIG5vZGUuCiAqLwp2YXIgR2V0Q3VzdG9tQWN0aW9ucyA9IG5hdGl2ZXMuR2V0Q3VzdG9tQWN0aW9uczsKCnZhciBsb2dnaW5nID0gcmVxdWlyZU5hdGl2ZSgnbG9nZ2luZycpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpOwoKLyoqCiAqIEEgc2luZ2xlIG5vZGUgaW4gdGhlIEF1dG9tYXRpb24gdHJlZS4KICogQHBhcmFtIHtBdXRvbWF0aW9uUm9vdE5vZGVJbXBsfSByb290IFRoZSByb290IG9mIHRoZSB0cmVlLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIEF1dG9tYXRpb25Ob2RlSW1wbChyb290KSB7CiAgdGhpcy5yb290SW1wbCA9IHJvb3Q7CiAgdGhpcy5ob3N0Tm9kZV8gPSBudWxsOwogIHRoaXMubGlzdGVuZXJzID0ge19fcHJvdG9fXzogbnVsbH07Cn0KCkF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUgPSB7CiAgX19wcm90b19fOiBudWxsLAogIHRyZWVJRDogLTEsCiAgaWQ6IC0xLAogIGlzUm9vdE5vZGU6IGZhbHNlLAoKICBkZXRhY2g6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb290SW1wbCA9IG51bGw7CiAgICB0aGlzLmhvc3ROb2RlXyA9IG51bGw7CiAgICB0aGlzLmxpc3RlbmVycyA9IHtfX3Byb3RvX186IG51bGx9OwogIH0sCgogIGdldCByb290KCkgewogICAgcmV0dXJuIHRoaXMucm9vdEltcGwgJiYgdGhpcy5yb290SW1wbC53cmFwcGVyOwogIH0sCgogIGdldCBwYXJlbnQoKSB7CiAgICBpZiAoIXRoaXMucm9vdEltcGwpCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5ob3N0Tm9kZV8pCiAgICAgIHJldHVybiB0aGlzLmhvc3ROb2RlXzsKICAgIHZhciBwYXJlbnRJRCA9IEdldFBhcmVudElEKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHJldHVybiB0aGlzLnJvb3RJbXBsLmdldChwYXJlbnRJRCk7CiAgfSwKCiAgZ2V0IGh0bWxBdHRyaWJ1dGVzKCkgewogICAgcmV0dXJuIEdldEh0bWxBdHRyaWJ1dGVzKHRoaXMudHJlZUlELCB0aGlzLmlkKSB8fCB7fTsKICB9LAoKICBnZXQgc3RhdGUoKSB7CiAgICByZXR1cm4gR2V0U3RhdGUodGhpcy50cmVlSUQsIHRoaXMuaWQpIHx8IHt9OwogIH0sCgogIGdldCByb2xlKCkgewogICAgcmV0dXJuIEdldFJvbGUodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCByZXN0cmljdGlvbigpIHsKICAgIHJldHVybiBHZXRSZXN0cmljdGlvbih0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGNoZWNrZWQoKSB7CiAgICByZXR1cm4gR2V0Q2hlY2tlZCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGxvY2F0aW9uKCkgewogICAgcmV0dXJuIEdldExvY2F0aW9uKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBib3VuZHNGb3JSYW5nZTogZnVuY3Rpb24oc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIHJldHVybiBHZXRCb3VuZHNGb3JSYW5nZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogIH0sCgogIGdldCB1bmNsaXBwZWRMb2NhdGlvbigpIHsKICAgIHZhciByZXN1bHQgPSBHZXRVbmNsaXBwZWRMb2NhdGlvbih0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpCiAgICAgIHJlc3VsdCA9IEdldExvY2F0aW9uKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgZ2V0IGluZGV4SW5QYXJlbnQoKSB7CiAgICByZXR1cm4gR2V0SW5kZXhJblBhcmVudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGxpbmVTdGFydE9mZnNldHMoKSB7CiAgICByZXR1cm4gR2V0TGluZVN0YXJ0T2Zmc2V0cyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGNoaWxkVHJlZSgpIHsKICAgIHZhciBjaGlsZFRyZWVJRCA9IEdldEludEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgJ2NoaWxkVHJlZUlkJyk7CiAgICBpZiAoY2hpbGRUcmVlSUQpCiAgICAgIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmdldChjaGlsZFRyZWVJRCk7CiAgfSwKCiAgZ2V0IGZpcnN0Q2hpbGQoKSB7CiAgICBpZiAoIXRoaXMucm9vdEltcGwpCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5jaGlsZFRyZWUpCiAgICAgIHJldHVybiB0aGlzLmNoaWxkVHJlZTsKICAgIGlmICghR2V0Q2hpbGRDb3VudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCkpCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB2YXIgZmlyc3RDaGlsZElEID0gR2V0Q2hpbGRJREF0SW5kZXgodGhpcy50cmVlSUQsIHRoaXMuaWQsIDApOwogICAgcmV0dXJuIHRoaXMucm9vdEltcGwuZ2V0KGZpcnN0Q2hpbGRJRCk7CiAgfSwKCiAgZ2V0IGxhc3RDaGlsZCgpIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIGlmICh0aGlzLmNoaWxkVHJlZSkKICAgICAgcmV0dXJuIHRoaXMuY2hpbGRUcmVlOwogICAgdmFyIGNvdW50ID0gR2V0Q2hpbGRDb3VudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAoIWNvdW50KQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgdmFyIGxhc3RDaGlsZElEID0gR2V0Q2hpbGRJREF0SW5kZXgodGhpcy50cmVlSUQsIHRoaXMuaWQsIGNvdW50IC0gMSk7CiAgICByZXR1cm4gdGhpcy5yb290SW1wbC5nZXQobGFzdENoaWxkSUQpOwogIH0sCgogIGdldCBjaGlsZHJlbigpIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgcmV0dXJuIFtdOwoKICAgIGlmICh0aGlzLmNoaWxkVHJlZSkKICAgICAgcmV0dXJuIFt0aGlzLmNoaWxkVHJlZV07CgogICAgdmFyIGNoaWxkcmVuID0gW107CiAgICB2YXIgY2hpbGRJZHMgPSBHZXRDaGlsZElkcyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkSWRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBjaGlsZElEID0gY2hpbGRJZHNbaV07CiAgICAgIHZhciBjaGlsZCA9IHRoaXMucm9vdEltcGwuZ2V0KGNoaWxkSUQpOwogICAgICAkQXJyYXkucHVzaChjaGlsZHJlbiwgY2hpbGQpOwogICAgfQogICAgcmV0dXJuIGNoaWxkcmVuOwogIH0sCgogIGdldCBwcmV2aW91c1NpYmxpbmcoKSB7CiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICBpZiAoIXBhcmVudCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIHBhcmVudCA9IHByaXZhdGVzKHBhcmVudCkuaW1wbDsKICAgIHZhciBpbmRleEluUGFyZW50ID0gR2V0SW5kZXhJblBhcmVudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICByZXR1cm4gdGhpcy5yb290SW1wbC5nZXQoCiAgICAgICAgR2V0Q2hpbGRJREF0SW5kZXgocGFyZW50LnRyZWVJRCwgcGFyZW50LmlkLCBpbmRleEluUGFyZW50IC0gMSkpOwogIH0sCgogIGdldCBuZXh0U2libGluZygpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgIGlmICghcGFyZW50KQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgcGFyZW50ID0gcHJpdmF0ZXMocGFyZW50KS5pbXBsOwogICAgdmFyIGluZGV4SW5QYXJlbnQgPSBHZXRJbmRleEluUGFyZW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHJldHVybiB0aGlzLnJvb3RJbXBsLmdldCgKICAgICAgICBHZXRDaGlsZElEQXRJbmRleChwYXJlbnQudHJlZUlELCBwYXJlbnQuaWQsIGluZGV4SW5QYXJlbnQgKyAxKSk7CiAgfSwKCiAgZ2V0IG5hbWVGcm9tKCkgewogICAgcmV0dXJuIEdldE5hbWVGcm9tKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgYm9sZCgpIHsKICAgIHJldHVybiBHZXRCb2xkKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgaXRhbGljKCkgewogICAgcmV0dXJuIEdldEl0YWxpYyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IHVuZGVybGluZSgpIHsKICAgIHJldHVybiBHZXRVbmRlcmxpbmUodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBsaW5lVGhyb3VnaCgpIHsKICAgIHJldHVybiBHZXRMaW5lVGhyb3VnaCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGN1c3RvbUFjdGlvbnMoKSB7CiAgICByZXR1cm4gR2V0Q3VzdG9tQWN0aW9ucyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZG9EZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2RvRGVmYXVsdCcpOwogIH0sCgogIGZvY3VzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2ZvY3VzJyk7CiAgfSwKCiAgZ2V0SW1hZ2VEYXRhOiBmdW5jdGlvbihtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdnZXRJbWFnZURhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICB7IG1heFdpZHRoOiBtYXhXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heEhlaWdodCB9KTsKICB9LAoKICBoaXRUZXN0OiBmdW5jdGlvbih4LCB5LCBldmVudFRvRmlyZSkgewogICAgdGhpcy5oaXRUZXN0SW50ZXJuYWwoeCwgeSwgZXZlbnRUb0ZpcmUpOwogIH0sCgogIGhpdFRlc3RXaXRoUmVwbHk6IGZ1bmN0aW9uKHgsIHksIG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5oaXRUZXN0SW50ZXJuYWwoeCwgeSwgJ2hpdFRlc3RSZXN1bHQnLCBvcHRfY2FsbGJhY2spOwogIH0sCgogIGhpdFRlc3RJbnRlcm5hbDogZnVuY3Rpb24oeCwgeSwgZXZlbnRUb0ZpcmUsIG9wdF9jYWxsYmFjaykgewogICAgLy8gQ29udmVydCBmcm9tIGdsb2JhbCB0byB0cmVlLXJlbGF0aXZlIGNvb3JkaW5hdGVzLgogICAgdmFyIGxvY2F0aW9uID0gR2V0TG9jYXRpb24odGhpcy50cmVlSUQsIEdldFJvb3RJRCh0aGlzLnRyZWVJRCkpOwogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnaGl0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHsgeDogTWF0aC5mbG9vcih4IC0gbG9jYXRpb24ubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgeTogTWF0aC5mbG9vcih5IC0gbG9jYXRpb24udG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRvRmlyZTogZXZlbnRUb0ZpcmUgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBtYWtlVmlzaWJsZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdtYWtlVmlzaWJsZScpOwogIH0sCgogIHBlcmZvcm1DdXN0b21BY3Rpb246IGZ1bmN0aW9uKGN1c3RvbUFjdGlvbklkKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdjdXN0b21BY3Rpb24nLCB7IGN1c3RvbUFjdGlvbklEOiBjdXN0b21BY3Rpb25JZCB9KTsKICB9LAoKICByZXN1bWVNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdyZXN1bWVNZWRpYScpOwogIH0sCgogIHNjcm9sbEJhY2t3YXJkOiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbEJhY2t3YXJkJywge30sIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgc2Nyb2xsRm9yd2FyZDogZnVuY3Rpb24ob3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxGb3J3YXJkJywge30sIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgc2Nyb2xsVXA6IGZ1bmN0aW9uKG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2Nyb2xsVXAnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxEb3duOiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbERvd24nLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxMZWZ0OiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbExlZnQnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxSaWdodDogZnVuY3Rpb24ob3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxSaWdodCcsIHt9LCBvcHRfY2FsbGJhY2spOwogIH0sCgogIHNldFNlbGVjdGlvbjogZnVuY3Rpb24oc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIGlmICh0aGlzLnN0YXRlLmVkaXRhYmxlKSB7CiAgICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3NldFNlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmb2N1c05vZGVJRDogdGhpcy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck9mZnNldDogc3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzT2Zmc2V0OiBlbmRJbmRleCB9KTsKICAgIH0KICB9LAoKICBzZXRTZXF1ZW50aWFsRm9jdXNOYXZpZ2F0aW9uU3RhcnRpbmdQb2ludDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzZXRTZXF1ZW50aWFsRm9jdXNOYXZpZ2F0aW9uU3RhcnRpbmdQb2ludCcpOwogIH0sCgogIHNob3dDb250ZXh0TWVudTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzaG93Q29udGV4dE1lbnUnKTsKICB9LAoKICBzdGFydER1Y2tpbmdNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzdGFydER1Y2tpbmdNZWRpYScpOwogIH0sCgogIHN0b3BEdWNraW5nTWVkaWE6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc3RvcER1Y2tpbmdNZWRpYScpOwogIH0sCgogIHN1c3BlbmRNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzdXNwZW5kTWVkaWEnKTsKICB9LAoKICBkb21RdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgY2FsbGJhY2spIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgY2FsbGJhY2soKTsKICAgIGF1dG9tYXRpb25JbnRlcm5hbC5xdWVyeVNlbGVjdG9yKAogICAgICB7IHRyZWVJRDogdGhpcy5yb290SW1wbC50cmVlSUQsCiAgICAgICAgYXV0b21hdGlvbk5vZGVJRDogdGhpcy5pZCwKICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IgfSwKICAgICAgJEZ1bmN0aW9uLmJpbmQodGhpcy5kb21RdWVyeVNlbGVjdG9yQ2FsbGJhY2tfLCB0aGlzLCBjYWxsYmFjaykpOwogIH0sCgogIGZpbmQ6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgcmV0dXJuIHRoaXMuZmluZEludGVybmFsXyhwYXJhbXMpOwogIH0sCgogIGZpbmRBbGw6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgcmV0dXJuIHRoaXMuZmluZEludGVybmFsXyhwYXJhbXMsIFtdKTsKICB9LAoKICBtYXRjaGVzOiBmdW5jdGlvbihwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLm1hdGNoSW50ZXJuYWxfKHBhcmFtcyk7CiAgfSwKCiAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oZXZlbnRUeXBlLCBjYWxsYmFjaywgY2FwdHVyZSkgewogICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2spOwogICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tldmVudFR5cGVdKQogICAgICB0aGlzLmxpc3RlbmVyc1tldmVudFR5cGVdID0gW107CiAgICAkQXJyYXkucHVzaCh0aGlzLmxpc3RlbmVyc1tldmVudFR5cGVdLCB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLAogICAgICBjYXB0dXJlOiAhIWNhcHR1cmUsCiAgICB9KTsKICB9LAoKICAvLyBUT0RPKGR0c2VuZy9hYm94aGFsbCk6IENoZWNrIHRoaXMgaW1wbCBhZ2FpbnN0IHNwZWMuCiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oZXZlbnRUeXBlLCBjYWxsYmFjaykgewogICAgaWYgKHRoaXMubGlzdGVuZXJzW2V2ZW50VHlwZV0pIHsKICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW2V2ZW50VHlwZV07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGNhbGxiYWNrID09PSBsaXN0ZW5lcnNbaV0uY2FsbGJhY2spCiAgICAgICAgICAkQXJyYXkuc3BsaWNlKGxpc3RlbmVycywgaSwgMSk7CiAgICAgIH0KICAgIH0KICB9LAoKICB0b0pTT046IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsgdHJlZUlEOiB0aGlzLnRyZWVJRCwKICAgICAgICAgICAgIGlkOiB0aGlzLmlkLAogICAgICAgICAgICAgcm9sZTogdGhpcy5yb2xlLAogICAgICAgICAgICAgYXR0cmlidXRlczogdGhpcy5hdHRyaWJ1dGVzIH07CiAgfSwKCiAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24oZXZlbnRUeXBlLCBldmVudEZyb20sIG1vdXNlWCwgbW91c2VZKSB7CiAgICB2YXIgcGF0aCA9IFtdOwogICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgd2hpbGUgKHBhcmVudCkgewogICAgICAkQXJyYXkucHVzaChwYXRoLCBwYXJlbnQpOwogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgfQogICAgdmFyIGV2ZW50ID0gbmV3IEF1dG9tYXRpb25FdmVudChldmVudFR5cGUsIHRoaXMud3JhcHBlciwgZXZlbnRGcm9tKTsKICAgIGV2ZW50Lm1vdXNlWCA9IG1vdXNlWDsKICAgIGV2ZW50Lm1vdXNlWSA9IG1vdXNlWTsKCiAgICAvLyBEaXNwYXRjaCB0aGUgZXZlbnQgdGhyb3VnaCB0aGUgcHJvcGFnYXRpb24gcGF0aCBpbiB0aHJlZSBwaGFzZXM6CiAgICAvLyAtIGNhcHR1cmluZzogc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBhbmQgZ29pbmcgZG93biB0byB0aGUgdGFyZ2V0J3MgcGFyZW50CiAgICAvLyAtIHRhcmdldGluZzogZGlzcGF0Y2hpbmcgdGhlIGV2ZW50IG9uIHRoZSB0YXJnZXQgaXRzZWxmCiAgICAvLyAtIGJ1YmJsaW5nOiBzdGFydGluZyBmcm9tIHRoZSB0YXJnZXQncyBwYXJlbnQsIGdvaW5nIGJhY2sgdXAgdG8gdGhlIHJvb3QuCiAgICAvLyBBdCBhbnkgc3RhZ2UsIGEgbGlzdGVuZXIgbWF5IGNhbGwgc3RvcFByb3BhZ2F0aW9uKCkgb24gdGhlIGV2ZW50LCB3aGljaAogICAgLy8gd2lsbCBpbW1lZGlhdGVseSBzdG9wIGV2ZW50IHByb3BhZ2F0aW9uIHRocm91Z2ggdGhpcyBwYXRoLgogICAgaWYgKHRoaXMuZGlzcGF0Y2hFdmVudEF0Q2FwdHVyaW5nXyhldmVudCwgcGF0aCkpIHsKICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hFdmVudEF0VGFyZ2V0aW5nXyhldmVudCwgcGF0aCkpCiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50QXRCdWJibGluZ18oZXZlbnQsIHBhdGgpOwogICAgfQogIH0sCgogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJlbnRJRCA9IEdldFBhcmVudElEKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHZhciBjaGlsZFRyZWVJRCA9IEdldEludEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgJ2NoaWxkVHJlZUlkJyk7CiAgICB2YXIgY291bnQgPSBHZXRDaGlsZENvdW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHZhciBjaGlsZElEcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHZhciBjaGlsZElEID0gR2V0Q2hpbGRJREF0SW5kZXgodGhpcy50cmVlSUQsIHRoaXMuaWQsIGkpOwogICAgICAkQXJyYXkucHVzaChjaGlsZElEcywgY2hpbGRJRCk7CiAgICB9CgogICAgdmFyIHJlc3VsdCA9ICdub2RlIGlkPScgKyB0aGlzLmlkICsKICAgICAgICAnIHJvbGU9JyArIHRoaXMucm9sZSArCiAgICAgICAgJyBzdGF0ZT0nICsgJEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdGUpICsKICAgICAgICAnIHBhcmVudElEPScgKyBwYXJlbnRJRCArCiAgICAgICAgJyBjaGlsZElkcz0nICsgJEpTT04uc3RyaW5naWZ5KGNoaWxkSURzKTsKICAgIGlmICh0aGlzLmhvc3ROb2RlXykgewogICAgICB2YXIgaG9zdE5vZGVJbXBsID0gcHJpdmF0ZXModGhpcy5ob3N0Tm9kZV8pLmltcGw7CiAgICAgIHJlc3VsdCArPSAnIGhvc3QgdHJlZUlEPScgKyBob3N0Tm9kZUltcGwudHJlZUlEICsKICAgICAgICAgICcgaG9zdCBub2RlSUQ9JyArIGhvc3ROb2RlSW1wbC5pZDsKICAgIH0KICAgIGlmIChjaGlsZFRyZWVJRCkKICAgICAgcmVzdWx0ICs9ICcgY2hpbGRUcmVlSUQ9JyArIGNoaWxkVHJlZUlEOwogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBkaXNwYXRjaEV2ZW50QXRDYXB0dXJpbmdfOiBmdW5jdGlvbihldmVudCwgcGF0aCkgewogICAgcHJpdmF0ZXMoZXZlbnQpLmltcGwuZXZlbnRQaGFzZSA9IEV2ZW50LkNBUFRVUklOR19QSEFTRTsKICAgIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHRoaXMuZmlyZUV2ZW50TGlzdGVuZXJzXyhwYXRoW2ldLCBldmVudCk7CiAgICAgIGlmIChwcml2YXRlcyhldmVudCkuaW1wbC5wcm9wYWdhdGlvblN0b3BwZWQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgZGlzcGF0Y2hFdmVudEF0VGFyZ2V0aW5nXzogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHByaXZhdGVzKGV2ZW50KS5pbXBsLmV2ZW50UGhhc2UgPSBFdmVudC5BVF9UQVJHRVQ7CiAgICB0aGlzLmZpcmVFdmVudExpc3RlbmVyc18odGhpcy53cmFwcGVyLCBldmVudCk7CiAgICByZXR1cm4gIXByaXZhdGVzKGV2ZW50KS5pbXBsLnByb3BhZ2F0aW9uU3RvcHBlZDsKICB9LAoKICBkaXNwYXRjaEV2ZW50QXRCdWJibGluZ186IGZ1bmN0aW9uKGV2ZW50LCBwYXRoKSB7CiAgICBwcml2YXRlcyhldmVudCkuaW1wbC5ldmVudFBoYXNlID0gRXZlbnQuQlVCQkxJTkdfUEhBU0U7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgdGhpcy5maXJlRXZlbnRMaXN0ZW5lcnNfKHBhdGhbaV0sIGV2ZW50KTsKICAgICAgaWYgKHByaXZhdGVzKGV2ZW50KS5pbXBsLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBmaXJlRXZlbnRMaXN0ZW5lcnNfOiBmdW5jdGlvbihub2RlLCBldmVudCkgewogICAgdmFyIG5vZGVJbXBsID0gcHJpdmF0ZXMobm9kZSkuaW1wbDsKICAgIGlmICghbm9kZUltcGwucm9vdEltcGwpCiAgICAgIHJldHVybjsKCiAgICB2YXIgbGlzdGVuZXJzID0gbm9kZUltcGwubGlzdGVuZXJzW2V2ZW50LnR5cGVdOwogICAgaWYgKCFsaXN0ZW5lcnMpCiAgICAgIHJldHVybjsKICAgIHZhciBldmVudFBoYXNlID0gZXZlbnQuZXZlbnRQaGFzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChldmVudFBoYXNlID09IEV2ZW50LkNBUFRVUklOR19QSEFTRSAmJiAhbGlzdGVuZXJzW2ldLmNhcHR1cmUpCiAgICAgICAgY29udGludWU7CiAgICAgIGlmIChldmVudFBoYXNlID09IEV2ZW50LkJVQkJMSU5HX1BIQVNFICYmIGxpc3RlbmVyc1tpXS5jYXB0dXJlKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdHJ5IHsKICAgICAgICBsaXN0ZW5lcnNbaV0uY2FsbGJhY2soZXZlbnQpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgZXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoJ0Vycm9yIGluIGV2ZW50IGhhbmRsZXIgZm9yICcgKyBldmVudC50eXBlICsKICAgICAgICAgICAgJyBkdXJpbmcgcGhhc2UgJyArIGV2ZW50UGhhc2UsIGUpOwogICAgICB9CiAgICB9CiAgfSwKCiAgcGVyZm9ybUFjdGlvbl86IGZ1bmN0aW9uKGFjdGlvblR5cGUsIG9wdF9hcmdzLCBvcHRfY2FsbGJhY2spIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgcmV0dXJuOwoKICAgIC8vIE5vdCB5ZXQgaW5pdGlhbGl6ZWQuCiAgICBpZiAodGhpcy5yb290SW1wbC50cmVlSUQgPT09IHVuZGVmaW5lZCB8fAogICAgICAgIHRoaXMuaWQgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gQ2hlY2sgcGVybWlzc2lvbnMuCiAgICBpZiAoIUlzSW50ZXJhY3RQZXJtaXR0ZWQoKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYWN0aW9uVHlwZSArICcgcmVxdWlyZXMgeyJkZXNrdG9wIjogdHJ1ZX0gb3InICsKICAgICAgICAgICcgeyJpbnRlcmFjdCI6IHRydWV9IGluIHRoZSAiYXV0b21hdGlvbiIgbWFuaWZlc3Qga2V5LicpOwogICAgfQogICAgdmFyIHJlcXVlc3RJRCA9IC0xOwogICAgaWYgKG9wdF9jYWxsYmFjaykgewogICAgICByZXF1ZXN0SUQgPSB0aGlzLnJvb3RJbXBsLmFkZEFjdGlvblJlc3VsdENhbGxiYWNrKG9wdF9jYWxsYmFjayk7CiAgICB9CgogICAgYXV0b21hdGlvbkludGVybmFsLnBlcmZvcm1BY3Rpb24oeyB0cmVlSUQ6IHRoaXMucm9vdEltcGwudHJlZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aW9uTm9kZUlEOiB0aGlzLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBhY3Rpb25UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SUQ6IHJlcXVlc3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXJncyB8fCB7fSk7CiAgfSwKCiAgZG9tUXVlcnlTZWxlY3RvckNhbGxiYWNrXzogZnVuY3Rpb24odXNlckNhbGxiYWNrLCByZXN1bHRBdXRvbWF0aW9uTm9kZUlEKSB7CiAgICAvLyByZXN1bHRBdXRvbWF0aW9uTm9kZUlEIGNvdWxkIGJlIHplcm8gb3IgdW5kZWZpbmVkIG9yICh1bmxpa2VseSkgbnVsbDsKICAgIC8vIHRoZXkgYWxsIGFtb3VudCB0byB0aGUgc2FtZSB0aGluZyBoZXJlLCB3aGljaCBpcyB0aGF0IG5vIG5vZGUgd2FzCiAgICAvLyByZXR1cm5lZC4KICAgIGlmICghcmVzdWx0QXV0b21hdGlvbk5vZGVJRCB8fCAhdGhpcy5yb290SW1wbCkgewogICAgICB1c2VyQ2FsbGJhY2sobnVsbCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciByZXN1bHROb2RlID0gdGhpcy5yb290SW1wbC5nZXQocmVzdWx0QXV0b21hdGlvbk5vZGVJRCk7CiAgICBpZiAoIXJlc3VsdE5vZGUpIHsKICAgICAgbG9nZ2luZy5XQVJOSU5HKCdRdWVyeSBzZWxlY3RvciByZXN1bHQgbm90IGluIHRyZWU6ICcgKwogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXV0b21hdGlvbk5vZGVJRCk7CiAgICAgIHVzZXJDYWxsYmFjayhudWxsKTsKICAgIH0KICAgIHVzZXJDYWxsYmFjayhyZXN1bHROb2RlKTsKICB9LAoKICBmaW5kSW50ZXJuYWxfOiBmdW5jdGlvbihwYXJhbXMsIG9wdF9yZXN1bHRzKSB7CiAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgIHRoaXMuZm9yQWxsRGVzY2VuZGFudHNfKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgaWYgKHByaXZhdGVzKG5vZGUpLmltcGwubWF0Y2hJbnRlcm5hbF8ocGFyYW1zKSkgewogICAgICAgIGlmIChvcHRfcmVzdWx0cykKICAgICAgICAgICRBcnJheS5wdXNoKG9wdF9yZXN1bHRzLCBub2RlKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXN1bHQgPSBub2RlOwogICAgICAgIHJldHVybiAhb3B0X3Jlc3VsdHM7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKG9wdF9yZXN1bHRzKQogICAgICByZXR1cm4gb3B0X3Jlc3VsdHM7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIC8qKgogICAqIEV4ZWN1dGVzIGEgY2xvc3VyZSBmb3IgYWxsIG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzLCBpbiBwcmUtb3JkZXIuCiAgICogRWFybHktb3V0cyBpZiB0aGUgY2xvc3VyZSByZXR1cm5zIHRydWUuCiAgICogQHBhcmFtIHtGdW5jdGlvbihBdXRvbWF0aW9uTm9kZSk6Ym9vbGVhbn0gY2xvc3VyZSBDbG9zdXJlIHRvIGJlIGV4ZWN1dGVkCiAgICogICAgIGZvciBlYWNoIG5vZGUuIFJldHVybiB0cnVlIHRvIGVhcmx5LW91dCB0aGUgdHJhdmVyc2FsLgogICAqLwogIGZvckFsbERlc2NlbmRhbnRzXzogZnVuY3Rpb24oY2xvc3VyZSkgewogICAgdmFyIHN0YWNrID0gJEFycmF5LnJldmVyc2UodGhpcy53cmFwcGVyLmNoaWxkcmVuKTsKICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBub2RlID0gJEFycmF5LnBvcChzdGFjayk7CiAgICAgIGlmIChjbG9zdXJlKG5vZGUpKQogICAgICAgIHJldHVybjsKCiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgIGZvciAodmFyIGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICAkQXJyYXkucHVzaChzdGFjaywgY2hpbGRyZW5baV0pOwogICAgfQogIH0sCgogIG1hdGNoSW50ZXJuYWxfOiBmdW5jdGlvbihwYXJhbXMpIHsKICAgIGlmICgkT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBpZiAoJ3JvbGUnIGluIHBhcmFtcyAmJiB0aGlzLnJvbGUgIT0gcGFyYW1zLnJvbGUpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGlmICgnc3RhdGUnIGluIHBhcmFtcykgewogICAgICBmb3IgKHZhciBzdGF0ZSBpbiBwYXJhbXMuc3RhdGUpIHsKICAgICAgICBpZiAocGFyYW1zLnN0YXRlW3N0YXRlXSAhPSAoc3RhdGUgaW4gdGhpcy5zdGF0ZSkpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmICgnYXR0cmlidXRlcycgaW4gcGFyYW1zKSB7CiAgICAgIGZvciAodmFyIGF0dHJpYnV0ZSBpbiBwYXJhbXMuYXR0cmlidXRlcykgewogICAgICAgIHZhciBhdHRyVmFsdWUgPSBwYXJhbXMuYXR0cmlidXRlc1thdHRyaWJ1dGVdOwogICAgICAgIGlmICh0eXBlb2YgYXR0clZhbHVlICE9ICdvYmplY3QnKSB7CiAgICAgICAgICBpZiAodGhpc1thdHRyaWJ1dGVdICE9PSBhdHRyVmFsdWUpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKGF0dHJWYWx1ZSBpbnN0YW5jZW9mICRSZWdFeHAuc2VsZikgewogICAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2F0dHJpYnV0ZV0gIT0gJ3N0cmluZycpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIGlmICghYXR0clZhbHVlLnRlc3QodGhpc1thdHRyaWJ1dGVdKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUT0RPKGFib3hoYWxsKTogaGFuZGxlIGludGxpc3QgY2FzZS4KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfTsKCnZhciBzdHJpbmdBdHRyaWJ1dGVzID0gWwogICAgJ2FjY2Vzc0tleScsCiAgICAnYXJpYUludmFsaWRWYWx1ZScsCiAgICAnYXV0b0NvbXBsZXRlJywKICAgICdjbGFzc05hbWUnLAogICAgJ2NvbnRhaW5lckxpdmVSZWxldmFudCcsCiAgICAnY29udGFpbmVyTGl2ZVN0YXR1cycsCiAgICAnZGVzY3JpcHRpb24nLAogICAgJ2Rpc3BsYXknLAogICAgJ2h0bWxUYWcnLAogICAgJ2ltYWdlRGF0YVVybCcsCiAgICAnbGFuZ3VhZ2UnLAogICAgJ2xpdmVSZWxldmFudCcsCiAgICAnbGl2ZVN0YXR1cycsCiAgICAnbmFtZScsCiAgICAncGxhY2Vob2xkZXInLAogICAgJ3JvbGVEZXNjcmlwdGlvbicsCiAgICAndGV4dElucHV0VHlwZScsCiAgICAndXJsJywKICAgICd2YWx1ZSddOwoKdmFyIGJvb2xBdHRyaWJ1dGVzID0gWwogICAgJ2J1c3knLAogICAgJ2NsaWNrYWJsZScsCiAgICAnY29udGFpbmVyTGl2ZUF0b21pYycsCiAgICAnY29udGFpbmVyTGl2ZUJ1c3knLAogICAgJ2xpdmVBdG9taWMnLAogICAgJ3Njcm9sbGFibGUnCl07Cgp2YXIgaW50QXR0cmlidXRlcyA9IFsKICAgICdiYWNrZ3JvdW5kQ29sb3InLAogICAgJ2NvbG9yJywKICAgICdjb2xvclZhbHVlJywKICAgICdoaWVyYXJjaGljYWxMZXZlbCcsCiAgICAncG9zSW5TZXQnLAogICAgJ3Njcm9sbFgnLAogICAgJ3Njcm9sbFhNYXgnLAogICAgJ3Njcm9sbFhNaW4nLAogICAgJ3Njcm9sbFknLAogICAgJ3Njcm9sbFlNYXgnLAogICAgJ3Njcm9sbFlNaW4nLAogICAgJ3NldFNpemUnLAogICAgJ3RhYmxlQ2VsbENvbHVtbkluZGV4JywKICAgICdhcmlhQ2VsbENvbHVtbkluZGV4JywKICAgICd0YWJsZUNlbGxDb2x1bW5TcGFuJywKICAgICd0YWJsZUNlbGxSb3dJbmRleCcsCiAgICAnYXJpYUNlbGxSb3dJbmRleCcsCiAgICAndGFibGVDZWxsUm93U3BhbicsCiAgICAndGFibGVDb2x1bW5Db3VudCcsCiAgICAnYXJpYUNvbHVtbkNvdW50JywKICAgICd0YWJsZUNvbHVtbkluZGV4JywKICAgICd0YWJsZVJvd0NvdW50JywKICAgICdhcmlhUm93Q291bnQnLAogICAgJ3RhYmxlUm93SW5kZXgnLAogICAgJ3RleHRTZWxFbmQnLAogICAgJ3RleHRTZWxTdGFydCddOwoKdmFyIG5vZGVSZWZBdHRyaWJ1dGVzID0gWwogICAgWydhY3RpdmVkZXNjZW5kYW50SWQnLCAnYWN0aXZlRGVzY2VuZGFudCddLAogICAgWydpblBhZ2VMaW5rVGFyZ2V0SWQnLCAnaW5QYWdlTGlua1RhcmdldCddLAogICAgWyduZXh0Rm9jdXNJZCcsICduZXh0Rm9jdXMnXSwKICAgIFsnbmV4dE9uTGluZUlkJywgJ25leHRPbkxpbmUnXSwKICAgIFsncHJldmlvdXNGb2N1c0lkJywgJ3ByZXZpb3VzRm9jdXMnXSwKICAgIFsncHJldmlvdXNPbkxpbmVJZCcsICdwcmV2aW91c09uTGluZSddLAogICAgWyd0YWJsZUNvbHVtbkhlYWRlcklkJywgJ3RhYmxlQ29sdW1uSGVhZGVyJ10sCiAgICBbJ3RhYmxlSGVhZGVySWQnLCAndGFibGVIZWFkZXInXSwKICAgIFsndGFibGVSb3dIZWFkZXJJZCcsICd0YWJsZVJvd0hlYWRlciddXTsKCnZhciBpbnRMaXN0QXR0cmlidXRlcyA9IFsKICAgICdsaW5lQnJlYWtzJywKICAgICdtYXJrZXJFbmRzJywKICAgICdtYXJrZXJTdGFydHMnLAogICAgJ21hcmtlclR5cGVzJywKICAgICd3b3JkRW5kcycsCiAgICAnd29yZFN0YXJ0cyddOwoKdmFyIG5vZGVSZWZMaXN0QXR0cmlidXRlcyA9IFsKICAgIFsnY29udHJvbHNJZHMnLCAnY29udHJvbHMnXSwKICAgIFsnZGVzY3JpYmVkYnlJZHMnLCAnZGVzY3JpYmVkQnknXSwKICAgIFsnZmxvd3RvSWRzJywgJ2Zsb3dUbyddLAogICAgWydsYWJlbGxlZGJ5SWRzJywgJ2xhYmVsbGVkQnknXV07Cgp2YXIgZmxvYXRBdHRyaWJ1dGVzID0gWwogICAgJ3ZhbHVlRm9yUmFuZ2UnLAogICAgJ21pblZhbHVlRm9yUmFuZ2UnLAogICAgJ21heFZhbHVlRm9yUmFuZ2UnXTsKCnZhciBodG1sQXR0cmlidXRlcyA9IFsKICAgIFsndHlwZScsICdpbnB1dFR5cGUnXV07Cgp2YXIgcHVibGljQXR0cmlidXRlcyA9IFtdOwoKJEFycmF5LmZvckVhY2goc3RyaW5nQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cmlidXRlTmFtZSkgewogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgYXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldFN0cmluZ0F0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2goYm9vbEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRCb29sQXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChpbnRBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0SW50QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChub2RlUmVmQXR0cmlidXRlcywgZnVuY3Rpb24ocGFyYW1zKSB7CiAgdmFyIHNyY0F0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMF07CiAgdmFyIGRzdEF0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMV07CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgZHN0QXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBkc3RBdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaWQgPSBHZXRJbnRBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIHNyY0F0dHJpYnV0ZU5hbWUpOwogICAgICBpZiAoaWQgJiYgdGhpcy5yb290SW1wbCkKICAgICAgICByZXR1cm4gdGhpcy5yb290SW1wbC5nZXQoaWQpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChpbnRMaXN0QXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cmlidXRlTmFtZSkgewogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgYXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldEludExpc3RBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIGF0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCiRBcnJheS5mb3JFYWNoKG5vZGVSZWZMaXN0QXR0cmlidXRlcywgZnVuY3Rpb24ocGFyYW1zKSB7CiAgdmFyIHNyY0F0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMF07CiAgdmFyIGRzdEF0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMV07CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgZHN0QXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBkc3RBdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaWRzID0gR2V0SW50TGlzdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgc3JjQXR0cmlidXRlTmFtZSk7CiAgICAgIGlmICghaWRzIHx8ICF0aGlzLnJvb3RJbXBsKQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdEltcGwuZ2V0KGlkc1tpXSk7CiAgICAgICAgaWYgKG5vZGUpCiAgICAgICAgICAkQXJyYXkucHVzaChyZXN1bHQsIG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2goZmxvYXRBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0RmxvYXRBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIGF0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCiRBcnJheS5mb3JFYWNoKGh0bWxBdHRyaWJ1dGVzLCBmdW5jdGlvbihwYXJhbXMpIHsKICB2YXIgc3JjQXR0cmlidXRlTmFtZSA9IHBhcmFtc1swXTsKICB2YXIgZHN0QXR0cmlidXRlTmFtZSA9IHBhcmFtc1sxXTsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBkc3RBdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGRzdEF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRIdG1sQXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBzcmNBdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgovKioKICogQXV0b21hdGlvblJvb3ROb2RlLgogKgogKiBBbiBBdXRvbWF0aW9uUm9vdE5vZGUgaXMgdGhlIGphdmFzY3JpcHQgZW5kIG9mIGFuIEFYVHJlZSBsaXZpbmcgaW4gdGhlCiAqIGJyb3dzZXIuIEF1dG9tYXRpb25Sb290Tm9kZSBoYW5kbGVzIHVuc2VyaWFsaXppbmcgaW5jcmVtZW50YWwgdXBkYXRlcyBmcm9tCiAqIHRoZSBzb3VyY2UgQVhUcmVlLiBFYWNoIHVwZGF0ZSBjb250YWlucyBub2RlIGRhdGEgdGhhdCBmb3JtIGEgY29tcGxldGUgdHJlZQogKiBhZnRlciBhcHBseWluZyB0aGUgdXBkYXRlLgogKgogKiBBIGJyaWVmIG5vdGUgYWJvdXQgaWRzIHVzZWQgdGhyb3VnaCB0aGlzIGNsYXNzLiBUaGUgc291cmNlIEFYVHJlZSBhc3NpZ25zCiAqIHVuaXF1ZSBpZHMgcGVyIG5vZGUgYW5kIHdlIHVzZSB0aGVzZSBpZHMgdG8gYnVpbGQgYSBoYXNoIHRvIHRoZSBhY3R1YWwKICogQXV0b21hdGlvbk5vZGUgb2JqZWN0LgogKiBUaHVzLCB0cmVlIHRyYXZlcnNhbHMgYW1vdW50IHRvIGEgbG9va3VwIGluIG91ciBoYXNoLgogKgogKiBUaGUgdHJlZSBpdHNlbGYgaXMgaWRlbnRpZmllZCBieSB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlIGlkIG9mIHRoZQogKiByZW5kZXJlciB3aWRnZXQgaG9zdC4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsKHRyZWVJRCkgewogICRGdW5jdGlvbi5jYWxsKEF1dG9tYXRpb25Ob2RlSW1wbCwgdGhpcywgdGhpcyk7CiAgdGhpcy50cmVlSUQgPSB0cmVlSUQ7CiAgdGhpcy5heE5vZGVEYXRhQ2FjaGVfID0ge19fcHJvdG9fXzogbnVsbH07CiAgdGhpcy5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrXyA9IHtfX3Byb3RvX186IG51bGx9Owp9Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnaWRUb0F1dG9tYXRpb25Sb290Tm9kZV8nLAogICAge19fcHJvdG9fXzogbnVsbH0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlSW1wbCwgJ2dldCcsIGZ1bmN0aW9uKHRyZWVJRCkgewogIHZhciByZXN1bHQgPSBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF07CiAgcmV0dXJuIHJlc3VsdCB8fCB1bmRlZmluZWQ7Cn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlSW1wbCwgJ2dldE9yQ3JlYXRlJywgZnVuY3Rpb24odHJlZUlEKSB7CiAgaWYgKEF1dG9tYXRpb25Sb290Tm9kZUltcGwuaWRUb0F1dG9tYXRpb25Sb290Tm9kZV9bdHJlZUlEXSkKICAgIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF07CiAgdmFyIHJlc3VsdCA9IG5ldyBBdXRvbWF0aW9uUm9vdE5vZGUodHJlZUlEKTsKICBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF0gPSByZXN1bHQ7CiAgcmV0dXJuIHJlc3VsdDsKfSk7Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnZGVzdHJveScsIGZ1bmN0aW9uKHRyZWVJRCkgewogIGRlbGV0ZSBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF07Cn0pOwoKQXV0b21hdGlvblJvb3ROb2RlSW1wbC5wcm90b3R5cGUgPSB7CiAgX19wcm90b19fOiBBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLAoKICAvKioKICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgKi8KICBpc1Jvb3ROb2RlOiB0cnVlLAoKICAvKioKICAgKiBAdHlwZSB7bnVtYmVyfQogICAqLwogIHRyZWVJRDogLTEsCgogIC8qKgogICAqIFRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGZyb20gYSBkaWZmZXJlbnQgdHJlZS4KICAgKiBAdHlwZSB7P0F1dG9tYXRpb25Ob2RlfQogICAqIEBwcml2YXRlCiAgICovCiAgaG9zdE5vZGVfOiBudWxsLAoKICAvKioKICAgKiBBIG1hcCBmcm9tIGlkIHRvIEF1dG9tYXRpb25Ob2RlLgogICAqIEB0eXBlIHtPYmplY3QuPG51bWJlciwgQXV0b21hdGlvbk5vZGU+fQogICAqIEBwcml2YXRlCiAgICovCiAgYXhOb2RlRGF0YUNhY2hlXzogbnVsbCwKCiAgYWN0aW9uUmVxdWVzdENvdW50ZXJfOiAwLAoKICBhY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrXzogbnVsbCwKCiAgZ2V0IGlkKCkgewogICAgdmFyIHJlc3VsdCA9IEdldFJvb3RJRCh0aGlzLnRyZWVJRCk7CgogICAgLy8gRG9uJ3QgcmV0dXJuIHVuZGVmaW5lZCwgYmVjYXVzZSB0aGUgaWQgaXMgb2Z0ZW4gcGFzc2VkIGRpcmVjdGx5CiAgICAvLyBhcyBhbiBhcmd1bWVudCB0byBhIG5hdGl2ZSBiaW5kaW5nIHRoYXQgZXhwZWN0cyBvbmx5IGEgdmFsaWQgbnVtYmVyLgogICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gLTE7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBnZXQgY2hyb21lQ2hhbm5lbCgpIHsKICAgIHJldHVybiBHZXRTdHJpbmdBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsICdjaHJvbWVDaGFubmVsJyk7CiAgfSwKCiAgZ2V0IGRvY1VybCgpIHsKICAgIHJldHVybiBHZXREb2NVUkwodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBkb2NUaXRsZSgpIHsKICAgIHJldHVybiBHZXREb2NUaXRsZSh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0IGRvY0xvYWRlZCgpIHsKICAgIHJldHVybiBHZXREb2NMb2FkZWQodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBkb2NMb2FkaW5nUHJvZ3Jlc3MoKSB7CiAgICByZXR1cm4gR2V0RG9jTG9hZGluZ1Byb2dyZXNzKHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgYW5jaG9yT2JqZWN0KCkgewogICAgdmFyIGlkID0gR2V0QW5jaG9yT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gdGhpcy5nZXQoaWQpOwogICAgZWxzZQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0sCgogIGdldCBhbmNob3JPZmZzZXQoKSB7CiAgICB2YXIgaWQgPSBHZXRBbmNob3JPYmplY3RJRCh0aGlzLnRyZWVJRCk7CiAgICBpZiAoaWQgJiYgaWQgIT0gLTEpCiAgICAgIHJldHVybiBHZXRBbmNob3JPZmZzZXQodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBhbmNob3JBZmZpbml0eSgpIHsKICAgIHZhciBpZCA9IEdldEFuY2hvck9iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIEdldEFuY2hvckFmZmluaXR5KHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgZm9jdXNPYmplY3QoKSB7CiAgICB2YXIgaWQgPSBHZXRGb2N1c09iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9LAoKICBnZXQgZm9jdXNPZmZzZXQoKSB7CiAgICB2YXIgaWQgPSBHZXRGb2N1c09iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIEdldEZvY3VzT2Zmc2V0KHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgZm9jdXNBZmZpbml0eSgpIHsKICAgIHZhciBpZCA9IEdldEZvY3VzT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gR2V0Rm9jdXNBZmZpbml0eSh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0OiBmdW5jdGlvbihpZCkgewogICAgaWYgKGlkID09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCiAgICBpZiAoaWQgPT0gdGhpcy5pZCkKICAgICAgcmV0dXJuIHRoaXMud3JhcHBlcjsKCiAgICB2YXIgb2JqID0gdGhpcy5heE5vZGVEYXRhQ2FjaGVfW2lkXTsKICAgIGlmIChvYmopCiAgICAgIHJldHVybiBvYmo7CgogICAgb2JqID0gbmV3IEF1dG9tYXRpb25Ob2RlKHRoaXMpOwogICAgcHJpdmF0ZXMob2JqKS5pbXBsLnRyZWVJRCA9IHRoaXMudHJlZUlEOwogICAgcHJpdmF0ZXMob2JqKS5pbXBsLmlkID0gaWQ7CiAgICB0aGlzLmF4Tm9kZURhdGFDYWNoZV9baWRdID0gb2JqOwoKICAgIHJldHVybiBvYmo7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihpZCkgewogICAgaWYgKHRoaXMuYXhOb2RlRGF0YUNhY2hlX1tpZF0pCiAgICAgIHByaXZhdGVzKHRoaXMuYXhOb2RlRGF0YUNhY2hlX1tpZF0pLmltcGwuZGV0YWNoKCk7CiAgICBkZWxldGUgdGhpcy5heE5vZGVEYXRhQ2FjaGVfW2lkXTsKICB9LAoKICBkZXN0cm95OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnZGVzdHJveWVkJywgJ25vbmUnKTsKICAgIGZvciAodmFyIGlkIGluIHRoaXMuYXhOb2RlRGF0YUNhY2hlXykKICAgICAgdGhpcy5yZW1vdmUoaWQpOwogICAgdGhpcy5kZXRhY2goKTsKICB9LAoKICBzZXRIb3N0Tm9kZShob3N0Tm9kZSkgewogICAgdGhpcy5ob3N0Tm9kZV8gPSBob3N0Tm9kZTsKICB9LAoKICBvbkFjY2Vzc2liaWxpdHlFdmVudDogZnVuY3Rpb24oZXZlbnRQYXJhbXMpIHsKICAgIHZhciB0YXJnZXROb2RlID0gdGhpcy5nZXQoZXZlbnRQYXJhbXMudGFyZ2V0SUQpOwogICAgaWYgKHRhcmdldE5vZGUpIHsKICAgICAgdmFyIHRhcmdldE5vZGVJbXBsID0gcHJpdmF0ZXModGFyZ2V0Tm9kZSkuaW1wbDsKICAgICAgdGFyZ2V0Tm9kZUltcGwuZGlzcGF0Y2hFdmVudCgKICAgICAgICAgIGV2ZW50UGFyYW1zLmV2ZW50VHlwZSwgZXZlbnRQYXJhbXMuZXZlbnRGcm9tLAogICAgICAgICAgZXZlbnRQYXJhbXMubW91c2VYLCBldmVudFBhcmFtcy5tb3VzZVkpOwoKICAgICAgaWYgKGV2ZW50UGFyYW1zLmFjdGlvblJlcXVlc3RJRCAhPSAtMSkgewogICAgICAgIHRoaXMub25BY3Rpb25SZXN1bHQoZXZlbnRQYXJhbXMuYWN0aW9uUmVxdWVzdElELCB0YXJnZXROb2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbG9nZ2luZy5XQVJOSU5HKCdHb3QgJyArIGV2ZW50UGFyYW1zLmV2ZW50VHlwZSArCiAgICAgICAgICAgICAgICAgICAgICAnIGV2ZW50IG9uIHVua25vd24gbm9kZTogJyArIGV2ZW50UGFyYW1zLnRhcmdldElEICsKICAgICAgICAgICAgICAgICAgICAgICc7IHRoaXM6ICcgKyB0aGlzLmlkKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCgogIGFkZEFjdGlvblJlc3VsdENhbGxiYWNrOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgdGhpcy5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrX1srK3RoaXMuYWN0aW9uUmVxdWVzdENvdW50ZXJfXSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIHRoaXMuYWN0aW9uUmVxdWVzdENvdW50ZXJfOwogIH0sCgogIG9uQWN0aW9uUmVzdWx0OiBmdW5jdGlvbihyZXF1ZXN0SUQsIHJlc3VsdCkgewogICAgaWYgKHJlcXVlc3RJRCBpbiB0aGlzLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2tfKSB7CiAgICAgIHRoaXMuYWN0aW9uUmVxdWVzdElEVG9DYWxsYmFja19bcmVxdWVzdElEXShyZXN1bHQpOwogICAgICBkZWxldGUgdGhpcy5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrX1tyZXF1ZXN0SURdOwogICAgfQogIH0sCgogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIHRvU3RyaW5nSW50ZXJuYWwobm9kZUltcGwsIGluZGVudCkgewogICAgICBpZiAoIW5vZGVJbXBsKQogICAgICAgIHJldHVybiAnJzsKICAgICAgdmFyIG91dHB1dCA9ICcnOwogICAgICBpZiAobm9kZUltcGwuaXNSb290Tm9kZSkKICAgICAgICBvdXRwdXQgKz0gaW5kZW50ICsgJ3RyZWUgaWQ9JyArIG5vZGVJbXBsLnRyZWVJRCArICdcbic7CiAgICAgIG91dHB1dCArPSBpbmRlbnQgKwogICAgICAgICRGdW5jdGlvbi5jYWxsKEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUudG9TdHJpbmcsIG5vZGVJbXBsKSArICdcbic7CiAgICAgIGluZGVudCArPSAnICAnOwogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlSW1wbC5jaGlsZHJlbjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKICAgICAgICBvdXRwdXQgKz0gdG9TdHJpbmdJbnRlcm5hbChwcml2YXRlcyhjaGlsZHJlbltpXSkuaW1wbCwgaW5kZW50KTsKICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH0KICAgIHJldHVybiB0b1N0cmluZ0ludGVybmFsKHRoaXMsICcnKTsKICB9LAp9OwoKZnVuY3Rpb24gQXV0b21hdGlvbk5vZGUoKSB7CiAgcHJpdmF0ZXMoQXV0b21hdGlvbk5vZGUpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoQXV0b21hdGlvbk5vZGUsIEF1dG9tYXRpb25Ob2RlSW1wbCwgewogIGZ1bmN0aW9uczogWwogICAgJ2RvRGVmYXVsdCcsCiAgICAnZmluZCcsCiAgICAnZmluZEFsbCcsCiAgICAnZm9jdXMnLAogICAgJ2dldEltYWdlRGF0YScsCiAgICAnaGl0VGVzdCcsCiAgICAnaGl0VGVzdFdpdGhSZXBseScsCiAgICAnbWFrZVZpc2libGUnLAogICAgJ21hdGNoZXMnLAogICAgJ3BlcmZvcm1DdXN0b21BY3Rpb24nLAogICAgJ3Jlc3VtZU1lZGlhJywKICAgICdzY3JvbGxCYWNrd2FyZCcsCiAgICAnc2Nyb2xsRm9yd2FyZCcsCiAgICAnc2Nyb2xsVXAnLAogICAgJ3Njcm9sbERvd24nLAogICAgJ3Njcm9sbExlZnQnLAogICAgJ3Njcm9sbFJpZ2h0JywKICAgICdzZXRTZWxlY3Rpb24nLAogICAgJ3NldFNlcXVlbnRpYWxGb2N1c05hdmlnYXRpb25TdGFydGluZ1BvaW50JywKICAgICdzaG93Q29udGV4dE1lbnUnLAogICAgJ3N0YXJ0RHVja2luZ01lZGlhJywKICAgICdzdG9wRHVja2luZ01lZGlhJywKICAgICdzdXNwZW5kTWVkaWEnLAogICAgJ2FkZEV2ZW50TGlzdGVuZXInLAogICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLAogICAgJ2RvbVF1ZXJ5U2VsZWN0b3InLAogICAgJ3RvU3RyaW5nJywKICAgICdib3VuZHNGb3JSYW5nZScsCiAgXSwKICByZWFkb25seTogJEFycmF5LmNvbmNhdChwdWJsaWNBdHRyaWJ1dGVzLCBbCiAgICAgICdwYXJlbnQnLAogICAgICAnZmlyc3RDaGlsZCcsCiAgICAgICdsYXN0Q2hpbGQnLAogICAgICAnY2hpbGRyZW4nLAogICAgICAncHJldmlvdXNTaWJsaW5nJywKICAgICAgJ25leHRTaWJsaW5nJywKICAgICAgJ2lzUm9vdE5vZGUnLAogICAgICAncm9sZScsCiAgICAgICdjaGVja2VkJywKICAgICAgJ3Jlc3RyaWN0aW9uJywKICAgICAgJ3N0YXRlJywKICAgICAgJ2xvY2F0aW9uJywKICAgICAgJ2luZGV4SW5QYXJlbnQnLAogICAgICAnbGluZVN0YXJ0T2Zmc2V0cycsCiAgICAgICdyb290JywKICAgICAgJ2h0bWxBdHRyaWJ1dGVzJywKICAgICAgJ25hbWVGcm9tJywKICAgICAgJ2JvbGQnLAogICAgICAnaXRhbGljJywKICAgICAgJ3VuZGVybGluZScsCiAgICAgICdsaW5lVGhyb3VnaCcsCiAgICAgICdjdXN0b21BY3Rpb25zJywKICAgICAgJ3VuY2xpcHBlZExvY2F0aW9uJywKICBdKSwKfSk7CgpmdW5jdGlvbiBBdXRvbWF0aW9uUm9vdE5vZGUoKSB7CiAgcHJpdmF0ZXMoQXV0b21hdGlvblJvb3ROb2RlKS5jb25zdHJ1Y3RQcml2YXRlKHRoaXMsIGFyZ3VtZW50cyk7Cn0KdXRpbHMuZXhwb3NlKEF1dG9tYXRpb25Sb290Tm9kZSwgQXV0b21hdGlvblJvb3ROb2RlSW1wbCwgewogIHN1cGVyY2xhc3M6IEF1dG9tYXRpb25Ob2RlLAogIHJlYWRvbmx5OiBbCiAgICAnY2hyb21lQ2hhbm5lbCcsCiAgICAnZG9jVGl0bGUnLAogICAgJ2RvY1VybCcsCiAgICAnZG9jTG9hZGVkJywKICAgICdkb2NMb2FkaW5nUHJvZ3Jlc3MnLAogICAgJ2FuY2hvck9iamVjdCcsCiAgICAnYW5jaG9yT2Zmc2V0JywKICAgICdhbmNob3JBZmZpbml0eScsCiAgICAnZm9jdXNPYmplY3QnLAogICAgJ2ZvY3VzT2Zmc2V0JywKICAgICdmb2N1c0FmZmluaXR5JywKICBdLAp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZSwgJ2dldCcsIGZ1bmN0aW9uKHRyZWVJRCkgewogIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmdldCh0cmVlSUQpOwp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZSwgJ2dldE9yQ3JlYXRlJywgZnVuY3Rpb24odHJlZUlEKSB7CiAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0T3JDcmVhdGUodHJlZUlEKTsKfSk7Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGUsICdkZXN0cm95JywgZnVuY3Rpb24odHJlZUlEKSB7CiAgQXV0b21hdGlvblJvb3ROb2RlSW1wbC5kZXN0cm95KHRyZWVJRCk7Cn0pOwoKZXhwb3J0cy4kc2V0KCdBdXRvbWF0aW9uTm9kZScsIEF1dG9tYXRpb25Ob2RlKTsKZXhwb3J0cy4kc2V0KCdBdXRvbWF0aW9uUm9vdE5vZGUnLCBBdXRvbWF0aW9uUm9vdE5vZGUpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgYnJvd3NlckFjdGlvbiBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Jyb3dzZXJBY3Rpb24nKTsKCnZhciBzZXRJY29uID0gcmVxdWlyZSgnc2V0SWNvbicpLnNldEljb247CnZhciBnZXRFeHRlbnNpb25WaWV3cyA9IHJlcXVpcmVOYXRpdmUoJ3J1bnRpbWUnKS5HZXRFeHRlbnNpb25WaWV3czsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0OwoKdmFyIGpzTGFzdEVycm9yID0gYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiByZXF1aXJlKCdsYXN0RXJyb3InKTsKZnVuY3Rpb24gaGFzTGFzdEVycm9yKCkgewogIHJldHVybiBiaW5kaW5nVXRpbCA/CiAgICAgIGJpbmRpbmdVdGlsLmhhc0xhc3RFcnJvcigpIDoganNMYXN0RXJyb3IuaGFzRXJyb3IoY2hyb21lKTsKfQoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0SWNvbicsIGZ1bmN0aW9uKGRldGFpbHMsIGNhbGxiYWNrKSB7CiAgICBzZXRJY29uKGRldGFpbHMsIGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgc2VuZFJlcXVlc3QoJ2Jyb3dzZXJBY3Rpb24uc2V0SWNvbicsCiAgICAgICAgICAgICAgICAgIFthcmdzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgIGFwaUJyaWRnZSA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgfS5iaW5kKHRoaXMpKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdvcGVuUG9wdXAnLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIGlmICghY2FsbGJhY2spCiAgICAgIHJldHVybjsKCiAgICBpZiAoaGFzTGFzdEVycm9yKCkpIHsKICAgICAgY2FsbGJhY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB2aWV3cyA9IGdldEV4dGVuc2lvblZpZXdzKC0xLCAtMSwgJ1BPUFVQJyk7CiAgICAgIGNhbGxiYWNrKHZpZXdzLmxlbmd0aCA+IDAgPyB2aWV3c1swXSA6IG51bGwpOwogICAgfQogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIENhc3QgU3RyZWFtaW5nIFJ0cFN0cmVhbSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fAogICAgICAgICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnY2FzdC5zdHJlYW1pbmcucnRwU3RyZWFtJyk7CnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnY2FzdF9zdHJlYW1pbmdfbmF0aXZlcycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2Rlc3Ryb3knLAogICAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCkgewogICAgICAgIG5hdGl2ZXMuRGVzdHJveUNhc3RSdHBTdHJlYW0odHJhbnNwb3J0SWQpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRTdXBwb3J0ZWRQYXJhbXMnLAogICAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCkgewogICAgICAgIHJldHVybiBuYXRpdmVzLkdldFN1cHBvcnRlZFBhcmFtc0Nhc3RSdHBTdHJlYW0odHJhbnNwb3J0SWQpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzdGFydCcsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBwYXJhbXMpIHsKICAgICAgICBuYXRpdmVzLlN0YXJ0Q2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCwgcGFyYW1zKTsKICB9KTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc3RvcCcsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkKSB7CiAgICAgICAgbmF0aXZlcy5TdG9wQ2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3RvZ2dsZUxvZ2dpbmcnLAogICAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCwgZW5hYmxlKSB7CiAgICAgICAgbmF0aXZlcy5Ub2dnbGVMb2dnaW5nKHRyYW5zcG9ydElkLCBlbmFibGUpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRSYXdFdmVudHMnLAogICAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCwgZXh0cmFEYXRhLCBjYWxsYmFjaykgewogICAgICAgIG5hdGl2ZXMuR2V0UmF3RXZlbnRzKHRyYW5zcG9ydElkLCBleHRyYURhdGEsIGNhbGxiYWNrKTsKICB9KTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0U3RhdHMnLAogICAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCwgY2FsbGJhY2spIHsKICAgICAgICBuYXRpdmVzLkdldFN0YXRzKHRyYW5zcG9ydElkLCBjYWxsYmFjayk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgQ2FzdCBTdHJlYW1pbmcgU2Vzc2lvbiBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fAogICAgICAgICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnY2FzdC5zdHJlYW1pbmcuc2Vzc2lvbicpOwp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2Nhc3Rfc3RyZWFtaW5nX25hdGl2ZXMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2NyZWF0ZScsCiAgICAgIGZ1bmN0aW9uKGF1ZGlvVHJhY2ssIHZpZGVvVHJhY2ssIGNhbGxiYWNrKSB7CiAgICAgICAgbmF0aXZlcy5DcmVhdGVTZXNzaW9uKGF1ZGlvVHJhY2ssIHZpZGVvVHJhY2ssIGNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBDYXN0IFN0cmVhbWluZyBVZHBUcmFuc3BvcnQgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Nhc3Quc3RyZWFtaW5nLnVkcFRyYW5zcG9ydCcpOwp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2Nhc3Rfc3RyZWFtaW5nX25hdGl2ZXMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdkZXN0cm95JywgZnVuY3Rpb24odHJhbnNwb3J0SWQpIHsKICAgIG5hdGl2ZXMuRGVzdHJveUNhc3RVZHBUcmFuc3BvcnQodHJhbnNwb3J0SWQpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXREZXN0aW5hdGlvbicsCiAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCwgZGVzdGluYXRpb24pIHsKICAgICAgbmF0aXZlcy5TZXREZXN0aW5hdGlvbkNhc3RVZHBUcmFuc3BvcnQodHJhbnNwb3J0SWQsIGRlc3RpbmF0aW9uKTsKICB9KTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0T3B0aW9ucycsCiAgICBmdW5jdGlvbih0cmFuc3BvcnRJZCwgb3B0aW9ucykgewogICAgICBuYXRpdmVzLlNldE9wdGlvbnNDYXN0VWRwVHJhbnNwb3J0KHRyYW5zcG9ydElkLCBvcHRpb25zKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBDYXN0IFN0cmVhbWluZyBTZXNzaW9uIEFQSS4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fAogICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjYXN0LnN0cmVhbWluZy5yZWNlaXZlclNlc3Npb24nKTsKdmFyIG5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdjYXN0X3N0cmVhbWluZ19uYXRpdmVzJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KAogICAgICAnY3JlYXRlQW5kQmluZCcsCiAgICAgIGZ1bmN0aW9uKGFwLCB2cCwgbG9jYWwsIHdlaWRndGgsIGhlaWdodCwgZnIsIHVybCwgY2IsIG9wKSB7CiAgICAgICAgbmF0aXZlcy5TdGFydENhc3RSdHBSZWNlaXZlcigKICAgICAgICAgICAgYXAsIHZwLCBsb2NhbCwgd2VpZGd0aCwgaGVpZ2h0LCBmciwgdXJsLCBjYiwgb3ApOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdmFyIEV2ZW50ID0gcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5FdmVudDsKdmFyIHNlbmRSZXF1ZXN0ID0gcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnc2NoZW1hVXRpbHMnKS52YWxpZGF0ZTsKCmZ1bmN0aW9uIGV4dGVuZFNjaGVtYShzY2hlbWEpIHsKICB2YXIgZXh0ZW5kZWRTY2hlbWEgPSAkQXJyYXkuc2xpY2Uoc2NoZW1hKTsKICAkQXJyYXkudW5zaGlmdChleHRlbmRlZFNjaGVtYSwgeyd0eXBlJzogJ3N0cmluZyd9KTsKICByZXR1cm4gZXh0ZW5kZWRTY2hlbWE7Cn0KCi8vIFRPRE8oZGV2bGluKTogTWF5YmUgZmluZCBhIHdheSB0byBjb21iaW5lIHRoaXMgYW5kIENvbnRlbnRTZXR0aW5nLgpmdW5jdGlvbiBDaHJvbWVTZXR0aW5nKHByZWZLZXksIHZhbHVlU2NoZW1hLCBzY2hlbWEpIHsKICB2YXIgZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzID0gZnVuY3Rpb24obmFtZSkgewogICAgdmFyIGYgPSAkQXJyYXkuZmlsdGVyKAogICAgICAgICAgICAgICAgc2NoZW1hLmZ1bmN0aW9ucywgZnVuY3Rpb24oZikgeyByZXR1cm4gZi5uYW1lID09PSBuYW1lOyB9KVswXTsKICAgIHJldHVybiBmLnBhcmFtZXRlcnM7CiAgfTsKICB0aGlzLmdldCA9IGZ1bmN0aW9uKGRldGFpbHMsIGNhbGxiYWNrKSB7CiAgICB2YXIgZ2V0U2NoZW1hID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKCdnZXQnKTsKICAgIHZhbGlkYXRlKFtkZXRhaWxzLCBjYWxsYmFja10sIGdldFNjaGVtYSk7CiAgICByZXR1cm4gc2VuZFJlcXVlc3QoJ3R5cGVzLkNocm9tZVNldHRpbmcuZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICBbcHJlZktleSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShnZXRTY2hlbWEpKTsKICB9OwogIHRoaXMuc2V0ID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIC8vIFRoZSBzZXQgc2NoZW1hIGluY2x1ZGVkIGluIHRoZSBTY2hlbWEgb2JqZWN0IGlzIGdlbmVyaWMsIHNpbmNlIGl0IHZhcmllcwogICAgLy8gcGVyLXNldHRpbmcuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBldmVyIGZvciBhIHNpbmdsZSBzZXR0aW5nLCBzbyB3ZSBjYW4KICAgIC8vIGVuZm9yY2UgdGhlIHR5cGVzIG1vcmUgdGhvcm91Z2hseS4KICAgIHZhciByYXdTZXRTY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ3NldCcpOwogICAgdmFyIHJhd1NldHRpbmdQYXJhbSA9IHJhd1NldFNjaGVtYVswXTsKICAgIHZhciBwcm9wcyA9ICRPYmplY3QuYXNzaWduKHt9LCByYXdTZXR0aW5nUGFyYW0ucHJvcGVydGllcyk7CiAgICBwcm9wcy52YWx1ZSA9IHZhbHVlU2NoZW1hOwogICAgdmFyIG1vZFNldHRpbmdQYXJhbSA9IHsKICAgICAgbmFtZTogcmF3U2V0dGluZ1BhcmFtLm5hbWUsCiAgICAgIHR5cGU6IHJhd1NldHRpbmdQYXJhbS50eXBlLAogICAgICBwcm9wZXJ0aWVzOiBwcm9wcywKICAgIH07CiAgICB2YXIgbW9kU2V0U2NoZW1hID0gJEFycmF5LnNsaWNlKHJhd1NldFNjaGVtYSk7CiAgICBtb2RTZXRTY2hlbWFbMF0gPSBtb2RTZXR0aW5nUGFyYW07CiAgICB2YWxpZGF0ZShbZGV0YWlscywgY2FsbGJhY2tdLCBtb2RTZXRTY2hlbWEpOwogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KCd0eXBlcy5DaHJvbWVTZXR0aW5nLnNldCcsCiAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZLZXksIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEobW9kU2V0U2NoZW1hKSk7CiAgfTsKICB0aGlzLmNsZWFyID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHZhciBjbGVhclNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnY2xlYXInKTsKICAgIHZhbGlkYXRlKFtkZXRhaWxzLCBjYWxsYmFja10sIGNsZWFyU2NoZW1hKTsKICAgIHJldHVybiBzZW5kUmVxdWVzdCgndHlwZXMuQ2hyb21lU2V0dGluZy5jbGVhcicsCiAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZLZXksIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEoY2xlYXJTY2hlbWEpKTsKICB9OwogIHRoaXMub25DaGFuZ2UgPSBuZXcgRXZlbnQoJ3R5cGVzLkNocm9tZVNldHRpbmcuJyArIHByZWZLZXkgKyAnLm9uQ2hhbmdlJyk7Cn07CgpleHBvcnRzLiRzZXQoJ0Nocm9tZVNldHRpbmcnLCBDaHJvbWVTZXR0aW5nKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKTsKdmFyIGNvbnRleHRNZW51c0hhbmRsZXJzID0gcmVxdWlyZSgnY29udGV4dE1lbnVzSGFuZGxlcnMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgdmFyIGhhbmRsZXJzID0gY29udGV4dE1lbnVzSGFuZGxlcnMuY3JlYXRlKHRydWUgLyogaXNXZWJ2aWV3ICovKTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjb250ZXh0TWVudXNDcmVhdGUnLCBoYW5kbGVycy5yZXF1ZXN0SGFuZGxlcnMuY3JlYXRlKTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjb250ZXh0TWVudXNVcGRhdGUnLCBoYW5kbGVycy5yZXF1ZXN0SGFuZGxlcnMudXBkYXRlKTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjb250ZXh0TWVudXNSZW1vdmUnLCBoYW5kbGVycy5yZXF1ZXN0SGFuZGxlcnMucmVtb3ZlKTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjb250ZXh0TWVudXNSZW1vdmVBbGwnLCBoYW5kbGVycy5yZXF1ZXN0SGFuZGxlcnMucmVtb3ZlQWxsKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ0Nocm9tZVdlYlZpZXcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBjaHJvbWUtc3BlY2lmaWMgPHdlYnZpZXc+IEFQSS4KLy8gU2VlIHdlYl92aWV3X2FwaV9tZXRob2RzLmpzIGZvciBkZXRhaWxzLgoKdmFyIENocm9tZVdlYlZpZXcgPSBnZXRJbnRlcm5hbEFwaSA/CiAgICBnZXRJbnRlcm5hbEFwaSgnY2hyb21lV2ViVmlld0ludGVybmFsJykgOgogICAgcmVxdWlyZSgnY2hyb21lV2ViVmlld0ludGVybmFsJykuQ2hyb21lV2ViVmlldzsKdmFyIENocm9tZVdlYlZpZXdTY2hlbWEgPQogICAgcmVxdWlyZU5hdGl2ZSgnc2NoZW1hX3JlZ2lzdHJ5JykuR2V0U2NoZW1hKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKTsKdmFyIENyZWF0ZUV2ZW50ID0gcmVxdWlyZSgnZ3Vlc3RWaWV3RXZlbnRzJykuQ3JlYXRlRXZlbnQ7CnZhciBHdWVzdFZpZXdJbnRlcm5hbE5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdndWVzdF92aWV3X2ludGVybmFsJyk7CnZhciBpZEdlbmVyYXRvck5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKdmFyIHV0aWxzID0gcmVxdWlyZSgndXRpbHMnKTsKdmFyIFdlYlZpZXdJbXBsID0gcmVxdWlyZSgnd2ViVmlldycpLldlYlZpZXdJbXBsOwoKLy8gVGhpcyBpcyB0aGUgb25seSAid2ViVmlld0ludGVybmFsLm9uQ2xpY2tlZCIgbmFtZWQgZXZlbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi8vCi8vIFNpbmNlIHdlIG5lZWQgYW4gZXZlbnQgcGVyIDx3ZWJ2aWV3Piwgd2UgZGVmaW5lIGV2ZW50cyB3aXRoIHN1ZmZpeAovLyAoc3ViRXZlbnROYW1lKSBpbiBlYWNoIG9mIHRoZSA8d2Vidmlldz4uIEJlaGluZCB0aGUgc2NlbmVzLCB0aGlzIGV2ZW50IGlzCi8vIHJlZ2lzdGVyZWQgYXMgYSBDb250ZXh0TWVudXNFdmVudCwgd2l0aCBmaWx0ZXIgc2V0IHRvIHRoZSB3ZWJ2aWV3J3MKLy8gfHZpZXdJbnN0YW5jZUlkfC4gQW55IHRpbWUgYSBDb250ZXh0TWVudXNFdmVudCBpcyBkaXNwYXRjaGVkLCB3ZSByZS1kaXNwYXRjaAovLyBpdCB0byB0aGUgc3ViRXZlbnQncyBsaXN0ZW5lcnMuIFRoaXMgd2F5Ci8vIDx3ZWJ2aWV3Pi5jb250ZXh0TWVudXMub25DbGlja2VkIGJlaGF2ZSBhcyBhIHJlZ3VsYXIgY2hyb21lIEV2ZW50IHR5cGUuCnZhciBDb250ZXh0TWVudXNFdmVudCA9IENyZWF0ZUV2ZW50KCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwub25DbGlja2VkJyk7Ci8vIFNlZSBjb21tZW50IGFib3ZlLgp2YXIgQ29udGV4dE1lbnVzSGFuZGxlckV2ZW50ID0KICAgIENyZWF0ZUV2ZW50KCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwub25Db250ZXh0TWVudVNob3cnKTsKCnZhciBqc0V2ZW50OwpmdW5jdGlvbiBjcmVhdGVDdXN0b21FdmVudChuYW1lLCBzY2hlbWEsIG9wdGlvbnMsIHdlYnZpZXdJZCkgewogIGlmIChiaW5kaW5nVXRpbCkKICAgIHJldHVybiBiaW5kaW5nVXRpbC5jcmVhdGVDdXN0b21FdmVudChuYW1lLCB1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSk7CiAgaWYgKCFqc0V2ZW50KQogICAganNFdmVudCA9IHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykuRXZlbnQ7CiAgcmV0dXJuIG5ldyBqc0V2ZW50KG5hbWUsIHNjaGVtYSwgb3B0aW9ucywgd2Vidmlld0lkKTsKfQoKLy8gVGhpcyBldmVudCBpcyBleHBvc2VkIGFzIDx3ZWJ2aWV3Pi5jb250ZXh0TWVudXMub25DbGlja2VkLgpmdW5jdGlvbiBjcmVhdGVDb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudCh3ZWJWaWV3SW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2FyZ1NjaGVtYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE9wdGlvbnMpIHsKICB2YXIgc3ViRXZlbnROYW1lID0gR2V0VW5pcXVlU3ViRXZlbnROYW1lKG9wdF9ldmVudE5hbWUpOwogIHZhciBuZXdFdmVudCA9IGNyZWF0ZUN1c3RvbUV2ZW50KHN1YkV2ZW50TmFtZSwgb3B0X2FyZ1NjaGVtYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50T3B0aW9ucywgd2ViVmlld0luc3RhbmNlSWQpOwoKICB2YXIgdmlldyA9IEd1ZXN0Vmlld0ludGVybmFsTmF0aXZlcy5HZXRWaWV3RnJvbUlEKHdlYlZpZXdJbnN0YW5jZUlkKTsKICBpZiAodmlldykgewogICAgdmlldy5ldmVudHMuYWRkU2NvcGVkTGlzdGVuZXIoCiAgICAgICAgQ29udGV4dE1lbnVzRXZlbnQsCiAgICAgICAgJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBSZS1kaXNwYXRjaCB0byBzdWJFdmVudCdzIGxpc3RlbmVycy4KICAgICAgICAgICRGdW5jdGlvbi5hcHBseShuZXdFdmVudC5kaXNwYXRjaCwgbmV3RXZlbnQsICRBcnJheS5zbGljZShhcmd1bWVudHMpKTsKICAgICAgICB9LCBuZXdFdmVudCksCiAgICAgICAge2luc3RhbmNlSWQ6IHdlYlZpZXdJbnN0YW5jZUlkfSk7CiAgfQogIHJldHVybiBuZXdFdmVudDsKfQoKLy8gVGhpcyBldmVudCBpcyBleHBvc2VkIGFzIDx3ZWJ2aWV3Pi5jb250ZXh0TWVudXMub25TaG93LgpmdW5jdGlvbiBjcmVhdGVDb250ZXh0TWVudXNPbkNvbnRleHRNZW51RXZlbnQod2ViVmlld0luc3RhbmNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2FyZ1NjaGVtYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnRPcHRpb25zKSB7CiAgdmFyIHN1YkV2ZW50TmFtZSA9IEdldFVuaXF1ZVN1YkV2ZW50TmFtZShvcHRfZXZlbnROYW1lKTsKICB2YXIgbmV3RXZlbnQgPSBjcmVhdGVDdXN0b21FdmVudChzdWJFdmVudE5hbWUsIG9wdF9hcmdTY2hlbWFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE9wdGlvbnMsIHdlYlZpZXdJbnN0YW5jZUlkKTsKCiAgdmFyIHZpZXcgPSBHdWVzdFZpZXdJbnRlcm5hbE5hdGl2ZXMuR2V0Vmlld0Zyb21JRCh3ZWJWaWV3SW5zdGFuY2VJZCk7CiAgaWYgKHZpZXcpIHsKICAgIHZpZXcuZXZlbnRzLmFkZFNjb3BlZExpc3RlbmVyKAogICAgICAgIENvbnRleHRNZW51c0hhbmRsZXJFdmVudCwKICAgICAgICAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihlKSB7CiAgICAgICAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlOwogICAgICAgICAgdmFyIGV2ZW50ID0gewogICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7IGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9CiAgICAgICAgICB9OwoKICAgICAgICAgIC8vIFJlLWRpc3BhdGNoIHRvIHN1YkV2ZW50J3MgbGlzdGVuZXJzLgogICAgICAgICAgJEZ1bmN0aW9uLmFwcGx5KG5ld0V2ZW50LmRpc3BhdGNoLCBuZXdFdmVudCwgW2V2ZW50XSk7CgogICAgICAgICAgaWYgKCFkZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAvLyBUT0RPKGxhenlib3kpOiBSZW1vdmUgfGl0ZW1zfCBwYXJhbWV0ZXIgY29tcGxldGVseSBmcm9tCiAgICAgICAgICAvLyBDaHJvbWVXZWJWaWV3LnNob3dDb250ZXh0TWVudSBhcyB3ZSBkb24ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aAogICAgICAgICAgLy8gaXQgY3VycmVudGx5LgogICAgICAgICAgdmFyIGl0ZW1zID0gW107CiAgICAgICAgICB2YXIgZ3Vlc3RJbnN0YW5jZUlkID0gR3Vlc3RWaWV3SW50ZXJuYWxOYXRpdmVzLgogICAgICAgICAgICAgIEdldFZpZXdGcm9tSUQod2ViVmlld0luc3RhbmNlSWQpLmd1ZXN0LmdldElkKCk7CiAgICAgICAgICBDaHJvbWVXZWJWaWV3LnNob3dDb250ZXh0TWVudShndWVzdEluc3RhbmNlSWQsIGUucmVxdWVzdElkLCBpdGVtcyk7CiAgICAgICAgfQogICAgICB9LCBuZXdFdmVudCksCiAgICAgIHtpbnN0YW5jZUlkOiB3ZWJWaWV3SW5zdGFuY2VJZH0pOwogIH0KCiAgcmV0dXJuIG5ld0V2ZW50Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXZWJWaWV3Q29udGV4dE1lbnVzSW1wbCBvYmplY3QuCgovLyBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGV4cG9zZWQgYXMgPHdlYnZpZXc+LmNvbnRleHRNZW51cy4KZnVuY3Rpb24gV2ViVmlld0NvbnRleHRNZW51c0ltcGwodmlld0luc3RhbmNlSWQpIHsKICB0aGlzLnZpZXdJbnN0YW5jZUlkXyA9IHZpZXdJbnN0YW5jZUlkOwp9CiRPYmplY3Quc2V0UHJvdG90eXBlT2YoV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLCBudWxsKTsKCldlYlZpZXdDb250ZXh0TWVudXNJbXBsLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpIHsKICB2YXIgYXJncyA9ICRBcnJheS5jb25jYXQoW3RoaXMudmlld0luc3RhbmNlSWRfXSwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogIHJldHVybiAkRnVuY3Rpb24uYXBwbHkoQ2hyb21lV2ViVmlldy5jb250ZXh0TWVudXNDcmVhdGUsIG51bGwsIGFyZ3MpOwp9OwoKV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmdzID0gJEFycmF5LmNvbmNhdChbdGhpcy52aWV3SW5zdGFuY2VJZF9dLCAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShDaHJvbWVXZWJWaWV3LmNvbnRleHRNZW51c1JlbW92ZSwgbnVsbCwgYXJncyk7Cn07CgpXZWJWaWV3Q29udGV4dE1lbnVzSW1wbC5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFyZ3MgPSAkQXJyYXkuY29uY2F0KFt0aGlzLnZpZXdJbnN0YW5jZUlkX10sICRBcnJheS5zbGljZShhcmd1bWVudHMpKTsKICByZXR1cm4gJEZ1bmN0aW9uLmFwcGx5KENocm9tZVdlYlZpZXcuY29udGV4dE1lbnVzUmVtb3ZlQWxsLCBudWxsLCBhcmdzKTsKfTsKCldlYlZpZXdDb250ZXh0TWVudXNJbXBsLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHsKICB2YXIgYXJncyA9ICRBcnJheS5jb25jYXQoW3RoaXMudmlld0luc3RhbmNlSWRfXSwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogIHJldHVybiAkRnVuY3Rpb24uYXBwbHkoQ2hyb21lV2ViVmlldy5jb250ZXh0TWVudXNVcGRhdGUsIG51bGwsIGFyZ3MpOwp9OwoKZnVuY3Rpb24gV2ViVmlld0NvbnRleHRNZW51cygpIHsKICBwcml2YXRlcyhXZWJWaWV3Q29udGV4dE1lbnVzKS5jb25zdHJ1Y3RQcml2YXRlKHRoaXMsIGFyZ3VtZW50cyk7Cn0KdXRpbHMuZXhwb3NlKFdlYlZpZXdDb250ZXh0TWVudXMsIFdlYlZpZXdDb250ZXh0TWVudXNJbXBsLCB7CiAgZnVuY3Rpb25zOiBbCiAgICAnY3JlYXRlJywKICAgICdyZW1vdmUnLAogICAgJ3JlbW92ZUFsbCcsCiAgICAndXBkYXRlJywKICBdLAp9KTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpXZWJWaWV3SW1wbC5wcm90b3R5cGUubWF5YmVTZXR1cENvbnRleHRNZW51cyA9IGZ1bmN0aW9uKCkgewogIGlmICghdGhpcy5jb250ZXh0TWVudXNPbkNvbnRleHRNZW51RXZlbnRfKSB7CiAgICB2YXIgZXZlbnROYW1lID0gJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbC5vbkNvbnRleHRNZW51U2hvdyc7CiAgICB2YXIgZXZlbnRTY2hlbWEgPQogICAgICAgIHV0aWxzLmxvb2t1cChDaHJvbWVXZWJWaWV3U2NoZW1hLmV2ZW50cywgJ25hbWUnLCAnb25TaG93Jyk7CiAgICB2YXIgZXZlbnRPcHRpb25zID0ge3N1cHBvcnRzTGlzdGVuZXJzOiB0cnVlLCBzdXBwb3J0c0xhenlMaXN0ZW5lcnM6IGZhbHNlfTsKICAgIHRoaXMuY29udGV4dE1lbnVzT25Db250ZXh0TWVudUV2ZW50XyA9IGNyZWF0ZUNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudCgKICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZUlkLCBldmVudE5hbWUsIGV2ZW50U2NoZW1hLCBldmVudE9wdGlvbnMpOwogIH0KCiAgdmFyIGNyZWF0ZUNvbnRleHRNZW51cyA9ICRGdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMud2Vha1dyYXBwZXIoZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51c18pIHsKICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudXNfOwogICAgICB9CgogICAgICB0aGlzLmNvbnRleHRNZW51c18gPSBuZXcgV2ViVmlld0NvbnRleHRNZW51cyh0aGlzLnZpZXdJbnN0YW5jZUlkKTsKCiAgICAgIC8vIERlZmluZSAnb25DbGlja2VkJyBldmVudCBwcm9wZXJ0eSBvbiB8dGhpcy5jb250ZXh0TWVudXNffC4KICAgICAgdmFyIGdldE9uQ2xpY2tlZEV2ZW50ID0gJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMud2Vha1dyYXBwZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVzT25DbGlja2VkRXZlbnRfKSB7CiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSAnY2hyb21lV2ViVmlld0ludGVybmFsLm9uQ2xpY2tlZCc7CiAgICAgICAgICAgIHZhciBldmVudFNjaGVtYSA9CiAgICAgICAgICAgICAgICB1dGlscy5sb29rdXAoQ2hyb21lV2ViVmlld1NjaGVtYS5ldmVudHMsICduYW1lJywgJ29uQ2xpY2tlZCcpOwogICAgICAgICAgICB2YXIgZXZlbnRPcHRpb25zID0KICAgICAgICAgICAgICAgIHtzdXBwb3J0c0xpc3RlbmVyczogdHJ1ZSwgc3VwcG9ydHNMYXp5TGlzdGVuZXJzOiBmYWxzZX07CiAgICAgICAgICAgIHZhciBvbkNsaWNrZWRFdmVudCA9IGNyZWF0ZUNvbnRleHRNZW51c09uQ2xpY2tlZEV2ZW50KAogICAgICAgICAgICAgICAgdGhpcy52aWV3SW5zdGFuY2VJZCwgZXZlbnROYW1lLCBldmVudFNjaGVtYSwgZXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudF8gPSBvbkNsaWNrZWRFdmVudDsKICAgICAgICAgICAgcmV0dXJuIG9uQ2xpY2tlZEV2ZW50OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnVzT25DbGlja2VkRXZlbnRfOwogICAgICAgIH0pOwogICAgICB9LCB0aGlzKTsKICAgICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVzXywKICAgICAgICAgICdvbkNsaWNrZWQnLAogICAgICAgICAge2dldDogZ2V0T25DbGlja2VkRXZlbnQoKSwgZW51bWVyYWJsZTogdHJ1ZX0pOwogICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KAogICAgICAgICAgdGhpcy5jb250ZXh0TWVudXNfLAogICAgICAgICAgJ29uU2hvdycsCiAgICAgICAgICB7CiAgICAgICAgICAgIGdldDogdGhpcy53ZWFrV3JhcHBlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudXNPbkNvbnRleHRNZW51RXZlbnRfOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51c187CiAgICB9KTsKICB9LCB0aGlzKTsKCiAgLy8gRXhwb3NlIDx3ZWJ2aWV3Pi5jb250ZXh0TWVudXMgb2JqZWN0LgogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoCiAgICAgIHRoaXMuZWxlbWVudCwKICAgICAgJ2NvbnRleHRNZW51cycsCiAgICAgIHsKICAgICAgICBnZXQ6IGNyZWF0ZUNvbnRleHRNZW51cygpLAogICAgICAgIGVudW1lcmFibGU6IHRydWUKICAgICAgfSk7Cn07CgpmdW5jdGlvbiBHZXRVbmlxdWVTdWJFdmVudE5hbWUoZXZlbnROYW1lKSB7CiAgcmV0dXJuIGV2ZW50TmFtZSArICcvJyArIGlkR2VuZXJhdG9yTmF0aXZlcy5HZXROZXh0SWQoKTsKfQovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgY29udGVudFNldHRpbmdzIEFQSS4KCnZhciBzZW5kUmVxdWVzdCA9IHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ3NjaGVtYVV0aWxzJykudmFsaWRhdGU7CgovLyBTb21lIGNvbnRlbnQgdHlwZXMgaGF2ZSBiZWVuIHJlbW92ZWQgYW5kIG5vIGxvbmdlciBjb3JyZXNwb25kIHRvIGEgcmVhbAovLyBjb250ZW50IHNldHRpbmcuIEluc3RlYWQsIHRoZXNlIGFsd2F5cyByZXR1cm4gYSBmaXhlZCBkdW1teSB2YWx1ZSwgYW5kIGlzc3VlCi8vIGEgd2FybmluZyB3aGVuIGFjY2Vzc2VkLiBUaGlzIG1hcHMgdGhlIGNvbnRlbnQgdHlwZSBuYW1lIHRvIHRoZSBkdW1teSB2YWx1ZS4KdmFyIERFUFJFQ0FURURfQ09OVEVOVF9UWVBFUyA9IHsKICBfX3Byb3RvX186IG51bGwsCgogIGZ1bGxzY3JlZW46ICdhbGxvdycsCiAgbW91c2Vsb2NrOiAnYWxsb3cnLAp9OwoKZnVuY3Rpb24gZXh0ZW5kU2NoZW1hKHNjaGVtYSkgewogIHZhciBleHRlbmRlZFNjaGVtYSA9ICRBcnJheS5zbGljZShzY2hlbWEpOwogICRBcnJheS51bnNoaWZ0KGV4dGVuZGVkU2NoZW1hLCB7J3R5cGUnOiAnc3RyaW5nJ30pOwogIHJldHVybiBleHRlbmRlZFNjaGVtYTsKfQoKZnVuY3Rpb24gQ29udGVudFNldHRpbmcoY29udGVudFR5cGUsIHNldHRpbmdTY2hlbWEsIHNjaGVtYSkgewogIHZhciBnZXRGdW5jdGlvblBhcmFtZXRlcnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgZiA9ICRBcnJheS5maWx0ZXIoCiAgICAgICAgICAgICAgICBzY2hlbWEuZnVuY3Rpb25zLCBmdW5jdGlvbihmKSB7IHJldHVybiBmLm5hbWUgPT09IG5hbWU7IH0pWzBdOwogICAgcmV0dXJuIGYucGFyYW1ldGVyczsKICB9OwogIHRoaXMuZ2V0ID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHZhciBnZXRTY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ2dldCcpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgZ2V0U2NoZW1hKTsKCiAgICB2YXIgZHVtbXlTZXR0aW5nID0gREVQUkVDQVRFRF9DT05URU5UX1RZUEVTW2NvbnRlbnRUeXBlXTsKICAgIGlmIChkdW1teVNldHRpbmcgIT09IHVuZGVmaW5lZCkgewogICAgICBjb25zb2xlLndhcm4oJ2NvbnRlbnRTZXR0aW5ncy4nICsgY29udGVudFR5cGUgKyAnIGlzIGRlcHJlY2F0ZWQ7IGl0IHdpbGwgJwogICAgICAgICAgICAgICAgICAgKyAnYWx3YXlzIHJldHVybiBcJycgKyBkdW1teVNldHRpbmcgKyAnXCcuJyk7CiAgICAgICRGdW5jdGlvbi5hcHBseShjYWxsYmFjaywgdW5kZWZpbmVkLCBbe3NldHRpbmc6IGR1bW15U2V0dGluZ31dKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgnY29udGVudFNldHRpbmdzLmdldCcsCiAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRUeXBlLCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKGdldFNjaGVtYSkpOwogIH07CgogIHRoaXMuc2V0ID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIC8vIFdlIGNoZWNrIGlmIHRoZSBzZXR0aW5nIGlzIGRlcHJlY2F0ZWQgZmlyc3QsIHNpbmNlIHRoZSB2YWxpZGF0aW9uIHdpbGwKICAgIC8vIGZhaWwgZm9yIGRlcHJlY2F0ZWQgdHlwZXMuCiAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVMsIGNvbnRlbnRUeXBlKSkgewogICAgICBjb25zb2xlLndhcm4oJ2NvbnRlbnRTZXR0aW5ncy4nICsgY29udGVudFR5cGUgKyAnIGlzIGRlcHJlY2F0ZWQ7IHNldHRpbmcgJwogICAgICAgICAgICAgICAgICAgKyAnaXQgaGFzIG5vIGVmZmVjdC4nKTsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFtdKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRoZSBzZXQgc2NoZW1hIGluY2x1ZGVkIGluIHRoZSBTY2hlbWEgb2JqZWN0IGlzIGdlbmVyaWMsIHNpbmNlIGl0IHZhcmllcwogICAgLy8gcGVyLXNldHRpbmcuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBldmVyIGZvciBhIHNpbmdsZSBzZXR0aW5nLCBzbyB3ZSBjYW4KICAgIC8vIGVuZm9yY2UgdGhlIHR5cGVzIG1vcmUgdGhvcm91Z2hseS4KICAgIHZhciByYXdTZXRTY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ3NldCcpOwogICAgdmFyIHJhd1NldHRpbmdQYXJhbSA9IHJhd1NldFNjaGVtYVswXTsKICAgIHZhciBwcm9wcyA9ICRPYmplY3QuYXNzaWduKHt9LCByYXdTZXR0aW5nUGFyYW0ucHJvcGVydGllcyk7CiAgICBwcm9wcy5zZXR0aW5nID0gc2V0dGluZ1NjaGVtYTsKICAgIHZhciBtb2RTZXR0aW5nUGFyYW0gPSB7CiAgICAgIG5hbWU6IHJhd1NldHRpbmdQYXJhbS5uYW1lLAogICAgICB0eXBlOiByYXdTZXR0aW5nUGFyYW0udHlwZSwKICAgICAgcHJvcGVydGllczogcHJvcHMsCiAgICB9OwogICAgdmFyIG1vZFNldFNjaGVtYSA9ICRBcnJheS5zbGljZShyYXdTZXRTY2hlbWEpOwogICAgbW9kU2V0U2NoZW1hWzBdID0gbW9kU2V0dGluZ1BhcmFtOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgbW9kU2V0U2NoZW1hKTsKCiAgICByZXR1cm4gc2VuZFJlcXVlc3QoJ2NvbnRlbnRTZXR0aW5ncy5zZXQnLAogICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50VHlwZSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShtb2RTZXRTY2hlbWEpKTsKICB9OwoKICB0aGlzLmNsZWFyID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHZhciBjbGVhclNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnY2xlYXInKTsKICAgIHZhbGlkYXRlKFtkZXRhaWxzLCBjYWxsYmFja10sIGNsZWFyU2NoZW1hKTsKCiAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVMsIGNvbnRlbnRUeXBlKSkgewogICAgICBjb25zb2xlLndhcm4oJ2NvbnRlbnRTZXR0aW5ncy4nICsgY29udGVudFR5cGUgKyAnIGlzIGRlcHJlY2F0ZWQ7ICcKICAgICAgICAgICAgICAgICAgICsgJ2NsZWFyaW5nIGl0IGhhcyBubyBlZmZlY3QuJyk7CiAgICAgICRGdW5jdGlvbi5hcHBseShjYWxsYmFjaywgdW5kZWZpbmVkLCBbXSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gc2VuZFJlcXVlc3QoJ2NvbnRlbnRTZXR0aW5ncy5jbGVhcicsCiAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRUeXBlLCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKGNsZWFyU2NoZW1hKSk7CiAgfTsKCiAgdGhpcy5nZXRSZXNvdXJjZUlkZW50aWZpZXJzID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBzY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ2dldFJlc291cmNlSWRlbnRpZmllcnMnKTsKICAgIHZhbGlkYXRlKFtjYWxsYmFja10sIHNjaGVtYSk7CgogICAgaWYgKCRPYmplY3QuaGFzT3duUHJvcGVydHkoREVQUkVDQVRFRF9DT05URU5UX1RZUEVTLCBjb250ZW50VHlwZSkpIHsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFtdKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgKICAgICAgICAnY29udGVudFNldHRpbmdzLmdldFJlc291cmNlSWRlbnRpZmllcnMnLAogICAgICAgIFtjb250ZW50VHlwZSwgY2FsbGJhY2tdLAogICAgICAgIGV4dGVuZFNjaGVtYShzY2hlbWEpKTsKICB9Owp9CgpleHBvcnRzLiRzZXQoJ0NvbnRlbnRTZXR0aW5nJywgQ29udGVudFNldHRpbmcpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgZGVjbGFyYXRpdmVDb250ZW50IEFQSS4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2RlY2xhcmF0aXZlQ29udGVudCcpOwoKaWYgKCFhcGlCcmlkZ2UpIHsKICB2YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpOwogIHZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ3NjaGVtYVV0aWxzJykudmFsaWRhdGU7CiAgdmFyIGNhbm9uaWNhbGl6ZUNvbXBvdW5kU2VsZWN0b3IgPQogICAgICByZXF1aXJlTmF0aXZlKCdjc3NfbmF0aXZlcycpLkNhbm9uaWNhbGl6ZUNvbXBvdW5kU2VsZWN0b3I7Cn0KCnZhciBzZXRJY29uID0gcmVxdWlyZSgnc2V0SWNvbicpLnNldEljb247CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihhcGkpIHsKICB2YXIgZGVjbGFyYXRpdmVDb250ZW50ID0gYXBpLmNvbXBpbGVkQXBpOwoKICBpZiAoYXBpQnJpZGdlKSB7CiAgICAvLyBWYWxpZGF0aW9uIGZvciBtb3N0IHR5cGVzIGlzIGRvbmUgaW4gdGhlIG5hdGl2ZSBDKysgd2l0aCBuYXRpdmUgYmluZGluZ3MsCiAgICAvLyBidXQgc2V0SWNvbiBpcyBmdW5ueSAoYW5kIHNhZGx5IGJyb2tlbikuIElkZWFsbHksIHdlIGNhbiBtb3ZlIHRoaXMKICAgIC8vIHZhbGlkYXRpb24gZW50aXJlbHkgaW50byB0aGUgbmF0aXZlIGNvZGUsIGFuZCB0aGlzIHdob2xlIGZpbGUgY2FuIGdvCiAgICAvLyBhd2F5LgogICAgdmFyIG5hdGl2ZVNldEljb24gPSBkZWNsYXJhdGl2ZUNvbnRlbnQuU2V0SWNvbjsKICAgIGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uID0gZnVuY3Rpb24ocGFyYW1ldGVycykgewogICAgICAvLyBUT0RPKGRldmxpbik6IFRoaXMgaXMgdmVyeSwgdmVyeSB3cm9uZy4gc2V0SWNvbigpIGlzIHBvdGVudGlhbGx5CiAgICAgIC8vIGFzeW5jaHJvbm91cyAoaW4gdGhlIGNhc2Ugb2YgYSBwYXRoIGJlaW5nIHNwZWNpZmllZCksIHdoaWNoIG1lYW5zIHRoaXMKICAgICAgLy8gYmVjb21lcyBhbiAiYXN5bmNocm9ub3VzIGNvbnN0cnVjdG9yIi4gRXJyb3JzIGNhbiBiZSB0aHJvd24gKmFmdGVyKiB0aGUKICAgICAgLy8gYG5ldyBkZWNsYXJhdGl2ZUNvbnRlbnQuU2V0SWNvbiguLi4pYCBjYWxsLCBhbmQgaW4gdGhlIGFzeW5jIGNhc2VzLAogICAgICAvLyB0aGlzIHdvdWxkbid0IHdvcmsgd2hlbiB3ZSBpbW1lZGlhdGVseSBhZGQgdGhlIGFjdGlvbiB2aWEgYW4gQVBJIGNhbGwKICAgICAgLy8gKGUuZy4sCiAgICAgIC8vICAgY2hyb21lLmRlY2xhcmF0aXZlQ29udGVudC5vblBhZ2VDaGFuZ2UuYWRkUnVsZXMoCiAgICAgIC8vICAgICAgIFt7Y29uZGl0aW9uczogLi4uLCBhY3Rpb25zOiBbIG5ldyBTZXRJY29uKC4uLikgXX1dKTsKICAgICAgLy8gKS4gU29tZSBvZiB0aGlzIGlzIHRyYWNrZWQgaW4gaHR0cDovL2NyYnVnLmNvbS80MTUzMTUuCiAgICAgIHNldEljb24ocGFyYW1ldGVycywgJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oZGF0YSkgewogICAgICAgIC8vIEZha2UgY2FsbGluZyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gYXMgYSBjb25zdHJ1Y3Rvci4KICAgICAgICAkT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5hdGl2ZVNldEljb24ucHJvdG90eXBlKTsKICAgICAgICAkRnVuY3Rpb24uYXBwbHkobmF0aXZlU2V0SWNvbiwgdGhpcywgW2RhdGFdKTsKICAgICAgfSwgdGhpcykpOwogICAgfTsKICAgIHJldHVybjsKICB9CgogIC8vIFJldHVybnMgdGhlIHNjaGVtYSBkZWZpbml0aW9uIG9mIHR5cGUgfHR5cGVJZHwgZGVmaW5lZCBpbiB8bmFtZXNwYWNlfC4KICBmdW5jdGlvbiBnZXRTY2hlbWEodHlwZUlkKSB7CiAgICByZXR1cm4gdXRpbHMubG9va3VwKGFwaS5zY2hlbWEudHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWNsYXJhdGl2ZUNvbnRlbnQuJyArIHR5cGVJZCk7CiAgfQoKICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiBjb25jcmV0ZSBkYXRhdHlwZXMgb2YgdGhlCiAgLy8gZGVjbGFyYXRpdmUgY29udGVudCBBUEkuCiAgLy8gTWFrZXMgc3VyZSB0aGF0IHx0aGlzfCBjb250YWlucyB0aGUgdW5pb24gb2YgcGFyYW1ldGVycyBhbmQKICAvLyB7J2luc3RhbmNlVHlwZSc6ICdkZWNsYXJhdGl2ZUNvbnRlbnQuJyArIHR5cGVJZH0gYW5kIHZhbGlkYXRlcyB0aGUKICAvLyBnZW5lcmF0ZWQgdW5pb24gZGljdGlvbmFyeSBhZ2FpbnN0IHRoZSBzY2hlbWEgZm9yIHx0eXBlSWR8LgogIGZ1bmN0aW9uIHNldHVwSW5zdGFuY2UoaW5zdGFuY2UsIHBhcmFtZXRlcnMsIHR5cGVJZCkgewogICAgZm9yICh2YXIga2V5IGluIHBhcmFtZXRlcnMpIHsKICAgICAgaWYgKCRPYmplY3QuaGFzT3duUHJvcGVydHkocGFyYW1ldGVycywga2V5KSkgewogICAgICAgIGluc3RhbmNlW2tleV0gPSBwYXJhbWV0ZXJzW2tleV07CiAgICAgIH0KICAgIH0KICAgIGluc3RhbmNlLmluc3RhbmNlVHlwZSA9ICdkZWNsYXJhdGl2ZUNvbnRlbnQuJyArIHR5cGVJZDsKICAgIHZhciBzY2hlbWEgPSBnZXRTY2hlbWEodHlwZUlkKTsKICAgIHZhbGlkYXRlKFtpbnN0YW5jZV0sIFtzY2hlbWFdKTsKICB9CgogIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZUNzc1NlbGVjdG9ycyhzZWxlY3RvcnMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjYW5vbmljYWxpemVkU2VsZWN0b3IgPSBjYW5vbmljYWxpemVDb21wb3VuZFNlbGVjdG9yKHNlbGVjdG9yc1tpXSk7CiAgICAgIGlmIChjYW5vbmljYWxpemVkU2VsZWN0b3IgPT0gJycpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICdFbGVtZW50IG9mIFwnY3NzXCcgYXJyYXkgbXVzdCBiZSBhICcgKwogICAgICAgICAgICAnbGlzdCBvZiB2YWxpZCBjb21wb3VuZCBzZWxlY3RvcnM6ICcgKwogICAgICAgICAgICBzZWxlY3RvcnNbaV0pOwogICAgICB9CiAgICAgIHNlbGVjdG9yc1tpXSA9IGNhbm9uaWNhbGl6ZWRTZWxlY3RvcjsKICAgIH0KICB9CgogIC8vIFNldHVwIGFsbCBkYXRhIHR5cGVzIGZvciB0aGUgZGVjbGFyYXRpdmUgY29udGVudCBBUEkuCiAgZGVjbGFyYXRpdmVDb250ZW50LlBhZ2VTdGF0ZU1hdGNoZXIgPSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7CiAgICBzZXR1cEluc3RhbmNlKHRoaXMsIHBhcmFtZXRlcnMsICdQYWdlU3RhdGVNYXRjaGVyJyk7CiAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLCAnY3NzJykpIHsKICAgICAgY2Fub25pY2FsaXplQ3NzU2VsZWN0b3JzKHRoaXMuY3NzKTsKICAgIH0KICB9OwogIGRlY2xhcmF0aXZlQ29udGVudC5TaG93UGFnZUFjdGlvbiA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldHVwSW5zdGFuY2UodGhpcywgcGFyYW1ldGVycywgJ1Nob3dQYWdlQWN0aW9uJyk7CiAgfTsKICBkZWNsYXJhdGl2ZUNvbnRlbnQuUmVxdWVzdENvbnRlbnRTY3JpcHQgPSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7CiAgICBzZXR1cEluc3RhbmNlKHRoaXMsIHBhcmFtZXRlcnMsICdSZXF1ZXN0Q29udGVudFNjcmlwdCcpOwogIH07CiAgLy8gVE9ETyhyb2Nrb3QpOiBEbyBub3QgZXhwb3NlIHRoaXMgaW4gTTM5IHN0YWJsZS4gTWFraW5nIHRoaXMgcmVzdHJpY3Rpb24KICAvLyBwb3NzaWJsZSB3aWxsIHRha2Ugc29tZSBleHRyYSB3b3JrLiBTZWUgaHR0cDovL2NyYnVnLmNvbS80MTUzMTUKICAvLyBOb3RlOiBTZWUgYWxzbyB0aGUgU2V0SWNvbiB3cmFwcGVyIGFib3ZlIGZvciBtb3JlIGlzc3Vlcy4KICBkZWNsYXJhdGl2ZUNvbnRlbnQuU2V0SWNvbiA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldEljb24ocGFyYW1ldGVycywgJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oZGF0YSkgewogICAgICBzZXR1cEluc3RhbmNlKHRoaXMsIGRhdGEsICdTZXRJY29uJyk7CiAgICB9LCB0aGlzKSk7CiAgfTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBkZXNrdG9wQ2FwdHVyZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Rlc2t0b3BDYXB0dXJlJyk7CnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKdmFyIGlkR2VuZXJhdG9yID0gcmVxdWlyZU5hdGl2ZSgnaWRfZ2VuZXJhdG9yJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIHZhciBwZW5kaW5nUmVxdWVzdHMgPSB7fTsKCiAgZnVuY3Rpb24gb25SZXF1ZXN0UmVzdWx0KGlkLCByZXN1bHQsIG9wdGlvbnMpIHsKICAgIGlmIChpZCBpbiBwZW5kaW5nUmVxdWVzdHMpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0c1tpZF07CiAgICAgIGNhbGxiYWNrKHJlc3VsdCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY2hvb3NlRGVza3RvcE1lZGlhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihzb3VyY2VzLCB0YXJnZXRfdGFiLCBjYWxsYmFjaykgewogICAgLy8gfHRhcmdldF90YWJ8IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlci4KICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNhbGxiYWNrID0gdGFyZ2V0X3RhYjsKICAgICAgdGFyZ2V0X3RhYiA9IHVuZGVmaW5lZDsKICAgIH0KICAgIHZhciBpZCA9IGlkR2VuZXJhdG9yLkdldE5leHRJZCgpOwogICAgcGVuZGluZ1JlcXVlc3RzW2lkXSA9IGNhbGxiYWNrOwogICAgc2VuZFJlcXVlc3QoJ2Rlc2t0b3BDYXB0dXJlLmNob29zZURlc2t0b3BNZWRpYScsCiAgICAgICAgICAgICAgICBbaWQsIHNvdXJjZXMsIHRhcmdldF90YWIsCiAgICAgICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQob25SZXF1ZXN0UmVzdWx0LCBudWxsLCBpZCldLAogICAgICAgICAgICAgICAgYXBpQnJpZGdlID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgcmV0dXJuIGlkOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY2FuY2VsQ2hvb3NlRGVza3RvcE1lZGlhJywgZnVuY3Rpb24oaWQpIHsKICAgIGlmIChpZCBpbiBwZW5kaW5nUmVxdWVzdHMpIHsKICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0c1tpZF07CiAgICAgIHNlbmRSZXF1ZXN0KCdkZXNrdG9wQ2FwdHVyZS5jYW5jZWxDaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgICBbaWRdLCBhcGlCcmlkZ2UgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIH0KICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBkZXZlbG9wZXJQcml2YXRlIEFQSS4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2RldmVsb3BlclByaXZhdGUnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgLy8gQ29udmVydHMgdGhlIGFyZ3VtZW50IG9mIHxmdW5jdGlvbk5hbWV8IGZyb20gRGlyZWN0b3J5RW50cnkgdG8gVVJMLgogIGZ1bmN0aW9uIGJpbmRGaWxlU3lzdGVtRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7CiAgICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb24oZGlyZWN0b3J5RW50cnksIGNhbGxiYWNrKSB7CiAgICAgICAgICB2YXIgZmlsZVN5c3RlbU5hbWUgPSBkaXJlY3RvcnlFbnRyeS5maWxlc3lzdGVtLm5hbWU7CiAgICAgICAgICB2YXIgcmVsYXRpdmVQYXRoID0gJFN0cmluZy5zbGljZShkaXJlY3RvcnlFbnRyeS5mdWxsUGF0aCwgMSk7CiAgICAgICAgICB2YXIgdXJsID0gZGlyZWN0b3J5RW50cnkudG9VUkwoKTsKICAgICAgICAgIHJldHVybiBbZmlsZVN5c3RlbU5hbWUsIHJlbGF0aXZlUGF0aCwgdXJsLCBjYWxsYmFja107CiAgICB9KTsKICB9CgogIGJpbmRGaWxlU3lzdGVtRnVuY3Rpb24oJ2xvYWREaXJlY3RvcnknKTsKCiAgLy8gZGV2ZWxvcGVyUHJpdmF0ZS5lbmFibGUgaXMgdGhlIHNhbWUgYXMgY2hyb21lLm1hbmFnZW1lbnQuc2V0RW5hYmxlZC4KICAvLyBUT0RPKGRldmxpbik6IE1pZ3JhdGUgY2FsbGVycyBvZmYgZGV2ZWxvcGVyUHJpdmF0ZS5lbmFibGUuCiAgYmluZGluZ3NBUEkuY29tcGlsZWRBcGkuZW5hYmxlID0gY2hyb21lLm1hbmFnZW1lbnQuc2V0RW5hYmxlZDsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2FsbG93RmlsZUFjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oaWQsIGFsbG93LCBjYWxsYmFjaykgewogICAgY2hyb21lLmRldmVsb3BlclByaXZhdGUudXBkYXRlRXh0ZW5zaW9uQ29uZmlndXJhdGlvbigKICAgICAgICB7ZXh0ZW5zaW9uSWQ6IGlkLCBmaWxlQWNjZXNzOiBhbGxvd30sIGNhbGxiYWNrKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2FsbG93SW5jb2duaXRvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihpZCwgYWxsb3csIGNhbGxiYWNrKSB7CiAgICBjaHJvbWUuZGV2ZWxvcGVyUHJpdmF0ZS51cGRhdGVFeHRlbnNpb25Db25maWd1cmF0aW9uKAogICAgICAgIHtleHRlbnNpb25JZDogaWQsIGluY29nbml0b0FjY2VzczogYWxsb3d9LCBjYWxsYmFjayk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdpbnNwZWN0JywgZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHsKICAgIHZhciByZW5kZXJWaWV3SWQgPSBvcHRpb25zLnJlbmRlcl92aWV3X2lkOwogICAgaWYgKHR5cGVvZiByZW5kZXJWaWV3SWQgPT0gJ3N0cmluZycpIHsKICAgICAgcmVuZGVyVmlld0lkID0gcGFyc2VJbnQocmVuZGVyVmlld0lkKTsKICAgICAgaWYgKGlzTmFOKHJlbmRlclZpZXdJZCkpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciByZW5kZXJfdmlld19pZCcpOwogICAgfQogICAgdmFyIHJlbmRlclByb2Nlc3NJZCA9IG9wdGlvbnMucmVuZGVyX3Byb2Nlc3NfaWQ7CiAgICBpZiAodHlwZW9mIHJlbmRlclByb2Nlc3NJZCA9PSAnc3RyaW5nJykgewogICAgICByZW5kZXJQcm9jZXNzSWQgPSBwYXJzZUludChyZW5kZXJQcm9jZXNzSWQpOwogICAgICBpZiAoaXNOYU4ocmVuZGVyUHJvY2Vzc0lkKSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJlbmRlcl9wcm9jZXNzX2lkJyk7CiAgICB9CiAgICBjaHJvbWUuZGV2ZWxvcGVyUHJpdmF0ZS5vcGVuRGV2VG9vbHMoewogICAgICAgIGV4dGVuc2lvbklkOiBvcHRpb25zLmV4dGVuc2lvbl9pZCwKICAgICAgICByZW5kZXJQcm9jZXNzSWQ6IHJlbmRlclByb2Nlc3NJZCwKICAgICAgICByZW5kZXJWaWV3SWQ6IHJlbmRlclZpZXdJZCwKICAgICAgICBpbmNvZ25pdG86IG9wdGlvbnMuaW5jb2duaXRvCiAgICB9LCBjYWxsYmFjayk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZ3MgZm9yIHRoZSBkb3dubG9hZHMgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdkb3dubG9hZHMnKTsKdmFyIGRvd25sb2Fkc0ludGVybmFsID0KICAgIGdldEludGVybmFsQXBpID8KICAgICAgICBnZXRJbnRlcm5hbEFwaSgnZG93bmxvYWRzSW50ZXJuYWwnKSA6CiAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdkb3dubG9hZHNJbnRlcm5hbCcpLmdlbmVyYXRlKCk7CnZhciByZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5yZWdpc3RlckV2ZW50QXJndW1lbnRNYXNzYWdlciwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykucmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyOwoKcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyKCdkb3dubG9hZHMub25EZXRlcm1pbmluZ0ZpbGVuYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGFyZ3MsIGRpc3BhdGNoKSB7CiAgdmFyIGRvd25sb2FkSXRlbSA9IGFyZ3NbMF07CiAgLy8gQ29weSB0aGUgaWQgc28gdGhhdCBleHRlbnNpb25zIGNhbid0IGNoYW5nZSBpdC4KICB2YXIgZG93bmxvYWRJZCA9IGRvd25sb2FkSXRlbS5pZDsKICB2YXIgc3VnZ2VzdGFibGUgPSB0cnVlOwogIGZ1bmN0aW9uIGlzVmFsaWRSZXN1bHQocmVzdWx0KSB7CiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlb2YocmVzdWx0KSAhPSAnb2JqZWN0JykgewogICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogSW52b2NhdGlvbiBvZiBmb3JtIHN1Z2dlc3QoJyArIHR5cGVvZihyZXN1bHQpICsKICAgICAgICAgICAgICAgICAgICAnKSBkb2VzblwndCBtYXRjaCBkZWZpbml0aW9uIHN1Z2dlc3Qoe2ZpbGVuYW1lOiBzdHJpbmcsICcgKwogICAgICAgICAgICAgICAgICAgICdjb25mbGljdEFjdGlvbjogc3RyaW5nfSknKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICgodHlwZW9mKHJlc3VsdC5maWxlbmFtZSkgIT0gJ3N0cmluZycpIHx8CiAgICAgICAgICAgICAgIChyZXN1bHQuZmlsZW5hbWUubGVuZ3RoID09IDApKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAiZmlsZW5hbWUiIHBhcmFtZXRlciB0byBzdWdnZXN0KCkgbXVzdCBiZSBhICcgKwogICAgICAgICAgICAgICAgICAgICdub24tZW1wdHkgc3RyaW5nJyk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoW3VuZGVmaW5lZCwgJ3VuaXF1aWZ5JywgJ292ZXJ3cml0ZScsICdwcm9tcHQnXS5pbmRleE9mKAogICAgICAgICAgICAgICAgIHJlc3VsdC5jb25mbGljdEFjdGlvbikgPCAwKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAiY29uZmxpY3RBY3Rpb24iIHBhcmFtZXRlciB0byBzdWdnZXN0KCkgbXVzdCBiZSAnICsKICAgICAgICAgICAgICAgICAgICAnb25lIG9mIHVuZGVmaW5lZCwgInVuaXF1aWZ5IiwgIm92ZXJ3cml0ZSIsICJwcm9tcHQiJyk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBzdWdnZXN0Q2FsbGJhY2socmVzdWx0KSB7CiAgICBpZiAoIXN1Z2dlc3RhYmxlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ3N1Z2dlc3RDYWxsYmFjayBtYXkgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4nKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VnZ2VzdGFibGUgPSBmYWxzZTsKICAgIGlmIChpc1ZhbGlkUmVzdWx0KHJlc3VsdCkpIHsKICAgICAgZG93bmxvYWRzSW50ZXJuYWwuZGV0ZXJtaW5lRmlsZW5hbWUoCiAgICAgICAgICBkb3dubG9hZElkLCByZXN1bHQuZmlsZW5hbWUsIHJlc3VsdC5jb25mbGljdEFjdGlvbiB8fCAiIik7CiAgICB9IGVsc2UgewogICAgICBkb3dubG9hZHNJbnRlcm5hbC5kZXRlcm1pbmVGaWxlbmFtZShkb3dubG9hZElkLCAiIiwgIiIpOwogICAgfQogIH0KICB0cnkgewogICAgdmFyIHJlc3VsdHMgPSBkaXNwYXRjaChbZG93bmxvYWRJdGVtLCBzdWdnZXN0Q2FsbGJhY2tdKTsKICAgIHZhciBhc3luYyA9IChyZXN1bHRzICYmCiAgICAgICAgICAgICAgICAgcmVzdWx0cy5yZXN1bHRzICYmCiAgICAgICAgICAgICAgICAgKHJlc3VsdHMucmVzdWx0cy5sZW5ndGggIT0gMCkgJiYKICAgICAgICAgICAgICAgICAocmVzdWx0cy5yZXN1bHRzWzBdID09PSB0cnVlKSk7CiAgICBpZiAoc3VnZ2VzdGFibGUgJiYgIWFzeW5jKQogICAgICBzdWdnZXN0Q2FsbGJhY2soKTsKICB9IGNhdGNoIChlKSB7CiAgICBzdWdnZXN0Q2FsbGJhY2soKTsKICAgIHRocm93IGU7CiAgfQp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgp2YXIgRXZlbnQgPSByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLkV2ZW50OwoKLy8gVGhlIEVhc3lVbmxvY2tQcm94aW1pdHlSZXF1aXJlZCBvYmplY3QgaXMganVzdCBhIHN0dWIgdGhhdCBoYXMgYW4gb25DaGFuZ2UKLy8gZXZlbnQsIHdoaWNoIGlzIG5ldmVyIHRyaWdnZXJlZC4KLy8gVE9ETyhkZXZsaW4pOiBSZW1vdmUgdGhpcyBvbmNlIHRoZSBwcmVmZXJlbmNlc1ByaXZhdGUgQVBJIGlzIGZ1bGx5IHJlbW92ZWQuCi8vIGh0dHBzOi8vY3JidWcuY29tLzU5MzE2NgpmdW5jdGlvbiBFYXN5VW5sb2NrUHJveGltaXR5UmVxdWlyZWQocHJlZktleSwgdmFsdWVTY2hlbWEsIHNjaGVtYSkgewogIC8vIE5vdGU6IHRlY2huaWNhbGx5LCBleHRlbnNpb25zIGNvdWxkIGludGVyY2VwdCB0aGlzIHRocm91Z2ggYSBzZXR0ZXIgb24KICAvLyBPYmplY3QucHJvdG90eXBlKCkuIFdlIGRvbid0IHJlYWxseSBjYXJlLCBiZWNhdXNlIGEpIHRoaXMgaXMgb25seSBmb3IgYQogIC8vIHByaXZhdGUgQVBJLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB1bnRydXN0ZWQgY29kZSwgYW5kIGIpCiAgLy8gdGhpcyBpcyBhbiBhbm9ueW1vdXMgZXZlbnQsIHdoaWNoIGV4cG9zZXMgbm8gYXR0YWNrIHN1cmZhY2UgYW5kIHdpbGwgYmUKICAvLyBleHBvc2VkIHRvIHRoZSBleHRlbnNpb24gYW55d2F5LgogIHRoaXMub25DaGFuZ2UgPSBuZXcgRXZlbnQoKTsKfTsKCmV4cG9ydHMuJHNldCgnRWFzeVVubG9ja1Byb3hpbWl0eVJlcXVpcmVkJywgRWFzeVVubG9ja1Byb3hpbWl0eVJlcXVpcmVkKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5ncyBmb3IgdGhlIGZlZWRiYWNrUHJpdmF0ZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2ZlZWRiYWNrUHJpdmF0ZScpOwoKdmFyIGJsb2JOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnYmxvYl9uYXRpdmVzJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgInNlbmRGZWVkYmFjayIsIGZ1bmN0aW9uKGZlZWRiYWNrSW5mbywgY2FsbGJhY2spIHsKICAgIHZhciBhdHRhY2hlZEZpbGVCbG9iVXVpZCA9ICcnOwogICAgdmFyIHNjcmVlbnNob3RCbG9iVXVpZCA9ICcnOwoKICAgIGlmIChmZWVkYmFja0luZm8uYXR0YWNoZWRGaWxlKQogICAgICBhdHRhY2hlZEZpbGVCbG9iVXVpZCA9CiAgICAgICAgICBibG9iTmF0aXZlcy5HZXRCbG9iVXVpZChmZWVkYmFja0luZm8uYXR0YWNoZWRGaWxlLmRhdGEpOwogICAgaWYgKGZlZWRiYWNrSW5mby5zY3JlZW5zaG90KQogICAgICBzY3JlZW5zaG90QmxvYlV1aWQgPQogICAgICAgICAgYmxvYk5hdGl2ZXMuR2V0QmxvYlV1aWQoZmVlZGJhY2tJbmZvLnNjcmVlbnNob3QpOwoKICAgIGZlZWRiYWNrSW5mby5hdHRhY2hlZEZpbGVCbG9iVXVpZCA9IGF0dGFjaGVkRmlsZUJsb2JVdWlkOwogICAgZmVlZGJhY2tJbmZvLnNjcmVlbnNob3RCbG9iVXVpZCA9IHNjcmVlbnNob3RCbG9iVXVpZDsKCiAgICByZXR1cm4gW2ZlZWRiYWNrSW5mbywgY2FsbGJhY2tdOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIEdDTSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2djbScpOwp2YXIgZm9yRWFjaCA9IHJlcXVpcmUoJ3V0aWxzJykuZm9yRWFjaDsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICB2YXIgZ2NtID0gYmluZGluZ3NBUEkuY29tcGlsZWRBcGk7CgogIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAnc2VuZCcsIGZ1bmN0aW9uKG1lc3NhZ2UsIGNhbGxiYWNrKSB7CiAgICAgIC8vIFZhbGlkYXRlIG1lc3NhZ2UuZGF0YS4KICAgICAgdmFyIHBheWxvYWRTaXplID0gMDsKICAgICAgZm9yRWFjaChtZXNzYWdlLmRhdGEsIGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGggPT0gMCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiT25lIG9mIGRhdGEga2V5cyBpcyBlbXB0eS4iKTsKCiAgICAgICAgdmFyIGxvd2VyQ2FzZWRQcm9wZXJ0eSA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgLy8gSXNzdWUgYW4gZXJyb3IgZm9yIGZvcmJpZGRlbiBwcmVmaXhlcyBvZiBwcm9wZXJ0eSBuYW1lcy4KICAgICAgICBpZiAobG93ZXJDYXNlZFByb3BlcnR5LnN0YXJ0c1dpdGgoImdvb2cuIikgfHwKICAgICAgICAgICAgbG93ZXJDYXNlZFByb3BlcnR5LnN0YXJ0c1dpdGgoImdvb2dsZSIpIHx8CiAgICAgICAgICAgIHByb3BlcnR5LnN0YXJ0c1dpdGgoImNvbGxhcHNlX2tleSIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YSBrZXk6ICIgKyBwcm9wZXJ0eSk7CiAgICAgICAgfQoKICAgICAgICBwYXlsb2FkU2l6ZSArPSBwcm9wZXJ0eS5sZW5ndGggKyB2YWx1ZS5sZW5ndGg7CiAgICAgIH0pOwoKICAgICAgaWYgKHBheWxvYWRTaXplID4gZ2NtLk1BWF9NRVNTQUdFX1NJWkUpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXlsb2FkIGV4Y2VlZGVkIGFsbG93ZWQgc2l6ZSBsaW1pdC4gUGF5bG9hZCBzaXplIGlzOiAiCiAgICAgICAgICAgICsgcGF5bG9hZFNpemUpOwoKICAgICAgaWYgKHBheWxvYWRTaXplID09IDApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBkYXRhIHRvIHNlbmQuIik7CgogICAgICByZXR1cm4gYXJndW1lbnRzOwogICAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgSWRlbnRpdHkgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdpZGVudGl0eScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZywgaWQsIGNvbnRleHRUeXBlKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmcuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0UmVkaXJlY3RVUkwnLCBmdW5jdGlvbihwYXRoKSB7CiAgICBpZiAocGF0aCA9PT0gbnVsbCB8fCBwYXRoID09PSB1bmRlZmluZWQpCiAgICAgIHBhdGggPSAnLyc7CiAgICBlbHNlCiAgICAgIHBhdGggPSBTdHJpbmcocGF0aCk7CiAgICBpZiAocGF0aFswXSAhPSAnLycpCiAgICAgIHBhdGggPSAnLycgKyBwYXRoOwogICAgcmV0dXJuICdodHRwczovLycgKyBpZCArICcuY2hyb21pdW1hcHAub3JnJyArIHBhdGg7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgaW1hZ2Ugd3JpdGVyIHByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnaW1hZ2VXcml0ZXJQcml2YXRlJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICd3cml0ZUZyb21GaWxlJywgZnVuY3Rpb24oZGV2aWNlLCBmaWxlRW50cnksIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICB2YXIgZmlsZVN5c3RlbU5hbWUgPSBmaWxlRW50cnkuZmlsZXN5c3RlbS5uYW1lOwogICAgdmFyIHJlbGF0aXZlUGF0aCA9ICRTdHJpbmcuc2xpY2UoZmlsZUVudHJ5LmZ1bGxQYXRoLCAxKTsKICAgIHJldHVybiBbZGV2aWNlLCBmaWxlU3lzdGVtTmFtZSwgcmVsYXRpdmVQYXRoLCBjYWxsYmFja107CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGlucHV0IGltZSBBUEkuIE9ubHkgaW5qZWN0ZWQgaW50byB0aGUKLy8gdjggY29udGV4dHMgZm9yIGV4dGVuc2lvbnMgd2hpY2ggaGF2ZSBwZXJtaXNzaW9uIGZvciB0aGUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdpbnB1dC5pbWUnKTsKdmFyIGFwcFdpbmRvd05hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdhcHBfd2luZG93X25hdGl2ZXMnKTsKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7CgovLyBUT0RPKGNyYnVnLmNvbS83MzM4MjUpOiBUaGVzZSBiaW5kaW5ncyBoYXZlIHNvbWUgaXNzdWVzLgoKdmFyIGlucHV0SW1lOwpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ2lucHV0LmltZS5vbktleUV2ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGFyZ3MsIGRpc3BhdGNoKSB7CiAgdmFyIGtleURhdGEgPSBhcmdzWzFdOwogIHZhciByZXN1bHQgPSBmYWxzZTsKICB0cnkgewogICAgLy8gZGlzcGF0Y2goKSBpcyB3ZWlyZCAtIGl0IHJldHVybnMgYW4gb2JqZWN0IHtyZXN1bHRzOiBhcnJheTxyZXN1bHRzPn0gaWZmCiAgICAvLyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcmVzdWx0IHZhbHVlIHRoYXQgIT09IHVuZGVmaW5lZC4gU2luY2Ugb25LZXlFdmVudAogICAgLy8gaGFzIGEgbWF4aW11bSBvZiBvbmUgbGlzdGVuZXIsIHdlIGtub3cgdGhhdCBhbnkgcmVzdWx0IHdlIGZpbmQgaXMgdGhlIG9uZQogICAgLy8gd2UncmUgaW50ZXJlc3RlZCBpbi4KICAgIHZhciBkaXNwYXRjaFJlc3VsdCA9IGRpc3BhdGNoKGFyZ3MpOwogICAgaWYgKGRpc3BhdGNoUmVzdWx0ICYmIGRpc3BhdGNoUmVzdWx0LnJlc3VsdHMpCiAgICAgIHJlc3VsdCA9IGRpc3BhdGNoUmVzdWx0LnJlc3VsdHNbMF07CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBmb3Igb25LZXlFdmVudDogJyArIGUuc3RhY2spOwogIH0KICBpZiAoIWlucHV0SW1lLm9uS2V5RXZlbnQuYXN5bmMpCiAgICBpbnB1dEltZS5rZXlFdmVudEhhbmRsZWQoa2V5RGF0YS5yZXF1ZXN0SWQsIHJlc3VsdCk7Cn0pOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYXBpKSB7CiBpbnB1dEltZSA9IGFwaS5jb21waWxlZEFwaTsKCiAgdmFyIG9yaWdpbmFsQWRkTGlzdGVuZXIgPSBpbnB1dEltZS5vbktleUV2ZW50LmFkZExpc3RlbmVyOwogIGlucHV0SW1lLm9uS2V5RXZlbnQuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbihjYiwgb3B0X2V4dHJhSW5mbykgewogICAgaW5wdXRJbWUub25LZXlFdmVudC5hc3luYyA9IGZhbHNlOwogICAgaWYgKG9wdF9leHRyYUluZm8gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdF9leHRyYUluZm8ubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAob3B0X2V4dHJhSW5mb1tpXSA9PSAnYXN5bmMnKSB7CiAgICAgICAgICBpbnB1dEltZS5vbktleUV2ZW50LmFzeW5jID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgICRGdW5jdGlvbi5jYWxsKG9yaWdpbmFsQWRkTGlzdGVuZXIsIHRoaXMsIGNiKTsKICB9OwoKICBhcGkuYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdjcmVhdGVXaW5kb3cnLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgd2luZG93UGFyYW1zKSB7CiAgICBpZiAoIWNhbGxiYWNrKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciB2aWV3OwogICAgaWYgKHdpbmRvd1BhcmFtcyAmJiB3aW5kb3dQYXJhbXMuZnJhbWVJZCkgewogICAgICB2aWV3ID0gYXBwV2luZG93TmF0aXZlcy5HZXRGcmFtZSgKICAgICAgICAgIHdpbmRvd1BhcmFtcy5mcmFtZUlkLCBmYWxzZSAvKiBub3RpZnlCcm93c2VyICovKTsKICAgICAgdmlldy5pZCA9IHdpbmRvd1BhcmFtcy5mcmFtZUlkOwogICAgfQogICAgY2FsbGJhY2sodmlldyk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIE1lZGlhIEdhbGxlcnkgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdtZWRpYUdhbGxlcmllcycpOwp2YXIgYmxvYk5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdibG9iX25hdGl2ZXMnKTsKdmFyIG1lZGlhR2FsbGVyaWVzTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ21lZGlhR2FsbGVyaWVzJyk7CnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKCnZhciBibG9ic0F3YWl0aW5nTWV0YWRhdGEgPSB7fTsKdmFyIG1lZGlhR2FsbGVyaWVzTWV0YWRhdGEgPSB7fTsKCmZ1bmN0aW9uIGNyZWF0ZUZpbGVTeXN0ZW1PYmplY3RzQW5kVXBkYXRlTWV0YWRhdGEocmVzcG9uc2UpIHsKICB2YXIgcmVzdWx0ID0gW107CiAgbWVkaWFHYWxsZXJpZXNNZXRhZGF0YSA9IHt9OyAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIG1ldGFkYXRhLgogIGlmIChyZXNwb25zZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZmlsZXN5c3RlbSA9IG1lZGlhR2FsbGVyaWVzTmF0aXZlcy5HZXRNZWRpYUZpbGVTeXN0ZW1PYmplY3QoCiAgICAgICAgICByZXNwb25zZVtpXS5mc2lkKTsKICAgICAgJEFycmF5LnB1c2gocmVzdWx0LCBmaWxlc3lzdGVtKTsKICAgICAgdmFyIG1ldGFkYXRhID0gcmVzcG9uc2VbaV07CiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5mc2lkOwogICAgICBtZWRpYUdhbGxlcmllc01ldGFkYXRhW2ZpbGVzeXN0ZW0ubmFtZV0gPSBtZXRhZGF0YTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgLy8gZ2V0TWVkaWFGaWxlU3lzdGVtcyBhbmQgYWRkVXNlclNlbGVjdGVkRm9sZGVyIHVzZSBhIGN1c3RvbSBjYWxsYmFjayBzbyB0aGF0CiAgLy8gdGhleSBjYW4gaW5zdGFudGlhdGUgYW5kIHJldHVybiBhbiBhcnJheSBvZiBmaWxlIHN5c3RlbSBvYmplY3RzLgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnZ2V0TWVkaWFGaWxlU3lzdGVtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUZpbGVTeXN0ZW1PYmplY3RzQW5kVXBkYXRlTWV0YWRhdGEocmVzcG9uc2UpOwogICAgaWYgKGNhbGxiYWNrKQogICAgICBjYWxsYmFjayhyZXN1bHQpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2FkZFVzZXJTZWxlY3RlZEZvbGRlcicsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgdmFyIGZpbGVTeXN0ZW1zID0gW107CiAgICB2YXIgc2VsZWN0ZWRGaWxlU3lzdGVtTmFtZSA9ICIiOwogICAgaWYgKHJlc3BvbnNlICYmICdtZWRpYUZpbGVTeXN0ZW1zJyBpbiByZXNwb25zZSAmJgogICAgICAgICdzZWxlY3RlZEZpbGVTeXN0ZW1JbmRleCcgaW4gcmVzcG9uc2UpIHsKICAgICAgZmlsZVN5c3RlbXMgPSBjcmVhdGVGaWxlU3lzdGVtT2JqZWN0c0FuZFVwZGF0ZU1ldGFkYXRhKAogICAgICAgICAgcmVzcG9uc2VbJ21lZGlhRmlsZVN5c3RlbXMnXSk7CiAgICAgIHZhciBzZWxlY3RlZEZpbGVTeXN0ZW1JbmRleCA9IHJlc3BvbnNlWydzZWxlY3RlZEZpbGVTeXN0ZW1JbmRleCddOwogICAgICBpZiAoc2VsZWN0ZWRGaWxlU3lzdGVtSW5kZXggPj0gMCkgewogICAgICAgIHNlbGVjdGVkRmlsZVN5c3RlbU5hbWUgPSBmaWxlU3lzdGVtc1tzZWxlY3RlZEZpbGVTeXN0ZW1JbmRleF0ubmFtZTsKICAgICAgfQogICAgfQogICAgaWYgKGNhbGxiYWNrKQogICAgICBjYWxsYmFjayhmaWxlU3lzdGVtcywgc2VsZWN0ZWRGaWxlU3lzdGVtTmFtZSk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRNZWRpYUZpbGVTeXN0ZW1NZXRhZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZmlsZXN5c3RlbSkgewogICAgaWYgKGZpbGVzeXN0ZW0gJiYgZmlsZXN5c3RlbS5uYW1lICYmCiAgICAgICAgZmlsZXN5c3RlbS5uYW1lIGluIG1lZGlhR2FsbGVyaWVzTWV0YWRhdGEpIHsKICAgICAgcmV0dXJuIG1lZGlhR2FsbGVyaWVzTWV0YWRhdGFbZmlsZXN5c3RlbS5uYW1lXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICduYW1lJzogJycsCiAgICAgICdnYWxsZXJ5SWQnOiAnJywKICAgICAgJ2lzUmVtb3ZhYmxlJzogZmFsc2UsCiAgICAgICdpc01lZGlhRGV2aWNlJzogZmFsc2UsCiAgICAgICdpc0F2YWlsYWJsZSc6IGZhbHNlLAogICAgfTsKICB9KTsKCiAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFDYWxsYmFjayh1dWlkLCBuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5hdHRhY2hlZEltYWdlc0Jsb2JJbmZvKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2UuYXR0YWNoZWRJbWFnZXNCbG9iSW5mby5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBibG9iSW5mbyA9IHJlc3BvbnNlLmF0dGFjaGVkSW1hZ2VzQmxvYkluZm9baV07CiAgICAgICAgdmFyIGJsb2IgPSBibG9iTmF0aXZlcy5UYWtlQnJvd3NlclByb2Nlc3NCbG9iKAogICAgICAgICAgICBibG9iSW5mby5ibG9iVVVJRCwgYmxvYkluZm8udHlwZSwgYmxvYkluZm8uc2l6ZSk7CiAgICAgICAgcmVzcG9uc2UubWV0YWRhdGEuYXR0YWNoZWRJbWFnZXMucHVzaChibG9iKTsKICAgICAgfQogICAgfQoKICAgIGlmIChjYWxsYmFjaykKICAgICAgY2FsbGJhY2socmVzcG9uc2UgPyByZXNwb25zZS5tZXRhZGF0YSA6IG51bGwpOwoKICAgIGRlbGV0ZSBibG9ic0F3YWl0aW5nTWV0YWRhdGFbdXVpZF07CiAgfQoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0TWV0YWRhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1lZGlhRmlsZSwgb3B0aW9ucywgY2FsbGJhY2spIHsKICAgIHZhciBibG9iVXVpZCA9IGJsb2JOYXRpdmVzLkdldEJsb2JVdWlkKG1lZGlhRmlsZSkKICAgIC8vIFN0b3JlIHRoZSBibG9iIGluIGEgZ2xvYmFsIG9iamVjdCB0byBrZWVwIGl0cyByZWZjb3VudCBub256ZXJvIC0tIHRoaXMKICAgIC8vIHByZXZlbnRzIHRoZSBvYmplY3QgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCBiZWZvcmUgYW55IG1ldGFkYXRhCiAgICAvLyBwYXJzaW5nIGdldHMgdG8gb2NjdXIgKHNlZSBjcmJ1Zy5jb20vNDE1NzkyKS4KICAgIGJsb2JzQXdhaXRpbmdNZXRhZGF0YVtibG9iVXVpZF0gPSBtZWRpYUZpbGU7CgogICAgdmFyIG9wdEFyZ3MgPSB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgY3VzdG9tQ2FsbGJhY2s6ICRGdW5jdGlvbi5iaW5kKGdldE1ldGFkYXRhQ2FsbGJhY2ssIG51bGwsIGJsb2JVdWlkKSwKICAgIH07CgogICAgc2VuZFJlcXVlc3QoJ21lZGlhR2FsbGVyaWVzLmdldE1ldGFkYXRhJywgW2Jsb2JVdWlkLCBvcHRpb25zLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLCBvcHRBcmdzKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmdzIGZvciB0aGUgbm90aWZpY2F0aW9ucyBBUEkuCi8vCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnbm90aWZpY2F0aW9ucycpOwoKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgZXhjZXB0aW9uSGFuZGxlciA9IHJlcXVpcmUoJ3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyJyk7CnZhciBpbWFnZVV0aWwgPSByZXF1aXJlKCdpbWFnZVV0aWwnKTsKdmFyIG5vdGlmaWNhdGlvbnNQcml2YXRlID0gcmVxdWlyZU5hdGl2ZSgnbm90aWZpY2F0aW9uc19wcml2YXRlJyk7Cgp2YXIganNMYXN0RXJyb3IgPSBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHJlcXVpcmUoJ2xhc3RFcnJvcicpOwpmdW5jdGlvbiBydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IobmFtZSwgbWVzc2FnZSwgc3RhY2ssIGNhbGxiYWNrLCBhcmdzKSB7CiAgaWYgKGJpbmRpbmdVdGlsKSB7CiAgICBiaW5kaW5nVXRpbC5ydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IobWVzc2FnZSwgZnVuY3Rpb24oKSB7CiAgICAgICRGdW5jdGlvbi5hcHBseShjYWxsYmFjaywgbnVsbCwgYXJncyk7CiAgICB9KTsKICB9IGVsc2UgewogICAganNMYXN0RXJyb3IucnVuKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYWxsYmFjaywgYXJncyk7CiAgfQp9CgpmdW5jdGlvbiBpbWFnZURhdGFTZXR0ZXIoY29udGV4dCwga2V5KSB7CiAgdmFyIGYgPSBmdW5jdGlvbih2YWwpIHsKICAgIHRoaXNba2V5XSA9IHZhbDsKICB9OwogIHJldHVybiAkRnVuY3Rpb24uYmluZChmLCBjb250ZXh0KTsKfQoKLy8gQSBVUkwgU3BlYyBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6Ci8vICBwYXRoOiBUaGUgcmVzb3VyY2UgdG8gYmUgZG93bmxvYWRlZC4KLy8gIHdpZHRoOiAob3B0aW9uYWwpIFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGluIGRldmljZQovLyAgICAgICAgIHBpeGVscy4KLy8gIGhlaWdodDogKG9wdGlvbmFsKSBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQgaW4KLy8gICAgICAgICAgZGV2aWNlIHBpeGVscy4KLy8gIGNhbGxiYWNrOiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBVUkwgaXMgY29tcGxldGUuIEl0Ci8vICAgIHNob3VsZCBhY2NlcHQgYW4gSW1hZ2VEYXRhIG9iamVjdCBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZQovLyAgICBmaWVsZCBpbiB8bm90aWZpY2F0aW9uRGV0YWlsc3wuCmZ1bmN0aW9uIGdldFVybFNwZWNzKGltYWdlU2l6ZXMsIG5vdGlmaWNhdGlvbkRldGFpbHMpIHsKICB2YXIgdXJsU3BlY3MgPSBbXTsKCiAgLy8gfGljb25Vcmx8IG1pZ2h0IGJlIG9wdGlvbmFsIGZvciBub3RpZmljYXRpb24gdXBkYXRlcy4KICBpZiAobm90aWZpY2F0aW9uRGV0YWlscy5pY29uVXJsKSB7CiAgICAkQXJyYXkucHVzaCh1cmxTcGVjcywgewogICAgICBwYXRoOiBub3RpZmljYXRpb25EZXRhaWxzLmljb25VcmwsCiAgICAgIHdpZHRoOiBpbWFnZVNpemVzLmljb24ud2lkdGggKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBoZWlnaHQ6IGltYWdlU2l6ZXMuaWNvbi5oZWlnaHQgKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBjYWxsYmFjazogaW1hZ2VEYXRhU2V0dGVyKG5vdGlmaWNhdGlvbkRldGFpbHMsICdpY29uQml0bWFwJykKICAgIH0pOwogIH0KCiAgLy8gfGFwcEljb25NYXNrVXJsfCBpcyBvcHRpb25hbC4KICBpZiAobm90aWZpY2F0aW9uRGV0YWlscy5hcHBJY29uTWFza1VybCkgewogICAgJEFycmF5LnB1c2godXJsU3BlY3MsIHsKICAgICAgcGF0aDogbm90aWZpY2F0aW9uRGV0YWlscy5hcHBJY29uTWFza1VybCwKICAgICAgd2lkdGg6IGltYWdlU2l6ZXMuYXBwSWNvbk1hc2sud2lkdGggKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBoZWlnaHQ6IGltYWdlU2l6ZXMuYXBwSWNvbk1hc2suaGVpZ2h0ICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgY2FsbGJhY2s6IGltYWdlRGF0YVNldHRlcihub3RpZmljYXRpb25EZXRhaWxzLCAnYXBwSWNvbk1hc2tCaXRtYXAnKQogICAgfSk7CiAgfQoKICAvLyB8aW1hZ2VVcmx8IGlzIG9wdGlvbmFsLgogIGlmIChub3RpZmljYXRpb25EZXRhaWxzLmltYWdlVXJsKSB7CiAgICAkQXJyYXkucHVzaCh1cmxTcGVjcywgewogICAgICBwYXRoOiBub3RpZmljYXRpb25EZXRhaWxzLmltYWdlVXJsLAogICAgICB3aWR0aDogaW1hZ2VTaXplcy5pbWFnZS53aWR0aCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGhlaWdodDogaW1hZ2VTaXplcy5pbWFnZS5oZWlnaHQgKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBjYWxsYmFjazogaW1hZ2VEYXRhU2V0dGVyKG5vdGlmaWNhdGlvbkRldGFpbHMsICdpbWFnZUJpdG1hcCcpCiAgICB9KTsKICB9CgogIC8vIEVhY2ggYnV0dG9uIGhhcyBhbiBvcHRpb25hbCBpY29uLgogIHZhciBidXR0b25MaXN0ID0gbm90aWZpY2F0aW9uRGV0YWlscy5idXR0b25zOwogIGlmIChidXR0b25MaXN0ICYmIHR5cGVvZiBidXR0b25MaXN0Lmxlbmd0aCA9PT0gJ251bWJlcicpIHsKICAgIHZhciBudW1CdXR0b25zID0gYnV0dG9uTGlzdC5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJ1dHRvbnM7IGkrKykgewogICAgICBpZiAoYnV0dG9uTGlzdFtpXS5pY29uVXJsKSB7CiAgICAgICAgJEFycmF5LnB1c2godXJsU3BlY3MsIHsKICAgICAgICAgIHBhdGg6IGJ1dHRvbkxpc3RbaV0uaWNvblVybCwKICAgICAgICAgIHdpZHRoOiBpbWFnZVNpemVzLmJ1dHRvbkljb24ud2lkdGggKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICAgICAgaGVpZ2h0OiBpbWFnZVNpemVzLmJ1dHRvbkljb24uaGVpZ2h0ICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgICAgIGNhbGxiYWNrOiBpbWFnZURhdGFTZXR0ZXIoYnV0dG9uTGlzdFtpXSwgJ2ljb25CaXRtYXAnKQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gdXJsU3BlY3M7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VOb3RpZmljYXRpb25PcHRpb25VUkxzKG5vdGlmaWNhdGlvbl9kZXRhaWxzLCBjYWxsYmFjaykgewogIHZhciBpbWFnZVNpemVzID0gbm90aWZpY2F0aW9uc1ByaXZhdGUuR2V0Tm90aWZpY2F0aW9uSW1hZ2VTaXplcygpOwogIHZhciB1cmxfc3BlY3MgPSBnZXRVcmxTcGVjcyhpbWFnZVNpemVzLCBub3RpZmljYXRpb25fZGV0YWlscyk7CiAgaWYgKCF1cmxfc3BlY3MubGVuZ3RoKSB7CiAgICBjYWxsYmFjayh0cnVlKTsKICAgIHJldHVybjsKICB9CgogIHZhciBlcnJvcnMgPSAwOwoKICBpbWFnZVV0aWwubG9hZEFsbEltYWdlcyh1cmxfc3BlY3MsIHsKICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgIGVycm9ycysrOwogICAgfSwKICAgIG9uY29tcGxldGU6IGZ1bmN0aW9uKGltYWdlRGF0YSkgewogICAgICBpZiAoZXJyb3JzID4gMCkgewogICAgICAgIGNhbGxiYWNrKGZhbHNlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHVybF9zcGVjcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICB2YXIgdXJsX3NwZWMgPSB1cmxfc3BlY3NbaW5kZXhdOwogICAgICAgIHVybF9zcGVjLmNhbGxiYWNrKGltYWdlRGF0YVtpbmRleF0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrKHRydWUpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBnZW5IYW5kbGUobmFtZSwgZmFpbHVyZV9mdW5jdGlvbikgewogIHJldHVybiBmdW5jdGlvbihpZCwgaW5wdXRfbm90aWZpY2F0aW9uX2RldGFpbHMsIGNhbGxiYWNrKSB7CiAgICAvLyBUT0RPKGRld2l0dGopOiBSZW1vdmUgdGhpcyBoYWNrLiBUaGlzIGlzIHVzZWQgYXMgYSB3YXkgdG8gZGVlcAogICAgLy8gY29weSBhIGNvbXBsZXggSlNPTiBvYmplY3QuCiAgICB2YXIgbm90aWZpY2F0aW9uX2RldGFpbHMgPSAkSlNPTi5wYXJzZSgKICAgICAgICAkSlNPTi5zdHJpbmdpZnkoaW5wdXRfbm90aWZpY2F0aW9uX2RldGFpbHMpKTsKICAgIHZhciB0aGF0ID0gdGhpczsKICAgIHZhciBzdGFjayA9IGV4Y2VwdGlvbkhhbmRsZXIuZ2V0RXh0ZW5zaW9uU3RhY2tUcmFjZSgpOwogICAgcmVwbGFjZU5vdGlmaWNhdGlvbk9wdGlvblVSTHMobm90aWZpY2F0aW9uX2RldGFpbHMsIGZ1bmN0aW9uKHN1Y2Nlc3MpIHsKICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICBzZW5kUmVxdWVzdCgKICAgICAgICAgICAgbmFtZSwgW2lkLCBub3RpZmljYXRpb25fZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoYXQuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHtfX3Byb3RvX186IG51bGwsIHN0YWNrOiBzdGFja30pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IoCiAgICAgICAgICBuYW1lLCAnVW5hYmxlIHRvIGRvd25sb2FkIGFsbCBzcGVjaWZpZWQgaW1hZ2VzLicsCiAgICAgICAgICBzdGFjaywgZmFpbHVyZV9mdW5jdGlvbiwgW2NhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge30sIGlkXSk7CiAgICB9KTsKICB9Owp9Cgp2YXIgaGFuZGxlQ3JlYXRlID0gZ2VuSGFuZGxlKCdub3RpZmljYXRpb25zLmNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2ssIGlkKSB7IGNhbGxiYWNrKGlkKTsgfSk7CnZhciBoYW5kbGVVcGRhdGUgPSBnZW5IYW5kbGUoJ25vdGlmaWNhdGlvbnMudXBkYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaywgaWQpIHsgY2FsbGJhY2soZmFsc2UpOyB9KTsKCnZhciBub3RpZmljYXRpb25zQ3VzdG9tSG9vayA9IGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2NyZWF0ZScsIGhhbmRsZUNyZWF0ZSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3VwZGF0ZScsIGhhbmRsZVVwZGF0ZSk7Cn07CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhub3RpZmljYXRpb25zQ3VzdG9tSG9vayk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgb21uaWJveCBBUEkuIE9ubHkgaW5qZWN0ZWQgaW50byB0aGUgdjggY29udGV4dHMKLy8gZm9yIGV4dGVuc2lvbnMgd2hpY2ggaGF2ZSBwZXJtaXNzaW9uIGZvciB0aGUgb21uaWJveCBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ29tbmlib3gnKTsKCnZhciByZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5yZWdpc3RlckV2ZW50QXJndW1lbnRNYXNzYWdlciwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykucmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyOwoKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0OwoKLy8gUmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycyBmcm9tIHx0ZXh0fCBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIHRvIHVzZQovLyBmb3IgfEF1dG9jb21wbGV0ZU1hdGNoOjpjb250ZW50c3wuCmZ1bmN0aW9uIHNhbml0aXplU3RyaW5nKHRleHQsIHNob3VsZFRyaW0pIHsKICAvLyBOT1RFOiBUaGlzIGxvZ2ljIG1pcnJvcnMgfEF1dG9jb21wbGV0ZU1hdGNoOjpTYW5pdGl6ZVN0cmluZygpfC4KICAvLyAweDIwMjggPSBsaW5lIHNlcGFyYXRvcjsgMHgyMDI5ID0gcGFyYWdyYXBoIHNlcGFyYXRvci4KICB2YXIga1JlbW92ZUNoYXJzID0gLyhccnxcbnxcdHxcdTIwMjh8XHUyMDI5KS9nbTsKICBpZiAoc2hvdWxkVHJpbSkKICAgIHRleHQgPSB0ZXh0LnRyaW1MZWZ0KCk7CiAgcmV0dXJuIHRleHQucmVwbGFjZShrUmVtb3ZlQ2hhcnMsICcnKTsKfQoKLy8gUGFyc2VzIHRoZSB4bWwgc3ludGF4IHN1cHBvcnRlZCBieSBvbW5pYm94IHN1Z2dlc3Rpb24gcmVzdWx0cy4gUmV0dXJucyBhbgovLyBvYmplY3Qgd2l0aCB0d28gcHJvcGVydGllczogJ2Rlc2NyaXB0aW9uJywgd2hpY2ggaXMganVzdCB0aGUgdGV4dCBjb250ZW50LAovLyBhbmQgJ2Rlc2NyaXB0aW9uU3R5bGVzJywgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygc3R5bGUgb2JqZWN0cyBpbiBhIGZvcm1hdAovLyB1bmRlcnN0b29kIGJ5IHRoZSBDKysgYmFja2VuZC4KZnVuY3Rpb24gcGFyc2VPbW5pYm94RGVzY3JpcHRpb24oaW5wdXQpIHsKICB2YXIgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwoKICAvLyBUaGUgWE1MIHBhcnNlciByZXF1aXJlcyBhIHNpbmdsZSB0b3AtbGV2ZWwgZWxlbWVudCwgYnV0IHdlIHdhbnQgdG8KICAvLyBzdXBwb3J0IHRoaW5ncyBsaWtlICdoZWxsbywgPG1hdGNoPndvcmxkPC9tYXRjaD4hJy4gU28gd2Ugd3JhcCB0aGUKICAvLyBwcm92aWRlZCB0ZXh0IGluIGdlbmVyYXRlZCByb290IGxldmVsIGVsZW1lbnQuCiAgdmFyIHJvb3QgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKAogICAgICAnPGZyYWdtZW50PicgKyBpbnB1dCArICc8L2ZyYWdtZW50PicsICd0ZXh0L3htbCcpOwoKICAvLyBET01QYXJzZXIgaGFzIGEgdGVycmlibGUgZXJyb3IgcmVwb3J0aW5nIGZhY2lsaXR5LiBFcnJvcnMgY29tZSBvdXQgbmVzdGVkCiAgLy8gaW5zaWRlIHRoZSByZXR1cm5lZCBkb2N1bWVudC4KICB2YXIgZXJyb3IgPSByb290LnF1ZXJ5U2VsZWN0b3IoJ3BhcnNlcmVycm9yIGRpdicpOwogIGlmIChlcnJvcikgewogICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLnRleHRDb250ZW50KTsKICB9CgogIC8vIE90aGVyd2lzZSwgaXQncyB2YWxpZCwgc28gYnVpbGQgdXAgdGhlIHJlc3VsdC4KICB2YXIgcmVzdWx0ID0gewogICAgZGVzY3JpcHRpb246ICcnLAogICAgZGVzY3JpcHRpb25TdHlsZXM6IFtdCiAgfTsKCiAgLy8gUmVjdXJzaXZlbHkgd2FsayB0aGUgdHJlZS4KICBmdW5jdGlvbiB3YWxrKG5vZGUpIHsKICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZDsgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbaV07IGkrKykgewogICAgICAvLyBBcHBlbmQgdGV4dCBub2RlcyB0byBvdXIgZGVzY3JpcHRpb24uCiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgIHZhciBzaG91bGRUcmltID0gcmVzdWx0LmRlc2NyaXB0aW9uLmxlbmd0aCA9PSAwOwogICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiArPSBzYW5pdGl6ZVN0cmluZyhjaGlsZC5ub2RlVmFsdWUsIHNob3VsZFRyaW0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyBQcm9jZXNzIGFuZCBkZXNjZW5kIGludG8gYSBzdWJzZXQgb2YgcmVjb2duaXplZCB0YWdzLgogICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYKICAgICAgICAgIChjaGlsZC5ub2RlTmFtZSA9PSAnZGltJyB8fCBjaGlsZC5ub2RlTmFtZSA9PSAnbWF0Y2gnIHx8CiAgICAgICAgICAgY2hpbGQubm9kZU5hbWUgPT0gJ3VybCcpKSB7CiAgICAgICAgdmFyIHN0eWxlID0gewogICAgICAgICAgJ3R5cGUnOiBjaGlsZC5ub2RlTmFtZSwKICAgICAgICAgICdvZmZzZXQnOiByZXN1bHQuZGVzY3JpcHRpb24ubGVuZ3RoCiAgICAgICAgfTsKICAgICAgICAkQXJyYXkucHVzaChyZXN1bHQuZGVzY3JpcHRpb25TdHlsZXMsIHN0eWxlKTsKICAgICAgICB3YWxrKGNoaWxkKTsKICAgICAgICBzdHlsZS5sZW5ndGggPSByZXN1bHQuZGVzY3JpcHRpb24ubGVuZ3RoIC0gc3R5bGUub2Zmc2V0OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyBEZXNjZW5kIGludG8gYWxsIG90aGVyIG5vZGVzLCBldmVuIGlmIHRoZXkgYXJlIHVucmVjb2duaXplZCwgZm9yCiAgICAgIC8vIGZvcndhcmQgY29tcGF0LgogICAgICB3YWxrKGNoaWxkKTsKICAgIH0KICB9OwogIHdhbGsocm9vdCk7CgogIHJldHVybiByZXN1bHQ7Cn0KCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1ByZVZhbGlkYXRlKCdzZXREZWZhdWx0U3VnZ2VzdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHN1Z2dlc3RSZXN1bHQpIHsKICAgIGlmIChzdWdnZXN0UmVzdWx0LmNvbnRlbnQgIT0gdW5kZWZpbmVkKSB7ICAvLyBudWxsLCBldGMuCiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdzZXREZWZhdWx0U3VnZ2VzdGlvbiBjYW5ub3QgY29udGFpbiB0aGUgImNvbnRlbnQiIGZpZWxkJyk7CiAgICB9CiAgICByZXR1cm4gW3N1Z2dlc3RSZXN1bHRdOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0RGVmYXVsdFN1Z2dlc3Rpb24nLCBmdW5jdGlvbihkZXRhaWxzKSB7CiAgICB2YXIgcGFyc2VSZXN1bHQgPSBwYXJzZU9tbmlib3hEZXNjcmlwdGlvbihkZXRhaWxzLmRlc2NyaXB0aW9uKTsKICAgIHNlbmRSZXF1ZXN0KCdvbW5pYm94LnNldERlZmF1bHRTdWdnZXN0aW9uJywgW3BhcnNlUmVzdWx0XSwKICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAnc2VuZFN1Z2dlc3Rpb25zJywgZnVuY3Rpb24ocmVxdWVzdElkLCB1c2VyU3VnZ2VzdGlvbnMpIHsKICAgIHZhciBzdWdnZXN0aW9ucyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VyU3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHBhcnNlUmVzdWx0ID0gcGFyc2VPbW5pYm94RGVzY3JpcHRpb24oCiAgICAgICAgICB1c2VyU3VnZ2VzdGlvbnNbaV0uZGVzY3JpcHRpb24pOwogICAgICBwYXJzZVJlc3VsdC5jb250ZW50ID0gdXNlclN1Z2dlc3Rpb25zW2ldLmNvbnRlbnQ7CiAgICAgIHBhcnNlUmVzdWx0LmRlbGV0YWJsZSA9IHVzZXJTdWdnZXN0aW9uc1tpXS5kZWxldGFibGU7CiAgICAgICRBcnJheS5wdXNoKHN1Z2dlc3Rpb25zLCBwYXJzZVJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gW3JlcXVlc3RJZCwgc3VnZ2VzdGlvbnNdOwogIH0pOwp9KTsKCnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcignb21uaWJveC5vbklucHV0Q2hhbmdlZCcsIGZ1bmN0aW9uKGFyZ3MsIGRpc3BhdGNoKSB7CiAgdmFyIHRleHQgPSBhcmdzWzBdOwogIHZhciByZXF1ZXN0SWQgPSBhcmdzWzFdOwogIHZhciBzdWdnZXN0Q2FsbGJhY2sgPSBmdW5jdGlvbihzdWdnZXN0aW9ucykgewogICAgY2hyb21lLm9tbmlib3guc2VuZFN1Z2dlc3Rpb25zKHJlcXVlc3RJZCwgc3VnZ2VzdGlvbnMpOwogIH07CiAgZGlzcGF0Y2goW3RleHQsIHN1Z2dlc3RDYWxsYmFja10pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBwYWdlQWN0aW9uIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgncGFnZUFjdGlvbicpOwp2YXIgc2V0SWNvbiA9IHJlcXVpcmUoJ3NldEljb24nKS5zZXRJY29uOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRJY29uJywgZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHNldEljb24oZGV0YWlscywgJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oYXJncykgewogICAgICBzZW5kUmVxdWVzdCgncGFnZUFjdGlvbi5zZXRJY29uJywgW2FyZ3MsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIH0sIHRoaXMpKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgcGFnZUNhcHR1cmUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdwYWdlQ2FwdHVyZScpOwoKdmFyIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uID0gcmVxdWlyZSgndW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXInKS5oYW5kbGU7CnZhciBwYWdlQ2FwdHVyZU5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdwYWdlX2NhcHR1cmUnKTsKdmFyIENyZWF0ZUJsb2IgPSBwYWdlQ2FwdHVyZU5hdGl2ZXMuQ3JlYXRlQmxvYjsKdmFyIFNlbmRSZXNwb25zZUFjayA9IHBhZ2VDYXB0dXJlTmF0aXZlcy5TZW5kUmVzcG9uc2VBY2s7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnc2F2ZUFzTUhUTUwnLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIGlmIChyZXNwb25zZSkKICAgICAgcmVzcG9uc2UgPSBDcmVhdGVCbG9iKHJlc3BvbnNlLm1odG1sRmlsZVBhdGgsIHJlc3BvbnNlLm1odG1sRmlsZUxlbmd0aCk7CgogICAgdHJ5IHsKICAgICAgY2FsbGJhY2socmVzcG9uc2UpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbigKICAgICAgICAgICdFcnJvciBpbiBjaHJvbWUucGFnZUNhcHR1cmUuc2F2ZUFzTUhUTUwgY2FsbGJhY2snLCBlLCByZXF1ZXN0LnN0YWNrKTsKICAgIH0gZmluYWxseSB7CiAgICAgIC8vIE5vdGlmeSB0aGUgYnJvd3Nlci4gTm93IHRoYXQgdGhlIGJsb2IgaXMgcmVmZXJlbmNlZCBmcm9tIEphdmFTY3JpcHQsCiAgICAgIC8vIHRoZSBicm93c2VyIGNhbiBkcm9wIGl0cyByZWZlcmVuY2UgdG8gaXQuCiAgICAgIFNlbmRSZXNwb25zZUFjayhyZXF1ZXN0LmlkKTsKICAgIH0KICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgc3luY0ZpbGVTeXN0ZW0gQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnc3luY0ZpbGVTeXN0ZW0nKTsKCnZhciByZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5yZWdpc3RlckV2ZW50QXJndW1lbnRNYXNzYWdlciwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykucmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyOwoKdmFyIGZpbGVTeXN0ZW1OYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnZmlsZV9zeXN0ZW1fbmF0aXZlcycpOwp2YXIgc3luY0ZpbGVTeXN0ZW1OYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnc3luY19maWxlX3N5c3RlbScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICAvLyBGdW5jdGlvbnMgd2hpY2ggdGFrZSBpbiBhbiBbaW5zdGFuY2VPZj1GaWxlRW50cnldLgogIGZ1bmN0aW9uIGJpbmRGaWxlRW50cnlGdW5jdGlvbihmdW5jdGlvbk5hbWUpIHsKICAgIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbihlbnRyeSwgY2FsbGJhY2spIHsKICAgICAgdmFyIGZpbGVTeXN0ZW1VcmwgPSBlbnRyeS50b1VSTCgpOwogICAgICByZXR1cm4gW2ZpbGVTeXN0ZW1VcmwsIGNhbGxiYWNrXTsKICAgIH0pOwogIH0KICAkQXJyYXkuZm9yRWFjaChbJ2dldEZpbGVTdGF0dXMnXSwgYmluZEZpbGVFbnRyeUZ1bmN0aW9uKTsKCiAgLy8gRnVuY3Rpb25zIHdoaWNoIHRha2UgaW4gYSBGaWxlRW50cnkgYXJyYXkuCiAgZnVuY3Rpb24gYmluZEZpbGVFbnRyeUFycmF5RnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7CiAgICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb24oZW50cmllcywgY2FsbGJhY2spIHsKICAgICAgdmFyIGZpbGVTeXN0ZW1VcmxBcnJheSA9IFtdOwogICAgICBmb3IgKHZhciBpPTA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgJEFycmF5LnB1c2goZmlsZVN5c3RlbVVybEFycmF5LCBlbnRyaWVzW2ldLnRvVVJMKCkpOwogICAgICB9CiAgICAgIHJldHVybiBbZmlsZVN5c3RlbVVybEFycmF5LCBjYWxsYmFja107CiAgICB9KTsKICB9CiAgJEFycmF5LmZvckVhY2goWydnZXRGaWxlU3RhdHVzZXMnXSwgYmluZEZpbGVFbnRyeUFycmF5RnVuY3Rpb24pOwoKICAvLyBGdW5jdGlvbnMgd2hpY2ggdGFrZSBpbiBhbiBbaW5zdGFuY2VPZj1ET01GaWxlU3lzdGVtXS4KICBmdW5jdGlvbiBiaW5kRmlsZVN5c3RlbUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkgewogICAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgICBmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uKGZpbGVzeXN0ZW0sIGNhbGxiYWNrKSB7CiAgICAgIHZhciBmaWxlU3lzdGVtVXJsID0gZmlsZXN5c3RlbS5yb290LnRvVVJMKCk7CiAgICAgIHJldHVybiBbZmlsZVN5c3RlbVVybCwgY2FsbGJhY2tdOwogICAgfSk7CiAgfQogICRBcnJheS5mb3JFYWNoKFsnZ2V0VXNhZ2VBbmRRdW90YSddLCBiaW5kRmlsZVN5c3RlbUZ1bmN0aW9uKTsKCiAgLy8gRnVuY3Rpb25zIHdoaWNoIHJldHVybiBhbiBbaW5zdGFuY2VPZj1ET01GaWxlU3lzdGVtXS4KICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ3JlcXVlc3RGaWxlU3lzdGVtJywKICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgIGlmIChyZXNwb25zZSkgewogICAgICByZXN1bHQgPSBzeW5jRmlsZVN5c3RlbU5hdGl2ZXMuR2V0U3luY0ZpbGVTeXN0ZW1PYmplY3QoCiAgICAgICAgICByZXNwb25zZS5uYW1lLCByZXNwb25zZS5yb290KTsKICAgIH0KICAgIGlmIChjYWxsYmFjaykKICAgICAgY2FsbGJhY2socmVzdWx0KTsKICB9KTsKCiAgLy8gRnVuY3Rpb25zIHdoaWNoIHJldHVybiBhbiBhcnJheSBvZiBGaWxlU3RhdHVzSW5mbyBvYmplY3QKICAvLyB3aGljaCBoYXMgW2luc3RhbmNlT2Y9RmlsZUVudHJ5XS4KICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2dldEZpbGVTdGF0dXNlcycsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGlmIChyZXNwb25zZSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3BvbnNlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIHZhciBlbnRyeSA9IHJlc3BvbnNlW2ldLmVudHJ5OwogICAgICAgIHJlc3VsdC5maWxlRW50cnkgPSBmaWxlU3lzdGVtTmF0aXZlcy5HZXRGaWxlRW50cnkoCiAgICAgICAgICAgIGVudHJ5LmZpbGVTeXN0ZW1UeXBlLAogICAgICAgICAgICBlbnRyeS5maWxlU3lzdGVtTmFtZSwKICAgICAgICAgICAgZW50cnkucm9vdFVybCwKICAgICAgICAgICAgZW50cnkuZmlsZVBhdGgsCiAgICAgICAgICAgIGVudHJ5LmlzRGlyZWN0b3J5KTsKICAgICAgICByZXN1bHQuc3RhdHVzID0gcmVzcG9uc2VbaV0uc3RhdHVzOwogICAgICAgIHJlc3VsdC5lcnJvciA9IHJlc3BvbnNlW2ldLmVycm9yOwogICAgICAgICRBcnJheS5wdXNoKHJlc3VsdHMsIHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjYWxsYmFjaykKICAgICAgY2FsbGJhY2socmVzdWx0cyk7CiAgfSk7Cn0pOwoKcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyKCdzeW5jRmlsZVN5c3RlbS5vbkZpbGVTdGF0dXNDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGFyZ3MsIGRpc3BhdGNoKSB7CiAgLy8gTWFrZSBGaWxlRW50cnkgb2JqZWN0IHVzaW5nIGFsbCB0aGUgYmFzZSBzdHJpbmcgZmllbGRzLgogIHZhciBmaWxlRW50cnkgPSBmaWxlU3lzdGVtTmF0aXZlcy5HZXRGaWxlRW50cnkoCiAgICAgIGFyZ3NbMF0uZmlsZVN5c3RlbVR5cGUsCiAgICAgIGFyZ3NbMF0uZmlsZVN5c3RlbU5hbWUsCiAgICAgIGFyZ3NbMF0ucm9vdFVybCwKICAgICAgYXJnc1swXS5maWxlUGF0aCwKICAgICAgYXJnc1swXS5pc0RpcmVjdG9yeSk7CgogIC8vIENvbWJpbmUgaW50byBhIHNpbmdsZSBkaWN0aW9uYXJ5LgogIHZhciBmaWxlSW5mbyA9IG5ldyBPYmplY3QoKTsKICBmaWxlSW5mby5maWxlRW50cnkgPSBmaWxlRW50cnk7CiAgZmlsZUluZm8uc3RhdHVzID0gYXJnc1sxXTsKICBpZiAoZmlsZUluZm8uc3RhdHVzID09ICJzeW5jZWQiKSB7CiAgICBmaWxlSW5mby5hY3Rpb24gPSBhcmdzWzJdOwogICAgZmlsZUluZm8uZGlyZWN0aW9uID0gYXJnc1szXTsKICB9CiAgZGlzcGF0Y2goW2ZpbGVJbmZvXSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHN5c3RlbUluZGljYXRvciBBUEkuCi8vIFRPRE8oZGV3aXR0aikgUmVmYWN0b3IgY3VzdG9tIGJpbmRpbmcgdG8gcmVkdWNlIHJlZHVuZGFuY3kgYmV0d2VlbiB0aGUKLy8gZXh0ZW5zaW9uIGFjdGlvbiBBUElzLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnc3lzdGVtSW5kaWNhdG9yJyk7Cgp2YXIgc2V0SWNvbiA9IHJlcXVpcmUoJ3NldEljb24nKS5zZXRJY29uOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRJY29uJywgZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHNldEljb24oZGV0YWlscywgJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oYXJncykgewogICAgICBzZW5kUmVxdWVzdCgnc3lzdGVtSW5kaWNhdG9yLnNldEljb24nLCBbYXJncywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgfSwgdGhpcykpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBUYWIgQ2FwdHVyZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3RhYkNhcHR1cmUnKTsKCnZhciBqc0xhc3RFcnJvciA9IGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogcmVxdWlyZSgnbGFzdEVycm9yJyk7CmZ1bmN0aW9uIHJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcihuYW1lLCBtZXNzYWdlLCBzdGFjaywgY2FsbGJhY2ssIGFyZ3MpIHsKICBpZiAoYmluZGluZ1V0aWwpIHsKICAgIGJpbmRpbmdVdGlsLnJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcihtZXNzYWdlLCBmdW5jdGlvbigpIHsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCBudWxsLCBhcmdzKTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBqc0xhc3RFcnJvci5ydW4obmFtZSwgbWVzc2FnZSwgc3RhY2ssIGNhbGxiYWNrLCBhcmdzKTsKICB9Cn0KCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGZ1bmN0aW9uIHByb3h5VG9HZXRVc2VyTWVkaWEobmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICBpZiAoIWNhbGxiYWNrKQogICAgICByZXR1cm47CgogICAgaWYgKCFyZXNwb25zZSkgewogICAgICAvLyBXaGVuIHRoZSByZXNwb25zZSBpcyBtaXNzaW5nLCBydW50aW1lLmxhc3RFcnJvciBoYXMgYWxyZWFkeSBiZWVuIHNldC4KICAgICAgLy8gU2VlIGNocm9tZS9icm93c2VyL2V4dGVuc2lvbnMvYXBpL3RhYl9jYXB0dXJlL3RhYl9jYXB0dXJlX2FwaS5jYy4KICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyB3ZWJraXRHZXRVc2VyTWVkaWEoKSBlcnJvciBvYmplY3RzIHRvCiAgICAvLyBwcm92aWRlIHJ1bnRpbWUubGFzdEVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFiIGNhcHR1cmUgQVBJLgogICAgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yLCBmYWxsYmFja01lc3NhZ2UpIHsKICAgICAgaWYgKCFlcnJvciB8fCAodHlwZW9mIGVycm9yLm1lc3NhZ2UgIT0gJ3N0cmluZycpKQogICAgICAgIHJldHVybiBmYWxsYmFja01lc3NhZ2U7CiAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlLnJlcGxhY2UoLyhuYXZpZ2F0b3JcLik/KHdlYmtpdCk/R2V0VXNlck1lZGlhL2dpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgfQoKICAgIHZhciBvcHRpb25zID0ge307CiAgICBpZiAocmVzcG9uc2UuYXVkaW9Db25zdHJhaW50cykKICAgICAgb3B0aW9ucy5hdWRpbyA9IHJlc3BvbnNlLmF1ZGlvQ29uc3RyYWludHM7CiAgICBpZiAocmVzcG9uc2UudmlkZW9Db25zdHJhaW50cykKICAgICAgb3B0aW9ucy52aWRlbyA9IHJlc3BvbnNlLnZpZGVvQ29uc3RyYWludHM7CiAgICB0cnkgewogICAgICBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKAogICAgICAgICAgb3B0aW9ucywKICAgICAgICAgIGZ1bmN0aW9uIG9uU3VjY2VzcyhtZWRpYV9zdHJlYW0pIHsKICAgICAgICAgICAgY2FsbGJhY2sobWVkaWFfc3RyZWFtKTsKICAgICAgICAgIH0sCiAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7CiAgICAgICAgICAgIHJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2UoZXJyb3IsICJGYWlsZWQgdG8gc3RhcnQgTWVkaWFTdHJlYW0uIiksCiAgICAgICAgICAgICAgICByZXF1ZXN0LnN0YWNrLAogICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGNhbGxiYWNrKG51bGwpOyB9KTsKICAgICAgICAgIH0pOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKAogICAgICAgICAgbmFtZSwgZ2V0RXJyb3JNZXNzYWdlKGVycm9yLCAiSW52YWxpZCBhcmd1bWVudChzKS4iKSwgcmVxdWVzdC5zdGFjaywKICAgICAgICAgIGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsKTsgfSk7CiAgICB9CiAgfQoKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2NhcHR1cmUnLCBwcm94eVRvR2V0VXNlck1lZGlhKTsKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2NhcHR1cmVPZmZzY3JlZW5UYWInLCBwcm94eVRvR2V0VXNlck1lZGlhKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgdGFicyBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3RhYnMnKTsKCnZhciBtZXNzYWdpbmcgPSByZXF1aXJlKCdtZXNzYWdpbmcnKTsKdmFyIE9wZW5DaGFubmVsVG9UYWIgPSByZXF1aXJlTmF0aXZlKCdtZXNzYWdpbmdfbmF0aXZlcycpLk9wZW5DaGFubmVsVG9UYWI7CnZhciBzZW5kUmVxdWVzdElzRGlzYWJsZWQgPSByZXF1aXJlTmF0aXZlKCdwcm9jZXNzJykuSXNTZW5kUmVxdWVzdERpc2FibGVkKCk7CnZhciBmb3JFYWNoID0gcmVxdWlyZSgndXRpbHMnKS5mb3JFYWNoOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICB2YXIgdGFicyA9IGJpbmRpbmdzQVBJLmNvbXBpbGVkQXBpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY29ubmVjdCcsIGZ1bmN0aW9uKHRhYklkLCBjb25uZWN0SW5mbykgewogICAgdmFyIG5hbWUgPSAnJzsKICAgIHZhciBmcmFtZUlkID0gLTE7CiAgICBpZiAoY29ubmVjdEluZm8pIHsKICAgICAgbmFtZSA9IGNvbm5lY3RJbmZvLm5hbWUgfHwgbmFtZTsKICAgICAgZnJhbWVJZCA9IGNvbm5lY3RJbmZvLmZyYW1lSWQ7CiAgICAgIGlmICh0eXBlb2YgZnJhbWVJZCA9PSAndW5kZWZpbmVkJyB8fCBmcmFtZUlkIDwgMCkKICAgICAgICBmcmFtZUlkID0gLTE7CiAgICB9CiAgICB2YXIgcG9ydElkID0gT3BlbkNoYW5uZWxUb1RhYih0YWJJZCwgZnJhbWVJZCwgZXh0ZW5zaW9uSWQsIG5hbWUpOwogICAgcmV0dXJuIG1lc3NhZ2luZy5jcmVhdGVQb3J0KHBvcnRJZCwgbmFtZSk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZW5kUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odGFiSWQsIHJlcXVlc3QsIHJlc3BvbnNlQ2FsbGJhY2spIHsKICAgIGlmIChzZW5kUmVxdWVzdElzRGlzYWJsZWQpCiAgICAgIHRocm93IG5ldyBFcnJvcihzZW5kUmVxdWVzdElzRGlzYWJsZWQpOwogICAgdmFyIHBvcnQgPSB0YWJzLmNvbm5lY3QodGFiSWQsIHtuYW1lOiBtZXNzYWdpbmcua1JlcXVlc3RDaGFubmVsfSk7CiAgICBtZXNzYWdpbmcuc2VuZE1lc3NhZ2VJbXBsKHBvcnQsIHJlcXVlc3QsIHJlc3BvbnNlQ2FsbGJhY2spOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2VuZE1lc3NhZ2UnLAogICAgICBmdW5jdGlvbih0YWJJZCwgbWVzc2FnZSwgb3B0aW9ucywgcmVzcG9uc2VDYWxsYmFjaykgewogICAgdmFyIGNvbm5lY3RJbmZvID0gewogICAgICBuYW1lOiBtZXNzYWdpbmcua01lc3NhZ2VDaGFubmVsCiAgICB9OwogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgZm9yRWFjaChvcHRpb25zLCBmdW5jdGlvbihrLCB2KSB7CiAgICAgICAgY29ubmVjdEluZm9ba10gPSB2OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgcG9ydCA9IHRhYnMuY29ubmVjdCh0YWJJZCwgY29ubmVjdEluZm8pOwogICAgbWVzc2FnaW5nLnNlbmRNZXNzYWdlSW1wbChwb3J0LCBtZXNzYWdlLCByZXNwb25zZUNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgdHRzIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgndHRzJyk7Cgp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgbGF6eUJHID0gcmVxdWlyZU5hdGl2ZSgnbGF6eV9iYWNrZ3JvdW5kX3BhZ2UnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBhcGkuYXBpRnVuY3Rpb25zOwogIHZhciB0dHMgPSBhcGkuY29tcGlsZWRBcGk7CiAgdmFyIGhhbmRsZXJzID0ge307CgogIGZ1bmN0aW9uIHR0c0V2ZW50TGlzdGVuZXIoZXZlbnQpIHsKICAgIHZhciBldmVudEhhbmRsZXIgPSBoYW5kbGVyc1tldmVudC5zcmNJZF07CiAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CiAgICAgIGV2ZW50SGFuZGxlcih7CiAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsCiAgICAgICAgICAgICAgICAgICAgIGNoYXJJbmRleDogZXZlbnQuY2hhckluZGV4LAogICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LmVycm9yTWVzc2FnZQogICAgICAgICAgICAgICAgICAgfSk7CiAgICAgIGlmIChldmVudC5pc0ZpbmFsRXZlbnQpIHsKICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnQuc3JjSWRdOwogICAgICAgIC8vIEJhbGFuY2VkIGluICdzcGVhaycgaGFuZGxlci4KICAgICAgICBsYXp5QkcuRGVjcmVtZW50S2VlcGFsaXZlQ291bnQoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gVGhpcyBmaWxlIHdpbGwgZ2V0IHJ1biBpZiBhbiBleHRlbnNpb24gbmVlZHMgdGhlIHR0c0VuZ2luZSBwZXJtaXNzaW9uLCBidXQKICAvLyBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHR0cyBwZXJtaXNzaW9uLiBJZiBpdCBkb2Vzbid0LCB0cnlpbmcgdG8KICAvLyBhZGQgYSBsaXN0ZW5lciB0byBjaHJvbWUudHRzLm9uRXZlbnQgd2lsbCBmYWlsLgogIC8vIFNlZSBodHRwOi8vY3JidWcuY29tLzEyMjQ3NC4KICB0cnkgewogICAgdHRzLm9uRXZlbnQuYWRkTGlzdGVuZXIodHRzRXZlbnRMaXN0ZW5lcik7CiAgfSBjYXRjaCAoZSkge30KCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NwZWFrJywgZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJncyA9ICRBcnJheS5mcm9tKGFyZ3VtZW50cyk7CiAgICBpZiAoYXJncy5sZW5ndGggPiAxICYmIGFyZ3NbMV0gJiYgYXJnc1sxXS5vbkV2ZW50KSB7CiAgICAgIHZhciBpZCA9IGlkR2VuZXJhdG9yLkdldE5leHRJZCgpOwogICAgICBhcmdzWzFdLnNyY0lkID0gaWQ7CiAgICAgIGhhbmRsZXJzW2lkXSA9IGFyZ3NbMV0ub25FdmVudDsKICAgICAgLy8gS2VlcCB0aGUgcGFnZSBhbGl2ZSB1bnRpbCB0aGUgZXZlbnQgZmluaXNoZXMuCiAgICAgIC8vIEJhbGFuY2VkIGluIGV2ZW50SGFuZGxlci4KICAgICAgbGF6eUJHLkluY3JlbWVudEtlZXBhbGl2ZUNvdW50KCk7CiAgICB9CiAgICBzZW5kUmVxdWVzdCgndHRzLnNwZWFrJywgYXJncywKICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgcmV0dXJuIGlkOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB0dHNFbmdpbmUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd0dHNFbmdpbmUnKTsKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ3R0c0VuZ2luZS5vblNwZWFrJywgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIgdGV4dCA9IGFyZ3NbMF07CiAgdmFyIG9wdGlvbnMgPSBhcmdzWzFdOwogIHZhciByZXF1ZXN0SWQgPSBhcmdzWzJdOwogIHZhciBzZW5kVHRzRXZlbnQgPSBmdW5jdGlvbihldmVudCkgewogICAgY2hyb21lLnR0c0VuZ2luZS5zZW5kVHRzRXZlbnQocmVxdWVzdElkLCBldmVudCk7CiAgfTsKICBkaXNwYXRjaChbdGV4dCwgb3B0aW9ucywgc2VuZFR0c0V2ZW50XSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2VicnRjRGVza3RvcENhcHR1cmVQcml2YXRlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUnKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IHt9OwoKICBmdW5jdGlvbiBvblJlcXVlc3RSZXN1bHQoaWQsIHJlc3VsdCkgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICB2YXIgY2FsbGJhY2sgPSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgY2FsbGJhY2socmVzdWx0KTsKICAgIH0KICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNvdXJjZXMsIHJlcXVlc3QsIGNhbGxiYWNrKSB7CiAgICB2YXIgaWQgPSBpZEdlbmVyYXRvci5HZXROZXh0SWQoKTsKICAgIHBlbmRpbmdSZXF1ZXN0c1tpZF0gPSBjYWxsYmFjazsKICAgIHNlbmRSZXF1ZXN0KCd3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUuY2hvb3NlRGVza3RvcE1lZGlhJywKICAgICAgICAgICAgICAgIFtpZCwgc291cmNlcywgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChvblJlcXVlc3RSZXN1bHQsIG51bGwsIGlkKV0sCiAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIHJldHVybiBpZDsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2NhbmNlbENob29zZURlc2t0b3BNZWRpYScsIGZ1bmN0aW9uKGlkKSB7CiAgICBpZiAoaWQgaW4gcGVuZGluZ1JlcXVlc3RzKSB7CiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBzZW5kUmVxdWVzdCgnd2VicnRjRGVza3RvcENhcHR1cmVQcml2YXRlLmNhbmNlbENob29zZURlc2t0b3BNZWRpYScsIFtpZF0sCiAgICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2VicnRjTG9nZ2luZ1ByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3dlYnJ0Y0xvZ2dpbmdQcml2YXRlJyk7Cgp2YXIgZ2V0QmluZERpcmVjdG9yeUVudHJ5Q2FsbGJhY2sgPQogICAgcmVxdWlyZSgnZmlsZUVudHJ5QmluZGluZ1V0aWwnKS5nZXRCaW5kRGlyZWN0b3J5RW50cnlDYWxsYmFjazsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmcsIGlkLCBjb250ZXh0VHlwZSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2dldExvZ3NEaXJlY3RvcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaW5kRGlyZWN0b3J5RW50cnlDYWxsYmFjaygpKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2Vic3RvcmUgQVBJLgoKdmFyIHdlYnN0b3JlTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ3dlYnN0b3JlJyk7Cgp2YXIgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkOwp2YXIgb25Eb3dubG9hZFByb2dyZXNzOwoKZnVuY3Rpb24gSW5zdGFsbGVyKCkgewogIHRoaXMuX3BlbmRpbmdJbnN0YWxsID0gbnVsbDsKfQoKSW5zdGFsbGVyLnByb3RvdHlwZS5pbnN0YWxsID0gZnVuY3Rpb24odXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewogIGlmICh0aGlzLl9wZW5kaW5nSW5zdGFsbCkKICAgIHRocm93IG5ldyBFcnJvcignQSBDaHJvbWUgV2ViIFN0b3JlIGluc3RhbGxhdGlvbiBpcyBhbHJlYWR5IHBlbmRpbmcuJyk7CgogIC8vIFdpdGggbmF0aXZlIGJpbmRpbmdzLCB0aGVzZSBjYWxscyBnbyB0aHJvdWdoIGFyZ3VtZW50IHZhbGlkYXRpb24sIHdoaWNoCiAgLy8gc2V0cyBvcHRpb25hbC9taXNzaW5nIGFyZ3VtZW50cyB0byBudWxsLiBUaGUgbmF0aXZlIHdlYnN0b3JlIGJpbmRpbmdzCiAgLy8gZXhwZWN0IGVpdGhlciBwcmVzZW50IG9yIHVuZGVmaW5lZCwgc28gdHJhbnNmb3JtIG51bGwgdG8gdW5kZWZpbmVkLgogIGlmICh1cmwgPT09IG51bGwpCiAgICB1cmwgPSB1bmRlZmluZWQ7CiAgaWYgKG9uU3VjY2VzcyA9PT0gbnVsbCkKICAgIG9uU3VjY2VzcyA9IHVuZGVmaW5lZDsKICBpZiAob25GYWlsdXJlID09PSBudWxsKQogICAgb25GYWlsdXJlID0gdW5kZWZpbmVkOwoKICBpZiAodXJsICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnVGhlIENocm9tZSBXZWIgU3RvcmUgaXRlbSBsaW5rIFVSTCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZy4nKTsKICB9CiAgaWYgKG9uU3VjY2VzcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvblN1Y2Nlc3MgIT09ICdmdW5jdGlvbicpIHsKICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN1Y2Nlc3MgY2FsbGJhY2sgcGFyYW1ldGVyIG11c3QgYmUgYSBmdW5jdGlvbi4nKTsKICB9CiAgaWYgKG9uRmFpbHVyZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvbkZhaWx1cmUgIT09ICdmdW5jdGlvbicpIHsKICAgIHRocm93IG5ldyBFcnJvcignVGhlIGZhaWx1cmUgY2FsbGJhY2sgcGFyYW1ldGVyIG11c3QgYmUgYSBmdW5jdGlvbi4nKTsKICB9CgogIC8vIFNpbmNlIHdlIGNhbGwgSW5zdGFsbCgpIHdpdGggYSBib29sIGZvciBpZiB3ZSBoYXZlIGxpc3RlbmVycywgbGlzdGVuZXJzCiAgLy8gbXVzdCBiZSBzZXQgcHJpb3IgdG8gdGhlIGlubGluZSBpbnN0YWxsYXRpb24gc3RhcnRpbmcgKHRoaXMgaXMgYWxzbwogIC8vIG5vdGVkIGluIHRoZSBFdmVudCBkb2N1bWVudGF0aW9uIGluCiAgLy8gY2hyb21lL2NvbW1vbi9leHRlbnNpb25zL2FwaS93ZWJzdG9yZS5qc29uKS4KICB2YXIgaW5zdGFsbElkID0gd2Vic3RvcmVOYXRpdmVzLkluc3RhbGwoCiAgICAgIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZC5oYXNMaXN0ZW5lcnMoKSwKICAgICAgb25Eb3dubG9hZFByb2dyZXNzLmhhc0xpc3RlbmVycygpLAogICAgICB1cmwsCiAgICAgIG9uU3VjY2VzcywKICAgICAgb25GYWlsdXJlKTsKICBpZiAoaW5zdGFsbElkICE9PSB1bmRlZmluZWQpIHsKICAgIHRoaXMuX3BlbmRpbmdJbnN0YWxsID0gewogICAgICBpbnN0YWxsSWQ6IGluc3RhbGxJZCwKICAgICAgb25TdWNjZXNzOiBvblN1Y2Nlc3MsCiAgICAgIG9uRmFpbHVyZTogb25GYWlsdXJlCiAgICB9OwogIH0KfTsKCkluc3RhbGxlci5wcm90b3R5cGUub25JbnN0YWxsUmVzcG9uc2UgPQogICAgZnVuY3Rpb24oaW5zdGFsbElkLCBzdWNjZXNzLCBlcnJvciwgcmVzdWx0Q29kZSkgewogIHZhciBwZW5kaW5nSW5zdGFsbCA9IHRoaXMuX3BlbmRpbmdJbnN0YWxsOwogIGlmICghcGVuZGluZ0luc3RhbGwgfHwgcGVuZGluZ0luc3RhbGwuaW5zdGFsbElkICE9IGluc3RhbGxJZCkgewogICAgLy8gVE9ETyhrYWxtYW4pOiBzaG91bGQgdGhpcyBiZSBhbiBlcnJvcj8KICAgIHJldHVybjsKICB9CgogIHRyeSB7CiAgICBpZiAoc3VjY2VzcyAmJiBwZW5kaW5nSW5zdGFsbC5vblN1Y2Nlc3MpCiAgICAgIHBlbmRpbmdJbnN0YWxsLm9uU3VjY2VzcygpOwogICAgZWxzZSBpZiAoIXN1Y2Nlc3MgJiYgcGVuZGluZ0luc3RhbGwub25GYWlsdXJlKQogICAgICBwZW5kaW5nSW5zdGFsbC5vbkZhaWx1cmUoZXJyb3IsIHJlc3VsdENvZGUpOwogIH0gY2F0Y2ggKGUpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0V4Y2VwdGlvbiBpbiBjaHJvbWUud2Vic3RvcmUuaW5zdGFsbCByZXNwb25zZSBoYW5kbGVyOiAnICsKICAgICAgICAgICAgICAgICAgZS5zdGFjayk7CiAgfSBmaW5hbGx5IHsKICAgIHRoaXMuX3BlbmRpbmdJbnN0YWxsID0gbnVsbDsKICB9Cn07CgpJbnN0YWxsZXIucHJvdG90eXBlLm9uSW5zdGFsbFN0YWdlQ2hhbmdlZCA9IGZ1bmN0aW9uKGluc3RhbGxTdGFnZSkgewogIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZC5kaXNwYXRjaChpbnN0YWxsU3RhZ2UpOwp9OwoKSW5zdGFsbGVyLnByb3RvdHlwZS5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBmdW5jdGlvbihwcm9ncmVzcykgewogIG9uRG93bmxvYWRQcm9ncmVzcy5kaXNwYXRjaChwcm9ncmVzcyk7Cn07Cgp2YXIgaW5zdGFsbGVyID0gbmV3IEluc3RhbGxlcigpOwoKCmlmIChhcGlCcmlkZ2UpIHsKICBhcGlCcmlkZ2UucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogICAgYXBpLmFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdpbnN0YWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CiAgICAgIGluc3RhbGxlci5pbnN0YWxsKHVybCwgb25TdWNjZXNzLCBvbkZhaWx1cmUpOwogICAgfSk7CgogICAgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkID0gYXBpLmNvbXBpbGVkQXBpLm9uSW5zdGFsbFN0YWdlQ2hhbmdlZDsKICAgIG9uRG93bmxvYWRQcm9ncmVzcyA9IGFwaS5jb21waWxlZEFwaS5vbkRvd25sb2FkUHJvZ3Jlc3M7CiAgfSk7Cn0gZWxzZSB7CiAgdmFyIEV2ZW50ID0gcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5FdmVudDsKICBvbkluc3RhbGxTdGFnZUNoYW5nZWQgPQogICAgICBuZXcgRXZlbnQobnVsbCwgW3tuYW1lOiAnc3RhZ2UnLCB0eXBlOiAnc3RyaW5nJ31dLCB7dW5tYW5hZ2VkOiB0cnVlfSk7CiAgb25Eb3dubG9hZFByb2dyZXNzID0KICAgICAgbmV3IEV2ZW50KG51bGwsIFt7bmFtZTogJ3Byb2dyZXNzJywgdHlwZTogJ251bWJlcid9XSwge3VubWFuYWdlZDogdHJ1ZX0pOwoKICB2YXIgY2hyb21lV2Vic3RvcmUgPSB7CiAgICBpbnN0YWxsOiBmdW5jdGlvbiAodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewogICAgICBpbnN0YWxsZXIuaW5zdGFsbCh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKTsKICAgIH0sCiAgICBvbkluc3RhbGxTdGFnZUNoYW5nZWQ6IG9uSW5zdGFsbFN0YWdlQ2hhbmdlZCwKICAgIG9uRG93bmxvYWRQcm9ncmVzczogb25Eb3dubG9hZFByb2dyZXNzLAogIH07CiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgY2hyb21lV2Vic3RvcmUpOwp9CgovLyBDYWxsZWQgYnkgd2Vic3RvcmVfYmluZGluZ3MuY2MuCmV4cG9ydHMuJHNldCgnb25JbnN0YWxsUmVzcG9uc2UnLAogICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQoSW5zdGFsbGVyLnByb3RvdHlwZS5vbkluc3RhbGxSZXNwb25zZSwgaW5zdGFsbGVyKSk7CmV4cG9ydHMuJHNldCgnb25JbnN0YWxsU3RhZ2VDaGFuZ2VkJywKICAgICAgICAgICAgICRGdW5jdGlvbi5iaW5kKEluc3RhbGxlci5wcm90b3R5cGUub25JbnN0YWxsU3RhZ2VDaGFuZ2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVyKSk7CmV4cG9ydHMuJHNldCgnb25Eb3dubG9hZFByb2dyZXNzJywKICAgICAgICAgICAgICRGdW5jdGlvbi5iaW5kKEluc3RhbGxlci5wcm90b3R5cGUub25Eb3dubG9hZFByb2dyZXNzLCBpbnN0YWxsZXIpKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX2NvbnRyb2xsZXIubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYVJvdXRlci5tb2pvbScpOwogIHZhciBtZWRpYV9zdGF0dXMkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3N0YXR1cy5tb2pvbScsICdtZWRpYV9zdGF0dXMubW9qb20uanMnKTsKICB9CiAgdmFyIHRpbWUkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21vam8uY29tbW9uLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdtb2pvL2NvbW1vbi90aW1lLm1vam9tJywgJy4uLy4uLy4uLy4uL21vam8vY29tbW9uL3RpbWUubW9qb20uanMnKTsKICB9CgoKCiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubXV0ZSA9IGZhbHNlOwogIH07CiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5tdXRlID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLm11dGUgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudm9sdW1lID0gMDsKICB9OwogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudm9sdW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5GbG9hdCwgdmFsLnZvbHVtZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZSA9IG51bGw7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMudGltZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC50aW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLnRpbWUpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29udHJvbGxlclJlcXVlc3QgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUmVxdWVzdCgpOwogIH07CiAgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmNvbnRyb2xsZXJSZXF1ZXN0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlUmVxdWVzdChvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmNvbnRyb2xsZXJSZXF1ZXN0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0LCB2YWwuY29udHJvbGxlclJlcXVlc3QpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxvY2FsUHJlc2VudCA9IGZhbHNlOwogIH07CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5sb2NhbFByZXNlbnQgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwubG9jYWxQcmVzZW50ICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICB2YXIga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWUgPSA4MzA2MTk5NjI7CiAgdmFyIGtNZWRpYUNvbnRyb2xsZXJfUGF1c2VfTmFtZSA9IDMxODM4OTMzMTsKICB2YXIga01lZGlhQ29udHJvbGxlcl9TZXRNdXRlX05hbWUgPSA4NjkxNDA0NzI7CiAgdmFyIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWUgPSAxMDMzNzEyMDc7CiAgdmFyIGtNZWRpYUNvbnRyb2xsZXJfU2Vla19OYW1lID0gMTI1ODMyODcxNDsKICB2YXIga01lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lID0gMjA4NzQwMzg2MjsKCiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyUHRyKGhhbmRsZU9yUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNZWRpYUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFDb250cm9sbGVyLCBhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbyk7CiAgfQoKICBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoTWVkaWFDb250cm9sbGVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFDb250cm9sbGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgICBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFDb250cm9sbGVyUHRyLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnBsYXkKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnBhdXNlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhQ29udHJvbGxlcl9QYXVzZV9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldE11dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0TXV0ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRNdXRlID0gZnVuY3Rpb24obXV0ZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMoKTsKICAgIHBhcmFtcy5tdXRlID0gbXV0ZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhQ29udHJvbGxlcl9TZXRNdXRlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldFZvbHVtZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRWb2x1bWUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0Vm9sdW1lID0gZnVuY3Rpb24odm9sdW1lKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zKCk7CiAgICBwYXJhbXMudm9sdW1lID0gdm9sdW1lOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZWVrCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbih0aW1lKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcygpOwogICAgcGFyYW1zLnRpbWUgPSB0aW1lOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1NlZWtfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbihjb250cm9sbGVyUmVxdWVzdCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zKCk7CiAgICBwYXJhbXMuY29udHJvbGxlclJlcXVlc3QgPSBjb250cm9sbGVyUmVxdWVzdDsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnBsYXkgJiYgdGhpcy5kZWxlZ2F0ZV8ucGxheSgpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnBhdXNlICYmIHRoaXMuZGVsZWdhdGVfLnBhdXNlKCk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNldE11dGUgPSBmdW5jdGlvbihtdXRlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2V0TXV0ZSAmJiB0aGlzLmRlbGVnYXRlXy5zZXRNdXRlKG11dGUpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5zZXRWb2x1bWUgPSBmdW5jdGlvbih2b2x1bWUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZXRWb2x1bWUgJiYgdGhpcy5kZWxlZ2F0ZV8uc2V0Vm9sdW1lKHZvbHVtZSk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbih0aW1lKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2VlayAmJiB0aGlzLmRlbGVnYXRlXy5zZWVrKHRpbWUpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRyb2xsZXJSZXF1ZXN0KSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlclJlcXVlc3QpOwogIH0KCiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcyk7CiAgICAgIHRoaXMucGxheSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9QYXVzZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zKTsKICAgICAgdGhpcy5wYXVzZSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZXRNdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcyk7CiAgICAgIHRoaXMuc2V0TXV0ZShwYXJhbXMubXV0ZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcyk7CiAgICAgIHRoaXMuc2V0Vm9sdW1lKHBhcmFtcy52b2x1bWUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZWVrX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VlayhwYXJhbXMudGltZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMpOwogICAgICB0aGlzLmNvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyKHBhcmFtcy5jb250cm9sbGVyUmVxdWVzdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYUNvbnRyb2xsZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1BsYXlfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfUGF1c2VfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2Vla19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFDb250cm9sbGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9CgogIHZhciBNZWRpYUNvbnRyb2xsZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyOjptb2pvbTo6TWVkaWFDb250cm9sbGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1lZGlhQ29udHJvbGxlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhQ29udHJvbGxlclByb3h5LAogICAgc3R1YkNsYXNzOiBNZWRpYUNvbnRyb2xsZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1lZGlhQ29udHJvbGxlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAogIH07CiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYUNvbnRyb2xsZXJSZXF1ZXN0OwogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSBudWxsOwogIHZhciBrSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfTmFtZSA9IDExMDI4OTA1OTg7CgogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0ci5wcm90b3R5cGUpOwogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldExvY2FsUHJlc2VudCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0TG9jYWxQcmVzZW50CiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRMb2NhbFByZXNlbnQgPSBmdW5jdGlvbihsb2NhbFByZXNlbnQpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zKCk7CiAgICBwYXJhbXMubG9jYWxQcmVzZW50ID0gbG9jYWxQcmVzZW50OwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNldExvY2FsUHJlc2VudCA9IGZ1bmN0aW9uKGxvY2FsUHJlc2VudCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNldExvY2FsUHJlc2VudCAmJiB0aGlzLmRlbGVnYXRlXy5zZXRMb2NhbFByZXNlbnQobG9jYWxQcmVzZW50KTsKICB9CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zKTsKICAgICAgdGhpcy5zZXRMb2NhbFByZXNlbnQocGFyYW1zLmxvY2FsUHJlc2VudCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5hY2NlcHRXaXRoUmVzcG9uZGVyID0KICAgICAgZnVuY3Rpb24obWVzc2FnZSwgcmVzcG9uZGVyKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9CgogIHZhciBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyID0gewogICAgbmFtZTogJ21lZGlhX3JvdXRlcjo6bW9qb206OkhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0ciwKICAgIHByb3h5Q2xhc3M6IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQcm94eSwKICAgIHN0dWJDbGFzczogSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IHZhbGlkYXRlSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAogIH07CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclJlcXVlc3Q7CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSBudWxsOwogIGV4cG9ydHMuTWVkaWFDb250cm9sbGVyID0gTWVkaWFDb250cm9sbGVyOwogIGV4cG9ydHMuTWVkaWFDb250cm9sbGVyUHRyID0gTWVkaWFDb250cm9sbGVyUHRyOwogIGV4cG9ydHMuTWVkaWFDb250cm9sbGVyQXNzb2NpYXRlZFB0ciA9IE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHI7CiAgZXhwb3J0cy5IYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyID0gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcjsKICBleHBvcnRzLkhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIgPSBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHRyOwogIGV4cG9ydHMuSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlckFzc29jaWF0ZWRQdHIgPSBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyQXNzb2NpYXRlZFB0cjsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfcm91dGVyLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICB2YXIgbWVkaWFfY29udHJvbGxlciQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfY29udHJvbGxlci5tb2pvbScsICdtZWRpYV9jb250cm9sbGVyLm1vam9tLmpzJyk7CiAgfQogIHZhciBtZWRpYV9zdGF0dXMkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3N0YXR1cy5tb2pvbScsICdtZWRpYV9zdGF0dXMubW9qb20uanMnKTsKICB9CiAgdmFyIG1pcnJvcl9zZXJ2aWNlX3JlbW90aW5nJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYS5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbWVkaWEvbW9qby9pbnRlcmZhY2VzL21pcnJvcl9zZXJ2aWNlX3JlbW90aW5nLm1vam9tJywgJy4uLy4uLy4uLy4uL21lZGlhL21vam8vaW50ZXJmYWNlcy9taXJyb3Jfc2VydmljZV9yZW1vdGluZy5tb2pvbS5qcycpOwogIH0KICB2YXIgdGltZSQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qby5jb21tb24ubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21vam8vY29tbW9uL3RpbWUubW9qb20nLCAnLi4vLi4vLi4vLi4vbW9qby9jb21tb24vdGltZS5tb2pvbS5qcycpOwogIH0KICB2YXIgaXBfYWRkcmVzcyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ25ldC9pbnRlcmZhY2VzL2lwX2FkZHJlc3MubW9qb20nLCAnLi4vLi4vLi4vLi4vbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbS5qcycpOwogIH0KICB2YXIgaXBfZW5kcG9pbnQkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ25ldC5pbnRlcmZhY2VzJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICduZXQvaW50ZXJmYWNlcy9pcF9lbmRwb2ludC5tb2pvbScsICcuLi8uLi8uLi8uLi9uZXQvaW50ZXJmYWNlcy9pcF9lbmRwb2ludC5tb2pvbS5qcycpOwogIH0KICB2YXIgb3JpZ2luJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCd1cmwubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ3VybC9tb2pvL29yaWdpbi5tb2pvbScsICcuLi8uLi8uLi8uLi91cmwvbW9qby9vcmlnaW4ubW9qb20uanMnKTsKICB9CiAgdmFyIHVybCQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgndXJsLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICd1cmwvbW9qby91cmwubW9qb20nLCAnLi4vLi4vLi4vLi4vdXJsL21vam8vdXJsLm1vam9tLmpzJyk7CiAgfQoKCiAgdmFyIFNpbmtJY29uVHlwZSA9IHt9OwogIFNpbmtJY29uVHlwZS5DQVNUID0gMDsKICBTaW5rSWNvblR5cGUuQ0FTVF9BVURJT19HUk9VUCA9IFNpbmtJY29uVHlwZS5DQVNUICsgMTsKICBTaW5rSWNvblR5cGUuQ0FTVF9BVURJTyA9IFNpbmtJY29uVHlwZS5DQVNUX0FVRElPX0dST1VQICsgMTsKICBTaW5rSWNvblR5cGUuTUVFVElORyA9IFNpbmtJY29uVHlwZS5DQVNUX0FVRElPICsgMTsKICBTaW5rSWNvblR5cGUuSEFOR09VVCA9IFNpbmtJY29uVHlwZS5NRUVUSU5HICsgMTsKICBTaW5rSWNvblR5cGUuRURVQ0FUSU9OID0gU2lua0ljb25UeXBlLkhBTkdPVVQgKyAxOwogIFNpbmtJY29uVHlwZS5XSVJFRF9ESVNQTEFZID0gU2lua0ljb25UeXBlLkVEVUNBVElPTiArIDE7CiAgU2lua0ljb25UeXBlLkdFTkVSSUMgPSBTaW5rSWNvblR5cGUuV0lSRURfRElTUExBWSArIDE7CgogIFNpbmtJY29uVHlwZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgU2lua0ljb25UeXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSb3V0ZUNvbnRyb2xsZXJUeXBlID0ge307CiAgUm91dGVDb250cm9sbGVyVHlwZS5rTm9uZSA9IDA7CiAgUm91dGVDb250cm9sbGVyVHlwZS5rR2VuZXJpYyA9IFJvdXRlQ29udHJvbGxlclR5cGUua05vbmUgKyAxOwogIFJvdXRlQ29udHJvbGxlclR5cGUua0hhbmdvdXRzID0gUm91dGVDb250cm9sbGVyVHlwZS5rR2VuZXJpYyArIDE7CiAgUm91dGVDb250cm9sbGVyVHlwZS5rTWlycm9yaW5nID0gUm91dGVDb250cm9sbGVyVHlwZS5rSGFuZ291dHMgKyAxOwoKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlID0ge307CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SID0gMDsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk9LID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SICsgMTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlRJTUVEX09VVCA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuT0sgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuUk9VVEVfTk9UX0ZPVU5EID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5USU1FRF9PVVQgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuU0lOS19OT1RfRk9VTkQgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlJPVVRFX05PVF9GT1VORCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5JTlZBTElEX09SSUdJTiA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuU0lOS19OT1RfRk9VTkQgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuSU5DT0dOSVRPX01JU01BVENIID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5JTlZBTElEX09SSUdJTiArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5OT19TVVBQT1JURURfUFJPVklERVIgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLklOQ09HTklUT19NSVNNQVRDSCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5DQU5DRUxMRUQgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk5PX1NVUFBPUlRFRF9QUk9WSURFUiArIDE7CgogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICBjYXNlIDQ6CiAgICBjYXNlIDU6CiAgICBjYXNlIDY6CiAgICBjYXNlIDc6CiAgICBjYXNlIDg6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIGZ1bmN0aW9uIE1lZGlhU2luayh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhU2luay5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaW5rSWQgPSBudWxsOwogICAgdGhpcy5uYW1lID0gbnVsbDsKICAgIHRoaXMuZGVzY3JpcHRpb24gPSBudWxsOwogICAgdGhpcy5kb21haW4gPSBudWxsOwogICAgdGhpcy5pY29uVHlwZSA9IDA7CiAgICB0aGlzLnByb3ZpZGVySWQgPSAwOwogICAgdGhpcy5leHRyYURhdGEgPSBudWxsOwogIH07CiAgTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFTaW5rLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDY0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTaW5rLnNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsubmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuZGVzY3JpcHRpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTaW5rLmRvbWFpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuaWNvblR5cGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIFNpbmtJY29uVHlwZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTaW5rLnByb3ZpZGVySWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzYsIE1lZGlhUm91dGVQcm92aWRlci5JZCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTaW5rLmV4dHJhRGF0YQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVVuaW9uKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDAsIE1lZGlhU2lua0V4dHJhRGF0YSwgdHJ1ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhU2luay5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNTY7CgogIE1lZGlhU2luay5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVNpbmsoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubmFtZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZGVzY3JpcHRpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwuZG9tYWluID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLmljb25UeXBlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLnByb3ZpZGVySWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwuZXh0cmFEYXRhID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoTWVkaWFTaW5rRXh0cmFEYXRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFTaW5rLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFTaW5rLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zaW5rSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubmFtZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLmRlc2NyaXB0aW9uKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZG9tYWluKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuaWNvblR5cGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wcm92aWRlcklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KE1lZGlhU2lua0V4dHJhRGF0YSwgdmFsLmV4dHJhRGF0YSk7CiAgfTsKICBmdW5jdGlvbiBEaWFsTWVkaWFTaW5rKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgRGlhbE1lZGlhU2luay5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pcEFkZHJlc3MgPSBudWxsOwogICAgdGhpcy5tb2RlbE5hbWUgPSBudWxsOwogICAgdGhpcy5hcHBVcmwgPSBudWxsOwogIH07CiAgRGlhbE1lZGlhU2luay5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIERpYWxNZWRpYVNpbmsudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBEaWFsTWVkaWFTaW5rLmlwQWRkcmVzcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBpcF9hZGRyZXNzJC5JUEFkZHJlc3MsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBEaWFsTWVkaWFTaW5rLm1vZGVsTmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBEaWFsTWVkaWFTaW5rLmFwcFVybAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgdXJsJC5VcmwsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgRGlhbE1lZGlhU2luay5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIERpYWxNZWRpYVNpbmsuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgRGlhbE1lZGlhU2luaygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaXBBZGRyZXNzID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKGlwX2FkZHJlc3MkLklQQWRkcmVzcyk7CiAgICB2YWwubW9kZWxOYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5hcHBVcmwgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodXJsJC5VcmwpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBEaWFsTWVkaWFTaW5rLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoRGlhbE1lZGlhU2luay5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKGlwX2FkZHJlc3MkLklQQWRkcmVzcywgdmFsLmlwQWRkcmVzcyk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tb2RlbE5hbWUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHVybCQuVXJsLCB2YWwuYXBwVXJsKTsKICB9OwogIGZ1bmN0aW9uIENhc3RNZWRpYVNpbmsodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBDYXN0TWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlwRW5kcG9pbnQgPSBudWxsOwogICAgdGhpcy5tb2RlbE5hbWUgPSBudWxsOwogICAgdGhpcy5jYXBhYmlsaXRpZXMgPSAwOwogICAgdGhpcy5jYXN0Q2hhbm5lbElkID0gMDsKICB9OwogIENhc3RNZWRpYVNpbmsucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBDYXN0TWVkaWFTaW5rLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgQ2FzdE1lZGlhU2luay5pcEVuZHBvaW50CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGlwX2VuZHBvaW50JC5JUEVuZFBvaW50LCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgQ2FzdE1lZGlhU2luay5tb2RlbE5hbWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgQ2FzdE1lZGlhU2luay5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIENhc3RNZWRpYVNpbmsuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgQ2FzdE1lZGlhU2luaygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaXBFbmRwb2ludCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihpcF9lbmRwb2ludCQuSVBFbmRQb2ludCk7CiAgICB2YWwubW9kZWxOYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5jYXBhYmlsaXRpZXMgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5VaW50OCk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwuY2FzdENoYW5uZWxJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgQ2FzdE1lZGlhU2luay5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKENhc3RNZWRpYVNpbmsuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihpcF9lbmRwb2ludCQuSVBFbmRQb2ludCwgdmFsLmlwRW5kcG9pbnQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubW9kZWxOYW1lKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlVpbnQ4LCB2YWwuY2FwYWJpbGl0aWVzKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuY2FzdENoYW5uZWxJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZS5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50YXRpb25JZCA9IG51bGw7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMubWVkaWFTaW5rSWQgPSBudWxsOwogICAgdGhpcy5kZXNjcmlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmlzTG9jYWwgPSBmYWxzZTsKICAgIHRoaXMuZm9yRGlzcGxheSA9IGZhbHNlOwogICAgdGhpcy5pc0luY29nbml0byA9IGZhbHNlOwogICAgdGhpcy5pc0xvY2FsUHJlc2VudGF0aW9uID0gZmFsc2U7CiAgICB0aGlzLmNvbnRyb2xsZXJUeXBlID0gMDsKICB9OwogIE1lZGlhUm91dGUucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDU2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5tZWRpYVJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5wcmVzZW50YXRpb25JZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUubWVkaWFTaW5rSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUuZGVzY3JpcHRpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLmNvbnRyb2xsZXJUeXBlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQ0LCBSb3V0ZUNvbnRyb2xsZXJUeXBlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDg7CgogIE1lZGlhUm91dGUuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFSb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5wcmVzZW50YXRpb25JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwubWVkaWFTaW5rSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmRlc2NyaXB0aW9uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaXNMb2NhbCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmZvckRpc3BsYXkgPSAocGFja2VkID4+IDEpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5pc0luY29nbml0byA9IChwYWNrZWQgPj4gMikgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmlzTG9jYWxQcmVzZW50YXRpb24gPSAocGFja2VkID4+IDMpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5jb250cm9sbGVyVHlwZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGUuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhUm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5wcmVzZW50YXRpb25JZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU2lua0lkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmRlc2NyaXB0aW9uKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5pc0xvY2FsICYgMSkgPDwgMAogICAgcGFja2VkIHw9ICh2YWwuZm9yRGlzcGxheSAmIDEpIDw8IDEKICAgIHBhY2tlZCB8PSAodmFsLmlzSW5jb2duaXRvICYgMSkgPDwgMgogICAgcGFja2VkIHw9ICh2YWwuaXNMb2NhbFByZXNlbnRhdGlvbiAmIDEpIDw8IDMKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5jb250cm9sbGVyVHlwZSk7CiAgfTsKICBmdW5jdGlvbiBJc3N1ZSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCiAgSXNzdWUuU2V2ZXJpdHkgPSB7fTsKICBJc3N1ZS5TZXZlcml0eS5GQVRBTCA9IDA7CiAgSXNzdWUuU2V2ZXJpdHkuV0FSTklORyA9IElzc3VlLlNldmVyaXR5LkZBVEFMICsgMTsKICBJc3N1ZS5TZXZlcml0eS5OT1RJRklDQVRJT04gPSBJc3N1ZS5TZXZlcml0eS5XQVJOSU5HICsgMTsKCiAgSXNzdWUuU2V2ZXJpdHkuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIElzc3VlLlNldmVyaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIElzc3VlLkFjdGlvblR5cGUgPSB7fTsKICBJc3N1ZS5BY3Rpb25UeXBlLkRJU01JU1MgPSAwOwogIElzc3VlLkFjdGlvblR5cGUuTEVBUk5fTU9SRSA9IElzc3VlLkFjdGlvblR5cGUuRElTTUlTUyArIDE7CgogIElzc3VlLkFjdGlvblR5cGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIElzc3VlLkFjdGlvblR5cGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIElzc3VlLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5zZXZlcml0eSA9IDA7CiAgICB0aGlzLmlzQmxvY2tpbmcgPSBmYWxzZTsKICAgIHRoaXMudGl0bGUgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMuZGVmYXVsdEFjdGlvbiA9IDA7CiAgICB0aGlzLmhlbHBQYWdlSWQgPSAwOwogICAgdGhpcy5zZWNvbmRhcnlBY3Rpb25zID0gbnVsbDsKICB9OwogIElzc3VlLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgSXNzdWUudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgSXNzdWUuc2V2ZXJpdHkKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgSXNzdWUuU2V2ZXJpdHkpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS50aXRsZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgSXNzdWUubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5kZWZhdWx0QWN0aW9uCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyLCBJc3N1ZS5BY3Rpb25UeXBlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5zZWNvbmRhcnlBY3Rpb25zCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDAsIDQsIG5ldyBjb2RlYy5FbnVtKElzc3VlLkFjdGlvblR5cGUpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIElzc3VlLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0ODsKCiAgSXNzdWUuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgSXNzdWUoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwuc2V2ZXJpdHkgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmlzQmxvY2tpbmcgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC50aXRsZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5kZWZhdWx0QWN0aW9uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLmhlbHBQYWdlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwuc2Vjb25kYXJ5QWN0aW9ucyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKElzc3VlLkFjdGlvblR5cGUpKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgSXNzdWUuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihJc3N1ZS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuc2V2ZXJpdHkpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmlzQmxvY2tpbmcgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnRpdGxlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwubWVzc2FnZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmRlZmF1bHRBY3Rpb24pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5oZWxwUGFnZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKElzc3VlLkFjdGlvblR5cGUpLCB2YWwuc2Vjb25kYXJ5QWN0aW9ucyk7CiAgfTsKICBmdW5jdGlvbiBSb3V0ZU1lc3NhZ2UodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgogIFJvdXRlTWVzc2FnZS5UeXBlID0ge307CiAgUm91dGVNZXNzYWdlLlR5cGUuVEVYVCA9IDA7CiAgUm91dGVNZXNzYWdlLlR5cGUuQklOQVJZID0gUm91dGVNZXNzYWdlLlR5cGUuVEVYVCArIDE7CgogIFJvdXRlTWVzc2FnZS5UeXBlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSb3V0ZU1lc3NhZ2UuVHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgUm91dGVNZXNzYWdlLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnR5cGUgPSAwOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgfTsKICBSb3V0ZU1lc3NhZ2UucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBSb3V0ZU1lc3NhZ2UudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSb3V0ZU1lc3NhZ2UudHlwZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBSb3V0ZU1lc3NhZ2UuVHlwZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUm91dGVNZXNzYWdlLm1lc3NhZ2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSb3V0ZU1lc3NhZ2UuZGF0YQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCAxLCBjb2RlYy5VaW50OCwgdHJ1ZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgUm91dGVNZXNzYWdlLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgUm91dGVNZXNzYWdlLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFJvdXRlTWVzc2FnZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudHlwZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLmRhdGEgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFJvdXRlTWVzc2FnZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFJvdXRlTWVzc2FnZS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC50eXBlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwubWVzc2FnZSk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCwgdmFsLmRhdGEpOwogIH07CiAgZnVuY3Rpb24gU2lua1NlYXJjaENyaXRlcmlhKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgU2lua1NlYXJjaENyaXRlcmlhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlucHV0ID0gbnVsbDsKICAgIHRoaXMuZG9tYWluID0gbnVsbDsKICB9OwogIFNpbmtTZWFyY2hDcml0ZXJpYS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFNpbmtTZWFyY2hDcml0ZXJpYS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFNpbmtTZWFyY2hDcml0ZXJpYS5pbnB1dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBTaW5rU2VhcmNoQ3JpdGVyaWEuZG9tYWluCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBTaW5rU2VhcmNoQ3JpdGVyaWEuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBTaW5rU2VhcmNoQ3JpdGVyaWEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgU2lua1NlYXJjaENyaXRlcmlhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pbnB1dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZG9tYWluID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgU2lua1NlYXJjaENyaXRlcmlhLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoU2lua1NlYXJjaENyaXRlcmlhLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5pbnB1dCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5kb21haW4pOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVuYWJsZURpYWxEaXNjb3ZlcnkgPSBmYWxzZTsKICAgIHRoaXMuZW5hYmxlQ2FzdERpc2NvdmVyeSA9IGZhbHNlOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuZW5hYmxlRGlhbERpc2NvdmVyeSA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmVuYWJsZUNhc3REaXNjb3ZlcnkgPSAocGFja2VkID4+IDEpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuZW5hYmxlRGlhbERpc2NvdmVyeSAmIDEpIDw8IDAKICAgIHBhY2tlZCB8PSAodmFsLmVuYWJsZUNhc3REaXNjb3ZlcnkgJiAxKSA8PCAxCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMuc2lua0lkID0gbnVsbDsKICAgIHRoaXMub3JpZ2luYWxQcmVzZW50YXRpb25JZCA9IG51bGw7CiAgICB0aGlzLm9yaWdpbiA9IG51bGw7CiAgICB0aGlzLnRhYklkID0gMDsKICAgIHRoaXMuaW5jb2duaXRvID0gZmFsc2U7CiAgICB0aGlzLnRpbWVvdXQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMub3JpZ2luYWxQcmVzZW50YXRpb25JZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5vcmlnaW4KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIG9yaWdpbiQuT3JpZ2luLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMudGltZW91dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgdGltZSQuVGltZURlbHRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0ODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5vcmlnaW5hbFByZXNlbnRhdGlvbklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5vcmlnaW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4pOwogICAgdmFsLnRhYklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5pbmNvZ25pdG8gPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC50aW1lb3V0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zaW5rSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwub3JpZ2luYWxQcmVzZW50YXRpb25JZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4sIHZhbC5vcmlnaW4pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC50YWJJZCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuaW5jb2duaXRvICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhLCB2YWwudGltZW91dCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGUgPSBudWxsOwogICAgdGhpcy5lcnJvclRleHQgPSBudWxsOwogICAgdGhpcy5yZXN1bHRDb2RlID0gMDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5yb3V0ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlKTsKICAgIHZhbC5lcnJvclRleHQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwucmVzdWx0Q29kZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSwgdmFsLnJvdXRlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZXJyb3JUZXh0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVzdWx0Q29kZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMucHJlc2VudGF0aW9uSWQgPSBudWxsOwogICAgdGhpcy5vcmlnaW4gPSBudWxsOwogICAgdGhpcy50YWJJZCA9IDA7CiAgICB0aGlzLmluY29nbml0byA9IGZhbHNlOwogICAgdGhpcy50aW1lb3V0ID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5wcmVzZW50YXRpb25JZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5vcmlnaW4KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIG9yaWdpbiQuT3JpZ2luLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLnRpbWVvdXQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQwOwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnByZXNlbnRhdGlvbklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5vcmlnaW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4pOwogICAgdmFsLnRhYklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5pbmNvZ25pdG8gPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC50aW1lb3V0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnByZXNlbnRhdGlvbklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbiwgdmFsLm9yaWdpbik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnRhYklkKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5pbmNvZ25pdG8gJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEsIHZhbC50aW1lb3V0KTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlID0gbnVsbDsKICAgIHRoaXMuZXJyb3JUZXh0ID0gbnVsbDsKICAgIHRoaXMucmVzdWx0Q29kZSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMucm91dGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZSwgdHJ1ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5lcnJvclRleHQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlKTsKICAgIHZhbC5lcnJvclRleHQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwucmVzdWx0Q29kZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlLCB2YWwucm91dGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5lcnJvclRleHQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZXN1bHRDb2RlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMucHJlc2VudGF0aW9uSWQgPSBudWxsOwogICAgdGhpcy5vcmlnaW4gPSBudWxsOwogICAgdGhpcy50YWJJZCA9IDA7CiAgICB0aGlzLmluY29nbml0byA9IGZhbHNlOwogICAgdGhpcy50aW1lb3V0ID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnByZXNlbnRhdGlvbklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5vcmlnaW4KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIG9yaWdpbiQuT3JpZ2luLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnRpbWVvdXQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDAsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQ4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnByZXNlbnRhdGlvbklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5vcmlnaW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4pOwogICAgdmFsLnRhYklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5pbmNvZ25pdG8gPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC50aW1lb3V0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucHJlc2VudGF0aW9uSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luLCB2YWwub3JpZ2luKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudGFiSWQpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmluY29nbml0byAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLnRpbWVvdXQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGUgPSBudWxsOwogICAgdGhpcy5lcnJvclRleHQgPSBudWxsOwogICAgdGhpcy5yZXN1bHRDb2RlID0gMDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5yb3V0ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVycm9yVGV4dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUpOwogICAgdmFsLmVycm9yVGV4dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5yZXN1bHRDb2RlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUsIHZhbC5yb3V0ZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLmVycm9yVGV4dCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlc3VsdENvZGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVycm9yVGV4dCA9IG51bGw7CiAgICB0aGlzLnJlc3VsdENvZGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVycm9yVGV4dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5lcnJvclRleHQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwucmVzdWx0Q29kZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLmVycm9yVGV4dCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlc3VsdENvZGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhUm91dGVJZCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLm1lZGlhUm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFSb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVzc2FnZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNlbnQgPSBmYWxzZTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLnNlbnQgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLnNlbnQgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5tZWRpYVJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmRhdGEKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCAxLCBjb2RlYy5VaW50OCwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhUm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZGF0YSA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgsIHZhbC5kYXRhKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuc2VudCA9IGZhbHNlOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuc2VudCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuc2VudCAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMuc2VhcmNoQ3JpdGVyaWEgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLnNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuc2VhcmNoQ3JpdGVyaWEKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIFNpbmtTZWFyY2hDcml0ZXJpYSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5zaW5rSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zZWFyY2hDcml0ZXJpYSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihTaW5rU2VhcmNoQ3JpdGVyaWEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuc2lua0lkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihTaW5rU2VhcmNoQ3JpdGVyaWEsIHZhbC5zZWFyY2hDcml0ZXJpYSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuc2lua0lkID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5zaW5rSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zaW5rSWQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm92aWRlck5hbWUgPSBudWxsOwogICAgdGhpcy5zaW5rcyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMucHJvdmlkZXJOYW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLnNpbmtzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgOCwgbmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucHJvdmlkZXJOYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zaW5rcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnByb3ZpZGVyTmFtZSk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luayksIHZhbC5zaW5rcyk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMubWVkaWFDb250cm9sbGVyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVJlcXVlc3QoKTsKICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgbWVkaWFfc3RhdHVzJC5NZWRpYVN0YXR1c09ic2VydmVyUHRyKCk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLm1lZGlhQ29udHJvbGxlcgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUludGVyZmFjZVJlcXVlc3Qob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLm9ic2VydmVyCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTIsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVkaWFDb250cm9sbGVyID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCk7CiAgICB2YWwub2JzZXJ2ZXIgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKG1lZGlhX3N0YXR1cyQuTWVkaWFTdGF0dXNPYnNlcnZlclB0cikpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0LCB2YWwubWVkaWFDb250cm9sbGVyKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UobWVkaWFfc3RhdHVzJC5NZWRpYVN0YXR1c09ic2VydmVyUHRyKSwgdmFsLm9ic2VydmVyKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdWNjZXNzID0gZmFsc2U7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLnN1Y2Nlc3MgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuc3VjY2VzcyAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3ZpZGVySWQgPSAwOwogICAgdGhpcy5tZWRpYVJvdXRlclByb3ZpZGVyID0gbmV3IE1lZGlhUm91dGVQcm92aWRlclB0cigpOwogIH07CiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLnByb3ZpZGVySWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMubWVkaWFSb3V0ZXJQcm92aWRlcgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUludGVyZmFjZShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5tZWRpYVJvdXRlclByb3ZpZGVyID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShNZWRpYVJvdXRlUHJvdmlkZXJQdHIpKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShNZWRpYVJvdXRlUHJvdmlkZXJQdHIpLCB2YWwubWVkaWFSb3V0ZXJQcm92aWRlcik7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmluc3RhbmNlSWQgPSBudWxsOwogICAgdGhpcy5jb25maWcgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmluc3RhbmNlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuY29uZmlnCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIE1lZGlhUm91dGVQcm92aWRlckNvbmZpZywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pbnN0YW5jZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5jb25maWcgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuaW5zdGFuY2VJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLCB2YWwuY29uZmlnKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3ZpZGVySWQgPSAwOwogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLnNpbmtzID0gbnVsbDsKICAgIHRoaXMub3JpZ2lucyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA0MH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlUHJvdmlkZXIuSWQpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5zaW5rcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCA4LCBuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luayksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMub3JpZ2lucwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCA4LCBuZXcgY29kZWMuUG9pbnRlclRvKG9yaWdpbiQuT3JpZ2luKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyOwoKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnByb3ZpZGVySWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnNpbmtzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspKTsKICAgIHZhbC5vcmlnaW5zID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhvcmlnaW4kLk9yaWdpbikpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wcm92aWRlcklkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSwgdmFsLnNpbmtzKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8ob3JpZ2luJC5PcmlnaW4pLCB2YWwub3JpZ2lucyk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzc3VlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5pc3N1ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBJc3N1ZSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmlzc3VlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKElzc3VlKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKElzc3VlLCB2YWwuaXNzdWUpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLnJvdXRlcyA9IG51bGw7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMuam9pbmFibGVSb3V0ZUlkcyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA0MH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlUHJvdmlkZXIuSWQpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMucm91dGVzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgOCwgbmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVJvdXRlKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5qb2luYWJsZVJvdXRlSWRzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIDgsIGNvZGVjLlN0cmluZywgZmFsc2UsIFswLCAwXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyOwoKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnByb3ZpZGVySWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwucm91dGVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVJvdXRlKSk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmpvaW5hYmxlUm91dGVJZHMgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wcm92aWRlcklkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFSb3V0ZSksIHZhbC5yb3V0ZXMpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIoY29kZWMuU3RyaW5nLCB2YWwuam9pbmFibGVSb3V0ZUlkcyk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3ZpZGVySWQgPSAwOwogICAgdGhpcy5hdmFpbGFiaWxpdHkgPSAwOwogIH07CiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLnByb3ZpZGVySWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5hdmFpbGFiaWxpdHkKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNCwgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5hdmFpbGFiaWxpdHkgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucHJvdmlkZXJJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmF2YWlsYWJpbGl0eSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMuc3RhdGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5zdGF0ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zdGF0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5zdGF0ZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMucmVhc29uID0gMDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLnJlYXNvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24pOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnJlYXNvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZWFzb24pOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVzc2FnZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2VzID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5tZXNzYWdlcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIDgsIG5ldyBjb2RlYy5Qb2ludGVyVG8oUm91dGVNZXNzYWdlKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm1lc3NhZ2VzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhSb3V0ZU1lc3NhZ2UpKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oUm91dGVNZXNzYWdlKSwgdmFsLm1lc3NhZ2VzKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRhYklkID0gMDsKICAgIHRoaXMucmVtb3RlciA9IG5ldyBtaXJyb3Jfc2VydmljZV9yZW1vdGluZyQuTWlycm9yU2VydmljZVJlbW90ZXJQdHIoKTsKICAgIHRoaXMucmVtb3RpbmdTb3VyY2UgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUmVxdWVzdCgpOwogIH07CiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5yZW1vdGVyCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNCwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMucmVtb3RpbmdTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2VSZXF1ZXN0KG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTIsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC50YWJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5yZW1vdGVyID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShtaXJyb3Jfc2VydmljZV9yZW1vdGluZyQuTWlycm9yU2VydmljZVJlbW90ZXJQdHIpKTsKICAgIHZhbC5yZW1vdGluZ1NvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludGVyZmFjZVJlcXVlc3QpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC50YWJJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKG1pcnJvcl9zZXJ2aWNlX3JlbW90aW5nJC5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ciksIHZhbC5yZW1vdGVyKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludGVyZmFjZVJlcXVlc3QsIHZhbC5yZW1vdGluZ1NvdXJjZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFTaW5rRXh0cmFEYXRhKHZhbHVlKSB7CiAgICB0aGlzLmluaXREZWZhdWx0XygpOwogICAgdGhpcy5pbml0VmFsdWVfKHZhbHVlKTsKICB9CiAgCiAgCiAgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MgPSB7CiAgICBkaWFsTWVkaWFTaW5rOiAwLAogICAgY2FzdE1lZGlhU2luazogMSwKICB9OwogIAogIE1lZGlhU2lua0V4dHJhRGF0YS5wcm90b3R5cGUuaW5pdERlZmF1bHRfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLiRkYXRhID0gbnVsbDsKICAgIHRoaXMuJHRhZyA9IHVuZGVmaW5lZDsKICB9CiAgCiAgTWVkaWFTaW5rRXh0cmFEYXRhLnByb3RvdHlwZS5pbml0VmFsdWVfID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogIAogICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7CiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm47CiAgICB9CiAgCiAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBtYXkgc2V0IG9ubHkgb25lIG1lbWJlciBvbiBhIHVuaW9uLiIpOwogICAgfQogIAogICAgdmFyIGZpZWxkcyA9IFsKICAgICAgICAiZGlhbE1lZGlhU2luayIsCiAgICAgICAgImNhc3RNZWRpYVNpbmsiLAogICAgXTsKICAKICAgIGlmIChmaWVsZHMuaW5kZXhPZihrZXlzWzBdKSA8IDApIHsKICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGtleXNbMF0gKyAiIGlzIG5vdCBhIE1lZGlhU2lua0V4dHJhRGF0YSBtZW1iZXIuIik7CiAgCiAgICB9CiAgCiAgICB0aGlzW2tleXNbMF1dID0gdmFsdWVba2V5c1swXV07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLCAiZGlhbE1lZGlhU2luayIsIHsKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luaykgewogICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICAgIk1lZGlhU2lua0V4dHJhRGF0YS5kaWFsTWVkaWFTaW5rIGlzIG5vdCBjdXJyZW50bHkgc2V0LiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLiRkYXRhOwogICAgfSwKICAKICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgdGhpcy4kdGFnID0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazsKICAgICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogICAgfQogIH0pOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLCAiY2FzdE1lZGlhU2luayIsIHsKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luaykgewogICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICAgIk1lZGlhU2lua0V4dHJhRGF0YS5jYXN0TWVkaWFTaW5rIGlzIG5vdCBjdXJyZW50bHkgc2V0LiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLiRkYXRhOwogICAgfSwKICAKICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgdGhpcy4kdGFnID0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luazsKICAgICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogICAgfQogIH0pOwogIAogIAogICAgTWVkaWFTaW5rRXh0cmFEYXRhLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgICBpZiAodmFsID09IG51bGwpIHsKICAgICAgICBlbmNvZGVyLndyaXRlVWludDY0KDApOwogICAgICAgIGVuY29kZXIud3JpdGVVaW50NjQoMCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh2YWwuJHRhZyA9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgZW5jb2RlIHVuaW9ucyB3aXRoIGFuIHVua25vd24gbWVtYmVyIHNldC4iKTsKICAgICAgfQogICAgCiAgICAgIGVuY29kZXIud3JpdGVVaW50MzIoMTYpOwogICAgICBlbmNvZGVyLndyaXRlVWludDMyKHZhbC4kdGFnKTsKICAgICAgc3dpdGNoICh2YWwuJHRhZykgewogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazoKICAgICAgICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihEaWFsTWVkaWFTaW5rLCB2YWwuZGlhbE1lZGlhU2luayk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmNhc3RNZWRpYVNpbms6CiAgICAgICAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoQ2FzdE1lZGlhU2luaywgdmFsLmNhc3RNZWRpYVNpbmspOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZW5jb2Rlci5hbGlnbigpOwogICAgfTsKICAKICAKICAgIE1lZGlhU2lua0V4dHJhRGF0YS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICAgIHZhciBzaXplID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICAgIGlmIChzaXplID09IDApIHsKICAgICAgICBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgICAgICBkZWNvZGVyLnJlYWRVaW50NjQoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgCiAgICAgIHZhciByZXN1bHQgPSBuZXcgTWVkaWFTaW5rRXh0cmFEYXRhKCk7CiAgICAgIHZhciB0YWcgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICBjYXNlIE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmRpYWxNZWRpYVNpbms6CiAgICAgICAgICByZXN1bHQuZGlhbE1lZGlhU2luayA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihEaWFsTWVkaWFTaW5rKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luazoKICAgICAgICAgIHJlc3VsdC5jYXN0TWVkaWFTaW5rID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKENhc3RNZWRpYVNpbmspOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVjb2Rlci5hbGlnbigpOwogICAgCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIAogIAogICAgTWVkaWFTaW5rRXh0cmFEYXRhLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICAgIHZhciBzaXplID0gbWVzc2FnZVZhbGlkYXRvci5kZWNvZGVVbmlvblNpemUob2Zmc2V0KTsKICAgICAgaWYgKHNpemUgIT0gMTYpIHsKICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5JTlZBTElEX1VOSU9OX1NJWkU7CiAgICAgIH0KICAgIAogICAgICB2YXIgdGFnID0gbWVzc2FnZVZhbGlkYXRvci5kZWNvZGVVbmlvblRhZyhvZmZzZXQpOwogICAgICB2YXIgZGF0YV9vZmZzZXQgPSBvZmZzZXQgKyA4OwogICAgICB2YXIgZXJyOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazoKICAgICAgICAgIAogICAgCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmtFeHRyYURhdGEuZGlhbE1lZGlhU2luawogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIoZGF0YV9vZmZzZXQsIERpYWxNZWRpYVNpbmssIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5jYXN0TWVkaWFTaW5rOgogICAgICAgICAgCiAgICAKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2lua0V4dHJhRGF0YS5jYXN0TWVkaWFTaW5rCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihkYXRhX29mZnNldCwgQ2FzdE1lZGlhU2luaywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICB9OwogIAogIE1lZGlhU2lua0V4dHJhRGF0YS5lbmNvZGVkU2l6ZSA9IDE2OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX05hbWUgPSA4MjQxNTQ0NDI7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWUgPSAzOTg2MzM3MDsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZSA9IDE5ODU0ODA0ODE7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfTmFtZSA9IDE3Mzc2MjQ0OTk7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lID0gNjg3NDg5NTYxOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfTmFtZSA9IDE0MDMzMzUwMTU7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUgPSAyMDUyMzc2MDc2OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUgPSAzNjUxNTAyNTY7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lID0gMTk4NjcyODUyNzsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZSA9IDkzMDg3MzcwOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lID0gNDYzNDExNDU5OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX05hbWUgPSAxNjg4MDgwMTQ1OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWUgPSA3MDgzODAyNjc7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9OYW1lID0gMTA0MjE2MzMyMDsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX05hbWUgPSA2MTk4MzYyMzg7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZSA9IDIxMTkwMzY5MDI7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX05hbWUgPSA2MzIxNDkyOTU7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZSA9IDE2MDU2NTY3OTc7CgogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1lZGlhUm91dGVQcm92aWRlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUpOwogIE1lZGlhUm91dGVQcm92aWRlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuY3JlYXRlUm91dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuY3JlYXRlUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuY3JlYXRlUm91dGUgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSwgc2lua0lkLCBvcmlnaW5hbFByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXMuc2lua0lkID0gc2lua0lkOwogICAgcGFyYW1zLm9yaWdpbmFsUHJlc2VudGF0aW9uSWQgPSBvcmlnaW5hbFByZXNlbnRhdGlvbklkOwogICAgcGFyYW1zLm9yaWdpbiA9IG9yaWdpbjsKICAgIHBhcmFtcy50YWJJZCA9IHRhYklkOwogICAgcGFyYW1zLnRpbWVvdXQgPSB0aW1lb3V0OwogICAgcGFyYW1zLmluY29nbml0byA9IGluY29nbml0bzsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmpvaW5Sb3V0ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5qb2luUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuam9pblJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMoKTsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgcGFyYW1zLnByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uSWQ7CiAgICBwYXJhbXMub3JpZ2luID0gb3JpZ2luOwogICAgcGFyYW1zLnRhYklkID0gdGFiSWQ7CiAgICBwYXJhbXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICBwYXJhbXMuaW5jb2duaXRvID0gaW5jb2duaXRvOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jb25uZWN0Um91dGVCeVJvdXRlSWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgcGFyYW1zLnByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uSWQ7CiAgICBwYXJhbXMub3JpZ2luID0gb3JpZ2luOwogICAgcGFyYW1zLnRhYklkID0gdGFiSWQ7CiAgICBwYXJhbXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICBwYXJhbXMuaW5jb2duaXRvID0gaW5jb2duaXRvOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnRlcm1pbmF0ZVJvdXRlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnRlcm1pbmF0ZVJvdXRlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnRlcm1pbmF0ZVJvdXRlID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnNlbmRSb3V0ZU1lc3NhZ2UKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc2VuZFJvdXRlTWVzc2FnZSA9IGZ1bmN0aW9uKG1lZGlhUm91dGVJZCwgbWVzc2FnZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMoKTsKICAgIHBhcmFtcy5tZWRpYVJvdXRlSWQgPSBtZWRpYVJvdXRlSWQ7CiAgICBwYXJhbXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZW5kUm91dGVCaW5hcnlNZXNzYWdlID0gZnVuY3Rpb24obWVkaWFSb3V0ZUlkLCBkYXRhKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhUm91dGVJZCA9IG1lZGlhUm91dGVJZDsKICAgIHBhcmFtcy5kYXRhID0gZGF0YTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMoKTsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMoKTsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMoKTsKICAgIHBhcmFtcy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5kZXRhY2hSb3V0ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5kZXRhY2hSb3V0ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5kZXRhY2hSb3V0ZSA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcygpOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5lbmFibGVNZG5zRGlzY292ZXJ5CiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmVuYWJsZU1kbnNEaXNjb3ZlcnkgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zKCk7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS51cGRhdGVNZWRpYVNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudXBkYXRlTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zZWFyY2hTaW5rcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZWFyY2hTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZWFyY2hTaW5rcyA9IGZ1bmN0aW9uKHNpbmtJZCwgbWVkaWFTb3VyY2UsIHNlYXJjaENyaXRlcmlhKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMoKTsKICAgIHBhcmFtcy5zaW5rSWQgPSBzaW5rSWQ7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtcy5zZWFyY2hDcml0ZXJpYSA9IHNlYXJjaENyaXRlcmlhOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUucHJvdmlkZVNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnByb3ZpZGVTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5wcm92aWRlU2lua3MgPSBmdW5jdGlvbihwcm92aWRlck5hbWUsIHNpbmtzKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXMucHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwogICAgcGFyYW1zLnNpbmtzID0gc2lua3M7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcgogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lZGlhQ29udHJvbGxlciwgb2JzZXJ2ZXIpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcygpOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgcGFyYW1zLm1lZGlhQ29udHJvbGxlciA9IG1lZGlhQ29udHJvbGxlcjsKICAgIHBhcmFtcy5vYnNlcnZlciA9IG9ic2VydmVyOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwoKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5jcmVhdGVSb3V0ZSA9IGZ1bmN0aW9uKG1lZGlhU291cmNlLCBzaW5rSWQsIG9yaWdpbmFsUHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0bykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLmNyZWF0ZVJvdXRlICYmIHRoaXMuZGVsZWdhdGVfLmNyZWF0ZVJvdXRlKG1lZGlhU291cmNlLCBzaW5rSWQsIG9yaWdpbmFsUHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0byk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmpvaW5Sb3V0ZSA9IGZ1bmN0aW9uKG1lZGlhU291cmNlLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uam9pblJvdXRlICYmIHRoaXMuZGVsZWdhdGVfLmpvaW5Sb3V0ZShtZWRpYVNvdXJjZSwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0byk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZCA9IGZ1bmN0aW9uKG1lZGlhU291cmNlLCByb3V0ZUlkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdFJvdXRlQnlSb3V0ZUlkICYmIHRoaXMuZGVsZWdhdGVfLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZChtZWRpYVNvdXJjZSwgcm91dGVJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0byk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnRlcm1pbmF0ZVJvdXRlID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnRlcm1pbmF0ZVJvdXRlICYmIHRoaXMuZGVsZWdhdGVfLnRlcm1pbmF0ZVJvdXRlKHJvdXRlSWQpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24obWVkaWFSb3V0ZUlkLCBtZXNzYWdlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2VuZFJvdXRlTWVzc2FnZSAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kUm91dGVNZXNzYWdlKG1lZGlhUm91dGVJZCwgbWVzc2FnZSk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgPSBmdW5jdGlvbihtZWRpYVJvdXRlSWQsIGRhdGEpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kUm91dGVCaW5hcnlNZXNzYWdlICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UobWVkaWFSb3V0ZUlkLCBkYXRhKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzKG1lZGlhU291cmNlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzKG1lZGlhU291cmNlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzKG1lZGlhU291cmNlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcE9ic2VydmluZ01lZGlhUm91dGVzKG1lZGlhU291cmNlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocm91dGVJZCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHJvdXRlSWQpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5kZXRhY2hSb3V0ZSA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5kZXRhY2hSb3V0ZSAmJiB0aGlzLmRlbGVnYXRlXy5kZXRhY2hSb3V0ZShyb3V0ZUlkKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLmVuYWJsZU1kbnNEaXNjb3ZlcnkgJiYgdGhpcy5kZWxlZ2F0ZV8uZW5hYmxlTWRuc0Rpc2NvdmVyeSgpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS51cGRhdGVNZWRpYVNpbmtzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy51cGRhdGVNZWRpYVNpbmtzICYmIHRoaXMuZGVsZWdhdGVfLnVwZGF0ZU1lZGlhU2lua3MobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zZWFyY2hTaW5rcyA9IGZ1bmN0aW9uKHNpbmtJZCwgbWVkaWFTb3VyY2UsIHNlYXJjaENyaXRlcmlhKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2VhcmNoU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8uc2VhcmNoU2lua3Moc2lua0lkLCBtZWRpYVNvdXJjZSwgc2VhcmNoQ3JpdGVyaWEpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5wcm92aWRlU2lua3MgPSBmdW5jdGlvbihwcm92aWRlck5hbWUsIHNpbmtzKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ucHJvdmlkZVNpbmtzICYmIHRoaXMuZGVsZWdhdGVfLnByb3ZpZGVTaW5rcyhwcm92aWRlck5hbWUsIHNpbmtzKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbihyb3V0ZUlkLCBtZWRpYUNvbnRyb2xsZXIsIG9ic2VydmVyKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgbWVkaWFDb250cm9sbGVyLCBvYnNlcnZlcik7CiAgfQoKICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzKHBhcmFtcy5tZWRpYVNvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMpOwogICAgICB0aGlzLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzKHBhcmFtcy5tZWRpYVNvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzKHBhcmFtcy5tZWRpYVNvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzKHBhcmFtcy5tZWRpYVNvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHBhcmFtcy5yb3V0ZUlkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocGFyYW1zLnJvdXRlSWQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy5kZXRhY2hSb3V0ZShwYXJhbXMucm91dGVJZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zKTsKICAgICAgdGhpcy5lbmFibGVNZG5zRGlzY292ZXJ5KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zKTsKICAgICAgdGhpcy51cGRhdGVNZWRpYVNpbmtzKHBhcmFtcy5tZWRpYVNvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMucHJvdmlkZVNpbmtzKHBhcmFtcy5wcm92aWRlck5hbWUsIHBhcmFtcy5zaW5rcyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcyk7CiAgICAgIHRoaXMuY3JlYXRlUm91dGUocGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMuc2lua0lkLCBwYXJhbXMub3JpZ2luYWxQcmVzZW50YXRpb25JZCwgcGFyYW1zLm9yaWdpbiwgcGFyYW1zLnRhYklkLCBwYXJhbXMudGltZW91dCwgcGFyYW1zLmluY29nbml0bykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5yb3V0ZSA9IHJlc3BvbnNlLnJvdXRlOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcyk7CiAgICAgIHRoaXMuam9pblJvdXRlKHBhcmFtcy5tZWRpYVNvdXJjZSwgcGFyYW1zLnByZXNlbnRhdGlvbklkLCBwYXJhbXMub3JpZ2luLCBwYXJhbXMudGFiSWQsIHBhcmFtcy50aW1lb3V0LCBwYXJhbXMuaW5jb2duaXRvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5yb3V0ZSA9IHJlc3BvbnNlLnJvdXRlOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcyk7CiAgICAgIHRoaXMuY29ubmVjdFJvdXRlQnlSb3V0ZUlkKHBhcmFtcy5tZWRpYVNvdXJjZSwgcGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5wcmVzZW50YXRpb25JZCwgcGFyYW1zLm9yaWdpbiwgcGFyYW1zLnRhYklkLCBwYXJhbXMudGltZW91dCwgcGFyYW1zLmluY29nbml0bykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMucm91dGUgPSByZXNwb25zZS5yb3V0ZTsKICAgICAgICByZXNwb25zZVBhcmFtcy5lcnJvclRleHQgPSByZXNwb25zZS5lcnJvclRleHQ7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZSA9IHJlc3BvbnNlLnJlc3VsdENvZGU7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy50ZXJtaW5hdGVSb3V0ZShwYXJhbXMucm91dGVJZCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5lcnJvclRleHQgPSByZXNwb25zZS5lcnJvclRleHQ7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZSA9IHJlc3BvbnNlLnJlc3VsdENvZGU7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VuZFJvdXRlTWVzc2FnZShwYXJhbXMubWVkaWFSb3V0ZUlkLCBwYXJhbXMubWVzc2FnZSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnNlbnQgPSByZXNwb25zZS5zZW50OwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMpOwogICAgICB0aGlzLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UocGFyYW1zLm1lZGlhUm91dGVJZCwgcGFyYW1zLmRhdGEpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5zZW50ID0gcmVzcG9uc2Uuc2VudDsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMpOwogICAgICB0aGlzLnNlYXJjaFNpbmtzKHBhcmFtcy5zaW5rSWQsIHBhcmFtcy5tZWRpYVNvdXJjZSwgcGFyYW1zLnNlYXJjaENyaXRlcmlhKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnNpbmtJZCA9IHJlc3BvbnNlLnNpbmtJZDsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMpOwogICAgICB0aGlzLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyKHBhcmFtcy5yb3V0ZUlkLCBwYXJhbXMubWVkaWFDb250cm9sbGVyLCBwYXJhbXMub2JzZXJ2ZXIpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuc3VjY2VzcyA9IHJlc3BvbnNlLnN1Y2Nlc3M7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlc3BvbnNlKG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIHZhciBNZWRpYVJvdXRlUHJvdmlkZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyOjptb2pvbTo6TWVkaWFSb3V0ZVByb3ZpZGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1lZGlhUm91dGVQcm92aWRlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhUm91dGVQcm92aWRlclByb3h5LAogICAgc3R1YkNsYXNzOiBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlc3BvbnNlLAogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkID0ge307CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiA9IDA7CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLldJUkVEX0RJU1BMQVkgPSBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OICsgMTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlUHJvdmlkZXJSZXF1ZXN0OwogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlc3BvbnNlOwogIHZhciBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZSA9IDEzNzExMTkyMTc7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZSA9IDEyNzc4NDAzOTE7CiAgdmFyIGtNZWRpYVJvdXRlcl9Pbklzc3VlX05hbWUgPSAxMTE4MjA0MDcwOwogIHZhciBrTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX05hbWUgPSA5NTk4MjIzOTY7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX05hbWUgPSAxNTgyNTUxNzk4OwogIHZhciBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX05hbWUgPSAxMzY3MDQzNzA1OwogIHZhciBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX05hbWUgPSAxNzAxMDU3NDE7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9OYW1lID0gMjc3MDU0MDYzOwogIHZhciBrTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX05hbWUgPSA2OTcxNjMxNDsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhUm91dGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFSb3V0ZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1lZGlhUm91dGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1lZGlhUm91dGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlciA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIG1lZGlhUm91dGVyUHJvdmlkZXIpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zKCk7CiAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7CiAgICBwYXJhbXMubWVkaWFSb3V0ZXJQcm92aWRlciA9IG1lZGlhUm91dGVyUHJvdmlkZXI7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25TaW5rc1JlY2VpdmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25TaW5rc1JlY2VpdmVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25TaW5rc1JlY2VpdmVkID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgbWVkaWFTb3VyY2UsIHNpbmtzLCBvcmlnaW5zKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgcGFyYW1zLnNpbmtzID0gc2lua3M7CiAgICBwYXJhbXMub3JpZ2lucyA9IG9yaWdpbnM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uSXNzdWUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbklzc3VlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Jc3N1ZSA9IGZ1bmN0aW9uKGlzc3VlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zKCk7CiAgICBwYXJhbXMuaXNzdWUgPSBpc3N1ZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgcm91dGVzLCBtZWRpYVNvdXJjZSwgam9pbmFibGVSb3V0ZUlkcykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zKCk7CiAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7CiAgICBwYXJhbXMucm91dGVzID0gcm91dGVzOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXMuam9pbmFibGVSb3V0ZUlkcyA9IGpvaW5hYmxlUm91dGVJZHM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIGF2YWlsYWJpbGl0eSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcygpOwogICAgcGFyYW1zLnByb3ZpZGVySWQgPSBwcm92aWRlcklkOwogICAgcGFyYW1zLmF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkID0gZnVuY3Rpb24ocm91dGVJZCwgc3RhdGUpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcygpOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgcGFyYW1zLnN0YXRlID0gc3RhdGU7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIHJlYXNvbiwgbWVzc2FnZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXMucmVhc29uID0gcmVhc29uOwogICAgcGFyYW1zLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQgPSBmdW5jdGlvbihyb3V0ZUlkLCBtZXNzYWdlcykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHBhcmFtcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQgPSBmdW5jdGlvbih0YWJJZCwgcmVtb3RlciwgcmVtb3RpbmdTb3VyY2UpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcygpOwogICAgcGFyYW1zLnRhYklkID0gdGFiSWQ7CiAgICBwYXJhbXMucmVtb3RlciA9IHJlbW90ZXI7CiAgICBwYXJhbXMucmVtb3RpbmdTb3VyY2UgPSByZW1vdGluZ1NvdXJjZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgbWVkaWFSb3V0ZXJQcm92aWRlcikgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyICYmIHRoaXMuZGVsZWdhdGVfLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyKHByb3ZpZGVySWQsIG1lZGlhUm91dGVyUHJvdmlkZXIpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIG1lZGlhU291cmNlLCBzaW5rcywgb3JpZ2lucykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua3NSZWNlaXZlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtzUmVjZWl2ZWQocHJvdmlkZXJJZCwgbWVkaWFTb3VyY2UsIHNpbmtzLCBvcmlnaW5zKTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vbklzc3VlID0gZnVuY3Rpb24oaXNzdWUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vbklzc3VlICYmIHRoaXMuZGVsZWdhdGVfLm9uSXNzdWUoaXNzdWUpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIHJvdXRlcywgbWVkaWFTb3VyY2UsIGpvaW5hYmxlUm91dGVJZHMpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblJvdXRlc1VwZGF0ZWQgJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZXNVcGRhdGVkKHByb3ZpZGVySWQsIHJvdXRlcywgbWVkaWFTb3VyY2UsIGpvaW5hYmxlUm91dGVJZHMpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQgPSBmdW5jdGlvbihwcm92aWRlcklkLCBhdmFpbGFiaWxpdHkpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQocHJvdmlkZXJJZCwgYXZhaWxhYmlsaXR5KTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbihyb3V0ZUlkLCBzdGF0ZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQocm91dGVJZCwgc3RhdGUpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIHJlYXNvbiwgbWVzc2FnZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWQocm91dGVJZCwgcmVhc29uLCBtZXNzYWdlKTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lc3NhZ2VzKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQgJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQocm91dGVJZCwgbWVzc2FnZXMpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKHRhYklkLCByZW1vdGVyLCByZW1vdGluZ1NvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lZGlhUmVtb3RlckNyZWF0ZWQodGFiSWQsIHJlbW90ZXIsIHJlbW90aW5nU291cmNlKTsKICB9CgogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblNpbmtzUmVjZWl2ZWQocGFyYW1zLnByb3ZpZGVySWQsIHBhcmFtcy5tZWRpYVNvdXJjZSwgcGFyYW1zLnNpbmtzLCBwYXJhbXMub3JpZ2lucyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Jc3N1ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcyk7CiAgICAgIHRoaXMub25Jc3N1ZShwYXJhbXMuaXNzdWUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblJvdXRlc1VwZGF0ZWQocGFyYW1zLnByb3ZpZGVySWQsIHBhcmFtcy5yb3V0ZXMsIHBhcmFtcy5tZWRpYVNvdXJjZSwgcGFyYW1zLmpvaW5hYmxlUm91dGVJZHMpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQocGFyYW1zLnByb3ZpZGVySWQsIHBhcmFtcy5hdmFpbGFiaWxpdHkpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQocGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5zdGF0ZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZChwYXJhbXMucm91dGVJZCwgcGFyYW1zLnJlYXNvbiwgcGFyYW1zLm1lc3NhZ2UpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQocGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5tZXNzYWdlcyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZChwYXJhbXMudGFiSWQsIHBhcmFtcy5yZW1vdGVyLCBwYXJhbXMucmVtb3RpbmdTb3VyY2UpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMpOwogICAgICB0aGlzLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyKHBhcmFtcy5wcm92aWRlcklkLCBwYXJhbXMubWVkaWFSb3V0ZXJQcm92aWRlcikudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmluc3RhbmNlSWQgPSByZXNwb25zZS5pbnN0YW5jZUlkOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmNvbmZpZyA9IHJlc3BvbnNlLmNvbmZpZzsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFSb3V0ZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYVJvdXRlclJlc3BvbnNlKG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIHZhciBNZWRpYVJvdXRlciA9IHsKICAgIG5hbWU6ICdtZWRpYV9yb3V0ZXI6Om1vam9tOjpNZWRpYVJvdXRlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNZWRpYVJvdXRlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhUm91dGVyUHJveHksCiAgICBzdHViQ2xhc3M6IE1lZGlhUm91dGVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNZWRpYVJvdXRlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVzcG9uc2UsCiAgfTsKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5ID0ge307CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5VTkFWQUlMQUJMRSA9IDA7CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5QRVJfU09VUkNFID0gTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5VTkFWQUlMQUJMRSArIDE7CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5BVkFJTEFCTEUgPSBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LlBFUl9TT1VSQ0UgKyAxOwoKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZSA9IHt9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNUSU5HID0gMDsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNPTk5FQ1RJTkcgKyAxOwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQgPSBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEICsgMTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuVEVSTUlOQVRFRCA9IE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQgKyAxOwoKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24gPSB7fTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uQ09OTkVDVElPTl9FUlJPUiA9IDA7CiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNMT1NFRCA9IE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DT05ORUNUSU9OX0VSUk9SICsgMTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uV0VOVF9BV0FZID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNMT1NFRCArIDE7CgogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlclJlcXVlc3Q7CiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlclJlc3BvbnNlOwogIGV4cG9ydHMuU2lua0ljb25UeXBlID0gU2lua0ljb25UeXBlOwogIGV4cG9ydHMuUm91dGVDb250cm9sbGVyVHlwZSA9IFJvdXRlQ29udHJvbGxlclR5cGU7CiAgZXhwb3J0cy5Sb3V0ZVJlcXVlc3RSZXN1bHRDb2RlID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZTsKICBleHBvcnRzLk1lZGlhU2luayA9IE1lZGlhU2luazsKICBleHBvcnRzLkRpYWxNZWRpYVNpbmsgPSBEaWFsTWVkaWFTaW5rOwogIGV4cG9ydHMuQ2FzdE1lZGlhU2luayA9IENhc3RNZWRpYVNpbms7CiAgZXhwb3J0cy5NZWRpYVJvdXRlID0gTWVkaWFSb3V0ZTsKICBleHBvcnRzLklzc3VlID0gSXNzdWU7CiAgZXhwb3J0cy5Sb3V0ZU1lc3NhZ2UgPSBSb3V0ZU1lc3NhZ2U7CiAgZXhwb3J0cy5TaW5rU2VhcmNoQ3JpdGVyaWEgPSBTaW5rU2VhcmNoQ3JpdGVyaWE7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJDb25maWcgPSBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWc7CiAgZXhwb3J0cy5NZWRpYVNpbmtFeHRyYURhdGEgPSBNZWRpYVNpbmtFeHRyYURhdGE7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXIgPSBNZWRpYVJvdXRlUHJvdmlkZXI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJQdHIgPSBNZWRpYVJvdXRlUHJvdmlkZXJQdHI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cjsKICBleHBvcnRzLk1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlclB0ciA9IE1lZGlhUm91dGVyUHRyOwogIGV4cG9ydHMuTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyOwp9KSgpOy8vIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgppZiAoKHR5cGVvZiBtb2pvID09PSAndW5kZWZpbmVkJykgfHwgIW1vam8uYmluZGluZ3NMaWJyYXJ5SW5pdGlhbGl6ZWQpIHsKICBsb2FkU2NyaXB0KCdtb2pvX2JpbmRpbmdzJyk7Cn0KbW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMgPSBmYWxzZTsKCmxvYWRTY3JpcHQoJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfY29udHJvbGxlci5tb2pvbScpOwpsb2FkU2NyaXB0KCdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3JvdXRlci5tb2pvbScpOwpsb2FkU2NyaXB0KCdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3N0YXR1cy5tb2pvbScpOwpsb2FkU2NyaXB0KCdleHRlbnNpb25zL2NvbW1vbi9tb2pvL2tlZXBfYWxpdmUubW9qb20nKTsKbG9hZFNjcmlwdCgnbWVkaWEvbW9qby9pbnRlcmZhY2VzL21pcnJvcl9zZXJ2aWNlX3JlbW90aW5nLm1vam9tJyk7CmxvYWRTY3JpcHQoJ21lZGlhL21vam8vaW50ZXJmYWNlcy9yZW1vdGluZ19jb21tb24ubW9qb20nKTsKbG9hZFNjcmlwdCgnbW9qby9jb21tb24vdGltZS5tb2pvbScpOwpsb2FkU2NyaXB0KCduZXQvaW50ZXJmYWNlcy9pcF9hZGRyZXNzLm1vam9tJyk7CmxvYWRTY3JpcHQoJ25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tJyk7CmxvYWRTY3JpcHQoJ3VybC9tb2pvL29yaWdpbi5tb2pvbScpOwpsb2FkU2NyaXB0KCd1cmwvbW9qby91cmwubW9qb20nKTsKCi8vIFRoZSBmb2xsb3dpbmcgYWRhcHRlciBjbGFzc2VzIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHRoZSBtZWRpYQovLyByb3V0ZXIgY29tcG9uZW50IGV4dGVuc2lvbi4KLy8gVE9ETyhjcmJ1Zy5jb20vNzg3MTI4KTogUmVtb3ZlIHRoZXNlIGFkYXB0ZXJzLgoKZnVuY3Rpb24gYXNzaWduRmllbGRzKG9iamVjdCwgZmllbGRzKSB7CiAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICBvYmplY3RbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICB9Cn0KCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYVJvdXRlci5tb2pvbS5EaWFsTWVkaWFTaW5rLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIERpYWxNZWRpYVNpbmtBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuaXBfYWRkcmVzcyA9IG51bGw7CiAgdGhpcy5tb2RlbF9uYW1lID0gbnVsbDsKICB0aGlzLmFwcF91cmwgPSBudWxsOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKRGlhbE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgRGlhbE1lZGlhU2lua0FkYXB0ZXIoewogICAgJ2lwX2FkZHJlc3MnOiBJUEFkZHJlc3NBZGFwdGVyLmZyb21OZXdWZXJzaW9uKG90aGVyLmlwQWRkcmVzcyksCiAgICAnbW9kZWxfbmFtZSc6IG90aGVyLm1vZGVsTmFtZSwKICAgICdhcHBfdXJsJzogb3RoZXIuYXBwVXJsLAogIH0pOwp9OwoKRGlhbE1lZGlhU2lua0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uRGlhbE1lZGlhU2luayh7CiAgICAnaXBBZGRyZXNzJyA6IHRoaXMuaXBfYWRkcmVzcy50b05ld1ZlcnNpb24oKSwKICAgICdtb2RlbE5hbWUnIDogdGhpcy5tb2RlbF9uYW1lLAogICAgJ2FwcFVybCcgOiB0aGlzLmFwcF91cmwsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uQ2FzdE1lZGlhU2luay4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBDYXN0TWVkaWFTaW5rQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmlwX2VuZHBvaW50ID0gbnVsbDsKICB0aGlzLm1vZGVsX25hbWUgPSBudWxsOwogIHRoaXMuY2FwYWJpbGl0aWVzID0gMDsKICB0aGlzLmNhc3RfY2hhbm5lbF9pZCA9IDA7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpDYXN0TWVkaWFTaW5rQWRhcHRlci5mcm9tTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgcmV0dXJuIG5ldyBDYXN0TWVkaWFTaW5rQWRhcHRlcih7CiAgICAnaXBfZW5kcG9pbnQnOiBJUEVuZHBvaW50QWRhcHRlci5mcm9tTmV3VmVyc2lvbihvdGhlci5pcEVuZHBvaW50KSwKICAgICdtb2RlbF9uYW1lJzogb3RoZXIubW9kZWxOYW1lLAogICAgJ2NhcGFiaWxpdGllcyc6IG90aGVyLmNhcGFiaWxpdGllcywKICAgICdjYXN0X2NoYW5uZWxfaWQnOiBvdGhlci5jYXN0Q2hhbm5lbElkLAogIH0pOwp9OwoKQ2FzdE1lZGlhU2lua0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uQ2FzdE1lZGlhU2luayh7CiAgICAnaXBFbmRwb2ludCc6IHRoaXMuaXBfZW5kcG9pbnQudG9OZXdWZXJzaW9uKCksCiAgICAnbW9kZWxOYW1lJzogdGhpcy5tb2RlbF9uYW1lLAogICAgJ2NhcGFiaWxpdGllcyc6IHRoaXMuY2FwYWJpbGl0aWVzLAogICAgJ2Nhc3RDaGFubmVsSWQnOiB0aGlzLmNhc3RfY2hhbm5lbF9pZCwKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYVJvdXRlci5tb2pvbS5IYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGFBZGFwdGVyKGZpZWxkcykgewogIHRoaXMubG9jYWxfcHJlc2VudCA9IGZhbHNlOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YUFkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSh7CiAgICAnbG9jYWxQcmVzZW50JzogdGhpcy5sb2NhbF9wcmVzZW50LAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG5ldC5pbnRlcmZhY2VzLklQQWRkcmVzcy4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBJUEFkZHJlc3NBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuYWRkcmVzc19ieXRlcyA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpJUEFkZHJlc3NBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IElQQWRkcmVzc0FkYXB0ZXIoewogICAgJ2FkZHJlc3NfYnl0ZXMnOiBvdGhlci5hZGRyZXNzQnl0ZXMsCiAgfSk7Cn07CgpJUEFkZHJlc3NBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG5ldC5pbnRlcmZhY2VzLklQQWRkcmVzcyh7CiAgICAnYWRkcmVzc0J5dGVzJzogdGhpcy5hZGRyZXNzX2J5dGVzLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG5ldC5pbnRlcmZhY2VzLklQRW5kcG9pbnQuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gSVBFbmRwb2ludEFkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5hZGRyZXNzID0gbnVsbDsKICB0aGlzLnBvcnQgPSAwOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKSVBFbmRwb2ludEFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgSVBFbmRwb2ludEFkYXB0ZXIoewogICAgJ2FkZHJlc3MnOiBJUEFkZHJlc3NBZGFwdGVyLmZyb21OZXdWZXJzaW9uKG90aGVyLmFkZHJlc3MpLAogICAgJ3BvcnQnOiBvdGhlci5wb3J0LAogIH0pOwp9OwoKSVBFbmRwb2ludEFkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbmV0LmludGVyZmFjZXMuSVBFbmRwb2ludCh7CiAgICAnYWRkcmVzcyc6IHRoaXMuYWRkcmVzcy50b05ld1ZlcnNpb24oKSwKICAgICdwb3J0JzogdGhpcy5wb3J0LAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1lZGlhU3RhdHVzQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLnRpdGxlID0gbnVsbDsKICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICB0aGlzLmNhbl9wbGF5X3BhdXNlID0gZmFsc2U7CiAgdGhpcy5jYW5fbXV0ZSA9IGZhbHNlOwogIHRoaXMuY2FuX3NldF92b2x1bWUgPSBmYWxzZTsKICB0aGlzLmNhbl9zZWVrID0gZmFsc2U7CiAgdGhpcy5pc19tdXRlZCA9IGZhbHNlOwogIHRoaXMucGxheV9zdGF0ZSA9IDA7CiAgdGhpcy52b2x1bWUgPSAwOwogIHRoaXMuZHVyYXRpb24gPSBudWxsOwogIHRoaXMuY3VycmVudF90aW1lID0gbnVsbDsKICB0aGlzLmhhbmdvdXRzX2V4dHJhX2RhdGEgPSBudWxsOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKTWVkaWFTdGF0dXNBZGFwdGVyLlBsYXlTdGF0ZSA9IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzLlBsYXlTdGF0ZTsKCk1lZGlhU3RhdHVzQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1cyh7CiAgICAndGl0bGUnOiB0aGlzLnRpdGxlLAogICAgJ2Rlc2NyaXB0aW9uJzogdGhpcy5kZXNjcmlwdGlvbiwKICAgICdjYW5QbGF5UGF1c2UnOiB0aGlzLmNhbl9wbGF5X3BhdXNlLAogICAgJ2Nhbk11dGUnOiB0aGlzLmNhbl9tdXRlLAogICAgJ2NhblNldFZvbHVtZSc6IHRoaXMuY2FuX3NldF92b2x1bWUsCiAgICAnY2FuU2Vlayc6IHRoaXMuY2FuX3NlZWssCiAgICAnaXNNdXRlZCc6IHRoaXMuaXNfbXV0ZWQsCiAgICAncGxheVN0YXRlJzogdGhpcy5wbGF5X3N0YXRlLAogICAgJ3ZvbHVtZSc6IHRoaXMudm9sdW1lLAogICAgJ2R1cmF0aW9uJzogdGhpcy5kdXJhdGlvbiwKICAgICdjdXJyZW50VGltZSc6IHRoaXMuY3VycmVudF90aW1lLAogICAgJ2hhbmdvdXRzRXh0cmFEYXRhJzoKICAgICAgICB0aGlzLmhhbmdvdXRzX2V4dHJhX2RhdGEgJiYgdGhpcy5oYW5nb3V0c19leHRyYV9kYXRhLnRvTmV3VmVyc2lvbigpLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLlJlbW90aW5nU2lua01ldGFkYXRhLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIFJlbW90aW5nU2lua01ldGFkYXRhQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmZlYXR1cmVzID0gbnVsbDsKICB0aGlzLmF1ZGlvX2NhcGFiaWxpdGllcyA9IG51bGw7CiAgdGhpcy52aWRlb19jYXBhYmlsaXRpZXMgPSBudWxsOwogIHRoaXMuZnJpZW5kbHlfbmFtZSA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgUmVtb3RpbmdTaW5rTWV0YWRhdGFBZGFwdGVyKHsKICAgICdmZWF0dXJlcyc6IG90aGVyLmZlYXR1cmVzLAogICAgJ2F1ZGlvX2NhcGFiaWxpdGllcyc6IG90aGVyLmF1ZGlvQ2FwYWJpbGl0aWVzLAogICAgJ3ZpZGVvX2NhcGFiaWxpdGllcyc6IG90aGVyLnZpZGVvQ2FwYWJpbGl0aWVzLAogICAgJ2ZyaWVuZGx5X25hbWUnOiBvdGhlci5mcmllbmRseU5hbWUsCiAgfSk7Cn07CgpSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rTWV0YWRhdGEoewogICAgJ2ZlYXR1cmVzJzogdGhpcy5mZWF0dXJlcywKICAgICdhdWRpb0NhcGFiaWxpdGllcyc6IHRoaXMuYXVkaW9fY2FwYWJpbGl0aWVzLAogICAgJ3ZpZGVvQ2FwYWJpbGl0aWVzJzogdGhpcy52aWRlb19jYXBhYmlsaXRpZXMsCiAgICAnZnJpZW5kbHlOYW1lJzogdGhpcy5mcmllbmRseV9uYW1lLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luay4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVNpbmtBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuc2lua19pZCA9IG51bGw7CiAgdGhpcy5uYW1lID0gbnVsbDsKICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICB0aGlzLmRvbWFpbiA9IG51bGw7CiAgdGhpcy5pY29uX3R5cGUgPSAwOwogIHRoaXMuZXh0cmFfZGF0YSA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IE1lZGlhU2lua0FkYXB0ZXIoewogICAgJ3NpbmtfaWQnOiBvdGhlci5zaW5rSWQsCiAgICAnbmFtZSc6IG90aGVyLm5hbWUsCiAgICAnZGVzY3JpcHRpb24nOiBvdGhlci5kZXNjcmlwdGlvbiwKICAgICdkb21haW4nOiBvdGhlci5kb21haW4sCiAgICAnaWNvbl90eXBlJzogb3RoZXIuaWNvblR5cGUsCiAgICAnZXh0cmFfZGF0YSc6IG90aGVyLmV4dHJhRGF0YSAmJgogICAgICAgIE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuZXh0cmFEYXRhKSwKICB9KTsKfTsKCk1lZGlhU2lua0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rKHsKICAgICdzaW5rSWQnOiB0aGlzLnNpbmtfaWQsCiAgICAnbmFtZSc6IHRoaXMubmFtZSwKICAgICdkZXNjcmlwdGlvbic6IHRoaXMuZGVzY3JpcHRpb24sCiAgICAnZG9tYWluJzogdGhpcy5kb21haW4sCiAgICAnaWNvblR5cGUnOiB0aGlzLmljb25fdHlwZSwKICAgICdleHRyYURhdGEnOiB0aGlzLmV4dHJhX2RhdGEgJiYgdGhpcy5leHRyYV9kYXRhLnRvTmV3VmVyc2lvbigpLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua0V4dHJhRGF0YS4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyKHZhbHVlKSB7CiAgdGhpcy4kZGF0YSA9IG51bGw7CiAgdGhpcy4kdGFnID0gdW5kZWZpbmVkOwoKICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm47CiAgfQoKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTsKICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgewogICAgcmV0dXJuOwogIH0KCiAgaWYgKGtleXMubGVuZ3RoID4gMSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG1heSBzZXQgb25seSBvbmUgbWVtYmVyIG9uIGEgdW5pb24uJyk7CiAgfQoKICB2YXIgZmllbGRzID0gWwogICAgJ2RpYWxfbWVkaWFfc2luaycsCiAgICAnY2FzdF9tZWRpYV9zaW5rJywKICBdOwoKICBpZiAoZmllbGRzLmluZGV4T2Yoa2V5c1swXSkgPCAwKSB7CiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3Ioa2V5c1swXSArCiAgICAgICAgJyBpcyBub3QgYSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyIG1lbWJlci4nKTsKICB9CgogIHRoaXNba2V5c1swXV0gPSB2YWx1ZVtrZXlzWzBdXTsKfQoKTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzID0gewogIGRpYWxfbWVkaWFfc2luazogMCwKICBjYXN0X21lZGlhX3Npbms6IDEsCn07CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5wcm90b3R5cGUsICdkaWFsX21lZGlhX3NpbmsnLCB7CiAgZ2V0OiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzLmRpYWxfbWVkaWFfc2luaykgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoCiAgICAgICAgICAnTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5kaWFsX21lZGlhX3NpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuJyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy4kZGF0YTsKICB9LAoKICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuZGlhbF9tZWRpYV9zaW5rOwogICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogIH0KfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5wcm90b3R5cGUsICdjYXN0X21lZGlhX3NpbmsnLCB7CiAgZ2V0OiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzLmNhc3RfbWVkaWFfc2luaykgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoCiAgICAgICAgICAnTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5jYXN0X21lZGlhX3NpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuJyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy4kZGF0YTsKICB9LAoKICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuY2FzdF9tZWRpYV9zaW5rOwogICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogIH0KfSk7CgpNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICBpZiAob3RoZXIuJHRhZyA9PSBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rKSB7CiAgICByZXR1cm4gbmV3IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIoewogICAgICAnZGlhbF9tZWRpYV9zaW5rJzoKICAgICAgICAgIERpYWxNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uKG90aGVyLmRpYWxNZWRpYVNpbmspLAogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlcih7CiAgICAgICdjYXN0X21lZGlhX3NpbmsnOgogICAgICAgICAgQ2FzdE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuY2FzdE1lZGlhU2luayksCiAgICB9KTsKICB9Cn07CgpNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICBpZiAodGhpcy4kdGFnID09IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuVGFncy5kaWFsX21lZGlhX3NpbmspIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rRXh0cmFEYXRhKHsKICAgICAgJ2RpYWxNZWRpYVNpbmsnOiB0aGlzLmRpYWxfbWVkaWFfc2luay50b05ld1ZlcnNpb24oKSwKICAgIH0pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua0V4dHJhRGF0YSh7CiAgICAgICdjYXN0TWVkaWFTaW5rJzogdGhpcy5jYXN0X21lZGlhX3NpbmsudG9OZXdWZXJzaW9uKCksCiAgICB9KTsKICB9Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXJQdHIuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyKGhhbmRsZU9yUHRySW5mbykgewogIHRoaXMucHRyID0gbmV3IG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNaXJyb3JTZXJ2aWNlUmVtb3RlckFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7Cn0KCk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlci5wcm90b3R5cGUgPQogICAgT2JqZWN0LmNyZWF0ZShtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUpOwpNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlcjsKCk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlci5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zCiAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoewogICAgICAnYXVkaW9fc3RyZWFtX2lkJzogcmVzcG9uc2UuYXVkaW9TdHJlYW1JZCwKICAgICAgJ3ZpZGVvX3N0cmVhbV9pZCc6IHJlc3BvbnNlLnZpZGVvU3RyZWFtSWQsCiAgICB9KTsKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci5zdHViY2xhc3MuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlcihkZWxlZ2F0ZSkgewogIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7Cn0KCk1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YkFkYXB0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgKICAgIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnN0dWJDbGFzcy5wcm90b3R5cGUpOwpNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyOwoKTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlci5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9CiAgICBmdW5jdGlvbihoYXNBdWRpbywgaGFzVmlkZW8pIHsKICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnREYXRhU3RyZWFtcyAmJgogICAgICB0aGlzLmRlbGVnYXRlXy5zdGFydERhdGFTdHJlYW1zKGhhc0F1ZGlvLCBoYXNWaWRlbykudGhlbigKICAgICAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgJ2F1ZGlvU3RyZWFtSWQnOiByZXNwb25zZS5hdWRpb19zdHJlYW1faWQsCiAgICAgICAgICAgICAgJ3ZpZGVvU3RyZWFtSWQnOiByZXNwb25zZS52aWRlb19zdHJlYW1faWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci4KICovCnZhciBNaXJyb3JTZXJ2aWNlUmVtb3RlckFkYXB0ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWE6Om1vam9tOjpNaXJyb3JTZXJ2aWNlUmVtb3RlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIsCiAgICBwcm94eUNsYXNzOiBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci5wcm94eUNsYXNzLAogICAgc3R1YkNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyLAogICAgdmFsaWRhdGVSZXF1ZXN0OiBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci52YWxpZGF0ZVJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci52YWxpZGF0ZVJlc3BvbnNlLAp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyKGhhbmRsZU9yUHRySW5mbykgewogIHRoaXMucHRyID0gbmV3IG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwp9CgpNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyLnByb3RvdHlwZSA9CiAgICBPYmplY3QuY3JlYXRlKG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUpOwpNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyOwoKTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlci5wcm90b3R5cGUub25TaW5rQXZhaWxhYmxlID0KICAgIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgcmV0dXJuIHRoaXMucHRyLmdldFByb3h5KCkub25TaW5rQXZhaWxhYmxlKG1ldGFkYXRhLnRvTmV3VmVyc2lvbigpKTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2UuCiAqLwp2YXIgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQWRhcHRlciA9IHsKICAgIG5hbWU6ICdtZWRpYTo6bW9qb206Ok1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZScsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyLAogICAgcHJveHlDbGFzczogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLnByb3h5Q2xhc3MsCiAgICBzdHViQ2xhc3M6IG51bGwsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZS52YWxpZGF0ZVJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXIuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgdGhpcy5wdHIgPSBuZXcgbW9qby5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhU3RhdHVzT2JzZXJ2ZXJBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwp9CgpNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlci5wcm90b3R5cGUgPQogICAgT2JqZWN0LmNyZWF0ZShtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyUHRyLnByb3RvdHlwZSk7Ck1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICBNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlcjsKCk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZCA9CiAgICBmdW5jdGlvbihzdGF0dXMpIHsKICByZXR1cm4gdGhpcy5wdHIuZ2V0UHJveHkoKS5vbk1lZGlhU3RhdHVzVXBkYXRlZChzdGF0dXMudG9OZXdWZXJzaW9uKCkpOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXIuCiAqLwp2YXIgTWVkaWFTdGF0dXNPYnNlcnZlckFkYXB0ZXIgPSB7CiAgbmFtZTogJ21lZGlhUm91dGVyOjptb2pvbTo6TWVkaWFTdGF0dXNPYnNlcnZlcicsCiAga1ZlcnNpb246IDAsCiAgcHRyQ2xhc3M6IE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLAogIHByb3h5Q2xhc3M6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXIucHJveHlDbGFzcywKICBzdHViQ2xhc3M6IG51bGwsCiAgdmFsaWRhdGVSZXF1ZXN0OiBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyLnZhbGlkYXRlUmVxdWVzdCwKICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAp9OwoKLyoqCiAqIENvbnZlcnRzIGEgbWVkaWEgc2luayB0byBhIE1lZGlhU2luayBNb2pvIG9iamVjdC4KICogQHBhcmFtIHshTWVkaWFTaW5rfSBzaW5rIEEgbWVkaWEgc2luay4KICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua30gQSBNb2pvIE1lZGlhU2luayBvYmplY3QuCiAqLwpmdW5jdGlvbiBzaW5rVG9Nb2pvXyhzaW5rKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmsoewogICAgJ25hbWUnOiBzaW5rLmZyaWVuZGx5TmFtZSwKICAgICdkZXNjcmlwdGlvbic6IHNpbmsuZGVzY3JpcHRpb24sCiAgICAnZG9tYWluJzogc2luay5kb21haW4sCiAgICAnc2lua0lkJzogc2luay5pZCwKICAgICdpY29uVHlwZSc6IHNpbmtJY29uVHlwZVRvTW9qbyhzaW5rLmljb25UeXBlKSwKICAgICdwcm92aWRlcklkJzogbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICB9KTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgbWVkaWEgc2luaydzIGljb24gdHlwZSB0byBhIE1lZGlhU2luay5JY29uVHlwZSBNb2pvIG9iamVjdC4KICogQHBhcmFtIHshTWVkaWFTaW5rLkljb25UeXBlfSB0eXBlIEEgbWVkaWEgc2luaydzIGljb24gdHlwZS4KICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luay5JY29uVHlwZX0gQSBNb2pvIE1lZGlhU2luay5JY29uVHlwZQogKiAgICAgb2JqZWN0LgogKi8KZnVuY3Rpb24gc2lua0ljb25UeXBlVG9Nb2pvKHR5cGUpIHsKICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgJ2Nhc3QnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkNBU1Q7CiAgICBjYXNlICdjYXN0X2F1ZGlvX2dyb3VwJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5DQVNUX0FVRElPX0dST1VQOwogICAgY2FzZSAnY2FzdF9hdWRpbyc6CiAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5TaW5rSWNvblR5cGUuQ0FTVF9BVURJTzsKICAgIGNhc2UgJ21lZXRpbmcnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLk1FRVRJTkc7CiAgICBjYXNlICdoYW5nb3V0JzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5IQU5HT1VUOwogICAgY2FzZSAnZWR1Y2F0aW9uJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5FRFVDQVRJT047CiAgICBjYXNlICdnZW5lcmljJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5HRU5FUklDOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzaW5rIGljb24gdHlwZSA6ICcgKyB0eXBlKTsKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5HRU5FUklDOwogIH0KfQoKLyoqCiAqIFJldHVybnMgYSBNb2pvIE1lZGlhUm91dGUgb2JqZWN0IGdpdmVuIGEgTWVkaWFSb3V0ZSBhbmQgYQogKiBtZWRpYSBzaW5rIG5hbWUuCiAqIEBwYXJhbSB7IU1lZGlhUm91dGV9IHJvdXRlCiAqIEByZXR1cm4geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlfQogKi8KZnVuY3Rpb24gcm91dGVUb01vam9fKHJvdXRlKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlKHsKICAgICdtZWRpYVJvdXRlSWQnOiByb3V0ZS5pZCwKICAgICdtZWRpYVNvdXJjZSc6IHJvdXRlLm1lZGlhU291cmNlLAogICAgJ21lZGlhU2lua0lkJzogcm91dGUuc2lua0lkLAogICAgJ2Rlc2NyaXB0aW9uJzogcm91dGUuZGVzY3JpcHRpb24sCiAgICAnaWNvblVybCc6IHJvdXRlLmljb25VcmwsCiAgICAnaXNMb2NhbCc6IHJvdXRlLmlzTG9jYWwsCiAgICAnZm9yRGlzcGxheSc6IHJvdXRlLmZvckRpc3BsYXksCiAgICAnaXNJbmNvZ25pdG8nOiByb3V0ZS5vZmZUaGVSZWNvcmQsCiAgICAnaXNMb2NhbFByZXNlbnRhdGlvbic6IHJvdXRlLmlzT2Zmc2NyZWVuUHJlc2VudGF0aW9uLAogICAgJ2NvbnRyb2xsZXJUeXBlJzogcm91dGUuY29udHJvbGxlclR5cGUsCiAgICAvLyBCZWdpbiBuZXdseSBhZGRlZCBwcm9wZXJ0aWVzLCBmb2xsb3dlZCBieSB0aGUgbWlsZXN0b25lIHRoZXkgd2VyZQogICAgLy8gYWRkZWQuICBUaGUgZ3VhcmQgc2hvdWxkIGJlIHNhZmUgdG8gcmVtb3ZlIE4rMiBtaWxlc3RvbmVzIGxhdGVyLgogICAgJ3ByZXNlbnRhdGlvbklkJzogcm91dGUucHJlc2VudGF0aW9uSWQgfHwgJycgIC8vIE02NAogIH0pOwp9CgovKioKICogQ29udmVydHMgYSByb3V0ZSBtZXNzYWdlIHRvIGEgUm91dGVNZXNzYWdlIE1vam8gb2JqZWN0LgogKiBAcGFyYW0geyFSb3V0ZU1lc3NhZ2V9IG1lc3NhZ2UKICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLlJvdXRlTWVzc2FnZX0gQSBNb2pvIFJvdXRlTWVzc2FnZSBvYmplY3QuCiAqLwpmdW5jdGlvbiBtZXNzYWdlVG9Nb2pvXyhtZXNzYWdlKSB7CiAgaWYgKCJzdHJpbmciID09IHR5cGVvZiBtZXNzYWdlLm1lc3NhZ2UpIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlKHsKICAgICAgJ3R5cGUnOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZU1lc3NhZ2UuVHlwZS5URVhULAogICAgICAnbWVzc2FnZSc6IG1lc3NhZ2UubWVzc2FnZSwKICAgIH0pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlTWVzc2FnZSh7CiAgICAgICd0eXBlJzogbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlLlR5cGUuQklOQVJZLAogICAgICAnZGF0YSc6IG1lc3NhZ2UubWVzc2FnZSwKICAgIH0pOwogIH0KfQoKLyoqCiAqIENvbnZlcnRzIHByZXNlbnRhdGlvbiBjb25uZWN0aW9uIHN0YXRlIHRvIE1vam8gZW51bSB2YWx1ZS4KICogQHBhcmFtIHshc3RyaW5nfSBzdGF0ZQogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlfQogKi8KZnVuY3Rpb24gcHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlVG9Nb2pvXyhzdGF0ZSkgewogIHZhciBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUgPQogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGU7CiAgc3dpdGNoIChzdGF0ZSkgewogICAgY2FzZSAnY29ubmVjdGluZyc6CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVElORzsKICAgIGNhc2UgJ2Nvbm5lY3RlZCc6CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEOwogICAgY2FzZSAnY2xvc2VkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQ7CiAgICBjYXNlICd0ZXJtaW5hdGVkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5URVJNSU5BVEVEOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBwcmVzZW50YXRpb24gY29ubmVjdGlvbiBzdGF0ZTogJyArIHN0YXRlKTsKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5URVJNSU5BVEVEOwogIH0KfQoKLyoqCiAqIENvbnZlcnRzIHByZXNlbnRhdGlvbiBjb25uZWN0aW9uIGNsb3NlIHJlYXNvbiB0byBNb2pvIGVudW0gdmFsdWUuCiAqIEBwYXJhbSB7IXN0cmluZ30gcmVhc29uCiAqIEByZXR1cm4geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb259CiAqLwpmdW5jdGlvbiBwcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb25Ub01vam9fKHJlYXNvbikgewogIHZhciBQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24gPQogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb247CiAgc3dpdGNoIChyZWFzb24pIHsKICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DT05ORUNUSU9OX0VSUk9SOwogICAgY2FzZSAnY2xvc2VkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DTE9TRUQ7CiAgICBjYXNlICd3ZW50X2F3YXknOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLldFTlRfQVdBWTsKICAgIGRlZmF1bHQ6CiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gcHJlc2VudGF0aW9uIGNvbm5lY3Rpb24gY2xvc2UgcmVhc29uIDogJyArCiAgICAgICAgICByZWFzb24pOwogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNPTk5FQ1RJT05fRVJST1I7CiAgfQp9CgovKioKICogQ29udmVydHMgc3RyaW5nIHRvIE1vam8gb3JpZ2luLgogKiBAcGFyYW0ge3N0cmluZ3whdXJsLm1vam9tLk9yaWdpbn0gb3JpZ2luCiAqIEByZXR1cm4geyF1cmwubW9qb20uT3JpZ2lufQogKi8KZnVuY3Rpb24gc3RyaW5nVG9Nb2pvT3JpZ2luXyhvcmlnaW4pIHsKICBpZiAob3JpZ2luIGluc3RhbmNlb2YgdXJsLm1vam9tLk9yaWdpbikgewogICAgcmV0dXJuIG9yaWdpbjsKICB9CiAgdmFyIG9yaWdpblVybCA9IG5ldyBVUkwob3JpZ2luKTsKICB2YXIgbW9qb09yaWdpbiA9IHt9OwogIG1vam9PcmlnaW4uc2NoZW1lID0gb3JpZ2luVXJsLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJyk7CiAgbW9qb09yaWdpbi5ob3N0ID0gb3JpZ2luVXJsLmhvc3RuYW1lOwogIHZhciBwb3J0ID0gb3JpZ2luVXJsLnBvcnQgPyBOdW1iZXIucGFyc2VJbnQob3JpZ2luVXJsLnBvcnQpIDogMDsKICBzd2l0Y2ggKG1vam9PcmlnaW4uc2NoZW1lKSB7CiAgICBjYXNlICdodHRwJzoKICAgICAgbW9qb09yaWdpbi5wb3J0ID0gcG9ydCB8fCA4MDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdodHRwcyc6CiAgICAgIG1vam9PcmlnaW4ucG9ydCA9IHBvcnQgfHwgNDQzOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1lIG11c3QgYmUgaHR0cCBvciBodHRwcycpOwogIH0KICBtb2pvT3JpZ2luLnN1Ym9yaWdpbiA9ICcnOwogIHJldHVybiBuZXcgdXJsLm1vam9tLk9yaWdpbihtb2pvT3JpZ2luKTsKfQoKLyoqCiAqIFBhcnNlcyB0aGUgZ2l2ZW4gcm91dGUgcmVxdWVzdCBFcnJvciBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIHRoZQogKiBjb3JyZXNwb25kaW5nIHJlc3VsdCBjb2RlLgogKiBAcGFyYW0geyFFcnJvcn0gZXJyb3IKICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLlJvdXRlUmVxdWVzdFJlc3VsdENvZGV9CiAqLwpmdW5jdGlvbiBnZXRSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlXyhlcnJvcikgewogIHJldHVybiBlcnJvci5lcnJvckNvZGUgPyBlcnJvci5lcnJvckNvZGUgOgogICAgbWVkaWFSb3V0ZXIubW9qb20uUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SOwp9CgovKioKICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN1Y2Nlc3NmdWwgcm91dGUgcmVzcG9uc2UgZnJvbSBnaXZlbiByb3V0ZS4KICogQHBhcmFtIHshTWVkaWFSb3V0ZX0gcm91dGUKICogQHJldHVybiB7IU9iamVjdH0KICovCmZ1bmN0aW9uIHRvU3VjY2Vzc1JvdXRlUmVzcG9uc2VfKHJvdXRlKSB7CiAgcmV0dXJuIHsKICAgICAgcm91dGU6IHJvdXRlVG9Nb2pvXyhyb3V0ZSksCiAgICAgIHJlc3VsdENvZGU6IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlUmVxdWVzdFJlc3VsdENvZGUuT0sKICB9Owp9CgovKioKICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGVycm9yIHJvdXRlIHJlc3BvbnNlIGZyb20gZ2l2ZW4gRXJyb3Igb2JqZWN0LgogKiBAcGFyYW0geyFFcnJvcn0gZXJyb3IKICogQHJldHVybiB7IU9iamVjdH0KICovCmZ1bmN0aW9uIHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnJvcikgewogIHJldHVybiB7CiAgICAgIGVycm9yVGV4dDogZXJyb3IubWVzc2FnZSwKICAgICAgcmVzdWx0Q29kZTogZ2V0Um91dGVSZXF1ZXN0UmVzdWx0Q29kZV8oZXJyb3IpCiAgfTsKfQoKLyoqCiAqIENyZWF0ZXMgYSBuZXcgTWVkaWFSb3V0ZXIuCiAqIENvbnZlcnRzIGEgcm91dGUgc3RydWN0IHRvIGl0cyBNb2pvIGZvcm0uCiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyfSBzZXJ2aWNlCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWVkaWFSb3V0ZXIoc2VydmljZSkgewogIC8qKgogICAqIFRoZSBNb2pvIHNlcnZpY2UgcHJveHkuIEFsbG93cyBleHRlbnNpb24gY29kZSB0byBjYWxsIG1ldGhvZHMgdGhhdCByZXNpZGUKICAgKiBpbiB0aGUgYnJvd3Nlci4KICAgKiBAdHlwZSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyfQogICAqLwogIHRoaXMuc2VydmljZV8gPSBzZXJ2aWNlOwoKICAvKioKICAgKiBUaGUgcHJvdmlkZXIgbWFuYWdlciBzZXJ2aWNlIGRlbGVnYXRlLiBJdHMgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHRoZQogICAqIGJyb3dzZXItcmVzaWRlbnQgTW9qbyBzZXJ2aWNlLgogICAqIEB0eXBlIHshTWVkaWFSb3V0ZXJ9CiAgICovCiAgdGhpcy5tcnBtXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXIodGhpcyk7CgogIC8qKgogICAqIEhhbmRsZSB0byBhIEtlZXBBbGl2ZSBzZXJ2aWNlIG9iamVjdCwgd2hpY2ggcHJldmVudHMgdGhlIGV4dGVuc2lvbiBmcm9tCiAgICogYmVpbmcgc3VzcGVuZGVkIGFzIGxvbmcgYXMgaXQgcmVtYWlucyBpbiBzY29wZS4KICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgKi8KICB0aGlzLmtlZXBBbGl2ZV8gPSBudWxsOwoKICAvKioKICAgKiBUaGUgYmluZGluZ3MgdG8gYmluZCB0aGUgc2VydmljZSBkZWxlZ2F0ZSB0byB0aGUgTW9qbyBpbnRlcmZhY2UuCiAgICogT2JqZWN0IG11c3QgcmVtYWluIGluIHNjb3BlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KICAgKiBwcmV2ZW50IHRoZSBjb25uZWN0aW9uIGZyb20gY2xvc2luZyBhdXRvbWF0aWNhbGx5LgogICAqIEB0eXBlIHshbW9qby5CaW5kaW5nfQogICAqLwogIHRoaXMubWVkaWFSb3V0ZVByb3ZpZGVyQmluZGluZ18gPSBuZXcgbW9qby5CaW5kaW5nKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIsIHRoaXMubXJwbV8pOwp9CgovKioKICogUmV0dXJucyBkZWZpbml0aW9ucyBvZiBNb2pvIGNvcmUgYW5kIGdlbmVyYXRlZCBNb2pvbSBjbGFzc2VzIHRoYXQgY2FuIGJlCiAqIHVzZWQgZGlyZWN0bHkgYnkgdGhlIGNvbXBvbmVudC4KICogQHJldHVybiB7IU9iamVjdH0KICogVE9ETyhpbWNoZW5nKTogV2Ugc2hvdWxkIGV4cG9ydCB0aGVzZSBhbG9uZyB3aXRoIE1lZGlhUm91dGVyLiBUaGlzIHJlcXVpcmVzCiAqIHVzIHRvIG1vZGlmeSB0aGUgY29tcG9uZW50IHRvIGhhbmRsZSBtdWx0aXBsZSBleHBvcnRzLiBXaGVuIHRoYXQgbG9naWMgaXMKICogYmFrZWQgaW4gZm9yIGEgY291cGxlIG9mIG1pbGVzdG9uZXMsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzCiAqIG1ldGhvZC4KICogVE9ETyhpbWNoZW5nKTogV2Ugc2hvdWxkIHN0b3AgZXhwb3J0aW5nIG1vam8gYmluZGluZ3MgY2xhc3NlcyB0aGF0IHRoZQogKiBNZWRpYSBSb3V0ZXIgZXh0ZW5zaW9uIGRvZXNuJ3QgZGlyZWN0bHkgdXNlLCBzdWNoIGFzCiAqIG1vam8uQXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8sIG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlciBhbmQKICogbW9qby5pbnRlcmZhY2VDb250cm9sLgogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLmdldE1vam9FeHBvcnRzID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIEFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvOiBtb2pvLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvLAogICAgQmluZGluZzogbW9qby5CaW5kaW5nLAogICAgRGlhbE1lZGlhU2luazogRGlhbE1lZGlhU2lua0FkYXB0ZXIsCiAgICBDYXN0TWVkaWFTaW5rOiBDYXN0TWVkaWFTaW5rQWRhcHRlciwKICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXI6CiAgICAgICAgbWVkaWFSb3V0ZXIubW9qb20uSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciwKICAgIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGE6IEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGFBZGFwdGVyLAogICAgSVBBZGRyZXNzOiBJUEFkZHJlc3NBZGFwdGVyLAogICAgSVBFbmRwb2ludDogSVBFbmRwb2ludEFkYXB0ZXIsCiAgICBJbnRlcmZhY2VQdHJDb250cm9sbGVyOiBtb2pvLkludGVyZmFjZVB0ckNvbnRyb2xsZXIsCiAgICBJbnRlcmZhY2VQdHJJbmZvOiBtb2pvLkludGVyZmFjZVB0ckluZm8sCiAgICBJbnRlcmZhY2VSZXF1ZXN0OiBtb2pvLkludGVyZmFjZVJlcXVlc3QsCiAgICBNZWRpYUNvbnRyb2xsZXI6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhQ29udHJvbGxlciwKICAgIE1lZGlhU3RhdHVzOiBNZWRpYVN0YXR1c0FkYXB0ZXIsCiAgICBNZWRpYVN0YXR1c09ic2VydmVyUHRyOiBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyUHRyLAogICAgTWlycm9yU2VydmljZVJlbW90ZXI6IE1pcnJvclNlcnZpY2VSZW1vdGVyQWRhcHRlciwKICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyOiBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIsCiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHI6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIsCiAgICBSZW1vdGluZ1N0b3BSZWFzb246IG1lZGlhLm1vam9tLlJlbW90aW5nU3RvcFJlYXNvbiwKICAgIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uOiBtZWRpYS5tb2pvbS5SZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbiwKICAgIFJlbW90aW5nU2lua0ZlYXR1cmU6IG1lZGlhLm1vam9tLlJlbW90aW5nU2lua0ZlYXR1cmUsCiAgICBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHk6CiAgICAgICAgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LAogICAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5OgogICAgICAgIG1lZGlhLm1vam9tLlJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eSwKICAgIFJlbW90aW5nU2lua01ldGFkYXRhOiBSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIsCiAgICBSb3V0ZUNvbnRyb2xsZXJUeXBlOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZUNvbnRyb2xsZXJUeXBlLAogICAgT3JpZ2luOiB1cmwubW9qb20uT3JpZ2luLAogICAgU2luazogTWVkaWFTaW5rQWRhcHRlciwKICAgIFNpbmtFeHRyYURhdGE6IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIsCiAgICBUaW1lRGVsdGE6IG1vam8uY29tbW9uLm1vam9tLlRpbWVEZWx0YSwKICAgIFVybDogdXJsLm1vam9tLlVybCwKICAgIGludGVyZmFjZUNvbnRyb2w6IG1vam8uaW50ZXJmYWNlQ29udHJvbCwKICAgIG1ha2VSZXF1ZXN0OiBtb2pvLm1ha2VSZXF1ZXN0LAogIH07Cn07CgovKioKICogUmVnaXN0ZXJzIHRoZSBNZWRpYSBSb3V0ZXIgUHJvdmlkZXIgTWFuYWdlciB3aXRoIHRoZSBNZWRpYSBSb3V0ZXIuCiAqIEByZXR1cm4geyFQcm9taXNlPE9iamVjdD59IEluc3RhbmNlIElEIGFuZCBjb25maWcgZm9yIHRoZSBNZWRpYSBSb3V0ZXIuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5zZXJ2aWNlXy5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcigKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICAgICAgdGhpcy5tZWRpYVJvdXRlUHJvdmlkZXJCaW5kaW5nXy5jcmVhdGVJbnRlcmZhY2VQdHJBbmRCaW5kKCkpLnRoZW4oCiAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICdpbnN0YW5jZV9pZCc6IHJlc3BvbnNlLmluc3RhbmNlSWQsCiAgICAgICAgICAgICAgJ2NvbmZpZyc6IHsKICAgICAgICAgICAgICAgICdlbmFibGVfZGlhbF9kaXNjb3ZlcnknOiByZXNwb25zZS5jb25maWcuZW5hYmxlRGlhbERpc2NvdmVyeSwKICAgICAgICAgICAgICAgICdlbmFibGVfY2FzdF9kaXNjb3ZlcnknOiByZXNwb25zZS5jb25maWcuZW5hYmxlQ2FzdERpc2NvdmVyeSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICB9KTsKfQoKLyoqCiAqIFNldHMgdGhlIHNlcnZpY2UgZGVsZWdhdGUgbWV0aG9kcy4KICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuc2V0SGFuZGxlcnMgPSBmdW5jdGlvbihoYW5kbGVycykgewogIHRoaXMubXJwbV8uc2V0SGFuZGxlcnMoaGFuZGxlcnMpOwp9CgovKioKICogVGhlIGtlZXAgYWxpdmUgc3RhdHVzLgogKiBAcmV0dXJuIHtib29sZWFufQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLmdldEtlZXBBbGl2ZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB0aGlzLmtlZXBBbGl2ZV8gIT0gbnVsbDsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiBhIHNpbmsgbGlzdCBmb3IgYSBnaXZlbiBzb3VyY2UgaXMKICogdXBkYXRlZC4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICogQHBhcmFtIHshQXJyYXk8IU1lZGlhU2luaz59IHNpbmtzCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZ3whdXJsLm1vam9tLk9yaWdpbj59IG9yaWdpbnMKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblNpbmtzUmVjZWl2ZWQgPSBmdW5jdGlvbihzb3VyY2VVcm4sIHNpbmtzLCBvcmlnaW5zKSB7CiAgLy8gfG9yaWdpbnN8IGlzIGEgc3RyaW5nIGFycmF5IGlmIHRoZSBNZWRpYSBSb3V0ZXIgY29tcG9uZW50IGV4dGVuc2lvbiB2ZXJzaW9uCiAgLy8gaXMgNTkgb3Igb2xkZXIuIFdpdGhvdXQgdGhlIHN0cmluZ1RvTW9qb09yaWdpbl8oKSBjb252ZXJzaW9uLCBjbGllbnRzIHVzaW5nCiAgLy8gdGhvc2UgZXh0ZW5zaW9uIHZlcnNpb25zIHdvdWxkIHNlZSBhIGNyYXNoIHNob3duIGluCiAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNzg3NDI3LgogIHRoaXMuc2VydmljZV8ub25TaW5rc1JlY2VpdmVkKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OLCBzb3VyY2VVcm4sCiAgICAgIHNpbmtzLm1hcChzaW5rVG9Nb2pvXyksIG9yaWdpbnMubWFwKHN0cmluZ1RvTW9qb09yaWdpbl8pKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiBhIHNpbmsgaXMgZm91bmQgdG8gbm90aWZ5IHRoZSBNUiBvZiB0aGUKICogc2luaydzIElELiBUaGUgYWN0dWFsIHNpbmsgd2lsbCBiZSByZXR1cm5lZCB0aHJvdWdoIHRoZSBub3JtYWwgc2luayBsaXN0CiAqIHVwZGF0ZSBwcm9jZXNzLCBzbyB0aGlzIGhlbHBzIHRoZSBNUiBpZGVudGlmeSB0aGUgc2VhcmNoIHJlc3VsdCBpbiB0aGUKICogbGlzdC4KICogQHBhcmFtIHtzdHJpbmd9IHBzZXVkb1NpbmtJZCAgSUQgb2YgdGhlIHBzZXVkbyBzaW5rIHRoYXQgc3RhcnRlZCB0aGUKICogICAgIHNlYXJjaC4KICogQHBhcmFtIHtzdHJpbmd9IHNpbmtJZCBJRCBvZiB0aGUgbmV3bHktZm91bmQgc2luay4KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblNlYXJjaFNpbmtJZFJlY2VpdmVkID0gZnVuY3Rpb24oCiAgICBwc2V1ZG9TaW5rSWQsIHNpbmtJZCkgewogIHRoaXMuc2VydmljZV8ub25TZWFyY2hTaW5rSWRSZWNlaXZlZChwc2V1ZG9TaW5rSWQsIHNpbmtJZCk7Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHRvIGtlZXAgdGhlIGV4dGVuc2lvbiBmcm9tIHN1c3BlbmRpbmcKICogaWYgaXQgZW50ZXJzIGEgc3RhdGUgd2hlcmUgc3VzcGVuc2lvbiBpcyB1bmRlc2lyYWJsZSAoZS5nLiB0aGVyZSBpcyBhbgogKiBhY3RpdmUgTWVkaWFSb3V0ZS4pCiAqIElmIGtlZXBBbGl2ZSBpcyB0cnVlLCB0aGUgZXh0ZW5zaW9uIGlzIGtlcHQgYWxpdmUuCiAqIElmIGtlZXBBbGl2ZSBpcyBmYWxzZSwgdGhlIGV4dGVuc2lvbiBpcyBhbGxvd2VkIHRvIHN1c3BlbmQuCiAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcEFsaXZlCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuc2V0S2VlcEFsaXZlID0gZnVuY3Rpb24oa2VlcEFsaXZlKSB7CiAgaWYgKGtlZXBBbGl2ZSA9PT0gZmFsc2UgJiYgdGhpcy5rZWVwQWxpdmVfKSB7CiAgICB0aGlzLmtlZXBBbGl2ZV8ucHRyLnJlc2V0KCk7CiAgICB0aGlzLmtlZXBBbGl2ZV8gPSBudWxsOwogIH0gZWxzZSBpZiAoa2VlcEFsaXZlID09PSB0cnVlICYmICF0aGlzLmtlZXBBbGl2ZV8pIHsKICAgIHRoaXMua2VlcEFsaXZlXyA9IG5ldyBleHRlbnNpb25zLktlZXBBbGl2ZVB0cjsKICAgIE1vam8uYmluZEludGVyZmFjZShleHRlbnNpb25zLktlZXBBbGl2ZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgIG1vam8ubWFrZVJlcXVlc3QodGhpcy5rZWVwQWxpdmVfKS5oYW5kbGUpOwogIH0KfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgdG8gc2VuZCBhbiBpc3N1ZSBmcm9tIGEgbWVkaWEgcm91dGUKICogcHJvdmlkZXIgdG8gdGhlIE1lZGlhIFJvdXRlciwgdG8gc2hvdyB0aGUgdXNlci4KICogQHBhcmFtIHshT2JqZWN0fSBpc3N1ZSBUaGUgaXNzdWUgb2JqZWN0LgogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uSXNzdWUgPSBmdW5jdGlvbihpc3N1ZSkgewogIGZ1bmN0aW9uIGlzc3VlU2V2ZXJpdHlUb01vam9fKHNldmVyaXR5KSB7CiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICAgIGNhc2UgJ2ZhdGFsJzoKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuU2V2ZXJpdHkuRkFUQUw7CiAgICAgIGNhc2UgJ3dhcm5pbmcnOgogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5TZXZlcml0eS5XQVJOSU5HOwogICAgICBjYXNlICdub3RpZmljYXRpb24nOgogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5TZXZlcml0eS5OT1RJRklDQVRJT047CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBpc3N1ZSBzZXZlcml0eTogJyArIHNldmVyaXR5KTsKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuU2V2ZXJpdHkuTk9USUZJQ0FUSU9OOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNzdWVBY3Rpb25Ub01vam9fKGFjdGlvbikgewogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgY2FzZSAnZGlzbWlzcyc6CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLkFjdGlvblR5cGUuRElTTUlTUzsKICAgICAgY2FzZSAnbGVhcm5fbW9yZSc6CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLkFjdGlvblR5cGUuTEVBUk5fTU9SRTsKICAgICAgZGVmYXVsdDoKICAgICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGlzc3VlIGFjdGlvbiB0eXBlIDogJyArIGFjdGlvbik7CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLkFjdGlvblR5cGUuT0s7CiAgICB9CiAgfQoKICB2YXIgc2Vjb25kYXJ5QWN0aW9ucyA9IChpc3N1ZS5zZWNvbmRhcnlBY3Rpb25zIHx8IFtdKS5tYXAoaXNzdWVBY3Rpb25Ub01vam9fKTsKICB0aGlzLnNlcnZpY2VfLm9uSXNzdWUobmV3IG1lZGlhUm91dGVyLm1vam9tLklzc3VlKHsKICAgICdyb3V0ZUlkJzogaXNzdWUucm91dGVJZCB8fCAnJywKICAgICdzZXZlcml0eSc6IGlzc3VlU2V2ZXJpdHlUb01vam9fKGlzc3VlLnNldmVyaXR5KSwKICAgICd0aXRsZSc6IGlzc3VlLnRpdGxlLAogICAgJ21lc3NhZ2UnOiBpc3N1ZS5tZXNzYWdlIHx8ICcnLAogICAgJ2RlZmF1bHRBY3Rpb24nOiBpc3N1ZUFjdGlvblRvTW9qb18oaXNzdWUuZGVmYXVsdEFjdGlvbiksCiAgICAnc2Vjb25kYXJ5QWN0aW9ucyc6IHNlY29uZGFyeUFjdGlvbnMsCiAgICAnaGVscFBhZ2VJZCc6IGlzc3VlLmhlbHBQYWdlSWQsCiAgICAnaXNCbG9ja2luZyc6IGlzc3VlLmlzQmxvY2tpbmcKICB9KSk7Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHdoZW4gdGhlIHNldCBvZiBhY3RpdmUgcm91dGVzCiAqIGhhcyBiZWVuIHVwZGF0ZWQuCiAqIEBwYXJhbSB7IUFycmF5PE1lZGlhUm91dGU+fSByb3V0ZXMgVGhlIGFjdGl2ZSBzZXQgb2YgbWVkaWEgcm91dGVzLgogKiBAcGFyYW0ge3N0cmluZz19IHNvdXJjZVVybiBUaGUgc291cmNlVXJuIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlCiAqICAgICBxdWVyeS4KICogQHBhcmFtIHtBcnJheTxzdHJpbmc+PX0gam9pbmFibGVSb3V0ZUlkcyBUaGUgYWN0aXZlIHNldCBvZiBqb2luYWJsZQogKiAgICAgbWVkaWEgcm91dGVzLgogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZCA9IGZ1bmN0aW9uKAogICAgcm91dGVzLCBzb3VyY2VVcm4gPSAnJywgam9pbmFibGVSb3V0ZUlkcyA9IFtdKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblJvdXRlc1VwZGF0ZWQoCiAgICAgIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVQcm92aWRlci5JZC5FWFRFTlNJT04sCiAgICAgIHJvdXRlcy5tYXAocm91dGVUb01vam9fKSwgc291cmNlVXJuLCBqb2luYWJsZVJvdXRlSWRzKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiBzaW5rIGF2YWlsYWJpbGl0eSBoYXMgYmVlbiB1cGRhdGVkLgogKiBAcGFyYW0geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5fSBhdmFpbGFiaWxpdHkKICogICAgIFRoZSBuZXcgc2luayBhdmFpbGFiaWxpdHkuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZCA9IGZ1bmN0aW9uKGF2YWlsYWJpbGl0eSkgewogIHRoaXMuc2VydmljZV8ub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZCgKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwgYXZhaWxhYmlsaXR5KTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiB0aGUgc3RhdGUgb2YgYSBwcmVzZW50YXRpb24gY29ubmVjdGVkCiAqIHRvIGEgcm91dGUgaGFzIGNoYW5nZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZUlkCiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCA9CiAgICBmdW5jdGlvbihyb3V0ZUlkLCBzdGF0ZSkgewogIHRoaXMuc2VydmljZV8ub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKAogICAgICByb3V0ZUlkLCBwcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVUb01vam9fKHN0YXRlKSk7Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHdoZW4gdGhlIHN0YXRlIG9mIGEgcHJlc2VudGF0aW9uIGNvbm5lY3RlZAogKiB0byBhIHJvdXRlIGhhcyBjbG9zZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZUlkCiAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWQgPQogICAgZnVuY3Rpb24ocm91dGVJZCwgcmVhc29uLCBtZXNzYWdlKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWQoCiAgICAgIHJvdXRlSWQsIHByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvblRvTW9qb18ocmVhc29uKSwgbWVzc2FnZSk7Cn07CgovKioKICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHshQXJyYXk8IVJvdXRlTWVzc2FnZT59IG1lc2FnZXMKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lc3NhZ2VzKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCgKICAgICAgcm91dGVJZCwgbWVzc2FnZXMubWFwKG1lc3NhZ2VUb01vam9fKSk7Cn07CgovKioKICogQHBhcmFtIHtudW1iZXJ9IHRhYklkCiAqIEBwYXJhbSB7IW1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyfSByZW1vdGVyCiAqIEBwYXJhbSB7IW1vam8uSW50ZXJmYWNlUmVxdWVzdH0gcmVtb3RpbmdTb3VyY2UKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQgPSBmdW5jdGlvbih0YWJJZCwgcmVtb3RlciwKICAgIHJlbW90aW5nU291cmNlKSB7CiAgdGhpcy5zZXJ2aWNlXy5vbk1lZGlhUmVtb3RlckNyZWF0ZWQoCiAgICAgIHRhYklkLAogICAgICBuZXcgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXJQdHIocmVtb3Rlci5wdHIucGFzc0ludGVyZmFjZSgpKSwKICAgICAgcmVtb3RpbmdTb3VyY2UpOwp9CgovKioKICogT2JqZWN0IGNvbnRhaW5pbmcgY2FsbGJhY2tzIHNldCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlci4KICoKICogQGNvbnN0cnVjdG9yCiAqIEBzdHJ1Y3QKICovCmZ1bmN0aW9uIE1lZGlhUm91dGVySGFuZGxlcnMoKSB7CiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCFzdHJpbmcsICFzdHJpbmcsICFzdHJpbmcsICFzdHJpbmcsICFudW1iZXIpfQogICAqLwogIHRoaXMuY3JlYXRlUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oIXN0cmluZywgIXN0cmluZywgIXN0cmluZywgIW51bWJlcil9CiAgICovCiAgdGhpcy5qb2luUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKTogUHJvbWlzZX0KICAgKi8KICB0aGlzLnRlcm1pbmF0ZVJvdXRlID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyl9CiAgICovCiAgdGhpcy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKX0KICAgKi8KICB0aGlzLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nKTogUHJvbWlzZX0KICAgKi8KICB0aGlzLnNlbmRSb3V0ZU1lc3NhZ2UgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nLCBVaW50OEFycmF5KTogUHJvbWlzZX0KICAgKi8KICB0aGlzLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKX0KICAgKi8KICB0aGlzLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKX0KICAgKi8KICB0aGlzLmRldGFjaFJvdXRlID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZCA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbigpfQogICAqLwogIHRoaXMuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbigpfQogICAqLwogIHRoaXMudXBkYXRlTWVkaWFTaW5rcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcsIHN0cmluZywgIVNpbmtTZWFyY2hDcml0ZXJpYSk6IHN0cmluZ30KICAgKi8KICB0aGlzLnNlYXJjaFNpbmtzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy5wcm92aWRlU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nLCAhbW9qby5JbnRlcmZhY2VSZXF1ZXN0LAogICAqICAgICAgICAgICAgIW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIpOiAhUHJvbWlzZTx2b2lkPn0KICAgKi8KICB0aGlzLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyID0gbnVsbDsKfTsKCi8qKgogKiBSb3V0ZXMgY2FsbHMgZnJvbSBNZWRpYSBSb3V0ZXIgdG8gdGhlIHByb3ZpZGVyIG1hbmFnZXIgZXh0ZW5zaW9uLgogKiBSZWdpc3RlcmVkIHdpdGggdGhlIE1lZGlhUm91dGVyIHN0dWIuCiAqIEBwYXJhbSB7IU1lZGlhUm91dGVyfSBNZWRpYVJvdXRlciBwcm94eSB0byBjYWxsIGludG8gdGhlCiAqIE1lZGlhIFJvdXRlciBtb2pvIGludGVyZmFjZS4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXIobWVkaWFSb3V0ZXIpIHsKICAvKioKICAgKiBPYmplY3QgY29udGFpbmluZyBKUyBjYWxsYmFja3MgaW50byBQcm92aWRlciBNYW5hZ2VyIGNvZGUuCiAgICogQHR5cGUgeyFNZWRpYVJvdXRlckhhbmRsZXJzfQogICAqLwogIHRoaXMuaGFuZGxlcnNfID0gbmV3IE1lZGlhUm91dGVySGFuZGxlcnMoKTsKCiAgLyoqCiAgICogUHJveHkgY2xhc3MgdG8gdGhlIGJyb3dzZXIncyBNZWRpYSBSb3V0ZXIgTW9qbyBzZXJ2aWNlLgogICAqIEB0eXBlIHshTWVkaWFSb3V0ZXJ9CiAgICovCiAgdGhpcy5tZWRpYVJvdXRlcl8gPSBtZWRpYVJvdXRlcjsKfQoKLyoKICogU2V0cyB0aGUgY2FsbGJhY2sgaGFuZGxlciB1c2VkIHRvIGludm9rZSBtZXRob2RzIGluIHRoZSBwcm92aWRlciBtYW5hZ2VyLgogKgogKiBAcGFyYW0geyFNZWRpYVJvdXRlckhhbmRsZXJzfSBoYW5kbGVycwogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zZXRIYW5kbGVycyA9IGZ1bmN0aW9uKGhhbmRsZXJzKSB7CiAgdGhpcy5oYW5kbGVyc18gPSBoYW5kbGVyczsKICB2YXIgcmVxdWlyZWRIYW5kbGVycyA9IFsKICAgICdzdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMnLAogICAgJ3N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMnLAogICAgJ3NlbmRSb3V0ZU1lc3NhZ2UnLAogICAgJ3NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UnLAogICAgJ3N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcycsCiAgICAnc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMnLAogICAgJ2RldGFjaFJvdXRlJywKICAgICd0ZXJtaW5hdGVSb3V0ZScsCiAgICAnam9pblJvdXRlJywKICAgICdjcmVhdGVSb3V0ZScsCiAgICAnc3RvcE9ic2VydmluZ01lZGlhU2lua3MnLAogICAgJ3N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMnLAogICAgJ2Nvbm5lY3RSb3V0ZUJ5Um91dGVJZCcsCiAgICAnZW5hYmxlTWRuc0Rpc2NvdmVyeScsCiAgICAndXBkYXRlTWVkaWFTaW5rcycsCiAgICAnc2VhcmNoU2lua3MnLAogICAgJ3Byb3ZpZGVTaW5rcycsCiAgICAnY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXInLAogICAgJ29uQmVmb3JlSW52b2tlSGFuZGxlcicKICBdOwogIHJlcXVpcmVkSGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbihuZXh0SGFuZGxlcikgewogICAgaWYgKGhhbmRsZXJzW25leHRIYW5kbGVyXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IobmV4dEhhbmRsZXIgKyAnIGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQuJyk7CiAgICB9CiAgfSk7Cn0KCi8qKgogKiBTdGFydHMgcXVlcnlpbmcgZm9yIHNpbmtzIGNhcGFibGUgb2YgZGlzcGxheWluZyB0aGUgbWVkaWEgc291cmNlCiAqIGRlc2lnbmF0ZWQgYnkgfHNvdXJjZVVybnwuICBSZXN1bHRzIGFyZSByZXR1cm5lZCBieSBjYWxsaW5nCiAqIE9uU2lua3NSZWNlaXZlZC4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyhzb3VyY2VVcm4pOwp9OwoKLyoqCiAqIFN0b3BzIHF1ZXJ5aW5nIGZvciBzaW5rcyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgfHNvdXJjZVVybnwuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzKHNvdXJjZVVybik7Cn07CgovKioKICogUmVxdWVzdHMgdGhhdCB8c2lua0lkfCByZW5kZXIgdGhlIG1lZGlhIHJlZmVyZW5jZWQgYnkgfHNvdXJjZVVybnwuIElmIHRoZQogKiByZXF1ZXN0IGlzIGZyb20gdGhlIFByZXNlbnRhdGlvbiBBUEksIHRoZW4gb3JpZ2luIGFuZCB0YWJJZCB3aWxsCiAqIGJlIHBvcHVsYXRlZC4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4gTWVkaWEgc291cmNlIHRvIHJlbmRlci4KICogQHBhcmFtIHshc3RyaW5nfSBzaW5rSWQgTWVkaWEgc2luayBJRC4KICogQHBhcmFtIHshc3RyaW5nfSBwcmVzZW50YXRpb25JZCBQcmVzZW50YXRpb24gSUQgZnJvbSB0aGUgc2l0ZQogKiAgICAgcmVxdWVzdGluZyBwcmVzZW50YXRpb24uIFRPRE8obWZvbHR6KTogUmVtb3ZlLgogKiBAcGFyYW0geyF1cmwubW9qb20uT3JpZ2lufSBvcmlnaW4gT3JpZ2luIG9mIHNpdGUgcmVxdWVzdGluZyBwcmVzZW50YXRpb24uCiAqIEBwYXJhbSB7IW51bWJlcn0gdGFiSWQgSUQgb2YgdGFiIHJlcXVlc3RpbmcgcHJlc2VudGF0aW9uLgogKiBAcGFyYW0geyFtb2pvLmNvbW1vbi5tb2pvbS5UaW1lRGVsdGF9IHRpbWVvdXQgSWYgcG9zaXRpdmUsIHRoZSB0aW1lb3V0CiAqICAgICBkdXJhdGlvbiBmb3IgdGhlIHJlcXVlc3QuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgZHVyYXRpb24gd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0geyFib29sZWFufSBpbmNvZ25pdG8gSWYgdHJ1ZSwgdGhlIHJvdXRlIGlzIGJlaW5nIHJlcXVlc3RlZCBieQogKiAgICAgYW4gaW5jb2duaXRvIHByb2ZpbGUuCiAqIEByZXR1cm4geyFQcm9taXNlLjwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgbWVkaWEgcm91dGUsIG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb24KICogICAgIGZhaWx1cmUuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmNyZWF0ZVJvdXRlID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybiwgc2lua0lkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwKICAgICAgICAgICAgIHRpbWVvdXQsIGluY29nbml0bykgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5jcmVhdGVSb3V0ZSgKICAgICAgc291cmNlVXJuLCBzaW5rSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICBNYXRoLmZsb29yKHRpbWVvdXQubWljcm9zZWNvbmRzIC8gMTAwMCksIGluY29nbml0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocm91dGUpIHsKICAgICAgICByZXR1cm4gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpOwogICAgICB9LAogICAgICBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycik7CiAgICAgIH0pOwp9OwoKLyoqCiAqIEhhbmRsZXMgYSByZXF1ZXN0IHZpYSB0aGUgUHJlc2VudGF0aW9uIEFQSSB0byBqb2luIGFuIGV4aXN0aW5nIHJvdXRlIGdpdmVuCiAqIGJ5IHxzb3VyY2VVcm58IGFuZCB8cHJlc2VudGF0aW9uSWR8LiB8b3JpZ2lufCBhbmQgfHRhYklkfCBhcmUgdXNlZCBmb3IKICogdmFsaWRhdGluZyBzYW1lLW9yaWdpbi90YWIgc2NvcGUuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuIE1lZGlhIHNvdXJjZSB0byByZW5kZXIuCiAqIEBwYXJhbSB7IXN0cmluZ30gcHJlc2VudGF0aW9uSWQgUHJlc2VudGF0aW9uIElEIHRvIGpvaW4uCiAqIEBwYXJhbSB7IXVybC5tb2pvbS5PcmlnaW59IG9yaWdpbiBPcmlnaW4gb2Ygc2l0ZSByZXF1ZXN0aW5nIGpvaW4uCiAqIEBwYXJhbSB7IW51bWJlcn0gdGFiSWQgSUQgb2YgdGFiIHJlcXVlc3Rpbmcgam9pbi4KICogQHBhcmFtIHshbW9qby5jb21tb24ubW9qb20uVGltZURlbHRhfSB0aW1lb3V0IElmIHBvc2l0aXZlLCB0aGUgdGltZW91dAogKiAgICAgZHVyYXRpb24gZm9yIHRoZSByZXF1ZXN0LiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGR1cmF0aW9uIHdpbGwgYmUgdXNlZC4KICogQHBhcmFtIHshYm9vbGVhbn0gaW5jb2duaXRvIElmIHRydWUsIHRoZSByb3V0ZSBpcyBiZWluZyByZXF1ZXN0ZWQgYnkKICogICAgIGFuIGluY29nbml0byBwcm9maWxlLgogKiBAcmV0dXJuIHshUHJvbWlzZS48IU9iamVjdD59IEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gb2JqZWN0IGRlc2NyaWJpbmcKICogICAgIHRoZSBuZXdseSBjcmVhdGVkIG1lZGlhIHJvdXRlLCBvciByZWplY3Rpbmcgd2l0aCBhbiBlcnJvciBtZXNzYWdlIG9uCiAqICAgICBmYWlsdXJlLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5qb2luUm91dGUgPQogICAgZnVuY3Rpb24oc291cmNlVXJuLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwKICAgICAgICAgICAgIGluY29nbml0bykgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5qb2luUm91dGUoCiAgICAgIHNvdXJjZVVybiwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsCiAgICAgIE1hdGguZmxvb3IodGltZW91dC5taWNyb3NlY29uZHMgLyAxMDAwKSwgaW5jb2duaXRvKQogICAgICAudGhlbihmdW5jdGlvbihyb3V0ZSkgewogICAgICAgIHJldHVybiB0b1N1Y2Nlc3NSb3V0ZVJlc3BvbnNlXyhyb3V0ZSk7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiB0b0Vycm9yUm91dGVSZXNwb25zZV8oZXJyKTsKICAgICAgfSk7Cn07CgovKioKICogSGFuZGxlcyBhIHJlcXVlc3QgdmlhIHRoZSBQcmVzZW50YXRpb24gQVBJIHRvIGpvaW4gYW4gZXhpc3Rpbmcgcm91dGUgZ2l2ZW4KICogYnkgfHNvdXJjZVVybnwgYW5kIHxyb3V0ZUlkfC4gfG9yaWdpbnwgYW5kIHx0YWJJZHwgYXJlIHVzZWQgZm9yCiAqIHZhbGlkYXRpbmcgc2FtZS1vcmlnaW4vdGFiIHNjb3BlLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybiBNZWRpYSBzb3VyY2UgdG8gcmVuZGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQgUm91dGUgSUQgdG8gam9pbi4KICogQHBhcmFtIHshc3RyaW5nfSBwcmVzZW50YXRpb25JZCBQcmVzZW50YXRpb24gSUQgdG8gam9pbi4KICogQHBhcmFtIHshdXJsLm1vam9tLk9yaWdpbn0gb3JpZ2luIE9yaWdpbiBvZiBzaXRlIHJlcXVlc3Rpbmcgam9pbi4KICogQHBhcmFtIHshbnVtYmVyfSB0YWJJZCBJRCBvZiB0YWIgcmVxdWVzdGluZyBqb2luLgogKiBAcGFyYW0geyFtb2pvLmNvbW1vbi5tb2pvbS5UaW1lRGVsdGF9IHRpbWVvdXQgSWYgcG9zaXRpdmUsIHRoZSB0aW1lb3V0CiAqICAgICBkdXJhdGlvbiBmb3IgdGhlIHJlcXVlc3QuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgZHVyYXRpb24gd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0geyFib29sZWFufSBpbmNvZ25pdG8gSWYgdHJ1ZSwgdGhlIHJvdXRlIGlzIGJlaW5nIHJlcXVlc3RlZCBieQogKiAgICAgYW4gaW5jb2duaXRvIHByb2ZpbGUuCiAqIEByZXR1cm4geyFQcm9taXNlLjwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgbWVkaWEgcm91dGUsIG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb24KICogICAgIGZhaWx1cmUuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZCA9CiAgICBmdW5jdGlvbihzb3VyY2VVcm4sIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICAgICAgICAgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgcmV0dXJuIHRoaXMuaGFuZGxlcnNfLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZCgKICAgICAgc291cmNlVXJuLCByb3V0ZUlkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwKICAgICAgTWF0aC5mbG9vcih0aW1lb3V0Lm1pY3Jvc2Vjb25kcyAvIDEwMDApLCBpbmNvZ25pdG8pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJvdXRlKSB7CiAgICAgICAgcmV0dXJuIHRvU3VjY2Vzc1JvdXRlUmVzcG9uc2VfKHJvdXRlKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgcmV0dXJuIHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnIpOwogICAgICB9KTsKfTsKCi8qKgogKiBUZXJtaW5hdGVzIHRoZSByb3V0ZSBzcGVjaWZpZWQgYnkgfHJvdXRlSWR8LgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICogQHJldHVybiB7IVByb21pc2U8IU9iamVjdD59IEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gb2JqZWN0IGRlc2NyaWJpbmcKICogICAgdGhlIHJlc3VsdCBvZiB0aGUgdGVybWluYXRlIG9wZXJhdGlvbiwgb3IgcmVqZWN0aW5nIHdpdGggYW4gZXJyb3IKICogICAgbWVzc2FnZSBhbmQgY29kZSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgcmV0dXJuIHRoaXMuaGFuZGxlcnNfLnRlcm1pbmF0ZVJvdXRlKHJvdXRlSWQpLnRoZW4oCiAgICAgICgpID0+ICh7cmVzdWx0Q29kZTogbWVkaWFSb3V0ZXIubW9qb20uUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5PS30pLAogICAgICAoZXJyKSA9PiB0b0Vycm9yUm91dGVSZXNwb25zZV8oZXJyKSk7Cn07CgovKioKICogUG9zdHMgYSBtZXNzYWdlIHRvIHRoZSByb3V0ZSBkZXNpZ25hdGVkIGJ5IHxyb3V0ZUlkfC4KICogQHBhcmFtIHshc3RyaW5nfSByb3V0ZUlkCiAqIEBwYXJhbSB7IXN0cmluZ30gbWVzc2FnZQogKiBAcmV0dXJuIHshUHJvbWlzZS48Ym9vbGVhbj59IFJlc29sdmVkIHdpdGggdHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgc2VudCwKICogICAgb3IgZmFsc2Ugb24gZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc2VuZFJvdXRlTWVzc2FnZSA9IGZ1bmN0aW9uKAogIHJvdXRlSWQsIG1lc3NhZ2UpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uc2VuZFJvdXRlTWVzc2FnZShyb3V0ZUlkLCBtZXNzYWdlKQogICAgICAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geydzZW50JzogdHJ1ZX07CiAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7J3NlbnQnOiBmYWxzZX07CiAgICAgIH0pOwp9OwoKLyoqCiAqIFNlbmRzIGEgYmluYXJ5IG1lc3NhZ2UgdG8gdGhlIHJvdXRlIGRlc2lnbmF0ZWQgYnkgfHJvdXRlSWR8LgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHshQXJyYXk8bnVtYmVyPn0gZGF0YQogKiBAcmV0dXJuIHshUHJvbWlzZS48Ym9vbGVhbj59IFJlc29sdmVkIHdpdGggdHJ1ZSBpZiB0aGUgZGF0YSB3YXMgc2VudCwKICogICAgb3IgZmFsc2Ugb24gZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IGZ1bmN0aW9uKAogIHJvdXRlSWQsIGRhdGEpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uc2VuZFJvdXRlQmluYXJ5TWVzc2FnZShyb3V0ZUlkLCBuZXcgVWludDhBcnJheShkYXRhKSkKICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHsnc2VudCc6IHRydWV9OwogICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geydzZW50JzogZmFsc2V9OwogICAgICB9KTsKfTsKCi8qKgogKiBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gYSByb3V0ZS4KICogQHBhcmFtIHshc3RyaW5nfSByb3V0ZUlkCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKAogICAgcm91dGVJZCkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhyb3V0ZUlkKTsKfTsKCi8qKgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbigKICAgIHJvdXRlSWQpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhyb3V0ZUlkKTsKfTsKCi8qKgogKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJlc2VudGF0aW9uIGNvbm5lY3Rpb24gdGhhdCB3YXMgY29ubmVjdGVkIHRvIHxyb3V0ZUlkfAogKiBpcyBubyBsb25nZXIgY29ubmVjdGVkIHRvIGl0LgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuZGV0YWNoUm91dGUgPSBmdW5jdGlvbigKICAgIHJvdXRlSWQpIHsKICB0aGlzLmhhbmRsZXJzXy5kZXRhY2hSb3V0ZShyb3V0ZUlkKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHRoZSBwcm92aWRlciBtYW5hZ2VyIHN0YXJ0IHNlbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlCiAqIG1lZGlhIHJvdXRlcyB0byB0aGUgTWVkaWEgUm91dGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcyhzb3VyY2VVcm4pOwp9OwoKLyoqCiAqIFJlcXVlc3RzIHRoYXQgdGhlIHByb3ZpZGVyIG1hbmFnZXIgc3RvcCBzZW5kaW5nIGluZm9ybWF0aW9uIGFib3V0IGFjdGl2ZQogKiBtZWRpYSByb3V0ZXMgdG8gdGhlIE1lZGlhIFJvdXRlci4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RvcE9ic2VydmluZ01lZGlhUm91dGVzKHNvdXJjZVVybik7Cn07CgovKioKICogRW5hYmxlcyBtRE5TIGRldmljZSBkaXNjb3ZlcnkuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmVuYWJsZU1kbnNEaXNjb3ZlcnkgPSBmdW5jdGlvbigpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5lbmFibGVNZG5zRGlzY292ZXJ5KCk7Cn07CgovKioKICogUmVxdWVzdHMgdGhhdCB0aGUgcHJvdmlkZXIgbWFuYWdlciB1cGRhdGUgbWVkaWEgc2lua3MuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MgPSBmdW5jdGlvbihzb3VyY2VVcm4pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy51cGRhdGVNZWRpYVNpbmtzKHNvdXJjZVVybik7Cn07CgovKioKICogUmVxdWVzdHMgdGhhdCB0aGUgcHJvdmlkZXIgbWFuYWdlciBzZWFyY2ggaXRzIHByb3ZpZGVycyBmb3IgYSBzaW5rIG1hdGNoaW5nCiAqIHxzZWFyY2hDcml0ZXJpYXwgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggfHNvdXJjZVVybnwuIElmIGEgc2luayBpcyBmb3VuZAogKiB0aGF0IGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGZvciByb3V0ZSBjcmVhdGlvbiwgaXRzIElEIGlzIHJldHVybmVkLgogKiBPdGhlcndpc2UgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICoKICogQHBhcmFtIHtzdHJpbmd9IHNpbmtJZCBTaW5rIElEIG9mIHRoZSBwc2V1ZG8gc2luayBnZW5lcmF0aW5nIHRoZSByZXF1ZXN0LgogKiBAcGFyYW0ge3N0cmluZ30gc291cmNlVXJuIE1lZGlhIHNvdXJjZSB0byBiZSB1c2VkIHdpdGggdGhlIHNpbmsuCiAqIEBwYXJhbSB7IVNpbmtTZWFyY2hDcml0ZXJpYX0gc2VhcmNoQ3JpdGVyaWEgU2VhcmNoIGNyaXRlcmlhIGZvciB0aGUgcm91dGUKICogICAgIHByb3ZpZGVycy4KICogQHJldHVybiB7IVByb21pc2UuPCF7c2lua19pZDogIXN0cmluZ30+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGVpdGhlciB0aGUKICogICAgIHNpbmsgSUQgb2YgdGhlIHNpbmsgZm91bmQgYnkgdGhlIHNlYXJjaCB0aGF0IGNhbiBiZSB1c2VkIGZvciByb3V0ZQogKiAgICAgY3JlYXRpb24sIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm8gcm91dGUgY2FuIGJlIGltbWVkaWF0ZWx5IGNyZWF0ZWQuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnNlYXJjaFNpbmtzID0gZnVuY3Rpb24oCiAgICBzaW5rSWQsIHNvdXJjZVVybiwgc2VhcmNoQ3JpdGVyaWEpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKIHJldHVybiB0aGlzLmhhbmRsZXJzXy5zZWFyY2hTaW5rcyhzaW5rSWQsIHNvdXJjZVVybiwgc2VhcmNoQ3JpdGVyaWEpLnRoZW4oCiAgICAgIHNpbmtJZCA9PiB7CiAgICAgICAgcmV0dXJuIHsgJ3NpbmtJZCc6IHNpbmtJZCB9OwogICAgICB9LAogICAgICAoKSA9PiB7CiAgICAgICAgcmV0dXJuIHsgJ3NpbmtJZCc6ICcnIH07CiAgICAgIH0pOwp9OwoKLyoqCiAqIE5vdGlmaWVzIHRoZSBwcm92aWRlciBtYW5hZ2VyIHRoYXQgTWVkaWFSb3V0ZXIgaGFzIGRpc2NvdmVyZWQgYSBsaXN0IG9mCiAqIHNpbmtzLgogKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJOYW1lCiAqIEBwYXJhbSB7IUFycmF5PCFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbms+fSBzaW5rcwogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5wcm92aWRlU2lua3MgPSBmdW5jdGlvbihwcm92aWRlck5hbWUsIHNpbmtzKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18ucHJvdmlkZVNpbmtzKHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua3MubWFwKE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24pKTsKfTsKCi8qKgogKiBDcmVhdGVzIGEgY29udHJvbGxlciBmb3IgdGhlIGdpdmVuIHJvdXRlIGFuZCBiaW5kcyB0aGUgZ2l2ZW4KICogSW50ZXJmYWNlUmVxdWVzdCB0byBpdCwgYW5kIHJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgbWVkaWEgc3RhdHVzIHVwZGF0ZXMKICogZm9yIHRoZSByb3V0ZS4KICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHshbW9qby5JbnRlcmZhY2VSZXF1ZXN0fSBjb250cm9sbGVyUmVxdWVzdAogKiBAcGFyYW0geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyUHRyfSBvYnNlcnZlcgogKiBAcmV0dXJuIHshUHJvbWlzZTwhe3N1Y2Nlc3M6IGJvb2xlYW59Pn0gUmVzb2x2ZXMgdG8gdHJ1ZSBpZiBhIGNvbnRyb2xsZXIKICogICAgIGlzIGNyZWF0ZWQuIFJlc29sdmVzIHRvIGZhbHNlIGlmIGEgY29udHJvbGxlciBjYW5ub3QgYmUgY3JlYXRlZCwgb3IgaWYKICogICAgIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgYm91bmQuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyID0gZnVuY3Rpb24oCiAgICByb3V0ZUlkLCBjb250cm9sbGVyUmVxdWVzdCwgb2JzZXJ2ZXIpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIoCiAgICAgIHJvdXRlSWQsIGNvbnRyb2xsZXJSZXF1ZXN0LAogICAgICBuZXcgTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIob2JzZXJ2ZXIucHRyLnBhc3NJbnRlcmZhY2UoKSkpLnRoZW4oCiAgICAgICAgICAoKSA9PiAoe3N1Y2Nlc3M6IHRydWV9KSwgZSA9PiAoe3N1Y2Nlc3M6IGZhbHNlfSkpOwp9OwoKdmFyIHB0ciA9IG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlclB0cjsKTW9qby5iaW5kSW50ZXJmYWNlKG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLm5hbWUsCiAgICAgICAgICAgICAgICAgICBtb2pvLm1ha2VSZXF1ZXN0KHB0cikuaGFuZGxlKTsKZXhwb3J0cy4kc2V0KCdyZXR1cm5WYWx1ZScsIG5ldyBNZWRpYVJvdXRlcihwdHIpKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3N0YXR1cy5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgdmFyIHRpbWUkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21vam8uY29tbW9uLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdtb2pvL2NvbW1vbi90aW1lLm1vam9tJywgJy4uLy4uLy4uLy4uL21vam8vY29tbW9uL3RpbWUubW9qb20uanMnKTsKICB9CgoKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZSA9IHt9OwogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5QTEFZSU5HID0gMDsKICBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuUEFVU0VEID0gTWVkaWFTdGF0dXMuUGxheVN0YXRlLlBMQVlJTkcgKyAxOwogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5CVUZGRVJJTkcgPSBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuUEFVU0VEICsgMTsKCiAgTWVkaWFTdGF0dXMuUGxheVN0YXRlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVN0YXR1cy5QbGF5U3RhdGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIE1lZGlhU3RhdHVzLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpdGxlID0gbnVsbDsKICAgIHRoaXMuZGVzY3JpcHRpb24gPSBudWxsOwogICAgdGhpcy5jYW5QbGF5UGF1c2UgPSBmYWxzZTsKICAgIHRoaXMuY2FuTXV0ZSA9IGZhbHNlOwogICAgdGhpcy5jYW5TZXRWb2x1bWUgPSBmYWxzZTsKICAgIHRoaXMuY2FuU2VlayA9IGZhbHNlOwogICAgdGhpcy5pc011dGVkID0gZmFsc2U7CiAgICB0aGlzLnBsYXlTdGF0ZSA9IDA7CiAgICB0aGlzLnZvbHVtZSA9IDA7CiAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDsKICAgIHRoaXMuY3VycmVudFRpbWUgPSBudWxsOwogICAgdGhpcy5oYW5nb3V0c0V4dHJhRGF0YSA9IG51bGw7CiAgfTsKICBNZWRpYVN0YXR1cy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhU3RhdHVzLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDY0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMudGl0bGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMuZGVzY3JpcHRpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzLnBsYXlTdGF0ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyMCwgTWVkaWFTdGF0dXMuUGxheVN0YXRlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzLmR1cmF0aW9uCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy5jdXJyZW50VGltZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgdGltZSQuVGltZURlbHRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMuaGFuZ291dHNFeHRyYURhdGEKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDgsIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEsIHRydWUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVN0YXR1cy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNTY7CgogIE1lZGlhU3RhdHVzLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhU3RhdHVzKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC50aXRsZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZGVzY3JpcHRpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5jYW5QbGF5UGF1c2UgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5jYW5NdXRlID0gKHBhY2tlZCA+PiAxKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuY2FuU2V0Vm9sdW1lID0gKHBhY2tlZCA+PiAyKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuY2FuU2VlayA9IChwYWNrZWQgPj4gMykgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmlzTXV0ZWQgPSAocGFja2VkID4+IDQpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5wbGF5U3RhdGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwudm9sdW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLmR1cmF0aW9uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICB2YWwuY3VycmVudFRpbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHZhbC5oYW5nb3V0c0V4dHJhRGF0YSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFTdGF0dXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVN0YXR1cy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwudGl0bGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuZGVzY3JpcHRpb24pOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmNhblBsYXlQYXVzZSAmIDEpIDw8IDAKICAgIHBhY2tlZCB8PSAodmFsLmNhbk11dGUgJiAxKSA8PCAxCiAgICBwYWNrZWQgfD0gKHZhbC5jYW5TZXRWb2x1bWUgJiAxKSA8PCAyCiAgICBwYWNrZWQgfD0gKHZhbC5jYW5TZWVrICYgMSkgPDwgMwogICAgcGFja2VkIHw9ICh2YWwuaXNNdXRlZCAmIDEpIDw8IDQKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wbGF5U3RhdGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQsIHZhbC52b2x1bWUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLmR1cmF0aW9uKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEsIHZhbC5jdXJyZW50VGltZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSwgdmFsLmhhbmdvdXRzRXh0cmFEYXRhKTsKICB9OwogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxvY2FsUHJlc2VudCA9IGZhbHNlOwogIH07CiAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmxvY2FsUHJlc2VudCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmxvY2FsUHJlc2VudCAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdGF0dXMgPSBudWxsOwogIH07CiAgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLnN0YXR1cwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVN0YXR1cywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnN0YXR1cyA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVN0YXR1cyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVN0YXR1cywgdmFsLnN0YXR1cyk7CiAgfTsKICB2YXIga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZSA9IDEyNTMwMjA3Mjk7CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhU3RhdHVzT2JzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBNZWRpYVN0YXR1c09ic2VydmVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1lZGlhU3RhdHVzT2JzZXJ2ZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoTWVkaWFTdGF0dXNPYnNlcnZlclB0ci5wcm90b3R5cGUpOwogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBNZWRpYVN0YXR1c09ic2VydmVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIucHJvdG90eXBlLm9uTWVkaWFTdGF0dXNVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQcm94eS5wcm90b3R5cGUub25NZWRpYVN0YXR1c1VwZGF0ZWQgPSBmdW5jdGlvbihzdGF0dXMpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5zdGF0dXMgPSBzdGF0dXM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUub25NZWRpYVN0YXR1c1VwZGF0ZWQgPSBmdW5jdGlvbihzdGF0dXMpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lZGlhU3RhdHVzVXBkYXRlZCAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lZGlhU3RhdHVzVXBkYXRlZChzdGF0dXMpOwogIH0KCiAgTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vbk1lZGlhU3RhdHVzVXBkYXRlZChwYXJhbXMuc3RhdHVzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYVN0YXR1c09ic2VydmVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYVN0YXR1c09ic2VydmVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9CgogIHZhciBNZWRpYVN0YXR1c09ic2VydmVyID0gewogICAgbmFtZTogJ21lZGlhX3JvdXRlcjo6bW9qb206Ok1lZGlhU3RhdHVzT2JzZXJ2ZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhU3RhdHVzT2JzZXJ2ZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IHZhbGlkYXRlTWVkaWFTdGF0dXNPYnNlcnZlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAogIH07CiAgTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWVkaWFTdGF0dXNPYnNlcnZlclJlcXVlc3Q7CiAgTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSBudWxsOwogIGV4cG9ydHMuTWVkaWFTdGF0dXMgPSBNZWRpYVN0YXR1czsKICBleHBvcnRzLkhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEgPSBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhOwogIGV4cG9ydHMuTWVkaWFTdGF0dXNPYnNlcnZlciA9IE1lZGlhU3RhdHVzT2JzZXJ2ZXI7CiAgZXhwb3J0cy5NZWRpYVN0YXR1c09ic2VydmVyUHRyID0gTWVkaWFTdGF0dXNPYnNlcnZlclB0cjsKICBleHBvcnRzLk1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdtb2pvL2NvbW1vbi90aW1lLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qby5jb21tb24ubW9qb20nKTsKCgoKICBmdW5jdGlvbiBUaW1lKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgVGltZS5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pbnRlcm5hbFZhbHVlID0gMDsKICB9OwogIFRpbWUucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBUaW1lLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBUaW1lLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBUaW1lLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFRpbWUoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmludGVybmFsVmFsdWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQ2NCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFRpbWUuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihUaW1lLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQ2NCwgdmFsLmludGVybmFsVmFsdWUpOwogIH07CiAgZnVuY3Rpb24gVGltZURlbHRhKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgVGltZURlbHRhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1pY3Jvc2Vjb25kcyA9IDA7CiAgfTsKICBUaW1lRGVsdGEucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBUaW1lRGVsdGEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFRpbWVEZWx0YS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgVGltZURlbHRhLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFRpbWVEZWx0YSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWljcm9zZWNvbmRzID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50NjQpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBUaW1lRGVsdGEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihUaW1lRGVsdGEuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDY0LCB2YWwubWljcm9zZWNvbmRzKTsKICB9OwogIGZ1bmN0aW9uIFRpbWVUaWNrcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIFRpbWVUaWNrcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pbnRlcm5hbFZhbHVlID0gMDsKICB9OwogIFRpbWVUaWNrcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFRpbWVUaWNrcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgVGltZVRpY2tzLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBUaW1lVGlja3MuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVGltZVRpY2tzKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pbnRlcm5hbFZhbHVlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50NjQpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBUaW1lVGlja3MuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihUaW1lVGlja3MuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDY0LCB2YWwuaW50ZXJuYWxWYWx1ZSk7CiAgfTsKICBleHBvcnRzLlRpbWUgPSBUaW1lOwogIGV4cG9ydHMuVGltZURlbHRhID0gVGltZURlbHRhOwogIGV4cG9ydHMuVGltZVRpY2tzID0gVGltZVRpY2tzOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAnbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ25ldC5pbnRlcmZhY2VzJyk7CgoKCiAgZnVuY3Rpb24gSVBBZGRyZXNzKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgSVBBZGRyZXNzLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmFkZHJlc3NCeXRlcyA9IG51bGw7CiAgfTsKICBJUEFkZHJlc3MucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBJUEFkZHJlc3MudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJUEFkZHJlc3MuYWRkcmVzc0J5dGVzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgMSwgY29kZWMuVWludDgsIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBJUEFkZHJlc3MuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIElQQWRkcmVzcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBJUEFkZHJlc3MoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmFkZHJlc3NCeXRlcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgSVBBZGRyZXNzLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSVBBZGRyZXNzLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCwgdmFsLmFkZHJlc3NCeXRlcyk7CiAgfTsKICBleHBvcnRzLklQQWRkcmVzcyA9IElQQWRkcmVzczsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKICB2YXIgaXBfYWRkcmVzcyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ25ldC9pbnRlcmZhY2VzL2lwX2FkZHJlc3MubW9qb20nLCAnaXBfYWRkcmVzcy5tb2pvbS5qcycpOwogIH0KCgoKICBmdW5jdGlvbiBJUEVuZFBvaW50KHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgSVBFbmRQb2ludC5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hZGRyZXNzID0gbnVsbDsKICAgIHRoaXMucG9ydCA9IDA7CiAgfTsKICBJUEVuZFBvaW50LnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgSVBFbmRQb2ludC52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElQRW5kUG9pbnQuYWRkcmVzcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBpcF9hZGRyZXNzJC5JUEFkZHJlc3MsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIElQRW5kUG9pbnQuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBJUEVuZFBvaW50LmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IElQRW5kUG9pbnQoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmFkZHJlc3MgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoaXBfYWRkcmVzcyQuSVBBZGRyZXNzKTsKICAgIHZhbC5wb3J0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuVWludDE2KTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgSVBFbmRQb2ludC5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKElQRW5kUG9pbnQuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihpcF9hZGRyZXNzJC5JUEFkZHJlc3MsIHZhbC5hZGRyZXNzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlVpbnQxNiwgdmFsLnBvcnQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZXhwb3J0cy5JUEVuZFBvaW50ID0gSVBFbmRQb2ludDsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ3VybC9tb2pvL29yaWdpbi5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwoKCgogIGZ1bmN0aW9uIE9yaWdpbih2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE9yaWdpbi5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zY2hlbWUgPSBudWxsOwogICAgdGhpcy5ob3N0ID0gbnVsbDsKICAgIHRoaXMucG9ydCA9IDA7CiAgICB0aGlzLnVuaXF1ZSA9IGZhbHNlOwogICAgdGhpcy5zdWJvcmlnaW4gPSBudWxsOwogIH07CiAgT3JpZ2luLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgT3JpZ2luLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQwfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgT3JpZ2luLnNjaGVtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBPcmlnaW4uaG9zdAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgLy8gdmFsaWRhdGUgT3JpZ2luLnN1Ym9yaWdpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBPcmlnaW4uZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyOwoKICBPcmlnaW4uZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgT3JpZ2luKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5zY2hlbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmhvc3QgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnBvcnQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5VaW50MTYpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC51bmlxdWUgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5zdWJvcmlnaW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBPcmlnaW4uZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihPcmlnaW4uZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNjaGVtZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5ob3N0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlVpbnQxNiwgdmFsLnBvcnQpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLnVuaXF1ZSAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuc3Vib3JpZ2luKTsKICB9OwogIGV4cG9ydHMuT3JpZ2luID0gT3JpZ2luOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAndXJsL21vam8vdXJsLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgndXJsLm1vam9tJyk7CgoKCiAgZnVuY3Rpb24gVXJsKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgVXJsLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnVybCA9IG51bGw7CiAgfTsKICBVcmwucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBVcmwudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBVcmwudXJsCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBVcmwuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIFVybC5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBVcmwoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnVybCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFVybC5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFVybC5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwudXJsKTsKICB9OwogIGV4cG9ydHMuVXJsID0gVXJsOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAnbWVkaWEvbW9qby9pbnRlcmZhY2VzL21pcnJvcl9zZXJ2aWNlX3JlbW90aW5nLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWEubW9qb20nKTsKICB2YXIgcmVtb3RpbmdfY29tbW9uJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYS5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbWVkaWEvbW9qby9pbnRlcmZhY2VzL3JlbW90aW5nX2NvbW1vbi5tb2pvbScsICdyZW1vdGluZ19jb21tb24ubW9qb20uanMnKTsKICB9CgoKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGFzQXVkaW8gPSBmYWxzZTsKICAgIHRoaXMuaGFzVmlkZW8gPSBmYWxzZTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5oYXNBdWRpbyA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmhhc1ZpZGVvID0gKHBhY2tlZCA+PiAxKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5oYXNBdWRpbyAmIDEpIDw8IDAKICAgIHBhY2tlZCB8PSAodmFsLmhhc1ZpZGVvICYgMSkgPDwgMQogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hdWRpb1N0cmVhbUlkID0gMDsKICAgIHRoaXMudmlkZW9TdHJlYW1JZCA9IDA7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuYXVkaW9TdHJlYW1JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC52aWRlb1N0cmVhbUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5hdWRpb1N0cmVhbUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudmlkZW9TdHJlYW1JZCk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlYXNvbiA9IDA7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMucmVhc29uCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHJlbW90aW5nX2NvbW1vbiQuUmVtb3RpbmdTdG9wUmVhc29uKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yZWFzb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVhc29uKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgMSwgY29kZWMuVWludDgsIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lc3NhZ2UgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgsIHZhbC5tZXNzYWdlKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yYXRlID0gMDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJhdGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5Eb3VibGUpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuRG91YmxlLCB2YWwucmF0ZSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1ldGFkYXRhID0gbnVsbDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5tZXRhZGF0YQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCByZW1vdGluZ19jb21tb24kLlJlbW90aW5nU2lua01ldGFkYXRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWV0YWRhdGEgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIocmVtb3RpbmdfY29tbW9uJC5SZW1vdGluZ1NpbmtNZXRhZGF0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihyZW1vdGluZ19jb21tb24kLlJlbW90aW5nU2lua01ldGFkYXRhLCB2YWwubWV0YWRhdGEpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIDEsIGNvZGVjLlVpbnQ4LCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgsIHZhbC5tZXNzYWdlKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVhc29uID0gMDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5yZWFzb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgcmVtb3RpbmdfY29tbW9uJC5SZW1vdGluZ1N0b3BSZWFzb24pOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJlYXNvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZWFzb24pOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfTmFtZSA9IDE1OTcyNDU0MDE7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWUgPSAxNDc0NDk3Nzk2OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9OYW1lID0gMjQ3NTA2NTk2OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfTmFtZSA9IDE2NTEyNTYwNTU7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWUgPSAyNTU1ODI4NDI7CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyKGhhbmRsZU9yUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNaXJyb3JTZXJ2aWNlUmVtb3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyLCBhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbyk7CiAgfQoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUpOwogIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgICBNaXJyb3JTZXJ2aWNlUmVtb3RlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0YXJ0CiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zKCk7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJQdHIucHJvdG90eXBlLnN0YXJ0RGF0YVN0cmVhbXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9IGZ1bmN0aW9uKGhhc0F1ZGlvLCBoYXNWaWRlbykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcygpOwogICAgcGFyYW1zLmhhc0F1ZGlvID0gaGFzQXVkaW87CiAgICBwYXJhbXMuaGFzVmlkZW8gPSBoYXNWaWRlbzsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJQdHIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdG9wCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHJlYXNvbikgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcygpOwogICAgcGFyYW1zLnJlYXNvbiA9IHJlYXNvbjsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUuc2VuZE1lc3NhZ2VUb1NpbmsgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zZW5kTWVzc2FnZVRvU2luawogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnNlbmRNZXNzYWdlVG9TaW5rID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMoKTsKICAgIHBhcmFtcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUuZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydCAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydCgpOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLnN0YXJ0RGF0YVN0cmVhbXMgPSBmdW5jdGlvbihoYXNBdWRpbywgaGFzVmlkZW8pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydERhdGFTdHJlYW1zICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0RGF0YVN0cmVhbXMoaGFzQXVkaW8sIGhhc1ZpZGVvKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcCAmJiB0aGlzLmRlbGVnYXRlXy5zdG9wKHJlYXNvbik7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuc2VuZE1lc3NhZ2VUb1NpbmsgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2VuZE1lc3NhZ2VUb1NpbmsgJiYgdGhpcy5kZWxlZ2F0ZV8uc2VuZE1lc3NhZ2VUb1NpbmsobWVzc2FnZSk7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkgJiYgdGhpcy5kZWxlZ2F0ZV8uZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eSgpOwogIH0KCiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMpOwogICAgICB0aGlzLnN0b3AocGFyYW1zLnJlYXNvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zKTsKICAgICAgdGhpcy5zZW5kTWVzc2FnZVRvU2luayhwYXJhbXMubWVzc2FnZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMpOwogICAgICB0aGlzLnN0YXJ0RGF0YVN0cmVhbXMocGFyYW1zLmhhc0F1ZGlvLCBwYXJhbXMuaGFzVmlkZW8pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmF1ZGlvU3RyZWFtSWQgPSByZXNwb25zZS5hdWRpb1N0cmVhbUlkOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnZpZGVvU3RyZWFtSWQgPSByZXNwb25zZS52aWRlb1N0cmVhbUlkOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zKTsKICAgICAgdGhpcy5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5KCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMucmF0ZSA9IHJlc3BvbnNlLnJhdGU7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlc3BvbnNlKG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICB2YXIgTWlycm9yU2VydmljZVJlbW90ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWE6Om1vam9tOjpNaXJyb3JTZXJ2aWNlUmVtb3RlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHksCiAgICBzdHViQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGVyUmVzcG9uc2UsCiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXF1ZXN0OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXNwb25zZTsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfTmFtZSA9IDEwMDAzNDkxMTc7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfTmFtZSA9IDExNjc4MDcyNzY7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX05hbWUgPSAxNTE5MTA1NjM5OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfTmFtZSA9IDEyNjY2NzIzODU7CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZSwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUpOwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUub25TaW5rQXZhaWxhYmxlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU2lua0F2YWlsYWJsZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPSBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcygpOwogICAgcGFyYW1zLm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luawogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcygpOwogICAgcGFyYW1zLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUub25TdG9wcGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU3RvcHBlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vblN0b3BwZWQgPSBmdW5jdGlvbihyZWFzb24pIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5yZWFzb24gPSByZWFzb247CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uRXJyb3IKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUub25TaW5rQXZhaWxhYmxlID0gZnVuY3Rpb24obWV0YWRhdGEpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtBdmFpbGFibGUgJiYgdGhpcy5kZWxlZ2F0ZV8ub25TaW5rQXZhaWxhYmxlKG1ldGFkYXRhKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUub25NZXNzYWdlRnJvbVNpbmsgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25NZXNzYWdlRnJvbVNpbmsgJiYgdGhpcy5kZWxlZ2F0ZV8ub25NZXNzYWdlRnJvbVNpbmsobWVzc2FnZSk7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVN0dWIucHJvdG90eXBlLm9uU3RvcHBlZCA9IGZ1bmN0aW9uKHJlYXNvbikgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU3RvcHBlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblN0b3BwZWQocmVhc29uKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uRXJyb3IgJiYgdGhpcy5kZWxlZ2F0ZV8ub25FcnJvcigpOwogIH0KCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMpOwogICAgICB0aGlzLm9uU2lua0F2YWlsYWJsZShwYXJhbXMubWV0YWRhdGEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zKTsKICAgICAgdGhpcy5vbk1lc3NhZ2VGcm9tU2luayhwYXJhbXMubWVzc2FnZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25TdG9wcGVkKHBhcmFtcy5yZWFzb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcyk7CiAgICAgIHRoaXMub25FcnJvcigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5hY2NlcHRXaXRoUmVzcG9uZGVyID0KICAgICAgZnVuY3Rpb24obWVzc2FnZSwgcmVzcG9uZGVyKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH0KCiAgdmFyIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZSA9IHsKICAgIG5hbWU6ICdtZWRpYTo6bW9qb206Ok1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZScsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIsCiAgICBwcm94eUNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eSwKICAgIHN0dWJDbGFzczogTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXF1ZXN0LAogICAgdmFsaWRhdGVSZXNwb25zZTogbnVsbCwKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUmVxdWVzdDsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gbnVsbDsKICBleHBvcnRzLk1pcnJvclNlcnZpY2VSZW1vdGVyID0gTWlycm9yU2VydmljZVJlbW90ZXI7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ciA9IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyID0gTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0ciA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdtZWRpYS9tb2pvL2ludGVyZmFjZXMvcmVtb3RpbmdfY29tbW9uLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWEubW9qb20nKTsKCgogIHZhciBSZW1vdGluZ1N0b3BSZWFzb24gPSB7fTsKICBSZW1vdGluZ1N0b3BSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCA9IDA7CiAgUmVtb3RpbmdTdG9wUmVhc29uLkxPQ0FMX1BMQVlCQUNLID0gUmVtb3RpbmdTdG9wUmVhc29uLlJPVVRFX1RFUk1JTkFURUQgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5TT1VSQ0VfR09ORSA9IFJlbW90aW5nU3RvcFJlYXNvbi5MT0NBTF9QTEFZQkFDSyArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLk1FU1NBR0VfU0VORF9GQUlMRUQgPSBSZW1vdGluZ1N0b3BSZWFzb24uU09VUkNFX0dPTkUgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5EQVRBX1NFTkRfRkFJTEVEID0gUmVtb3RpbmdTdG9wUmVhc29uLk1FU1NBR0VfU0VORF9GQUlMRUQgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5VTkVYUEVDVEVEX0ZBSUxVUkUgPSBSZW1vdGluZ1N0b3BSZWFzb24uREFUQV9TRU5EX0ZBSUxFRCArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLlNFUlZJQ0VfR09ORSA9IFJlbW90aW5nU3RvcFJlYXNvbi5VTkVYUEVDVEVEX0ZBSUxVUkUgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5VU0VSX0RJU0FCTEVEID0gUmVtb3RpbmdTdG9wUmVhc29uLlNFUlZJQ0VfR09ORSArIDE7CgogIFJlbW90aW5nU3RvcFJlYXNvbi5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTdG9wUmVhc29uLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbiA9IHt9OwogIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLkNBTk5PVF9TVEFSVF9NVUxUSVBMRSA9IDA7CiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCA9IFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLkNBTk5PVF9TVEFSVF9NVUxUSVBMRSArIDE7CiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uU0VSVklDRV9OT1RfQ09OTkVDVEVEID0gUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCArIDE7CgogIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbi52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICB2YXIgUmVtb3RpbmdTaW5rRmVhdHVyZSA9IHt9OwogIFJlbW90aW5nU2lua0ZlYXR1cmUuUkVOREVSSU5HID0gMDsKICBSZW1vdGluZ1NpbmtGZWF0dXJlLkNPTlRFTlRfREVDUllQVElPTiA9IFJlbW90aW5nU2lua0ZlYXR1cmUuUkVOREVSSU5HICsgMTsKCiAgUmVtb3RpbmdTaW5rRmVhdHVyZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rRmVhdHVyZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICB2YXIgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5ID0ge307CiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCA9IDA7CiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0FBQyA9IFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5DT0RFQ19CQVNFTElORV9TRVQgKyAxOwogIFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5DT0RFQ19PUFVTID0gUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0FBQyArIDE7CgogIFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkgPSB7fTsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuU1VQUE9SVF80SyA9IDA7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5TVVBQT1JUXzRLICsgMTsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfSDI2NCA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19CQVNFTElORV9TRVQgKyAxOwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19WUDggPSBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfSDI2NCArIDE7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOSA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19WUDggKyAxOwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19IRVZDID0gUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOSArIDE7CgogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwoKICBmdW5jdGlvbiBSZW1vdGluZ1NpbmtNZXRhZGF0YSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIFJlbW90aW5nU2lua01ldGFkYXRhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZlYXR1cmVzID0gbnVsbDsKICAgIHRoaXMuYXVkaW9DYXBhYmlsaXRpZXMgPSBudWxsOwogICAgdGhpcy52aWRlb0NhcGFiaWxpdGllcyA9IG51bGw7CiAgICB0aGlzLmZyaWVuZGx5TmFtZSA9IG51bGw7CiAgfTsKICBSZW1vdGluZ1NpbmtNZXRhZGF0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFJlbW90aW5nU2lua01ldGFkYXRhLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQwfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUmVtb3RpbmdTaW5rTWV0YWRhdGEuZmVhdHVyZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtGZWF0dXJlKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUmVtb3RpbmdTaW5rTWV0YWRhdGEuYXVkaW9DYXBhYmlsaXRpZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS52aWRlb0NhcGFiaWxpdGllcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS5mcmllbmRseU5hbWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBSZW1vdGluZ1NpbmtNZXRhZGF0YS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzI7CgogIFJlbW90aW5nU2lua01ldGFkYXRhLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFJlbW90aW5nU2lua01ldGFkYXRhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5mZWF0dXJlcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0ZlYXR1cmUpKTsKICAgIHZhbC5hdWRpb0NhcGFiaWxpdGllcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eSkpOwogICAgdmFsLnZpZGVvQ2FwYWJpbGl0aWVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5KSk7CiAgICB2YWwuZnJpZW5kbHlOYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgUmVtb3RpbmdTaW5rTWV0YWRhdGEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihSZW1vdGluZ1NpbmtNZXRhZGF0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rRmVhdHVyZSksIHZhbC5mZWF0dXJlcyk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkpLCB2YWwuYXVkaW9DYXBhYmlsaXRpZXMpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5KSwgdmFsLnZpZGVvQ2FwYWJpbGl0aWVzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmZyaWVuZGx5TmFtZSk7CiAgfTsKICBleHBvcnRzLlJlbW90aW5nU3RvcFJlYXNvbiA9IFJlbW90aW5nU3RvcFJlYXNvbjsKICBleHBvcnRzLlJlbW90aW5nU3RhcnRGYWlsUmVhc29u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