xiaomianao666

插件名:global_【Pro版】B站哔哩哔哩使用增强,全网VIP视频免费破解去广告,知乎使用增强,短视频无水印下载,油管、Facebook等国外视频解析下载等😈

May 23rd, 2024
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_【Pro版】B站哔哩哔哩使用增强,全网VIP视频免费破解去广告,知乎使用增强,短视频无水印下载,油管、Facebook等国外视频解析下载等😈@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOOAkFByb+eJiOOAkULnq5nlk5Tlk6nlk5Tlk6nkvb/nlKjlop7lvLrvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvIznn6XkuY7kvb/nlKjlop7lvLrvvIznn63op4bpopHml6DmsLTljbDkuIvovb3vvIzmsrnnrqHjgIFGYWNlYm9va+etieWbveWkluinhumikeino+aekOS4i+i9veetifCfmIgKLy8gQG5hbWU6emggICAgICAgICAgIOOAkFByb+eJiOOAkULnq5nlk5Tlk6nlk5Tlk6nkvb/nlKjlop7lvLrvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvIznn6XkuY7kvb/nlKjlop7lvLrvvIznn63op4bpopHml6DmsLTljbDkuIvovb3vvIzmsrnnrqHjgIFGYWNlYm9va+etieWbveWkluinhumikeino+aekOS4i+i9veetifCfmIgKLy8gQG5hbWU6emgtVFcJCSAg44CQUHJv54mI44CRQuermeWXtuWTqeWXtuWTqeS9v+eUqOWinuW8t++8jOWFqOe2slZJUOimlumgu+WFjeiyu+egtOino+WOu+W7o+WRiu+8jOefpeS5juS9v+eUqOWinuW8t++8jOefreimlumgu+eEoeawtOWNsOS4i+i8ie+8jOayueeuoeOAgUZhY2Vib29r562J5ZyL5aSW6KaW6aC76Kej5p6Q5LiL6LyJ562J8J+YiAovLyBAbmFtZXNwYWNlICAgICAgICAgYmlsaWJpbGlfbmFtZXNwYWNlXzIwMjMwNjI1Ci8vIEB2ZXJzaW9uICAgICAgICAgICAyLjAuMTEKLy8gQGRlc2NyaXB0aW9uICAgICAgIOWKn+iDveWPr+mAieaLqeaAp+aJk+W8gO+8mjHjgIFC56uZ5L2/55So5aKe5by677ya5pSv5oyB6KeG6aKR5LiL6L29KPCfkYnmlK/mjIHlpJpQ5om56YeP5b+r6YCf5LiL6L298J+RiCnjgIHmtY/op4jorrDlvZXmj5DnpLrjgIHkuIDplK7kuInov57jgIHoh6rliqjnrb7liLDjgIHmj4/ov7DmlofmnKznvZHlnYDovazpk77mjqXnrYnvvJsy44CB5YWo572RVklQ6KeG6aKR6Kej5p6Q77ya54ix5aWH6Im644CB6IW+6K6v44CB5LyY6YW344CBYmlsaWJpbGnnrYnop4bpopHlhY3otLnop6PmnpAo5pSv5oyB6Ieq5a6a5LmJ6Kej5p6Q5o6l5Y+jKe+8mzPjgIHnn6XkuY7kvb/nlKjliqnmiYvvvJrlhoXlrrnnp43nsbvmoIfor4bjgIHpl67nrZTmmL7npLrkvJjljJbjgIHop4bpopHkuIvovb3nrYnvvJs044CB55+t6KeG6aKR5Y675rC05Y2w5LiL6L2977ya5pSv5oyB55+l5LmO44CB5oqW6Z+z44CB5b+r5omL562J77ybNeOAgeayueeuoeOAgUZhY2Vib29r562J5Zu95aSW6KeG6aKR6Kej5p6Q5LiL6L2977yb8J+UpTbjgIHmkJzntKLlvJXmk47lip/og73lop7lvLos55m+5bqm5re75Yqg572R5Z2A5pi+56S677yMZ29vZ2xl57uT5p6c5paw5qCH562+6aG15omT5byA54GvLOWvvOiIquWPr+iHquWumuS5iee9keWdgOOAkOiEmuacrOmVv+acn+e7tOaKpOabtOaWsO+8jOWujOWFqOWFjei0ue+8jOaXoOW5v+WRiu+8jOS7hemZkOWtpuS5oOS6pOa1ge+8ge+8geOAkQovLyBAZGVzY3JpcHRpb246emggICAg5Yqf6IO95Y+v6YCJ5oup5oCn5omT5byA77yaMeOAgULnq5nkvb/nlKjlop7lvLrvvJrmlK/mjIHop4bpopHkuIvovb0o8J+RieaUr+aMgeWkmlDmibnph4/lv6vpgJ/kuIvovb3wn5GIKeOAgea1j+iniOiusOW9leaPkOekuuOAgeS4gOmUruS4iei/nuOAgeiHquWKqOetvuWIsOOAgeaPj+i/sOaWh+acrOe9keWdgOi9rOmTvuaOpeetie+8mzLjgIHlhajnvZFWSVDop4bpopHop6PmnpDvvJrniLHlpYfoibrjgIHohb7orq/jgIHkvJjphbfjgIFiaWxpYmlsaeetieinhumikeWFjei0ueino+aekCjmlK/mjIHoh6rlrprkuYnop6PmnpDmjqXlj6Mp77ybM+OAgeefpeS5juS9v+eUqOWKqeaJi++8muWGheWuueenjeexu+agh+ivhuOAgemXruetlOaYvuekuuS8mOWMluOAgeinhumikeS4i+i9veetie+8mzTjgIHnn63op4bpopHljrvmsLTljbDkuIvovb3vvJrmlK/mjIHnn6XkuY7jgIHmipbpn7PjgIHlv6vmiYvnrYnvvJs144CB5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3vvJvwn5SlNuOAgeaQnOe0ouW8leaTjuWKn+iDveWinuW8uiznmb7luqbmt7vliqDnvZHlnYDmmL7npLrvvIxnb29nbGXnu5PmnpzmlrDmoIfnrb7pobXmiZPlvIDnga8s5a+86Iiq5Y+v6Ieq5a6a5LmJ572R5Z2A44CQ6ISa5pys6ZW/5pyf57u05oqk5pu05paw77yM5a6M5YWo5YWN6LS577yM5peg5bm/5ZGK77yM5LuF6ZmQ5a2m5Lmg5Lqk5rWB77yB77yB44CRCi8vIEBkZXNjcmlwdGlvbjp6aC1UVyDlip/og73lj6/pgbjmk4fmgKfplovllZ/vvJox44CBQuermeS9v+eUqOWinuW8t++8muaUr+aPtOimlumgu+S4i+i8iSjwn5GJ5pSv5o+05aSaUOaJuemHj+W/q+mAn+S4i+i8ifCfkYgp44CB54CP6Ka96KiY6YyE5o+Q56S644CB5LiA6Y215LiJ6YCj44CB6Ieq5YuV57C95Yiw44CB5o+P6L+w5paH5pys57ay5Z2A6L2J6YCj57WQ562J77ybMuOAgeWFqOe2slZJUOimlumgu+ino+aekO+8muaEm+Wlh+iXneOAgemosOioiuOAgeWEqumFt+OAgWJpbGliaWxp562J6KaW6aC75YWN6LK76Kej5p6QKOaUr+aPtOiHquWumue+qeino+aekOS7i+mdoinvvJsz44CB55+l5LmO5L2/55So5Yqp5omL77ya5YWn5a6556iu6aGe5qiZ6K2Y44CB5ZWP562U6aGv56S65YSq5YyW44CB6KaW6aC75LiL6LyJ562J77ybNOOAgeefreimlumgu+WOu+awtOWNsOS4i+i8ie+8muaUr+aPtOefpeS5juOAgeaKlumfs+OAgeW/q+aJi+etie+8mzXjgIHmsrnnrqHjgIFGYWNlYm9va+etieWci+Wkluimlumgu+ino+aekOS4i+i8ie+8m/CflKU244CB5pCc57Si5byV5pOO5Yqf6IO95aKe5by3LOeZvuW6pua3u+WKoOe2suWdgOmhr+ekuu+8jGdvb2dsZee1kOaenOaWsOaomeexpOmggemWi+WVn+eHiCzlsI7oiKrlj6/oh6rlrprnvqnntrLlnYDjgJDmjIfku6TnorzmiJbnm7Tora/lvI/nqIvlvI/plbfmnJ/ntq3orbfmm7TmlrDvvIzlrozlhajlhY3osrvvvIznhKHlu6PlkYrvvIzlg4XpmZDlrbjnv5LkuqTmtYHvvIHvvIHjgJEKLy8gQGF1dGhvciAgICAgICAgICAgIGh1YWh1YWNhdAovLyBAaWNvbiAgICAgICAgICAgICAgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQ1MwbEVRVlJZUjhXWHoyb1RVUlRHdjNNbnBxaE5LeTFVV214UlRHZGFpTFNRUktrS0lvSzRGVnJSUG9IdTdCTVluMEIzK2dRcXV1aXVpQzZrYUZWc0FoR0Vaa0txRy8rVnJ0cDBZV3N5UjI3S2xFd3oweG5uVDNMZ3dqQjM3dmwrOTd0eno5d2hkRGlvdy9wd0JDam9mTjBBSm9od0tRZ2tNeFlGOERtdDBieGRuaGFBUW9XVFhNY3pFTkpCaEZ2R01ncWs0R1k2U1pYbVBndkFteS9jbllpakdxcnd2bVRWSFNRdXAyakx2RzBCeUpmNUVZRGJVUUlBZUp4UjZVNExRSEdWMVZvZGVzVGlqZlF4QmRya2FTckw2ejBIbHN0OGk0QW43UUJnWURhcjBsTXJnTTQ1SXR4ckN3RGpmbGFqbkMrQXRSOEd2bjh6R3B6OXh3Vk9qb3IvWm1hL0FOdC9HSXNMTld4dDhwN280SWlBbWxMUVArQzlwdmtHK0ZveVVQeFlzNTJ4aEZEUEtJaDN1UnZpRzJDbFdJZHNUcEhvSll5bUZOZGxpUXpBQkJzYUVaZzRwK0R3VWZ0bGlSeEFnZ3dPQzB4ZGlkbWExUmFBSTkyRWE5T0hPZ2N3UHFsQU5ydUkxQUVsaHNhMmRCS1hRSkVCbkRnbEdsdnhXTi9CTmNFM2dLeUNTNjliNjRBVWxNSVN3RXY0QnBESjM3NzhpL1hmdTVYUXRGdGFMcSs5UmlDQTZnWmovZGN1UU44QXVkb2Q2a3ZvZFladXo5azdVT0s3SlBEQWJYQVkvV3hnTGp0R0R5MmY0MDhWUGk4TUxJVWg0SmJERUxod05rbnZMUUR5UU5vVGg4N0FrRnVDSVAwRS9OemNnV1llVEMwYmRya05wNkxtOWJjNFlNNHFyL056RUdhQ3pOSnhMT05GUnFNYnpmMjJKU3Uvd2xjcGhod3pwc0lBSWNJSHJpR1hHYWRYKy9NZFdEUGZsVGpSeGNIK2tMWUpoWXRqNVBpejQvMGdGNFlWTmprNkR2QVBEYjBhTUVyOC9uRUFBQUFBU1VWT1JLNUNZSUk9Ci8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi55b3VrdS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5pcWl5aS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5pcWl5aS5jb20vd18qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5pcWl5aS5jb20vYV8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5pcWl5aS5jb20vcmVzb3VyY2UvcGN3L3BsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoubGUuY29tL3B0di92cGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdi5xcS5jb20veC9jb3Zlci8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdi5xcS5jb20veC9wYWdlLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly92LnFxLmNvbS90di8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi50dWRvdS5jb20vbGlzdHBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoudHVkb3UuY29tL2FsYnVtcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi50dWRvdS5jb20vcHJvZ3JhbXMvdmlldy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5tZ3R2LmNvbS9iLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly90di5zb2h1LmNvbS92LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmJhb2ZlbmcuY29tL3BsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3ZpcC5wcHR2LmNvbS9zaG93LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly92LnBwdHYuY29tL3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cud2FzdS5jbi9QbGF5L3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouMTkwNS5jb20vdmlkZW8vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouMTkwNS5jb20vcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi4xOTA1LmNvbS8qL3BsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5taWd1dmlkZW8uY29tL21ncy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS52LnFxLmNvbS94L2NvdmVyLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnYucXEuY29tL3gvcGFnZS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS52LnFxLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5pcWl5aS5jb20vdl8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5pcWl5aS5jb20vd18qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5pcWl5aS5jb20vYV8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS55b3VrdS5jb20vYWxpcGF5X3ZpZGVvLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnlvdWt1LmNvbS92aWRlby9pZF8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5tZ3R2LmNvbS9iLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnR2LnNvaHUuY29tL3YvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20uZmlsbS5zb2h1LmNvbS9hbGJ1bS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnBwdHYuY29tL3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20uYWNmdW4uY24vdi8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS53YXN1LmNuL1BsYXkvc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LmJhaWR1LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnNvLmNvbS9zKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5zb2dvdS5jb20vd2ViKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5zb2dvdS5jb20vc29nb3UqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vY24uYmluZy5jb20vc2VhcmNoKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5iaW5nLmNvbS9zZWFyY2gqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3NC5iaW5nLmNvbS9zZWFyY2gqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vc28udG91dGlhby5jb20vc2VhcmNoKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5nb29nbGUuY29tL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuZ29vZ2xlLmNvbS5oay9zZWFyY2gqCi8vIEBpbmNsdWRlCSAgIAkgICAgICAqOi8vd3d3LmJpbGliaWxpLmNvbS8qKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3NlYXJjaC5iaWxpYmlsaS5jb20vKioKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9zcGFjZS5iaWxpYmlsaS5jb20vKioKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuYmlsaWJpbGkuY29tL3JlYWQvKioKLy8gQGluY2x1ZGUgICAgICAJICAqOi8vKi56aGlodS5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5kb3V5aW4uY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cua3VhaXNob3UuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cueW91dHViZS5jb20KLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cueW91dHViZS5jb20vCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy5mYWNlYm9vay5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3l0MXMuY29tL2ZhY2Vib29rLWRvd25sb2FkZXIKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnRhb2Jhby5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoudG1hbGwuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3BhZ2VzLnRtYWxsLmNvbS93b3cvYW4vY3Mvc2VhcmNoKioKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnRtYWxsLmhrLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmxpYW5neGlueWFvLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5qZC5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouamQuaGsvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyoueWl5YW9qZC5jb20vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL2NhdGVnb3J5LnZpcC5jb20vc3VnZ2VzdC5waHAqKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL2RldGFpbC52aXAuY29tL2RldGFpbC0qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnZpcGdsb2JhbC5oay9kZXRhaWwtKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL2xpc3QudmlwLmNvbS8qLmh0bWwKLy8gQGV4Y2x1ZGUgICAgICAgICAgICo6Ly9sb2dpbi50YW9iYW8uY29tLyoKLy8gQGV4Y2x1ZGUgICAgICAgICAgICo6Ly91bGFuZC50YW9iYW8uY29tLyoKLy8gQGV4Y2x1ZGUgICAgICAgICAgICo6Ly93d3cudGFvYmFvLmNvbS8qCi8vIEBleGNsdWRlICAgICAgICAgICAqOi8vbWFwLnRhb2Jhby5jb20vKgovLyBAZXhjbHVkZSAgICAgICAgICAgKjovL2ppbmdmZW4uamQuY29tLyoKLy8gQGV4Y2x1ZGUgICAgICAgICAgICo6Ly9wYWdlcy50bWFsbC5jb20vKgovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9sZjI2LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9qcXVlcnkvMy4yLjEvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9sZjktY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL2pxdWVyeS5xcmNvZGUvMS4wL2pxdWVyeS5xcmNvZGUubWluLmpzCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDU0MjM2LWZpbmRhbmRyZXBsYWNlZG9tdGV4dC1odWFodWFjYXQvY29kZS9maW5kQW5kUmVwbGFjZURPTVRleHQtaHVhaHVhY2F0LmpzP3ZlcnNpb249MTExMjk5MAovLyBAY29ubmVjdCAgICAgICAgICAgYXBpLmJpbGliaWxpLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYXBpLmxpdmUuYmlsaWJpbGkuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBnaXRsYWIuY29tCi8vIEBjb25uZWN0CQkJICB0dC5zaHVxaWFuZGlxaXUuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBqLmppYXlvdXNoaWNoYW5nLmNvbQovLyBAZ3JhbnQgICAgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNLm9wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNLmdldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR00uc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2Rvd25sb2FkCi8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR00ueG1sSHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGxpY2Vuc2UgICAgICAgICAgIEFHUEwgTGljZW5zZQovLyBAY2hhcnNldAkJICAgICAgVVRGLTgKLy8gQHJ1bi1hdCAgICAgICAgICAgIGRvY3VtZW50LWlkbGUKLy8gQHVwZGF0ZVVSTCAgICAgICAgIGh0dHBzOi8vZ2l0bGFiLmNvbS9zY3JpcHQzNDczMzAzL3NjcmlwdF9wcm8vLS9yYXcvbWFpbi9wcm8udXNlci5qcwovLyBAZG93bmxvYWRVUkwgICAgICAgaHR0cHM6Ly9naXRsYWIuY29tL3NjcmlwdDM0NzMzMDMvc2NyaXB0X3Byby8tL3Jhdy9tYWluL3Byby51c2VyLmpzCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKCSd1c2Ugc3RyaWN0JzsKCS8qKgogKiDohJrmnKzpgbXlvqpBR1BMIExpY2Vuc2XlvIDmupDljY/orq7vvJvlnKjljY/orq7lhYHorrjnmoTojIPlm7TnsbvvvIzlj6/ku6Xoh6rnlLHkv67mlLkKICog5byA5a6M5LiH5bKB77yB77yBCiAqLwoJLy/lhbHmnInmlrnms5XvvIzlhajlsYDlhbHkuqsKZnVuY3Rpb24gQ29tbW9uRnVuY3Rpb24oKXsKCXRoaXMuR01nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZT1udWxsKSB7CgkJbGV0IHN0b3JhZ2VWYWx1ZSA9IHZhbHVlOwoJCWlmICh0eXBlb2YgR01fZ2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKCQkJc3RvcmFnZVZhbHVlID0gR01fZ2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCX0gZWxzZSBpZih0eXBlb2YgR00uc2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpewoJCQlzdG9yYWdlVmFsdWUgPSBHTS5nZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJfWVsc2V7CgkJCXZhciBhcnIgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7CgkJCWlmKGFyciAhPSBudWxsKXsKCQkJCXN0b3JhZ2VWYWx1ZSA9IGFycgoJCQl9CgkJfQoJCXJldHVybiBzdG9yYWdlVmFsdWU7Cgl9OwoJdGhpcy5HTXNldFZhbHVlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpewoJCWlmICh0eXBlb2YgR01fc2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKCQkJR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCX0gZWxzZSBpZih0eXBlb2YgR00uc2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpewoJCQlHTS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJfWVsc2V7CgkJCXdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZSkKCQl9Cgl9OwoJdGhpcy5HTWFkZFN0eWxlID0gZnVuY3Rpb24oY3NzKXsKCQl2YXIgbXlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJbXlTdHlsZS50ZXh0Q29udGVudCA9IGNzczsKCQl2YXIgZG9jID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkJZG9jLmFwcGVuZENoaWxkKG15U3R5bGUpOwoJfTsKCXRoaXMuR01vcGVuSW5UYWIgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnM9eyJhY3RpdmUiOnRydWUsICJpbnNlcnQiOnRydWUsICJzZXRQYXJlbnQiOnRydWV9KXsKCQlpZiAodHlwZW9mIEdNX29wZW5JblRhYiA9PT0gImZ1bmN0aW9uIikgewoJCQlHTV9vcGVuSW5UYWIodXJsLCBvcHRpb25zKTsKCQl9IGVsc2UgewoJCQlHTS5vcGVuSW5UYWIodXJsLCBvcHRpb25zKTsKCQl9Cgl9OwoJdGhpcy5hZGRTY3JpcHQgPSBmdW5jdGlvbih1cmwpewoJCXZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CgkJcy5zZXRBdHRyaWJ1dGUoJ3NyYycsdXJsKTsKCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpOwoJfTsKCXRoaXMucmFuZG9tTnVtYmVyID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKTsKCX07Cgl0aGlzLnJlcXVlc3QgPSBmdW5jdGlvbihtb3RoZWQsIHVybCwgcGFyYW0peyAgIC8v572R57uc6K+35rGCCgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CgkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCXVybDogdXJsLAoJCQkJbWV0aG9kOiBtb3RoZWQsCgkJCQlkYXRhOnBhcmFtLAoJCQkJb25sb2FkOiBmdW5jdGlvbihyZXNwb25zZSkgewoJCQkJCXZhciBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CgkJCQkJdmFyIHBsYXl1cmwgPSAiIjsKCQkJCQlpZihzdGF0dXM9PTIwMHx8c3RhdHVzPT0nMjAwJyl7CgkJCQkJCXZhciByZXNwb25zZVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7CgkJCQkJCXJlc29sdmUoeyJyZXN1bHQiOiJzdWNjZXNzIiwgImRhdGEiOnJlc3BvbnNlVGV4dH0pOwoJCQkJCX1lbHNlewoJCQkJCQlyZWplY3QoeyJyZXN1bHQiOiJlcnJvciIsICJkYXRhIjpudWxsfSk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9KQoJfTsKCXRoaXMuYWRkQ29tbW9uSHRtbENzcyA9IGZ1bmN0aW9uKCl7CgkJdmFyIGNzc1RleHQgPSAKCQkJYAoJCQlAa2V5ZnJhbWVzIGZhZGVJbiB7CgkJCQkwJSAgICB7b3BhY2l0eTogMH0KCQkJCTEwMCUgIHtvcGFjaXR5OiAxfQoJCQl9CgkJCUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW4gewoJCQkJMCUgICAge29wYWNpdHk6IDB9CgkJCQkxMDAlICB7b3BhY2l0eTogMX0KCQkJfQoJCQlALW1vei1rZXlmcmFtZXMgZmFkZUluIHsKCQkJCTAlICAgIHtvcGFjaXR5OiAwfQoJCQkJMTAwJSAge29wYWNpdHk6IDF9CgkJCX0KCQkJQC1vLWtleWZyYW1lcyBmYWRlSW4gewoJCQkJMCUgICAge29wYWNpdHk6IDB9CgkJCQkxMDAlICB7b3BhY2l0eTogMX0KCQkJfQoJCQlALW1zLWtleWZyYW1lcyBmYWRlSW4gewoJCQkJMCUgICAge29wYWNpdHk6IDB9CgkJCQkxMDAlICB7b3BhY2l0eTogMX0KCQkJfQoJCQlAa2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJMCUgICAge29wYWNpdHk6IDF9CgkJCQkxMDAlICB7b3BhY2l0eTogMH0KCQkJfQoJCQlALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkwJSAgICB7b3BhY2l0eTogMX0KCQkJCTEwMCUgIHtvcGFjaXR5OiAwfQoJCQl9CgkJCUAtbW96LWtleWZyYW1lcyBmYWRlT3V0IHsKCQkJCTAlICAgIHtvcGFjaXR5OiAxfQoJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCX0KCQkJQC1vLWtleWZyYW1lcyBmYWRlT3V0IHsKCQkJCTAlICAgIHtvcGFjaXR5OiAxfQoJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCX0KCQkJQC1tcy1rZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkwJSAgICB7b3BhY2l0eTogMX0KCQkJCTEwMCUgIHtvcGFjaXR5OiAwfQoJCQl9CgkJCS53ZWItdG9hc3Qta2tsaTl7CgkJCQlwb3NpdGlvbjogZml4ZWQ7CgkJCQliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNyk7CgkJCQljb2xvcjogI2ZmZjsKCQkJCWZvbnQtc2l6ZTogMTRweDsKCQkJCWxpbmUtaGVpZ2h0OiAxOwoJCQkJcGFkZGluZzoxMHB4OwoJCQkJYm9yZGVyLXJhZGl1czogM3B4OwoJCQkJbGVmdDogNTAlOwoJCQkJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwoJCQkJLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQktbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCS1vLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCS1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQl6LWluZGV4OiA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk7CgkJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl9CgkJCS5mYWRlT3V0ewoJCQkJYW5pbWF0aW9uOiBmYWRlT3V0IC41czsKCQkJfQoJCQkuZmFkZUluewoJCQkJYW5pbWF0aW9uOmZhZGVJbiAuNXM7CgkJCX0KCQkJYDsKCQl0aGlzLkdNYWRkU3R5bGUoY3NzVGV4dCk7Cgl9OwoJdGhpcy53ZWJUb2FzdCA9IGZ1bmN0aW9uKHBhcmFtcykgewkvL+Wwj+aPkOekuuahhgoJCXZhciB0aW1lID0gcGFyYW1zLnRpbWU7CgkJdmFyIGJhY2tncm91bmQgPSBwYXJhbXMuYmFja2dyb3VuZDsKCQl2YXIgY29sb3IgPSBwYXJhbXMuY29sb3I7CgkJdmFyIHBvc2l0aW9uID0gcGFyYW1zLnBvc2l0aW9uOyAgLy9jZW50ZXItdG9wLCBjZW50ZXItYm90dG9tCgkJdmFyIGRlZmF1bHRNYXJnaW5WYWx1ZSA9IDUwOwoJCQoJCWlmKHRpbWUgPT0gdW5kZWZpbmVkIHx8IHRpbWUgPT0gJycpewoJCQl0aW1lID0gMTUwMDsKCQl9CgkJCgkJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJZWwuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJ3ZWItdG9hc3Qta2tsaTkiKTsKCQllbC5pbm5lckhUTUwgPSBwYXJhbXMubWVzc2FnZTsKCQkvL+iDjOaZr+minOiJsgoJCWlmKGJhY2tncm91bmQhPXVuZGVmaW5lZCAmJiBiYWNrZ3JvdW5kIT0nJyl7CgkJCWVsLnN0eWxlLmJhY2tncm91bmRDb2xvcj1iYWNrZ3JvdW5kOwoJCX0KCQkvL+Wtl+S9k+minOiJsgoJCWlmKGNvbG9yIT11bmRlZmluZWQgJiYgY29sb3IhPScnKXsKCQkJZWwuc3R5bGUuY29sb3I9Y29sb3I7CgkJfQoJCQoJCS8v5pi+56S65L2N572uCgkJaWYocG9zaXRpb249PXVuZGVmaW5lZCB8fCBwb3NpdGlvbj09JycpewoJCQlwb3NpdGlvbiA9ICJjZW50ZXItYm90dG9tIjsKCQl9CgkJCgkJLy/orr7nva7mmL7npLrkvY3nva7vvIzlvZPliY3mnInnp43kuKTnp43lvaLlvI8KCQlpZihwb3NpdGlvbj09PSJjZW50ZXItYm90dG9tIil7CgkJCWVsLnN0eWxlLmJvdHRvbSA9IGRlZmF1bHRNYXJnaW5WYWx1ZSsicHgiOyAKCQl9ZWxzZXsKCQkJZWwuc3R5bGUudG9wID0gZGVmYXVsdE1hcmdpblZhbHVlKyJweCI7IAoJCX0KCQllbC5zdHlsZS56SW5kZXg9OTk5OTk5OwoJCQoJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpOwoJCWVsLmNsYXNzTGlzdC5hZGQoImZhZGVJbiIpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQllbC5jbGFzc0xpc3QucmVtb3ZlKCJmYWRlSW4iKTsKCQkJZWwuY2xhc3NMaXN0LmFkZCgiZmFkZU91dCIpOwoJCQkvKuebkeWQrOWKqOeUu+e7k+adn++8jOenu+mZpOaPkOekuuS/oeaBr+WFg+e0oCovCgkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsIGZ1bmN0aW9uICgpIHsKCQkJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpOwoJCQl9KTsKCQkJZWwuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0QW5pbWF0aW9uRW5kIiwgZnVuY3Rpb24gKCkgewoJCQkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7CgkJCX0pOwoJCX0sIHRpbWUpOwoJfTsKCXRoaXMuZmlsdGVyU3RyID0gZnVuY3Rpb24oc3RyKXsKCQlpZighc3RyKSByZXR1cm4gIiI7CgkJc3RyID0gc3RyLnJlcGxhY2UoL1x0L2csIiIpOwoJCXN0ciA9IHN0ci5yZXBsYWNlKC9cci9nLCIiKTsKCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikKCX07Cgl0aGlzLmdldFBhcmFtdGVyUXVlcnlVcmwgPSBmdW5jdGlvbih0ZXh0LCB0YWcpIHsgLy/mn6Xor6JHRVTor7fmsYJ1cmzkuK3nmoTlj4LmlbAKCQlpZih0ZXh0LmluZGV4T2YoIj8iKSE9LTEpeyAvL+mAieWPlj/lkI7pnaLnmoTlrZfnrKbkuLIs5YW85a65d2luZG93LmxvY2F0aW9uLnNlYXJjaO+8jOWJjemdoueahD/kuI3og73ljrvmjokKCQkJdmFyIHRleHRBcnJheSA9IHRleHQuc3BsaXQoIj8iKTsKCQkJdGV4dCA9ICI/Iit0ZXh0QXJyYXlbdGV4dEFycmF5Lmxlbmd0aC0xXTsKCQl9CgkJdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyB0YWcgKyAiPShbXiZdKikoJnwkKSIpOwoJCXZhciBhID0gdGV4dC5zdWJzdHIoMSkubWF0Y2godCk7CgkJaWYgKGEgIT0gbnVsbCl7CgkJCXJldHVybiBhWzJdOwoJCX0KCQlyZXR1cm4gIiI7Cgl9OwoJdGhpcy5nZXRFbmRIdG1sSWRCeVVybCA9IGZ1bmN0aW9uKHVybCkgeyAvL+iOt+W+l+S7pWh0bWznu5PmnZ/nmoRJRAoJCWlmKHVybC5pbmRleE9mKCI/IikhPS0xKXsKCQkJdXJsID0gdXJsLnNwbGl0KCI/IilbMF0KCQl9CgkJaWYodXJsLmluZGV4T2YoIiMiKSE9LTEpewoJCQl1cmwgPSB1cmwuc3BsaXQoIiMiKVswXQoJCX0KCQl2YXIgc3BsaXRUZXh0ID0gdXJsLnNwbGl0KCIvIik7CgkJdmFyIGlkVGV4dCA9IHNwbGl0VGV4dFtzcGxpdFRleHQubGVuZ3RoLTFdOwoJCWlkVGV4dCA9IGlkVGV4dC5yZXBsYWNlKCIuaHRtbCIsIiIpOwoJCXJldHVybiBpZFRleHQ7Cgl9OwoJdGhpcy5nZXRFY29tbWVyY2VQbGF0Zm9ybT1mdW5jdGlvbih1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZil7CgkJbGV0IHBsYXRmb3JtID0gIiI7CgkJaWYodXJsLmluZGV4T2YoImRldGFpbC50bWFsbCIpIT0tMSB8fCB1cmwuaW5kZXhPZigidG1hbGwuaGsiKSE9LTEgfHwgdXJsLmluZGV4T2YoInBhZ2VzLnRtYWxsLmNvbSIpIT0tMSl7CgkJCXBsYXRmb3JtID0gInRtYWxsIjsKCQl9ZWxzZSBpZih1cmwuaW5kZXhPZigidGFvYmFvLmNvbSIpIT0tMSB8fCB1cmwuaW5kZXhPZigibWFpeWFvLmxpYW5neGlueWFvLmNvbSIpIT0tMSl7CgkJCXBsYXRmb3JtID0gInRhb2JhbyI7CgkJfWVsc2UgaWYodXJsLmluZGV4T2YoImpkLmNvbSIpIT0tMSB8fCB1cmwuaW5kZXhPZigibnBjaXRlbS5qZC5oayIpIT0tMSB8fCB1cmwuaW5kZXhPZigieWl5YW9qZC5jb20iKSE9LTEpewoJCQlwbGF0Zm9ybSA9ICJqZCI7CgkJfWVsc2UgaWYodXJsLmluZGV4T2YoImRldGFpbC52aXAuY29tIikhPS0xIHx8IHVybC5pbmRleE9mKCJ3d3cudmlwZ2xvYmFsLmhrIikhPS0xKXsKCQkJcGxhdGZvcm0gPSAidnBpbmh1aSI7CgkJfQoJCXJldHVybiBwbGF0Zm9ybTsKCX0KCXRoaXMuaXNQQyA9IGZ1bmN0aW9uKCl7CgkJdmFyIHVzZXJBZ2VudEluZm8gPSBuYXZpZ2F0b3IudXNlckFnZW50OwoJCXZhciBBZ2VudHMgPSBbIkFuZHJvaWQiLCAiaVBob25lIiwiU3ltYmlhbk9TIiwgIldpbmRvd3MgUGhvbmUiLCAiaVBhZCIsICJpUG9kIl07CgkJdmFyIGZsYWcgPSB0cnVlOwoJCWZvciAodmFyIHYgPSAwOyB2IDwgQWdlbnRzLmxlbmd0aDsgdisrKSB7CgkJCWlmICh1c2VyQWdlbnRJbmZvLmluZGV4T2YoQWdlbnRzW3ZdKSA+IDApIHsKCQkJCWZsYWcgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiBmbGFnOwoJfTsKCXRoaXMuZ2V0QmlsaWJpbGlCVj1mdW5jdGlvbigpewoJCXZhciBwYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKCQl2YXIgYnYgPSBwYXRobmFtZS5yZXBsYWNlKCIvdmlkZW8vIiwiIikucmVwbGFjZSgiLyIsIiIpOwoJCXJldHVybiBidjsKCX07Cgl0aGlzLmdldFN5c3RlbU9TPWZ1bmN0aW9uKCl7CgkJdmFyIHUgPSBuYXZpZ2F0b3IudXNlckFnZW50OwoJCWlmICghIXUubWF0Y2goL2NvbXBhdGlibGUvaSkgfHwgdS5tYXRjaCgvV2luZG93cy9pKSkgewoJCQlyZXR1cm4gJ3dpbmRvd3MnOwoJCX0gZWxzZSBpZiAoISF1Lm1hdGNoKC9NYWNpbnRvc2gvaSkgfHwgdS5tYXRjaCgvTWFjSW50ZWwvaSkpIHsKCQkJcmV0dXJuICdtYWNPUyc7CgkJfSBlbHNlIGlmICghIXUubWF0Y2goL2lwaG9uZS9pKSB8fCB1Lm1hdGNoKC9JcGFkL2kpKSB7CgkJCXJldHVybiAnaW9zJzsKCQl9IGVsc2UgaWYgKCEhdS5tYXRjaCgvYW5kcm9pZC9pKSkgewoJCQlyZXR1cm4gJ2FuZHJvaWQnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnb3RoZXInOwoJCX0KCX07Cgl0aGlzLlJQQ0Rvd25sb2FkRmlsZSA9IGZ1bmN0aW9uKGZpbGVOYW1lLCB1cmwsIHNhdmVQYXRoPSJEOi8iLCBSUENVUkw9IndzOi8vbG9jYWxob3N0OjE2ODAwL2pzb25ycGMiLCBSUENUb2tlbj0iIikgewkJCgkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJaWYoIXNhdmVQYXRoKXsKCQkJc2F2ZVBhdGggPSAiRDovIjsKCQl9CgkJaWYoIVJQQ1VSTCl7CgkJCVJQQ1VSTCA9ICJ3czovL2xvY2FsaG9zdDoxNjgwMC9qc29ucnBjIjsKCQl9CgkJbGV0IG9wdGlvbnMgPSB7IC8v5LiL6L296YWN572u5paH5Lu2CgkJCSJkaXIiOnNhdmVQYXRoLAoJCQkibWF4LWNvbm5lY3Rpb24tcGVyLXNlcnZlciI6ICIxNiIsCgkJCSJoZWFkZXIiOlsiVXNlci1BZ2VudDoiK25hdmlnYXRvci51c2VyQWdlbnQrIiIsICJDb29raWU6Iitkb2N1bWVudC5jb29raWUrIiIsICJSZWZlcmVyOiIrd2luZG93LmxvY2F0aW9uLmhyZWYrIiJdCgkJfQoJCWlmKCEhZmlsZU5hbWUpIHsKCQkJb3B0aW9ucy5vdXQgPSBmaWxlTmFtZTsKCQl9CgkJbGV0IGpzb25SUEMgPSB7CgkJCSJqc29ucnBjIjogIjIuMCIsCgkJCSJpZCI6ICJodWFodWFjYXQiLAoJCQkibWV0aG9kIjogImFyaWEyLmFkZFVyaSIsCgkJCSJwYXJhbXMiOiBbW3VybF0sIG9wdGlvbnNdLAoJCX0KCQlpZiAoISFSUENUb2tlbikgewoJCQlqc29uUlBDLnBhcmFtcy51bnNoaWZ0KCJ0b2tlbjoiICsgUlBDVG9rZW4pOyAvLyDlv4XpobvopoHliqDlnKjnrKzkuIDkuKoKCQl9CgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewoJCQl2YXIgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldChSUENVUkwpOwoJCQl3ZWJTb2NrZXQub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQljb25zb2xlLmxvZygid2ViU29ja2V0Lm9uZXJyb3IiLCBldmVudCk7CgkJCQlyZWplY3QoIkFyaWEy6L+e5o6l6ZSZ6K+v77yM6K+35omT5byAQXJpYTLlkozmo4Dmn6VSUEPorr7nva7vvIEiKTsKCQkJfQoJCQl3ZWJTb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKCQkJCXdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGpzb25SUEMpKTsKCQkJfQoJCQl3ZWJTb2NrZXQub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpewoJCQkJbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7CgkJCQlzd2l0Y2ggKHJlc3VsdC5tZXRob2QpIHsKCQkJCQljYXNlICJhcmlhMi5vbkRvd25sb2FkU3RhcnQiOgoJCQkJCQlyZXNvbHZlKCJBcmlhMiDlvIDlp4vkuIvovb3jgJAiK2ZpbGVOYW1lKyLjgJEiKTsKCQkJCQkJd2ViU29ja2V0LmNsb3NlKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgImFyaWEyLm9uRG93bmxvYWRDb21wbGV0ZSI6CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfSk7Cgl9OwoJdGhpcy5nZXRFbGVtZW50T2JqZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGFsbG93RW1wdHkgPSB0cnVlLCBkZWxheT0xMCwgbWF4RGVsYXk9MjAwMCl7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCkgPT57CgkJCWxldCB0b3RhbERlbGF5ID0gMDsKCQkJbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKCQkJbGV0IHJlc3VsdCA9IGFsbG93RW1wdHkgPyAhIWVsZW1lbnQgOiAoISFlbGVtZW50ICYmICEhZWxlbWVudC5pbm5lckhUTUwpOwoJCQlpZihyZXN1bHQpewoJCQkJcmVzb2x2ZShlbGVtZW50KTsKCQkJfQoJCQlsZXQgZWxlbWVudEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PnsKCQkJCWlmKHRvdGFsRGVsYXkgPj0gbWF4RGVsYXkpeyAvL+aAu+WFseajgOafpTJz77yM5aaC5p6c6L+Y5piv5rKh5om+5Yiw77yM5YiZ6L+U5ZueCgkJCQkJY2xlYXJJbnRlcnZhbChlbGVtZW50SW50ZXJ2YWwpOwoJCQkJCXJlc29sdmUobnVsbCk7CgkJCQl9CgkJCQllbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CgkJCQlyZXN1bHQgPSBhbGxvd0VtcHR5ID8gISFlbGVtZW50IDogKCEhZWxlbWVudCAmJiAhIWVsZW1lbnQuaW5uZXJIVE1MKTsKCQkJCWlmKHJlc3VsdCl7CgkJCQkJY2xlYXJJbnRlcnZhbChlbGVtZW50SW50ZXJ2YWwpOwoJCQkJCXJlc29sdmUoZWxlbWVudCk7CgkJCQl9ZWxzZXsKCQkJCQl0b3RhbERlbGF5ICs9IGRlbGF5OwoJCQkJfQoJCQl9LCBkZWxheSk7CgkJfSk7Cgl9OwoJLyoqCgkgKiBAcGFyYW0ge09iamVjdH0gdGltZQoJICogQHBhcmFtIHtPYmplY3R9IGZvcm1hdAoJICog5pe26Ze05qC85byP5YyWCgkgKiBEYXRlRm9ybWF0KG5ldyBEYXRlKGRhdGVDcmVhdGVkKSwgInl5eXktTU0tZGQgaGg6bW06c3MiKQoJICovCgl0aGlzLkRhdGVGb3JtYXQgPSBmdW5jdGlvbih0aW1lLCBmb3JtYXQpIHsKCQl2YXIgbyA9IHsKCQkJIk0rIjogdGltZS5nZXRNb250aCgpICsgMSwgLy/mnIjku70gCgkJCSJkKyI6IHRpbWUuZ2V0RGF0ZSgpLCAvL+aXpSAKCQkJImgrIjogdGltZS5nZXRIb3VycygpLCAvL+Wwj+aXtiAKCQkJIm0rIjogdGltZS5nZXRNaW51dGVzKCksIC8v5YiGIAoJCQkicysiOiB0aW1lLmdldFNlY29uZHMoKSwgLy/np5IgCgkJCSJxKyI6IE1hdGguZmxvb3IoKHRpbWUuZ2V0TW9udGgoKSArIDMpIC8gMyksIC8v5a2j5bqmIAoJCQkiUyI6IHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgLy/mr6vnp5IgCgkJfTsKCQlpZigvKHkrKS8udGVzdChmb3JtYXQpKXsKCQkJZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoUmVnRXhwLiQxLCAodGltZS5nZXRGdWxsWWVhcigpICsgIiIpLnN1YnN0cig0IC0gUmVnRXhwLiQxLmxlbmd0aCkpOwoJCX0KCQlmb3IodmFyIGsgaW4gbyl7CgkJCWlmKG5ldyBSZWdFeHAoIigiICsgayArICIpIikudGVzdChmb3JtYXQpKXsKCQkJCWZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKFJlZ0V4cC4kMS5sZW5ndGggPT0gMSkgPyAob1trXSkgOiAoKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSkpOwoJCQl9CgkJfQoJCXJldHVybiBmb3JtYXQ7Cgl9Cn0KLy/lhajlsYDlvLnnqpflr7nosaEKY29uc3QgcG9wdXAgPSAoZnVuY3Rpb24oKXsKCWNsYXNzIFBvcHVwIHsKCQljb25zdHJ1Y3RvcigpIHsKCQkJdGhpcy5tYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJdGhpcy5zZXRTdHlsZSh0aGlzLm1hc2ssIHsKCQkJCSJ3aWR0aCI6ICcxMDAlJywKCQkJCSJoZWlnaHQiOiAnMTAwJScsCgkJCQkiYmFja2dyb3VuZENvbG9yIjogJ3JnYmEoMCwgMCwgMCwgLjYpJywKCQkJCSJwb3NpdGlvbiI6ICdmaXhlZCcsCgkJCQkibGVmdCI6ICIwcHgiLAoJCQkJInRvcCI6ICIwcHgiLAoJCQkJImJvdHRvbSI6IjBweCIsCgkJCQkicmlnaHQiOiIwcHgiLAoJCQkJInotaW5kZXgiOiI5OTk5OSIKCQkJfSkKCQkJLy8g5Yib5bu65Lit6Ze05pi+56S65YaF5a6555qE5rC05bmz5bm25Z6C55u05bGF5Lit55qEZGl2CgkJCXRoaXMuY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCgkJCXRoaXMuc2V0U3R5bGUodGhpcy5jb250ZW50LCB7CgkJCQkibWF4LXdpZHRoIjogJzQ1MHB4JywKCQkJCSJ3aWR0aCI6IjEwMCUiLAoJCQkJIm1heC1oZWlnaHQiOiAnNjAwcHgnLAoJCQkJImJhY2tncm91bmRDb2xvciI6ICcjZmZmJywKCQkJCSJib3hTaGFkb3ciOiAnMCAwIDJweCAjOTk5JywKCQkJCSJwb3NpdGlvbiI6ICdhYnNvbHV0ZScsCgkJCQkibGVmdCI6ICc1MCUnLAoJCQkJInRvcCI6ICc1MCUnLAoJCQkJInRyYW5zZm9ybSI6ICd0cmFuc2xhdGUoLTUwJSwtNTAlKScsCgkJCQkiYm9yZGVyUmFkaXVzIjogJzNweCcKCQkJfSkKCQkJLy8g5bCG6L+Z5Liq5bCPZGl25pS+5Zyo6YGu572p5LitCgkJCXRoaXMubWFzay5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpCgkJfQoJCW1pZGRsZUJveChwYXJhbSkgewoJCQkvLyDlhYjmuIXnqbrkuK3pl7TlsI9kaXbnmoTlhoXlrrkgLSDpmLLmraLosIPnlKjlpJrmrKHvvIzlh7rnjrDmt7fkubEKCQkJdGhpcy5jb250ZW50LmlubmVySFRNTCA9ICcnCgkJCWxldCB0aXRsZSA9ICfpu5jorqTmoIfpopjlhoXlrrknOwoJCQkvLyDmo4DmtYvlj4LmlbDnsbvlnosKCQkJaWYoe30udG9TdHJpbmcuY2FsbChwYXJhbSkgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CgkJCQl0aXRsZSA9IHBhcmFtCgkJCX0gZWxzZSBpZih7fS50b1N0cmluZy5jYWxsKHBhcmFtKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHsKCQkJCXRpdGxlID0gcGFyYW0udGl0bGUKCQkJfQoJCQkvLyDlsIbpga7nvanmlL7lnKhib2R55Lit5pi+56S6CgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5tYXNrKQoJCQkvLyDnu5nkuK3pl7TnmoTlsI9kaXborr7nva7pu5jorqTnmoTmjpLniYgKCQkJLy8g5LiK6Z2i5qCH6aKY6YOo5YiGCgkJCXRoaXMudGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQoJCQkvLyDorr7nva7moLflvI8KCQkJdGhpcy5zZXRTdHlsZSh0aGlzLnRpdGxlLCB7CgkJCQkid2lkdGgiOiAnMTAwJScsCgkJCQkiaGVpZ2h0IjogJzQwcHgnLAoJCQkJImxpbmVIZWlnaHQiOiAnNDBweCcsCgkJCQkiYm94U2l6aW5nIjogJ2JvcmRlci1ib3gnLAoJCQkJImJhY2tncm91bmQtY29sb3IiOiIjRkY0RDQwIiwKCQkJCSJjb2xvciI6ICcjRkZGJywKCQkJCSJ0ZXh0LWFsaWduIjogJ2NlbnRlcicsCgkJCQkiZm9udC13ZWlnaHQiOiI3MDAiLAoJCQkJImZvbnQtc2l6ZSI6IjE2cHgiCgkJCQkKCQkJfSkKCQkJLy8g6K6+572u6buY6K6k5qCH6aKY5YaF5a65CgkJCXRoaXMudGl0bGUuaW5uZXJUZXh0ID0gdGl0bGUKCQkJLy8g5bCG5qCH6aKY6YOo5YiG5pS+5Zyo5Lit6Ze0ZGl25LitCgkJCXRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLnRpdGxlKQoJCQkvLyDlhbPpl63mjInpkq4KCQkJdGhpcy5jbG9zZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCgkJCS8vIOiuvue9ruWGheWuuQoJCQl0aGlzLmNsb3NlQnRuLmlubmVyVGV4dCA9ICfDlycKCQkJLy8g6K6+572u5qC35byPCgkJCXRoaXMuc2V0U3R5bGUodGhpcy5jbG9zZUJ0biwgewoJCQkJInRleHREZWNvcmF0aW9uIjogJ25vbmUnLAoJCQkJImNvbG9yIjogJyM2NjYnLAoJCQkJInBvc2l0aW9uIjogJ2Fic29sdXRlJywKCQkJCSJyaWdodCI6ICcxMHB4JywKCQkJCSJ0b3AiOiAnMHB4JywKCQkJCSJmb250U2l6ZSI6ICcyNXB4JywKCQkJCSJjb2xvciI6ICcjRkZGJywKCQkJCSJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIiwKCQkJCSJjdXJzb3IiOiJwb2ludGVyIgoJCQl9KQoJCQkvLyDlsIblhbPpl63mjInpkq7mlL7lnKjkuK3pl7TlsI9kaXbkuK0KCQkJdGhpcy50aXRsZS5hcHBlbmRDaGlsZCh0aGlzLmNsb3NlQnRuKQoJCQl0aGlzLmNsb3NlQnRuLm9uY2xpY2sgPSAoKSA9PiB0aGlzLmNsb3NlKCkKCQl9CgkJLy8g5by55Ye65o+Q56S65qGGCgkJZGlhbG9nKHBhcmFtKSB7CgkJCXRoaXMubWlkZGxlQm94KHBhcmFtKTsKCQkJdGhpcy5kaWFsb2dDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJdGhpcy5zZXRTdHlsZSh0aGlzLmRpYWxvZ0NvbnRlbnQsewoJCQkJInBhZGRpbmciOiIxNXB4IiwKCQkJCSJtYXgtaGVpZ2h0IjoiNDAwcHgiCgkJCX0pCgkJCXRoaXMuZGlhbG9nQ29udGVudC5pbm5lckhUTUwgPSBwYXJhbS5jb250ZW50OwoJCQl0aGlzLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2dDb250ZW50KQoJCQlwYXJhbS5vbkNvbnRlbnRSZWFkeSh0aGlzKTsKCQl9CgkJY2xvc2UoKSB7CgkJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5tYXNrKQoJCQl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CgkJfQoJCXNldFN0eWxlKGVsZSwgc3R5bGVPYmopIHsgLy8g6K6+572u5qC35byP55qE5Ye95pWwCgkJCWZvcihsZXQgYXR0ciBpbiBzdHlsZU9iail7CgkJCQllbGUuc3R5bGVbYXR0cl0gPSBzdHlsZU9ialthdHRyXQoJCQl9CgkJfQoJfQoJbGV0IHBvcHVwID0gbnVsbDsKCXJldHVybiAoZnVuY3Rpb24oKSB7CgkJaWYoIXBvcHVwKSB7CgkJCXBvcHVwID0gbmV3IFBvcHVwKCkKCQl9CgkJcmV0dXJuIHBvcHVwOwoJfSkoKQp9KSgpOwovL+WFqOWxgOe7n+S4gOaWueazleWvueixoQpjb25zdCBjb21tb25GdW5jdGlvbk9iamVjdCA9IG5ldyBDb21tb25GdW5jdGlvbigpOyAKY29tbW9uRnVuY3Rpb25PYmplY3QuYWRkQ29tbW9uSHRtbENzcygpOwkvL+e7n+S4gGh0bWzjgIFjc3PlhYPntKDmt7vliqAKbGV0IGZ1bmN0aW9uQ29udHJvbGxlciA9IG51bGw7CgkvL+ebuOWFs+WKn+iDveWFs+mXreaOp+WItgpmdW5jdGlvbkNvbnRyb2xsZXIgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKCJzZXRpbmdEYXRhIik7CmlmKCFmdW5jdGlvbkNvbnRyb2xsZXIpewoJZnVuY3Rpb25Db250cm9sbGVyPXsKCQkiYmlsaWJpbGlIZWxwZXIiOnRydWUsInN1cGVyVmlkZW9IZWxwZXIiOnRydWUsCgkJImFicm9hZFZpZGVvSGVscGVyIjp0cnVlLAoJCSJzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbiI6dHJ1ZSwiemhpaHVIZWxwZXIiOnRydWUsCgkJInNob3J0VmlkZW9Eb3dubG9hZCI6dHJ1ZQoJfQp9CQovL+eUqOaIt+WKn+iDveiuvue9ruWHveaVsApmdW5jdGlvbiB1c2Vyc1NldGluZygpewoJdmFyIGJpbGliaWxpSGVscGVyPXRydWUsIHN1cGVyVmlkZW9IZWxwZXI9dHJ1ZSwgYWJyb2FkVmlkZW9IZWxwZXI9dHJ1ZSwgCglzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbj10cnVlLCB6aGlodUhlbHBlcj10cnVlLCBzaG9ydFZpZGVvRG93bmxvYWQ9dHJ1ZTsKCXZhciBpc1VwZGF0ZVN0b3JhZ2UgPSBmYWxzZTsKCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoImJpbGliaWxpSGVscGVyIikpewoJCWZ1bmN0aW9uQ29udHJvbGxlci5iaWxpYmlsaUhlbHBlciA9IHRydWU7CgkJaXNVcGRhdGVTdG9yYWdlID0gdHJ1ZTsKCX1lbHNlewoJCWJpbGliaWxpSGVscGVyID0gZnVuY3Rpb25Db250cm9sbGVyLmJpbGliaWxpSGVscGVyOwoJfQoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgic3VwZXJWaWRlb0hlbHBlciIpKXsKCQlmdW5jdGlvbkNvbnRyb2xsZXIuc3VwZXJWaWRlb0hlbHBlciA9IHRydWU7CgkJaXNVcGRhdGVTdG9yYWdlID0gdHJ1ZTsKCX1lbHNlewoJCXN1cGVyVmlkZW9IZWxwZXIgPSBmdW5jdGlvbkNvbnRyb2xsZXIuc3VwZXJWaWRlb0hlbHBlcjsKCX0KCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoImFicm9hZFZpZGVvSGVscGVyIikpewoJCWZ1bmN0aW9uQ29udHJvbGxlci5hYnJvYWRWaWRlb0hlbHBlciA9IHRydWU7CgkJaXNVcGRhdGVTdG9yYWdlID0gdHJ1ZTsKCX1lbHNlewoJCWFicm9hZFZpZGVvSGVscGVyID0gZnVuY3Rpb25Db250cm9sbGVyLmFicm9hZFZpZGVvSGVscGVyOwoJfQoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgic2VhcmNoRW5naW5lc05hdmlnYXRpb24iKSl7CgkJZnVuY3Rpb25Db250cm9sbGVyLnNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uID0gdHJ1ZTsKCQlpc1VwZGF0ZVN0b3JhZ2UgPSB0cnVlOwoJfWVsc2V7CgkJc2VhcmNoRW5naW5lc05hdmlnYXRpb24gPSBmdW5jdGlvbkNvbnRyb2xsZXIuc2VhcmNoRW5naW5lc05hdmlnYXRpb247Cgl9CglpZighZnVuY3Rpb25Db250cm9sbGVyLmhhc093blByb3BlcnR5KCJ6aGlodUhlbHBlciIpKXsKCQlmdW5jdGlvbkNvbnRyb2xsZXIuemhpaHVIZWxwZXIgPSB0cnVlOwoJCWlzVXBkYXRlU3RvcmFnZSA9IHRydWU7Cgl9ZWxzZXsKCQl6aGlodUhlbHBlciA9IGZ1bmN0aW9uQ29udHJvbGxlci56aGlodUhlbHBlcjsKCX0KCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoInNob3J0VmlkZW9Eb3dubG9hZCIpKXsKCQlmdW5jdGlvbkNvbnRyb2xsZXIuc2hvcnRWaWRlb0Rvd25sb2FkID0gdHJ1ZTsKCQlpc1VwZGF0ZVN0b3JhZ2UgPSB0cnVlOwoJfWVsc2V7CgkJc2hvcnRWaWRlb0Rvd25sb2FkID0gZnVuY3Rpb25Db250cm9sbGVyLnNob3J0VmlkZW9Eb3dubG9hZDsKCX0KCWlmKGlzVXBkYXRlU3RvcmFnZSl7CgkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgic2V0aW5nRGF0YSIsZnVuY3Rpb25Db250cm9sbGVyKTsKCX0KCXZhciBzZXRpbmdEYXRhPVsKCQl7InRhZyI6ImJpbGliaWxpSGVscGVyIiwgIm5hbWUiOiJC56uZ5L2/55So5Yqg5by6KOinhumikeS4i+i9veaUr+aMgeaJuemHj+OAgea1j+iniOiusOW9leOAgeS4gOmUruS4iei/nikiLCAiY2hlY2tlZCI6YmlsaWJpbGlIZWxwZXJ9LAoJCXsidGFnIjoiemhpaHVIZWxwZXIiLCAibmFtZSI6IuefpeS5juS9v+eUqOWKoOW8uijlhoXlrrnmoIfor4bjgIHpl67nrZTmmL7npLrkvJjljJbjgIHop4bpopHkuIvovb3nrYkpIiwgImNoZWNrZWQiOnpoaWh1SGVscGVyfSwKCQl7InRhZyI6InN1cGVyVmlkZW9IZWxwZXIiLCAibmFtZSI6IuWFqOe9kVZJUOinhumikeino+aekCjmlK/mjIHniLHlpYfoibrjgIHohb7orq/op4bpopHjgIFC56uZ55Wq5Ymn562JKSIsICJjaGVja2VkIjpzdXBlclZpZGVvSGVscGVyfSwKCQl7InRhZyI6InNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uIiwgIm5hbWUiOiLmkJzntKLlvJXmk47kvb/nlKjliqDlvLoo6YCC6YWN55m+5bqm44CBMzYw44CB5pCc54uX44CB5b+F5bqU44CBR29vZ2xl562JKSIsICJjaGVja2VkIjpzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbn0sCgkJeyJ0YWciOiJzaG9ydFZpZGVvRG93bmxvYWQiLCAibmFtZSI6IuefreinhumikeWOu+awtOWNsOS4i+i9vSjmlK/mjIHmipbpn7PjgIHlv6vmiYvnrYkpIiwgImNoZWNrZWQiOnNob3J0VmlkZW9Eb3dubG9hZH0sCgkJeyJ0YWciOiJhYnJvYWRWaWRlb0hlbHBlciIsICJuYW1lIjoi5Zu95aSW6KeG6aKR6Kej5p6Q5LiL6L29KOaUr+aMgeayueeuoeOAgUZhY2Vib29r562JKSIsICJjaGVja2VkIjphYnJvYWRWaWRlb0hlbHBlcn0KCV0KCXZhciBjb250ZW50ID0gIiI7Cglmb3IodmFyIGk9MDsgaTxzZXRpbmdEYXRhLmxlbmd0aDtpKyspewoJCXZhciBvbmUgPSBzZXRpbmdEYXRhW2ldOwoJCWNvbnRlbnQgKz0gYAoJCQk8ZGl2IHN0eWxlPSJwYWRkaW5nOiA1cHggMHB4OyI+CgkJCQk8aW5wdXQgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOiAxNXB4O2hlaWdodDogMTVweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsgLXdlYmtpdC1hcHBlYXJhbmNlOmNoZWNrYm94O21hcmdpbi1ib3R0b206IDNweDtjdXJzb3I6IHBvaW50ZXI7IiBuYW1lPSJDaGVja2JveCIgdHlwZT0iY2hlY2tib3giIGRhdGEtdGFnPSJgK29uZS50YWcrYCIgYCsob25lLmNoZWNrZWQgPyAiY2hlY2tlZCIgOiAiIikrYD4KCQkJCTxsYWJlbCBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOiAxNHB4O21hcmdpbjozcHggMDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjojMDAwOyI+YCtvbmUubmFtZStgPC9sYWJlbD4KCQkJPC9kaXY+CgkJYAoJfQoJcG9wdXAuZGlhbG9nKHsKCQkidGl0bGUiOiLlip/og73lvIDlhbMiLAoJCSJjb250ZW50Ijpjb250ZW50LAoJCSJvbkNvbnRlbnRSZWFkeSI6ZnVuY3Rpb24oJHRoYXQpewoJCQkkdGhhdC5kaWFsb2dDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9J2NoZWNrYm94J10iKS5mb3JFYWNoKGZ1bmN0aW9uKGNoZWNrYm94KXsKCQkJCWNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oZSl7CgkJCQkJdmFyIHRhZyA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS10YWciKTsKCQkJCQl2YXIgY2hlY2tlZCA9IGUudGFyZ2V0LmNoZWNrZWQ7CgkJCQkJZnVuY3Rpb25Db250cm9sbGVyW3RhZ10gPSBjaGVja2VkOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoInNldGluZ0RhdGEiLGZ1bmN0aW9uQ29udHJvbGxlcik7CgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi5pON5L2c5oiQ5YqfIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJfSk7CgkJCX0pCgkJfQoJfSk7Cn0KCi8vIOiPnOWNleaMiemSruW8ueahhgppZihjb21tb25GdW5jdGlvbk9iamVjdC5pc1BDKCkpewoJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgi5Yqf6IO95byA5YWzIiwoKT0+dXNlcnNTZXRpbmcoKSk7Cn1lbHNlewoJZnVuY3Rpb25Db250cm9sbGVyLmJpbGliaWxpSGVscGVyID0gZmFsc2U7CglmdW5jdGlvbkNvbnRyb2xsZXIuYWJyb2FkVmlkZW9IZWxwZXIgPSBmYWxzZTsKCWZ1bmN0aW9uQ29udHJvbGxlci5zZWFyY2hFbmdpbmVzTmF2aWdhdGlvbiA9IGZhbHNlOwoJZnVuY3Rpb25Db250cm9sbGVyLnpoaWh1SGVscGVyID0gZmFsc2U7Cn0KCQoJLyoqCiAqIOi2hee6p+ino+aekOWKqeaJi+WKn+iDvQogKi8KCi8vVklQ6KeG6aKR6Kej5p6Q5o6l5Y+j5Y+v6Ieq5a6a5LmJ77yb6K+35Lil5qC85oyJ54Wn5qC85byP5re75YqgCi8vc2hvd1R5cGU9MSjku4VQQyksIHNob3dUeXBlPTIo5LuFbW9iaWxlKSwgc2hvd1R5cGU9MyjlkIzml7bmmL7npLopCmNvbnN0IG9yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IFsKCQpdOwpmdW5jdGlvbiBTdXBlclZpZGVvSGVscGVyKG9yaWdpbmFsSW50ZXJmYWNlTGlzdCl7Cgl0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdDsKCXRoaXMuZWxlbWVudElkID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKSsibW14IjsKCXRoaXMuY3VzdG9tSW50ZXJmYWNlS2V5ID0gImN1c3RvbV9pbnRlcmZhY2Vfa2V5X2RkZHNkeHhhIjsKCXRoaXMucXVpY2tseUludGVyZmFjZUtleSA9ICJjdXN0b21fcXVpY2tseV9pbnRlcmZhY2Vfa2V5X2RkZHNkeHhhIjsKCXRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IDE7Cgl0aGlzLmlzUnVuID0gZnVuY3Rpb24oKXsgLy/liKTmlq3mmK/lkKbov5DooYwKCQljb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJY29uc3QgdXJscyA9IFsid3d3LmlxaXlpLmNvbSIsInYucXEuY29tIiwieW91a3UuY29tIiwgInd3dy5sZS5jb20iLCJtZ3R2LmNvbSIsInNvaHUuY29tIiwgImFjZnVuLmNuIiwiYmlsaWJpbGkuY29tIiwKCQkJImJhb2ZlbmcuY29tIiwicHB0di5jb20iLCIxOTA1LmNvbSIsIm1pZ3V2aWRlby5jb20iLCJzcG9ydHMuaXFpeWkuY29tIl07CgkJdmFyIHJlc3VsdCA9IGZhbHNlOwoJCWlmKCFob3N0LnN0YXJ0c1dpdGgoIm0uIikpeyAvL+S4jeaYr+enu+WKqOerr+aJp+ihjAoJCQlmb3IodmFyIGk9MDsgaTx1cmxzLmxlbmd0aDtpKyspeyAvL+S4jeaYr0Lnq5nnm7TmjqXliKTmlq0KCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoImJpbGliaWxpLmNvbSIpPT0tMSl7CgkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZih1cmxzW2ldKSE9LTEpewoJCQkJCQlyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9ZWxzZXsKCQkJCQlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ3d3cuYmlsaWJpbGkuY29tL2Jhbmd1bWkvcGxheSIpIT0tMSl7IC8v5pivQuermeWPquacieeVquWJp+aJjeW8gOWQr1ZJUOino+aekAoJCQkJCQlyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX07Cgl0aGlzLnNob3dQbGF5ZXJXaW5kb3cgPSBmdW5jdGlvbihwbGF5T2JqZWN0KXsJLy/mmL7npLrmkq3mlL7nqpflj6MKCQl2YXIgdXJsID0gcGxheU9iamVjdC51cmwgKyB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYih1cmwpOwoJfTsKCXRoaXMuYW5hbHlzaXNDdXN0b21JbnRlcmZhY2UgPSBmdW5jdGlvbigpeyAvL+iHquWumuS5ieaOpeWPo+ino+aekAoJCXZhciBjdXN0b21JbnRlcmZhY2UgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHRoaXMuY3VzdG9tSW50ZXJmYWNlS2V5LCIiKTsKCQlpZighIWN1c3RvbUludGVyZmFjZSl7CgkJCXRyeXsKCQkJCXZhciBjdXN0b21pemVJbnRlcmZhY2VMaXN0ID0gbmV3IEFycmF5KCk7CgkJCQl2YXIgYW5hbHlzaXNBcnJheSA9IGN1c3RvbUludGVyZmFjZS5zcGxpdCgiXG4iKTsKCQkJCWZvcih2YXIgaT0wO2k8YW5hbHlzaXNBcnJheS5sZW5ndGg7aSsrKXsKCQkJCQl2YXIgb25lUGllY2UgPSBhbmFseXNpc0FycmF5W2ldOwoJCQkJCWlmKCEhb25lUGllY2UgJiYgb25lUGllY2UuaW5kZXhPZigiLCIpIT0tMSl7CgkJCQkJCXZhciBvbmVQaWVjZUFycmF5ID0gb25lUGllY2Uuc3BsaXQoIiwiKTsgCgkJCQkJCQoJCQkJCQlpZihvbmVQaWVjZUFycmF5Lmxlbmd0aD09MiAmJiAhIW9uZVBpZWNlQXJyYXlbMF0gJiYgLyhodHRwfGh0dHBzKTpcL1wvXFMqLy50ZXN0KG9uZVBpZWNlQXJyYXlbMV0pKXsKCQkJCQkJCWN1c3RvbWl6ZUludGVyZmFjZUxpc3QucHVzaCh7Im5hbWUiOiIiK29uZVBpZWNlQXJyYXlbMF0rIiIsInVybCI6IiIrb25lUGllY2VBcnJheVsxXSsiIiwgInNob3dUeXBlIjoxfSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQl0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IGN1c3RvbWl6ZUludGVyZmFjZUxpc3QuY29uY2F0KHRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0KTsKCQkJfWNhdGNoKGUpe30KCQl9Cgl9OwoJdGhpcy5nZXRRdWlja2x5SW50ZXJmYWNlSW5kZXggPSBmdW5jdGlvbigpewoJCXZhciBxdWlja2x5SW50ZXJmYWNlSW5kZXhTdHJpbmcgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHRoaXMucXVpY2tseUludGVyZmFjZUtleSwiIikrIiI7CgkJdmFyIHF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleDsKCQlpZighIXF1aWNrbHlJbnRlcmZhY2VJbmRleFN0cmluZyl7CgkJCXF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHBhcnNlSW50KHF1aWNrbHlJbnRlcmZhY2VJbmRleFN0cmluZyk7CgkJfQoJCWlmKHRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0Lmxlbmd0aC0xPHF1aWNrbHlJbnRlcmZhY2VJbmRleCl7CgkJCXF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleDsKCQl9CgkJcmV0dXJuIHF1aWNrbHlJbnRlcmZhY2VJbmRleDsKCX07Cgl0aGlzLmFkZEh0bWxFbGVtZW50cyA9IGZ1bmN0aW9uKCl7ICAvL+a3u+WKoEhUTUwKCQljb25zdCB2aXBWaWRlb0ltYWdlQmFzZTY0ID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0NBWUFBQUJYQXZtSEFBQUM5a2xFUVZSb1ErMlpQV2dWUVJESC83L0NXcU9JWU9GSEZiUlNqSmhHTUdEcEJ5b0lhZ283MGNxdlV0UWdkaXBXRnFhd01XZ2hHSWlkaGNIS1FBSnFFVVJCUmZFRDFDQ0NqYzNJUHU0ZW0zMTc3NUo3ZDNtOGNBdFgzTzdzelA3blB6c3p4NkVlSC9UNCtWVUQ2RGFEVFFiTWJFKzNEN01ZKzhDa2t3OEJQRnVNa2k3S0R0VUF1dWg5WjNvWk10QmxqeFkyWDllQndxNHJhV1BOUUVtT0xLeG0rVEJnWnFza25RMWRBVnpOY28rWmhXc202WmFrSFpMQzFtUXlyWjVPWDJSdnpNeG5TYThselFKL1l3THpHREN6ZTVKT2VvSS9nYlZ0QU14SjZ2UFc3d0tua3I0cWJFdWF4Y2NEY0dXQnNmTlYwbWpNbVNHQWc1TEdBNlhiZ0ZlaElUUGJMZWw1TU44NFpBVUFVak1QZ1dPK3paWTdZR2J2SlcwT3ZSb0I4RWpTRVc5K0JoaEl2T3ZDcDB3R2ZQUGJnWmZwUkF6QVRVbm41NkdFbUp5TGQzOWNCTnhlRjk5RkFEVGE0MkJza3VRZWY0d0RoOW9CMkNYcFJiRHBNUEE0blRPejA1THVCRExyZ1crZEFBQ0dJa3hma0hURG0vOERyTXdFa0J4Z09za2txZHdFY01BRDRHTGYzWUYwUEFDT2UrdUZHTWdBNEJqNEVBQWJBR2JjWExRT21Oa2xTZGVDVFJ1QlQyYldMK2xOc0xZZmVGSVJnSDJTSmdKN0d3Q1hZak1CckpiMEs5alVpSEV6RzVGMDJWdWJBOWI0c2tYdlFNaUFtVzJWZEZTU24yNC9BczBrazFtSnpleXBwTDNld2FhQm5XWTJLMm1MTno4UzV1ZUNBTUx3ejNxL0RaeHJld2VTZTNCQzB2MUFpN3RrWVhyc0I5Nld3TUJDQWZRQnYzTUJKQ0QrU1ZyaGFYYVo1NHozUGdVTWhwWXJaS0NGN2JiTm5KazVCaHdUNmZnaHlXOHRob0d4aWdFNG15NnRYd2VtUWx0NUFHSTFvYW1EU0lGTG1DdVVSaVc1Qk9HUEw4QzdkckdWMjA2YjJYZEo2eUpLeG9EaG1QS0NJZVM2MVpaQ2xuY3hGZ0xBdGN5eHJuRXdSbWtuREZRRklGWVRXbkovQ1Ztb0dnWVNqN1o4MU9SODZMZzdzT2dQbW5ZNnMwSXBONFR5WXJEYjZ6V0Ftb0VPUFZDSFVJY083SGg3L1llbVl4Y1dVN0FNZjNCa05HREYvRlA5cmt3R3FqZGRrb1dXdjVRbDZWMXlOWFVkV0hLWEJ3Wjdub0gvZFArSFFOcWhlVG9BQUFBQVNVVk9SSzVDWUlJPSI7CgkJY29uc3QgcXVpY2tseUJhc2U2NCA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFBQVhOU1IwSUFyczRjNlFBQUF2MUpSRUZVV0VmRmwwMklWV1VZeDM5L0VEZEtvQ2lDR1lxdXhOdzQwNFFMK3dBL3dJVWZBNWx1TW90azBqR29pRFFGdjFvTXFDQ09Ga1lRdG9wY3pLeE1Hc1VVRjJiTktzV0ZLQnJvSnRMSTJxandsK2R5N3VWNDdqbm5ubnRueWdjT0Y5N25mZDcvNzc3bmZaN25QZUlabThaYjMvWnNZQkV3RTVnRnpBR21BWDhsejkvQUEwbDdRbnZjQUd3dkJkNEUxZ09USy95eHZRRXhaZ0RiYndIdkFxOVVFRTFQT1N6cHd6RUIyRDRLYkcxVHVENzlHMG52ZEF4ZysyZWdwMFB4Q0J1UzFOc1JnRzJQUWJnZWVsYlMwcllCYko4RFhpc0F1QWRjQjJZa3A3K004enRKR3lvRDJINEorQXhZVTdEcW9LUVA2ajdiMjRBakpRUURrbmFVQXRpZUR2UW16L0tTeFVZa05mbHR4MDdGanVWWnY2UmpoUUMyMXdJSGdIa1YzdmMyU1pFUlRXYjdkK0NGSEZldnBLRmNBTnZ2QTE5VUVLNVBXU25waHdLQVM4RExHZDgvd0l1U2JqY0IySTRTdWJzTjhaajZpYVNEQlFCL0FsTXp2cThsdlJkalR3RWs1WFNrVGZIYWRFbDVmeVlPWVJ6R3JDMlRkT1lwQU52ZHdDK2RpS2RpdGdOWGt4UmNCU3pMV2UrQ3BGZnI0dzFxMjFlQUJabUF4OERGa3J6dmhIZWpwRy96QVBxU2JoYUN0VWZTdjdZSGdFODdVY3FKT1NhcFB6MWVxUkRaL2g1NFk0d1FseVZsczZINmZjRDJyMEJYcHhCNWg3UXBDMW90Ymp0cS9aUlc4ekwrbnlTOVhoVFRxaFIzU1JwTkI5dStrMXkzcW5BTVM0cUtXbWhGbFhBbHNDL1o4bHZBaWZvZExsYXlQUXlzcmtEUUk2azB0Zk9LeDBUZ0dqQTNJN0JPMHNuNm1PMUR3RWNsRUQ5S1d0RUtNZy9nT0xBNUovQ3VwT2N6cnlOMmFVbEJuZWlURkd1VldyWVVSNnBGeWhWWmQ4NlplQVJNeUFUY0FCWkwrcU15Z08wNDNlZUJoUVZCbzVLaVhEZk05aVFnT2x2V2FxMjJsWGo0MDZYNGMyQm5RZEROYUNxU1RtVUE0aDJmenNSc2tmUmxGZkVHZ08zNVFQVHQ1M0lDdjByRUgyWjl0dmNEdTFManRZK05xdUpwZ0xoOHhDVWtiYjhCKzlNblB3Y2dmVUZ0dE5oT0FOSUx4YmZiSUhCSTB2Mnl4V3gvREd3QzNwWVVwYnB0cTUyQjVCWVVQVHJ5UDI2MzhmdS9XS1Z1K0YrU1BBRzdsL3doNE5zSk9RQUFBQUJKUlU1RXJrSmdnZz09IjsKCQljb25zdCBjdXJyZW50SG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCQoJCWNvbnN0IHF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZ2V0UXVpY2tseUludGVyZmFjZUluZGV4KCk7CgkJdmFyIGN1cnJlbnRRdWlja2x5SW50ZXJmYWNlT2JqZWN0ID0gbnVsbDsKCQkKCQl2YXIgY2F0ZWdvcnlfMV9odG1sID0gIiI7CgkJdGhpcy5vcmlnaW5hbEludGVyZmFjZUxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsKCQkJaWYoaXRlbS5zaG93VHlwZSAhPSAyKXsKCQkJCXZhciBzZWxlY3RlZCA9ICIiCgkJCQlpZihpbmRleD09cXVpY2tseUludGVyZmFjZUluZGV4KXsKCQkJCQlzZWxlY3RlZCA9ICJzZWxlY3RlZCI7CgkJCQkJY3VycmVudFF1aWNrbHlJbnRlcmZhY2VPYmplY3QgPSAgaXRlbTsKCQkJCX0KCQkJCWNhdGVnb3J5XzFfaHRtbCArPSAiPHNwYW4gdGl0bGU9JyIraXRlbS5uYW1lKyInIGRhdGEtaW5kZXg9JyIraW5kZXgrIicgY2xhc3M9JyIrc2VsZWN0ZWQrIic+IiArIGl0ZW0ubmFtZSArICI8L3NwYW4+IjsKCQkJfQoJCX0pOwoJCQoJCS8v6I635b6X6Ieq5a6a5LmJ5L2N572uCgkJdmFyIGxlZnQgPSAwOwoJCXZhciB0b3AgPSAxMjA7CgkJdmFyIFBvc2l0aW9uID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiUG9zaXRpb25fIiArIGN1cnJlbnRIb3N0KTsKCQlpZighIVBvc2l0aW9uKXsKCQkJbGVmdCA9IFBvc2l0aW9uLmxlZnQ7CgkJCXRvcCA9IFBvc2l0aW9uLnRvcDsKCQl9CgkJdmFyIGNvbG9yID0gIiNGRjRENDAiOwoJCXZhciBob3ZlckNvbG9yID0gIiMwMDAwMDAiOwoJCWlmKGN1cnJlbnRIb3N0LmluZGV4T2YoImJpbGliaWxpLmNvbSIpIT0tMSl7IC8v6Ieq5a6a5LmJ5Li76aKYCgkJCWNvbG9yID0gIiNmYjcyOTkiOwoJCQlob3ZlckNvbG9yID0gIiMwMEIwRTEiOwoJCX0KCQl2YXIgY3NzTW91bGQgPSBgI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2B7Y3Vyc29yOnBvaW50ZXI7IHBvc2l0aW9uOmZpeGVkOyB0b3A6YCArIHRvcCArIGBweDsgbGVmdDpgICsgbGVmdCArIGBweDsgd2lkdGg6MHB4OyB6LWluZGV4Ojk5OTk5OTk5OyBmb250LXNpemU6MTZweDsgdGV4dC1hbGlnbjpsZWZ0O30KCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmltZ19ib3hgK3RoaXMuZWxlbWVudElkK2B7d2lkdGg6MjRweDsgaGVpZ2h0OjMycHg7bGluZS1oZWlnaHQ6MzJweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOmArY29sb3IrYDt9CgkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC5pbWdfYm94YCt0aGlzLmVsZW1lbnRJZCtgOmhvdmVyewoJCQkJCQkJYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDMwZGVnLCAjMmE2NmZmIDQwJSwgYCtjb2xvcitgKTsKCQkJCQkJfQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAuaW1nX2JveGArdGhpcy5lbGVtZW50SWQrYD5pbWcge3dpZHRoOjIwcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQoJCQkJCQkKCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnNob3doaWRlX2JveGArdGhpcy5lbGVtZW50SWQrYHtkaXNwbGF5Om5vbmU7cGFkZGluZy1sZWZ0OjVweDtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMjRweDt0b3A6IDA7fQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpe3dpZHRoOjM4MHB4OyBtYXgtaGVpZ2h0OjQwMHB4OyBvdmVyZmxvdy15OmF1dG87YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0MSwyNDEsMjQxKTt9CgkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC5kZWZhdWx0LXNjcm9sbGJhci01NTY3ODo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6NXB4OyBoZWlnaHQ6MXB4O30KCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmRlZmF1bHQtc2Nyb2xsYmFyLTU1Njc4Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntib3gtc2hhZG93Omluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOyBiYWNrZ3JvdW5kOiNBOEE4QTg7fQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAuZGVmYXVsdC1zY3JvbGxiYXItNTU2Nzg6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JveC1zaGFkb3c6aW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7IGJhY2tncm91bmQ6I0YxRjFGMTt9CgkJCQkJCQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2B7bWFyZ2luLWJvdHRvbToxMHB4O30KCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4gLml0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowcHg7fQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AgPi50aXRsZWArdGhpcy5lbGVtZW50SWQrYHtmb250LXNpemU6MTRweDsgdGV4dC1hbGlnbjpsZWZ0O2NvbG9yOiMwMDAwMDA7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbjo1cHggM3B4O30KCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4gLml0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgID4uaW50ZXJmYWNlX2JveGArdGhpcy5lbGVtZW50SWQrYHt9CgkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9hY3Rpb25fNjg3aWk+IC5pdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYCA+LmludGVyZmFjZV9ib3hgK3RoaXMuZWxlbWVudElkK2A+c3Bhbntib3JkZXItcmFkaXVzOjNweDtib3JkZXItdG9wOjNweCBzb2xpZCBgK2NvbG9yK2A7IGJvcmRlci1ib3R0b206M3B4IHNvbGlkIGArY29sb3IrYDtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDpjYWxjKDI1JSAtIDZweCk7d2lkdGg6LW1vei1jYWxjKDI1JSAtIDZweCk7d2lkdGg6IC13ZWJraXQtY2FsYygyNSUgLSA2cHgpO2hlaWdodDoyMHB4O2xpbmUtaGVpZ2h0OjIwcHg7YmFja2dyb3VuZC1jb2xvcjpgK2NvbG9yK2A7Y29sb3I6I0ZGRjtjdXJzb3I6cG9pbnRlcjttYXJnaW46M3B4O3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTogbm93cmFwO3RleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOy1vLXRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7Zm9udC1zaXplOjEycHghaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ghaW1wb3J0YW50O30JCQkJCQkJCgkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9hY3Rpb25fNjg3aWk+IC5pdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYCA+LmludGVyZmFjZV9ib3hgK3RoaXMuZWxlbWVudElkK2A+c3Bhbjpob3Zlcntib3JkZXItdG9wOjNweCBzb2xpZCBgK2hvdmVyQ29sb3IrYDsgYm9yZGVyLWJvdHRvbTozcHggc29saWQgYCtob3ZlckNvbG9yK2A7fQoJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AgPi5pbnRlcmZhY2VfYm94YCt0aGlzLmVsZW1lbnRJZCtgPnNwYW4uc2VsZWN0ZWR7Ym9yZGVyLXRvcDozcHggc29saWQgYCtob3ZlckNvbG9yK2A7IGJvcmRlci1ib3R0b206M3B4IHNvbGlkIGAraG92ZXJDb2xvcitgO30KCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4gLml0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgID4uY29udGVudGArdGhpcy5lbGVtZW50SWQrYHtmb250LXNpemU6MTJweDtjb2xvcjojMDAwMDAwO21hcmdpbi1sZWZ0OjNweDt9CgkJCQkJCWAKCQljb21tb25GdW5jdGlvbk9iamVjdC5HTWFkZFN0eWxlKGNzc01vdWxkKTsKCQkKCQkvL+WKoOWFpUhUTUwKCQl2YXIgaHRtbE1vdWxkID0gYDxkaXYgaWQ9J3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AnPgoJCQkJCQkJPGRpdiBjbGFzcz0ncGx1Z2luX2lubmVyX2ArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJPGRpdiBjbGFzcz0iaW1nX2JveGArdGhpcy5lbGVtZW50SWQrYCIgaWQ9ImltZ19ib3hfanVtcF82NjY3ODk3aWlvIj48aW1nIHNyYz0nYCsgdmlwVmlkZW9JbWFnZUJhc2U2NCArYCcgdGl0bGU9J+mAieaLqeino+aekOe6v+i3rycvPjwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9J3Nob3doaWRlX2JveGArdGhpcy5lbGVtZW50SWQrYCc+CQkJCQkJCQkJCgkJCQkJCQkJCTxkaXYgY2xhc3M9J3ZpcF9tb2RfYm94X2FjdGlvbl82ODdpaSBkZWZhdWx0LXNjcm9sbGJhci01NTY3OCc+CgkJCQkJCQkJCQk8ZGl2IGNsYXNzPSdpdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0ndGl0bGVgK3RoaXMuZWxlbWVudElkK2AnPjxiPuaOpeWPo+a3u+WKoDwvYj48L2Rpdj4KCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSdjb250ZW50YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJCQkJ5a+5546w5pyJ5o6l5Y+j5LiN5ruh5oSP77yf5Y+v5re75Yqg6Ieq5a6a5LmJ5o6l5Y+j5ZOffjxzcGFuIGlkPSJpbWdfc2V0XzY2Njc4OTdpaW8iIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjJweDttYXJnaW4tbGVmdDo1cHg7cGFkZGluZzozcHggNXB4O2JhY2tncm91bmQtY29sb3I6I0NDQztjdXJzb3I6cG9pbnRlcjsiPua3u+WKoOaOpeWPozwvc3Bhbj4KCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSd0aXRsZWArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJCQkJCTxhIHN0eWxlPSJmb250LXNpemU6MTNweDtjb2xvcjpibHVlOyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgdGFyZ2V0PSJfYmxhbmsiPuaOpeWPo+ivt+iHquihjOa3u+WKoH48L2E+CgkJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9J2l0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgJyBzdHlsZT0nbWluLWhlaWdodDo4MHB4O2JvcmRlcjoxcHggZGFzaGVkICMwMDA7Jz4KCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSdpbnRlcmZhY2VfYm94YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJCQkJYCArIGNhdGVnb3J5XzFfaHRtbCArIGAKCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0naXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AnPgoJCQkJCQkJCQkJCTxkaXYgY2xhc3M9J3RpdGxlYCt0aGlzLmVsZW1lbnRJZCtgJz48Yj7lhY3otKPlo7DmmI7vvJo8L2I+PC9kaXY+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0nY29udGVudGArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJCQkJCTHjgIE8YiBzdHlsZT0nY29sb3I6cmVkOyc+6ZyA6KaB5L2/55SoVklQ6KeG6aKR6Kej5p6Q55qE77yM6K+36Ieq6KGM5re75Yqg5o6l5Y+jPC9iPu+8jOeJiOadg+mXrumimOivt+iBlOezu+ebuOWFs+ino+aekOaOpeWPo+aJgOacieiAhe+8jOiEmuacrOS4jeaJv+aLheebuOWFs+i0o+S7u++8gSI8YnI+CgkJCQkJCQkJCQkJCTLjgIHkuLrliJvpgKDoia/lpb3nmoTliJvkvZzmsJvlm7TvvIzor7flpKflrrbmlK/mjIHmraPniYjvvIE8YnI+CgkJCQkJCQkJCQkJCTPjgIHohJrmnKzku4XpmZDkuKrkurrlrabkuaDkuqTmtYHvvIzkvb/nlKjljbPlt7Lku6Pooajmgqjlt7Lnu4/lhYXliIbkuobop6Pnm7jlhbPpl67popjvvIzlkKbliJnlkI7mnpzoh6rotJ/vvIznibnmraTlo7DmmI7vvIE8YnI+CgkJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJPC9kaXY+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJCTxkaXYgY2xhc3M9ImltZ19ib3hgK3RoaXMuZWxlbWVudElkK2AiIGlkPSJpbWdfcXVpY2tseV82NjY3ODk3aWlvIj48aW1nIHNyYz0nYCtxdWlja2x5QmFzZTY0K2AnIHRpdGxlPSflv6vpgJ/lvIDlp4so5b2T5YmN5omA6YCJ5o6l5Y+j77yaYCsoY3VycmVudFF1aWNrbHlJbnRlcmZhY2VPYmplY3Q9PW51bGwgPyAn5pegJyA6IGN1cnJlbnRRdWlja2x5SW50ZXJmYWNlT2JqZWN0Lm5hbWUpK2ApJy8+PC9kaXY+CgkJCQkJCTwvZGl2PgoJCQkJCQlgOwoJCSQoImJvZHkiKS5hcHBlbmQoaHRtbE1vdWxkKTsKCX07Cgl0aGlzLnJ1bkV2ZW50ID0gZnVuY3Rpb24oKXsJIC8v5LqL5Lu26L+Q6KGMCgkJdmFyIHRoYXQgPSB0aGlzOwoJCSQoIiN2aXBfbW92aWVfYm94Iit0aGlzLmVsZW1lbnRJZCsiID4ucGx1Z2luX2lubmVyXyIrdGhpcy5lbGVtZW50SWQpLm9uKCJtb3VzZW92ZXIiLCAoKSA9PiB7CgkJCSQoIi5zaG93aGlkZV9ib3giK3RoaXMuZWxlbWVudElkKS5zaG93KCk7CgkJfSk7CgkJJCgiI3ZpcF9tb3ZpZV9ib3giK3RoaXMuZWxlbWVudElkKyIgPi5wbHVnaW5faW5uZXJfIit0aGlzLmVsZW1lbnRJZCkub24oIm1vdXNlb3V0IiwgKCkgPT4gewoJCQkkKCIuc2hvd2hpZGVfYm94Iit0aGlzLmVsZW1lbnRJZCkuaGlkZSgpOwoJCX0pOwoJCSQoImJvZHkiKS5vbigiY2xpY2siLCIjdmlwX21vdmllX2JveCIrdGhpcy5lbGVtZW50SWQrIiAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPi5pdGVtX2JveCIrdGhpcy5lbGVtZW50SWQrIj4uaW50ZXJmYWNlX2JveCIrdGhpcy5lbGVtZW50SWQrIj5zcGFuIixmdW5jdGlvbigpewoJCQl2YXIgaW5kZXggPSBwYXJzZUludCgkKHRoaXMpLmF0dHIoImRhdGEtaW5kZXgiKSk7CgkJCXZhciBwbGF5T2JqZWN0ID0gdGhhdC5vcmlnaW5hbEludGVyZmFjZUxpc3RbaW5kZXhdOwoJCQl0aGF0LnNob3dQbGF5ZXJXaW5kb3cocGxheU9iamVjdCk7CgkJCQoJCQkkKCIjdmlwX21vdmllX2JveCIrdGhhdC5lbGVtZW50SWQrIiAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3giK3RoYXQuZWxlbWVudElkKyI+LmludGVyZmFjZV9ib3giK3RoYXQuZWxlbWVudElkKyI+c3BhbiIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpOwoJCQkkKHRoaXMpLmFkZENsYXNzKCJzZWxlY3RlZCIpOwoJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKHRoYXQucXVpY2tseUludGVyZmFjZUtleSwgaW5kZXgpOwoJCQkKCQkJJCgiI2ltZ19xdWlja2x5XzY2Njc4OTdpaW8iKS5maW5kKCJpbWciKS5hdHRyKCJ0aXRsZSIsIuW/q+mAn+W8gOWniyjlvZPliY3miYDpgInmjqXlj6PvvJoiK3BsYXlPYmplY3QubmFtZSsiKSIpOwoJCX0pOwoJCQkJCQkJCQoJCS8v54K55Ye75by55Ye66K6+572u5qGGCgkJJCgiI2ltZ19zZXRfNjY2Nzg5N2lpbyIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCXRoYXQuc2hvd1NldGluZ0RpYWxvZygpOwoJCX0pOwoJCQoJCSQoIiNpbWdfcXVpY2tseV82NjY3ODk3aWlvIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJY29uc3QgcXVpY2tseUludGVyZmFjZUluZGV4ID0gdGhhdC5nZXRRdWlja2x5SW50ZXJmYWNlSW5kZXgoKTsKCQkJdmFyIHBsYXlPYmplY3QgPSB0aGF0Lm9yaWdpbmFsSW50ZXJmYWNlTGlzdFtxdWlja2x5SW50ZXJmYWNlSW5kZXhdOwoJCQl0aGF0LnNob3dQbGF5ZXJXaW5kb3cocGxheU9iamVjdCk7CgkJfSk7CgkJCgkJLy/lj7PplK7np7vliqjkvY3nva4KCQl2YXIgbW92aWVfYm94ID0gJCgiI3ZpcF9tb3ZpZV9ib3giK3RoaXMuZWxlbWVudElkKTsKCQltb3ZpZV9ib3gubW91c2Vkb3duKGZ1bmN0aW9uKGUpIHsKCQkJaWYgKGUud2hpY2ggPT0gMykgewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpCgkJCQltb3ZpZV9ib3guY3NzKCJjdXJzb3IiLCAibW92ZSIpOwoJCQkJdmFyIHBvc2l0aW9uRGl2ID0gJCh0aGlzKS5vZmZzZXQoKTsKCQkJCXZhciBkaXN0ZW5jZVggPSBlLnBhZ2VYIC0gcG9zaXRpb25EaXYubGVmdDsKCQkJCXZhciBkaXN0ZW5jZVkgPSBlLnBhZ2VZIC0gcG9zaXRpb25EaXYudG9wOwoJCQkJCgkJCQkkKGRvY3VtZW50KS5tb3VzZW1vdmUoZnVuY3Rpb24oZSkgewoJCQkJCXZhciB4ID0gZS5wYWdlWCAtIGRpc3RlbmNlWDsKCQkJCQl2YXIgeSA9IGUucGFnZVkgLSBkaXN0ZW5jZVk7CgkJCQkJdmFyIHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CgkJCQkJdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCQkJCQkKCQkJCQlpZiAoeCA8IDApIHsKCQkJCQkJeCA9IDA7CgkJCQkJfSBlbHNlIGlmICh4ID4gIHdpbmRvd1dpZHRoLSBtb3ZpZV9ib3gub3V0ZXJXaWR0aCh0cnVlKSAtIDEwMCkgewoJCQkJCQl4ID0gd2luZG93V2lkdGggLSBtb3ZpZV9ib3gub3V0ZXJXaWR0aCh0cnVlKSAtIDEwMDsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKHkgPCAwKSB7CgkJCQkJCXkgPSAwOwoJCQkJCX0gZWxzZSBpZiAoeSA+IHdpbmRvd0hlaWdodCAtIG1vdmllX2JveC5vdXRlckhlaWdodCh0cnVlKSkgewoJCQkJCQl5ID0gd2luZG93SGVpZ2h0IC0gbW92aWVfYm94Lm91dGVySGVpZ2h0KHRydWUpOwoJCQkJCX0KCQkJCQltb3ZpZV9ib3guY3NzKCJsZWZ0IiwgeCk7CgkJCQkJbW92aWVfYm94LmNzcygidG9wIiwgeSk7CgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgiUG9zaXRpb25fIiArIHdpbmRvdy5sb2NhdGlvbi5ob3N0LHsgImxlZnQiOngsICJ0b3AiOnl9KTsKCQkJCX0pOwoJCQkJJChkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbigpIHsKCQkJCQkkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZScpOwoJCQkJCW1vdmllX2JveC5jc3MoImN1cnNvciIsICJwb2ludGVyIik7CgkJCQl9KTsKCQkJCSQoZG9jdW1lbnQpLmNvbnRleHRtZW51KGZ1bmN0aW9uKGUpIHsKCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQl9KQoJCQl9CgkJfSk7Cgl9OwoJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfaXFpeWkgPSBmdW5jdGlvbigpewoJCQoJfSwKCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX3ZxcSA9IGZ1bmN0aW9uKCl7CgoJfSwKCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX3lvdWt1ID0gZnVuY3Rpb24oKXsKCQkKCX0sCgl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja19tZ3R2ID0gZnVuY3Rpb24oKXsKCQkKCX0sCgl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja19zb2h1ID0gZnVuY3Rpb24oKXsKCQkKCX0sCgl0aGlzLnJlbW92ZVZpZGVvQWRCbG9jayA9IGZ1bmN0aW9uKCl7CgkJY29uc3QgY3VycmVudEhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQlpZihjdXJyZW50SG9zdC5pbmRleE9mKCJ3d3cuaXFpeWkuY29tIikhPS0xKXsKCQkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfaXFpeWkoKTsKCQl9ZWxzZSBpZihjdXJyZW50SG9zdC5pbmRleE9mKCJ2LnFxLmNvbSIpIT0tMSl7CgkJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX3ZxcSgpOwoJCX1lbHNlIGlmKGN1cnJlbnRIb3N0LmluZGV4T2YoInYueW91a3UuY29tIikhPS0xKXsKCQkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfeW91a3UoKTsKCQl9ZWxzZSBpZihjdXJyZW50SG9zdC5pbmRleE9mKCJ3d3cubWd0di5jb20iKSE9LTEpewoJCQl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja19tZ3R2KCk7CgkJfWVsc2UgaWYoY3VycmVudEhvc3QuaW5kZXhPZigidHYuc29odS5jb20iKSE9LTEpewoJCQl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja19zb2h1KCk7CgkJfQoJfTsKCXRoaXMuc2hvd1NldGluZ0RpYWxvZyA9IGZ1bmN0aW9uKCl7CgkJY29uc3QgdGhhdCA9IHRoaXM7CgkJdmFyIGN1c3RvbUludGVyZmFjZUtleSA9IHRoYXQuY3VzdG9tSW50ZXJmYWNlS2V5OwoJCXZhciBjdXN0b21JbnRlcmZhY2UgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKGN1c3RvbUludGVyZmFjZUtleSwgIiIpOwoJCQoJCXZhciBjb250ZW50ID0gYAoJCQk8ZGl2PgoJCQkJPGRpdiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMwMDA7Ij7oh6rlrprkuYnop6PmnpDmjqXlj6M8L2Rpdj4KCQkJCTxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnJlZDsiPgkJCQkJCgkJCQkJ5pWw5o2u5qC85byP77yaW+WQjeWtl10gKyBbLF0gKyBb5o6l5Y+j5Zyw5Z2AXTxicj4KCQkJCQnkvovlpoLvvJrlsLHmmK/lkI3lrZfogIzlt7IsaHR0cHM6Ly94eHh4eHg/dXJsPTxicj4KCQkJCQnms6jvvJrkuIDooYzkuIDkuKoKCQkJCTwvZGl2PgoJCQkJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7aGVpZ2h0OjIwMHB4O3dpZHRoOjEwMCU7Ij4KCQkJCQk8dGV4dGFyZWEgCgkJCQkJCXBsYWNlaG9sZGVyPSLor7fkuKXmoLzmjInnhafmoLzlvI/loavlhpnvvIzlkKbliJnkuI3nlJ/mlYgiCgkJCQkJCWNsYXNzPSJjdXN0b20taW50ZXJmYWNlLXRleHRhcmVhIgoJCQkJCQlzdHlsZT0iY29sb3I6IzAwMDtmb250LXNpemU6MTRweDtib3gtc2l6aW5nOiBib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDstbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7cGFkZGluZzo1cHg7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtPdmVyZmxvdzphdXRvO2JvcmRlcjoxcHggc29saWQgI2NjYztyZXNpemU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7b3V0bGluZTpub25lOyI+YCtjdXN0b21JbnRlcmZhY2UrYDwvdGV4dGFyZWE+CgkJCQk8L2Rpdj4KCQkJCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTVweDsiPgoJCQkJCTxidXR0b24gY2xhc3M9InNhdmUtY3VzdG9tLWludGVyZmFjZS1idG4iIHN0eWxlPSJjb2xvcjojMDAwO2N1cnNvcjpwb2ludGVyOyI+5L+d5a2Y6Ieq5a6a5LmJ5o6l5Y+jPC9idXR0b24+CgkJCQk8L2Rpdj4KCQkJPC9kaXY+CgkJYDsKCQlwb3B1cC5kaWFsb2coewoJCQkidGl0bGUiOiLop6PmnpDmjqXlj6Pmt7vliqAiLAoJCQkiY29udGVudCI6Y29udGVudCwKCQkJIm9uQ29udGVudFJlYWR5IjpmdW5jdGlvbigkdGhhdCl7CgkJCQl2YXIgJHNhdmVDdXN0b21JbnRlcmZhY2VCdG4gPSAkdGhhdC5kaWFsb2dDb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi5zYXZlLWN1c3RvbS1pbnRlcmZhY2UtYnRuIik7CgkJCQkkc2F2ZUN1c3RvbUludGVyZmFjZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJdmFyICRjdXN0b21JbnRlcmZhY2VUZXh0YXJlYSA9ICR0aGF0LmRpYWxvZ0NvbnRlbnQucXVlcnlTZWxlY3RvcigiLmN1c3RvbS1pbnRlcmZhY2UtdGV4dGFyZWEiKTsKCQkJCQl2YXIgY29udGVudCA9ICRjdXN0b21JbnRlcmZhY2VUZXh0YXJlYS52YWx1ZTsKCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKGN1c3RvbUludGVyZmFjZUtleSwgY29udGVudCk7CgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi6Ieq5a6a5LmJ5o6l5Y+j5L+d5a2Y5oiQ5YqfIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJfSk7CgkJCX0KCQl9KQoJfQoJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CQkJCgkJbGV0IGRlbGF5VGltZU1zID0gMDsKCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKCJ3d3cuYmlsaWJpbGkuY29tIikhPS0xKXsKCQkJZGVsYXlUaW1lTXMgPSAyMjAwOwoJCX0KCQlzZXRUaW1lb3V0KCgpPT57CgkJCXRyeXsKCQkJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrKCk7CgkJCX1jYXRjaChlKXt9CgkJCXRyeXsKCQkJCXRoaXMuYW5hbHlzaXNDdXN0b21JbnRlcmZhY2UoKTsKCQkJCXRoaXMuYWRkSHRtbEVsZW1lbnRzKCk7CgkJCQl0aGlzLnJ1bkV2ZW50KCk7CgkJCX1jYXRjaChlKXt9CgkJfSwgZGVsYXlUaW1lTXMpOwoJfTsKfTsKCi8qKgogKiDnp7vliqjnq69WSVDop6PmnpAKICogQHBhcmFtIHtPYmplY3R9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdAogKi8KZnVuY3Rpb24gU3VwZXJWaWRlb0hlbHBlck1vYmlsZShvcmlnaW5hbEludGVyZmFjZUxpc3QpewoJdGhpcy5vcmlnaW5hbEludGVyZmFjZUxpc3QgPSBvcmlnaW5hbEludGVyZmFjZUxpc3Q7Cgl0aGlzLmVsZW1lbnRJZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMCkrIm1teCI7Cgl0aGlzLnF1aWNrbHlJbnRlcmZhY2VLZXkgPSAiY3VzdG9tX21vYmlsZV9xdWlja2x5X2ludGVyZmFjZV9rZXlfZGRkc2R4eGEiOwoJdGhpcy5kZWZhdWx0UXVpY2tseUludGVyZmFjZUluZGV4ID0gMjsKCXRoaXMucGxheWVyTm9kZXM9WwoJCXsidXJsIjoibS5pcWl5aS5jb20iLCAic2hvd05vZGUiOiIubS12aWRlby1wbGF5ZXItd3JhcCIsICJjb2xvciI6IiMwNUIwM0IifSwKCQl7InVybCI6Im0udi5xcS5jb20iLCAic2hvd05vZGUiOiIubW9kX3BsYXllciIsICJjb2xvciI6IiNGOTlEMzkifSwKCQl7InVybCI6Im0ueW91a3UuY29tIiwgInNob3dOb2RlIjoiLmg1LWRldGFpbC1wbGF5ZXIiLCAiY29sb3IiOiIjMDhCQUZEIn0sCgkJeyJ1cmwiOiJtLm1ndHYuY29tIiwgInNob3dOb2RlIjoiLnZpZGVvLWFyZWEiLCAiY29sb3IiOiIjRTk1OTA0In0KCV07Cgl0aGlzLmlzUnVuID0gZnVuY3Rpb24oKXsgLy/liKTmlq3mmK/lkKbov5DooYwKCQljb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJY29uc3QgdXJscyA9IFsibS5pcWl5aS5jb20iLCJtLnYucXEuY29tIiwibS55b3VrdS5jb20iLCAibS5tZ3R2LmNvbSIsICJtLmJpbGliaWxpLmNvbSJdOwoJCXZhciByZXN1bHQgPSBmYWxzZTsKCQlpZihob3N0LnN0YXJ0c1dpdGgoIm0uIikpeyAvL+aYr+enu+WKqOerr+aJp+ihjAoJCQlmb3IodmFyIGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKXsKCQkJCWlmKGhvc3QuaW5kZXhPZih1cmxzW2ldKSAhPSAtMSl7CgkJCQkJcmVzdWx0ID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gcmVzdWx0OwoJfTsKCXRoaXMuZ2V0d2luZG93RWxlbWVudCA9IGZ1bmN0aW9uKCl7CgkJdmFyIG5vZGVPYmplY3QgPSBudWxsOwoJCWZvcih2YXIgaSBpbiB0aGlzLnBsYXllck5vZGVzKSB7IC8v6I635b6X56qX5Y+jSUQKCQkJaWYgKHRoaXMucGxheWVyTm9kZXNbaV0udXJsID09IHdpbmRvdy5sb2NhdGlvbi5ob3N0KSB7CgkJCQlub2RlT2JqZWN0ID0gdGhpcy5wbGF5ZXJOb2Rlc1tpXTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiBub2RlT2JqZWN0OwoJfTsKCXRoaXMuZ2V0UXVpY2tseUludGVyZmFjZUluZGV4ID0gZnVuY3Rpb24oKXsKCQl2YXIgcXVpY2tseUludGVyZmFjZUluZGV4U3RyaW5nID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSh0aGlzLnF1aWNrbHlJbnRlcmZhY2VLZXksIiIpKyIiOwoJCXZhciBxdWlja2x5SW50ZXJmYWNlSW5kZXggPSB0aGlzLmRlZmF1bHRRdWlja2x5SW50ZXJmYWNlSW5kZXg7CgkJaWYoISFxdWlja2x5SW50ZXJmYWNlSW5kZXhTdHJpbmcpewoJCQlxdWlja2x5SW50ZXJmYWNlSW5kZXggPSBwYXJzZUludChxdWlja2x5SW50ZXJmYWNlSW5kZXhTdHJpbmcpOwoJCX0KCQlpZih0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdC5sZW5ndGgtMTxxdWlja2x5SW50ZXJmYWNlSW5kZXgpewoJCQlxdWlja2x5SW50ZXJmYWNlSW5kZXggPSB0aGlzLmRlZmF1bHRRdWlja2x5SW50ZXJmYWNlSW5kZXg7CgkJfQoJCXJldHVybiBxdWlja2x5SW50ZXJmYWNlSW5kZXg7Cgl9OwoJdGhpcy5hZGRIdG1sRWxlbWVudHMgPSBmdW5jdGlvbigpewoJCWxldCBub2RlT2JqZWN0ID0gdGhpcy5nZXR3aW5kb3dFbGVtZW50KCk7CgkJY29uc3QgcXVpY2tseUludGVyZmFjZUluZGV4ID0gdGhpcy5nZXRRdWlja2x5SW50ZXJmYWNlSW5kZXgoKTsKCQlpZighbm9kZU9iamVjdCkgcmV0dXJuOwoJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+ewoJCQljb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+ewoJCQkJY29uc3Qgbm9kZUVsZW1lbnRPYmplY3QgPSAkKG5vZGVPYmplY3Quc2hvd05vZGUpLCB0aGVtZUNvbG9yID0gbm9kZU9iamVjdC5jb2xvcjsKCQkJCQoJCQkJaWYobm9kZUVsZW1lbnRPYmplY3QubGVuZ3RoID09IDApIHJldHVybjsKCQkJCWNsZWFySW50ZXJ2YWwoZWxlbWVudEludGVydmFsKTsKCQkJCQkJCQkJCgkJCQkvL+a3u+WKoEhUTUwKCQkJCWxldCBjYXRlZ29yeV8xX2h0bWwgPSAiIjsKCQkJCXRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQkJaWYgKGl0ZW0uc2hvd1R5cGUgIT0gMSkgewoJCQkJCQl2YXIgc2VsZWN0ZWQgPSAiIjsKCQkJCQkJaWYoaW5kZXg9PXF1aWNrbHlJbnRlcmZhY2VJbmRleCl7CgkJCQkJCQlzZWxlY3RlZCA9ICJzZWxlY3RlZCI7CgkJCQkJCX0KCQkJCQkJY2F0ZWdvcnlfMV9odG1sICs9ICI8b3B0aW9uIHZhbHVlPSciK2l0ZW0udXJsKyInIGluZGV4PSciK2luZGV4KyInICIrc2VsZWN0ZWQrIj4iK2l0ZW0ubmFtZSsiPC9vcHRpb24+IjsKCQkJCQl9CgkJCQl9KTsKCQkJCXZhciBodG1sTW91bGQgPSBgCgkJCQkJPGRpdiBzdHlsZT0ibWFyZ2luOjE1cHggMTVweCA1MHB4IDE1cHg7cGFkZGluZzoxMHB4O2JhY2tncm91bmQtY29sb3I6YCt0aGVtZUNvbG9yK2A7Ym9yZGVyLXJhZGl1czo0cHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDogOTk5OTk5OTk5OTk5OTk5OTk5OTk5O2NvbG9yOiNGRkY7Ij4KCQkJCQkJCTxkaXYgc3R5bGU9ImZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgoJCQkJCQkJCTxzcGFuPumAieaLqeino+aekOaOpeWPozwvc3Bhbj4KCQkJCQkJCQk8c2VsZWN0IGlkPSJpbnRlcmZhY2Vfc2VsZWN0aW9uX2ArdGhpcy5lbGVtZW50SWQrYCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0ZGRjtwYWRkaW5nOiAwcHggMTBweDsiPgoJCQkJCQkJCQlgK2NhdGVnb3J5XzFfaHRtbCtgCgkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+CgkJCQkJCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9InN0YXJ0X2FuYWx5c2lzX291dGVyX2ArdGhpcy5lbGVtZW50SWQrYCIgc3R5bGU9ImJveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MTBweCAwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoxMHB4IDBweDt3aWR0aDoxMDAlO2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOiNGRkY7YmFja2dyb3VuZC1jb2xvcjojRjI1MDNGO2ZvbnQtc2l6ZToxNHB4OyI+56uZ5aSW6Kej5p6QPC9hPgoJCQkJCQkJPC9kaXY+CgkJCQkJCQk8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Zm9udC1zaXplOjEwcHg7Ij4KCQkJCQkJCQk8ZGl2PgoJCQkJCQkJCQnlhY3otKPnlLPmmI7vvJox44CBVklQ6KeG6aKR6Kej5p6Q5Lit5omA55So5Yiw55qE6Kej5p6Q5o6l5Y+j5YWo6YOo5pS26ZuG6Ieq5LqS6IGU572R77yI5rqQ56CB5Y+v6KeB77yJ77yM54mI5p2D6Zeu6aKY6K+36IGU57O755u45YWz6Kej5p6Q5o6l5Y+j5omA5pyJ6ICF77yBCgkJCQkJCQkJCTLjgIHkuLrliJvpgKDoia/lpb3nmoTliJvkvZzmsJvlm7TvvIzor7flpKflrrbmlK/mjIHmraPniYjvvIEKCQkJCQkJCQkJM+OAgeiEmuacrOS7hemZkOS4quS6uuWtpuS5oOS6pOa1ge+8jOWIh+WLv+eUqOS6juS7u+S9leWVhuS4muetieWFtuWug+eUqOmAlO+8gQoJCQkJCQkJCQk044CB57un57ut5L2/55So77yM5Y2z6KGo5piO5L2g5bey57uP5piO56Gu5L2/55So6ISa5pys5Y+v6IO95bim5p2l55qE6aOO6Zmp77yM5LiU5oS/5oSP6Ieq6KGM5om/5ouF55u45YWz6aOO6Zmp77yM5a+55LqO6aOO6Zmp6ISa5pys5LiN5om/5ouF5Lu75L2V6LSj5Lu777yBCgkJCQkJCQkJPC9kaXY+CgkJCQkJCQk8L2Rpdj4KCQkJCQk8L2Rpdj4KCQkJCWA7CgkJCQlub2RlRWxlbWVudE9iamVjdC5hZnRlcihodG1sTW91bGQpOwoJCQkJcmVzb2x2ZSgib2siKTsKCQkJfSwgMTAwKTsKCQl9KTsKCX07Cgl0aGlzLmdldFBsYXlPYmplY3RCeVNlbGVjdCA9IGZ1bmN0aW9uKCl7CgkJCgkJdmFyIGluZGV4U3RyaW5nID0gJCgiI2ludGVyZmFjZV9zZWxlY3Rpb25fIit0aGlzLmVsZW1lbnRJZCkuZmluZCgib3B0aW9uOnNlbGVjdGVkIikuYXR0cigiaW5kZXgiKTsKCQl2YXIgaW5kZXggPSAwOwoJCWlmKCEhaW5kZXhTdHJpbmcpewoJCQlpbmRleCA9IHBhcnNlSW50KGluZGV4U3RyaW5nKTsKCQl9CgkJcmV0dXJuIHRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0W2luZGV4XTsKCX07Cgl0aGlzLnJ1bkV2ZW50ID0gZnVuY3Rpb24oKXsJIC8v5LqL5Lu26L+Q6KGMCgkJY29uc3Qgc2VsZiA9IHRoaXM7CgoJCS8v5Yid5aeL5YyWCgkJdmFyIHBsYXlPYmplY3QgPSBzZWxmLmdldFBsYXlPYmplY3RCeVNlbGVjdCgpOwoJCSQoJyNzdGFydF9hbmFseXNpc19vdXRlcl8nK3NlbGYuZWxlbWVudElkKS5hdHRyKCJocmVmIiwgcGxheU9iamVjdC51cmwgKyB3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJJCgnI3N0YXJ0X2FuYWx5c2lzX291dGVyXycrc2VsZi5lbGVtZW50SWQpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CgkJCWlmKGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUoImNvcHlyaWdodF92aWRlb19yZW1pbmRfbW9iaWxlX291dGVyIixudWxsKT09PSJ0cnVlIil7CgkJCQkKCQkJfWVsc2V7CgkJCQl2YXIgcj1jb25maXJtKAoJCQkJCSLohJrmnKzov5DooYzmj5DphpLvvIHvvIHvvIFcdTAwMGQiKwoJCQkJCSLkvb/nlKjnq5nlpJbop6PmnpDlip/og73vvIzop4bpopHop6PmnpDml7bohJrmnKzot7Plh7rmnKzpobXpnaLvvIzlpoLkuI3lkIzmhI/mraTohJrmnKzooYzkuLrvvIzor7fngrnlh7vjgJDlj5bmtojjgJHmjInpkq7vvIHvvIEiCgkJCQkpOwoJCQkJaWYocj09ZmFsc2UpewoJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCX1lbHNlewoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoImNvcHlyaWdodF92aWRlb19yZW1pbmRfbW9iaWxlX291dGVyIiwidHJ1ZSIpOwoJCQkJfQoJCQl9CgkJfSk7CgkJLy/mjqXlj6PliIfmjaIKCQkkKCcjaW50ZXJmYWNlX3NlbGVjdGlvbl8nK3NlbGYuZWxlbWVudElkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewoJCQl2YXIgJG9wdGlvbiA9ICQodGhpcykuZmluZCgib3B0aW9uOnNlbGVjdGVkIik7CgkJCXZhciB2YWx1ZSA9ICRvcHRpb24udmFsKCk7CgkJCXZhciBpbmRleCA9IHBhcnNlSW50KCRvcHRpb24uYXR0cigiaW5kZXgiKSk7CgkJCSQoJyNzdGFydF9hbmFseXNpc19vdXRlcl8nK3NlbGYuZWxlbWVudElkKS5hdHRyKCJocmVmIiwgdmFsdWUrd2luZG93LmxvY2F0aW9uLmhyZWYpOwoJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKHNlbGYucXVpY2tseUludGVyZmFjZUtleSwgaW5kZXgpOwoJCX0pOwoJfTsKCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWlmKHRoaXMuaXNSdW4oKSl7CgkJCXRoaXMuYWRkSHRtbEVsZW1lbnRzKCkudGhlbigoKT0+ewoJCQkJc2VsZi5ydW5FdmVudCgpOwoJCQl9KTsKCQl9Cgl9Cn0KdHJ5ewoJbGV0IG5ld09yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdDsKCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIgfHwgZnVuY3Rpb25Db250cm9sbGVyLnN1cGVyVmlkZW9IZWxwZXIpewoJCWNvbnN0IHN1cGVyVmlkZW9IZWxwZXJPYmplY3QgPSBuZXcgU3VwZXJWaWRlb0hlbHBlcihuZXdPcmlnaW5hbEludGVyZmFjZUxpc3QpOwoJCWlmKHN1cGVyVmlkZW9IZWxwZXJPYmplY3QuaXNSdW4oKSl7CgkJCWlmKGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUoImNvcHlyaWdodF92aWRlb19yZW1pbmQiLG51bGwpPT09InRydWUiKXsKCQkJCXN1cGVyVmlkZW9IZWxwZXJPYmplY3Quc3RhcnQoKTsKCQkJfWVsc2V7CgkJCQl2YXIgcj1jb25maXJtKAoJCQkJCSLohJrmnKzov5DooYzmj5DphpLvvIHvvIHvvIFcdTAwMGQiKwoJCQkJCSIx44CBVklQ6KeG6aKR6Kej5p6Q5Lit5omA55So5Yiw55qE6Kej5p6Q5o6l5Y+j5YWo6YOo5pS26ZuG6Ieq5LqS6IGU572R77yI5rqQ56CB5Y+v6KeB77yJ77yM54mI5p2D6Zeu6aKY6K+36IGU57O755u45YWz6Kej5p6Q5o6l5Y+j5omA5pyJ6ICF77yBXHUwMDBkIisKCQkJCQkiMuOAgeS4uuWIm+mAoOiJr+WlveeahOWIm+S9nOawm+WbtO+8jOivt+Wkp+WutuaUr+aMgeato+eJiO+8gVx1MDAwZCIrCgkJCQkJIjPjgIHohJrmnKzku4XpmZDkuKrkurrlrabkuaDkuqTmtYHvvIzliIfli7/nlKjkuo7ku7vkvZXllYbkuJrnrYnlhbblroPnlKjpgJTvvIFcdTAwMGQiKwoJCQkJCSI044CB57un57ut5L2/55So77yM5Y2z6KGo5piO5L2g5bey57uP5piO56Gu5L2/55So6ISa5pys5Y+v6IO95bim5p2l55qE6aOO6Zmp77yM5LiU5oS/5oSP6Ieq6KGM5om/5ouF55u45YWz6aOO6Zmp77yM5a+55LqO6aOO6Zmp6ISa5pys5LiN5om/5ouF5Lu75L2V6LSj5Lu777yBXHUwMDBkIisKCQkJCQkiNeOAgeatpOaPkOmGkuWPquW8ueWHuuS4gOasoe+8jOehruiupOWQju+8jOWQjue7reWwhuS4jeWcqOW8ueWHuu+8jOivt+efpeaCie+8gSIKCQkJCSk7CgkJCQlpZihyPT10cnVlKXsKCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCJjb3B5cmlnaHRfdmlkZW9fcmVtaW5kIiwidHJ1ZSIpOwoJCQkJCXN1cGVyVmlkZW9IZWxwZXJPYmplY3Quc3RhcnQoKTsKCQkJCX0KCQkJfQoJCX0KCQkobmV3IFN1cGVyVmlkZW9IZWxwZXJNb2JpbGUobmV3T3JpZ2luYWxJbnRlcmZhY2VMaXN0KSkuc3RhcnQoKTsKCX0KfWNhdGNoKGUpewoJY29uc29sZS5sb2coIuWFqOe9kVZJUOino+aekO+8mmVycm9y77yaIitlKTsKfQoJCgkvKioKICogQuermeebuOWFs+WKn+iDve+8muinhumikeWkmlDkuIvovb3vvIzkuIDplK7kuInogZTvvIzmtY/op4jorrDlvZXnrYkKICovCmZ1bmN0aW9uIEJpbGliaWxpSGVscGVyKCl7Cgl0aGlzLmlzUnVuID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gd2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigiYmlsaWJpbGkuY29tIikgIT0gLTEKCX0KCXRoaXMuYmFzZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXsKCQkvKioKCQkgKiBi56uZ5Z+65pys5Yqf6IO977yM5LiA5Lu25LiJ6L+e44CB6KeG6aKR6Kej5p6Q44CB6KeG6aKR5LiL6L29CgkJICovIAoJCWZ1bmN0aW9uIGJhc2VGdW5jdGlvbk9iamVjdCgpewoJCQl0aGlzLmVsZW1lbnRJZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMCkrIm1teCI7CgkJCXRoaXMuZG93bmxvYWRTZXR0aW5nS2V5ID0gImRvd25sb2FkX3NldHRpbmdfa2V5IjsKCQkJdGhpcy5kb3dubG9hZFJlc3V0RXJyb3I9ZnVuY3Rpb24oYnRuRWxlbWVudCl7CgkJCQlidG5FbGVtZW50LnRleHQoIuS4i+i9veinhumikS/lsIHpnaIsIOWHuueOsOmUmeivr++8geeCueWHu+mHjeivlSIpOwoJCQkJYnRuRWxlbWVudC5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwoJCQl9OwoJCQl0aGlzLmRvd25sb2FkUmVzdXRTdWNjZXNzPWZ1bmN0aW9uKGJ0bkVsZW1lbnQpewoJCQkJYnRuRWxlbWVudC50ZXh0KCLkuIvovb3op4bpopEv5bCB6Z2i77yI5pyA6auY5riF77yJIik7CgkJCQlidG5FbGVtZW50LnJlbW92ZUF0dHIoImRpc2FibGVkIik7CgkJCX07CgkJCXRoaXMuZ2V0RG93bmxvYWRQYWdlcyA9IGZ1bmN0aW9uKCl7CgkJCQlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CgkJCQkJdmFyIHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBidiA9IG51bGw7CgkJCQkJaWYgKHBhdGhuYW1lLmluZGV4T2YoIi9tZWRpYWxpc3QvcGxheS93YXRjaGxhdGVyLyIpICE9IC0xKSB7IC8vIOWcqOS4i+i9veinhumikeeahOaXtuWAmemSiOWvueeojeWQjuWGjeeci+mhtemdoueahOmTvuaOpeaJvkJW5Y+3CgkJCQkJCWJ2ID0gcGF0aG5hbWUucmVwbGFjZSgiL21lZGlhbGlzdC9wbGF5L3dhdGNobGF0ZXIvIiwiIikucmVwbGFjZSgiLyIsIiIpOwoJCQkJCX1lbHNlewoJCQkJCQlidiA9IHBhdGhuYW1lLnJlcGxhY2UoIi92aWRlby8iLCIiKS5yZXBsYWNlKCIvIiwiIik7CgkJCQkJfQoJCQkJCWlmKCFidil7CgkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJidl9udWxsIn0pOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCS8vYnbovaxhdgoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LnJlcXVlc3QoImdldCIsICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YnZpZD0iK2J2LCBudWxsKS50aGVuKChyZXN1bHREYXRhKT0+ewoJCQkJCQlsZXQgZGF0YUpzb24gPSBKU09OLnBhcnNlKHJlc3VsdERhdGEuZGF0YSk7CgkJCQkJCWlmKCFkYXRhSnNvbiB8fCBkYXRhSnNvbi5jb2RlIT09MCB8fCAhZGF0YUpzb24uZGF0YSl7CgkJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoicmVxdWVzdF9lcnJvciJ9KTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJbGV0IGRhdGEgPSBkYXRhSnNvbi5kYXRhOwoJCQkJCQlpZighZGF0YSl7CgkJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoiYWlkX251bGwifSk7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJCgkJCQkJCWxldCBhaWQgPSBkYXRhLmFpZDsKCQkJCQkJbGV0IHBpYyA9IGRhdGEucGljOwoJCQkJCQlsZXQgdGl0bGUgPSBkYXRhLnRpdGxlCgkJCQkJCWlmKCFhaWQpewoJCQkJCQkJcmVzb2x2ZSh7InN0YXR1cyI6ImFpZF9udWxsIn0pOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvL+iOt+WPlmNpZAoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5yZXF1ZXN0KCJnZXQiLCAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3P2FpZD0iK2FpZCwgbnVsbCkudGhlbigocmVzdWx0RGF0YTIpPT57CgkJCQkJCQlsZXQgZGF0YUpzb24yID0gSlNPTi5wYXJzZShyZXN1bHREYXRhMi5kYXRhKTsKCQkJCQkJCWlmKCFkYXRhSnNvbjIgfHwgZGF0YUpzb24yLmNvZGUhPT0wIHx8ICFkYXRhSnNvbjIuZGF0YSl7CgkJCQkJCQkJcmVzb2x2ZSh7InN0YXR1cyI6InJlcXVlc3RfZXJyb3IifSk7CgkJCQkJCQkJcmV0dXJuOwoJCQkJCQkJfQoJCQkJCQkJY29uc3QgZG93bmxvYWREYXRhID0gZGF0YUpzb24yLmRhdGE7CgkJCQkJCQljb25zdCB7YWlkLCAgYnZpZH0gPSBkb3dubG9hZERhdGEsCgkJCQkJCQkJaXRlbXMgPSBuZXcgQXJyYXkoKTsKCQkJCQkJCS8v6L+Z5piv5LiL6L296ZuG5ZCICgkJCQkJCQlpZihkb3dubG9hZERhdGEuaGFzT3duUHJvcGVydHkoInVnY19zZWFzb24iKSAmJiBkb3dubG9hZERhdGEudWdjX3NlYXNvbi5oYXNPd25Qcm9wZXJ0eSgic2VjdGlvbnMiKSl7CgkJCQkJCQkJbGV0IHNlY3Rpb25zID0gZG93bmxvYWREYXRhLnVnY19zZWFzb24uc2VjdGlvbnM7CgkJCQkJCQkJbGV0IHBhZ2UgPSAxOwoJCQkJCQkJCWZvcih2YXIgaT0wOyBpPHNlY3Rpb25zLmxlbmd0aDsgaSsrKXsKCQkJCQkJCQkJbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tpXTsKCQkJCQkJCQkJaWYoc2VjdGlvbi5oYXNPd25Qcm9wZXJ0eSgiZXBpc29kZXMiKSl7CgkJCQkJCQkJCQlmb3IodmFyIGo9MDsgajxzZWN0aW9uLmVwaXNvZGVzLmxlbmd0aDsgaisrKXsKCQkJCQkJCQkJCQlsZXQgZXBpc29kZSA9IHNlY3Rpb24uZXBpc29kZXNbal07CgkJCQkJCQkJCQkJaXRlbXMucHVzaCh7CgkJCQkJCQkJCQkJCSJjb3ZlciI6IiIsCgkJCQkJCQkJCQkJCSJwYWdlIjpwYWdlLAoJCQkJCQkJCQkJCQkidGl0bGUiOmVwaXNvZGUudGl0bGUsCgkJCQkJCQkJCQkJCSJjaWQiOmVwaXNvZGUuY2lkLAoJCQkJCQkJCQkJCQkiYWlkIjplcGlzb2RlLmFpZAoJCQkJCQkJCQkJCX0pOwoJCQkJCQkJCQkJCXBhZ2UrKzsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX1lbHNleyAvL+i/meaYr+WkmlDkuIvovb0KCQkJCQkJCQlmb3IodmFyIGk9MDsgaTxkb3dubG9hZERhdGEucGFnZXMubGVuZ3RoOyBpKyspewoJCQkJCQkJCQlsZXQgcGFnZURhdGEgPSBkb3dubG9hZERhdGEucGFnZXNbaV07CgkJCQkJCQkJCWl0ZW1zLnB1c2goewoJCQkJCQkJCQkJImNvdmVyIjpwYWdlRGF0YS5maXJzdF9mcmFtZSwKCQkJCQkJCQkJCSJwYWdlIjpwYWdlRGF0YS5wYWdlLAoJCQkJCQkJCQkJInRpdGxlIjpwYWdlRGF0YS5wYXJ0LAoJCQkJCQkJCQkJImNpZCI6cGFnZURhdGEuY2lkLAoJCQkJCQkJCQkJImFpZCI6YWlkCgkJCQkJCQkJCX0pOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJzdWNjZXNzIiwgImRvd25sb2FkRGF0YSI6ewoJCQkJCQkJCSJpdGVtcyI6aXRlbXMsCgkJCQkJCQkJInBpYyI6cGljLAoJCQkJCQkJCSJ0aXRsZSI6dGl0bGUKCQkJCQkJCX19KTsKCQkJCQkJfSkuY2F0Y2goKGVycm9yRGF0YSk9PnsKCQkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJyZXF1ZXN0X2Vycm9yIn0pOwoJCQkJCQl9KTsKCQkJCQl9KS5jYXRjaCgoZXJyb3JEYXRhKT0+ewoJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoicmVxdWVzdF9lcnJvciJ9KTsKCQkJCQl9KTsKCQkJCX0pOwoJCQl9OwoJCQl0aGlzLnN0YXJ0RG93bmxvYWRGaWxlID0gZnVuY3Rpb24ob3B0aW9ucyl7CgkJCQlsZXQgYWlkID0gb3B0aW9ucy5haWQsIGNpZCA9IG9wdGlvbnMuY2lkLCBmaWxlTmFtZSA9IG9wdGlvbnMuZmlsZU5hbWUsIAoJCQkJCXNhdmVQYXRoID0gb3B0aW9ucy5zYXZlUGF0aCwgUlBDVVJMID0gb3B0aW9ucy5SUENVUkwsIFJQQ1Rva2VuID0gb3B0aW9ucy5SUENUb2tlbjsKCQkJCWxldCBpc0J5UFJDID0gb3B0aW9ucy5pc0J5UFJDOwoJCQkJCgkJCQljb21tb25GdW5jdGlvbk9iamVjdC5yZXF1ZXN0KCJnZXQiLCAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvcGxheWVyL3BsYXl1cmw/YXZpZD0iK2FpZCsiJmNpZD0iK2NpZCsiJnFuPTExMiIsIG51bGwpLnRoZW4oKHJlc3VsdERhdGEzKT0+ewoJCQkJCQoJCQkJCWlmKCFmaWxlTmFtZSl7CgkJCQkJCWZpbGVOYW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSArICIiOwoJCQkJCX0KCQkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoL1tcIHxcfnxcYHxcPXxcfHxcXHxcO3xcOnxcInxcJ3xcLHxcLnxcPnxcL10vZywiIik7CgkJCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCw1MCk7IC8v5Y+v6IO95pyJ5byC5bi477yM5qCH6aKY5pyA5aSaNTDlrZfnrKYKCQkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lICsgIi5tcDQiOwoJCQkJCQoJCQkJCWxldCBkYXRhSnNvbjMgPSBKU09OLnBhcnNlKHJlc3VsdERhdGEzLmRhdGEpOwoJCQkJCWlmKCEhZGF0YUpzb24zICYmIGRhdGFKc29uMy5jb2RlPT09MCAmJiAhIWRhdGFKc29uMy5kYXRhKXsKCQkJCQkJbGV0IGRvd25sb2FkVXJsID0gZGF0YUpzb24zLmRhdGEuZHVybFswXS51cmw7CgkJCQkJCWlmKGlzQnlQUkMpewoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuUlBDRG93bmxvYWRGaWxlKGZpbGVOYW1lLCBkb3dubG9hZFVybCwgc2F2ZVBhdGgsIFJQQ1VSTCkudGhlbigoZGF0YSk9PnsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOmRhdGEsICJ0aW1lIjozMDAwfSk7CgkJCQkJCQl9KS5jYXRjaCgoZGF0YSk9PnsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOmRhdGEsICJ0aW1lIjozMDAwfSk7CgkJCQkJCQl9KTsKCQkJCQkJfWVsc2V7CgkJCQkJCQl3aW5kb3cub3Blbihkb3dubG9hZFVybCk7CgkJCQkJCX0KCQkJCQl9ZWxzZXsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi6I635Y+W5LiL6L296ZO+5o6l5aSx6LSlIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCX0KCQkJCX0pLmNhdGNoKChlcnJvckRhdGEpPT57CgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi6I635Y+W5LiL6L296ZO+5o6l5aSx6LSlIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJfSk7CgkJCX07CgkJCXRoaXMuY3JlYXRlTW9kYWxzID0gZnVuY3Rpb24oKXsKCQkJCXZhciBjc3MgPSBgCgkJCQkJLm1vZGFsLW1hc2stYCt0aGlzLmVsZW1lbnRJZCtgewoJCQkJCQlwb3NpdGlvbjpmaXhlZDsKCQkJCQkJdG9wOjA7CgkJCQkJCWxlZnQ6MDsKCQkJCQkJei1pbmRleDo5OTk7CgkJCQkJCXdpZHRoOjEwMCU7CgkJCQkJCWhlaWdodDoxMDAlOwoJCQkJCQlkaXNwbGF5Om5vbmU7CgkJCQkJCWJhY2tncm91bmQtY29sb3I6IzAwMDsKCQkJCQkJb3BhY2l0eTowLjM7CgkJCQkJCW92ZXJmbG93OmhpZGRlbjsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgewoJCQkJCQlwb3NpdGlvbjpmaXhlZDsKCQkJCQkJYm9yZGVyLXJhZGl1czo1cHg7CgkJCQkJCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CgkJCQkJCXRvcDoxMCU7CgkJCQkJCXdpZHRoOjYwMHB4OwoJCQkJCQltYXgtd2lkdGg6OTAlOwoJCQkJCQltYXgtaGVpZ2h0OjgwJTsKCQkJCQkJei1pbmRleDoxMDAwOwoJCQkJCQlsZWZ0OiA1MCU7CgkJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCQkJZGlzcGxheTpub25lOwoJCQkJCQlwYWRkaW5nOiAxMHB4OwoJCQkJCQlvdmVyZmxvdy15OiBhdXRvOwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWhlYWRlcnsKCQkJCQkJaGVpZ2h0OjMwcHg7CgkJCQkJCWxpbmUtaGVpZ2h0OjMwcHg7CgkJCQkJCXBvc2l0aW9uOnJlbGF0aXZlOwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWhlYWRlciA+c3BhbnsKCQkJCQkJZGlzcGxheTppbmxpbmUtYmxvY2s7CgkJCQkJfQoJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCA+LnBhZ2UtaGVhZGVyID5zcGFuOm50aC1jaGlsZCgxKSB7CgkJCQkJCWZvbnQtc2l6ZToxOHB4OwoJCQkJCQlmb250LXdlaWdodDpib2xkOwoJCQkJCQlwb3NpdGlvbjphYnNvbHV0ZTsKCQkJCQkJbGVmdDoxMHB4OwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWhlYWRlciA+c3BhbjpudGgtY2hpbGQoMikgewoJCQkJCQlmb250LXNpemU6MjhweDsKCQkJCQkJZm9udC13ZWlnaHQ6Ym9sZDsKCQkJCQkJcG9zaXRpb246YWJzb2x1dGU7CgkJCQkJCXJpZ2h0OjEwcHg7CgkJCQkJCWN1cnNvcjpwb2ludGVyOwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWNvbnRhaW5lcnsKCQkJCQkJbWF4LWhlaWdodDogNTAwcHg7CgkJCQkJCW92ZXJmbG93LXk6IGF1dG87CgkJCQkJfQoJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCAucGFnZS13cmFwewoJCQkJCQlkaXNwbGF5OiBmbGV4OwoJCQkJCQlmbGV4LXdyYXA6IHdyYXA7CgkJCQkJCW1hcmdpbi10b3A6NXB4OwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnBhZ2Utd3JhcCA+LmJvYXJkLWl0ZW17CgkJCQkJCWRpc3BsYXk6IGJsb2NrOwoJCQkJCQl3aWR0aDogY2FsYyg1MCUgLSAxMHB4KTsKCQkJCQkJYmFja2dyb3VuZC1jb2xvcjogIzZBNUY2MDsKCQkJCQkJbWFyZ2luOiA1cHg7CgkJCQkJCWJhY2tncm91bmQtY29sb3I6I0ZCNzI5OTsKCQkJCQkJY29sb3I6I0ZGRkZGRjsKCQkJCQkJY3Vyc29yOiBwb2ludGVyOwoJCQkJCQlvdmVyZmxvdzpoaWRkZW47CgkJCQkJCXdoaXRlLXNwYWNlOm5vd3JhcDsKCQkJCQkJdGV4dC1vdmVyZmxvdzplbGxpcHNpczsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5wYWdlLXdyYXAgPi5ib2FyZC1pdGVtID5pbnB1dHsKCQkJCQkJd2lkdGg6IDE0cHg7CgkJCQkJCWhlaWdodDogMTRweDsKCQkJCQkJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJCQkJbWFyZ2luLXJpZ2h0OjVweDsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5wYWdlLXdyYXAgPi5ib2FyZC1pdGVtID5zcGFuewoJCQkJCQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLm1vZGFsLWJ0bi13cmFwewoJCQkJCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJCQkJCW1hcmdpbi10b3A6IDEwcHg7CgkJCQkJCWN1cnNvcjogcG9pbnRlcjsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5hcmlhMi1zZXR0aW5newoJCQkJCQlib3JkZXI6MXB4IGRhc2hlZCAjRjFGMUYxOwoJCQkJCQlib3JkZXItcmFkaXVzOjRweDsKCQkJCQkJbWFyZ2luLXRvcDoxMHB4OwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLmFyaWEyLXNldHRpbmcgPi5zZXR0aW5nLWl0ZW17CgkJCQkJCXRleHQtYWxpZ246IGNlbnRlcjsKCQkJCQkJZm9udC1zaXplOjE0cHg7CgkJCQkJCW1hcmdpbjoxMHB4IDBweDsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5hcmlhMi1zZXR0aW5nID4uc2V0dGluZy1pdGVtIC50b3BpYy1uYW1lewoJCQkJCQlkaXNwbGF5OmlubGluZS1ibG9jazsKCQkJCQkJd2lkdGg6ODBweDsKCQkJCQkJdGV4dC1hbGlnbjpsZWZ0OwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLmFyaWEyLXNldHRpbmcgPi5zZXR0aW5nLWl0ZW0+IGlucHV0ewoJCQkJCQl3aWR0aDozMDBweDsKCQkJCQkJcGFkZGluZy1sZWZ0OjEwcHg7CgkJCQkJCWJvcmRlcjoxcHggc29saWQgIzg4ODsKCQkJCQkJb3V0bGluZTpub25lOwoJCQkJCQlib3JkZXItcmFkaXVzOjNweDsKCQkJCQl9CgkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5tb2RhbC1idG4td3JhcCA+c3BhbnsKCQkJCQkJYm9yZGVyOjFweCBzb2xpZCAjY2NjOwoJCQkJCQlkaXNwbGF5OmlubGluZS1ibG9jazsKCQkJCQkJcGFkZGluZzozcHggNXB4OwoJCQkJCQltYXJnaW46MHB4IDVweDsKCQkJCQkJYm9yZGVyLXJhZGl1czozcHg7CgkJCQkJfQoJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCAudGlwLXdyYXB7CgkJCQkJCW1hcmdpbi10b3A6IDEwcHg7CgkJCQkJCWZvbnQtc2l6ZToxMnB4OwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnRpcC13cmFwID4udGl0bGV7CgkJCQkJCWZvbnQtc2l6ZToxNnB4OwoJCQkJCQlmb250LXdlaWdodDpib2xkOwoJCQkJCX0KCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnRpcC13cmFwID4uY29udGVudCA+dWwgPmxpewoJCQkJCQltYXJnaW4tdG9wOjVweDsKCQkJCQl9CgkJCQlgOwoJCQkJCQkJCQkKCQkJCXZhciBodG1sID0gYAoJCQkJCTxkaXYgY2xhc3M9J21vZGFsLW1hc2stYCt0aGlzLmVsZW1lbnRJZCtgJz48L2Rpdj4KCQkJCQk8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCTxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIj4KCQkJCQkJCTxzcGFuPuinhumikeS4i+i9vSjlj6/mibnph48pPC9zcGFuPgoJCQkJCQkJPHNwYW4gY2xhc3M9ImNsb3NlIj7Dlzwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9InBhZ2UtY29udGFpbmVyIj4KCQkJCQkJCTxsYWJlbCBzdHlsZT0iY29sb3I6cmVkOyI+5rOo77ya5q2k5Yqf6IO95Lya6LCD55SoYmlsaWJpbGnnmoRBUEnvvIzohJrmnKzku4XnlKjkuo7kuKrkurrkuqTmtYHvvIzliIfli7/nlKjkuo7llYbkuJrnlKjpgJTvvIzlkKbliJnlkI7mnpzoh6rotJ/vvIznibnmraTnlLPmmI7vvIE8L2xhYmVsPgoJCQkJCQkJPGRpdiBjbGFzcz0icGFnZS13cmFwIj4KCQkJCQkJCTwvZGl2PgoJCQkJCQkJPGRpdiBjbGFzcz0iYXJpYTItc2V0dGluZyI+CgkJCQkJCQkJPGRpdiBjbGFzcz0ic2V0dGluZy1pdGVtIj4KCQkJCQkJCQkJPHNwYW4+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJkb3dubG9hZFdheSIgdmFsdWU9Ik1vdHJpeCI+TW90cml45LiL6L29PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOwoJCQkJCQkJCQk8c3Bhbj48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImRvd25sb2FkV2F5IiB2YWx1ZT0iQXJpYU5nR1VJIj5BcmlhTmdHVUnkuIvovb08L3NwYW4+CgkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJPGRpdiBjbGFzcz0ic2V0dGluZy1pdGVtIj4KCQkJCQkJCQkJPGxhYmVsIGNsYXNzPSJ0b3BpYy1uYW1lIj7phY3nva5SUEM6PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUlBDVVJMIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0i6K+35YeG56Gu6L6T5YWlUlBD5a+55bqU6L2v5Lu255qE5Zyw5Z2A77yM6buY6K6k77yaTW90cml4Ij4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJzZXR0aW5nLWl0ZW0iPgoJCQkJCQkJCQk8bGFiZWwgY2xhc3M9InRvcGljLW5hbWUiPumFjee9rlRva2VuOjwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJQQ1Rva2VuIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0i6buY6K6k5peg6ZyA5aGr5YaZIj4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJzZXR0aW5nLWl0ZW0iPgoJCQkJCQkJCQk8bGFiZWwgY2xhc3M9InRvcGljLW5hbWUiPuS/neWtmOi3r+W+hDo8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzYXZlUGF0aCIgdmFsdWU9IiIgcGxhY2Vob2xkZXI9Iuivt+WHhuehrui+k+WFpeaWh+S7tuS/neWtmOi3r+W+hCI+CgkJCQkJCQkJCTxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM4ODg7Ij7mnIDlpb3oh6rlrprkuYnkuIvovb3lnLDlnYDvvIzpu5jorqTlnLDlnYDlj6/og73kuI3mu6HotrPpnIDopoE8L2Rpdj4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCTwvZGl2PgoJCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWwtYnRuLXdyYXAiPgoJCQkJCQkJCTxzcGFuIG5hbWU9InNlbGVjdGFsbCI+5YWo6YCJPC9zcGFuPgoJCQkJCQkJCTxzcGFuIG5hbWU9InJlbW92ZVNlbGVjdCI+5Y+W5raI6YCJ5oupPC9zcGFuPgoJCQkJCQkJCTxzcGFuIG5hbWU9ImRvd25sb2FkQWxsIj7mibnph4/kuIvovb08L3NwYW4+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJCTxkaXYgY2xhc3M9InRpcC13cmFwIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+5YWz5LqO5Y2VUOS4i+i9ve+8mjwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9ImNvbnRlbnQiPjxzcGFuPueCueWHu+W8ueahhuWNleS4qumAiembhu+8jOWNs+WPr+S4i+i9veWNlembhuinhumike+8gVBTOuWNlVDkuIvovb3vvIzmjqjojZDlpKflrrbkvb/nlKhCQkRvd27kuIvovb3vvIzmraTlt6Xlhbflip/og73lvojlvLrlpKfvvIzlhbfkvZPmn6XnnIvvvJo8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25pbGFvZGEvQkJEb3duIj5odHRwczovL2dpdGh1Yi5jb20vbmlsYW9kYS9CQkRvd248L2E+PC9zcGFuPjwvZGl2PgoJCQkJCQkJPC9kaXY+CgkJCQkJCQk8ZGl2IGNsYXNzPSJ0aXAtd3JhcCI+CgkJCQkJCQkJPGRpdiBjbGFzcz0idGl0bGUiPuWFs+S6juaJuemHj+S4i+i9ve+8mjwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCQkJCQkJCQk8dWw+CgkJCQkJCQkJCQk8bGk+CgkJCQkJCQkJCQkJPGI+MeOAgeaJuemHj+S4i+i9vemcgOimgeesrOS4ieaWuei9r+S7tueahOaUr+aMge+8jOiEmuacrOaOqOiNkOS9v+eUqO+8mk1vdHJpeDwvYj4KCQkJCQkJCQkJCQk8dWw+CgkJCQkJCQkJCQkJCTxsaT5Nb3RyaXjkuIvovb3lnLDlnYDvvJo8YSBocmVmPSJodHRwczovL21vdHJpeC5hcHAvemgtQ04vIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9tb3RyaXguYXBwL3poLUNOLzwvYT48L2xpPgoJCQkJCQkJCQkJCQk8bGk+QXJpYU5nR1VJ5LiL6L295Zyw5Z2A77yaPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1htYWRlci9hcmlhLW5nLWd1aSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9YbWFkZXIvYXJpYS1uZy1ndWk8L2E+PC9saT4KCQkJCQkJCQkJCQk8L3VsPgoJCQkJCQkJCQkJPC9saT4KCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQk8Yj4y44CB5Zyo5om56YeP5LiL6L295YmN6ZyA6KaB5o+Q5YmN5omT5byA6L2v5Lu277yM5pys5pWZ56iL5LulTW90cml45Li65YeGPC9iPgoJCQkJCQkJCQkJCTx1bD4KCQkJCQkJCQkJCQkJPGxpPigxKeOAgeWmguaenOWFqOmDqOaMieeFp+m7mOiupOmFjee9ru+8jOWPqumcgOimgeaJk+W8gOi9r+S7tuWNs+WPrzwvbGk+CgkJCQkJCQkJCQkJCTxsaT4oMinjgIHlpoLmnpzmg7Poh6rlrprkuYlSUEPlnLDlnYDlkozmlofku7bkv53lrZjot6/lvoTvvIzlj6/mm7TmlLnkuIrpnaLovpPlhaXmoYbnmoTlhoXlrrnvvIjmraTmlbDmja7pnZ7luLjph43opoHvvIzor7flh4bnoa7loavlhpnvvIk8L2xpPgoJCQkJCQkJCQkJCQk8bGk+CgkJCQkJCQkJCQkJCSgzKeOAgU1vdHJpeOi/kOihjOWbvueJhwoJCQkJCQkJCQkJCQk8aW1nIHNyYz0iaHR0cHM6Ly9waWMucm1iLmJkc3RhdGljLmNvbS9iamgvODkxMjU4MmMwNDE2MTE5NDA1ZWMzN2VhMjdkMTIzNzYuanBlZyIgd2lkdGg9IjEwMCUiIC8+CgkJCQkJCQkJCQkJCTwvbGk+CgkJCQkJCQkJCQkJPC91aT4KCQkJCQkJCQkJCTwvbGk+CgkJCQkJCQkJCQk8bGk+CgkJCQkJCQkJCQkJPGI+M+OAgem7mOiupFJQQ+m7mOiupOWcsOWdgDwvYj4KCQkJCQkJCQkJCQk8dWw+CgkJCQkJCQkJCQkJCTxsaT4oMSnjgIFNb3RyaXggUlBD6buY6K6k5Zyw5Z2A77yad3M6Ly9sb2NhbGhvc3Q6MTY4MDAvanNvbnJwYzwvbGk+CgkJCQkJCQkJCQkJCTxsaT4oMinjgIFBcmlhMiBSUEPpu5jorqTlnLDlnYDvvJp3czovL2xvY2FsaG9zdDo2ODAwL2pzb25ycGM8L2xpPgoJCQkJCQkJCQkJCQk8bGk+KDMp54K55Ye74oCc5om56YeP5LiL6L295Lya6Ieq5Yqo5L+d5a2Y5b2T5YmN5LiL6L296K6+572u4oCdPC9saT4KCQkJCQkJCQkJCQk8L3VsPgoJCQkJCQkJCQkJPC9saT4KCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQk8Yj4044CB5aaC5L2/55SoQXJpYU5nR1VJ77yM5L2/55So5pa55byP57G75Ly877yM5aSn5a625Y+v5Lul6Ieq6KGM56CU56m2PC9iPgoJCQkJCQkJCQkJPC9saT4KCQkJCQkJCQkJPC91bD4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCTwvZGl2PgoJCQkJCQkJPGRpdiBjbGFzcz0idGlwLXdyYXAiPgoJCQkJCQkJCTxkaXYgY2xhc3M9InRpdGxlIj7lv4XopoHor7TmmI7vvJo8L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQkJCQkJCQkJ55Sz5piO77ya5pys5Yqf6IO95LuF6IO95L2c5Li65a2m5Lmg5Lqk5rWB5L2/55So77yM5LiU5LiN5Y+v55So5LqO5YW25a6D55So6YCU77yM5ZCm5YiZ5ZCO5p6c6Ieq6LSf44CC6K+35aSn5a626YeN6KeG54mI5p2D77yM5bCK6YeN5Yib5L2c6ICF77yM5YiH5Yu/5pCs6L+Q5oqE6KKt44CC6K+35aSn5a625aSa55SoW+S4gOmUruS4iei/nl3kuLrliJvkvZzogIXmipXluIF+77yM5bCP56C056uZ54mb5o6w77yBCgkJCQkJCQkJPC9kaXY+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgkJCQlgOwoJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01hZGRTdHlsZShjc3MpOwoJCQkJJCgiYm9keSIpLmFwcGVuZChodG1sKTsKCQkJfTsKCQkJdGhpcy5oaWRlTW9kYWxzID0gZnVuY3Rpb24oKXsKCQkJCSQoIi5tb2RhbC1ib2R5LSIrdGhpcy5lbGVtZW50SWQrIiIpLmNzcygnZGlzcGxheScsJ25vbmUnKTsKCQkJCSQoIi5tb2RhbC1tYXNrLSIrdGhpcy5lbGVtZW50SWQrIiIpLmNzcygnZGlzcGxheScsJ25vbmUnKTsKCQkJfTsKCQkJdGhpcy5zaG93TW9kYWxzID0gZnVuY3Rpb24ocGFnZUh0bWwpewoJCQkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJCQljb25zdCBkb3dubG9hZFNldHRpbmdLZXkgPSBzZWxmLmRvd25sb2FkU2V0dGluZ0tleTsKCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiIpLmNzcygnZGlzcGxheScsJ2Jsb2NrJyk7CgkJCQkkKCIubW9kYWwtbWFzay0iK3NlbGYuZWxlbWVudElkKyIiKS5jc3MoJ2Rpc3BsYXknLCdibG9jaycpOwoJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAiKS5odG1sKHBhZ2VIdG1sKTsKCQkJCQoJCQkJLy/liJ3lp4vljJborr7nva7nmoTmlbDmja4KCQkJCXZhciBzYXZlUGF0aCA9ICJEOi8iOwoJCQkJaWYoIm1hY09TIj09PWNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldFN5c3RlbU9TKCkpewoJCQkJCXNhdmVQYXRoID0gIiIKCQkJCX0KCQkJCWNvbnN0IGRvd25sb2FkU2V0dGluZyA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUodGhpcy5kb3dubG9hZFNldHRpbmdLZXksIAoJCQkJCXsiUlBDVVJMIjoid3M6Ly9sb2NhbGhvc3Q6MTY4MDAvanNvbnJwYyIsIAoJCQkJCSJzYXZlUGF0aCI6c2F2ZVBhdGgsCgkJCQkJIlJQQ1Rva2VuIjonJywgImRvd25sb2FkV2F5IjoiTW90cml4In0pOwoJCQkJY29uc3QgaXNNb3RyaXggPSBkb3dubG9hZFNldHRpbmcuZG93bmxvYWRXYXk9PSJNb3RyaXgiOwoJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J1JQQ1VSTCddIikudmFsKGRvd25sb2FkU2V0dGluZy5SUENVUkwpOwoJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J3NhdmVQYXRoJ10iKS52YWwoZG93bmxvYWRTZXR0aW5nLnNhdmVQYXRoKTsKCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dFtuYW1lPSdSUENUb2tlbiddIikudmFsKGRvd25sb2FkU2V0dGluZy5SUENUb2tlbik7CgkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgaW5wdXRbbmFtZT0nZG93bmxvYWRXYXknXSIpLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKCQkJCWlmKGlzTW90cml4KXsKCQkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgaW5wdXQ6cmFkaW9bdmFsdWU9J01vdHJpeCddIikuYXR0cignY2hlY2tlZCcsJ3RydWUnKTsKCQkJCX1lbHNlewoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dDpyYWRpb1t2YWx1ZT0nQXJpYU5nR1VJJ10iKS5hdHRyKCdjaGVja2VkJywndHJ1ZScpOwoJCQkJfQoJCQkJCgkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLnBhZ2Utd3JhcCA+LmJvYXJkLWl0ZW0gPnNwYW4iKS5vZmYoImNsaWNrIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkkKHRoaXMpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIiNjY2MiKTsKCQkJCQlsZXQgZG93bmxvYWRPcHRpb25zPXsKCQkJCQkJImFpZCI6JCh0aGlzKS5kYXRhKCJhaWQiKSwKCQkJCQkJImNpZCI6JCh0aGlzKS5kYXRhKCJjaWQiKSwKCQkJCQkJImlzQnlQUkMiOmZhbHNlCgkJCQkJfQoJCQkJCXNlbGYuc3RhcnREb3dubG9hZEZpbGUoZG93bmxvYWRPcHRpb25zKTsKCQkJCX0pOwoJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLWhlYWRlciA+c3Bhbi5jbG9zZSIpLm9mZigiY2xpY2siKS5vbigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCXNlbGYuaGlkZU1vZGFscygpOwoJCQkJfSk7CgkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLm1vZGFsLWJ0bi13cmFwID5zcGFuW25hbWU9J3NlbGVjdGFsbCddIikub2ZmKCJjbGljayIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAiKS5maW5kKCJpbnB1dFt0eXBlPSdjaGVja2JveCddIikuZWFjaChmdW5jdGlvbigpewoJCQkJCQkkKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKCQkJCQl9KTsKCQkJCX0pOwoJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J2Rvd25sb2FkV2F5J10iKS5vZmYoImNoYW5nZSIpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpewoJCQkJCWlmKCQodGhpcykudmFsKCk9PSJNb3RyaXgiKXsKCQkJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J1JQQ1VSTCddIikudmFsKCJ3czovL2xvY2FsaG9zdDoxNjgwMC9qc29ucnBjIik7CgkJCQkJfWVsc2V7CgkJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dFtuYW1lPSdSUENVUkwnXSIpLnZhbCgid3M6Ly9sb2NhbGhvc3Q6NjgwMC9qc29ucnBjIik7CgkJCQkJfQoJCQkJfSk7CgkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLm1vZGFsLWJ0bi13cmFwID5zcGFuW25hbWU9J3JlbW92ZVNlbGVjdCddIikub2ZmKCJjbGljayIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAiKS5maW5kKCJpbnB1dFt0eXBlPSdjaGVja2JveCddIikuZWFjaChmdW5jdGlvbigpewoJCQkJCQkkKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgkJCQkJfSk7CgkJCQl9KTsKCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiAubW9kYWwtYnRuLXdyYXAgPnNwYW5bbmFtZT0nZG93bmxvYWRBbGwnXSIpLm9mZigiY2xpY2siKS5vbigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCWxldCBSUENVUkwgPSAkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgaW5wdXRbbmFtZT0nUlBDVVJMJ10iKS52YWwoKTsKCQkJCQlsZXQgc2F2ZVBhdGggPSAkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgaW5wdXRbbmFtZT0nc2F2ZVBhdGgnXSIpLnZhbCgpOwoJCQkJCWxldCBSUENUb2tlbiA9ICQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dFtuYW1lPSdSUENUb2tlbiddIikudmFsKCk7CgkJCQkJbGV0IGRvd25sb2FkV2F5ID0gJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J2Rvd25sb2FkV2F5J106Y2hlY2tlZCIpLnZhbCgpOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoZG93bmxvYWRTZXR0aW5nS2V5LHsiUlBDVVJMIjpSUENVUkwsICJzYXZlUGF0aCI6c2F2ZVBhdGgsIAoJCQkJCQkiUlBDVG9rZW4iOlJQQ1Rva2VuLCAiZG93bmxvYWRXYXkiOmRvd25sb2FkV2F5fSk7CgkJCQkJCQoJCQkJCWxldCBpbnB1dEVsZW1lbnRzID0gJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXTpjaGVja2VkIik7CgkJCQkJaWYoaW5wdXRFbGVtZW50cy5sZW5ndGggPT0gMCl7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiHs+WwkemcgOimgemAieS4rTFQIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCQkJCQkJCQoJCQkJCWlmKCFzYXZlUGF0aCl7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuS/neWtmOi3r+W+hOS4jeiDveS4uuepuiIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQlpZighUlBDVVJMKXsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoiUFJD5Zyw5Z2A5LiN6IO95Li656m6IiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCVJQQ1Rva2VuID0gIVJQQ1Rva2VuID8gIiIgOiBSUENUb2tlbjsKCQkJCQlsZXQgZG93bmxvYWRPcHRpb25zID0gewoJCQkJCQkiYWlkIjoiIiwKCQkJCQkJImNpZCI6IiIsCgkJCQkJCSJpc0J5UFJDIjp0cnVlLAoJCQkJCQkiZmlsZU5hbWUiOiIiLAoJCQkJCQkic2F2ZVBhdGgiOnNhdmVQYXRoLAoJCQkJCQkiUlBDVVJMIjpSUENVUkwsCgkJCQkJCSJSUENUb2tlbiI6UlBDVG9rZW4KCQkJCQl9CgkJCQkJaW5wdXRFbGVtZW50cy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJCXNldFRpbWVvdXQoKCk9PnsKCQkJCQkJCWxldCBhaWQ9JCh0aGlzKS5kYXRhKCJhaWQiKSwgY2lkID0gJCh0aGlzKS5kYXRhKCJjaWQiKSwgZmlsZU5hbWUgPSAkKHRoaXMpLmF0dHIoInRpdGxlIik7CgkJCQkJCQlkb3dubG9hZE9wdGlvbnMuYWlkID0gYWlkOwoJCQkJCQkJZG93bmxvYWRPcHRpb25zLmNpZCA9IGNpZDsKCQkJCQkJCWRvd25sb2FkT3B0aW9ucy5maWxlTmFtZSA9IGZpbGVOYW1lOwoJCQkJCQkJc2VsZi5zdGFydERvd25sb2FkRmlsZShkb3dubG9hZE9wdGlvbnMpOwoJCQkJCQl9LCAxMDAwKTsKCQkJCQl9KQoJCQkJfSk7CgkJCX07CgkJCXRoaXMuY3JlYXRlRWxlbWVudEh0bWwgPSBhc3luYyBmdW5jdGlvbigpewoJCQkJLy/pppblhYjliKTmlq3pobXpnaLmmK/lkKbliqDovb3lrozlhagKCQkJCWxldCB2aWRlb0NvbnRhaW5lciA9IGF3YWl0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVsZW1lbnRPYmplY3QoIi50b3RhbC1yZXBseSIpOwoJCQkJaWYoIXZpZGVvQ29udGFpbmVyKXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkKCIjYmlsaWJpbGlfZXh0aV85Nzg3ZmpmaDEyaiIpLnJlbW92ZSgpOwoJCQkJCgkJCQljb25zdCByYW5kb21OdW1iZXIgPSB0aGlzLmVsZW1lbnRJZCwgc2VsZiA9IHRoaXM7CgkJCQlsZXQgY3NzVGV4dCA9IGAKCQkJCQkjYmlsaWJpbGlfZXh0aV85Nzg3ZmpmaDEyansKCQkJCQkJcGFkZGluZzoxMHB4OwoJCQkJCX0KCQkJCQkjYmlsaWJpbGlfZXh0aV85Nzg3ZmpmaDEyaiA+LnNlbGZfc19idG57CgkJCQkJCWJhY2tncm91bmQtY29sb3I6I0ZCNzI5OTsKCQkJCQkJY29sb3I6I0ZGRjsKCQkJCQkJZm9udC1zaXplOjEwcHg7CgkJCQkJCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJCQkJCQltYXJnaW4tcmlnaHQ6MTVweDsKCQkJCQkJcGFkZGluZzoycHggNHB4OwoJCQkJCQlib3JkZXItcmFkaXVzOjNweDsKCQkJCQkJY3Vyc29yOnBvaW50ZXI7CgkJCQkJfQoJCQkJYDsKCQkJCWxldCBodG1sVGV4dD1gCgkJCQkJPGRpdiBpZD0iYmlsaWJpbGlfZXh0aV85Nzg3ZmpmaDEyaiI+CgkJCQkJCTxzcGFuIGNsYXNzPSJzZWxmX3NfYnRuIiBpZD0iZG93bmxvYWRfc19gK3JhbmRvbU51bWJlcitgIj7kuIvovb3op4bpopEv5bCB6Z2i77yI5pyA6auY5riF77yJPC9zcGFuPgoJCQkJCQk8c3BhbiBjbGFzcz0ic2VsZl9zX2J0biIgaWQ9ImZvY3VzX3NfYCtyYW5kb21OdW1iZXIrYCI+5LiA6ZSu5LiJ6L+ePC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJYDsKCQkJCQoJCQkJLy/mt7vliqDkuIvovb3nrYnmk43kvZzmjInpkq4JCgkJCQlsZXQgJHZpZXdib3hSZXBvcnQgPSAkKCIjcGxheWVyV3JhcCIpOwoJCQkJaWYoJCgiI2ZvY3VzX3NfIityYW5kb21OdW1iZXIpLmxlbmd0aD09MCAmJiAkdmlld2JveFJlcG9ydC5sZW5ndGghPTApewoJCQkJCSQoImJvZHkiKS5wcmVwZW5kKCI8c3R5bGU+Iitjc3NUZXh0KyI8L3N0eWxlPiIpOwoJCQkJCSR2aWV3Ym94UmVwb3J0LmFmdGVyKGh0bWxUZXh0KTsKCQkJCX0KCQkJCQoJCQkJLy/liJvlu7rlvLnmoYYKCQkJCXRoaXMuY3JlYXRlTW9kYWxzKCk7CgkJCQkKCQkJCS8v5LiL6L295pON5L2c5Ye95pWwCgkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiNkb3dubG9hZF9zXyIrcmFuZG9tTnVtYmVyLCBmdW5jdGlvbigpewoJCQkJCWNvbnN0IGJ0bkVsZW1lbnQgPSAkKHRoaXMpOwoJCQkJCWJ0bkVsZW1lbnQuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKCQkJCQlidG5FbGVtZW50LnRleHQoIuS4i+i9veinhumikS/lsIHpnaLvvIjlh4blpIfkuK3vvIkiKTsKCQkJCQkvL+W8gOWni+WHhuWkh+S4i+i9veaVsOaNrgoJCQkJCXNlbGYuZ2V0RG93bmxvYWRQYWdlcygpLnRoZW4oKHJlc3VsZSk9PnsKCQkJCQkJaWYocmVzdWxlLnN0YXR1cz09PSJzdWNjZXNzIil7CgkJCQkJCQljb25zdCB7aXRlbXMsIHBpYywgdGl0bGV9ID0gcmVzdWxlLmRvd25sb2FkRGF0YTsKCQkJCQkJCWxldCBpdGVtSHRtbCA9ICIiOwoJCQkJCQkJaXRlbUh0bWwgKz0gIjxkaXYgc3R5bGU9J3dpZHRoOjEwMCU7Jz48YSBocmVmPSciK3BpYysiJyB0YXJnZXQ9J19ibGFuayc+5qCH6aKY77yaIit0aXRsZSsi77yI54K55oiR6Lez6L2s5bCB6Z2i77yJPC9hPjwvZGl2PiI7CgkJCQkJCQlmb3IodmFyIGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKyl7CgkJCQkJCQkJdmFyIGN1cnJlbnRUaXRsZSA9ICLjgJBQIitpdGVtc1tpXS5wYWdlKyLjgJEiK2l0ZW1zW2ldLnRpdGxlKyIiOwoJCQkJCQkJCWl0ZW1IdG1sICs9ICI8ZGl2IGNsYXNzPSdib2FyZC1pdGVtJz4iOwoJCQkJCQkJCWl0ZW1IdG1sICs9ICI8aW5wdXQgZGF0YS1haWQ9JyIraXRlbXNbaV0uYWlkKyInIGRhdGEtY2lkPSciK2l0ZW1zW2ldLmNpZCsiJyB0aXRsZT0nIitjdXJyZW50VGl0bGUrIicgdHlwZT0nY2hlY2tib3gnPiIKCQkJCQkJCQlpdGVtSHRtbCArPSAiPHNwYW4gZGF0YS1haWQ9JyIraXRlbXNbaV0uYWlkKyInIGRhdGEtY2lkPSciK2l0ZW1zW2ldLmNpZCsiJyB0aXRsZT0nIitjdXJyZW50VGl0bGUrIic+IitjdXJyZW50VGl0bGUrIjwvc3Bhbj4iOwoJCQkJCQkJCWl0ZW1IdG1sICs9ICI8L2Rpdj4iOwoJCQkJCQkJfQoJCQkJCQkJc2VsZi5zaG93TW9kYWxzKGl0ZW1IdG1sKTsKCQkJCQkJCXNlbGYuZG93bmxvYWRSZXN1dFN1Y2Nlc3MoYnRuRWxlbWVudCk7CgkJCQkJCX1lbHNlewoJCQkJCQkJc2VsZi5kb3dubG9hZFJlc3V0RXJyb3IoYnRuRWxlbWVudCk7CgkJCQkJCX0KCQkJCQl9KS5jYXRjaCgoZXJyb3IpPT57CgkJCQkJCXNlbGYuZG93bmxvYWRSZXN1dEVycm9yKGJ0bkVsZW1lbnQpOwoJCQkJCX0pOwoJCQkJfSk7CgkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiNmb2N1c19zXyIrcmFuZG9tTnVtYmVyLCBmdW5jdGlvbigpewoJCQkJCSQoIiNhcmNfdG9vbGJhcl9yZXBvcnQgLnZpZGVvLWxpa2UiKS5jbGljaygpOyAvLyDngrnotZ4KCQkJCQkkKCIjYXJjX3Rvb2xiYXJfcmVwb3J0IC52aWRlby1jb2luIikuY2xpY2soKTsgLy8g5oqV5biBCgkJCQkJLy8gJCgiI2FyY190b29sYmFyX3JlcG9ydCAudmlkZW8tZmF2IikuY2xpY2soKTsgLy8g5pS26JePCgkJCQl9KTsKCQkJfQoJCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJCWxldCBsb2NhdGlvbkhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdCwgbG9jYXRpb25QYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKCQkJCWlmKGxvY2F0aW9uSG9zdD09PSJ3d3cuYmlsaWJpbGkuY29tIiAmJiAobG9jYXRpb25QYXRobmFtZS5pbmRleE9mKCIvdmlkZW8iKSE9LTEgfHwgbG9jYXRpb25QYXRobmFtZS5pbmRleE9mKCIvd2F0Y2hsYXRlciIpIT0tMSkpewoJCQkJCXRoaXMuY3JlYXRlRWxlbWVudEh0bWwoKTsKCQkJCX0KCQkJfQoJCX0KCQl0cnl7CgkJCShuZXcgYmFzZUZ1bmN0aW9uT2JqZWN0KCkpLnN0YXJ0KCk7CgkJfWNhdGNoKGUpewoJCQljb25zb2xlLmxvZygiYmFzZUZ1bmN0aW9uT2JqZWN0IG5ldyBlcnJvciIsIGUpOwoJCX0KCX07CgkvKioKCSAqIOa1j+iniOWOhuWPsuiusOW9leaPkOmGkgoJICovCgl0aGlzLnJlY29yZFZpZXdGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7CgkJZnVuY3Rpb24gcmVjb3JkVmlld09iamVjdCgpewoJCQl0aGlzLmxvY2FsQ2FjaGVOYW1lID0gImJpbGliaWxpX3ZpZGVvX3JlY29yZCI7IAoJCQl0aGlzLnJlY29yZE9uZVZpZGVvID0gZnVuY3Rpb24oKXsKCQkJCWxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9PnsKCQkJCQlsZXQgYnYgPSBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRCaWxpYmlsaUJWKCk7CgkJCQkJbGV0IGNhY2hlVGV4dCA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUodGhpcy5sb2NhbENhY2hlTmFtZSk7CgkJCQkJY2FjaGVUZXh0ID0gIWNhY2hlVGV4dCA/ICIiIDogY2FjaGVUZXh0CgkJCQkJbGV0IG1heExlbmd0aCA9IDEyKjUwMDsKCQkJCQlsZXQgY3VycmVudExlbmd0aCA9IGNhY2hlVGV4dC5sZW5ndGg7CgkJCQkJaWYoY3VycmVudExlbmd0aCA+IG1heExlbmd0aCl7CgkJCQkJCWNhY2hlVGV4dCA9IGNhY2hlVGV4dC5zdWJzdHJpbmcoMTIqMTAwLCBjdXJyZW50TGVuZ3RoKTsKCQkJCQl9CgkJCQkJCgkJCQkJaWYoY2FjaGVUZXh0LmluZGV4T2YoYnYpPT0tMSl7CgkJCQkJCWNhY2hlVGV4dCArPSBidjsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSh0aGlzLmxvY2FsQ2FjaGVOYW1lLCBjYWNoZVRleHQpOwoJCQkJCX0KCQkJCQlyZXNvbHZlKHsicmVzdWx0Ijoic3VjY2VzcyJ9KTsKCQkJCX0pOwoJCQl9OwoJCQl0aGlzLnNlYXJjaFBhZ2VSZW1pbmRIdG1sID0gZnVuY3Rpb24oJGVsZSwgdG9wPTgsIHJpZ2h0PTgpewoJCQkJaWYoJGVsZS5maW5kKCJkaXZbbmFtZT0nbWFya2xvb2tlZCddIikubGVuZ3RoPT0wKXsJCQkJCQkKCQkJCQkkZWxlLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpOwoJCQkJCSRlbGUuYXBwZW5kKCI8ZGl2IG5hbWU9J21hcmtsb29rZWQnIHN0eWxlPSd6LWluZGV4OiAxMDA7cG9zaXRpb246YWJzb2x1dGU7IHRvcDoiK3RvcCsicHg7IHJpZ2h0OiIrcmlnaHQrInB4OyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1MSwxMjMsMTU5LDEpOyBib3JkZXItcmFkaXVzOjNweDsgZm9udC1zaXplOjEwcHg7IGNvbG9yOiNGRkY7cGFkZGluZzowcHggMnB4Oyc+5bey55yLPC9kaXY+Iik7CgkJCQl9CgkJCX07CgkJCXRoaXMuc2VhcmNoUGFnZVJlbWluZCA9IGZ1bmN0aW9uKCl7CgkJCQlsZXQgJHRoYXQgPSB0aGlzOwoJCQkJdmFyIGVsZW1lbnRBcnJheSA9IFsKCQkJCQl7Im5vZGUiOiIuYmlsaS12aWRlby1jYXJkIiwgInRvcCI6OCwgInJpZ2h0IjoxMn0sICAvL+WFvOWuuSBNQUMgTTHmkJzntKLnu5PmnpwKCQkJCQl7Im5vZGUiOiIjcGFnZS1pbmRleCAuc21hbGwtaXRlbSIsICJ0b3AiOjEyLCAicmlnaHQiOjEyfSwgIC8v55So5oi35oqV56i/CgkJCQkJeyJub2RlIjoiI3N1Ym1pdC12aWRlby1saXN0IC5zbWFsbC1pdGVtIiwgInRvcCI6MTIsICJyaWdodCI6MTJ9LCAvL+eUqOaIt+S4u+mhtQoJCQkJCXsibm9kZSI6IiNwYWdlLXNlcmllcy1kZXRhaWwgLnNtYWxsLWl0ZW0uZmFrZURhbm11LWl0ZW0iLCAidG9wIjoxMiwgInJpZ2h0IjoxMn0sIC8v55So5oi35Li76aG15oqV56i/CgkJCQldOwoJCQkJc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCQlsZXQgY2FjaGVUZXh0ID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgkdGhhdC5sb2NhbENhY2hlTmFtZSk7CgkJCQkJY2FjaGVUZXh0ID0gIWNhY2hlVGV4dCA/ICIiIDogY2FjaGVUZXh0OwoJCQkJCWZvcih2YXIgaT0wOyBpPGVsZW1lbnRBcnJheS5sZW5ndGg7IGkrKyl7CgkJCQkJCXZhciBlbGVtZW50b2JqID0gZWxlbWVudEFycmF5W2ldOwoJCQkJCQkkKGVsZW1lbnRvYmoubm9kZSkuZWFjaChmdW5jdGlvbigpewoJCQkJCQkJaWYoJCh0aGlzKS5hdHRyKCJkZWFseGxsIikhPT0idHJ1ZSIpewoJCQkJCQkJCXZhciB2aWRlb3VybCA9ICQodGhpcykuZmluZCgiYVtocmVmXj0nLy93d3cuYmlsaWJpbGkuY29tL3ZpZGVvJ10iKS5hdHRyKCJocmVmIik7CgkJCQkJCQkJaWYoISF2aWRlb3VybCl7CgkJCQkJCQkJCXZhciBidnMgPSB2aWRlb3VybC5tYXRjaCgvKFwvQlYoLio/KVwvKS9nKQoJCQkJCQkJCQlpZihidnMubGVuZ3RoPT0xKXsKCQkJCQkJCQkJCXZhciBidiA9IGJ2c1swXS5yZXBsYWNlKC9cLy9nLCIiKTsKCQkJCQkJCQkJCWlmKGNhY2hlVGV4dC5pbmRleE9mKGJ2KSAhPSAtMSl7CgkJCQkJCQkJCQkJJHRoYXQuc2VhcmNoUGFnZVJlbWluZEh0bWwoJCh0aGlzKSwgZWxlbWVudG9iai50b3AsIGVsZW1lbnRvYmoucmlnaHQpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJCh0aGlzKS51bmJpbmQoImNsaWNrIikuYmluZCgiY2xpY2siLCAoKT0+eyAgLy/lvqrnjq/mk43kvZzvvIzljZXni6znu5HlrpoKCQkJCQkJCQkJCQkkdGhhdC5zZWFyY2hQYWdlUmVtaW5kSHRtbCgkKHRoaXMpLCBlbGVtZW50b2JqLnRvcCwgZWxlbWVudG9iai5yaWdodCk7CgkJCQkJCQkJCQl9KQoJCQkJCQkJCQl9CgkJCQkJCQkJCSQodGhpcykuYXR0cigiZGVhbHhsbCIsInRydWUiKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0sIDUwMCk7CgkJCX0KCQkJdGhpcy5zdGFydD1mdW5jdGlvbigpewoJCQkJbGV0ICR0aGF0ID0gdGhpczsKCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvdmlkZW8iKSE9LTEgJiYgd2luZG93LmxvY2F0aW9uLmhvc3Q9PT0id3d3LmJpbGliaWxpLmNvbSIpewoJCQkJCWxldCBjdXJyZW50SHJlZiA9ICIiOwoJCQkJCXNldEludGVydmFsKCgpPT57IC8v6ZyA6KaB5b6q546v5a2Y5YKoCgkJCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBjdXJyZW50SHJlZil7CgkJCQkJCQl0aGlzLnJlY29yZE9uZVZpZGVvKCk7CgkJCQkJCQljdXJyZW50SHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJCQl9CgkJCQkJfSwgNTAwKTsKCQkJCX0KCQkJCS8v5pCc57Si57uT5p6c5ZKM55So5oi35Li76aG15bey57uP55yL6L+H55qE6KeG6aKR5o+Q6YaSCgkJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKCJiaWxpYmlsaS5jb20iKSE9LTEpewoJCQkJCXRoaXMuc2VhcmNoUGFnZVJlbWluZCgpOwoJCQkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIua4heepukLnq5nmtY/op4jorrDlvZUiLGZ1bmN0aW9uKCl7CgkJCQkJCWlmKGNvbmZpcm0oJ+aYr+WQpuimgea4heepukLnq5nmtY/op4jorrDlvZXvvJ/muIXnqbrlkI7lsIbkuI3lj6/mgaLlpI0uLi4nKSl7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCR0aGF0LmxvY2FsQ2FjaGVOYW1lLCAiIik7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfTsKCQl9CgkJdHJ5ewoJCQkobmV3IHJlY29yZFZpZXdPYmplY3QoKSkuc3RhcnQoKTsKCQl9Y2F0Y2goZSl7CgkJCWNvbnNvbGUubG9nKCJyZWNvcmRWaWV3T2JqZWN0IG5ldyBlcnJvciIsIGUpOwoJCX0KCX07CgkvKioKCSAqIOinhumikeaPj+i/sOaWh+acrOi9rOmTvuaOpQoJICovCgl0aGlzLnRleHRUb0xpbmtGdW5jdGlvbiA9IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIHRleHRUb0xpbmtPYmplY3QoKXsKCQkJdGhpcy5saW5rID0gZnVuY3Rpb24oYXJlYUVsZW1lbnRzKXsKCQkJCWNvbnN0IGN1cnJlbnRfaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJZm9yKGxldCBpPTA7IGk8YXJlYUVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKCQkJCQlsZXQgdGV4dFRvTGlua0FyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFyZWFFbGVtZW50c1tpXSk7CgkJCQkJaWYoIXRleHRUb0xpbmtBcmVhKXsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWZpbmRBbmRSZXBsYWNlRE9NVGV4dCh0ZXh0VG9MaW5rQXJlYSwgewoJCQkJCQlmaW5kOiAvKGh0dHB8ZnRwfGh0dHBzKTpcL1wvW1x3XC1fXSsoXC5bXHdcLV9dKykrKFtcd1wtXC4sQD9ePSUmYW1wOzovflwrI10qW1x3XC1cQD9ePSUmYW1wOy9+XCsjXSk/L2csCgkJCQkJCXJlcGxhY2U6IGZ1bmN0aW9uIChlLCB0KSB7CgkJCQkJCQlsZXQgdGV4dCA9IGUudGV4dDsKCQkJCQkJCWxldCBlbGVtZW50ID0gbnVsbDsKCQkJCQkJCWlmKHRleHQuaW5kZXhPZigiYmlsaWJpbGkuY29tIik9PS0xICYmIC9eKGh0dHB8ZnRwfGh0dHBzKS9pLnRlc3QodGV4dCkpewoJCQkJCQkJCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CgkJCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB0ZXh0KQoJCQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7CgkJCQkJCQkJZWxlbWVudC5zdHlsZS5jb2xvcj0iIzAwQUVFQyI7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQllbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwoJCQkJCQkJfQoJCQkJCQkJZWxlbWVudC5pbm5lclRleHQgPSB0ZXh0OwoJCQkJCQkJcmV0dXJuIGVsZW1lbnQ7CgkJCQkJCX0sIAoJCQkJCQlwcmVzZXQ6ICJwcm9zZSIKCQkJCQl9KTsKCQkJCX0KCQkJfQoJCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJCWNvbnN0IGFyZWFFbGVtZW50cyA9IFsiI3ZfZGVzYyIsICIjYXJ0aWNsZS1jb250ZW50Il07CgkJCQl0aGlzLmxpbmsoYXJlYUVsZW1lbnRzKTsKCQkJCWxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93Lk1vek11dGF0aW9uT2JzZXJ2ZXIKCQkJCWxldCBib2R5TXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpPT57CgkJCQkJdGhpcy5saW5rKGFyZWFFbGVtZW50cyk7CgkJCQl9KTsKCQkJCWxldCBvYnNlcnZlckVsZW1lbnRPYmogPSBudWxsOwoJCQkJZm9yKGxldCBpPTA7IGk8YXJlYUVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKCQkJCQlvYnNlcnZlckVsZW1lbnRPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFyZWFFbGVtZW50c1tpXSk7CgkJCQkJaWYob2JzZXJ2ZXJFbGVtZW50T2JqKXsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYob2JzZXJ2ZXJFbGVtZW50T2JqKXsKCQkJCQlib2R5TXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9ic2VydmVyRWxlbWVudE9iaiwgCgkJCQkJCXsiY2hhcmFjdGVyRGF0YSI6dHJ1ZSwiYXR0cmlidXRlcyI6dHJ1ZSwgImNoaWxkTGlzdCI6dHJ1ZX0sCgkJCQkJKTsKCQkJCX0KCQkJfQoJCX0KCQl0cnl7CgkJCShuZXcgdGV4dFRvTGlua09iamVjdCgpKS5zdGFydCgpOwoJCX1jYXRjaChlKXsKCQkJY29uc29sZS5sb2coInRleHRUb0xpbmtPYmplY3QgbmV3IGVycm9yIiwgZSk7CgkJfQoJfQoJdGhpcy5zaWduSW4gPSBhc3luYyBmdW5jdGlvbigpeyAvL0JsaWJpbGkg6Ieq5Yqo562+5YiwCgkJY29uc3QgbXlEYXRlID0gbmV3IERhdGUoKQoJCXZhciBjdXJyZW50RGF0ZSA9IG15RGF0ZS5nZXRGdWxsWWVhcigpKyItIisobXlEYXRlLmdldE1vbnRoKCkgKyAxKSArICItIitteURhdGUuZ2V0RGF0ZSgpOwoJCXZhciB0ZXh0ID0gIuS7iuaXpeW3suetviI7CgkJaWYoY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiYmlsaWJpbGlfc2lnbkluIiwgbnVsbCkgPT09IGN1cnJlbnREYXRlKXsgLy/lt7Lnu4/nrb7liLAKCQkJdGV4dCA9ICLku4rml6Xlt7Lnrb4iOwoJCX1lbHNlewoJCQl0cnl7CgkJCQljb25zdCByZXN1bHQgPSBhd2FpdCBjb21tb25GdW5jdGlvbk9iamVjdC5yZXF1ZXN0KCJHRVQiLCAiaHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vc2lnbi9kb1NpZ24iLCBudWxsKTsKCQkJCWlmKHJlc3VsdCAmJiByZXN1bHQucmVzdWx0PT0ic3VjY2VzcyIpewoJCQkJCWNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhKTsKCQkJCQlpZihqc29uLmhhc093blByb3BlcnR5KCJjb2RlIikpewoJCQkJCQljb25zdCBjb2RlID0ganNvbi5jb2RlOwoJCQkJCQlpZihjb2RlID09IC0xMDEpeyAvL+acqueZu+W9lQoJCQkJCQkJdGV4dCA9ICLmnKrnmbvlvZUiOwoJCQkJCQl9ZWxzZSBpZihjb2RlID09IDEwMTEwNDApey8v5bey57uP562+5Yiw5LqGCgkJCQkJCQl0ZXh0ID0gIuS7iuaXpeW3suetviI7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCJiaWxpYmlsaV9zaWduSW4iLCBjdXJyZW50RGF0ZSk7CgkJCQkJCX1lbHNlIGlmKGNvZGUgPT0gMCl7Ly/nrb7liLDmiJDlip8KCQkJCQkJCXRleHQgPSAi5LuK5pel5bey562+IjsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoImJpbGliaWxpX3NpZ25JbiIsIGN1cnJlbnREYXRlKTsKCQkJCQkJfWVsc2V7CgkJCQkJCQl0ZXh0ID0gIuetvuWIsOW8guW4uCI7CgkJCQkJCX0KCQkJCQl9ZWxzZXsKCQkJCQkJdGV4dCA9ICLnrb7liLDlvILluLgiOwoJCQkJCX0KCQkJCX0KCQkJfWNhdGNoKGUpewoJCQkJdGV4dCA9ICLnrb7liLDlh7rplJkiCgkJCX0KCQl9CgkJdmFyIGh0bWwgPSBgCgkJCTxkaXYgaWQ9ImJpbGliaWxpX3NpZ25JbiIgc3R5bGU9IndpZHRoOjEycHg7Zm9udC1zaXplOjEycHg7cG9zaXRpb246Zml4ZWQ7dG9wOjIwMHB4O2xlZnQ6MHB4O2JhY2tncm91bmQtY29sb3I6I0ZDOEJBQjtjb2xvcjojRkZGOyI+YCt0ZXh0K2A8L2Rpdj4KCQlgOwoJCSQoImJvZHkiKS5hcHBlbmQoaHRtbCk7Cgl9Cgl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQlpZih0aGlzLmlzUnVuKCkpewoJCQl0aGlzLmJhc2VGdW5jdGlvbigpOwoJCQl0aGlzLnJlY29yZFZpZXdGdW5jdGlvbigpOwoJCQl0aGlzLnRleHRUb0xpbmtGdW5jdGlvbigpOwoJCQl0aGlzLnNpZ25JbigpOwoJCX0KCX0KfQp0cnl7CglpZighZnVuY3Rpb25Db250cm9sbGVyIHx8IGZ1bmN0aW9uQ29udHJvbGxlci5iaWxpYmlsaUhlbHBlcil7CgkJbmV3IEJpbGliaWxpSGVscGVyKCkuc3RhcnQoKTsKCX0KfWNhdGNoKGUpewoJY29uc29sZS5sb2coIkLnq5nop4bpopHkuIvovb3vvJplcnJvcu+8miIrZSk7Cn0KCS8qKgogKiDnn6XkuY7liqnmiYvlvIDlp4sKICovCmZ1bmN0aW9uIFpoaWh1SGVscGVyKCl7Cgl0aGlzLm1hcmtBcnRpY2xlT3JRdWVzdGlvbiA9IGZ1bmN0aW9uKCl7CgkJdmFyIHF1ZXN0aW9uc0NzcyA9IGAKCQkJLkFuc3dlckl0ZW0gLkNvbnRlbnRJdGVtLXRpdGxlIGE6OmJlZm9yZSB7CgkJCQljb250ZW50OiAn6Zeu6aKYJzsKCQkJCWNvbG9yOiAjZjY4YjgzOwoJCQkJYmFja2dyb3VuZC1jb2xvcjogI2Y2OGI4MzMzOwoJCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCQlmb250LXNpemU6IDEzcHg7CgkJCQlwYWRkaW5nOiAxcHggNHB4IDBweDsKCQkJCWJvcmRlci1yYWRpdXM6IDJweDsKCQkJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQkJCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgkJCQltYXJnaW46IDBweCA0cHggMHB4IDBweDsKCQkJfQoJCQkuQXJ0aWNsZUl0ZW0gLkNvbnRlbnRJdGVtLXRpdGxlIGE6OmJlZm9yZSB7CgkJCQljb250ZW50OiAn5paH56ugJzsKCQkJCWNvbG9yOiAjMDA2NkZGOwoJCQkJYmFja2dyb3VuZC1jb2xvcjogI0U1RUZGRjsKCQkJCWZvbnQtd2VpZ2h0OiBib2xkOwoJCQkJZm9udC1zaXplOiAxM3B4OwoJCQkJcGFkZGluZzogMXB4IDRweCAwOwoJCQkJYm9yZGVyLXJhZGl1czogMnB4OwoJCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQkJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJCW1hcmdpbjogMHB4IDRweCAwcHggMHB4OwoJCQl9CgkJCS5admlkZW9JdGVtIC5Db250ZW50SXRlbS10aXRsZSBhOjpiZWZvcmUgewoJCQkJY29udGVudDon6KeG6aKRJzsKCQkJCWNvbG9yOiAjMDBCQ0Q0OwoJCQkJYmFja2dyb3VuZC1jb2xvcjogIzAwQkNENDMzOwoJCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCQlmb250LXNpemU6IDEzcHg7CgkJCQlwYWRkaW5nOiAxcHggNHB4IDA7CgkJCQlib3JkZXItcmFkaXVzOiAycHg7CgkJCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJCQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJCQkJbWFyZ2luOiAwcHggNHB4IDBweCAwcHg7CgkJCX0KCQkJLlRvcHN0b3J5SXRlbS0tYWR2ZXJ0Q2FyZHsKCQkJCXRleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7CgkJCX0KCQlgOwoJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNYWRkU3R5bGUocXVlc3Rpb25zQ3NzKTsKCX0KCXRoaXMuYXV0b0p1bXBUYXJnZXQgPSBmdW5jdGlvbigpewoJCXZhciByZWdleFJlc3VsdCA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvdGFyZ2V0PSguKz8pKCZ8JCkvKTsKCQlpZihyZWdleFJlc3VsdCAmJiByZWdleFJlc3VsdC5sZW5ndGg9PTMpewoJCQlsb2NhdGlvbi5ocmVmID0gZGVjb2RlVVJJQ29tcG9uZW50KHJlZ2V4UmVzdWx0WzFdKTsKCQl9Cgl9OwoJLy8g5Li66Zeu6aKY5pys6Lqr5re75Yqg5pe26Ze0Cgl0aGlzLmFkZERhdGVRdWVzdGlvbiA9IGZ1bmN0aW9uKCl7CgkJdmFyIHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLlF1ZXN0aW9uUGFnZSIpOwoJCWlmKCEhdGl0bGUpewoJCQl2YXIgZGF0ZUNyZWF0ZWQgPSB0aXRsZS5xdWVyeVNlbGVjdG9yKCJbaXRlbXByb3B+PWRhdGVDcmVhdGVkXVtjb250ZW50XSIpLmNvbnRlbnQ7CgkJCXZhciBkYXRlTW9kaWZpZWQgPSB0aXRsZS5xdWVyeVNlbGVjdG9yKCJbaXRlbXByb3B+PWRhdGVNb2RpZmllZF1bY29udGVudF0iKS5jb250ZW50OwoJCQl2YXIgY3JlYXRlRGF0ZSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkRhdGVGb3JtYXQobmV3IERhdGUoZGF0ZUNyZWF0ZWQpLCAieXl5eS1NTS1kZCBoaDptbTpzcyIpOwoJCQl2YXIgZWRpdERhdGUgPSBjb21tb25GdW5jdGlvbk9iamVjdC5EYXRlRm9ybWF0KG5ldyBEYXRlKGRhdGVNb2RpZmllZCksICJ5eXl5LU1NLWRkIGhoOm1tOnNzIik7CgkJCQoJCQl2YXIgc2lkZSA9IHRpdGxlLnF1ZXJ5U2VsZWN0b3IoIi5RdWVzdGlvbkhlYWRlci1zaWRlIik7CgkJCXZhciB0aW1lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgkJCXRpbWVEaXYuaW5uZXJIVE1MID0gYDxwPuWIm+W7uuS6jjombmJzcDske2NyZWF0ZURhdGV9PC9wPjxwPue8lui+keS6jjombmJzcDske2VkaXREYXRlfTwvcD5gOwoJCQl0aW1lRGl2LnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzZmNmY2Zjtmb250LXNpemU6MTNweDsnOwoJCQlzaWRlLmFwcGVuZENoaWxkKHRpbWVEaXYpOwoJCX0KCX07CgkvLyDkuLrlm57nrZTmt7vliqDml7bpl7QKCXRoaXMuYWRkVGltZUFuc3dlckl0ZW1zID0gZnVuY3Rpb24oKXsKCQl2YXIgbGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5BbnN3ZXJJdGVtOm5vdChkaXZbemhfZGF0ZV9taz0ndHJ1ZSddKSIpOwoJCXZhciBpdGVtID0gbnVsbDsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKCQkJaXRlbSA9IGxpc3RbaV07CgkJCWlmIChpdGVtLmdldEF0dHJpYnV0ZSgnemhfZGF0ZV9taycpID09PSAndHJ1ZScpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWl0ZW0uc2V0QXR0cmlidXRlKCJ6aF9kYXRlX21rIiwgInRydWUiKTsKCQkJdHJ5ewkJCQkJCgkJCQl2YXIgZGF0ZUNyZWF0ZWQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoIltpdGVtcHJvcH49ZGF0ZUNyZWF0ZWRdW2NvbnRlbnRdIikuY29udGVudDsKCQkJCXZhciBkYXRlTW9kaWZpZWQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoIltpdGVtcHJvcH49ZGF0ZU1vZGlmaWVkXVtjb250ZW50XSIpLmNvbnRlbnQ7CgkJCQl2YXIgY3JlYXRlRGF0ZSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkRhdGVGb3JtYXQobmV3IERhdGUoZGF0ZUNyZWF0ZWQpLCAieXl5eS1NTS1kZCBoaDptbTpzcyIpOwoJCQkJdmFyIGVkaXREYXRlID0gY29tbW9uRnVuY3Rpb25PYmplY3QuRGF0ZUZvcm1hdChuZXcgRGF0ZShkYXRlTW9kaWZpZWQpLCAieXl5eS1NTS1kZCBoaDptbTpzcyIpOwoJCQkJCSAKCQkJCXZhciBzaWRlSXRlbSA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiLkNvbnRlbnRJdGVtLW1ldGEiKTsKCQkJCXZhciB0aW1lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgkJCQl0aW1lRGl2LmlubmVySFRNTCA9IGDliJvlu7rkuo46Jm5ic3A7JHtjcmVhdGVEYXRlfSZuYnNwOyZuYnNwOyZuYnNwO+S/ruaUueS6jjombmJzcDske2VkaXREYXRlfWA7CgkJCQl0aW1lRGl2LmNsYXNzID0gIlZvdGVycyI7CgkJCQl0aW1lRGl2LnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzZmNmY2Zjtmb250LXNpemU6MTNweDtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6NXB4IDBweDsnOwoJCQkJc2lkZUl0ZW0uYXBwZW5kQ2hpbGQodGltZURpdik7CgkJCX1jYXRjaChlKXt9CgkJfQoJCXJldHVybiB0cnVlOwoJfTsKCS8vIOaPkOmXruiAheagh+ivhuWHuuadpQoJdGhpcy5zaG93UXVlc3Rpb25BdXRob3IgPSBmdW5jdGlvbigpewoJCS8v5q2k5aSE5Luj56CB5YCf6Ym06IeqIC0g55+l5LmO5aKe5by6CgkJLy/ljp/kvZzogIXvvJpYLkkuVQoJCS8vaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQxOTA4MS0lRTclOUYlQTUlRTQlQjklOEUlRTUlQTIlOUUlRTUlQkMlQkEKCQlpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkJyYW5kUXVlc3Rpb25TeW1ib2wsIC5RdWVzdGlvbkF1dGhvcicpKSByZXR1cm4KCQlsZXQgcUpzb24gPSBKU09OLnBhcnNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNqcy1pbml0aWFsRGF0YScpLnRleHRDb250ZW50KS5pbml0aWFsU3RhdGUuZW50aXRpZXMucXVlc3Rpb25zWy9cZCsvLmV4ZWMobG9jYXRpb24ucGF0aG5hbWUpWzBdXS5hdXRob3IsCgkJCWh0bWwgPSBgPGRpdiBjbGFzcz0iQnJhbmRRdWVzdGlvblN5bWJvbCI+PGEgY2xhc3M9IkJyYW5kUXVlc3Rpb25TeW1ib2wtYnJhbmRMaW5rIiBocmVmPSIvcGVvcGxlLyR7cUpzb24udXJsVG9rZW59Ij48aW1nIHJvbGU9InByZXNlbnRhdGlvbiIgc3JjPSIke3FKc29uLmF2YXRhclVybH0iIGNsYXNzPSJCcmFuZFF1ZXN0aW9uU3ltYm9sLWxvZ28iIGFsdD0iIj48c3BhbiBjbGFzcz0iQnJhbmRRdWVzdGlvblN5bWJvbC1uYW1lIj4ke3FKc29uLm5hbWV9PC9zcGFuPjwvYT48ZGl2IGNsYXNzPSJCcmFuZFF1ZXN0aW9uU3ltYm9sLWRpdmlkZXIiIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4O21hcmdpbi1yaWdodDogMTBweDsiPjwvZGl2PjwvZGl2PmA7CgkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlF1ZXN0aW9uSGVhZGVyLXRvcGljcycpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCBodG1sKTsKCX07Cgl0aGlzLnN0YXJ0RGVhbHdpdGhRdWVzdGlvbiA9IGZ1bmN0aW9uKCl7CgkJbGV0IGlzTWFya0NvbXBsZXRlID0gdHJ1ZTsKCQlzZXRJbnRlcnZhbCgoKT0+ewoJCQlpZihpc01hcmtDb21wbGV0ZSl7CgkJCQlpc01hcmtDb21wbGV0ZSA9IGZhbHNlOwoJCQkJaXNNYXJrQ29tcGxldGUgPSB0aGlzLmFkZFRpbWVBbnN3ZXJJdGVtcygpOwoJCQl9CgkJfSwgMjUwMCk7CgkJdGhpcy5zaG93UXVlc3Rpb25BdXRob3IoKTsKCQl0aGlzLmFkZERhdGVRdWVzdGlvbigpOwoJfTsKCXRoaXMuZG93bmxvYWRWaWRlbyA9IGZ1bmN0aW9uKCl7CgkJbGV0IGlzTWFya0NvbXBsZXRlID0gdHJ1ZTsKCQlmdW5jdGlvbiBhZGREb3dubG9hZEJ1dHRvbigpewoJCQlpZighaXNNYXJrQ29tcGxldGUpIHJldHVybjsKCQkJaXNNYXJrQ29tcGxldGUgPSBmYWxzZTsKCQkJCgkJCXZhciBpdGVtQXJyYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuXzF0ZzhvaXI6bm90KHNwYW5bemhfZGF0ZV9taz0ndHJ1ZSddKSIpOwoJCQl2YXIgaXRlbSA9IG51bGw7CgkJCS8vIGNvbnNvbGUubG9nKCLnn6XkuY7op4bpopHkuIvovb3lvqrlnY/nm5HlkKzmrKHmlbDvvJoiLCBpdGVtQXJyYXkubGVuZ3RoKTsKCQkJZm9yKHZhciBpPTA7IGk8aXRlbUFycmF5Lmxlbmd0aDsgaSsrKXsKCQkJCWl0ZW0gPSBpdGVtQXJyYXlbaV07CgkJCQlpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ3poX2RhdGVfbWsnKSA9PT0gJ3RydWUnKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpdGVtLnNldEF0dHJpYnV0ZSgiemhfZGF0ZV9tayIsICJ0cnVlIik7CgkJCQkKCQkJCWlmKGl0ZW0uaW5uZXJUZXh0ICE9ICLlgI3pgJ8iKXsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCQoJCQkJdmFyIHBsYXlCdXRMaSA9IGl0ZW0ucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoJCQkJdmFyIGRvd25sb2FkQnV0ID0gcGxheUJ1dExpLmNsb25lTm9kZSh0cnVlKQoJCQkJaWYoIWRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpKSByZXR1cm47CgkJCQkKCQkJCS8vIOWIoOmZpOWFtuWug+WFg+e0oAoJCQkJdmFyIGRvd25sb2FkQnV0Q2hpbGRyZW4gPSBkb3dubG9hZEJ1dC5jaGlsZHJlbjsKCQkJCWZvcih2YXIgaj0wOyBqPGRvd25sb2FkQnV0Q2hpbGRyZW4ubGVuZ3RoOyBqKyspewoJCQkJCWlmKGRvd25sb2FkQnV0Q2hpbGRyZW5bal0ubm9kZU5hbWUgIT09ICJCVVRUT04iKXsKCQkJCQkJZG93bmxvYWRCdXQucmVtb3ZlQ2hpbGQoZG93bmxvYWRCdXRDaGlsZHJlbltqXSk7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlkb3dubG9hZEJ1dC5zZXRBdHRyaWJ1dGUoInpoX2RhdGVfbWsiLCAidHJ1ZSIpOwoJCQkJZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykuaW5uZXJUZXh0PSfkuIvovb0nOwoJCQkJCgkJCQlwbGF5QnV0TGkuYmVmb3JlKGRvd25sb2FkQnV0KTsKCQkJCWRvd25sb2FkQnV0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpewoJCQkJCWxldCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQkJbGV0IGZpbmRDbGFzc05hbWUgPSAiLlpWaWRlb0l0ZW0tdmlkZW8iOyAvLyDpppbpobUKCQkJCQlpZihocmVmLmluZGV4T2YoInd3dy56aGlodS5jb20vc2VhcmNoIikhPS0xKXsgLy/mkJzntKLnlYzpnaIKCQkJCQkJZmluZENsYXNzTmFtZSA9ICIuTGlzdC1pdGVtIjsKCQkJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInd3dy56aGlodS5jb20venZpZGVvLyIpIT0tMSl7IC8v5Y2V54us6KeG6aKR5pKt5pS+55WM6Z2iCgkJCQkJCWZpbmRDbGFzc05hbWUgPSAiLlpWaWRlby1wbGF5ZXIiOwoJCQkJCX1lbHNlIGlmKGhyZWYuaW5kZXhPZigiaHR0cHM6Ly92aWRlby56aGlodS5jb20vdmlkZW8iKSE9LTEpeyAvL+inhumikeaSreaUvmlmcmFtZQoJCQkJCQlmaW5kQ2xhc3NOYW1lID0gIiNwbGF5ZXIiCgkJCQkJfQoJCQkJCWlmKCFmaW5kQ2xhc3NOYW1lKSByZXR1cm47CgkJCQkJbGV0IHBsYXlVcmwgPSAkKGl0ZW0pLnBhcmVudHMoZmluZENsYXNzTmFtZSkuZmluZCgidmlkZW8iKS5hdHRyKCJzcmMiKTsKCQkJCQlpZighIXBsYXlVcmwpewoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYihwbGF5VXJsKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCQlpc01hcmtDb21wbGV0ZSA9IHRydWU7CgkJfQoJCQoJCXNldEludGVydmFsKCgpPT57CgkJCWFkZERvd25sb2FkQnV0dG9uKCk7CgkJfSwgMTQ5OSk7Cgl9OwoJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWlmKGhvc3QgPT0gImxpbmsuemhpaHUuY29tIil7IAoJCQl0aGlzLmF1dG9KdW1wVGFyZ2V0KCk7CgkJfQoJCWlmKGhvc3QuaW5kZXhPZigiemhpaHUuY29tIikhPS0xKXsKCQkJdGhpcy5tYXJrQXJ0aWNsZU9yUXVlc3Rpb24oKTsKCQkJaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigid3d3LnpoaWh1LmNvbS9xdWVzdGlvbi8iKSE9LTEpewoJCQkJdGhpcy5zdGFydERlYWx3aXRoUXVlc3Rpb24oKTsKCQkJfQoJCQkvL3RoaXMuZG93bmxvYWRWaWRlbygpOwoJCX0KCX07Cn0KdHJ5ewoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlciB8fCBmdW5jdGlvbkNvbnRyb2xsZXIuemhpaHVIZWxwZXIpewoJCShuZXcgWmhpaHVIZWxwZXIoKSkuc3RhcnQoKTsKCX0KfWNhdGNoKGUpewoJY29uc29sZS5sb2coIuefpeS5juWKqeaJi++8mmVycm9y77yaIitlKTsKfQoJCgkvKioKICog5pCc57Si5byV5pOO6LWE5rqQ5o+Q6YaSCiAqLwpmdW5jdGlvbiBTZWFyY2hFbmdpbmVzTmF2aWdhdGlvbigpewoJdGhpcy5jdXN0b21OYXZpZ2F0aW9ua2V5ID0gImN1c3RvbS1uYXZpZ2F0aW9uLWtleS04ODk4IjsKCXRoaXMuc2VhcmNoRW5naW5lc0RhdGE9WwoJCXsiaG9zdCI6Ind3dy5iYWlkdS5jb20iLCAiZWxlbWVudCI6IiNjb250ZW50X3JpZ2h0IiwiZWxlbWVudElucHV0IjoiI2t3In0sCgkJeyJob3N0Ijoid3d3LnNvLmNvbSIsICJlbGVtZW50IjoiI3NpZGUiLCJlbGVtZW50SW5wdXQiOiIja2V5d29yZCJ9LAoJCXsiaG9zdCI6Ind3dy5zb2dvdS5jb20iLCAiZWxlbWVudCI6IiNyaWdodCIsImVsZW1lbnRJbnB1dCI6IiN1cHF1ZXJ5In0sCgkJeyJob3N0IjoiY24uYmluZy5jb20iLCAiZWxlbWVudCI6IiNiX2NvbnRleHQiLCJlbGVtZW50SW5wdXQiOiIjc2JfZm9ybV9xIn0sCgkJeyJob3N0Ijoid3d3LmJpbmcuY29tIiwgImVsZW1lbnQiOiIjYl9jb250ZXh0IiwiZWxlbWVudElucHV0IjoiI3NiX2Zvcm1fcSJ9LAoJCXsiaG9zdCI6Ind3dzQuYmluZy5jb20iLCAiZWxlbWVudCI6IiNiX2NvbnRleHQiLCJlbGVtZW50SW5wdXQiOiIjc2JfZm9ybV9xIn0sCgkJeyJob3N0Ijoic28udG91dGlhby5jb20iLCAiZWxlbWVudCI6Ii5zLXNpZGUtbGlzdCIsImVsZW1lbnRJbnB1dCI6ImlucHV0W3R5cGU9J3NlYXJjaCddIn0sCgkJeyJob3N0Ijoid3d3Lmdvb2dsZS5jb20iLCAiZWxlbWVudCI6IiNyaHMiLCJlbGVtZW50SW5wdXQiOiJpbnB1dFt0eXBlPSd0ZXh0J10ifSwKCQl7Imhvc3QiOiJ3d3cuZ29vZ2xlLmNvbS5oayIsImVsZW1lbnQiOiIjcmhzIiwiZWxlbWVudElucHV0IjoiaW5wdXRbdHlwZT0ndGV4dCddIn0KCV07Cgl0aGlzLmRlZmF1bHROYXZpZ2F0aW9uRGF0YSA9ICBbCgkJeyJuYW1lIjoi6LWE5rqQ5pCc57SiIiwibGlzdCI6WwoJCQl7Im5hbWUiOiLnmb7luqbnmb7np5EiLCAidXJsIjoiaHR0cHM6Ly9iYWlrZS5iYWlkdS5jb20vaXRlbS9AQCJ9LAoJCQl7Im5hbWUiOiLnn6XkuY7mkJzntKIiLCAidXJsIjoiaHR0cHM6Ly93d3cuemhpaHUuY29tL3NlYXJjaD90eXBlPWNvbnRlbnQmcT1AQCJ9LAoJCQl7Im5hbWUiOiJC56uZ5pCc57SiIiwgInVybCI6Imh0dHBzOi8vc2VhcmNoLmJpbGliaWxpLmNvbS9hbGw/a2V5d29yZD1AQCZmcm9tX3NvdXJjZT13ZWJ0b3Bfc2VhcmNoJnNwbV9pZF9mcm9tPTMzMy44NTEifSwKCQkJeyJuYW1lIjoi6LSi57uP6Zuq55CDIiwgInVybCI6Imh0dHBzOi8veHVlcWl1LmNvbS9rP3E9QEAifSwKCQkJeyJuYW1lIjoi5oqW6Z+z5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LmRvdXlpbi5jb20vc2VhcmNoL0BAIn0sCgkJCXsibmFtZSI6IuaQnOeLl3zlhazkvJflj7ciLCAidXJsIjoiaHR0cHM6Ly93ZWl4aW4uc29nb3UuY29tL3dlaXhpbj90eXBlPTImcXVlcnk9QEAifSwKCQkJeyJuYW1lIjoi6LGG55Oj5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LmRvdWJhbi5jb20vc2VhcmNoP3E9QEAifSwKCQkJeyJuYW1lIjoi57u05Z+655m+56eRIiwgInVybCI6Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93L2luZGV4LnBocD9zZWFyY2g9QEAifSwKCQkJeyJuYW1lIjoi5rOV5b6L5rOV6KeEIiwgInVybCI6Imh0dHBzOi8vd3d3LnBrdWxhdy5jb20vbGF3L2NobD9LZXl3b3Jkcz1AQCJ9LAoJCQl7Im5hbWUiOiJpY29u5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3Lmljb25mb250LmNuL3NlYXJjaC9pbmRleD9zZWFyY2hUeXBlPWljb24mcT1AQCJ9LAoJCQl7Im5hbWUiOiJnaXRodWIiLCAidXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9xPUBAIn0sCgkJCXsibmFtZSI6ImNzZG4iLCAidXJsIjoiaHR0cHM6Ly9zby5jc2RuLm5ldC9zby9zZWFyY2g/cT1AQCZ0PSZ1PSJ9LAoJCQl7Im5hbWUiOiJzdGFja292ZXJmbG93IiwgInVybCI6Imh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vIn0sCgkJXX0sCgkJeyJuYW1lIjoi5pCc57Si5byV5pOOIiwibGlzdCI6WwoJCQl7Im5hbWUiOiLnmb7luqYiLCAidXJsIjoiaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/d2Q9QEAifSwKCQkJeyJuYW1lIjoi5b+F5bqUIiwgInVybCI6Imh0dHBzOi8vY24uYmluZy5jb20vc2VhcmNoP3E9QEAifSwKCQkJeyJuYW1lIjoiZ29vZ2xlIiwgInVybCI6Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9QEAifSwKCQkJeyJuYW1lIjoiMzYw5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LnNvLmNvbS9zP2llPXV0Zi04JmZyPW5vbmUmc3JjPTM2MHNvdV9uZXdob21lJm5scHY9YmFzZXN0JnE9QEAifSwKCQkJeyJuYW1lIjoi5pCc54uXIiwgInVybCI6Imh0dHBzOi8vd3d3LnNvZ291LmNvbS93ZWI/cXVlcnk9QEAifSwKCQkJeyJuYW1lIjoi5aS05p2h5pCc57SiIiwgInVybCI6Imh0dHBzOi8vc28udG91dGlhby5jb20vc2VhcmNoP2R2cGY9cGMmc291cmNlPWlucHV0JmtleXdvcmQ9QEAifQoJCV19CgldOwoJdGhpcy5nZXROYXZpZ2F0aW9uRGF0YSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGVsZW1lbnRJbnB1dCl7CgkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJbGV0IG5hdmlnYXRpb25EYXRhID0gc2VsZi5kZWZhdWx0TmF2aWdhdGlvbkRhdGE7CgkJbGV0IGZpbmFsTmF2aWdhdGlvbkRhdGEgPSBudWxsOwoJCXRyeXsKCQkJLy/oh6rlrprkuYnnmoTmlbDmja4KCQkJbGV0IGN1c3RvbU5hdmlnYXRpb25EYXRhID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZShzZWxmLmN1c3RvbU5hdmlnYXRpb25rZXksIG51bGwpOwoJCQlpZighIWN1c3RvbU5hdmlnYXRpb25EYXRhKXsKCQkJCWZpbmFsTmF2aWdhdGlvbkRhdGEgPSBbXS5jb25jYXQoY3VzdG9tTmF2aWdhdGlvbkRhdGEpOwoJCQl9ZWxzZXsKCQkJCWZpbmFsTmF2aWdhdGlvbkRhdGEgPSBuYXZpZ2F0aW9uRGF0YTsKCQkJfQoJCX1jYXRjaChlKXsKCQkJZmluYWxOYXZpZ2F0aW9uRGF0YSA9IG5hdmlnYXRpb25EYXRhOwoJCX0KCQlzZWxmLmNyZWF0ZUh0bWwoZWxlbWVudCwgZWxlbWVudElucHV0LCBmaW5hbE5hdmlnYXRpb25EYXRhKTsKCX07Cgl0aGlzLmNyZWF0ZUNzcyA9IGZ1bmN0aW9uKGVsZW1lbnROdW0pewoJCXZhciBpbm5uZXJDc3MgPSBgCgkJCS5kZGZkZmRgK2VsZW1lbnROdW0rYGRmZnNzcWF7CgkJCQltYXJnaW4tdG9wOjE1cHg7CgkJCX0KCQkJLmRkZmRmZGArZWxlbWVudE51bStgZGZmc3NxYTpudGgtbGFzdHsKCQkJCW1hcmdpbi10b3A6MHB4OwoJCQl9CgkJCS5kZGZkZmRgK2VsZW1lbnROdW0rYGRmZnNzcWE+LnRpdGxlewoJCQkJZm9udC1zaXplOjE2cHg7CgkJCQljb2xvcjojMDAwOwoJCQl9CgkJCS5kZGZkZmRgK2VsZW1lbnROdW0rYGRmZnNzcWE+LmNvbnRlbnQtbGlzdHsKCQkJCQoJCQl9CgkJCS5kZGZkZmRgK2VsZW1lbnROdW0rYGRmZnNzcWE+LmNvbnRlbnQtbGlzdD5hewoJCQkJZGlzcGxheTppbmxpbmUtYmxvY2s7CgkJCQlib3JkZXI6MXB4IHNvbGlkICNlY2U1ZTU7CgkJCQlib3JkZXItcmFkaXVzOjRweDsKCQkJCXRleHQtYWxpZ246Y2VudGVyOwoJCQkJbWFyZ2luLXJpZ2h0OjEwcHg7CgkJCQltYXJnaW4tdG9wOjZweDsKCQkJCW92ZXJmbG93OiBoaWRkZW47CgkJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQkJdGV4dC1vdmVyZmxvdzplbGxpcHNpczsKCQkJCXBhZGRpbmc6MnB4IDVweDsKCQkJCWJveC1zaXppbmc6Ym9yZGVyLWJveDsKCQkJCWxpbmUtaGVpZ2h0OjIwcHg7CgkJCQlmb250LXNpemU6MTRweCFpbXBvcnRhbnQ7CgkJCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJCX0KCQkJLmRkZmRmZGArZWxlbWVudE51bStgZGZmc3NxYT4uY29udGVudC1saXN0PmE6aG92ZXJ7CgkJCQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKCQkJfQoJCWA7CgkJaWYoJCgiI3BsdWdpbl9jc3Nfc3R5bGVfZGRkc29vIikubGVuZ3RoPT0wKXsKCQkJJCgiYm9keSIpLnByZXBlbmQoIjxzdHlsZSBpZD0ncGx1Z2luX2Nzc19zdHlsZV9kZGRzb28nPiIraW5ubmVyQ3NzKyI8L3N0eWxlPiIpOwoJCX0KCX07Cgl0aGlzLnNob3dTZXRpbmdEaWFsb2cgPSBmdW5jdGlvbigpewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQoJCXZhciBjdXN0b21OYXZpZ2F0aW9uRGF0YSA9ICIiOwoJCWNvbnN0IGN1c3RvbU5hdmlnYXRpb24gPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHNlbGYuY3VzdG9tTmF2aWdhdGlvbmtleSwgbnVsbCk7CgkJaWYoISFjdXN0b21OYXZpZ2F0aW9uKXsKCQkJY3VzdG9tTmF2aWdhdGlvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShjdXN0b21OYXZpZ2F0aW9uLCBudWxsLCA0KTsKCQl9CgkJY29uc3QgY29udGVudCA9IGAKCQkJPGRpdj4KCQkJCTxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnJlZDsiPgoJCQkJCeazqOaEj+S6i+mhueWmguS4i++8mgoJCQkJCTxicj4x44CB6K+35Lil5qC85oyJ54Wn5qC85byP5re75Yqg77yM5ZCm5YiZ5LiN55Sf5pWICgkJCQkJPGJyPjLjgIHmlbDmja7kuLpqc29u5qC85byP77yM6K+356Gu5L+danNvbuagvOW8j+ato+ehru+8jOW/heimgeaXtuivt+WIsDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3d3dy5qc29uLmNuLyI+aHR0cHM6Ly93d3cuanNvbi5jbi88L2E+5qCh6aqMCgkJCQkJPGJyPjPjgIHngrnlh7vkuIvpnaLigJ3npLrkvovigJzmjInpkq7vvIzmn6XnnIvlhbfkvZPmoLzlvI/mg4XlhrUKCQkJCQk8YnI+NOOAgemTvuaOpeS4reeahOaQnOe0ouWFs+mUruivjeivt+eUqOKAnUBA4oCc5Luj5pu/77yM6ISa5pys5Lya6Ieq5Yqo5pu/5o2i5oiQ5b2T5YmN5pCc57Si6K+N44CC5L6L5aaC77yaaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/d2Q9QEAKCQkJCQk8YnI+NeOAgeWkp+WutuWPr+S7peiHquWumuS5ieWvvOiIquaVsOaNru+8jDxiPuS9huaYr+W/hemhu+imgeazqOaEj+aVsOaNruagvOW8j++8jOWPkeeOsOWHuueOsOmUmeivr++8jOWPr+eCueKAnOWIneWni+WMluKAnTwvYj4KCQkJCTwvZGl2PgoJCQkJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7aGVpZ2h0OjIwMHB4O3dpZHRoOjEwMCU7Ij4KCQkJCQk8dGV4dGFyZWEgCgkJCQkJCXBsYWNlaG9sZGVyPSLor7fkuKXmoLzmjInnhafmoLzlvI/loavlhpnvvIzlkKbliJnkuI3nlJ/mlYgiCgkJCQkJCWNsYXNzPSJuYXZpZ2F0aW9uLXRleHRhcmVhIgoJCQkJCQlzdHlsZT0iY29sb3I6IzAwMDtmb250LXNpemU6MTRweDtib3gtc2l6aW5nOiBib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDstbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7cGFkZGluZzo1cHg7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtPdmVyZmxvdzphdXRvO2JvcmRlcjoxcHggc29saWQgI2NjYztyZXNpemU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7b3V0bGluZTpub25lOyI+YCtjdXN0b21OYXZpZ2F0aW9uRGF0YStgPC90ZXh0YXJlYT4KCQkJCTwvZGl2PgoJCQkJPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxNXB4OyI+CgkJCQkJPGJ1dHRvbiBjbGFzcz0ibmF2aWdhdGlvbi1pbml0IiBzdHlsZT0iY29sb3I6IzAwMDtjdXJzb3I6cG9pbnRlcjsiPuWIneWni+WMljwvYnV0dG9uPgoJCQkJCTxidXR0b24gY2xhc3M9Im5hdmlnYXRpb24tZXhhbXBsZSIgc3R5bGU9ImNvbG9yOiMwMDA7Y3Vyc29yOnBvaW50ZXI7Ij7npLrkvos8L2J1dHRvbj4KCQkJCQk8YnV0dG9uIGNsYXNzPSJuYXZpZ2F0aW9uLWNsZWFyIiBzdHlsZT0iY29sb3I6IzAwMDtjdXJzb3I6cG9pbnRlcjsiPua4heepujwvYnV0dG9uPgoJCQkJCTxidXR0b24gY2xhc3M9Im5hdmlnYXRpb24tc2F2ZSIgc3R5bGU9ImNvbG9yOiMwMDA7Y3Vyc29yOnBvaW50ZXI7Ij7kv53lrZjoh6rlrprkuYnlr7zoiKo8L2J1dHRvbj4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQlgOwoJCXBvcHVwLmRpYWxvZyh7CgkJCSJ0aXRsZSI6IuiHquWumuS5iea3u+WKoOWvvOiIqiIsCgkJCSJjb250ZW50Ijpjb250ZW50LAoJCQkib25Db250ZW50UmVhZHkiOmZ1bmN0aW9uKCR0aGF0KXsKCQkJCXZhciAkbmF2aWdhdGlvbkV4YW1wbGUgPSAkdGhhdC5kaWFsb2dDb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXZpZ2F0aW9uLWV4YW1wbGUiKTsKCQkJCXZhciAkbmF2aWdhdGlvbkNsZWFyID0gJHRoYXQuZGlhbG9nQ29udGVudC5xdWVyeVNlbGVjdG9yKCIubmF2aWdhdGlvbi1jbGVhciIpOwoJCQkJdmFyICRuYXZpZ2F0aW9uU2F2ZSA9ICR0aGF0LmRpYWxvZ0NvbnRlbnQucXVlcnlTZWxlY3RvcigiLm5hdmlnYXRpb24tc2F2ZSIpOwoJCQkJdmFyICRuYXZpZ2F0aW9uSW5pdCA9ICR0aGF0LmRpYWxvZ0NvbnRlbnQucXVlcnlTZWxlY3RvcigiLm5hdmlnYXRpb24taW5pdCIpOwoJCQkJCgkJCQl2YXIgJHRleHRhcmVhID0gJHRoYXQuZGlhbG9nQ29udGVudC5xdWVyeVNlbGVjdG9yKCIubmF2aWdhdGlvbi10ZXh0YXJlYSIpOwoJCQkJJG5hdmlnYXRpb25FeGFtcGxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkkdGV4dGFyZWEudmFsdWUgPSBKU09OLnN0cmluZ2lmeShzZWxmLmRlZmF1bHROYXZpZ2F0aW9uRGF0YSwgbnVsbCwgNCk7CgkJCQl9KTsKCQkJCSRuYXZpZ2F0aW9uQ2xlYXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCSR0ZXh0YXJlYS52YWx1ZSA9ICIiOwoJCQkJfSk7CgkJCQkkbmF2aWdhdGlvbkluaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCSR0ZXh0YXJlYS52YWx1ZSA9ICIiOwoJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoc2VsZi5jdXN0b21OYXZpZ2F0aW9ua2V5LCBudWxsKTsKCQkJCX0pOwoJCQkJJG5hdmlnYXRpb25TYXZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQl2YXIgY29udGVudCA9ICR0ZXh0YXJlYS52YWx1ZTsKCQkJCQlpZighY29udGVudCl7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoc2VsZi5jdXN0b21OYXZpZ2F0aW9ua2V5LCBudWxsKTsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi5L+d5a2Y5oiQ5Yqf77ya5pWw5o2u5Li656m6IiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCWlmKGNvbnRlbnQubGVuZ3RoPT0wIHx8IGNvbnRlbnQuaW5kZXhPZigieyIpPT0tMSB8fCBjb250ZW50LmluZGV4T2YoIlsiKT09LTEpewoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLmoLzlvI/plJnor6/vvIzor7fmm7TmraMiLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJdHJ5ewoJCQkJCQl2YXIgY29udGVudEpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpOwoJCQkJCQlpZihBcnJheS5pc0FycmF5KGNvbnRlbnRKc29uKSl7IC8v5byA5aeL5b+F6aG75piv5pWw57uECgkJCQkJCQl2YXIgaXNPSyA9IHRydWU7CgkJCQkJCQlmb3IodmFyIGk9MDsgaTxjb250ZW50SnNvbi5sZW5ndGg7IGkrKykgewoJCQkJCQkJCWlmKEFycmF5LmlzQXJyYXkoY29udGVudEpzb25baV0pKXsgLy/mraTlpITlv4XpobvmmK/lr7nosaEKCQkJCQkJCQkJaXNPSyA9IGZhbHNlOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJaWYoIWNvbnRlbnRKc29uW2ldLmhhc093blByb3BlcnR5KCJuYW1lIikgfHwgIWNvbnRlbnRKc29uW2ldLmhhc093blByb3BlcnR5KCJsaXN0IikpewoJCQkJCQkJCQlpc09LID0gZmFsc2U7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQlpZih0eXBlb2YoY29udGVudEpzb25baV1bIm5hbWUiXSkhPSJzdHJpbmciKXsKCQkJCQkJCQkJaXNPSyA9IGZhbHNlOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJaWYoIUFycmF5LmlzQXJyYXkoY29udGVudEpzb25baV1bImxpc3QiXSkpeyAvL+atpOWkhOW/hemhu+aYr+aVsOe7hAoJCQkJCQkJCQlpc09LID0gZmFsc2U7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQlmb3IodmFyIGo9MDsgajxjb250ZW50SnNvbltpXVsibGlzdCJdLmxlbmd0aDsgaisrKXsKCQkJCQkJCQkJaWYoIWNvbnRlbnRKc29uW2ldWyJsaXN0Il1bal0uaGFzT3duUHJvcGVydHkoIm5hbWUiKSB8fCAhY29udGVudEpzb25baV1bImxpc3QiXVtqXS5oYXNPd25Qcm9wZXJ0eSgidXJsIikpewoJCQkJCQkJCQkJaXNPSyA9IGZhbHNlOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYodHlwZW9mKGNvbnRlbnRKc29uW2ldWyJsaXN0Il1bal1bIm5hbWUiXSkhPSJzdHJpbmciIHx8IHR5cGVvZihjb250ZW50SnNvbltpXVsibGlzdCJdW2pdWyJ1cmwiXSkhPSJzdHJpbmciKXsKCQkJCQkJCQkJCWlzT0sgPSBmYWxzZTsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWlmKCFpc09LKXsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYoaXNPSyl7CgkJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZShzZWxmLmN1c3RvbU5hdmlnYXRpb25rZXksIGNvbnRlbnRKc29uKTsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLkv53lrZjmiJDlip8iLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLmoLzlvI/plJnor6/vvIzor7fmm7TmraMiLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJCQl9CgkJCQkJCX1lbHNlewoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi5qC85byP6ZSZ6K+v77yM6K+35pu05q2jIiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQl9CgkJCQkJfWNhdGNoKGUpewoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLmoLzlvI/plJnor6/vvIzor7fmm7TmraMiLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9KQoJfQoJdGhpcy5jcmVhdGVIdG1sID0gZnVuY3Rpb24oZWxlbWVudCwgZWxlbWVudElucHV0LCBuYXZpZ2F0aW9uRGF0YSl7CgkJJCgiI2RzZHNkOTltbW1qajc3NjAwMTEiKS5yZW1vdmUoKTsKCQkKCQl2YXIgaXNDb21wbGF0ZSA9IHRydWU7CgkJY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IGVsZW1lbnROdW0gPSBjb21tb25GdW5jdGlvbk9iamVjdC5yYW5kb21OdW1iZXIoKTsKCQljb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQlpZihpc0NvbXBsYXRlKXsKCQkJCXZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7CgkJCQl2YXIgJGJveCA9ICQoIiNkc2RzZDk5bW1tamo3NzYwMDExIik7CgkJCQlpc0NvbXBsYXRlID0gZmFsc2U7CgkJCQlpZigkZWxlbWVudC5sZW5ndGghPTAgJiYgJGJveC5sZW5ndGg9PTApewoJCQkJCXZhciBodG1sID0gIiI7CgkJCQkJaHRtbCAgKz0gIjxkaXYgaWQ9J2RzZHNkOTltbW1qajc3NjAwMTEnPiI7CgkJCQkJZm9yKHZhciBpPTA7IGk8bmF2aWdhdGlvbkRhdGEubGVuZ3RoOyBpKyspewoJCQkJCQlodG1sICArPSAiPGRpdiBjbGFzcz0nZGRmZGZkIitlbGVtZW50TnVtKyJkZmZzc3FhJz4iOwoJCQkJCQlodG1sICArPSAiPGRpdiBjbGFzcz0ndGl0bGUnPjxiPiIrbmF2aWdhdGlvbkRhdGFbaV0ubmFtZSsiPC9iPjwvZGl2PiI7CgkJCQkJCWh0bWwgICs9ICI8ZGl2IGNsYXNzPSdjb250ZW50LWxpc3QnPiI7CgkJCQkJCWZvcih2YXIgaj0wO2o8bmF2aWdhdGlvbkRhdGFbaV0ubGlzdC5sZW5ndGg7aisrKXsKCQkJCQkJCWxldCB1cmwgPSBuYXZpZ2F0aW9uRGF0YVtpXS5saXN0W2pdLnVybDsKCQkJCQkJCWxldCBuYW1lID0gbmF2aWdhdGlvbkRhdGFbaV0ubGlzdFtqXS5uYW1lOwoJCQkJCQkJaHRtbCArPSAiPGEgdGFyZ2V0PSdfYmxhbmsnIG5hbWU9J25hdmlnYXRpb24nIGRhdGEtdXJsPSciK3VybCsiJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7Jz4iK25hbWUrIjwvYT4iCQkJCQoJCQkJCQl9CgkJCQkJCWh0bWwgKz0gIjwvZGl2PiI7CgkJCQkJCWh0bWwgKz0gIjwvZGl2PiI7CgkJCQkJfQoJCQkJCWh0bWwgKz0gYAoJCQkJCQk8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHg7bWFyZ2luLXRvcDo1cHg7Zm9udC1zaXplOjEycHg7Jz4KCQkJCQkJCTxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwczovL2dpdGxhYi5jb20vc2NyaXB0MzQ3MzMwMy9zY3JpcHRfcHJvJz4q6K+l5pWw5o2u55Sx5rK554y06ISa5pys5o+Q5L6bPC9hPgoJCQkJCQkJJm5ic3A7Jm5ic3A7CgkJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uIj4KCQkJCQkJCQnwn5Sn6Ieq5a6a5LmJ572R5Z2ACgkJCQkJCQk8L2E+CgkJCQkJCTwvZGl2PmA7CgkJCQkJaHRtbCArPSAiPC9kaXY+IjsKCQkJCQkKCQkJCQkvL+a3u+WKoGNzcyDmt7vliqBodG1sCgkJCQkJc2VsZi5jcmVhdGVDc3MoZWxlbWVudE51bSk7CgkJCQkJJGVsZW1lbnQucHJlcGVuZChodG1sKTsKCQkJCQkKCQkJCQkkKCIjZHNkc2Q5OW1tbWpqNzc2MDAxMSBhW25hbWU9J25hdmlnYXRpb24nXSIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKGUpewoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYigkKHRoaXMpLmRhdGEoInVybCIpLnJlcGxhY2UoIkBAIiwkKGVsZW1lbnRJbnB1dCkudmFsKCkpKTsKCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpCgkJCQkJfSk7CgkJCQkJCgkJCQkJJCgiI2RzZHNkOTltbW1qajc3NjAwMTEgYVtuYW1lPSdjdXN0b21OYXZpZ2F0aW9uJ10iKS5vbigiY2xpY2siLCBmdW5jdGlvbihlKXsKCQkJCQkJc2VsZi5zaG93U2V0aW5nRGlhbG9nKCk7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKQoJCQkJCX0pCgkJCQl9CgkJCQlpc0NvbXBsYXRlID0gdHJ1ZTsKCQkJfQoJCX0sIDEwMCk7CQkJCgl9OwoJdGhpcy5ob29rQmFpZHUgPSBmdW5jdGlvbigpewoJCWxldCBpdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNjb250ZW50X2xlZnQ+ZGl2Iik7CgkJZm9yKGxldCBpdGVtIG9mIGl0ZW1zKXsKCQkJLy/nu5nlpITnkIblrozmiJDnmoTlgZrkuIDkuKrmoIfor4YKCQkJaWYoISFpdGVtLmdldEF0dHJpYnV0ZSgiYmFpZHVfZGVhbHh4IikpewoJCQkJY29udGludWU7CgkJCX0KCQkJaXRlbS5zZXRBdHRyaWJ1dGUoImJhaWR1X2RlYWx4eCIsIi0tIik7CgkJCQoJCQlsZXQgYSA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiYSIpOwoJCQlpZighYSB8fCAhYS5ocmVmKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQkvL+agh+azqOS6hmh0bWznvZHlnYDnmoTlv73nlaUKCQkJbGV0IE9QX0xPR19MSU5LID0gaXRlbS5xdWVyeVNlbGVjdG9yKCIuT1BfTE9HX0xJTksiKTsKCQkJaWYoISFPUF9MT0dfTElOSyAmJiBPUF9MT0dfTElOSy5pbm5lclRleHQuc2VhcmNoKCJodHRwIikhPS0xKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQkvL+acieWkmuS4queCueWHu+eCueeahOW/veeVpQoJCQlsZXQgY0dhcEJvdHRvbVNtYWxsID0gaXRlbS5xdWVyeVNlbGVjdG9yKCIuYy1nYXAtYm90dG9tLXNtYWxsIik7CgkJCWlmKCEhY0dhcEJvdHRvbVNtYWxsKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQkJCQkKCQkJLy9odHRwczovL3d3dy5iYWlkdS5jb20vcz93ZD3kuIDlpJzphpLmnaXmrKDlnLDpk4E2MDDlpJrkuIc/5a6Y5pa55Zue5bqUCgkJCWlmIChhLmhyZWYuaW5jbHVkZXMoInd3dy5iYWlkdS5jb20vbGluaz91cmw9IikpIHsKCQkJCWxldCB1cmwgPSBpdGVtLmdldEF0dHJpYnV0ZSgibXUiKTsKCQkJCWlmICh1cmwgJiYgdXJsICE9IG51bGwgJiYgIXVybC5pbmNsdWRlcygibm91cmwudWJzLmJhaWR1LmNvbSIpKSB7CgkJCQkJYS5ocmVmID0gdXJsOwoJCQkJCWl0ZW0uaW5uZXJIVE1MICs9IGA8ZGl2IHN0eWxlPSJjb2xvcjojY2NjO2ZvbnQtc2l6ZToxMnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6IG5vd3JhcDt0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczstby10ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyI+CgkJCQkJCQkJCQk8aW1nIHN0eWxlPSJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQVhOU1IwSUFyczRjNlFBQUFLaEpSRUZVT0UrOWs5RU53akFNQmM4UkE3QVI3VWhNUURzQnN6QkJ3MFlNQUFtS3JCUzNwTTFIcE9iL25lOVpqdEQ0cERIUEVZQlRCMkZTVTlmRDIxdnJpc0VjSHNGNUJTMGhGWUNMd0FoaDBLa1pHT1pjQlNBVHlBTTRLOFFORUM4USsxeWpBRWhUUGplUTUwK2JxMEtXNFFSWkFXeG5Yc0JkTzRldUZDNEFiT2UxZnZsaWpFR2VicmVjT3FlWGwvZ1AyYWl3cjEyNWcyd1N2ZDMyMXNrZmNjcjczNjNaNEFza2x6NFJIbWRBMWdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4KCQkJCQkJCQkJCTxhIHN0eWxlPSJjb2xvcjojNjI2Njc1OyIgaHJlZj0iYCt1cmwrYCIgdGFyZ2V0PSJfYmxhbmsiPmArdXJsK2A8L2E+CgkJCQkJCQkJCTwvZGl2PmA7CgkJCQl9CgkJCX0KCQkJCgkJCWxldCBpdGVtTmV3cyA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgiW2NsYXNzXj1zaW5nbGUtY2FyZC13cmFwcGVyXSBkaXYsW2NsYXNzXj1ncm91cC13cmFwcGVyXSBkaXYiKTsKCQkJaWYoIWl0ZW1OZXdzKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCS8vc2luZ2xlLWNhcmQtd3JhcHBlcjogaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/aWU9VVRGLTgmd2Q9ZXM2ICAgICAgICAgICAgICAgICAgICAgICAgICB4eHjnmoTmnIDmlrDnm7jlhbPkv6Hmga8KCQkJLy9ncm91cC13cmFwcGVyOiAgICAgICBodHRwczovL3d3dy5iYWlkdS5jb20vcz9pZT1VVEYtOCZ3ZD3kupTkuIDmtojotLnmiJDnu6nljZXmipjlsITluILlnLrmtLvlipsgICAgIOi1hOiurwoJCQlmb3IobGV0IGl0ZW1OZXcgb2YgaXRlbU5ld3MpewoJCQkJbGV0IGRhdGFVcmwgPSBudWxsOwoJCQkJbGV0IGRpdnMgPSBpdGVtTmV3LnF1ZXJ5U2VsZWN0b3JBbGwoImRpdiIpOwoJCQkJZm9yIChsZXQgZGl2IG9mIGRpdnMpIHsKCQkJCQlpZiAoKGRhdGFVcmwgPSBkaXYuZ2V0QXR0cmlidXRlKCJkYXRhLXVybCIpKSkgewoJCQkJCQlsZXQgYSA9IGl0ZW1OZXcucXVlcnlTZWxlY3RvcigiYSIpOwoJCQkJCQlhLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGRhdGFVcmwpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX07Cgl0aGlzLmhvb2tHb29nbGUgPSBmdW5jdGlvbigpewoJCWxldCBpdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNjZW50ZXJfY29sIGEiKTsKCQlmb3IobGV0IGEgb2YgaXRlbXMpewoJCQlpZighYS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpKSBhLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIik7CgkJfQoJfTsKCXRoaXMuaG9va3MgPSBmdW5jdGlvbigpewoJCWNvbnN0IGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQljb25zdCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJY29uc3Qgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKCQljb25zdCBzZWxmID0gdGhpczsKCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQlpZihob3N0PT09Ind3dy5iYWlkdS5jb20iKXsKCQkJCXNlbGYuaG9va0JhaWR1KCk7CgkJCX1lbHNlIGlmKGhvc3Q9PT0id3d3Lmdvb2dsZS5jb20iIHx8IGhvc3Q9PT0id3d3Lmdvb2dsZS5jb20uaGsiKXsKCQkJCXNlbGYuaG9va0dvb2dsZSgpOwoJCQl9CgkJfSwgMzAwKTsKCX07Cgl0aGlzLnNob3cgPSBmdW5jdGlvbigpewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQljb25zdCBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJaWYoKGhvc3Q9PT0id3d3LmJhaWR1LmNvbSIpCgkJCXx8IChob3N0PT09Ind3dy5zby5jb20iICYmIGhyZWYuaW5kZXhPZigid3d3LnNvLmNvbS9zIikhPS0xKQoJCQl8fCAoaG9zdD09PSJ3d3cuc29nb3UuY29tIiAmJiAoaHJlZi5pbmRleE9mKCJ3d3cuc29nb3UuY29tL3dlYiIpIT0tMSB8fCBocmVmLmluZGV4T2YoInd3dy5zb2dvdS5jb20vc29nb3UiKSE9LTEpKQoJCQl8fCAoaG9zdD09PSJjbi5iaW5nLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJjbi5iaW5nLmNvbS9zZWFyY2giKSE9LTEpCgkJCXx8IChob3N0PT09Ind3dy5iaW5nLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJ3d3cuYmluZy5jb20vc2VhcmNoIikhPS0xKQoJCQl8fCAoaG9zdD09PSJ3d3c0LmJpbmcuY29tIiAmJiBocmVmLmluZGV4T2YoInd3dzQuYmluZy5jb20vc2VhcmNoIikhPS0xKQoJCQl8fCAoaG9zdD09PSJzby50b3V0aWFvLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJzby50b3V0aWFvLmNvbS9zZWFyY2giKSE9LTEpCgkJCXx8IChob3N0PT09Ind3dy5nb29nbGUuY29tIiAmJiBocmVmLmluZGV4T2YoInd3dy5nb29nbGUuY29tL3NlYXJjaCIpIT0tMSkKCQkJfHwgKGhvc3Q9PT0id3d3Lmdvb2dsZS5jb20uaGsiICYmIGhyZWYuaW5kZXhPZigid3d3Lmdvb2dsZS5jb20uaGsvc2VhcmNoIikhPS0xKSl7CgkJCWxldCBjdXJyZW50U2VhcmNoRW5naW5lc0RhdGEgPSBudWxsOwoJCQlmb3IodmFyIGk9MDsgaTxzZWxmLnNlYXJjaEVuZ2luZXNEYXRhLmxlbmd0aDsgaSsrKXsKCQkJCWlmKGhvc3Q9PT1zZWxmLnNlYXJjaEVuZ2luZXNEYXRhW2ldLmhvc3QpewoJCQkJCWN1cnJlbnRTZWFyY2hFbmdpbmVzRGF0YSA9IHNlbGYuc2VhcmNoRW5naW5lc0RhdGFbaV07CgkJCQl9CgkJCX0KCQkJaWYoY3VycmVudFNlYXJjaEVuZ2luZXNEYXRhIT1udWxsKXsKCQkJCXNlbGYuZ2V0TmF2aWdhdGlvbkRhdGEoY3VycmVudFNlYXJjaEVuZ2luZXNEYXRhLmVsZW1lbnQsIGN1cnJlbnRTZWFyY2hFbmdpbmVzRGF0YS5lbGVtZW50SW5wdXQpOwoJCQl9CgkJCXNlbGYuaG9va3MoKTsKCQl9Cgl9OwoJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJdGhpcy5zaG93KCk7Cgl9Owp9CnRyeXsKCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIgfHwgZnVuY3Rpb25Db250cm9sbGVyLnNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uKXsKCQkobmV3IFNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uKCkpLnN0YXJ0KCk7Cgl9Cn1jYXRjaChlKXsKCWNvbnNvbGUubG9nKCLmkJzntKLlvJXmk47lr7zoiKrvvJplcnJvcu+8miIrZSk7Cn0KCWZ1bmN0aW9uIFF1ZXJ5Q291cG9uKCl7Cgl0aGlzLmlzUnVuID0gZnVuY3Rpb24oKXsKCQl2YXIgdXJscz1bImRldGFpbC50bWFsbC5jb20iLCAiaXRlbS50YW9iYW8uY29tIiwgIml0ZW0uamQuY29tIiwgIml0ZW0ueWl5YW9qZC5jb20iLCAKCQkJIm5wY2l0ZW0uamQuaGsiLCAiZGV0YWlsLnRtYWxsLmhrIiwgImRldGFpbC52aXAuY29tIiwgInd3dy52aXBnbG9iYWwuaGsiXTsKCQlmb3IodmFyIGk9MDsgaTx1cmxzLmxlbmd0aDtpKyspewoJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKHVybHNbaV0pIT0tMSl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cgl0aGlzLmdldEdvb2RzRGF0YSA9IGFzeW5jIGZ1bmN0aW9uKHBsYXRmb3JtKXsKCQl2YXIgZ29vZHNJZCA9ICIiOwoJCXZhciBnb29kc05hbWUgPSAiIjsKCQl2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCWlmKHBsYXRmb3JtPT0idGFvYmFvIil7CgkJCWdvb2RzSWQgPSBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRQYXJhbXRlclF1ZXJ5VXJsKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsICJpZCIpOwoJCQl0cnl7CgkJCQlsZXQgdGl0bGVPYmogPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudGItbWFpbi10aXRsZSIpOwoJCQkJaWYoIXRpdGxlT2JqKXsKCQkJCQl0aXRsZU9iaiA9IGF3YWl0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVsZW1lbnRPYmplY3QoIltjbGFzc149J0l0ZW1IZWFkZXItLW1haW5UaXRsZS0tJ10iLCBmYWxzZSwgMTAsIDUwMCk7CgkJCQl9CgkJCQlpZighIXRpdGxlT2JqKXsKCQkJCQlnb29kc05hbWUgPSB0aXRsZU9iai50ZXh0Q29udGVudDsKCQkJCX0KCQkJfWNhdGNoKGUpe30KCQl9ZWxzZSBpZihwbGF0Zm9ybT09InRtYWxsIil7CgkJCWdvb2RzSWQgPSBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRQYXJhbXRlclF1ZXJ5VXJsKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsICJpZCIpOwoJCQl0cnl7CgkJCQljb25zdCB0aXRsZU9iaiA9IGF3YWl0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVsZW1lbnRPYmplY3QoIltjbGFzc149J0l0ZW1IZWFkZXItLW1haW5UaXRsZS0tJ10iLCBmYWxzZSwgMTAsIDUwMCk7CgkJCQlnb29kc05hbWUgPSB0aXRsZU9iai50ZXh0Q29udGVudDsKCQkJfWNhdGNoKGUpe30KCgkJfWVsc2UgaWYocGxhdGZvcm09PSJqZCIpewoJCQlnb29kc0lkID0gY29tbW9uRnVuY3Rpb25PYmplY3QuZ2V0RW5kSHRtbElkQnlVcmwoaHJlZik7CgkJCXRyeXsKCQkJCWNvbnN0IHRpdGxlT2JqID0gYXdhaXQgY29tbW9uRnVuY3Rpb25PYmplY3QuZ2V0RWxlbWVudE9iamVjdCgiW2NsYXNzPSdza3UtbmFtZSddIiwgZmFsc2UsIDEwLCA1MDApOwoJCQkJZ29vZHNOYW1lID0gdGl0bGVPYmoudGV4dENvbnRlbnQ7CgkJCX1jYXRjaChlKXt9CgkJfWVsc2UgaWYocGxhdGZvcm09PSJ2cGluaHVpIil7CgkJCWdvb2RzSWQgPSBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRFbmRIdG1sSWRCeVVybChocmVmKS5yZXBsYWNlKCJkZXRhaWwtIiwiIik7CgkJCXRyeXsKCQkJCWNvbnN0IHRpdGxlT2JqID0gYXdhaXQgY29tbW9uRnVuY3Rpb25PYmplY3QuZ2V0RWxlbWVudE9iamVjdCgiW2NsYXNzPSdwaWItdGl0bGUtZGV0YWlsJ10iLCBmYWxzZSwgMTAsIDUwMCk7CgkJCQlnb29kc05hbWUgPSB0aXRsZU9iai50ZXh0Q29udGVudDsKCQkJfWNhdGNoKGUpe30KCQl9CgkJdmFyIGRhdGE9eyJnb29kc0lkIjpnb29kc0lkLCAiZ29vZHNOYW1lIjpjb21tb25GdW5jdGlvbk9iamVjdC5maWx0ZXJTdHIoZ29vZHNOYW1lKX07CgkJcmV0dXJuIGRhdGE7Cgl9OwoJdGhpcy5yYW5kb21TcG1WYWx1ZT1mdW5jdGlvbigpewoJCSQoIm1ldGFbbmFtZT0nZGF0YS1zcG0nXSIpLmVhY2goZnVuY3Rpb24oKXsKCQkJdmFyIG1heCA9IDUwMDA7CgkJCXZhciBtaW4gPSAxMDAwOwoJCQl2YXIgcmFuZG9tVmFsdWUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKSArIG1pbjsKCQkJdmFyIHJhbmRvbUxldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqIDI2KSArICJhIi5jaGFyQ29kZUF0KDApKTsKCQkJJCh0aGlzKS5hdHRyKCJjb250ZW50IiwgcmFuZG9tVmFsdWUrcmFuZG9tTGV0dGVyKTsKCQl9KTsKCQkkKCJtZXRhW25hbWU9J3NwbS1pZCddIikuZWFjaChmdW5jdGlvbigpewoJCQl2YXIgbWF4ID0gNTAwMDsKCQkJdmFyIG1pbiA9IDEwMDA7CgkJCXZhciByYW5kb21WYWx1ZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSApICsgbWluOwoJCQl2YXIgcmFuZG9tTGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogMjYpICsgImEiLmNoYXJDb2RlQXQoMCkpOwoJCQkkKHRoaXMpLmF0dHIoImNvbnRlbnQiLCByYW5kb21WYWx1ZStyYW5kb21MZXR0ZXIpOwoJCX0pOwoJCSQoImJvZHkiKS5maW5kKCIqIikuZWFjaChmdW5jdGlvbigpewoJCQkkKHRoaXMpLnJlbW92ZUF0dHIoImRhdGEtc3BtLWFuY2hvci1pZCIpOwoJCQkkKHRoaXMpLnJlbW92ZUF0dHIoImRhdGEtc3BtIik7CgkJfSk7Cgl9OwoJdGhpcy5ydW5BbGlEZWNlcHRpb25TcG09ZnVuY3Rpb24oKSB7CgkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigiYWxpeXVuLmNvbSIpIT0tMSB8fCB3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKCJ0YW9iYW8uY29tIikhPS0xIHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoInRtYWxsLmNvbSIpIT0tMSl7CgkJCXRoaXMucmFuZG9tU3BtVmFsdWUoKTsKCQkJc2V0SW50ZXJ2YWwoKCk9PnsKCQkJCXRoaXMucmFuZG9tU3BtVmFsdWUoKTsKCQkJfSwgMjAwMCk7CgkJfQoJfTsKCXRoaXMucmVxdWVzdCA9IGZ1bmN0aW9uKG1vdGhlZCwgdXJsLCBwYXJhbSl7CgkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CgkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCXVybDogdXJsLAoJCQkJbWV0aG9kOiBtb3RoZWQsCgkJCQlkYXRhOnBhcmFtLAoJCQkJb25sb2FkOiBmdW5jdGlvbihyZXNwb25zZSkgewoJCQkJCXZhciBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CgkJCQkJdmFyIHBsYXl1cmwgPSAiIjsKCQkJCQlpZihzdGF0dXM9PTIwMHx8c3RhdHVzPT0nMjAwJyl7CgkJCQkJCXZhciByZXNwb25zZVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7CgkJCQkJCXJlc29sdmUoeyJyZXN1bHQiOiJzdWNjZXNzIiwgImpzb24iOnJlc3BvbnNlVGV4dH0pOwoJCQkJCX1lbHNlewoJCQkJCQlyZWplY3QoeyJyZXN1bHQiOiJlcnJvciIsICJqc29uIjpudWxsfSk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9KQoJfTsKCXRoaXMuY3JlYXRlUXJjb2RlID0gYXN5bmMgZnVuY3Rpb24ocGxhdGZvcm0sIG1zY2FuKXsKCQlpZighbXNjYW4gfHwgbXNjYW49PT0ibnVsbCIgfHwgIW1zY2FuLmhhc093blByb3BlcnR5KCJtb3VudCIpIAoJCQl8fCAhbXNjYW4uaGFzT3duUHJvcGVydHkoImh0bWwiKXx8ICFtc2Nhbi5oYXNPd25Qcm9wZXJ0eSgicXJjb2RlIikpewoJCQlyZXR1cm47CgkJfQoJCWNvbnN0IHttb3VudCwgaHRtbCwgcXJjb2RlLCBpZGVufSA9IG1zY2FuOwoJCWlmKCEhbW91bnQgJiYgISFodG1sICYmICEhcXJjb2RlICYmICEhaWRlbil7CgkJCSQobW91bnQpLmFwcGVuZChodG1sKTsKCQkJdmFyIGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibXNjYW4iK2lkZW4pOwoJCQl2YXIgd2lkdGggPSBjYW52YXNFbGVtZW50LmdldEF0dHJpYnV0ZSgid2lkdGgiKTsKCQkJdmFyIGhlaWdodCA9IGNhbnZhc0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKCQkJdmFyIGN4dCA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgiMmQiKTsKCQkJdmFyIGltZ0RhdGEgPSBuZXcgSW1hZ2UoKTsKCQkJaW1nRGF0YS5zcmMgPSBxcmNvZGU7CgkJCWltZ0RhdGEub25sb2FkPWZ1bmN0aW9uKCl7CgkJCQljeHQuZHJhd0ltYWdlKGltZ0RhdGEsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwoJCQl9CgkJfQoJfTsKCXRoaXMuY3JlYXRlQ291cG9uID0gYXN5bmMgZnVuY3Rpb24ocGxhdGZvcm0sIGRhdGEpewoJCWlmKCFkYXRhIHx8IGRhdGE9PT0ibnVsbCIgfHwgIWRhdGEuaGFzT3duUHJvcGVydHkoImNzcyIpIHx8ICFkYXRhLmhhc093blByb3BlcnR5KCJodG1sIil8fCAhZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaGFuZGxlciIpKXsKCQkJcmV0dXJuOwoJCX0KCQljb25zdCBjc3NUZXh0ID0gZGF0YS5jc3MsIGh0bWxUZXh0ID0gZGF0YS5odG1sLCBoYW5kbGVyID0gZGF0YS5oYW5kbGVyLCB0ZW1wbGF0ZUlkID0gZGF0YS50ZW1wbGF0ZUlkOwoJCWlmKCFjc3NUZXh0IHx8ICFodG1sVGV4dCB8fCAhaGFuZGxlcil7CgkJCXJldHVybjsKCQl9CgkJJCgiYm9keSIpLnByZXBlbmQoIjxzdHlsZT4iK2Nzc1RleHQrIjwvc3R5bGU+Iik7CgkJCgkJdmFyIGhhbmRsZXJzID0gaGFuZGxlci5zcGxpdCgiQCIpOwoJCWZvcih2YXIgaT0wOyBpPGhhbmRsZXJzLmxlbmd0aDsgaSsrKXsKCQkJdmFyICRoYW5kbGVyID0gJCgiIitoYW5kbGVyc1tpXSsiIik7CgkJCWlmKHBsYXRmb3JtPT0idGFvYmFvIil7CgkJCQkkaGFuZGxlci5wYXJlbnQoKS5hZnRlcihodG1sVGV4dCk7CgkJCX1lbHNlIGlmKHBsYXRmb3JtPT0idG1hbGwiKXsKCQkJCSRoYW5kbGVyLnBhcmVudCgpLmFmdGVyKGh0bWxUZXh0KTsKCQkJfWVsc2UgaWYocGxhdGZvcm09PSJqZCIpewoJCQkJJGhhbmRsZXIuYWZ0ZXIoaHRtbFRleHQpOwoJCQl9ZWxzZSBpZihwbGF0Zm9ybT09InZwaW5odWkiKXsKCQkJCSRoYW5kbGVyLmFmdGVyKGh0bWxUZXh0KTsKCQkJfQoJCX0KCQkKCQljb25zdCAkbGxrayA9ICQoIiMiK3RlbXBsYXRlSWQpOwoJCWlmKCRsbGtrLmxlbmd0aCA9PSAwKXsKCQkJcmV0dXJuOwoJCX0KCQkKCQljb25zdCBjb3Vwb25JZCA9ICRsbGtrLmRhdGEoImlkIik7CgkJY29uc3QgZ29vZHNQcml2YXRlVXJsID0gImh0dHA6Ly90dC5zaHVxaWFuZGlxaXUuY29tL2FwaS9wcml2YXRlL2NoYW5nZS9jb3Vwb24/bm89NSZ2PTEuMC4yJnBsYXRmb3JtPSIrcGxhdGZvcm0rIiZpZD0iOwoJCQoJCWlmKCEvXGQvLnRlc3QoY291cG9uSWQpKXsKCQkJcmV0dXJuOwoJCX0KCQkKCQlzZXRJbnRlcnZhbCgoKT0+ewoJCQkkbGxray5maW5kKCIqIikuZWFjaChmdW5jdGlvbigpewoJCQkJJCh0aGlzKS5yZW1vdmVBdHRyKCJkYXRhLXNwbS1hbmNob3ItaWQiKTsKCQkJfSk7CgkJfSw0MDApOwoJCQoJCWNvbnN0IGNvdXBvbkVsZW1lbnRBID0gJGxsa2suZmluZCgiYVtuYW1lPSdjcFNoVXJsJ10iKTsKCQljb3Vwb25FbGVtZW50QS51bmJpbmQoImNsaWNrIikuYmluZCgiY2xpY2siLCAoKT0+ewoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJdGhpcy5yZXF1ZXN0KCJHRVQiLCBnb29kc1ByaXZhdGVVcmwrY291cG9uSWQsIG51bGwpLnRoZW4oKHByaXZhdGVSZXN1bHREYXRhKT0+ewoJCQkJaWYocHJpdmF0ZVJlc3VsdERhdGEucmVzdWx0PT09InN1Y2Nlc3MiICYmICEhcHJpdmF0ZVJlc3VsdERhdGEuanNvbil7CgkJCQkJbGV0IHVybCA9IEpTT04ucGFyc2UocHJpdmF0ZVJlc3VsdERhdGEuanNvbikudXJsOwoJCQkJCWlmKCEhdXJsKSBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOnRydWV9KTsKCQkJCX0KCQkJfSk7CgkJfSk7CgkJCQkJCQkKCQkvL2NhbnZhc+eUu+S6jOe7tOeggQoJCXZhciAkY2FudmFzRWxlbWVudCA9ICQoIiNjYSIrdGVtcGxhdGVJZCk7CgkJaWYoJGNhbnZhc0VsZW1lbnQubGVuZ3RoID09IDApewoJCQlyZXR1cm47CgkJfQoJCWNvbnN0IHFyY29kZVJlc3VsdERhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QoIkdFVCIsIGdvb2RzUHJpdmF0ZVVybCtjb3Vwb25JZCwgbnVsbCk7CgkJaWYoISFxcmNvZGVSZXN1bHREYXRhICYmIHFyY29kZVJlc3VsdERhdGEucmVzdWx0PT09InN1Y2Nlc3MiICYmICEhcXJjb2RlUmVzdWx0RGF0YS5qc29uKXsKCQkJbGV0IGltZyA9IEpTT04ucGFyc2UocXJjb2RlUmVzdWx0RGF0YS5qc29uKS5pbWc7CgkJCWlmKCEhaW1nKXsKCQkJCXZhciBjYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhIit0ZW1wbGF0ZUlkKTsKCQkJCXZhciB3aWR0aCA9IGNhbnZhc0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwoJCQkJdmFyIGhlaWdodCA9IGNhbnZhc0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKCQkJCXZhciBjeHQgPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoIjJkIik7CgkJCQl2YXIgaW1nRGF0YSA9IG5ldyBJbWFnZSgpOwoJCQkJaW1nRGF0YS5zcmMgPSBpbWc7CgkJCQlpbWdEYXRhLm9ubG9hZD1mdW5jdGlvbigpewoJCQkJCWN4dC5kcmF3SW1hZ2UoaW1nRGF0YSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoJdGhpcy5jcmVhdGVIdG1sID0gYXN5bmMgZnVuY3Rpb24ocGxhdGZvcm0sIGdvb2RzSWQsIGdvb2RzTmFtZSl7CgkJaWYoIXBsYXRmb3JtIHx8ICFnb29kc0lkKXsKCQkJcmV0dXJuOwoJCX07CgkJbGV0IGFkZGl0aW9uID0gIiI7CgkJaWYocGxhdGZvcm09PSJ2cGluaHVpIil7CgkJCWNvbnN0IHZpcCA9IGdvb2RzSWQuc3BsaXQoIi0iKTsKCQkJYWRkaXRpb24gPSB2aXBbMF07CgkJCWdvb2RzSWQgPSB2aXBbMV07CgkJfQoJCWNvbnN0IGdvb2RzQ291cG9uVXJsID0gImh0dHA6Ly90dC5zaHVxaWFuZGlxaXUuY29tL2FwaS9jb3Vwb24vZGlzY292ZXI/bm89NSZ2PTEuMC4yJnBsPSIrcGxhdGZvcm0rIiZpZD0iK2dvb2RzSWQrIiZxdT0iK2dvb2RzTmFtZSsiJmFkZGl0aW9uPSIrYWRkaXRpb247CgkJdHJ5ewoJCQljb25zdCByZXN1dERhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QoIkdFVCIsIGdvb2RzQ291cG9uVXJsLCBudWxsKTsKCQkJaWYoISFyZXN1dERhdGEgJiYgcmVzdXREYXRhLnJlc3VsdD09PSJzdWNjZXNzIiAmJiAhIXJlc3V0RGF0YS5qc29uKXsKCQkJCWNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJlc3V0RGF0YS5qc29uKTsKCQkJCXRoaXMuY3JlYXRlQ291cG9uKHBsYXRmb3JtLCBqc29uLmRhdGEpOwoJCQkJdGhpcy5jcmVhdGVRcmNvZGUocGxhdGZvcm0sIGpzb24ubXNjYW4pOwoJCQl9CgkJfWNhdGNoKGUpewoJCQljb25zb2xlLmxvZygiY3JlYXRlQ291cG9uSHRtbCIsZSk7CgkJfQoJfTsKCXRoaXMuc3RhcnQgPSBhc3luYyBmdW5jdGlvbigpewoJCWlmKHRoaXMuaXNSdW4oKSl7CgkJCXRoaXMucnVuQWxpRGVjZXB0aW9uU3BtKCk7CgkJCXZhciBwbGF0Zm9ybSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVjb21tZXJjZVBsYXRmb3JtKCk7CgkJCWlmKCFwbGF0Zm9ybSkgcmV0dXJuOwoJCQkvL+WmguaenHNrdeWkquWkmuWwseaKmOWPoCzkuI3nhLbnp7vliqjnq6/kvZPpqozlpKrlt67kuoYKCQkJaWYocGxhdGZvcm09PSJ0bWFsbCIgfHwgcGxhdGZvcm09PSJ0YW9iYW8iKXsKCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVsZW1lbnRPYmplY3QoIltjbGFzcz0nc2t1SXRlbVdyYXBwZXInXSIsIGZhbHNlLCAxMCwgMTUwMCkudGhlbigoc2t1SXRlbVdyYXBwZXIpPT57CgkJCQkJaWYoc2t1SXRlbVdyYXBwZXIgIT0gbnVsbCl7CgkJCQkJCWNvbnN0IHsgc3R5bGUgfSA9IHNrdUl0ZW1XcmFwcGVyOwoJCQkJCQlzdHlsZS5tYXhIZWlnaHQgPSAiMzUwcHgiOwoJCQkJCQlzdHlsZS5vdmVyZmxvdyA9ICJhdXRvIjsKCQkJCQl9CgkJCQl9KS5jYXRjaCgoKT0+e30pOwoJCQl9CgkJCWNvbnN0IGdvb2RzRGF0YSA9IGF3YWl0IHRoaXMuZ2V0R29vZHNEYXRhKHBsYXRmb3JtKTsKCQkJdGhpcy5jcmVhdGVIdG1sKHBsYXRmb3JtLCBnb29kc0RhdGEuZ29vZHNJZCwgZ29vZHNEYXRhLmdvb2RzTmFtZSk7CgkJfQoJfTsKfQpmdW5jdGlvbiBTZWFyY2hQYWdlT2JqZWN0KCl7Cgl0aGlzLmludGVydmFsSXNSdW5Db21wbGV0ZSA9IHRydWU7ICAvL+WumuaXtuS7u+WKoeS4gOS4quW+queOr+aYr+WQpuWujOaIkAoJdGhpcy5waWNrdXBTZWFyY2hFbGVtZW50cyA9IGZ1bmN0aW9uKCl7IC8v5pS26ZuG5YiX6KGo55qE5YWD57SgCgkJY29uc3Qgc2VsZWN0b3JFbGVtZW50TGlzdCA9IG5ldyBBcnJheSgpOwoJCWNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCWlmKHVybC5pbmRleE9mKCI6Ly9zLnRhb2Jhby5jb20vc2VhcmNoIikhPS0xIHx8IHVybC5pbmRleE9mKCI6Ly9zLnRhb2Jhby5jb20vbGlzdCIpIT0tMSkgeyAvL+a3mOWuneaQnOe0oumhtemdogoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiLml0ZW1zID4uaXRlbSIsICJwYWdlIjoidGFvYmFvIn0pOwoJCgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIuQ29udGVudC0tY29udGVudC0tc2dTQ1oxMiAuQ2FyZC0tZG91YmxlQ2FyZFdyYXBwZXItLUwyWEZFNzMiLCAicGFnZSI6InRhb2Jhb19uZXcifSk7CgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIuQ29udGVudC0tY29udGVudC0tc2dTQ1oxMiAuQ2FyZC0tbGlzdENhcmRXcmFwcGVyLS1heDA5T2ZUIiwgInBhZ2UiOiJ0YW9iYW9fbmV3In0pOwoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiLkNvbnRlbnQtLWNvbnRlbnQtLXNnU0NaMTIgLkNhcmQtLWRvdWJsZUNhcmRXcmFwcGVyTWFsbC0tdVBtbzVCeiIsICJwYWdlIjoidGFvYmFvX25ldyJ9KTsKCQkJc2VsZWN0b3JFbGVtZW50TGlzdC5wdXNoKHsiZWxlbWVudCI6Ii5Db250ZW50LS1jb250ZW50LS1zZ1NDWjEyIC5DYXJkLS1saXN0Q2FyZFdyYXBwZXJNYWxsLS1FM2pJOEw0IiwgInBhZ2UiOiJ0YW9iYW9fbmV3In0pOwoJCgkJfWVsc2UgaWYodXJsLmluZGV4T2YoInRhb2Jhby5jb20vY2F0ZWdvcnkiKSE9LTEpeyAvL+a3mOWuneW6l+mTuuWIhuexuwoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiZGwuaXRlbSIsICJwYWdlIjoidGFvYmFvX2NhdGVnb3J5In0pOwoJCX1lbHNlIGlmKHVybC5pbmRleE9mKCJ0YW9iYW8uY29tL3NlYXJjaC5odG0iKSE9LTEpeyAvL+a3mOWuneW6l+mTuuaQnOe0ogoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiZGwuaXRlbSIsICJwYWdlIjoidGFvYmFvX3Nob3Bfc2VhcmNoIn0pOwoJCX0KCQllbHNlIGlmICh1cmwuaW5kZXhPZigiOi8vbGlzdC50bWFsbC5jb20vc2VhcmNoX3Byb2R1Y3QuaHRtIikhPS0xIHx8IHVybC5pbmRleE9mKCI6Ly9saXN0LnRtYWxsLmNvbS8vc2VhcmNoX3Byb2R1Y3QuaHRtIikhPS0xCgkJCXx8IHVybC5pbmRleE9mKCI6Ly9saXN0LnRtYWxsLmNvbS9jb3VkYW4vc2VhcmNoX3Byb2R1Y3QuaHRtIikhPS0xKSB7IC8v5aSp54yr6LaF5biCCgkKCQkJc2VsZWN0b3JFbGVtZW50TGlzdC5wdXNoKHsiZWxlbWVudCI6Ii5wcm9kdWN0IiwgInBhZ2UiOiJ0bWFsbF9jaGFvc2hpX3NlYXJjaCJ9KTsKCQkJc2VsZWN0b3JFbGVtZW50TGlzdC5wdXNoKHsiZWxlbWVudCI6Ii5jaGFvc2hpLXJlY29tbWVuZC1saXN0IC5jaGFvc2hpLXJlY29tbWVuZC1pdGVtIiwgInBhZ2UiOiJ0bWFsbF9jaGFvc2hpX3NlYXJjaF9uZXcifSk7IC8v5paw5aSp54yr6LaF5biCCgkKCQl9ZWxzZSBpZiAodXJsLmluZGV4T2YoIi8vbGlzdC50bWFsbC5oay9zZWFyY2hfcHJvZHVjdCIpIT0tMSkgeyAvL+WkqeeMq+WbvemZhQoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiI0pfSXRlbUxpc3QgLnByb2R1Y3QiLCAicGFnZSI6InRtYWxsX2hrIn0pOwoJCX1lbHNlIGlmKHVybC5pbmRleE9mKCJ0bWFsbC5jb20vY2F0ZWdvcnktIikhPS0xKXsgLy/lpKnnjKvliIbnsbsKCQkJc2VsZWN0b3JFbGVtZW50TGlzdC5wdXNoKHsiZWxlbWVudCI6IiNKX1Nob3BTZWFyY2hSZXN1bHQgZGwuaXRlbSIsICJwYWdlIjoidG1hbGxfY2F0ZWdvcnkifSk7CgkJfWVsc2UgaWYodXJsLmluZGV4T2YoInRtYWxsLmNvbS9jYXRlZ29yeS0iKSE9LTEpeyAvL+WkqeeMq+aXl+iIsOW6l+WIhuexuwoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiI0pfU2hvcFNlYXJjaFJlc3VsdCBkbC5pdGVtIiwgInBhZ2UiOiJ0bWFsbF9jYXRlZ29yeSJ9KTsKCQl9ZWxzZSBpZih1cmwuaW5kZXhPZigiLnRtYWxsLmNvbS9zaG9wL3ZpZXdfc2hvcC5odG0iKSE9LTEpeyAvL+WkqeeMq+aXl+iIsOWFqOmDqOWxleekugoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiZGwuaXRlbSIsICJwYWdlIjoidG1hbGxfc2hvcF8wMSJ9KTsKCQl9ZWxzZSBpZih1cmwuaW5kZXhPZigiLnRtYWxsLmNvbS9zZWFyY2guaHRtIikhPS0xKXsKCQkJc2VsZWN0b3JFbGVtZW50TGlzdC5wdXNoKHsiZWxlbWVudCI6ImRsLml0ZW0iLCAicGFnZSI6InRtYWxsX3Nob3Bfc2VhcmNoIn0pOwoJCX0KCQllbHNlIGlmKHVybC5pbmRleE9mKCIvL21haXlhby5saWFuZ3hpbnlhby5jb20vc2hvcC92aWV3X3Nob3AuaHRtIikhPS0xIAoJCQl8fCB1cmwuaW5kZXhPZigiLy9tYWl5YW8ubGlhbmd4aW55YW8uY29tL3NlYXJjaC5odG0iKSE9LTEKCQkJfHwgdXJsLmluZGV4T2YoIi8vbWFpeWFvLmxpYW5neGlueWFvLmNvbS9jYXRlZ29yeSIpIT0tMSl7IC8v6Zi/6YeM5aSn6I2v5oi/CgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIjSl9TaG9wU2VhcmNoUmVzdWx0IGRsLml0ZW0iLCAicGFnZSI6ImFsaV95YW8ifSk7CgkJfQoJCWVsc2UgaWYgKHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5jb20vU2VhcmNoIikhPS0xIHx8IHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5jb20vc2VhcmNoIikhPS0xKSB7IC8v5Lqs5Lic5pCc57SiCgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIjSl9nb29kc0xpc3QgbGkuZ2wtaXRlbSIsICJwYWdlIjoiamRfc2VhcmNoIn0pOwoJCX1lbHNlIGlmKHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5oay9TZWFyY2giKSE9LTEpeyAvL+S6rOS4nOWbvemZhWh0dHBzOi8vc2VhcmNoLmpkLmhrL1NlYXJjaD9rZXl3b3JkPWRzCgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIjcGxpc3QgbGkuZ2wtaXRlbSIsICJwYWdlIjoiamRfaGtfc2VhcmNoIn0pOyAvL+WPr+iDveW3suW8g+eUqAoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoibGlbY2xhc3NePSdwcm9kdWN0TGlzdF8nXSIsICJwYWdlIjoiamRfaGtfbmV3X3NlYXJjaCJ9KTsvLzIwMjQwMTE55re75YqgCgkJfWVsc2UgaWYodXJsLmluZGV4T2YoIi8vbWFsbC5qZC5jb20vdmlld19zZWFyY2giKSE9LTEpeyAvL+S6rOS4nOWkp+iNr+aIvwoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoibGkualN1Yk9iamVjdCIsICJwYWdlIjoiamRfeWFvX3NlYXJjaCJ9KTsKCQl9ZWxzZSBpZih1cmwuaW5kZXhPZigid3d3LmpkLmNvbSIpIT0tMSAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU9PSIvIil7CgkJCXNlbGVjdG9yRWxlbWVudExpc3QucHVzaCh7ImVsZW1lbnQiOiIjZmVlZENvbnRlbnQwIGxpLm1vcmUyX2l0ZW1fZ29vZCIsICJwYWdlIjoiamRfaG9tZXBhZ2UifSk7CgkJfQoJCWVsc2UgaWYodXJsLmluZGV4T2YoImNhdGVnb3J5LnZpcC5jb20vc3VnZ2VzdC5waHAiKSE9LTEpewoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiI0pfc2VhcmNoQ2F0TGlzdCAuYy1nb29kcy1pdGVtIiwgInBhZ2UiOiJ2cGluaHVpX3NlYXJjaF9wYWdlIn0pOwoJCX1lbHNlIGlmKHVybC5pbmRleE9mKCI6Ly9saXN0LnZpcC5jb20iKSE9LTEpewoJCQlzZWxlY3RvckVsZW1lbnRMaXN0LnB1c2goeyJlbGVtZW50IjoiI0pfd3JhcF9wcm9fYWRkIC5jLWdvb2RzLWl0ZW0iLCAicGFnZSI6InZwaW5odWlfbGlzdCJ9KTsKCQl9CgkJcmV0dXJuIHNlbGVjdG9yRWxlbWVudExpc3Q7Cgl9Cgl0aGlzLmNyZWF0ZUFsbEVsZW1lbnRIdG1sPWZ1bmN0aW9uKGVsZW1lbnREYXRhKXsgLy/kuLrmiYDmnInnmoTllYblk4HliJvlu7rmj5DnpLoKCQljb25zdCBzZWxmID0gdGhpczsKCQkkKGVsZW1lbnREYXRhLmVsZW1lbnQpLmVhY2goZnVuY3Rpb24oKXsgIC8v6YGN5Y6G5omA5pyJ55qE5ZWG5ZOB5qGGCgkJCXNlbGYuY3JlYXRlT25lRWxlbWVudEh0bWwoJCh0aGlzKSwgZWxlbWVudERhdGEpOwoJCX0pOwoJCXNlbGYuaW50ZXJ2YWxJc1J1bkNvbXBsZXRlID0gdHJ1ZTsKCX0KCS8qKgoJICog5Li65ZWG5ZOBYm945re75Yqg5pyJ5Yi45o+Q6YaSCgkgKiBAcGFyYW0ge09iamVjdH0gJGVsZW1lbnQgIOavj+S4gOS4quWVhuWTgWJveAoJICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnREYXRhIGlkIGFuZCBwYWdlCgkgKi8KCXRoaXMuY3JlYXRlT25lRWxlbWVudEh0bWw9YXN5bmMgZnVuY3Rpb24oJGVsZW1lbnQsIGVsZW1lbnREYXRhKXsgIC8v5p+l6K+i5Yiw5q+P5Liq5ZWG5ZOBbGlzdAoJCWlmKCRlbGVtZW50LmF0dHIoImluc3BlY3RyZXN1bHR4IikpeyAgLy/lvZPlrZjlnKjml7bvvIzor7TmmI7lt7Lnu4/lpITnkIbov4fkuoYKCQkJcmV0dXJuOwoJCX0KCQkkZWxlbWVudC5hdHRyKCJpbnNwZWN0cmVzdWx0eCIsICJ0cnVlIik7CgkJJGVsZW1lbnQuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIik7CgkJdmFyIHBhZ2UgPSBlbGVtZW50RGF0YS5wYWdlOwoJCXZhciBnb29kc0RldGFpbFVybCA9IG51bGw7CgkJCgkJaWYocGFnZT09PSJ0YW9iYW8iKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJhW2lkXj0nSl9JdGVtbGlzdF9UTGlua18nXSIpLmF0dHIoImhyZWYiKTsKCQl9ZWxzZSBpZihwYWdlPT09InRhb2Jhb19uZXciKXsKCQkJbGV0IGhyZWYgPSAkZWxlbWVudC5hdHRyKCJocmVmIik7CgkJCWdvb2RzRGV0YWlsVXJsID0gaHJlZi5pbmRleE9mKCJodHRwIikgPT0gLTEgPyAobG9jYXRpb24ucHJvdG9jb2wgKyBocmVmKSA6IGhyZWY7CgkJfWVsc2UgaWYocGFnZT09PSJ0YW9iYW9fY2F0ZWdvcnkiKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCIuSl9UR29sZERhdGEiKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJ0YW9iYW9fc2hvcF9zZWFyY2giKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCIuSl9UR29sZERhdGEiKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJhbGlfeWFvIil7CgkJCWdvb2RzRGV0YWlsVXJsID0gJGVsZW1lbnQuZmluZCgiLkpfVEdvbGREYXRhIikuYXR0cigiaHJlZiIpOwoJCX1lbHNlIGlmKHBhZ2U9PT0idG1hbGxfY2hhb3NoaV9zZWFyY2giKXsKCQkJbGV0IGhyZWYgPSAkZWxlbWVudC5maW5kKCJkaXYucHJvZHVjdC1pbWciKS5maW5kKCJhIikuYXR0cigiaHJlZiIpOwoJCQlnb29kc0RldGFpbFVybCA9IGhyZWYuaW5kZXhPZigiaHR0cCIpID09LTEgPyAobG9jYXRpb24ucHJvdG9jb2wgKyBocmVmKSA6IGhyZWY7CgkJfWVsc2UgaWYocGFnZT09PSJ0bWFsbF9jaGFvc2hpX3NlYXJjaF9uZXciKXsKCQkJbGV0IGhyZWYgPSAhISRlbGVtZW50LmF0dHIoImhyZWYiKT8kZWxlbWVudC5hdHRyKCJocmVmIik6JGVsZW1lbnQuZmluZCgiYSIpLmF0dHIoImhyZWYiKTsKCQkJZ29vZHNEZXRhaWxVcmwgPSBocmVmLmluZGV4T2YoImh0dHAiKSA9PS0xID8gKGxvY2F0aW9uLnByb3RvY29sICsgaHJlZikgOiBocmVmOwoJCX1lbHNlIGlmKHBhZ2U9PT0idG1hbGxfaGsiKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJhLnByb2R1Y3RJbWciKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJ0bWFsbF9jYXRlZ29yeSIpewoJCQlnb29kc0RldGFpbFVybCA9ICRlbGVtZW50LmZpbmQoIi5KX1RHb2xkRGF0YSIpLmF0dHIoImhyZWYiKTsKCQl9ZWxzZSBpZihwYWdlPT09InRtYWxsX3Nob3BfMDEiKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJkdC5waG90byIpLmZpbmQoImEiKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJ0bWFsbF9zaG9wX3NlYXJjaCIpewoJCQlnb29kc0RldGFpbFVybCA9ICRlbGVtZW50LmZpbmQoIi5KX1RHb2xkRGF0YSIpLmF0dHIoImhyZWYiKTsKCQl9CgkJZWxzZSBpZihwYWdlPT09ImpkX3NlYXJjaCIpewoJCQlnb29kc0RldGFpbFVybCA9ICRlbGVtZW50LmZpbmQoImRpdi5wLWltZyIpLmZpbmQoImEiKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJqZF9oa19zZWFyY2giKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJkaXYucC1pbWciKS5maW5kKCJhIikuYXR0cigiaHJlZiIpOwoJCX1lbHNlIGlmKHBhZ2U9PT0iamRfaGtfbmV3X3NlYXJjaCIpewoJCQlnb29kc0RldGFpbFVybCA9ICRlbGVtZW50LmZpbmQoImEiKS5hdHRyKCJocmVmIik7CgkJfWVsc2UgaWYocGFnZT09PSJqZF95YW9fc2VhcmNoIil7CgkJCWdvb2RzRGV0YWlsVXJsID0gJGVsZW1lbnQuZmluZCgiZGl2LmpQaWMiKS5maW5kKCJhIikuYXR0cigiaHJlZiIpOwoJCX1lbHNlIGlmKHBhZ2U9PSJqZF9ob21lcGFnZSIpewoJCQlnb29kc0RldGFpbFVybCA9ICRlbGVtZW50LmZpbmQoImFbY2xhc3M9J21vcmUyX2xrJ10iKS5hdHRyKCJocmVmIik7CgkJfQoJCWVsc2UgaWYocGFnZT09InZwaW5odWlfc2VhcmNoX3BhZ2UiKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJhIikuYXR0cigiaHJlZiIpOwoJCX1lbHNlIGlmKHBhZ2U9PSJ2cGluaHVpX2xpc3QiKXsKCQkJZ29vZHNEZXRhaWxVcmwgPSAkZWxlbWVudC5maW5kKCJhIikuYXR0cigiaHJlZiIpOwoJCX0KCQlpZighZ29vZHNEZXRhaWxVcmwpewoJCQlyZXR1cm47CgkJfQoJCWxldCBhbmFseXNpc0RhdGEgPSBudWxsOwoJCWlmKHBhZ2UuaW5kZXhPZigiamRfIikhPS0xKXsKCQkJdmFyIGpkSWQgPSBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRFbmRIdG1sSWRCeVVybChnb29kc0RldGFpbFVybCk7CgkJCWlmKCEhamRJZCl7CgkJCQlhbmFseXNpc0RhdGEgPSB7ImlkIjpqZElkLCAicGxhdGZvcm0iOiJqZCJ9OwoJCQl9CgkJfWVsc2UgaWYocGFnZS5pbmRleE9mKCJ2cGluaHVpXyIpIT0tMSl7CgkJCXZhciB2aXBJZCA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVuZEh0bWxJZEJ5VXJsKGdvb2RzRGV0YWlsVXJsKS5yZXBsYWNlKCJkZXRhaWwtIiwiIik7CgkJCWlmKCEhdmlwSWQpewoJCQkJYW5hbHlzaXNEYXRhID0geyJpZCI6dmlwSWQuc3BsaXQoIi0iKVsxXSwgInBsYXRmb3JtIjoidnBpbmh1aSJ9OwoJCQl9CgkJfWVsc2V7CgkJCXZhciBwbGF0Zm9ybSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEVjb21tZXJjZVBsYXRmb3JtKGdvb2RzRGV0YWlsVXJsKTsKCQkJdmFyIGlkID0gY29tbW9uRnVuY3Rpb25PYmplY3QuZ2V0UGFyYW10ZXJRdWVyeVVybChnb29kc0RldGFpbFVybCwgImlkIik7CgkJCWlmKHBsYXRmb3JtICYmIGlkKXsKCQkJCWFuYWx5c2lzRGF0YSA9IHsiaWQiOmlkLCAicGxhdGZvcm0iOnBsYXRmb3JtfTsKCQkJfQoJCX0KCQlpZighYW5hbHlzaXNEYXRhKXsKCQkJcmV0dXJuOwoJCX0KCQl0cnl7CgkJCWNvbnN0IHNlYXJjaFVybCA9ICJodHRwOi8vai5qaWF5b3VzaGljaGFuZy5jb20vYXBpL2VidXNpbmVzcy9jb3Vwb24vZXhpc3QvIithbmFseXNpc0RhdGEucGxhdGZvcm0rIj9pZD0iK2FuYWx5c2lzRGF0YS5pZDsKCQkJY29uc3QgZGF0YSA9IGF3YWl0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LnJlcXVlc3QoIkdFVCIsIHNlYXJjaFVybCwgbnVsbCk7CgkJCWlmKGRhdGEucmVzdWx0PT0ic3VjY2VzcyIgJiYgISFkYXRhLmRhdGEpewoJCQkJY29uc3QgdGlwID0gSlNPTi5wYXJzZShkYXRhLmRhdGEpLnRpcDsKCQkJCWlmKHRpcCl7CgkJCQkJJGVsZW1lbnQuYXBwZW5kKHRpcCk7CgkJCQl9CgkJCX0KCQl9Y2F0Y2goZSl7CgkJCWNvbnNvbGUubG9nKGUpOwoJCX0KCX0KCXRoaXMuc2VhcmNoUGFnZT1mdW5jdGlvbihzZWxlY3RvckVsZW1lbnRMaXN0KXsKCQlpZighdGhpcy5pbnRlcnZhbElzUnVuQ29tcGxldGUpewoJCQlyZXR1cm47CgkJfQoJCXNlbGVjdG9yRWxlbWVudExpc3QuZm9yRWFjaCgoZWxlbWVudERhdGEpPT57CgkJCWlmKCEhZWxlbWVudERhdGEpewoJCQkJdGhpcy5jcmVhdGVBbGxFbGVtZW50SHRtbChlbGVtZW50RGF0YSk7CgkJCX0KCQl9KTsKCX0KCXRoaXMuc3RhcnQ9ZnVuY3Rpb24oKXsKCQljb25zdCBzZWxlY3RvckVsZW1lbnRMaXN0ID0gdGhpcy5waWNrdXBTZWFyY2hFbGVtZW50cygpOwoJCXNldEludGVydmFsKCgpPT57CgkJCXRoaXMuc2VhcmNoUGFnZShzZWxlY3RvckVsZW1lbnRMaXN0KTsKCQl9LCA1MDApOwoJfTsKfQp0cnl7CgkobmV3IFNlYXJjaFBhZ2VPYmplY3QoKSkuc3RhcnQoKTsKCShuZXcgUXVlcnlDb3Vwb24oKSkuc3RhcnQoKTsKfWNhdGNoKGUpewoJY29uc29sZS5sb2coIuS8mOaDoOWIuOafpeivou+8mmVycm9y77yaIitlKTsKfQoJLy/lm73lpJbnmoTkuIDkupvop6PmnpAKZnVuY3Rpb24gQWJyb2FkVmlkZW9IZWxwZXIoKXsKCXRoaXMuaXNSdW4gPSBmdW5jdGlvbigpewoJCXZhciB1cmxzPVsieW91dHViZS5jb20iLCAiZmFjZWJvb2suY29tIl07CgkJZm9yKHZhciBpPTA7IGk8dXJscy5sZW5ndGg7aSsrKXsKCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZih1cmxzW2ldKSE9LTEpewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCWlmKCF0aGlzLmlzUnVuKCkpewoJCQlyZXR1cm47CgkJfQoJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCWNvbnN0IGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQkJY29uc3QgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQljb25zdCBlbGVJZCA9ICJmcmVlLXh4MS1wbGF5ZXItc2NyaXB0LTk5OTkiOwoJCQkKCQkJLy95b3V0dWJl6Kej5p6QCgkJCWlmKGhvc3QuaW5kZXhPZigieW91dHViZS5jb20iKSE9LTEpewoJCQkJaWYoaHJlZi5pbmRleE9mKCJ5b3V0dWJlLmNvbS93YXRjaCIpIT0tMSl7CgkJCQkJaWYoJCgiIyIrZWxlSWQpLmxlbmd0aCAhPSAwKXsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQl2YXIgaHRtbD0nPGRpdiBpZD0iJytlbGVJZCsnIiBzdHlsZT0id2lkdGg6NTBweDtmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwLjA1KTtib3JkZXItcmFkaXVzOjI1cHg7cGFkZGluZzogOXB4IDEzcHg7cG9zaXRpb246cmVsYXRpdmU7bGVmdDo4cHg7Ij4nKwoJCQkJCQkn5LiL6L29JysKCQkJCQkJJzwvZGl2Pic7CgkJCQkJJCgiI293bmVyIikuYXBwZW5kKGh0bWwpOwoJCQkJCSQoImJvZHkiKS5vZmYoImNsaWNrIiwgIiMiK2VsZUlkKS5vbigiY2xpY2siLCAiIyIrZWxlSWQsIGZ1bmN0aW9uKCl7CgkJCQkJCXZhciBsb2NhdGlvbl91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJCQkJdmFyIHZpZGVvdXJsID0gImh0dHBzOi8vd3d3LnZpZGVvZmsuY29tL3ZpZGVvZmstdmlkZW8tZG93bmxvYWQvc2VhcmNoP3VybD0iK2xvY2F0aW9uX3VybDsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01vcGVuSW5UYWIodmlkZW91cmwpOwoJCQkJCX0pOwoJCQkJfWVsc2V7CgkJCQkJJCgiIyIrZWxlSWQpLnJlbW92ZSgpOwoJCQkJfQoJCQl9CgkJCQoJCQkvL2ZhY2Vib29r6Kej5p6QCgkJCWlmKGhvc3QuaW5kZXhPZigiZmFjZWJvb2suY29tIikhPS0xKXsKCQkJCWlmKGhyZWYuaW5kZXhPZigiZmFjZWJvb2suY29tL3dhdGNoIikhPS0xIHx8IGhyZWYuaW5kZXhPZigiL3ZpZGVvcy8iKSE9LTEpewoJCQkJCWlmKCQoIiMiK2VsZUlkKS5sZW5ndGggIT0gMCl7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJdmFyIGljb25WaWRlbyA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFET1VsRVFWUm9RKzJaejR1TlVSakhQOStGOGc4Z3lrS0pOSk1VVW16TURLWm1ZVllzTEJSaE9hRW1GaFJSTENaRFk0UEJySlJSRWtVTW1ZM1VSQ2svczZHTWhSOVpXTms5T3ZYTzdiMTMzdmUrNTd3LzdzelVuTHFiZTU5Zm4vT2M4NXpubkN2bStOQWNqNTk1Z0hnR3pXd0RzQlpZRGF3RUZnSS9nVC9BUjBuRFpXZThsQXlZV1Rld0Y5aVRFZUE0TUNUcGJsa2doUUhNN0J4d1BEQ2dBVW45Z1RxSjRvVUF6T3dLY0NobklDT1M5dVhVcmFubEJqQ3phOENCZ2dGY2xIU2tpSTFjQUdiV0JUd3Q0amltMnkzcFNWNWJ3UUJtdGdxNEJhelA2N1JCN3czZ3N2QVgrQ2JwVjRoZEw0Q29QRzRIM0tjanhFRU9XVmR5SHdQamtxNW02V2NDbU5tRmFJYXliRlh4KzJ2Z3NxU1JOT09wQUdhMkdIaFk0bElwQW5oYTBxa2tBNGtBWnVaTzBrOUZQRmFnMnlISkhZUjFJdzNnTzdDc2dpQ0ttUHdNZEVtYWpCdVpCbUJtYnVNY0xPS3BRdDFCU1VkVEFjek1WWm1RbWp3dHBUbUMzeHFvMHlicHc1Uk9YUWJNckErNDVHdFFVbVlWeTdKbFpwWWwwL0I3M1ladUJBanFiV1lJNEtXa3pXa1plQlZTTnVNQVp1YTFGQm9yU1k0TVRFcGFuZ1lRbE00RWdPZFp5NkV4YXprQWlOdG9YRUx2Z0xhc0lHcjBzVDBRWmFBVkFPOGx0YWRsWUJUWU5jc0I3a2phblFad0hqZzJ5d0dhVmlIWElydU43RFZtWUErNGxudWRwQytKR1hCZmhsd1Rad0RBUFFpNHM2bzJrbG9KOXl6eXlLY1hhakdBNjRGNkpMMXRDaEJsd2RYMG9JclNnaXJVSytsKzQ5cHVkaC9JaEdoaEJ2b2xEU1J0ekthOWpKa3RCZHhyV2sraWN2WG53TzNvSWV4RldsWEpiTWJNYkFHd0pRV2cxbzBXV0VLcExValNCY1o3Q1huVjBaaFFYb0JRUC9NQVV6TmdadTVaOEViUkdRVDJTN3FaMTA3bUhtaG11SVFubDJsWHhGQ1FRZ0RSbVRFR2JBdDFESXhKMnBGRHIwNmxESUJGZ0RzZGx3UUU4d05vbC9RN1FDZFJ0REJBbElWTzRGbEFNSjJTTWs5NkgzdWxBRVFRaDRGQkQ2ZDlrb1k4NUx4RVNnT0lJSzY3cXRMRTg3Q2tVdCtjU2dXSUlDYUFqUWtRRTVJMmVVMXJnRkFWQUNzQTkvRGsvcUdjR3YrQU5aSytCc1RtSlZvNlFKU0ZYdUJlTElLZGtoNTRSUlFvVkFsQUJIRUNPQU9jbEhRMk1DNXY4Y29BSW9qUitBdUNkMVFCZ3BVQ0JNU1JXM1FlSVBmVWxhVDRIMC83UlVBaTJhL05BQUFBQUVsRlRrU3VRbUNDIjsKCQkJCQl2YXIgaHRtbD0nPGRpdiBpZD0iJytlbGVJZCsnIiBzdHlsZT0id2lkdGg6MjVweDtwYWRkaW5nOjEwcHggMHB4O3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I0U1MjEyRTtwb3NpdGlvbjpmaXhlZDt0b3A6MjUwcHg7bGVmdDowcHg7Y29sb3I6I0ZGRjtmb250LXNpemU6MHB4O3otaW5kZXg6OTk5OTk5OTk5OTk5OTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MHB4IGF1dG87dGV4dC1hbGlnbjpjZW50ZXI7Ij4nKwoJCQkJCQknPGltZyBzcmM9IicraWNvblZpZGVvKyciIHN0eWxlPSJ3aWR0aDoyMHB4OyI+JysKCQkJCQkJJzwvZGl2Pic7CgkJCQkJJCgiYm9keSIpLmFwcGVuZChodG1sKTsKCQkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiMiK2VsZUlkLCBmdW5jdGlvbigpewoJCQkJCQl2YXIgbG9jYXRpb25fdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoImZhY2Vib29rX2Rvd25sb2FkZXJfb2JqIiwgeyJmYWNlYm9va191cmwiOmxvY2F0aW9uX3VybH0pOwoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYigiaHR0cHM6Ly95dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyIik7CgkJCQkJfSk7CgkJCQl9ZWxzZXsKCQkJCQkkKCIjIitlbGVJZCkucmVtb3ZlKCk7CgkJCQl9CgkJCX0KCQl9LCAxMDAwKTsKCQkKCQlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ5dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyIikhPS0xKXsgLy9mYWNlYm9va+S4i+i9vQoJCQl2YXIgZmFjZWJvb2tPYmplY3QgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKCJmYWNlYm9va19kb3dubG9hZGVyX29iaiIpOwoJCQlpZighIWZhY2Vib29rT2JqZWN0KXsKCQkJCSQoIiNzX2lucHV0IikudmFsKGZhY2Vib29rT2JqZWN0LmZhY2Vib29rX3VybCk7CgkJCX0KCQl9Cgl9Cn0KdHJ5ewoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlciB8fCBmdW5jdGlvbkNvbnRyb2xsZXIuYWJyb2FkVmlkZW9IZWxwZXIpewoJCShuZXcgQWJyb2FkVmlkZW9IZWxwZXIoKSkuc3RhcnQoKTsKCX0KfWNhdGNoKGUpewoJY29uc29sZS5sb2coIuWbveWkluinhumikeino+aekO+8mmVycm9y77yaIitlKTsKfQoJZnVuY3Rpb24gU2hvcnRWaWRlb0Rvd25sb2FkZXIoKXsKCXRoaXMuZG91eWluVmlkZW9Eb3dubG9hZGVyID0gZnVuY3Rpb24oKXsKCQkvKioKCQkgKiDmraTlpITku6PnoIHmnInlgJ/pibRsYXp5ZnJvZ+eahOS7o+egge+8jOWcqOWOn+adpeS7o+eggeeahOWfuuehgOS4iuS/ruaUueS6humDqOWIhuWKn+iDveWSjGJ1Z+S/ruWkjQoJCSAqIOiEmuacrOWcsOWdgO+8mmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80Njk1MjEKCQkgKiDnibnmraTms6jmmI4KCQkgKi8KCQljb25zdCBfc2VsZiA9IHRoaXM7CgkJZnVuY3Rpb24gcnVuKCl7CgkJCWxldCBkb3dubG9hZE9wdGlvbiA9IFt7bmFtZTonJyxpZDondG9TZXJ2ZXInfSx7bmFtZTon5omT5byA6KeG6aKR5rqQJyxpZDondG9MaW5rJ31dOwoJCQlsZXQgdmlkZW9FbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ZpZGVvJyk7CgkJCWlmKHZpZGVvRWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsKCQkJIAoJCQkvL+aKiuiHquWKqOaSreaUvueahHZpZGVv5qCH562+6YCJ5oup5Ye65p2lCgkJCWxldCBwbGF5VmlkZW9FbGVtZW50cz1bXTsKCQkJdmlkZW9FbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpewoJCQkJbGV0IGF1dG9wbGF5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5Jyk7CgkJCQlpZihhdXRvcGxheSAhPT0gbnVsbCl7CgkJCQkJcGxheVZpZGVvRWxlbWVudHMucHVzaChlbGVtZW50KTsKCQkJCX0KCQkJfSkKCQkJCgkJCWxldCB2aWRlb0NvbnRhaW5lcj1sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ21vZGFsX2lkJykgIT0gLTEgCgkJCQk/IHBsYXlWaWRlb0VsZW1lbnRzWzBdCgkJCQk6IHBsYXlWaWRlb0VsZW1lbnRzW3BsYXlWaWRlb0VsZW1lbnRzLmxlbmd0aC0xXTsKCQkJaWYoIXZpZGVvQ29udGFpbmVyKSByZXR1cm47CgkJCSAKCQkJLy/ojrflj5bop4bpopHmkq3mlL7lnLDlnYAKCQkgICBsZXQgdXJsID0gdmlkZW9Db250YWluZXIgJiYgdmlkZW9Db250YWluZXIuY2hpbGRyZW4ubGVuZ3RoPjAgJiYgdmlkZW9Db250YWluZXIuY2hpbGRyZW5bMF0uc3JjCgkJCQkJCT8gdmlkZW9Db250YWluZXIuY2hpbGRyZW5bMF0uc3JjCgkJCQkJCTogdmlkZW9Db250YWluZXIuc3JjOwoJCQkgCgkJCS8v6I635Y+W6KeG6aKRSUTvvIzphY3lkIjoh6rlrprkuYlpZOS9v+eUqAoJCQlsZXQgdmlkZW9JZDsKCQkJbGV0IHJlc3AgPSB1cmwubWF0Y2goL14oaHR0cHM6KT9cL1wvLitcLmNvbVwvKFthLXpBLVowLTldKylcL1thLXpBLVowLTldK1wvdmlkZW8vKTsKCQkJbGV0IHJlcyA9IHVybC5tYXRjaCgvYmxvYjpodHRwczpcL1wvd3d3LmRvdXlpbi5jb21cLyguKikvKTsKCQkJaWYocmVzcCAmJiByZXNwWzJdKXsKCQkJCXZpZGVvSWQ9cmVzcFsyXTsKCQkJfWVsc2UgaWYocmVzICYmIHJlc1sxXSl7CgkJCQl2aWRlb0lkPXJlc1sxXQoJCQl9ZWxzZXsKCQkJCXZpZGVvSWQgPSB2aWRlb0NvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEteGdwbGF5ZXJpZCcpCgkJCX0KCQkJIAoJCQlsZXQgcGxheUNvbnRhaW5lciA9IHZpZGVvQ29udGFpbmVyLnBhcmVudE5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcueGctcmlnaHQtZ3JpZCcpOwoJCQlpZighcGxheUNvbnRhaW5lcikgcmV0dXJuOwoJCQkKCQkJLy/lnKjlr7nkuLvpobXlsLHooYzop4bpopHmtY/op4jml7bkvJrlh7rnjrDlpJrkuKrmjInpkq7vvIzliKDpmaTkuI3pnIDopoHnmoTvvIzlj6rkv53nlZnlvZPliY3lr7nlupTnmoQKCQkJbGV0IHZpZGVvRG93bmxvYWREb20gPSBwbGF5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNzY3JpcHRWaWRlb0Rvd25sb2FkJyt2aWRlb0lkKTsKCQkJaWYodmlkZW9Eb3dubG9hZERvbSl7CgkJCQlsZXQgZG9tID0gcGxheUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcueGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZycpOwoJCQkJZG9tLmZvckVhY2goZnVuY3Rpb24oZCl7CgkJCQkJbGV0IGJ0biA9IGQucXVlcnlTZWxlY3RvcignLmJ0bicpOwoJCQkJCWlmKGQuaWQgIT0gJ3NjcmlwdFZpZGVvRG93bmxvYWQnK3ZpZGVvSWQgJiYgYnRuLmlubmVyVGV4dD09J+S4i+i9vScpewoJCQkJCQlkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7CgkJCQkJfQoJCQkJfSk7CgkJCQlyZXR1cm47CgkJCX0KCQkJIAoJCQlpZih2aWRlb0NvbnRhaW5lciAmJiBwbGF5Q29udGFpbmVyKXsKCQkJCWxldCBwbGF5Q2xhcml0eURvbSA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXljbGFyaXR5LXNldHRpbmcnKTsKCQkJCWlmKCFwbGF5Q2xhcml0eURvbSkgcmV0dXJuOwoJCgkJCQlsZXQgcGFseUNsYXJpdHlCdG4gPSBwbGF5Q2xhcml0eURvbS5xdWVyeVNlbGVjdG9yKCcuYnRuJyk7CgkJCQlpZighcGFseUNsYXJpdHlCdG4pIHJldHVybjsKCQoJCQkJbGV0IGRvd25sb2FkRG9tID0gcGxheUNsYXJpdHlEb20uY2xvbmVOb2RlKHRydWUpOwoJCQkJZG93bmxvYWREb20uc2V0QXR0cmlidXRlKCdpZCcsJ3NjcmlwdFZpZGVvRG93bmxvYWQnK3ZpZGVvSWQpOwoJCgkJCQlpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3NlYXJjaCcpID09IC0xKXsKCQkJCQlkb3dubG9hZERvbS5zdHlsZT0nbWFyZ2luLXRvcDotNjhweDtwYWRkaW5nLXRvcDoxMDBweDtwYWRkaW5nLWxlZnQ6MjBweDtwYWRkaW5nLXJpZ2h0OjIwcHg7JzsKCQkJCX1lbHNlewoJCQkJCWRvd25sb2FkRG9tLnN0eWxlPSdtYXJnaW4tdG9wOjBweDtwYWRkaW5nLXRvcDoxMDBweDsnOwoJCQkJfQoJCgkJCQlsZXQgZG93bmxvYWRUZXh0ID0gZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLmJ0bicpOwoJCQkJZG93bmxvYWRUZXh0LmlubmVyVGV4dD0n5LiL6L29JzsKCQkJCWRvd25sb2FkVGV4dC5zdHlsZSA9ICdmb250LXNpemU6MTRweDtmb250LXdlaWdodDo2MDA7JzsKCQkJCWRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtRG91eWluRG93bmxvYWQnK3ZpZGVvSWQpOwoJCQkJCgkJCQlsZXQgZGV0YWlsID0gcGxheUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCd4Zy1pY29uOm50aC1vZi10eXBlKDEpJykuY2hpbGRyZW5bMF07CgkJCQlsZXQgbGlua1VybCA9IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA/IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA6IGxvY2F0aW9uLmhyZWY7CgkKCQkJCWlmKGxpbmtVcmwuaW5kZXhPZignd3d3LmRvdXlpbi5jb20nKT09LTEpewoJCQkJCWxpbmtVcmw9Jy8vd3d3LmRvdXlpbi5jb20nK2xpbmtVcmw7CgkJCQl9CgkKCQkJCWRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyxsaW5rVXJsKTsKCQkJCWRvd25sb2FkVGV4dC5yZW1vdmVBdHRyaWJ1dGUoJ3RhcmdldCcpOwoJCQkJZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnaHJlZicsJ2phdmFzY3JpcHQ6dm9pZCgwKTsnKTsKCQoJCQkJbGV0IHZpcnR1YWxEb20gPSBkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcudmlydHVhbCcpOwoJCQkJZG93bmxvYWREb20ub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsKCQkJCQlpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3NlYXJjaCcpID09IC0xKXsKCQkJCQkJdmlydHVhbERvbS5zdHlsZT0nZGlzcGxheTpibG9jayAhaW1wb3J0YW50JzsKCQkJCQl9ZWxzZXsKCQkJCQkJdmlydHVhbERvbS5zdHlsZT0nZGlzcGxheTpibG9jayAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206MzdweDsnOwoJCQkJCX0KCQkJCX0KCQoJCQkJZG93bmxvYWREb20ub25tb3VzZW91dD1mdW5jdGlvbigpewoJCQkJCXZpcnR1YWxEb20uc3R5bGU9J2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50JzsKCQkJCX0KCQoJCQkJbGV0IGRvd25sb2FkSHRtbCA9ICcnOwoJCQkJZG93bmxvYWRPcHRpb24uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCQkJCQlpZihpdGVtLmlkPT0idG9TZXJ2ZXIiKXsKCQkJCQkJZG93bmxvYWRIdG1sICs9IGA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIGNsYXNzPSJpdGVtICR7aXRlbS5pZH0iIGlkPSIke2l0ZW0uaWR9JHt2aWRlb0lkfSI+6KeG6aKR5YiG5p6QPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPijng63pl6gpPC9zcGFuPjwvZGl2PmA7CgkJCQkJfWVsc2V7CgkJCQkJCWRvd25sb2FkSHRtbCArPSBgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiBjbGFzcz0iaXRlbSAke2l0ZW0uaWR9IiBpZD0iJHtpdGVtLmlkfSR7dmlkZW9JZH0iPiR7aXRlbS5uYW1lfTwvZGl2PmA7CgkJCQkJfQoJCgkJCQl9KQoJCgkJCQlpZihkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcudmlydHVhbCcpKXsKCQkJCQlkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcudmlydHVhbCcpLmlubmVySFRNTCA9IGRvd25sb2FkSHRtbDsKCQkJCX0KCQoJCQkJcGxheUNsYXJpdHlEb20uYWZ0ZXIoZG93bmxvYWREb20pOwoJCgkJCQkvL+ebtOaOpeaJk+W8gAoJCQkJbGV0IHRvTGlua0RvbSA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvTGluaycrdmlkZW9JZCk7CgkJCQlpZih0b0xpbmtEb20pewoJCQkJCXRvTGlua0RvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCQkJCQkJaWYodXJsLm1hdGNoKC9eYmxvYi8pKXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuWKoOWvhuinhumikeWcsOWdgO+8jOaXoOazleebtOaOpeaJk+W8gCIsICJiYWNrZ3JvdW5kIjoiIzE0MTQxNCJ9KTsKCQkJCQkJfWVsc2V7CgkJCQkJCQl3aW5kb3cub3Blbih1cmwpOwoJCQkJCQl9CgkJCQkJfSkKCQkJCX0KCQoJCQkJLy/nm7TmjqXkuIvovb0KCQkJCWxldCB0b0Rvd25sb2FkRG9tID0gcGxheUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjdG9TZXJ2ZXInK3ZpZGVvSWQpOwoJCQkJaWYodG9Eb3dubG9hZERvbSl7CgkJCQkJdG9Eb3dubG9hZERvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCQkJCQkJd2luZG93Lm9wZW4oImh0dHBzOi8vd3d3LnF1emh1YW5wYW4uY29tL3JlZGlyZWN0L2Q/dD0iKyhuZXcgRGF0ZSgpKS5nZXRUaW1lKCkrIiZ1cmw9Iit3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJCQkJfSkKCQkJCX0KCQkJfQoJCX0KCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQlydW4oKTsKCQl9LCA1MDApOwoJCQoJfTsKCXRoaXMua3VhaXNob3VWaWRlb0Rvd25sb2FkZXIgPSBmdW5jdGlvbigpewoJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0ICE9PSAid3d3Lmt1YWlzaG91LmNvbSIpewoJCQlyZXR1cm47CgkJfQoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpewoJCQlhc3luYyBmdW5jdGlvbiBkb3dubG9hZGVyKCl7CgkJCQlsZXQga3VhaXNob3VWaWRlb0Rvd25sb2RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNrdWFpc2hvdS12aWRlby1kb3dubG9kZXIiKTsKCQkJCWlmKCFrdWFpc2hvdVZpZGVvRG93bmxvZGVyKXsKCQkJCQlsZXQgZG93bmxvYWRESVYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQkJCQlkb3dubG9hZERJVi5zdHlsZSA9ICJjdXJzb3I6cG9pbnRlcjt3aWR0aDo1MHB4O2hlaWdodDo0MHB4O2xpbmUtaGVpZ2h0OjQwcHg7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRkZGO2NvbG9yOiMwMDA7cG9zaXRpb246Zml4ZWQ7dG9wOjIwMHB4O2xlZnQ6MHB4O3otaW5kZXg6OTk5OyI7CgkJCQkJZG93bmxvYWRESVYuaW5uZXJUZXh0ID0gIuS4i+i9vSI7CgkJCQkJZG93bmxvYWRESVYuc2V0QXR0cmlidXRlKCdpZCcsJ2t1YWlzaG91LXZpZGVvLWRvd25sb2RlcicpOwoJCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRESVYpOwoJCQkJCQoJCQkJCWRvd25sb2FkRElWLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oZSl7CgkJCQkJCWxldCB2aWRlb0RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItdmlkZW8nKTsKCQkJCQkJaWYoIXZpZGVvRG9tKXsKCQkJCQkJCWNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQlsZXQgdmlkZW9TcmMgPSB2aWRlb0RvbS5nZXRBdHRyaWJ1dGUoJ3NyYycpOwkJCQkJCgkJCQkJCWlmKHZpZGVvU3JjLm1hdGNoKC9eYmxvYi8pKXsKCQkJCQkJCWNvbnNvbGUubG9nKCdibG9i6KeG6aKR5peg5rOV5LiL6L29Jyk7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01vcGVuSW5UYWIodmlkZW9TcmMpOwoJCQkJCX0pOwoJCQkJfQoJCQl9CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5zd2l0Y2gtaXRlbSIpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpewoJCQkJdmFsdWUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCWRvd25sb2FkZXIoKTsKCQkJCX0pOwoJCQl9KQoJCQlkb3dubG9hZGVyKCk7CgkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQlsZXQga3VhaXNob3VWaWRlb0Rvd25sb2RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNrdWFpc2hvdS12aWRlby1kb3dubG9kZXIiKTsKCQkJCWlmKGt1YWlzaG91VmlkZW9Eb3dubG9kZXIpewoJCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLm1hdGNoKC9odHRwczpcL1wvd3d3XC5rdWFpc2hvdVwuY29tXC9zaG9ydC12aWRlb1wvLio/LykpewoJCQkJCQlrdWFpc2hvdVZpZGVvRG93bmxvZGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJCQkJCX1lbHNlewoJCQkJCQlrdWFpc2hvdVZpZGVvRG93bmxvZGVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQkJfQoJCQkJfQoJCQl9LCA4MDApOwoJCX0pOwoJfTsKCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCXRoaXMuZG91eWluVmlkZW9Eb3dubG9hZGVyKCk7CgkJdGhpcy5rdWFpc2hvdVZpZGVvRG93bmxvYWRlcigpOwoJfTsKfTsKdHJ5ewoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlciB8fCBmdW5jdGlvbkNvbnRyb2xsZXIuc2hvcnRWaWRlb0Rvd25sb2FkKXsKCQkobmV3IFNob3J0VmlkZW9Eb3dubG9hZGVyKCkpLnN0YXJ0KCk7Cgl9Cn1jYXRjaChlKXsKCWNvbnNvbGUubG9nKCLnn63op4bpopHljrvmsLTljbDkuIvovb3vvJplcnJvcu+8miIrZSk7Cn0KCS8v54mI5pys5o6n5Yi2CmZ1bmN0aW9uIFZlcnNpb25Db250cm9sbGVyKCl7Cgl0aGlzLmNoZWNrVmVyc2lvblVybCA9ICIiOwoJdGhpcy52ZXJzaW9uVXJsID0gImh0dHBzOi8vZ2l0bGFiLmNvbS9zY3JpcHQzNDczMzAzL3NjcmlwdF9wcm8vLS9yYXcvbWFpbi9SRUFETUUubWQ/cmVmX3R5cGU9aGVhZHMiOwoJdGhpcy51cGdyYWRVcmwgPSAiaHR0cHM6Ly9naXRsYWIuY29tL3NjcmlwdDM0NzMzMDMvc2NyaXB0X3BybyI7Cgl0aGlzLmN1cnJlbnRJbm5lclZlcnNpb24gPSAyMDAwMDExOyAvLzAwMi4wMDAuMDAxIOW9k+WJjeiEmuacrOeJiOacrOWPtwoJdGhpcy5nZXROYW1lcyA9IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHsKCQkJInNob3dEaWFsb2dJbnRlcnZhbEtleSI6InNob3dfZGlhbG9nX2ludGVydmFsX2tleSIsCgkJCSJzaG93RGlhbG9nS2V5Ijoic2hvd19kaWFsb2dfa2V5IiwKCQkJImlnbm9yZVRhZyI6Imlnbm9yZSIsCgkJCSJ1cGRhdGVUYWciOiJ1cGRhdGUiLAoJCQkic2hvd0RpYWxvZ1RhZyI6InNob3dEaWFsb2ciLAoJCQkiYXV0b0hpZGVEaWFsb2dUYWciOiJhdXRvSGlkZURpYWxvZ1RhZyIKCQl9Cgl9OwoJdGhpcy5yZWNvcmRPcGVyYXRpb24gPSBmdW5jdGlvbih0YWcpewoJCWNvbnN0IHtzaG93RGlhbG9nSW50ZXJ2YWxLZXksIHNob3dEaWFsb2dLZXksIGlnbm9yZVRhZywgdXBkYXRlVGFnLCBzaG93RGlhbG9nVGFnLCBhdXRvSGlkZURpYWxvZ1RhZ30gPSB0aGlzLmdldE5hbWVzKCk7CgkJY29uc3QgY3VycmVudFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwoJCWxldCByZXN1bHQgPSB7InVwZGF0ZSI6MCwgImlnbm9yZSI6MCwgImF1dG9IaWRlIjowfTsKCQlpZihzaG93RGlhbG9nVGFnPT10YWcpewoJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKHNob3dEaWFsb2dLZXksIGN1cnJlbnRUaW1lKTsKCQl9ZWxzZXsKCQkJaWYoaWdub3JlVGFnPT10YWcpewoJCQkJcmVzdWx0Lmlnbm9yZSA9IGN1cnJlbnRUaW1lOwoJCQkJCgkJCX1lbHNlIGlmKHVwZGF0ZVRhZz09dGFnKXsKCQkJCXJlc3VsdC51cGRhdGUgPSBjdXJyZW50VGltZTsKCQkJCQoJCQl9ZWxzZSBpZihhdXRvSGlkZURpYWxvZ1RhZz09dGFnKXsKCQkJCXJlc3VsdC5hdXRvSGlkZSA9IGN1cnJlbnRUaW1lOwoJCQl9CgkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoc2hvd0RpYWxvZ0ludGVydmFsS2V5LCByZXN1bHQpOwoJCX0KCX07Cgl0aGlzLnNob3dJbnRlcnZhbCA9IGZ1bmN0aW9uKCl7CgkJY29uc3Qge3Nob3dEaWFsb2dJbnRlcnZhbEtleSwgc2hvd0RpYWxvZ0tleX0gPSB0aGlzLmdldE5hbWVzKCk7CgkJY29uc3Qge3VwZGF0ZSwgaWdub3JlLCBhdXRvSGlkZX0gPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHNob3dEaWFsb2dJbnRlcnZhbEtleSwgeyJ1cGRhdGUiOjAsICJpZ25vcmUiOjAsICJhdXRvSGlkZSI6MH0pOwoJCWNvbnN0IHNob3dEaWFsb2dUaW1lID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZShzaG93RGlhbG9nS2V5LCAwKTsKCQljb25zdCBjdXJyZW50VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CgkJLy/mmL7npLrpl7TpmpTlv4XpobvlpKfkuo4x5bCP5pe2CgkJaWYoY3VycmVudFRpbWUtc2hvd0RpYWxvZ1RpbWUgPCA2MCo2MCoxMDAwKXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZihpZ25vcmU9PTAgJiYgYXV0b0hpZGU9PTAgJiYgdXBkYXRlPT0wKXsgLy/nrKzkuIDmrKHliJ3lp4vljJYKCQkJcmV0dXJuIHRydWU7CgkJfQoJCS8v6Ieq5Yqo5raI5aSx6K6h5pe2CgkJaWYoYXV0b0hpZGUhPTAgJiYgY3VycmVudFRpbWUtYXV0b0hpZGUgPj0gMS41KjI0KjM2MDAqMTAwMCl7IC8vMioyNCozNjAwKjEwMDAKCQkJcmV0dXJuIHRydWU7CgkJfQoJCS8v54K55Ye75b+955Wl6K6h5pe2CgkJaWYoaWdub3JlIT0wICYmIGN1cnJlbnRUaW1lLWlnbm9yZSA+PSAxLjUqMjQqMzYwMCoxMDAwKXsgLy82KjI0KjM2MDAqMTAwMAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy/ngrnlh7vmm7TmlrDorqHml7bvvIjlj6rngrnlh7vvvIzmnKrlrozmiJDmm7TmlrDlh7rlj5HvvIkKCQlpZih1cGRhdGUhPTAgJiYgY3VycmVudFRpbWUtdXBkYXRlID49IDIqMjQqMzYwMCoxMDAwKXsgLy8yKjI0KjM2MDAqMTAwMAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCXRoaXMuY3JlYXRlID0gZnVuY3Rpb24oZGVzY3JpcHRpb24pewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IHtpZ25vcmVUYWcsIHVwZGF0ZVRhZywgYXV0b0hpZGVEaWFsb2dUYWd9ID0gdGhpcy5nZXROYW1lcygpOwoJCWxldCBlbGVtZW50SWQgPSBjb21tb25GdW5jdGlvbk9iamVjdC5yYW5kb21OdW1iZXIoKTsKCQlsZXQgdXBncmFkRGlhbG9nSWQgPSAidXBncmFkLWRpYWxvZy0iK2VsZW1lbnRJZCsiIjsKCQlsZXQgdXBncmFkSWdub3JlSWQgPSAidXBncmFkLWlnbm9yZS1idG4tIitlbGVtZW50SWQrIiI7CgkJbGV0IHVwZ3JhZE5vd0lkID0gInVwZ3JhZC1ub3ctYnRuLSIrZWxlbWVudElkKyIiOwoJCWxldCBodG1sID0gYAoJCQk8ZGl2IGlkPSJgK3VwZ3JhZERpYWxvZ0lkK2AiIHN0eWxlPSJib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzogaGlkZGVuO3otaW5kZXg6OTk5OTk5OTk5OTk5OTk5O3dpZHRoOjI2MHB4O21pbi1oZWlnaHQ6MzBweDtwb3NpdGlvbjpmaXhlZDtyaWdodDoxMHB4O2JvdHRvbToxMHB4O2JhY2tncm91bmQtY29sb3I6I0ZGRjstd2Via2l0LWJveC1zaGFkb3c6MHB4IDEwcHggMzlweCAxMHB4IHJnYmEoNTIsNTMsNTMsMC4yMik7LW1vei1ib3gtc2hhZG93OiAwcHggMTBweCAzOXB4IDEwcHggcmdiYSg1Miw1Myw1MywwLjIyKTtib3gtc2hhZG93OiAwcHggMTBweCAzOXB4IDEwcHggcmdiYSg1Miw1Myw1MywwLjIyKTsiPgoJCQkJPGRpdiBzdHlsZT0id2lkaHQ6MTAwJTtoZWlnaHQ6MzVweDtsaW5lLWhlaWdodDozNXB4O2JhY2tncm91bmQtY29sb3I6cmVkO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiNGRkY7Zm9udC1zaXplOjE2cHg7Ij7ohJrmnKzmm7TmlrDmj5DnpLo8L2Rpdj4KCQkJCTxkaXYgc3R5bGU9ImNvbG9yOiMwMDA7cGFkZGluZzoxMHB4IDVweDtmb250LXNpemU6MTRweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQ0NDOyI+YCtkZXNjcmlwdGlvbitgPC9kaXY+CgkJCQk8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtoZWlnaHQ6NDBweDtsaW5lLWhlaWdodDo0MHB4O2ZvbnQtc2l6ZToxNHB4OyI+CgkJCQkJPHNwYW4gaWQ9ImArdXBncmFkSWdub3JlSWQrYCIgc3R5bGU9ImRpc3BsYXk6aW5uZXItYmxvY2s7Y29sb3I6Izg4ODtjdXJzb3I6cG9pbnRlcjsiPuW/veeVpTwvc3Bhbj4KCQkJCQk8c3BhbiBpZD0iYCt1cGdyYWROb3dJZCtgInN0eWxlPSJkaXNwbGF5OmlubmVyLWJsb2NrO21hcmdpbi1sZWZ0OjYwcHg7Y29sb3I6IzAwMDtjdXJzb3I6cG9pbnRlcjsiPueCueWHu+abtOaWsDwvc3Bhbj4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQlgOwoJCSQoImJvZHkiKS5hcHBlbmQoaHRtbCk7CgkJJCgiYm9keSIpLm9mZigiY2xpY2siLCIjIit1cGdyYWRJZ25vcmVJZCkub24oImNsaWNrIiwiIyIrdXBncmFkSWdub3JlSWQsZnVuY3Rpb24oKXsKCQkJc2VsZi5yZWNvcmRPcGVyYXRpb24oaWdub3JlVGFnKTsKCQkJJCgiIyIrdXBncmFkRGlhbG9nSWQpLmhpZGUoKTsKCQl9KTsKCQkkKCJib2R5Iikub2ZmKCJjbGljayIsIiMiK3VwZ3JhZE5vd0lkKS5vbigiY2xpY2siLCIjIit1cGdyYWROb3dJZCxmdW5jdGlvbigpewoJCQlzZWxmLnJlY29yZE9wZXJhdGlvbih1cGRhdGVUYWcpOwoJCQkkKCIjIit1cGdyYWREaWFsb2dJZCkuaGlkZSgpOwoJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYihzZWxmLnVwZ3JhZFVybCk7CgkJfSk7CgkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQlsZXQgJHVwZ3JhZERpYWxvZ0lkID0gJCgiIyIrdXBncmFkRGlhbG9nSWQpOwoJCQlpZighJHVwZ3JhZERpYWxvZ0lkLmlzKCI6aGlkZGVuIikpewoJCQkJJHVwZ3JhZERpYWxvZ0lkLmhpZGUoKTsKCQkJCXNlbGYucmVjb3JkT3BlcmF0aW9uKGF1dG9IaWRlRGlhbG9nVGFnKTsKCQkJfQoJCX0sIDE1KjEwMDApOwoJfTsKCXRoaXMuaXNTaG93ID0gYXN5bmMgZnVuY3Rpb24oKXsKCQljb25zdCBzZWxmID0gdGhpczsKCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewkKCQkJaWYoIXNlbGYuc2hvd0ludGVydmFsKCkpewoJCQkJcmVzb2x2ZSh7ImlzU2hvdyI6ZmFsc2UsICJ2ZXJzaW9uIjowLCAiZGVzY3JpcHRpb24iOiIifSk7CgkJCX1lbHNlewoJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QucmVxdWVzdCgiZ2V0IiwgdGhpcy52ZXJzaW9uVXJsKS50aGVuKChyZXN1bHQpPT57CgkJCQkJbGV0IHNob3cgPSBmYWxzZSwgdmVyc2lvbiA9IDAsIGRlc2NyaXB0aW9uID0gIiI7CQkKCQkJCQlpZihyZXN1bHQuaGFzT3duUHJvcGVydHkoInJlc3VsdCIpICYmIHJlc3VsdC5yZXN1bHQ9PSJzdWNjZXNzIil7CgkJCQkJCWxldCB2ZXJzaW9uID0gcGFyc2VJbnQocmVzdWx0LmRhdGEubWF0Y2goL+OAkFYoXGR7Nyw5fSnjgJHjgJB1bmlvbuOAkS9pKVsxXSk7CgkJCQkJCXNob3cgPSB2ZXJzaW9uPnNlbGYuY3VycmVudElubmVyVmVyc2lvbjsKCQkJCQkJZGVzY3JpcHRpb24gPSAiPGI+5Y+R546w5paw54mI5pysLi4uPC9iPjxicj7jgJBQcm/niYjjgJFC56uZ5ZOU5ZOp5ZOU5ZOp5L2/55So5aKe5by677yM5YWo572RVklQ6KeG6aKR5YWN6LS556C06Kej5Y675bm/5ZGK77yM55+l5LmO5L2/55So5aKe5by677yM55+t6KeG6aKR5peg5rC05Y2w5LiL6L2977yM5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3nrYnwn5iIIjsKCQkJCQl9CgkJCQkJcmVzb2x2ZSh7ImlzU2hvdyI6c2hvdywgInZlcnNpb24iOnZlcnNpb24sICJkZXNjcmlwdGlvbiI6ZGVzY3JpcHRpb259KTsKCQkJCX0pLmNhdGNoKChlcnJvcik9PnsKCQkJCQlyZXNvbHZlKHsiaXNTaG93IjpmYWxzZSwgInZlcnNpb24iOjAsICJkZXNjcmlwdGlvbiI6IiJ9KTsKCQkJCX0pOwoJCQl9CgkJfSk7Cgl9OwoJdGhpcy5zaG93RGlhbG9nID0gZnVuY3Rpb24oZGVzY3JpcHRpb24pewoJCXRoaXMucmVjb3JkT3BlcmF0aW9uKHRoaXMuZ2V0TmFtZXMoKS5zaG93RGlhbG9nVGFnKTsKCQl0aGlzLmNyZWF0ZShkZXNjcmlwdGlvbik7Cgl9OwoJdGhpcy5zdGFydCA9IGFzeW5jIGZ1bmN0aW9uKCl7CgkJbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaXNTaG93KCk7CgkJaWYocmVzdWx0LmlzU2hvdyl7CgkJCXRoaXMuc2hvd0RpYWxvZyhyZXN1bHQuZGVzY3JpcHRpb24pOwoJCX0KCX07Cn0KdHJ5ewoJKG5ldyBWZXJzaW9uQ29udHJvbGxlcigpKS5zdGFydCgpOwp9Y2F0Y2goZSl7Cgljb25zb2xlLmxvZygi5Y2H57qn5Luj56CB5Ye6546w6ZSZ6K+v77yaZXJyb3LvvJoiK2UpOwp9Cn0pKCk7
Add Comment
Please, Sign In to add comment