{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"网盘直链下载助手","options":{"check_for_updates":true,"user_modified":null,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_powerful_this":null,"sandbox":null,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":[],"merge_includes":true,"use_matches":[],"orig_matches":["*://pan.baidu.com/disk/home*","*://yun.baidu.com/disk/home*","*://pan.baidu.com/disk/main*","*://yun.baidu.com/disk/main*","*://pan.baidu.com/s/*","*://yun.baidu.com/s/*","*://pan.baidu.com/share/*","*://yun.baidu.com/share/*","*://www.aliyundrive.com/s/*","*://www.aliyundrive.com/drive*","*://www.alipan.com/s/*","*://www.alipan.com/drive*","*://cloud.189.cn/web/*","*://pan.xunlei.com/*","*://pan.quark.cn/*","*://yun.139.com/*","*://caiyun.139.com/*"],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["baidu.com","baidupcs.com","aliyundrive.com","alipan.com","189.cn","xunlei.com","quark.cn","youxiaohou.com","yun.139.com","caiyun.139.com","localhost","*"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-idle","orig_noframes":null}},"storage":{"ts":1708420280546,"data":{}},"enabled":true,"position":1,"file_url":"https://www.youxiaohou.com/panlinker.user.js","uuid":"548e5408-282b-4d0d-85da-eeff95d58086","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOe9keebmOebtOmTvuS4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgNi4xLjYKLy8gQGF1dGhvciAgICAgICAgICAgIFlvdVhpYW9Ib3UKLy8gQGRlc2NyaXB0aW9uICAgICAgIPCfkYbwn5GG8J+RhvCfkYbwn5GG8J+RhvCfkYYgLSDmlK/mjIHmibnph4/ojrflj5Yg4pyF55m+5bqm572R55uYIOKchemYv+mHjOS6keebmCDinIXlpKnnv7zkupHnm5gg4pyF6L+F6Zu35LqR55uYIOKcheWkuOWFi+e9keebmCDinIXnp7vliqjkupHnm5gg5YWt5aSn572R55uY55qE55u06ZO+5LiL6L295Zyw5Z2A77yM6YWN5ZCIIElETe+8jFhkb3du77yMQXJpYTLvvIxDdXJs77yM5q+U54m55b2X5pif562J5bel5YW36auY5pWI8J+agPCfmoDwn5qA5LiL6L2977yM5a6M576O6YCC6YWNIENocm9tZe+8jEVkZ2XvvIxGaXJlRm9477yMMzYw77yMUVHvvIzmkJzni5fvvIznmb7liIbvvIzpgajmuLjvvIzmmJ/mhL/vvIxPcGVyYe+8jOeMjuixue+8jFZpdmFsZGnvvIxZYW5kZXjvvIxLaXdpIOetiSAxOCDnp43mtY/op4jlmajjgILlj6/lnKjml6Dms5Xlronoo4XlrqLmiLfnq6/nmoTnjq/looPkuIvkvb/nlKjvvIzliqnmiYvlhY3otLnlvIDmupDjgILwn5iOCi8vIEBsaWNlbnNlICAgICAgICAgICBBR1BMLTMuMC1vci1sYXRlcgovLyBAaG9tZXBhZ2UgICAgICAgICAgaHR0cHM6Ly93d3cueW91eGlhb2hvdS5jb20vaW5zdGFsbC5odG1sCi8vIEBzdXBwb3J0VVJMICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vc3loeXoxOTkwL2JhaWR1eXVuCi8vIEB1cGRhdGVVUkwgICAgICAgICBodHRwczovL3d3dy55b3V4aWFvaG91LmNvbS9wYW5saW5rZXIudXNlci5qcwovLyBAZG93bmxvYWRVUkwgICAgICAgaHR0cHM6Ly93d3cueW91eGlhb2hvdS5jb20vcGFubGlua2VyLnVzZXIuanMKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zaGFyZS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpeXVuZHJpdmUuY29tL2RyaXZlKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5hbGlwYW4uY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5hbGlwYW4uY29tL2RyaXZlKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2Nsb3VkLjE4OS5jbi93ZWIvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi54dW5sZWkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4ucXVhcmsuY24vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi4xMzkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9jYWl5dW4uMTM5LmNvbS8qCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20vanF1ZXJ5LzMuNy4wL2ZpbGVzL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9yZWdpc3RyeS5ucG1taXJyb3IuY29tL3N3ZWV0YWxlcnQyLzEwLjE2LjYvZmlsZXMvZGlzdC9zd2VldGFsZXJ0Mi5hbGwubWluLmpzCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20vanMtbWQ1LzAuNy4zL2ZpbGVzL2J1aWxkL21kNS5taW4uanMKLy8gQGNvbm5lY3QgICAgICAgICAgIGJhaWR1LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYmFpZHVwY3MuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBhbGl5dW5kcml2ZS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGFsaXBhbi5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIDE4OS5jbgovLyBAY29ubmVjdCAgICAgICAgICAgeHVubGVpLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgcXVhcmsuY24KLy8gQGNvbm5lY3QgICAgICAgICAgIHlvdXhpYW9ob3UuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICB5dW4uMTM5LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgY2FpeXVuLjEzOS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGxvY2FsaG9zdAovLyBAY29ubmVjdCAgICAgICAgICAgKgovLyBAcnVuLWF0ICAgICAgICAgICAgZG9jdW1lbnQtaWRsZQovLyBAZ3JhbnQgICAgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgICAgICAgR01faW5mbwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fY29va2llCi8vIEBpY29uICAgICAgICAgICAgICBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBeE1qZ2dNVEk0SWo0OGNHRjBhQ0JrUFNKTk1UQXpMallnTVRBM0xqUmpNeTQxTFRJdU1pQTRMamt0Tmk0eElERXpMamd0TVRJdU5YTTNMak10TVRJdU5TQTRMalV0TVRZdU5XTXVOUzB4TGpjZ01pNHlMVGN1TlNBeUxqSXRNVFF1TnlBd0xURXdMakV0TXk0ekxUSTFMakV0TVRVdU5DMHpOaTQ0TFRFMExqVXRNVFF0TXpJdU1TMHhOQzR6TFRNMUxqY3RNVFF1TXkwNElEQXRNVFV1TnlBeExqa3RNakl1TmlBMUxqSkRORFFnTWpNZ016VXVOeUF6TVM0MElETXdMamdnTkRFdU4yTXRNUzR6SURJdU9DMDBJRFF1TnkwM0xqRWdOUzAwSUM0ekxUY3VOU0EwTGpRdE9DNDVJRGt1TmkwdU5TQXhMamt0TVM0MklETXVOUzB6TGpFZ05DNDNRelF1TkNBMk5pNDRJREFnTnpVdU55QXdJRGcxWXpBZ05pNDRJREl1TXlBeE15NHhJRFl1TVNBeE9DNHlJRFV1TlNBM0xqUWdNVFF1TWlBeE1pNHlJREkwSURFeUxqSm9ORGN1TVdNMExqUWdNQ0F4TVMwdU5TQXhPQzR6TFRNdU5TQXpMakl0TVM0MElEVXVPUzB6SURndU1TMDBMalY2SWlCbWFXeHNQU0lqTkRRMElpOCtQSEJoZEdnZ1pEMGlUVEV4T1M0NElEWTBMak5qTGpFdE1UY3VNUzB4TUM0MExUSTRMVEV5TGpVdE16QXVNVU01TlNBeU1pNHhJRGM1TGprZ01qRXVPQ0EzTmk0NUlESXhMamhqTFRFM0xqWWdNQzB6TXk0eklERXdMalV0TXprdU9TQXlOaTQzTFM0MklERXVNeTB4TGpnZ01pNHpMVE11TkNBeUxqTm9MUzQwWXkwMUxqZ2dNQzB4TUM0MklEUXVPQzB4TUM0MklERXdMamQyTGpWak1DQXhMalF0TGpnZ01pNDJMVEV1T1NBekxqTkRNVE11TkNBMk9TQTRMamdnTnpZdU9DQTRMamdnT0RWak1DQXhNaTR5SURrdU9TQXlNaTR6SURJeUxqSWdNakl1TTJnME5TNHlZek11TmkwdU1TQXhOeTQyTFM0NUlESTVMall0TVRJZ01pNDVMVEl1T0NBeE15NDVMVEV6TGpjZ01UUXRNekY2SWlCbWFXeHNQU0lqTVRNNU4yUTRJaTgrUEhCaGRHZ2daRDBpVFRFeE1DNDRJRFUzTGpSc0xqSWdNeTR6WXpBZ01TNHpMVEV1TVNBeUxqUXRNaTR6SURJdU5DMHhMak1nTUMweUxqTXRNUzR4TFRJdU15MHlMalJzTFM0eExUSXVPSFl0TGpOak1DMHhMakl1T1MweUxqSWdNaTR4TFRJdU0yZ3VNMk11TnlBd0lERXVNeTR6SURFdU55NDNMUzR5TGpFdU15NDFMalFnTVM0MGVtMHRNeTR6TFRFd0xqTmpNQ0F4TGpJdE1TQXlMak10TWk0eUlESXVNMmd0TGpGakxTNDRJREF0TVM0MkxTNDFMVEl0TVM0eUxUUXVOaTA0TGpNdE1UTXVNeTB4TXk0MUxUSXlMamd0TVRNdU5TMHhMaklnTUMweUxqTXRNUzB5TGpNdE1pNHlkaTB1TVdNd0xURXVNaUF4TFRJdU15QXlMakl0TWk0emFDNHhZVE13TGpNM0lETXdMak0zSURBZ01DQXhJREUxTGpnZ05DNDBZelF1TmlBeUxqZ2dPQzQwSURZdU9DQXhNUzR4SURFeExqVXVNUzR6TGpJdU55NHlJREV1TVhwTk9EZ3VNeUEzTXk0NFREY3pMalVnT1RNdU1tTXRNUzQxSURFdU9TMHpMalVnTXk0eExUVXVOeUF6TGpWb0xTNHlZeTB1TkM0eExTNDRMakV0TVM0eUxqRXRMallnTUMweExqRXRMakV0TVM0MkxTNHlMVEl1TWkwdU5DMDBMakl0TVM0M0xUVXVOaTB6TGpWTU5EUXVNeUEzTXk0NVl5MHlMVEl1TmkweUxqVXROUzQwTFRFdU5DMDNMamN1TVMwdU1TNHhMUzR5TGpJdExqSWdNUzR5TFRJZ015NDFMVE11TWlBMkxqUXRNeTR5YURZdU5uWXROUzQzWXpBdE5pNDRJRFF1TnkweE1pQXhNQzQ1TFRFeUlEUXVPQ0F3SURndU5TQXlMallnTVRBdU15QTNMakl1TlNBeExqTXRMaklnTWk0M0xURXVOU0F6TGpKekxUSXVPQzB1TVMwekxqTXRNUzQwWXkweExqRXRNaTQzTFRJdU9TMDBMVFV1TlMwMExUTXVOU0F3TFRZZ015MDJJRGQyT0M0eFl6QWdMalV0TGpJZ01TMHVOaUF4TGpRdExqWXVOeTB4TGpjZ01TNHhMVEl1TmlBeExqRm9MVGd1TkdNdE1TNHpJREF0TWlBdU5DMHlMakV1TnkwdU1pNDBJREFnTVM0ekxqa2dNaTQwVERZekxqRWdPVEJqTGprZ01TNHlJREl1TVNBeExqZ2dNeTR6SURFdU9ITXlMak10TGpZZ015NHhMVEV1TjJ3eE5DNDRMVEU1TGpOakxqa3RNUzR4SURFdU1TMHlJQzQ1TFRJdU5DMHVNaTB1TXkwdU9TMHVOeTB5TGpFdExqZG9MVGN1Tm1NdExqa2dNQzB4TGpjdExqVXRNaTR4TFRFdU1pMHVNeTB1TkMwdU5DMHVPQzB1TkMweExqTWdNQzB4TGpRZ01TNHhMVEl1TlNBeUxqVXRNaTQxYURjdU5tTXpMakVnTUNBMUxqVWdNUzR6SURZdU5pQXpMalZzTGpNdU4yTXVOeUF5TGpFdU1TQTBMall0TVM0M0lEWXVPWG9pSUdacGJHdzlJaU0wTkRRaUx6NDhMM04yWno0PQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IHB0ID0gJycsIHNlbGVjdExpc3QgPSBbXSwgcGFyYW1zID0ge30sIG1vZGUgPSAnJywgd2lkdGggPSA4MDAsIHBhbiA9IHt9LCBjb2xvciA9ICcnLAogICAgICAgIGRvYyA9ICQoZG9jdW1lbnQpLCBwcm9ncmVzcyA9IHt9LCByZXF1ZXN0ID0ge30sIGlucyA9IHt9LCBpZG0gPSB7fTsKICAgIGNvbnN0IHNjcmlwdEluZm8gPSBHTV9pbmZvLnNjcmlwdDsKICAgIGNvbnN0IHZlcnNpb24gPSBzY3JpcHRJbmZvLnZlcnNpb247CiAgICBjb25zdCBhdXRob3IgPSBzY3JpcHRJbmZvLmF1dGhvcjsKICAgIGNvbnN0IG5hbWUgPSBzY3JpcHRJbmZvLm5hbWU7CiAgICBjb25zdCBjdXN0b21DbGFzcyA9IHsKICAgICAgICBwb3B1cDogJ3BsLXBvcHVwJywKICAgICAgICBoZWFkZXI6ICdwbC1oZWFkZXInLAogICAgICAgIHRpdGxlOiAncGwtdGl0bGUnLAogICAgICAgIGNsb3NlQnV0dG9uOiAncGwtY2xvc2UnLAogICAgICAgIGNvbnRlbnQ6ICdwbC1jb250ZW50JywKICAgICAgICBpbnB1dDogJ3BsLWlucHV0JywKICAgICAgICBmb290ZXI6ICdwbC1mb290ZXInCiAgICB9OwoKICAgIGNvbnN0IHRlcm1pbmFsVHlwZSA9IHsKICAgICAgICB3YzogIldpbmRvd3MgQ01EIiwKICAgICAgICB3cDogIldpbmRvd3MgUG93ZXJTaGVsbCIsCiAgICAgICAgbHQ6ICJMaW51eCDnu4jnq68iLAogICAgICAgIGxzOiAiTGludXggU2hlbGwiLAogICAgICAgIG10OiAiTWFjT1Mg57uI56uvIiwKICAgIH07CgogICAgbGV0IHRvYXN0ID0gU3dhbC5taXhpbih7CiAgICAgICAgdG9hc3Q6IHRydWUsCiAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICB0aW1lcjogMzUwMCwKICAgICAgICB0aW1lclByb2dyZXNzQmFyOiBmYWxzZSwKICAgICAgICBkaWRPcGVuOiAodG9hc3QpID0+IHsKICAgICAgICAgICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIFN3YWwuc3RvcFRpbWVyKTsKICAgICAgICAgICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIFN3YWwucmVzdW1lVGltZXIpOwogICAgICAgIH0KICAgIH0pOwoKICAgIGNvbnN0IG1lc3NhZ2UgPSB7CiAgICAgICAgc3VjY2VzczogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdzdWNjZXNzJ30pOwogICAgICAgIH0sCiAgICAgICAgZXJyb3I6ICh0ZXh0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnZXJyb3InfSk7CiAgICAgICAgfSwKICAgICAgICB3YXJuaW5nOiAodGV4dCkgPT4gewogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3dhcm5pbmcnfSk7CiAgICAgICAgfSwKICAgICAgICBpbmZvOiAodGV4dCkgPT4gewogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ2luZm8nfSk7CiAgICAgICAgfSwKICAgICAgICBxdWVzdGlvbjogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdxdWVzdGlvbid9KTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCBiYXNlID0gewoKICAgICAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgICAgICBsZXQgY25hbWUgPSBuYW1lICsgIj0iOwogICAgICAgICAgICBsZXQgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGV0IGMgPSBjYVtpXS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKGNuYW1lKSA9PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcoY25hbWUubGVuZ3RoLCBjLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0sCgogICAgICAgIGlzVHlwZShvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnJlcGxhY2UoL15cW29iamVjdCAoLispXF0kLywgJyQxJykudG9Mb3dlckNhc2UoKTsKICAgICAgICB9LAoKICAgICAgICBnZXRWYWx1ZShuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZShuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3RvcmFnZShrZXkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldFN0b3JhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy5pc1R5cGUodmFsdWUpID09PSAnb2JqZWN0JyB8fCB0aGlzLmlzVHlwZSh2YWx1ZSkgPT09ICdhcnJheScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIHNldENsaXBib2FyZCh0ZXh0KSB7CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh0ZXh0LCAndGV4dCcpOwogICAgICAgIH0sCgogICAgICAgIGUoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICAgICAgfSwKCiAgICAgICAgZChzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYXRvYihzdHIpKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0RXh0ZW5zaW9uKG5hbWUpIHsKICAgICAgICAgICAgY29uc3QgcmVnID0gLyg/IVwuKVx3KyQvOwogICAgICAgICAgICBpZiAocmVnLnRlc3QobmFtZSkpIHsKICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG5hbWUubWF0Y2gocmVnKTsKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBzaXplRm9ybWF0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gK3ZhbHVlKSB7CiAgICAgICAgICAgICAgICBsZXQgdW5pdCA9IFsiQiIsICJLQiIsICJNQiIsICJHQiIsICJUQiIsICJQQiIsICJFQiIsICJaQiIsICJZQiJdOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLmxvZygxMDI0KSk7CiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHZhbHVlIC8gTWF0aC5wb3coMTAyNCwgaW5kZXgpOwogICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUudG9GaXhlZCgxKTsKICAgICAgICAgICAgICAgIHJldHVybiBzaXplICsgdW5pdFtpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIHNvcnRCeU5hbWUoYXJyKSB7CiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gYS5maWxlbmFtZSA/IGEuZmlsZW5hbWUgOiBhLnNlcnZlcl9maWxlbmFtZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IGIuZmlsZW5hbWUgPyBiLmZpbGVuYW1lIDogYi5zZXJ2ZXJfZmlsZW5hbWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxLmxvY2FsZUNvbXBhcmUocDIsICJ6aC1DTiIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYXJyLnNvcnQoaGFuZGxlKCkpOwogICAgICAgIH0sCgogICAgICAgIGZpeEZpbGVuYW1lKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvWyE/JnxgIicqXC86PD5cXF0vZywgJ18nKTsKICAgICAgICB9LAoKICAgICAgICBibG9iRG93bmxvYWQoYmxvYiwgZmlsZW5hbWUpIHsKICAgICAgICAgICAgaWYgKGJsb2IgaW5zdGFuY2VvZiBCbG9iKSB7CiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgIGEuaHJlZiA9IHVybDsKICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKICAgICAgICAgICAgICAgIGEuY2xpY2soKTsKICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHBvc3QodXJsLCBkYXRhLCBoZWFkZXJzLCB0eXBlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnMsIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ2Jsb2InID8gcmVzb2x2ZShyZXMpIDogcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0KHVybCwgaGVhZGVycywgdHlwZSwgZXh0cmEpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0T2JqLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZG1bZXh0cmEuaW5kZXhdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSAyMDAgJiYgYmFzZS5ibG9iRG93bmxvYWQocmVzLnJlc3BvbnNlLCBleHRyYS5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5yZXNwb25zZSB8fCByZXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25wcm9ncmVzczogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmEgJiYgZXh0cmEuZmlsZW5hbWUgJiYgZXh0cmEuaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy50b3RhbCA+IDAgPyBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAocmVzLmxvYWRlZCAqIDEwMCAvIHJlcy50b3RhbCkudG9GaXhlZCgyKSA6IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IDAuMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCAmJiAocmVxdWVzdFtleHRyYS5pbmRleF0gPSByZXF1ZXN0T2JqKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBnZXRGaW5hbFVybCh1cmwsIGhlYWRlcnMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZmluYWxVcmwpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHN0cmluZ2lmeShvYmopIHsKICAgICAgICAgICAgbGV0IHN0ciA9ICcnOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2ldKSArICcmJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyAnJic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHIuc2xpY2UoMCwgLTEpOyAvLyDljrvmjonmnKvlsL7nmoQgIiYiCiAgICAgICAgfSwKCiAgICAgICAgYWRkU3R5bGUoaWQsIHRhZywgY3NzKSB7CiAgICAgICAgICAgIHRhZyA9IHRhZyB8fCAnc3R5bGUnOwogICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnQsIHN0eWxlRG9tID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgICAgICAgaWYgKHN0eWxlRG9tKSByZXR1cm47CiAgICAgICAgICAgIGxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgICAgIHN0eWxlLnJlbCA9ICdzdHlsZXNoZWV0JzsKICAgICAgICAgICAgc3R5bGUuaWQgPSBpZDsKICAgICAgICAgICAgdGFnID09PSAnc3R5bGUnID8gc3R5bGUuaW5uZXJIVE1MID0gY3NzIDogc3R5bGUuaHJlZiA9IGNzczsKICAgICAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0sCgogICAgICAgIHNsZWVwKHRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZFJlYWN0KGRvbSwgdHJhdmVyc2VVcCA9IDApIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZG9tKS5maW5kKGtleSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RGaWJlciQiKQogICAgICAgICAgICAgICAgICAgIHx8IGtleS5zdGFydHNXaXRoKCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRvbUZpYmVyID0gZG9tW2tleV07CiAgICAgICAgICAgIGlmIChkb21GaWJlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgIGlmIChkb21GaWJlci5fY3VycmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGxldCBjb21wRmliZXIgPSBkb21GaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjb21wRmliZXIgPSBjb21wRmliZXIuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjb21wRmliZXIuX2luc3RhbmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBHZXRDb21wRmliZXIgPSBmaWJlciA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47CiAgICAgICAgICAgICAgICB3aGlsZSAodHlwZW9mIHBhcmVudEZpYmVyLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRGaWJlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbGV0IGNvbXBGaWJlciA9IEdldENvbXBGaWJlcihkb21GaWJlcik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhdmVyc2VVcDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb21wRmliZXIgPSBHZXRDb21wRmliZXIoY29tcEZpYmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcEZpYmVyLnN0YXRlTm9kZSB8fCBjb21wRmliZXI7CiAgICAgICAgfSwKCiAgICAgICAgaW5pdERlZmF1bHRDb25maWcoKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFt7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZG9tYWluJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnaHR0cDovL2xvY2FsaG9zdCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3BvcnQnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcxNjgwMCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3BhdGgnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcvanNvbnJwYycKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3Rva2VuJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZGlyJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnRDonCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnLAogICAgICAgICAgICAgICAgdmFsdWU6ICd3YycKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfdGhlbWVfY29sb3InLAogICAgICAgICAgICAgICAgdmFsdWU6ICcjMDlBQUZGJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19pbml0X2NvZGUnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdsaWNlbnNlJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgICAgICB9XTsKCiAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgIGJhc2UuZ2V0VmFsdWUodi5uYW1lKSA9PT0gdW5kZWZpbmVkICYmIGJhc2Uuc2V0VmFsdWUodi5uYW1lLCB2LnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd1NldHRpbmcoKSB7CiAgICAgICAgICAgIGxldCBkb20gPSAnJywgYnRuID0gJycsCiAgICAgICAgICAgICAgICBjb2xvckxpc3QgPSBbJyMwOUFBRkYnLCAnI2NjMzIzNScsICcjNTI2ZWZhJywgJyM1MThjMTcnLCAnI2VkOTQ0YicsICcjZjk2OWE1JywgJyNiY2EyODAnXTsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPkuLvmnLo8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgIHBsYWNlaG9sZGVyPSLkuLvmnLrlnLDlnYDvvIzpnIDluKbkuIpodHRwKHMpOi8vIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItZG9tYWluIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX0iPjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnq6/lj6M8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iuerr+WPo+WPt++8jOS+i+Wmgu+8mk1vdHJpeOS4ujE2ODAwIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItcG9ydCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+i3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i6Lev5b6E77yM6buY6K6k5Li6L2pzb25ycGMiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1wYXRoIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9Ij48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5a+G6ZKlPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLml6Dlr4bpkqXml6DpnIDloavlhpkiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci10b2tlbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX0iPjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kv53lrZjot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaWh+S7tuS4i+i9veWQjuS/neWtmOi3r+W+hO+8jOS+i+Wmgu+8mkQ6IiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItZGlyIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKX0iPjwvbGFiZWw+YDsKCiAgICAgICAgICAgIGNvbG9yTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICBidG4gKz0gYDxkaXYgZGF0YS1jb2xvcj0iJHt2fSIgc3R5bGU9ImJhY2tncm91bmQ6ICR7dn07Ym9yZGVyOiAxcHggc29saWQgJHt2fSIgY2xhc3M9InBsLWNvbG9yLWJveCBsaXN0ZW5lci1jb2xvciAke3YgPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICdjaGVja2VkJyA6ICcnfSI+PC9kaXY+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+57uI56uv57G75Z6LPC9kaXY+PHNlbGVjdCBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItdGVybWluYWwiPmA7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRlcm1pbmFsVHlwZSkuZm9yRWFjaChrID0+IHsKICAgICAgICAgICAgICAgIGRvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKSA9PT0gayA/ICdzZWxlY3RlZCcgOiAnJ30+JHt0ZXJtaW5hbFR5cGVba119PC9vcHRpb24+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS4u+mimOminOiJsjwvZGl2PiA8ZGl2IGNsYXNzPSJwbC1jb2xvciI+JHtidG59PGRpdj48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSA9ICc8ZGl2PicgKyBkb20gKyAnPC9kaXY+JzsKCiAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZTogJ+WKqeaJi+mFjee9ricsCiAgICAgICAgICAgICAgICBodG1sOiBkb20sCiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICBmb290ZXI6IHBhbi5mb290ZXIsCiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCforr7nva7miJDlip/vvIEnKTsKICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29sb3InLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicsIGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpOwogICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCforr7nva7miJDlip/vvIEnKTsKICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kb21haW4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcG9ydCcsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcGF0aCcsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItdG9rZW4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kaXInLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjaGFuZ2UnLCAnLmxpc3RlbmVyLXRlcm1pbmFsJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScsIGUudGFyZ2V0LnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVnaXN0ZXJNZW51Q29tbWFuZCgpIHsKICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn4pqZ77iPIOiuvue9ricsICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY3JlYXRlVGlwKCkgewogICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGNsYXNzPSJwbC10b29sdGlwIj48L2Rpdj4nKTsKCiAgICAgICAgICAgIGRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgJy5saXN0ZW5lci10aXAnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlZW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZS5jdXJyZW50VGFyZ2V0LmlubmVyVGV4dDsKICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnNpemU7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRpcCA9IGAke2ZpbGVuYW1lfTxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtjb2xvcjogI2Y1NmM2YzsiPiR7c2l6ZX08L3NwYW4+YDsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuY3NzKHtvcGFjaXR5OiAnMC41J30pOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC10b29sdGlwJykuaHRtbCh0aXApLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICdsZWZ0JzogZS5wYWdlWCArIDEwICsgJ3B4JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcCc6IGUucGFnZVkgLSBlLmN1cnJlbnRUYXJnZXQub2Zmc2V0VG9wID4gMTQgPyBlLnBhZ2VZICsgJ3B4JyA6IGUucGFnZVkgKyAyMCArICdweCcKICAgICAgICAgICAgICAgICAgICB9KS5zaG93KCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcxJ30pOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC10b29sdGlwJykuaGlkZSgwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgY3JlYXRlTG9hZGluZygpIHsKICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgY2xhc3M9InBsLWxvYWRpbmciPjxkaXYgY2xhc3M9InBsLWxvYWRpbmctYm94Ij48ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsKICAgICAgICB9LAoKICAgICAgICBjcmVhdGVEb3dubG9hZElmcmFtZSgpIHsKICAgICAgICAgICAgbGV0ICRkaXYgPSAkKCc8ZGl2IHN0eWxlPSJwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jayI+PC9kaXY+Jyk7CiAgICAgICAgICAgIGxldCAkaWZyYW1lID0gJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6OyIgaWQ9ImRvd25sb2FkSWZyYW1lIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2lmcmFtZT4nKTsKICAgICAgICAgICAgJGRpdi5hcHBlbmQoJGlmcmFtZSk7CiAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJGRpdik7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0TWlycm9yTGlzdChsaW5rLCBtaXJyb3IsIHRocmVhZCA9IDIpIHsKICAgICAgICAgICAgbGV0IGhvc3QgPSBuZXcgVVJMKGxpbmspLmhvc3Q7CiAgICAgICAgICAgIGxldCBtaXJyb3JzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWlycm9yLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRocmVhZDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaW5rLnJlcGxhY2UoaG9zdCwgbWlycm9yW2ldKSArICcmJy5yZXBlYXQoaik7CiAgICAgICAgICAgICAgICAgICAgbWlycm9ycy5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtaXJyb3JzLmpvaW4oJ1xuJyk7CiAgICAgICAgfSwKCiAgICAgICAgbGlzdGVuRWxlbWVudChlbGVtZW50LCBjYWxsYmFjaykgewogICAgICAgICAgICBjb25zdCBjaGVja0ludGVydmFsID0gNTAwOyAvLyDmo4Dmn6XlhYPntKDnmoTpl7TpmpTml7bpl7TvvIjmr6vnp5LvvIkKICAgICAgICAgICAgbGV0IHdhc0VsZW1lbnRGb3VuZCA9IGZhbHNlOyAvLyDnlKjkuo7ot5/ouKrlhYPntKDmmK/lkKbkuYvliY3lt7Lnu4/mib7liLAKCiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrRWxlbWVudCgpIHsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgd2FzRWxlbWVudEZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNFbGVtZW50Rm91bmQpIHsKICAgICAgICAgICAgICAgICAgICB3YXNFbGVtZW50Rm91bmQgPSBmYWxzZTsgLy8g5YWD57Sg5raI5aSx5ZCO6YeN572u5qCH5b+XCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0VsZW1lbnQsIGNoZWNrSW50ZXJ2YWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGVja0VsZW1lbnQoKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYW5MaW5rZXJTdHlsZSgpIHsKICAgICAgICAgICAgY29sb3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJyk7CiAgICAgICAgICAgIGxldCBjc3MgPSBgCiAgICAgICAgICAgIGJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgZGlzcGxheTogbm9uZSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNnB4OyBoZWlnaHQ6IDEwcHggfQogICAgICAgICAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYm9yZGVyLXJhZGl1czogMDsgYmFja2dyb3VuZDogbm9uZSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDg1LDg1LDg1LC40KSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjIpIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjMpIH0KICAgICAgICAgICAgLnN3YWwyLXBvcHVwIHsgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLXBvcHVwIHsgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLXBvcHVwIGEgeyBjb2xvcjogJHtjb2xvcn0gIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtaGVhZGVyIHsgcGFkZGluZzogMCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQhaW1wb3J0YW50OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZSFpbXBvcnRhbnQ7IG1hcmdpbjogMCAwIDEwcHghaW1wb3J0YW50OyBwYWRkaW5nOiAwIDAgNXB4IWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtdGl0bGUgeyBmb250LXNpemU6IDE2cHghaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMSFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcCFpbXBvcnRhbnQ7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzIWltcG9ydGFudDt9CiAgICAgICAgICAgIC5wbC1jb250ZW50IHsgcGFkZGluZzogMCAhaW1wb3J0YW50OyBmb250LXNpemU6IDEycHghaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1tYWluIHsgbWF4LWhlaWdodDogNDAwcHg7b3ZlcmZsb3cteTpzY3JvbGw7IH0KICAgICAgICAgICAgLnBsLWZvb3RlciB7Zm9udC1zaXplOiAxMnB4IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQhaW1wb3J0YW50OyBtYXJnaW46IDEwcHggMCAwIWltcG9ydGFudDsgcGFkZGluZzogNXB4IDAgMCFpbXBvcnRhbnQ7IGNvbG9yOiAjZjU2YzZjIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtaXRlbSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9CiAgICAgICAgICAgIC5wbC1pdGVtLW5hbWUgeyBmbGV4OiAwIDAgMTUwcHg7IHRleHQtYWxpZ246IGxlZnQ7bWFyZ2luLXJpZ2h0OiAxMHB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgY3Vyc29yOmRlZmF1bHQ7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tbGluayB7IGZsZXg6IDE7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtYWxpZ246IGxlZnQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO2N1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLWl0ZW0tYnRuIHsgYmFja2dyb3VuZDogJHtjb2xvcn07IHBhZGRpbmc6IDRweCA1cHg7IGJvcmRlci1yYWRpdXM6IDNweDsgbGluZS1oZWlnaHQ6IDE7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICNmZmY7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tdGlwIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2ZsZXg6IDE7IH0KICAgICAgICAgICAgLnBsLWJhY2sgeyB3aWR0aDogNzBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6cG9pbnRlcjsgbWFyZ2luOjFweCAwOyB9CiAgICAgICAgICAgIC5wbC1leHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA0NHB4OyBiYWNrZ3JvdW5kOiAjOTk5OyBjb2xvcjogI2ZmZjsgaGVpZ2h0OiAxNnB4OyBsaW5lLWhlaWdodDogMTZweDsgZm9udC1zaXplOiAxMnB4OyBib3JkZXItcmFkaXVzOiAzcHg7fQogICAgICAgICAgICAucGwtcmV0cnkge3BhZGRpbmc6IDNweCAxMHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQogICAgICAgICAgICAucGwtYnJvd3NlcmRvd25sb2FkIHsgcGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQogICAgICAgICAgICAucGwtaXRlbS1wcm9ncmVzcyB7IGRpc3BsYXk6ZmxleDtmbGV4OiAxO2FsaWduLWl0ZW1zOmNlbnRlcn0KICAgICAgICAgICAgLnBsLXByb2dyZXNzIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7d2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7bGluZS1oZWlnaHQ6IDE7cG9zaXRpb246IHJlbGF0aXZlO2hlaWdodDoxNXB4OyBmbGV4OiAxfQogICAgICAgICAgICAucGwtcHJvZ3Jlc3Mtb3V0ZXIgeyBoZWlnaHQ6IDE1cHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI2ViZWVmNTtvdmVyZmxvdzogaGlkZGVuO3Bvc2l0aW9uOiByZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWlubmVyeyBwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMDt0b3A6IDA7YmFja2dyb3VuZC1jb2xvcjogIzQwOWVmZjt0ZXh0LWFsaWduOiByaWdodDtib3JkZXItcmFkaXVzOiAxMDBweDtsaW5lLWhlaWdodDogMTt3aGl0ZS1zcGFjZTogbm93cmFwO3RyYW5zaXRpb246IHdpZHRoIC42cyBlYXNlO30KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWlubmVyLXRleHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTtjb2xvcjogI2QxZDFkMTtmb250LXNpemU6IDEycHg7bWFyZ2luOiAwIDVweDtoZWlnaHQ6IDE1cHh9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy10aXB7IGZsZXg6MTt0ZXh0LWFsaWduOnJpZ2h0fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaG93eyBmbGV4OiAwIDAgOTBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBtYXJnaW4tbGVmdDogMTBweDsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWFsaWduOiBjZW50ZXI7fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3Mtc3RvcHsgZmxleDogMCAwIDUwcHg7IHBhZGRpbmc6IDAgMTBweDsgYmFja2dyb3VuZDogI2NjMzIzNTsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOiBwb2ludGVyO21hcmdpbi1sZWZ0OjEwcHg7aGVpZ2h0OjIwcHh9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lci10ZXh0OmFmdGVyIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbnRlbnQ6ICIiO2hlaWdodDogMTAwJTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KICAgICAgICAgICAgLnBsLWJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogJHtjb2xvcn07IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZmZmZjsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IG91dGxpbmU6IG5vbmU7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbjogMnB4IDA7IHBhZGRpbmc6IDZweCAwO3RyYW5zaXRpb246IDAuM3Mgb3BhY2l0eTsgfQogICAgICAgICAgICAucGwtYnRuLXByaW1hcnk6aG92ZXIgeyBvcGFjaXR5OiAwLjk7dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CiAgICAgICAgICAgIC5wbC1idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICM1NWFmMjg7IGFuaW1hdGlvbjogZWFzZU9wYWNpdHkgMS4ycyAyOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0KICAgICAgICAgICAgLnBsLWJ0bi1pbmZvIHsgYmFja2dyb3VuZDogIzYwNjI2NjsgfQogICAgICAgICAgICAucGwtYnRuLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiAjZGE5MzI4OyB9CiAgICAgICAgICAgIC5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0KICAgICAgICAgICAgLnBsLWJ0bi1kYW5nZXIgeyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyB9CiAgICAgICAgICAgIC5hbGktYnV0dG9uIHtkaXNwbGF5OiBpbmxpbmUtZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO2JvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOiA1cHg7Ym94LXNoYWRvdzogMCAwIDAgMCB0cmFuc3BhcmVudDt3aWR0aDogZml0LWNvbnRlbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcDtmbGV4LXNocmluazogMDtmb250LXNpemU6IDE0cHg7bGluZS1oZWlnaHQ6IDEuNTtvdXRsaW5lOiAwO3RvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO3RyYW5zaXRpb246IGJhY2tncm91bmQgLjNzIGVhc2UsY29sb3IgLjNzIGVhc2UsYm9yZGVyIC4zcyBlYXNlLGJveC1zaGFkb3cgLjNzIGVhc2U7Y29sb3I6ICNmZmY7YmFja2dyb3VuZDogcmdiKDk5IDEyNSAyNTUpO21hcmdpbi1sZWZ0OiAyMHB4O3BhZGRpbmc6IDFweCAxMnB4O3Bvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOnBvaW50ZXI7IGhlaWdodDogMzJweDt9CiAgICAgICAgICAgIC5hbGktYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiByZ2IoMTIyLCAxNDQsIDI1NSl9CiAgICAgICAgICAgIC50aWFueWktYnV0dG9uIHttYXJnaW4tcmlnaHQ6IDIwcHg7IHBhZGRpbmc6IDRweCAxMnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjZmZmOyBmb250LXNpemU6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkICMwMDczZTM7IGJhY2tncm91bmQ6ICMyYjg5ZWE7IGN1cnNvcjogcG9pbnRlcjsgcG9zaXRpb246IHJlbGF0aXZlO30KICAgICAgICAgICAgLnRpYW55aS1idXR0b246aG92ZXIge2JvcmRlci1jb2xvcjogIzE4NzRkMzsgYmFja2dyb3VuZDogIzM2OTlmZjt9CiAgICAgICAgICAgIC55aWRvbmctYnV0dG9uIHtmbG9hdDogbGVmdDsgcG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW46IDIwcHggMjRweCAyMHB4IDA7IHdpZHRoOiA5OHB4OyBoZWlnaHQ6IDM2cHg7IGJhY2tncm91bmQ6ICMzMTgxZjk7IGJvcmRlci1yYWRpdXM6IDJweDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsgbGluZS1oZWlnaHQ6IDM5cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY3Vyc29yOiBwb2ludGVyO30KICAgICAgICAgICAgLnlpZG9uZy1zaGFyZS1idXR0b24ge2Rpc3BsYXk6IGlubGluZS1ibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAzNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjZmZmOyBib3JkZXI6IDFweCBzb2xpZCAjNWE5YWZhOyBib3JkZXItcmFkaXVzOiAycHg7IHBhZGRpbmc6IDAgMjRweDsgbWFyZ2luLWxlZnQ6IDI0cHg7IGJhY2tncm91bmQ6ICMzMTgxZjk7fQogICAgICAgICAgICAueWlkb25nLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogIzJkNzZlNTt9CiAgICAgICAgICAgIC54dW5sZWktYnV0dG9uIHtkaXNwbGF5OiBpbmxpbmUtZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO2JvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOiA1cHg7Ym94LXNoYWRvdzogMCAwIDAgMCB0cmFuc3BhcmVudDt3aWR0aDogZml0LWNvbnRlbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcDtmbGV4LXNocmluazogMDtmb250LXNpemU6IDE0cHg7bGluZS1oZWlnaHQ6IDEuNTtvdXRsaW5lOiAwO3RvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO3RyYW5zaXRpb246IGJhY2tncm91bmQgLjNzIGVhc2UsY29sb3IgLjNzIGVhc2UsYm9yZGVyIC4zcyBlYXNlLGJveC1zaGFkb3cgLjNzIGVhc2U7Y29sb3I6ICNmZmY7YmFja2dyb3VuZDogIzNmODVmZjttYXJnaW4tbGVmdDogMTJweDtwYWRkaW5nOiAwcHggMTJweDtwb3NpdGlvbjogcmVsYXRpdmU7IGN1cnNvcjpwb2ludGVyOyBoZWlnaHQ6IDM2cHg7fQogICAgICAgICAgICAueHVubGVpLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogIzYxOWJmZn0KICAgICAgICAgICAgLnF1YXJrLWJ1dHRvbiB7ZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItcmFkaXVzOiA4cHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGZsZXgtc2hyaW5rOiAwOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IG91dGxpbmU6IDA7IGNvbG9yOiAjMzMzOyBiYWNrZ3JvdW5kOiAjZmZmOyBtYXJnaW4tcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDBweCAxNHB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IGN1cnNvcjogcG9pbnRlcjsgaGVpZ2h0OiAzNnB4O30KICAgICAgICAgICAgLnF1YXJrLWJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQ6I2Y2ZjZmNiB9CiAgICAgICAgICAgIC5wbC1kcm9wZG93bi1tZW51IHtwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6IDA7dG9wOiAzMHB4O3BhZGRpbmc6IDVweCAwO2NvbG9yOiByZ2IoMzcsIDM4LCA0Myk7YmFja2dyb3VuZDogI2ZmZjt6LWluZGV4OiA5OTk7d2lkdGg6IDEwMnB4O2JvcmRlcjogMXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czogMTBweDsgYm94LXNoYWRvdzogMCAwIDFweCAxcHggcmdiKDI4IDI4IDMyIC8gNSUpLCAwIDhweCAyNHB4IHJnYigyOCAyOCAzMiAvIDEyJSk7fQogICAgICAgICAgICAucGwtZHJvcGRvd24tbWVudS1pdGVtIHsgaGVpZ2h0OiAzMHB4O2Rpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtjdXJzb3I6cG9pbnRlciB9CiAgICAgICAgICAgIC5wbC1kcm9wZG93bi1tZW51LWl0ZW06aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDEzMiwxMzMsMTQxLDAuMDgpO30KICAgICAgICAgICAgLnBsLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudSB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgICAgICAgLnBsLWJ1dHRvbjpob3ZlciAucGwtZHJvcGRvd24tbWVudSB7IGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtYnV0dG9uLWluaXQgeyBvcGFjaXR5OiAwLjU7IGFuaW1hdGlvbjogZWFzZUluaXRPcGFjaXR5IDEuMnMgMzsgYW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyB9CiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGVhc2VJbml0T3BhY2l0eSB7IGZyb20geyBvcGFjaXR5OiAwLjU7IH0gNTAlIHsgb3BhY2l0eTogMSB9IHRvIHsgb3BhY2l0eTogMC41OyB9IH0KICAgICAgICAgICAgIEBrZXlmcmFtZXMgZWFzZU9wYWNpdHkgeyBmcm9tIHsgb3BhY2l0eTogMTsgfSA1MCUgeyBvcGFjaXR5OiAwLjM1IH0gdG8geyBvcGFjaXR5OiAxOyB9IH0KICAgICAgICAgICAgLmVsZW1lbnQtY2xpY2tlZCB7IG9wYWNpdHk6IDAuNTsgfQogICAgICAgICAgICAucGwtZXh0cmEgeyBtYXJnaW4tdG9wOiAxMHB4O2Rpc3BsYXk6ZmxleH0KICAgICAgICAgICAgLnBsLWV4dHJhIGJ1dHRvbiB7IGZsZXg6IDF9CiAgICAgICAgICAgIC5wb2ludGVyIHsgY3Vyc29yOnBvaW50ZXIgfQogICAgICAgICAgICAucGwtc2V0dGluZy1sYWJlbCB7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDEwcHg7IH0KICAgICAgICAgICAgLnBsLWxhYmVsIHsgZmxleDogMCAwIDEwMHB4O3RleHQtYWxpZ246bGVmdDsgfQogICAgICAgICAgICAucGwtaW5wdXQgeyBmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgI2MyYzJjMjsgYm9yZGVyLXJhZGl1czogNXB4OyBmb250LXNpemU6IDE0cHggfQogICAgICAgICAgICAucGwtY29sb3IgeyBmbGV4OiAxO2Rpc3BsYXk6IGZsZXg7ZmxleC13cmFwOiB3cmFwOyBtYXJnaW4tcmlnaHQ6IC0xMHB4O30KICAgICAgICAgICAgLnBsLWNvbG9yLWJveCB7IHdpZHRoOiAzNXB4O2hlaWdodDogMzVweDttYXJnaW46MTBweCAxMHB4IDAgMDs7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO2N1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLWNvbG9yLWJveC5jaGVja2VkIHsgYm9yZGVyOjNweCBkYXNoZWQgIzExMSFpbXBvcnRhbnQgfQogICAgICAgICAgICAucGwtY2xvc2U6Zm9jdXMgeyBvdXRsaW5lOiAwOyBib3gtc2hhZG93OiBub25lOyB9CiAgICAgICAgICAgIC50YWctZGFuZ2VyIHtjb2xvcjojY2MzMjM1O21hcmdpbjogMCA1cHg7fQogICAgICAgICAgICAucGwtdG9vbHRpcCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgY29sb3I6ICNmZmZmZmY7IG1heC13aWR0aDogNjAwcHg7IGZvbnQtc2l6ZTogMTJweDsgcGFkZGluZzogNXB4IDEwcHg7IGJhY2tncm91bmQ6ICMzMzM7IGJvcmRlci1yYWRpdXM6IDVweDsgei1pbmRleDogMTEwMDAwOyBsaW5lLWhlaWdodDogMS4zOyBkaXNwbGF5Om5vbmU7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDt9CiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGxvYWQgeyAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIH0gMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfSB9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTtib3JkZXItcmFkaXVzOiA1MCU7fQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXY6bnRoLWNoaWxkKDEpIHsgdG9wOiA5cHg7bGVmdDogOXB4O3dpZHRoOiA4MnB4O2hlaWdodDogODJweDtiYWNrZ3JvdW5kOiAjZmZmZmZmO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2Om50aC1jaGlsZCgyKSB7IHRvcDogMTRweDtsZWZ0OiAzOHB4O3dpZHRoOiAyNXB4O2hlaWdodDogMjVweDtiYWNrZ3JvdW5kOiAjNjY2NjY2O2FuaW1hdGlvbjogbG9hZCAxcyBsaW5lYXIgaW5maW5pdGU7dHJhbnNmb3JtLW9yaWdpbjogMTJweCAzNnB4O30KICAgICAgICAgICAgLnBsLWxvYWRpbmcgeyB3aWR0aDogMTZweDtoZWlnaHQ6IDE2cHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO292ZXJmbG93OiBoaWRkZW47YmFja2dyb3VuZDogbm9uZTt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCB7IHdpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtwb3NpdGlvbjogcmVsYXRpdmU7dHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApIHNjYWxlKDAuMTYpO2JhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7fQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggZGl2IHsgYm94LXNpemluZzogY29udGVudC1ib3g7IH0KICAgICAgICAgICAgLnN3YWwyLWNvbnRhaW5lciB7IHotaW5kZXg6MTAwMDAwIWltcG9ydGFudDsgfQogICAgICAgICAgICBib2R5LnN3YWwyLWhlaWdodC1hdXRvIHsgaGVpZ2h0OiBpbmhlcml0IWltcG9ydGFudDsgfQogICAgICAgICAgICAuYnRuLW9wZXJhdGUgLmJ0bi1tYWluIHsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IH0KICAgICAgICAgICAgYDsKICAgICAgICAgICAgdGhpcy5hZGRTdHlsZSgncGFubGlua2VyLXN0eWxlJywgJ3N0eWxlJywgY3NzKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBpbml0RGlhbG9nKCkgewogICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBwYW4uaW5pdFswXSwKICAgICAgICAgICAgICAgIGh0bWw6IGA8ZGl2PjxpbWcgc3R5bGU9IndpZHRoOiAyNTBweDttYXJnaW4tYm90dG9tOiAxMHB4OyIgc3JjPSIke3Bhbi5pbWd9IiBhbHQ9IiR7cGFuLmltZ30iPjxpbnB1dCBjbGFzcz0ic3dhbDItaW5wdXQiIGlkPSJpbml0IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iJHtwYW4uaW5pdFsxXX0iPjwvZGl2PmAsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNEaXNtaXNzZWQgJiYgcmVzdWx0LmRpc21pc3MgPT09ICdjbG9zZScpIHJldHVybjsKICAgICAgICAgICAgaWYgKHBhbi5udW0gPT09ICQoJyNpbml0JykudmFsKCkgfHwgcGFuLmxpY2Vuc2UgPT09ICQoJyNpbml0JykudmFsKCkpIHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdsaWNlbnNlJywgcGFuLmxpY2Vuc2UpOwogICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgICAgICB9LCAxNTAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF3YWl0IFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBhbi5pbml0WzNdLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IHBhbi5pbml0WzRdLAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn6YeN5paw6L6T5YWlJywKICAgICAgICAgICAgICAgICAgICBpbWFnZVVybDogcGFuLmltZywKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgfTsKCiAgICBsZXQgYmFpZHUgPSB7CgogICAgICAgIF9nZXRFeHRyYSgpIHsKICAgICAgICAgICAgbGV0IHNlS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGJhc2UuZ2V0Q29va2llKCdCRENMTkQnKSk7CiAgICAgICAgICAgIHJldHVybiAneycgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iOwogICAgICAgIH0sCgogICAgICAgIF9nZXRTdXJsKCkgewogICAgICAgICAgICBsZXQgcmVnID0gLyg/PD1zXC98c3VybD0pKFthLXpBLVowLTlfLV0rKS9nOwogICAgICAgICAgICBpZiAocmVnLnRlc3QobG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKHJlZylbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGaWRMaXN0KCkgewogICAgICAgICAgICBsZXQgZmlkbGlzdCA9IFtdOwogICAgICAgICAgICBzZWxlY3RMaXN0LmZvckVhY2godiA9PiB7CiAgICAgICAgICAgICAgICBpZiAoK3YuaXNkaXIgPT09IDEpIHJldHVybjsKICAgICAgICAgICAgICAgIGZpZGxpc3QucHVzaCh2LmZzX2lkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiAnWycgKyBmaWRsaXN0ICsgJ10nOwogICAgICAgIH0sCgogICAgICAgIF9yZXNldERhdGEoKSB7CiAgICAgICAgICAgIHByb2dyZXNzID0ge307CiAgICAgICAgICAgICQuZWFjaChyZXF1ZXN0LCAoa2V5KSA9PiB7CiAgICAgICAgICAgICAgICAocmVxdWVzdFtrZXldKS5hYm9ydCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJC5lYWNoKGlucywgKGtleSkgPT4gewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNba2V5XSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZG0gPSB7fTsKICAgICAgICAgICAgaW5zID0ge307CiAgICAgICAgICAgIHJlcXVlc3QgPSB7fTsKICAgICAgICB9LAoKICAgICAgICBzZXRCRFVTUygpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIEdNX2Nvb2tpZSAmJiBHTV9jb29raWUoJ2xpc3QnLCB7bmFtZTogJ0JEVVNTJ30sIChjb29raWVzLCBlcnJvcikgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS5zZXRTdG9yYWdlKCJiYWlkdXl1blBsdWdpbl9CRFVTUyIsIHtCRFVTUzogY29va2llc1swXS52YWx1ZX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRCRFVTUygpIHsKICAgICAgICAgICAgbGV0IGJhaWR1eXVuUGx1Z2luX0JEVVNTID0gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpID8gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpIDogJ3siYmFpZHV5dW5QbHVnaW5fQkRVU1MiOiIifSc7CiAgICAgICAgICAgIHJldHVybiBiYWlkdXl1blBsdWdpbl9CRFVTUy5CRFVTUyB8fCAnJzsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwogICAgICAgICAgICBpZiAoISFCRFVTUykgewogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGFyaWEyYyAiJHtsaW5rfSIgLS1vdXQgIiR7ZmlsZW5hbWV9IiAtLWhlYWRlciAiVXNlci1BZ2VudDogJHt1YX0iIC0taGVhZGVyICJDb29raWU6IEJEVVNTPSR7QkRVU1N9ImApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaW5rOiBwYW4uYXNzaXN0YW50LAogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKICAgICAgICAgICAgaWYgKCEhQkRVU1MpIHsKICAgICAgICAgICAgICAgIGxldCBjb29raWUgPSBgQkRVU1M9JHtCRFVTU31gOwogICAgICAgICAgICAgICAgbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mY29va2llPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSl9JnVzZXJfYWdlbnQ9JHtlbmNvZGVVUklDb21wb25lbnQodWEpfVpaYDsKICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZShiYyl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsCiAgICAgICAgICAgICAgICB0ZXh0OiBwYW4uaW5pdFs1XQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CiAgICAgICAgICAgIGlmICghIUJEVVNTKSB7CiAgICAgICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9IiAtQSAiJHt1YX0iIC1iICJCRFVTUz0ke0JEVVNTfSJgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbGluazogcGFuLmFzc2lzdGFudCwKICAgICAgICAgICAgICAgIHRleHQ6IHBhbi5pbml0WzVdCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICBmdW5jdGlvbiBfZmFjdG9yeShlKSB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLnRhcmdldCk7CiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRhcmdldC5wYXJlbnRzKCcucGwtaXRlbScpOwogICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLWxpbmsnKTsKICAgICAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tcHJvZ3Jlc3MnKTsKICAgICAgICAgICAgICAgIGxldCB0aXAgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXRpcCcpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCB0YXJnZXQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfcmVzZXQoaSkgewogICAgICAgICAgICAgICAgaW5zW2ldICYmIGNsZWFySW50ZXJ2YWwoaW5zW2ldKTsKICAgICAgICAgICAgICAgIHJlcXVlc3RbaV0gJiYgcmVxdWVzdFtpXS5hYm9ydCgpOwogICAgICAgICAgICAgICAgcHJvZ3Jlc3NbaV0gPSAwOwogICAgICAgICAgICAgICAgaWRtW2ldID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlIGNsaWNrJywgJy5wbC1idXR0b24uZy1kcm9wZG93bi1idXR0b24nLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCdidXR0b24tb3BlbicpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ2J1dHRvbi1vcGVuJyk7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJy5wbC1kcm9wZG93bi1tZW51Jykuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWxlYXZlJywgJy5wbC1idXR0b24uZy1kcm9wZG93bi1idXR0b24gLnBsLWRyb3Bkb3duLW1lbnUnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOwogICAgICAgICAgICAgICAgdGhpcy5nZXRQQ1NMaW5rKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgbGV0ICR3aWR0aCA9IG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXInKTsKICAgICAgICAgICAgICAgIGxldCAkdGV4dCA9IG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCcpOwogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gby5saW5rWzBdLmRhdGFzZXQuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKICAgICAgICAgICAgICAgIF9yZXNldChpbmRleCk7CiAgICAgICAgICAgICAgICBiYXNlLmdldChvLmxpbmtbMF0uZGF0YXNldC5saW5rLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9LCAnYmxvYicsIHtmaWxlbmFtZSwgaW5kZXh9KTsKICAgICAgICAgICAgICAgIGluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2cgPSArcHJvZ3Jlc3NbaW5kZXhdIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSURNID0gaWRtW2luZGV4XSB8fCBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNJRE0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgby5saW5rLnRleHQoJ+W3suaIkOWKn+WUpOi1t0lETe+8jOivt+afpeeci0lETeS4i+i9veahhu+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkbVtpbmRleF0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvLmxpbmsuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3Muc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGguY3NzKCd3aWR0aCcsIHByb2cgKyAnJScpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGV4dC50ZXh0KHByb2cgKyAnJScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZyA9PT0gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NbaW5kZXhdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtdGlwJykuaHRtbCgn5LiL6L295a6M5oiQ77yM5q2j5Zyo5by55Ye65rWP6KeI5Zmo5LiL6L295qGG77yBJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmV0cnknLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgIG8ubGluay5zaG93KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ob3cnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3MuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIG8udGlwLnNob3coKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zdG9wJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0W2luZGV4XSkgewogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RbaW5kZXhdLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgby5saW5rLnNob3coMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1iYWNrJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7CiAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICBvLmxpbmsuc2hvdygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgaWYgKCFlLnRhcmdldC5kYXRhc2V0LmxpbmspIHsKICAgICAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5yZW1vdmVDbGFzcygnbGlzdGVuZXItY29weS1hbGwnKS5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKn++8jOW/q+WOu+eymOi0tOWQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZExpbmtUb1JQQyhlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5maWxlbmFtZSwgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgICAgICBpZiAocmVzID09PSAnc3VjY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUNsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbCgn5Y+R6YCB5oiQ5Yqf77yM5b+r5Y6755yL55yL5ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzor7fmo4Dmn6XmgqjnmoRSUEPphY3nva7kv6Hmga/vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zZW5kLXJwYycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItbGluay1ycGMnKS5jbGljaygpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5Y+R6YCB5a6M5oiQ77yM5Y+R6YCB57uT5p6c6KeB5LiK5pa55oyJ6ZKu77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwogICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09PSAnQScgJiYgfmUudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdwbC1hJykpIHsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICB9LAoKICAgICAgICBhZGRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJnLWRyb3Bkb3duLWJ1dHRvbiBwb2ludGVyIHBsLWJ1dHRvbiI+PGRpdiBzdHlsZT0iY29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiAke2NvbG9yfTtib3JkZXItY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbiBnLWJ1dHRvbi1ibHVlIj48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRvd25sb2FkIj48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDYwcHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9Im1lbnUiIHN0eWxlPSJ3aWR0aDphdXRvO3otaW5kZXg6NDE7Ym9yZGVyLWNvbG9yOiR7Y29sb3J9Ij48ZGl2IHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2Rpdj48ZGl2IHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIj5CQ+S4i+i9vTwvZGl2PiR7cGFuLmNvZGUgPT0gMjAwICYmIHZlcnNpb24gPCBwYW4udmVyc2lvbiA/IHBhbi5uZXcgOiAnJ308L2Rpdj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnbWFpbicpIHsKICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5tYWluKTsKICAgICAgICAgICAgICAgICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJwbC1idXR0b24iIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJ1LWJ1dHRvbiB1LWJ1dHRvbi0tcHJpbWFyeSB1LWJ1dHRvbi0tc21hbGwgaXMtcm91bmQgaXMtaGFzLWljb24iIHN0eWxlPSJiYWNrZ3JvdW5kOiAke2NvbG9yfTtib3JkZXItY29sb3I6ICR7Y29sb3J9O2ZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGJvcmRlcjogbm9uZTsiPjxpIGNsYXNzPSJ1LWljb24gdS1pY29uLWRvd25sb2FkIj48L2k+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjx1bCBjbGFzcz0iZHJvcGRvd24tbGlzdCBuZC1jb21tb24tZmxvYXQtbWVudSBwbC1kcm9wZG93bi1tZW51Ij48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPiR7cGFuLmNvZGUgPT0gMjAwICYmIHZlcnNpb24gPCBwYW4udmVyc2lvbiA/IHBhbi5uZXdYIDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICB0aGlzLnNldEJEVVNTKCk7CiAgICAgICAgICAgIHRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkSW5pdEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uLWluaXQiIHN0eWxlPSJvcGFjaXR5Oi41Ij48ZGl2IHN0eWxlPSJjb2xvcjojZmZmO2JhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9kaXY+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ21haW4nKSB7CiAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CiAgICAgICAgICAgICAgICAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uLWluaXQiIHN0eWxlPSJvcGFjaXR5Oi41OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0idS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iYmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiAke2NvbG9yfTtmb250LXNpemU6IDE0cHg7IHBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRUb2tlbigpIHsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1szXSk7CiAgICAgICAgICAgIGlmIChyZXMuaW5kZXhPZignYWNjZXNzX3Rva2VuJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGF3YWl0IGJhc2UuZ2V0KHBhbi5wY3NbM10sIHt9LCAndGV4dCcpOwogICAgICAgICAgICAgICAgbGV0IGJkc3Rva2VuID0gaHRtbC5tYXRjaCgvbmFtZT0iYmRzdG9rZW4iXHMrdmFsdWU9IihbXiJdKykiLyk/LlsxXTsKICAgICAgICAgICAgICAgIGxldCBjbGllbnRfaWQgPSBodG1sLm1hdGNoKC9uYW1lPSJjbGllbnRfaWQiXHMrdmFsdWU9IihbXiJdKykiLyk/LlsxXTsKICAgICAgICAgICAgICAgIGxldCBkYXRhID0gewogICAgICAgICAgICAgICAgICAgIGdyYW50X3Blcm1pc3Npb25zX2FycjogJ25ldGRpc2snLAogICAgICAgICAgICAgICAgICAgIGJkc3Rva2VuOiBiZHN0b2tlbiwKICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudF9pZCwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiAidG9rZW4iLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICJwYWdlIiwKICAgICAgICAgICAgICAgICAgICBncmFudF9wZXJtaXNzaW9uczogImJhc2ljLG5ldGRpc2siCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1szXSwgYmFzZS5zdHJpbmdpZnkoZGF0YSksIHsKICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgbGV0IHJlczIgPSBhd2FpdCBiYXNlLmdldEZpbmFsVXJsKHBhbi5wY3NbM10pOwogICAgICAgICAgICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gcmVzMi5tYXRjaCgvYWNjZXNzX3Rva2VuPShbXiZdKykvKT8uWzFdOwogICAgICAgICAgICAgICAgYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSByZXMubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsKICAgICAgICAgICAgYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFBDU0xpbmsobWF4UmVxdWVzdFRpbWUgPSAyKSB7CiAgICAgICAgICAgIHNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwogICAgICAgICAgICBsZXQgZmlkTGlzdCA9IHRoaXMuX2dldEZpZExpc3QoKSwgdXJsLCByZXM7CgogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJyB8fCBwdCA9PT0gJ21haW4nKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaWRMaXN0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGZpZExpc3QpOwogICAgICAgICAgICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gYmFzZS5nZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicpIHx8IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgICAgIHVybCA9IGAke3Bhbi5wY3NbMF19JmZzaWRzPSR7ZmlkTGlzdH0mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YDsKICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGJhc2UuZ2V0KHVybCwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldFNoYXJlRGF0YSgpOwogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tu+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZpZExpc3QubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+aJk+W8gOaWh+S7tuWkueWQjuWLvumAieaWh+S7tu+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuc2lnbikgewogICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHtwYW4ucGNzWzJdfSZzdXJsPSR7cGFyYW1zLnN1cmx9JmxvZ2lkPSR7cGFyYW1zLmxvZ2lkfWA7CiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBiYXNlLmdldCh1cmwpOwogICAgICAgICAgICAgICAgICAgIGlmIChyLmVycm5vID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zaWduID0gci5kYXRhLnNpZ247CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy50aW1lc3RhbXAgPSByLmRhdGEudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWFsb2cgPSBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3Q6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYOaPkOekuu+8muivt+WwhuaWh+S7tjxzcGFuIGNsYXNzPSJ0YWctZGFuZ2VyIj5b5L+d5a2Y5Yiw572R55uYXTwvc3Bhbj7wn5GJ5YmN5b6APHNwYW4gY2xhc3M9InRhZy1kYW5nZXIiPlvmiJHnmoTnvZHnm5hdPC9zcGFuPuS4reS4i+i9ve+8gWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn54K55Ye75L+d5a2YJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWFsb2cuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy50b29scy1zaGFyZS1zYXZlLWhiJylbMF0uY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuYmRzdG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI55m75b2V572R55uY77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZW5jcnlwdCcsIHBhcmFtcy5lbmNyeXB0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZHVjdCcsIHBhcmFtcy5wcm9kdWN0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndWsnLCBwYXJhbXMudWspOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwcmltYXJ5aWQnLCBwYXJhbXMucHJpbWFyeWlkKTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlkX2xpc3QnLCBmaWRMaXN0KTsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbG9naWQnLCBwYXJhbXMubG9naWQpOwogICAgICAgICAgICAgICAgcGFyYW1zLnNoYXJlVHlwZSA9PT0gJ3NlY3JldCcgPyBmb3JtRGF0YS5hcHBlbmQoJ2V4dHJhJywgcGFyYW1zLmV4dHJhKSA6ICcnOwogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1sxXX0mc2lnbj0ke3BhcmFtcy5zaWdufSZ0aW1lc3RhbXA9JHtwYXJhbXMudGltZXN0YW1wfWA7CiAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBmb3JtRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlcy5lcnJubyA9PT0gMCkgewogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHJlcy5saXN0KTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5lcnJubyA9PT0gMTEyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6aG16Z2i6L+H5pyf77yM6K+35Yi35paw6YeN6K+V77yBJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVycm5vID09PSA5MDE5KSB7CiAgICAgICAgICAgICAgICBtYXhSZXF1ZXN0VGltZS0tOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKG1heFJlcXVlc3RUaW1lID4gMCkgewogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muiOt+WPluS4i+i9vemTvuaOpeWksei0pe+8geivt+WIt+aWsOe9kemhteWQjumHjeivle+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yB6K+35Yi35paw572R6aG15ZCO6YeN6K+V77yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CiAgICAgICAgICAgIGxldCBhbGlua0FsbFRleHQgPSAnJzsKICAgICAgICAgICAgYmFzZS5zb3J0QnlOYW1lKGxpc3QpOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LmlzZGlyID09PSAxKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LnNlcnZlcl9maWxlbmFtZSB8fCB2LmZpbGVuYW1lOwogICAgICAgICAgICAgICAgbGV0IGV4dCA9IGJhc2UuZ2V0RXh0ZW5zaW9uKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRsaW5rOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFwaSIgaHJlZj0iJHtkbGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPuiLpeayoeacieW8ueWHuklETeS4i+i9veahhu+8jOaJvuWIsElETSA8Yj7pgInpobk8L2I+IC0+IDxiPuaWh+S7tuexu+WeizwvYj4gLT4gPGI+56ys5LiA5Liq5qGGPC9iPiDkuK3mt7vliqDlkI7nvIAgPHNwYW4gY2xhc3M9InBsLWV4dCI+JHtleHR9PC9zcGFuPu+8jDxhIGhyZWY9IiR7cGFuLmlkbX0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+6K+m6KeB5q2k5aSEPC9hPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InBsLWJhY2sgbGlzdGVuZXItYmFjayI+6L+U5ZuePC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3Mtb3V0ZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyLXRleHQiPjAlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1zdG9wIGxpc3RlbmVyLXN0b3AiPuWPlua2iOS4i+i9vTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCI+5pyq5Y+R546wSURN77yM5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJHthbGluay5saW5rfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2JjJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRlbnQgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CiAgICAgICAgICAgIGxldCBycGMgPSB7CiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCiAgICAgICAgICAgICAgICBkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAogICAgICAgICAgICB9OwogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CiAgICAgICAgICAgIGlmICghQkRVU1MpIHJldHVybiAnYXNzaXN0YW50JzsKCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKICAgICAgICAgICAgbGV0IHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLAogICAgICAgICAgICAgICAgICAgIG91dDogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbYFVzZXItQWdlbnQ6ICR7cGFuLnVhfWAsIGBDb29raWU6IEJEVVNTPSR7QkRVU1N9YF0KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2VsZWN0ZWRMaXN0KCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoJ3N5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcycpLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53cC1zLWNvcmUtcGFuJykuX192dWVfXy5zZWxlY3RlZExpc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRMb2dpZCgpIHsKICAgICAgICAgICAgbGV0IHV0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0udG9vbHMuYmFzZVNlcnZpY2U7CiAgICAgICAgICAgIHJldHVybiB1dC5iYXNlNjRFbmNvZGUoYmFzZS5nZXRDb29raWUoIkJBSURVSUQiKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2hhcmVEYXRhKCkgewogICAgICAgICAgICBsZXQgcmVzID0gbG9jYWxzLmR1bXAoKTsKICAgICAgICAgICAgcGFyYW1zLnNoYXJlVHlwZSA9ICdzZWNyZXQnOwogICAgICAgICAgICBwYXJhbXMuc2lnbiA9ICcnOwogICAgICAgICAgICBwYXJhbXMudGltZXN0YW1wID0gJyc7CiAgICAgICAgICAgIHBhcmFtcy5iZHN0b2tlbiA9IHJlcy5iZHN0b2tlbi52YWx1ZTsKICAgICAgICAgICAgcGFyYW1zLmNoYW5uZWwgPSAnY2h1bmxlaSc7CiAgICAgICAgICAgIHBhcmFtcy5jbGllbnR0eXBlID0gMDsKICAgICAgICAgICAgcGFyYW1zLndlYiA9IDE7CiAgICAgICAgICAgIHBhcmFtcy5hcHBfaWQgPSAyNTA1Mjg7CiAgICAgICAgICAgIHBhcmFtcy5lbmNyeXB0ID0gMDsKICAgICAgICAgICAgcGFyYW1zLnByb2R1Y3QgPSAnc2hhcmUnOwogICAgICAgICAgICBwYXJhbXMubG9naWQgPSB0aGlzLmdldExvZ2lkKCk7CiAgICAgICAgICAgIHBhcmFtcy5wcmltYXJ5aWQgPSByZXMuc2hhcmVpZC52YWx1ZTsKICAgICAgICAgICAgcGFyYW1zLnVrID0gcmVzLnNoYXJlX3VrLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyAmJiAocGFyYW1zLmV4dHJhID0gdGhpcy5fZ2V0RXh0cmEoKSk7CiAgICAgICAgICAgIHBhcmFtcy5zdXJsID0gdGhpcy5fZ2V0U3VybCgpOwogICAgICAgIH0sCgogICAgICAgIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIGlmICgvXlwvZGlza1wvaG9tZS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKICAgICAgICAgICAgaWYgKC9eXC9kaXNrXC9tYWluLy50ZXN0KHBhdGgpKSByZXR1cm4gJ21haW4nOwogICAgICAgICAgICBpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewogICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGUsCiAgICAgICAgICAgICAgICBodG1sLAogICAgICAgICAgICAgICAgZm9vdGVyLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERhdGEoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKICAgICAgICAgICAgYmFzZS5pbml0RGVmYXVsdENvbmZpZygpOwogICAgICAgICAgICBiYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CiAgICAgICAgICAgIHB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QKICAgICAgICAgICAgKGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjI/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgIHBhbiA9IEpTT04ucGFyc2UoYmFzZS5kKHJlcykpOwogICAgICAgICAgICBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fAogICAgICAgICAgICBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwogICAgICAgICAgICBiYXNlLmNyZWF0ZVRpcCgpOwogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCBhbGkgPSB7CgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIlJlZmVyZXI6IGh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8iYCk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfSZyZWZlcj0ke2VuY29kZVVSSUNvbXBvbmVudCgnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLycpfVpaYDsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1lICJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vImApOwogICAgICAgIH0sCgogICAgICAgIGFkZFBhZ2VMaXN0ZW5lcigpIHsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKICAgICAgICAgICAgICAgIFN3YWwuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0UENTTGluaygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgbGV0IGRhdGFzZXQgPSBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldDsKICAgICAgICAgICAgICAgIGxldCBocmVmID0gZGF0YXNldC5saW5rOwogICAgICAgICAgICAgICAgbGV0IHVybCA9IGF3YWl0IHRoaXMuZ2V0UmVhbExpbmsoZGF0YXNldC5kaWQsIGRhdGFzZXQuZmlkKTsKICAgICAgICAgICAgICAgIGlmICh1cmwpIGhyZWYgPSB1cmw7CiAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBocmVmKTsKICAgICAgICAgICAgICAgIC8vIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICAgICAgICAgICAgLy8gZC5kb3dubG9hZCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lOwogICAgICAgICAgICAgICAgLy8gZC5yZWwgPSAibm9vcGVuZXIiOwogICAgICAgICAgICAgICAgLy8gZC5ocmVmID0gaHJlZjsKICAgICAgICAgICAgICAgIC8vIGQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgiY2xpY2siKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaS1idG4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZS50YXJnZXQuZGF0YXNldC5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip/vvIzlv6vljrvnspjotLTlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn++8jOW/q+WOu+eci+eci+WQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM6K+35qOA5p+l5oKo55qEUlBD6YWN572u5L+h5oGv77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSru+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tc2V0dGluZycsICgpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIH0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsKICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6IHRydWV9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UmVhbExpbmsoZCwgZikgewogICAgICAgICAgICBsZXQgYXV0aG9yaXphdGlvbiA9IGAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS50b2tlbl90eXBlfSAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS5hY2Nlc3NfdG9rZW59YDsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzFdLCB7CiAgICAgICAgICAgICAgICBkcml2ZV9pZDogZCwKICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGYKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiwKICAgICAgICAgICAgICAgICJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChyZXMudXJsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnVybDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgYWRkQnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iYWxpLWJ1dHRvbiBwbC1idXR0b24iPjxzdmcgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik04NTMuMzMzIDkzOC42NjdIMTcwLjY2N2E4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNC04NS4zMzR2LTM4NEE4NS4zMzMgODUuMzMzIDAgMCAxIDE3MC42NjcgMzg0SDI4OGEzMiAzMiAwIDAgMSAwIDY0SDE3MC42NjdhMjEuMzMzIDIxLjMzMyAwIDAgMC0yMS4zMzQgMjEuMzMzdjM4NGEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNCAyMS4zMzRoNjgyLjY2NmEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNC0yMS4zMzR2LTM4NEEyMS4zMzMgMjEuMzMzIDAgMCAwIDg1My4zMzMgNDQ4SDczNmEzMiAzMiAwIDAgMSAwLTY0aDExNy4zMzNhODUuMzMzIDg1LjMzMyAwIDAgMSA4NS4zMzQgODUuMzMzdjM4NGE4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNCA4NS4zMzR6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTcxNS4wMyA1NDMuNTUyYTMyLjgxIDMyLjgxIDAgMCAwLTQ2LjI1MSAwTDU1NC4wMDUgNjU3LjgxM3YtNTQwLjQ4YTMyIDMyIDAgMCAwLTY0IDB2NTM5LjczNEwzNzUuODkzIDU0My40ODhhMzIuNzkgMzIuNzkgMCAwIDAtNDYuMjI5IDAgMzIuNDI3IDMyLjQyNyAwIDAgMCAwIDQ2LjAzN2wxNjkuNTU3IDE2OC44MTFhMzIuODEgMzIuODEgMCAwIDAgNDYuMjUxIDBsMTY5LjU1Ny0xNjguODFhMzIuNDcgMzIuNDcgMCAwIDAgMC00NS45NzR6IiBmaWxsPSIjRkY5QzAwIi8+PC9zdmc+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvdWw+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLmFwcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICAkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKICAgICAgICB9LAoKICAgICAgICBhZGRJbml0QnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iYWxpLWJ1dHRvbiBwbC1idXR0b24taW5pdCI+PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1My4zMzMgOTM4LjY2N0gxNzAuNjY3YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0LTg1LjMzNHYtMzg0QTg1LjMzMyA4NS4zMzMgMCAwIDEgMTcwLjY2NyAzODRIMjg4YTMyIDMyIDAgMCAxIDAgNjRIMTcwLjY2N2EyMS4zMzMgMjEuMzMzIDAgMCAwLTIxLjMzNCAyMS4zMzN2Mzg0YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0IDIxLjMzNGg2ODIuNjY2YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0LTIxLjMzNHYtMzg0QTIxLjMzMyAyMS4zMzMgMCAwIDAgODUzLjMzMyA0NDhINzM2YTMyIDMyIDAgMCAxIDAtNjRoMTE3LjMzM2E4NS4zMzMgODUuMzMzIDAgMCAxIDg1LjMzNCA4NS4zMzN2Mzg0YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0IDg1LjMzNHoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNzE1LjAzIDU0My41NTJhMzIuODEgMzIuODEgMCAwIDAtNDYuMjUxIDBMNTU0LjAwNSA2NTcuODEzdi01NDAuNDhhMzIgMzIgMCAwIDAtNjQgMHY1MzkuNzM0TDM3NS44OTMgNTQzLjQ4OGEzMi43OSAzMi43OSAwIDAgMC00Ni4yMjkgMCAzMi40MjcgMzIuNDI3IDAgMCAwIDAgNDYuMDM3bDE2OS41NTcgMTY4LjgxMWEzMi44MSAzMi44MSAwIDAgMCA0Ni4yNTEgMGwxNjkuNTU3LTE2OC44MWEzMi40NyAzMi40NyAwIDAgMCAwLTQ1Ljk3NHoiIGZpbGw9IiNGRjlDMDAiLz48L3N2Zz48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAuYXBwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFBDU0xpbmsoKSB7CiAgICAgICAgICAgIGxldCByZWFjdERvbUdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhbi5kb20uZ3JpZCk7CiAgICAgICAgICAgIGlmIChyZWFjdERvbUdyaWQpIHsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5o+Q56S6JywKICAgICAgICAgICAgICAgICAgICBodG1sOiAnPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyOyI+6K+35YWI5YiH5o2i5YiwIDxiPuWIl+ihqOinhuWbvjwvYj7vvIg8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTEzMiA5MjhjLTMyLjggMC01OS4yLTI2LjQtNTkuMi01OS4yczI2LjQtNTkuMiA1OS4yLTU5LjJoNzYwYzMyLjggMCA1OS4yIDI2LjQgNTkuMiA1OS4yUzkyNC44IDkyOCA4OTIgOTI4SDEzMnptMC0zNTYuOGMtMzIuOCAwLTU5LjItMjYuNC01OS4yLTU5LjJzMjYuNC01OS4yIDU5LjItNTkuMmg3NjBjMzIuOCAwIDU5LjIgMjYuNCA1OS4yIDU5LjJzLTI2LjQgNTkuMi01OS4yIDU5LjJIMTMyem0wLTM1NmMtMzIuOCAwLTU5LjItMjYuNC01OS4yLTU5LjJTOTkuMiA5Ni44IDEzMiA5Ni44aDc2MGMzMi44IDAgNTkuMiAyNi40IDU5LjIgNTkuMnMtMjYuNCA1OS4yLTU5LjIgNTkuMkgxMzJ6Ii8+PC9zdmc+77yJ5ZCO6I635Y+W77yBPC9kaXY+JywKICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+eCueWHu+WIh+aNoicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5zd2l0Y2gpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2Uuc3VjY2Vzcygn5YiH5o2i5oiQ5Yqf77yM6K+36YeN5paw6I635Y+W5LiL6L296ZO+5o6l77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7CiAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tu+8gScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPiAyMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrljZXmrKHmnIDlpJrlj6/li77pgIkgMjAg5Liq5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JpemF0aW9uID0gYCR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLnRva2VuX3R5cGV9ICR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLmFjY2Vzc190b2tlbn1gOwogICAgICAgICAgICAgICAgICAgIGxldCB4U2hhcmVUb2tlbiA9IGJhc2UuZ2V0U3RvcmFnZSgnc2hhcmVUb2tlbicpLnNoYXJlX3Rva2VuOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVfc2VjOiA2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBzZWxlY3RMaXN0W2ldLmZpbGVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlX2lkOiBzZWxlY3RMaXN0W2ldLnNoYXJlSWQKICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4LXNoYXJlLXRva2VuIjogeFNoYXJlVG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZG93bmxvYWRfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RMaXN0W2ldLmRvd25sb2FkVXJsID0gcmVzLmRvd25sb2FkX3VybDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI55m75b2V572R55uY77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwogICAgICAgICAgICB0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKICAgICAgICB9LAoKICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CiAgICAgICAgICAgIGxldCBhbGlua0FsbFRleHQgPSAnJzsKICAgICAgICAgICAgbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodi50eXBlID09PSAnZm9sZGVyJykgcmV0dXJuOwogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gdi5uYW1lOwogICAgICAgICAgICAgICAgbGV0IGZpZCA9IHYuZmlsZUlkOwogICAgICAgICAgICAgICAgbGV0IGRpZCA9IHYuZHJpdmVJZDsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsIHx8IHYudXJsOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZGlkPSIke2RpZH0iIGRhdGEtZmlkPSIke2ZpZH0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLWJ0biBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250ZW50ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij7orr7nva7nu4jnq6/nsbvlnovvvIjlvZPliY3kuLrvvJoke3Rlcm1pbmFsVHlwZVtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKV1977yJPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewogICAgICAgICAgICBsZXQgcnBjID0gewogICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIHBhdGg6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKICAgICAgICAgICAgICAgIHRva2VuOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAogICAgICAgICAgICAgICAgZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKICAgICAgICAgICAgbGV0IHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLAogICAgICAgICAgICAgICAgICAgIG91dDogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbYFJlZmVyZXI6IGh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9gXQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBycGNEYXRhLCB7IlJlZmVyZXIiOiAiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLyJ9LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRMaXN0ID0gW107CiAgICAgICAgICAgICAgICBsZXQgcmVhY3REb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhbi5kb20ubGlzdCk7CiAgICAgICAgICAgICAgICBsZXQgcmVhY3RPYmogPSBiYXNlLmZpbmRSZWFjdChyZWFjdERvbSwgMSk7CiAgICAgICAgICAgICAgICBsZXQgcHJvcHMgPSByZWFjdE9iai5wZW5kaW5nUHJvcHM7CiAgICAgICAgICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBwcm9wcy5kYXRhU291cmNlIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEtleXMgPSBwcm9wcy5zZWxlY3RlZEtleXMuc3BsaXQoJywnKTsKICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKCh2YWwpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkS2V5cy5pbmNsdWRlcyh2YWwuZmlsZUlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0LnB1c2godmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTGlzdDsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZWN0UGFnZSgpIHsKICAgICAgICAgICAgbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgaWYgKC9eXC8oZHJpdmUpLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwogICAgICAgICAgICBpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIGlzT25seUZvbGRlcigpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdFtpXS50eXBlID09PSAnZmlsZScpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICBzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CiAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGh0bWwsCiAgICAgICAgICAgICAgICBmb290ZXIsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzLAogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBpbml0UGFuTGlua2VyKCkgewogICAgICAgICAgICBiYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CiAgICAgICAgICAgIGJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsKICAgICAgICAgICAgcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdAogICAgICAgICAgICAoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi9hbGk/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgIHBhbiA9IEpTT04ucGFyc2UoYmFzZS5kKHJlcykpOwogICAgICAgICAgICBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fAogICAgICAgICAgICBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwogICAgICAgICAgICBiYXNlLmNyZWF0ZVRpcCgpOwogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCB0aWFueWkgPSB7CgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmUoYmMpfWApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InRpYW55aS1idXR0b24gcGwtYnV0dG9uIj7kuIvovb3liqnmiYs8dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDI2cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT4ke3Bhbi5jb2RlID09IDIwMCAmJiB2ZXJzaW9uIDwgcGFuLnZlcnNpb24gPyBwYW4ubmV3IDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwogICAgICAgICAgICB0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwogICAgICAgIH0sCgogICAgICAgIGFkZEluaXRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ0aWFueWktYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij7kuIvovb3liqnmiYs8L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRUb2tlbigpIHsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1sxXSwge30pOwogICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSByZXMubWF0Y2goL2FjY2Vzc1Rva2VuPShcdyspLyk/LlsxXTsKICAgICAgICAgICAgYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogaXRlbS5kb3dubG9hZFVybAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgICAgICBmaWxlSWQgPSBpdGVtLmZpbGVJZCwKICAgICAgICAgICAgICAgICAgICBvID0gIkFjY2Vzc1Rva2VuPSIgKyB0b2tlbiArICImVGltZXN0YW1wPSIgKyB0aW1lICsgIiZmaWxlSWQ9IiArIGZpbGVJZCwKICAgICAgICAgICAgICAgICAgICB1cmwgPSBwYW4ucGNzWzJdICsgJz9maWxlSWQ9JyArIGZpbGVJZDsKICAgICAgICAgICAgICAgIGlmIChpdGVtLnNoYXJlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvID0gIkFjY2Vzc1Rva2VuPSIgKyB0b2tlbiArICImVGltZXN0YW1wPSIgKyB0aW1lICsgIiZkdD0xJmZpbGVJZD0iICsgZmlsZUlkICsgIiZzaGFyZUlkPSIgKyBpdGVtLnNoYXJlSWQ7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmZHQ9MSZzaGFyZUlkPScgKyBpdGVtLnNoYXJlSWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgc2lnbiA9IG1kNShvKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KHVybCwgewogICAgICAgICAgICAgICAgICAgICJhY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKICAgICAgICAgICAgICAgICAgICAic2lnbi10eXBlIjogMSwKICAgICAgICAgICAgICAgICAgICAiYWNjZXNzdG9rZW4iOiB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIjogdGltZSwKICAgICAgICAgICAgICAgICAgICAic2lnbmF0dXJlIjogc2lnbgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc19jb2RlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiByZXMuZmlsZURvd25sb2FkVXJsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVycm9yQ29kZSA9PT0gJ0ludmFsaWRTZXNzaW9uS2V5JykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+aPkOekuu+8muivt+WFiOeZu+W9lee9keebmO+8gScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMucmVzX2NvZGUgPT09ICdTaGFyZU5vdEZvdW5kRmxhdERpcicpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6ICfmj5DnpLrvvJror7flhYhb6L2s5a2YXeaWh+S7tu+8jPCfkYnliY3lvoBb5oiR55qE572R55uYXeS4reS4i+i9ve+8gScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzor7fliLfmlrDph43or5XvvIEnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOivt+WIt+aWsOmHjeivle+8gScKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRQQ1NMaW5rKCkgewogICAgICAgICAgICBzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgdG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICBpZiAoIXRva2VuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI55m75b2V572R55uY77yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHF1ZXVlID0gW107CiAgICAgICAgICAgIHNlbGVjdExpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKICAgICAgICAgICAgcmVzLmZvckVhY2godmFsID0+IHsKICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CiAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LmlzRm9sZGVyKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LmZpbGVOYW1lOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FwaScpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdiYycpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRlbnQgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CiAgICAgICAgICAgIGxldCBycGMgPSB7CiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCiAgICAgICAgICAgICAgICBkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwogICAgICAgICAgICBsZXQgcnBjRGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgIHBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKICAgICAgICAgICAgICAgICAgICBkaXI6IHJwYy5kaXIsCiAgICAgICAgICAgICAgICAgICAgb3V0OiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IFtdCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHt9LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmMtZmlsZS1saXN0IikuX192dWVfXy5zZWxlY3RlZExpc3Q7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmluZm8tZGV0YWlsIikuX192dWVfXy5maWxlRGV0YWlsXTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIGlmICgvXlwvd2ViXC9tYWluLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwogICAgICAgICAgICBpZiAoL15cL3dlYlwvc2hhcmUvLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgaXNPbmx5Rm9sZGVyKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICghc2VsZWN0TGlzdFtpXS5pc0ZvbGRlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbCwKICAgICAgICAgICAgICAgIGZvb3RlciwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAogICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsKICAgICAgICAgICAgYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwogICAgICAgICAgICBwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0CiAgICAgICAgICAgIChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3RpYW55aT92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgYmFzZS5jcmVhdGVUaXAoKTsKICAgICAgICAgICAgYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgeHVubGVpID0gewoKICAgICAgICBjb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iYCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOwogICAgICAgICAgICAgICAgdGhpcy5nZXRQQ1NMaW5rKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYmMtYnRuJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCBtaXJyb3IgPSBiYXNlLmdldE1pcnJvckxpc3QoZS50YXJnZXQuZGF0YXNldC5kbGluaywgcGFuLm1pcnJvcik7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChtaXJyb3IpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9Inh1bmxlaS1idXR0b24gcGwtYnV0dG9uIj48aSBjbGFzcz0ieGxwZm9udCB4bHAtZG93bmxvYWQiPjwvaT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxM3B4O21hcmdpbi1sZWZ0OiA2cHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiAzNHB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvdWw+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBiYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CiAgICAgICAgICAgIHRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkSW5pdEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9Inh1bmxlaS1idXR0b24gcGwtYnV0dG9uLWluaXQiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKICAgICAgICB9LAoKICAgICAgICBnZXRUb2tlbigpIHsKICAgICAgICAgICAgbGV0IGNyZWRlbnRpYWxzID0ge30sIGNhcHRjaGEgPSB7fTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICgvXmNyZWRlbnRpYWxzXy8udGVzdChsb2NhbFN0b3JhZ2Uua2V5KGkpKSkgewogICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gYmFzZS5nZXRTdG9yYWdlKGxvY2FsU3RvcmFnZS5rZXkoaSkpOwogICAgICAgICAgICAgICAgICAgIGJhc2Uuc2V0U3RvcmFnZSgnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoL15jYXB0Y2hhX1tcd117MTZ9Ly50ZXN0KGxvY2FsU3RvcmFnZS5rZXkoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FwdGNoYSA9IGJhc2UuZ2V0U3RvcmFnZShsb2NhbFN0b3JhZ2Uua2V5KGkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZGV2aWNlaWQgPSAvKFx3ezMyfSkvLmV4ZWMoYmFzZS5nZXRTdG9yYWdlKCdkZXZpY2VpZCcpLnNwbGl0KCcsJykpWzBdOwogICAgICAgICAgICBsZXQgdG9rZW4gPSB7CiAgICAgICAgICAgICAgICBjcmVkZW50aWFscywKICAgICAgICAgICAgICAgIGNhcHRjaGEsCiAgICAgICAgICAgICAgICBkZXZpY2VpZAogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCwgdG9rZW4pIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KHBhbi5wY3NbMF0gKyBpdGVtLmlkLCB7CiAgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgJHt0b2tlbi5jcmVkZW50aWFscy50b2tlbl90eXBlfSAke3Rva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc190b2tlbn1gLAogICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICAgICAgJ3gtY2FwdGNoYS10b2tlbic6IHRva2VuLmNhcHRjaGEudG9rZW4sCiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdG9rZW4uZGV2aWNlaWQsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChyZXMud2ViX2NvbnRlbnRfbGluaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogcmVzLndlYl9jb250ZW50X2xpbmsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzor7fliLfmlrDph43or5XvvIEnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOeZu+W9lee9keebmOWQjuWIt+aWsOmhtemdou+8gScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UENTTGluaygpIHsKICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7CiAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tu+8gScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdOwogICAgICAgICAgICAgICAgbGV0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWV1ZSk7CiAgICAgICAgICAgICAgICByZXMuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35L+d5a2Y5Yiw6Ieq5bex572R55uY5ZCO5Y67572R55uY5Li76aG15LiL6L2977yBJyk7CiAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLnNsZWVwKDEwMDApOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNhdmVUb0Nsb3VkJykuY2xpY2soKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CiAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoKICAgICAgICB9LAoKICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CiAgICAgICAgICAgIGxldCBhbGlua0FsbFRleHQgPSAnJzsKICAgICAgICAgICAgbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodi5raW5kID09PSAnZHJpdmUjZm9sZGVyJykgcmV0dXJuOwogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gdi5uYW1lOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQoK3Yuc2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLWJ0biBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tYnRuIGxpc3RlbmVyLWxpbmstYmMtYnRuIiBkYXRhLWRsaW5rPSIke2RsaW5rfSI+5aSN5Yi26ZWc5YOP5Zyw5Z2APC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRlbnQgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CiAgICAgICAgICAgIGxldCBycGMgPSB7CiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCiAgICAgICAgICAgICAgICBkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwogICAgICAgICAgICBsZXQgcnBjRGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgIHBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKICAgICAgICAgICAgICAgICAgICBkaXI6IHJwYy5kaXIsCiAgICAgICAgICAgICAgICAgICAgb3V0OiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IFtdCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHt9LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgZG9tcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Tb3VyY2VMaXN0SXRlbV9faXRlbS0tWHhwT0MnKTsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZExpc3QgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGRvbSBvZiBkb21zKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbVZ1ZSA9IGRvbS5fX3Z1ZV9fOwogICAgICAgICAgICAgICAgICAgIGlmIChkb21WdWUuc2VsZWN0ZWQuaW5jbHVkZXMoZG9tVnVlLmluZm8uaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGlzdC5wdXNoKGRvbVZ1ZS5pbmZvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXRlY3RQYWdlKCkgewogICAgICAgICAgICBsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICBpZiAoL15cLyQvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CiAgICAgICAgICAgIGlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgaXNPbmx5Rm9sZGVyKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0W2ldLmtpbmQgPT09ICdkcml2ZSNmaWxlJykgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbCwKICAgICAgICAgICAgICAgIGZvb3RlciwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAogICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsKICAgICAgICAgICAgYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwogICAgICAgICAgICBwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0CiAgICAgICAgICAgIChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3h1bmxlaT92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7CiAgICAgICAgICAgIGJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IHF1YXJrID0gewoKICAgICAgICBjb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJDb29raWU6ICR7ZG9jdW1lbnQuY29va2llfSJgKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9JmNvb2tpZT0ke2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5jb29raWUpfVpaYDsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1iICIke2RvY3VtZW50LmNvb2tpZX0iYCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgaG9tZSA9ICdodHRwczovL3Bhbi5xdWFyay5jbi9saXN0Iy8nLCBhbGwgPSAnaHR0cHM6Ly9wYW4ucXVhcmsuY24vbGlzdCMvbGlzdC9hbGwnOwogICAgICAgICAgICAgICAgaWYgKGUub2xkVVJMID09PSBob21lICYmIGUubmV3VVJMID09PSBhbGwpIHJldHVybjsKICAgICAgICAgICAgICAgIGF3YWl0IGJhc2Uuc2xlZXAoMTUwKTsKICAgICAgICAgICAgICAgIGlmICgkKCcucXVhcmstYnV0dG9uJykubGVuZ3RoID4gMCkgcmV0dXJuOwogICAgICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fAogICAgICAgICAgICAgICAgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InF1YXJrLWJ1dHRvbiBwbC1idXR0b24iPjxzdmcgd2lkdGg9IjIyIiBoZWlnaHQ9IjIyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjNTU1IiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTkgMTJsMiAyIDItMnoiLz48cGF0aCBkPSJNMTQgOGgxLjU1M2MuODUgMCAxLjE2LjA5MyAxLjQ3LjI2Ny4zMTEuMTc0LjU1Ni40My43MjIuNzU2LjE2Ni4zMjYuMjU1LjY1LjI1NSAxLjU0djQuODczYzAgLjg5Mi0uMDg5IDEuMjE1LS4yNTUgMS41NC0uMTY2LjMyNy0uNDEuNTgzLS43MjIuNzU3LS4zMS4xNzQtLjYyLjI2Ny0xLjQ3LjI2N0g2LjQ0N2MtLjg1IDAtMS4xNi0uMDkzLTEuNDctLjI2N2ExLjc3OCAxLjc3OCAwIDAxLS43MjItLjc1NmMtLjE2Ni0uMzI2LS4yNTUtLjY1LS4yNTUtMS41NHYtNC44NzNjMC0uODkyLjA4OS0xLjIxNS4yNTUtMS41NC4xNjYtLjMyNy40MS0uNTgzLjcyMi0uNzU3LjMxLS4xNzQuNjItLjI2NyAxLjQ3LS4yNjdIMTEiLz48cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xMSAzdjEwIi8+PC9nPjwvc3ZnPjxiPuS4i+i9veWKqeaJizwvYj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPiR7cGFuLmNvZGUgPT0gMjAwICYmIHZlcnNpb24gPCBwYW4udmVyc2lvbiA/IHBhbi5uZXcgOiAnJ308L3VsPjwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICAkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFkZEluaXRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJxdWFyay1idXR0b24gcGwtYnV0dG9uLWluaXQiPjxzdmcgd2lkdGg9IjIyIiBoZWlnaHQ9IjIyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjNTU1IiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTkgMTJsMiAyIDItMnoiLz48cGF0aCBkPSJNMTQgOGgxLjU1M2MuODUgMCAxLjE2LjA5MyAxLjQ3LjI2Ny4zMTEuMTc0LjU1Ni40My43MjIuNzU2LjE2Ni4zMjYuMjU1LjY1LjI1NSAxLjU0djQuODczYzAgLjg5Mi0uMDg5IDEuMjE1LS4yNTUgMS41NC0uMTY2LjMyNy0uNDEuNTgzLS43MjIuNzU3LS4zMS4xNzQtLjYyLjI2Ny0xLjQ3LjI2N0g2LjQ0N2MtLjg1IDAtMS4xNi0uMDkzLTEuNDctLjI2N2ExLjc3OCAxLjc3OCAwIDAxLS43MjItLjc1NmMtLjE2Ni0uMzI2LS4yNTUtLjY1LS4yNTUtMS41NHYtNC44NzNjMC0uODkyLjA4OS0xLjIxNS4yNTUtMS41NC4xNjYtLjMyNy40MS0uNTgzLjcyMi0uNzU3LjMxLS4xNzQuNjItLjI2NyAxLjQ3LS4yNjdIMTEiLz48cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xMSAzdjEwIi8+PC9nPjwvc3ZnPjxiPuS4i+i9veWKqeaJizwvYj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRQQ1NMaW5rKCkgewogICAgICAgICAgICBzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZmlkcyA9IFtdOwogICAgICAgICAgICBzZWxlY3RMaXN0LmZvckVhY2godmFsID0+IHsKICAgICAgICAgICAgICAgIGZpZHMucHVzaCh2YWwuZmlkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMF0sIHsKICAgICAgICAgICAgICAgICAgICAiZmlkcyI6IGZpZHMKICAgICAgICAgICAgICAgIH0sIHsiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsICJ1c2VyLWFnZW50IjogcGFuLnVhfSk7CiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDMxMDAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOeZu+W9lee9keebmO+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muiOt+WPlumTvuaOpeWksei0pe+8gScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHJlcy5kYXRhKTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35L+d5a2Y5Yiw6Ieq5bex572R55uY5ZCO5Y67572R55uY5Li76aG15LiL6L2977yBJyk7CiAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLnNsZWVwKDEwMDApOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbGUtaW5mb19yJykuY2xpY2soKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LmZpbGUgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LmZpbGVfbmFtZTsKICAgICAgICAgICAgICAgIGxldCBmaWQgPSB2LmZpZDsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRvd25sb2FkX3VybDsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXBpJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpZD0iJHtmaWR9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2JjJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGVudCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKICAgICAgICAgICAgbGV0IHJwYyA9IHsKICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCiAgICAgICAgICAgICAgICB0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKICAgICAgICAgICAgICAgIGRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CiAgICAgICAgICAgIGxldCBycGNEYXRhID0gewogICAgICAgICAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewogICAgICAgICAgICAgICAgICAgIGRpcjogcnBjLmRpciwKICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcjogW2BDb29raWU6ICR7ZG9jdW1lbnQuY29va2llfWBdCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHsiQ29va2llIjogZG9jdW1lbnQuY29va2llfSwgJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2VsZWN0ZWRMaXN0KCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgbGV0IHJlYWN0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1saXN0JylbMF07CiAgICAgICAgICAgICAgICBsZXQgcmVhY3RPYmogPSBiYXNlLmZpbmRSZWFjdChyZWFjdERvbSk7CiAgICAgICAgICAgICAgICBsZXQgcHJvcHMgPSByZWFjdE9iai5wcm9wczsKICAgICAgICAgICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTGlzdCA9IHByb3BzLmxpc3QgfHwgW107CiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkS2V5cyA9IHByb3BzLnNlbGVjdGVkUm93S2V5cyB8fCBbXTsKICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKCh2YWwpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkS2V5cy5pbmNsdWRlcyh2YWwuZmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0LnB1c2godmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTGlzdDsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZWN0UGFnZSgpIHsKICAgICAgICAgICAgbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgaWYgKC9eXC8obGlzdCkvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CiAgICAgICAgICAgIGlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgaXNPbmx5Rm9sZGVyKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0W2ldLmZpbGUpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICBzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CiAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGh0bWwsCiAgICAgICAgICAgICAgICBmb290ZXIsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzLAogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBpbml0UGFuTGlua2VyKCkgewogICAgICAgICAgICBiYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CiAgICAgICAgICAgIGJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsKICAgICAgICAgICAgcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdAogICAgICAgICAgICAoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi9xdWFyaz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIHRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKICAgICAgICAgICAgYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgeWlkb25nID0gewoKICAgICAgICBjb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iYCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOwogICAgICAgICAgICAgICAgdGhpcy5nZXRQQ1NMaW5rKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXJpYSwgLmxpc3RlbmVyLWNvcHktYWxsJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKn++8jOW/q+WOu+eymOi0tOWQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZExpbmtUb1JQQyhlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5maWxlbmFtZSwgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgICAgICBpZiAocmVzID09PSAnc3VjY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUNsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbCgn5Y+R6YCB5oiQ5Yqf77yM5b+r5Y6755yL55yL5ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzor7fmo4Dmn6XmgqjnmoRSUEPphY3nva7kv6Hmga/vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zZW5kLXJwYycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItbGluay1ycGMnKS5jbGljaygpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5Y+R6YCB5a6M5oiQ77yM5Y+R6YCB57uT5p6c6KeB5LiK5pa55oyJ6ZKu77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwogICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhZGRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ5aWRvbmctYnV0dG9uIHBsLWJ1dHRvbiI+5LiL6L295Yqp5omLPHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiAzNnB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvdWw+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5yZW1vdmVDbGFzcygneWlkb25nLWJ1dHRvbicpLmFkZENsYXNzKCd5aWRvbmctc2hhcmUtYnV0dG9uJyk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwogICAgICAgICAgICB0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwogICAgICAgIH0sCgogICAgICAgIGFkZEluaXRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ5aWRvbmctYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij7kuIvovb3liqnmiYs8L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24ucmVtb3ZlQ2xhc3MoJ3lpZG9uZy1idXR0b24nKS5hZGRDbGFzcygneWlkb25nLXNoYXJlLWJ1dHRvbicpOwogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0UmFuZG9tU3RyaW5nKGxlbikgewogICAgICAgICAgICBsZW4gPSBsZW4gfHwgMTY7CiAgICAgICAgICAgIGxldCAkY2hhcnMgPSAnQUJDREVGR0hKS01OUFFSU1RXWFlaYWJjZGVmaGlqa21ucHJzdHd4eXoyMzQ1Njc4JzsKICAgICAgICAgICAgbGV0IG1heFBvcyA9ICRjaGFycy5sZW5ndGg7CiAgICAgICAgICAgIGxldCBwd2QgPSAnJzsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgcHdkICs9ICRjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4UG9zKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHB3ZDsKICAgICAgICB9LAoKICAgICAgICB1dG9iKHN0cikgewogICAgICAgICAgICBjb25zdCB1ID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRkZdfFteXHgwMC1ceDdGXS9nLCAodCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHQubGVuZ3RoIDwgMikgewogICAgICAgICAgICAgICAgICAgIGxldCBlID0gdC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIDwgMTI4ID8gdCA6IGUgPCAyMDQ4ID8gdSgxOTIgfCBlID4+PiA2KSArIHUoMTI4IHwgNjMgJiBlKSA6IHUoMjI0IHwgZSA+Pj4gMTIgJiAxNSkgKyB1KDEyOCB8IGUgPj4+IDYgJiA2MykgKyB1KDEyOCB8IDYzICYgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlID0gNjU1MzYgKyAxMDI0ICogKHQuY2hhckNvZGVBdCgwKSAtIDU1Mjk2KSArICh0LmNoYXJDb2RlQXQoMSkgLSA1NjMyMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdSgyNDAgfCBlID4+PiAxOCAmIDcpICsgdSgxMjggfCBlID4+PiAxMiAmIDYzKSArIHUoMTI4IHwgZSA+Pj4gNiAmIDYzKSArIHUoMTI4IHwgNjMgJiBlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2lnbihlLCB0LCBhLCBuKSB7CiAgICAgICAgICAgIGxldCByID0gIiIsCiAgICAgICAgICAgICAgICBpID0gIiI7CiAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICBsZXQgcyA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwogICAgICAgICAgICAgICAgaSA9IEpTT04uc3RyaW5naWZ5KHMpLAogICAgICAgICAgICAgICAgICAgIGkgPSBpLnJlcGxhY2UoL1xzKi9nLCAiIiksCiAgICAgICAgICAgICAgICAgICAgaSA9IGVuY29kZVVSSUNvbXBvbmVudChpKTsKICAgICAgICAgICAgICAgIGxldCBjID0gaS5zcGxpdCgiIiksCiAgICAgICAgICAgICAgICAgICAgdSA9IGMuc29ydCgpOwogICAgICAgICAgICAgICAgaSA9IHUuam9pbigiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IEEgPSBtZDUoYmFzZS5lKHRoaXMudXRvYihpKSkpOwogICAgICAgICAgICBsZXQgbCA9IG1kNShhICsgIjoiICsgbik7CiAgICAgICAgICAgIHJldHVybiBtZDUoQSArIGwpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZG93bmxvYWRVcmwpIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6IGl0ZW0uZG93bmxvYWRVcmwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXRlY3RQYWdlKCkgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgICAgIGxldCBib2R5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudElEIjogaXRlbS5jb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICJjb21tb25BY2NvdW50SW5mbyI6IHsiYWNjb3VudCI6IGl0ZW0ub3duZXIsICJhY2NvdW50VHlwZSI6IDF9LAogICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIjogIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5saW5lIjogIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAiZXh0SW5mbyI6IHsiaXNSZXR1cm5DZG5Eb3dubG9hZFVybCI6ICIxIn0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUoK25ldyBEYXRlKCkgKyA4ICogMzYwMCAqIDEwMDApLnRvSlNPTigpLnN1YnN0cigwLCAxOSkucmVwbGFjZSgnVCcsICcgJyk7CiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuZ2V0UmFuZG9tU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgICAgICBsZXQgc2lnbiA9IHRoaXMuZ2V0U2lnbih1bmRlZmluZWQsIGJvZHksIHRpbWUsIGtleSk7CgogICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1swXSwgYm9keSwgewogICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IGJhc2UuZ2V0Q29va2llKCdhdXRob3JpemF0aW9uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICd4LWh1YXdlaS1jaGFubmVsU3JjJzogJzEwMDAwMDM0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3gtaW5uZXItbnR3ayc6ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21jbG91ZC1jaGFubmVsJzogJzEwMDAxMDEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbWNsb3VkLWNsaWVudCc6ICcxMDcwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICdtY2xvdWQtc2lnbic6IHRpbWUgKyAiLCIgKyBrZXkgKyAiLCIgKyBzaWduLAogICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICdjYWxsZXInOiAnd2ViJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NNUy1ERVZJQ0UnOiAnZGVmYXVsdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICd4LURldmljZUluZm8nOiAnfHw5fDcuMTIuMHxjaHJvbWV8MTE4LjAuMC4wfHx3aW5kb3dzIDEwfHx6aC1DTnx8fCcsCiAgICAgICAgICAgICAgICAgICAgICAgICd4LVN2Y1R5cGUnOiAnMScsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiByZXMuZGF0YS5kb3dubG9hZFVSTAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM6K+35Yi35paw6YeN6K+V77yBJwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVjdFBhZ2UoKSA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgICAgIGxldCB2dWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaG9tZS1wYWdlIikuX192dWVfXzsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzFdLCBgbGlua0lkPSR7dnVlRG9tLmxpbmtJRH0mY29udGVudElkcz0ke2VuY29kZVVSSUNvbXBvbmVudCh2dWVEb20uY3VycmVudFBhdGguaWQgKyAnLycgKyBpdGVtLmNvSUQpfSZjYXRhbG9nSWRzPWAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogcmVzLmRhdGEucmVkclVybAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM6K+35Yi35paw6YeN6K+V77yBJwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOivt+WIt+aWsOmHjeivle+8gScKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRQQ1NMaW5rKCkgewogICAgICAgICAgICBzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHF1ZXVlID0gW107CiAgICAgICAgICAgIHNlbGVjdExpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4KSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVldWUpOwogICAgICAgICAgICByZXMuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShzZWxlY3RMaXN0KTsKICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2VuZXJhdGVEb20obGlzdCkgewogICAgICAgICAgICBsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwogICAgICAgICAgICBsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYuZGlyRXRhZyB8fCB2LmNhTmFtZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gdi5jb250ZW50TmFtZSB8fCB2LmNvTmFtZTsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuY29udGVudFNpemUgfHwgdi5jb1NpemUpOwogICAgICAgICAgICAgICAgbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXBpJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2JjJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGVudCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKICAgICAgICAgICAgbGV0IHJwYyA9IHsKICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCiAgICAgICAgICAgICAgICB0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKICAgICAgICAgICAgICAgIGRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CiAgICAgICAgICAgIGxldCBycGNEYXRhID0gewogICAgICAgICAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewogICAgICAgICAgICAgICAgICAgIGRpcjogcnBjLmRpciwKICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcjogW10KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldFNlbGVjdGVkTGlzdCgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubWFpbl9maWxlX2xpc3QiKS5fX3Z1ZV9fLnNlbGVjdExpc3QubWFwKHZhbCA9PiB2YWwuaXRlbSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGxldCB2dWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaG9tZS1wYWdlIikuX192dWVfXzsKICAgICAgICAgICAgICAgIGxldCBmaWxlTGlzdCA9IHZ1ZURvbS5fY29tcHV0ZWRXYXRjaGVycy5maWxlTGlzdC52YWx1ZTsKICAgICAgICAgICAgICAgIGxldCBkaXJMaXN0ID0gdnVlRG9tLl9jb21wdXRlZFdhdGNoZXJzLmRpckxpc3QudmFsdWU7CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRGaWxlSW5kZXggPSB2dWVEb20uc2VsZWN0ZWRGaWxlOwogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGlySW5kZXggPSB2dWVEb20uc2VsZWN0ZWREaXI7CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0RmlsZUxpc3QgPSBmaWxlTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRGaWxlSW5kZXguaW5jbHVkZXMoaSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3REaXJMaXN0ID0gZGlyTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWREaXJJbmRleC5pbmNsdWRlcyhpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zZWxlY3RGaWxlTGlzdCwgLi4uc2VsZWN0RGlyTGlzdF07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXRlY3RQYWdlKCkgewogICAgICAgICAgICBsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICBpZiAoL15cL3cvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CiAgICAgICAgICAgIGlmICgvXlwvbGluay8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBpc09ubHlGb2xkZXIoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3RbaV0uZmlsZUV0YWcgfHwgc2VsZWN0TGlzdFtpXS5jb05hbWUpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9LAoKICAgICAgICBzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CiAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGh0bWwsCiAgICAgICAgICAgICAgICBmb290ZXIsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzLAogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBpbml0UGFuTGlua2VyKCkgewogICAgICAgICAgICBiYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CiAgICAgICAgICAgIGJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsKICAgICAgICAgICAgcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdAogICAgICAgICAgICAoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi95aWRvbmc/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgIHBhbiA9IEpTT04ucGFyc2UoYmFzZS5kKHJlcykpOwogICAgICAgICAgICBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fAogICAgICAgICAgICBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwogICAgICAgICAgICBiYXNlLmNyZWF0ZVRpcCgpOwogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCBtYWluID0gewogICAgICAgIGluaXQoKSB7CiAgICAgICAgICAgIGlmICgvKHBhbnx5dW4pLmJhaWR1LmNvbS8udGVzdChsb2NhdGlvbi5ob3N0KSkgewogICAgICAgICAgICAgICAgYmFpZHUuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgvd3d3LihhbGl5dW5kcml2ZXxhbGlwYW4pLmNvbS8udGVzdChsb2NhdGlvbi5ob3N0KSkgewogICAgICAgICAgICAgICAgYWxpLmluaXRQYW5MaW5rZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoL2Nsb3VkLjE4OS5jbi8udGVzdChsb2NhdGlvbi5ob3N0KSkgewogICAgICAgICAgICAgICAgdGlhbnlpLmluaXRQYW5MaW5rZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoL3Bhbi54dW5sZWkuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICB4dW5sZWkuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgvcGFuLnF1YXJrLmNuLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICBxdWFyay5pbml0UGFuTGlua2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKC8oeXVufGNhaXl1bikuMTM5LmNvbS8udGVzdChsb2NhdGlvbi5ob3N0KSkgewogICAgICAgICAgICAgICAgeWlkb25nLmluaXRQYW5MaW5rZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgbWFpbi5pbml0KCk7Cn0pKCk7Cg==","requires":[{"meta":{"name":"jquery.min.js","url":"https://registry.npmmirror.com/jquery/3.7.0/files/dist/jquery.min.js","ts":1708420280818,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2My43LjAgfCAoYykgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihpZSxlKXsidXNlIHN0cmljdCI7dmFyIG9lPVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLGFlPW9lLnNsaWNlLGc9b2UuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gb2UuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gb2UuY29uY2F0LmFwcGx5KFtdLGUpfSxzPW9lLnB1c2gsc2U9b2UuaW5kZXhPZixuPXt9LGk9bi50b1N0cmluZyx1ZT1uLmhhc093blByb3BlcnR5LG89dWUudG9TdHJpbmcsYT1vLmNhbGwoT2JqZWN0KSxsZT17fSx2PWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLml0ZW19LHk9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sQz1pZS5kb2N1bWVudCx1PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbShlLHQsbil7dmFyIHIsaSxvPShuPW58fEMpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gdSkoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP25baS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIHQ9IjMuNy4wIixsPS9IVE1MJC9pLGNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBjZS5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hdihlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ZnVuY3Rpb24gZmUoZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfWNlLmZuPWNlLnByb3RvdHlwZT17anF1ZXJ5OnQsY29uc3RydWN0b3I6Y2UsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBhZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/YWUuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBjZS5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhjZS5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6cyxzb3J0Om9lLnNvcnQsc3BsaWNlOm9lLnNwbGljZX0sY2UuZXh0ZW5kPWNlLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYobD1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8dihhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpcj1lW3RdLCJfX3Byb3RvX18iIT09dCYmYSE9PXImJihsJiZyJiYoY2UuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxjZS5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPWNlLmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sY2UuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyh0K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1pLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj11ZS5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZvLmNhbGwobik9PT1hKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXttKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKGMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXJldHVybiBlLnRleHRDb250ZW50O2lmKDM9PT1pfHw0PT09aSlyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1jZS50ZXh0KHQpO3JldHVybiBufSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKGMoT2JqZWN0KGUpKT9jZS5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6cy5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOnNlLmNhbGwodCxlLG4pfSxpc1hNTERvYzpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLm5hbWVzcGFjZVVSSSxuPWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hbC50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKGMoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0OmxlfSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKGNlLmZuW1N5bWJvbC5pdGVyYXRvcl09b2VbU3ltYm9sLml0ZXJhdG9yXSksY2UuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBwZT1vZS5wb3AsZGU9b2Uuc29ydCxoZT1vZS5zcGxpY2UsZ2U9IltcXHgyMFxcdFxcclxcblxcZl0iLHZlPW5ldyBSZWdFeHAoIl4iK2dlKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK2dlKyIrJCIsImciKTtjZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3ZhciBuPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PW58fCEoIW58fDEhPT1uLm5vZGVUeXBlfHwhKGUuY29udGFpbnM/ZS5jb250YWlucyhuKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4pKSl9O3ZhciBmPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXHg4MC1cdUZGRkZcdy1dL2c7ZnVuY3Rpb24gcChlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9Y2UuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoZixwKX07dmFyIHllPUMsbWU9czshZnVuY3Rpb24oKXt2YXIgZSxiLHcsbyxhLFQscixDLGQsaSxrPW1lLFM9Y2UuZXhwYW5kbyxFPTAsbj0wLHM9VygpLGM9VygpLHU9VygpLGg9VygpLGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihhPSEwKSwwfSxmPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsdD0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK2dlKyI/fFxcXFxbXlxcclxcblxcZl18W1xcdy1dfFteXDAtXFx4N2ZdKSsiLHA9IlxcWyIrZ2UrIiooIit0KyIpKD86IitnZSsiKihbKl4kfCF+XT89KSIrZ2UrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIit0KyIpKXwpIitnZSsiKlxcXSIsZz0iOigiK3QrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK3ArIikqKXwuKilcXCl8KSIsdj1uZXcgUmVnRXhwKGdlKyIrIiwiZyIpLHk9bmV3IFJlZ0V4cCgiXiIrZ2UrIiosIitnZSsiKiIpLG09bmV3IFJlZ0V4cCgiXiIrZ2UrIiooWz4rfl18IitnZSsiKSIrZ2UrIioiKSx4PW5ldyBSZWdFeHAoZ2UrInw+Iiksaj1uZXcgUmVnRXhwKGcpLEE9bmV3IFJlZ0V4cCgiXiIrdCsiJCIpLEQ9e0lEOm5ldyBSZWdFeHAoIl4jKCIrdCsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIit0KyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIit0KyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrcCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK2cpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrZ2UrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK2dlKyIqKD86KFsrLV18KSIrZ2UrIiooXFxkKyl8KSkiK2dlKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitmKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrZ2UrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrZ2UrIiooKD86LVxcZCk/XFxkKikiK2dlKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxOPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kscT0vXmhcZCQvaSxMPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sSD0vWyt+XS8sTz1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrZ2UrIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLFA9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSxSPWZ1bmN0aW9uKCl7VigpfSxNPUooZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiZmZShlLCJmaWVsZHNldCIpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e2suYXBwbHkob2U9YWUuY2FsbCh5ZS5jaGlsZE5vZGVzKSx5ZS5jaGlsZE5vZGVzKSxvZVt5ZS5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7az17YXBwbHk6ZnVuY3Rpb24oZSx0KXttZS5hcHBseShlLGFlLmNhbGwodCkpfSxjYWxsOmZ1bmN0aW9uKGUpe21lLmFwcGx5KGUsYWUuY2FsbChhcmd1bWVudHMsMSkpfX19ZnVuY3Rpb24gSSh0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmPWUmJmUub3duZXJEb2N1bWVudCxwPWU/ZS5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PXAmJjkhPT1wJiYxMSE9PXApcmV0dXJuIG47aWYoIXImJihWKGUpLGU9ZXx8VCxDKSl7aWYoMTEhPT1wJiYodT1MLmV4ZWModCkpKWlmKGk9dVsxXSl7aWYoOT09PXApe2lmKCEoYT1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gbjtpZihhLmlkPT09aSlyZXR1cm4gay5jYWxsKG4sYSksbn1lbHNlIGlmKGYmJihhPWYuZ2V0RWxlbWVudEJ5SWQoaSkpJiZJLmNvbnRhaW5zKGUsYSkmJmEuaWQ9PT1pKXJldHVybiBrLmNhbGwobixhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gay5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gay5hcHBseShuLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSksbn1pZighKGhbdCsiICJdfHxkJiZkLnRlc3QodCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoeC50ZXN0KHQpfHxtLnRlc3QodCkpKXsoZj1ILnRlc3QodCkmJnooZS5wYXJlbnROb2RlKXx8ZSk9PWUmJmxlLnNjb3BlfHwoKHM9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP3M9Y2UuZXNjYXBlU2VsZWN0b3Iocyk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPVMpKSxvPShsPVkodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0ocz8iIyIrczoiOnNjb3BlIikrIiAiK1EobFtvXSk7Yz1sLmpvaW4oIiwiKX10cnl7cmV0dXJuIGsuYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7aCh0LCEwKX1maW5hbGx5e3M9PT1TJiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiByZSh0LnJlcGxhY2UodmUsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIFcoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gRihlKXtyZXR1cm4gZVtTXT0hMCxlfWZ1bmN0aW9uICQoZSl7dmFyIHQ9VC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIEIodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmZShlLCJpbnB1dCIpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBfKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4oZmUoZSwiaW5wdXQiKXx8ZmUoZSwiYnV0dG9uIikpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBYKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmTShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiBVKGEpe3JldHVybiBGKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLEYoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB6KGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9ZnVuY3Rpb24gVihlKXt2YXIgdCxuPWU/ZS5vd25lckRvY3VtZW50fHxlOnllO3JldHVybiBuIT1UJiY5PT09bi5ub2RlVHlwZSYmbi5kb2N1bWVudEVsZW1lbnQmJihyPShUPW4pLmRvY3VtZW50RWxlbWVudCxDPSFjZS5pc1hNTERvYyhUKSxpPXIubWF0Y2hlc3x8ci53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHIubXNNYXRjaGVzU2VsZWN0b3IseWUhPVQmJih0PVQuZGVmYXVsdFZpZXcpJiZ0LnRvcCE9PXQmJnQuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixSKSxsZS5nZXRCeUlkPSQoZnVuY3Rpb24oZSl7cmV0dXJuIHIuYXBwZW5kQ2hpbGQoZSkuaWQ9Y2UuZXhwYW5kbywhVC5nZXRFbGVtZW50c0J5TmFtZXx8IVQuZ2V0RWxlbWVudHNCeU5hbWUoY2UuZXhwYW5kbykubGVuZ3RofSksbGUuZGlzY29ubmVjdGVkTWF0Y2g9JChmdW5jdGlvbihlKXtyZXR1cm4gaS5jYWxsKGUsIioiKX0pLGxlLnNjb3BlPSQoZnVuY3Rpb24oKXtyZXR1cm4gVC5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUiKX0pLGxlLmNzc0hhcz0kKGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBULnF1ZXJ5U2VsZWN0b3IoIjpoYXMoKiw6anFmYWtlKSIpLCExfWNhdGNoKGUpe3JldHVybiEwfX0pLGxlLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShPLFApO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZDKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKE8sUCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIHQmJnQudmFsdWU9PT1ufX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZDKXt2YXIgbixyLGksbz10LmdldEVsZW1lbnRCeUlkKGUpO2lmKG8pe2lmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXTtpPXQuZ2V0RWxlbWVudHNCeU5hbWUoZSkscj0wO3doaWxlKG89aVtyKytdKWlmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxiLmZpbmQuVEFHPWZ1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dC5xdWVyeVNlbGVjdG9yQWxsKGUpfSxiLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmQylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxkPVtdLCQoZnVuY3Rpb24oZSl7dmFyIHQ7ci5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUw9IjxhIGlkPSciK1MrIicgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGlkPSciK1MrIi1cclxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGQucHVzaCgiXFxbIitnZSsiKig/OnZhbHVlfCIrZisiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK1MrIi1dIikubGVuZ3RofHxkLnB1c2goIn49IiksZS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrUysiKyoiKS5sZW5ndGh8fGQucHVzaCgiLiMuK1srfl0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxkLnB1c2goIjpjaGVja2VkIiksKHQ9VC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxyLmFwcGVuZENoaWxkKGUpLmRpc2FibGVkPSEwLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmZC5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLCh0PVQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8ZC5wdXNoKCJcXFsiK2dlKyIqbmFtZSIrZ2UrIio9IitnZSsiKig/OicnfFwiXCIpIil9KSxsZS5jc3NIYXN8fGQucHVzaCgiOmhhcyIpLGQ9ZC5sZW5ndGgmJm5ldyBSZWdFeHAoZC5qb2luKCJ8IikpLGw9ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gYT0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWxlLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PVR8fGUub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsZSk/LTE6dD09PVR8fHQub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsdCk/MTpvP3NlLmNhbGwobyxlKS1zZS5jYWxsKG8sdCk6MDo0Jm4/LTE6MSl9KSxUfWZvcihlIGluIEkubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBJKGUsbnVsbCxudWxsLHQpfSxJLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFYoZSksQyYmIWhbdCsiICJdJiYoIWR8fCFkLnRlc3QodCkpKXRyeXt2YXIgbj1pLmNhbGwoZSx0KTtpZihufHxsZS5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe2godCwhMCl9cmV0dXJuIDA8SSh0LFQsbnVsbCxbZV0pLmxlbmd0aH0sSS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT1UJiZWKGUpLGNlLmNvbnRhaW5zKGUsdCl9LEkuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT1UJiZWKGUpO3ZhciBuPWIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLHI9biYmdWUuY2FsbChiLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhQyk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6ZS5nZXRBdHRyaWJ1dGUodCl9LEkuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxjZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj0wLGk9MDtpZihhPSFsZS5zb3J0U3RhYmxlLG89IWxlLnNvcnRTdGFibGUmJmFlLmNhbGwoZSwwKSxkZS5jYWxsKGUsbCksYSl7d2hpbGUodD1lW2krK10pdD09PWVbaV0mJihyPW4ucHVzaChpKSk7d2hpbGUoci0tKWhlLmNhbGwoZSxuW3JdLDEpfXJldHVybiBvPW51bGwsZX0sY2UuZm4udW5pcXVlU29ydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhjZS51bmlxdWVTb3J0KGFlLmFwcGx5KHRoaXMpKSl9LChiPWNlLmV4cHI9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpGLG1hdGNoOkQsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShPLFApLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKE8sUCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fEkuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmSS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRC5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZqLnRlc3QobikmJih0PVkobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKE8sUCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLHQpfX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9c1tlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrZ2UrIikiK2UrIigiK2dlKyJ8JCkiKSkmJnMoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1JLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD8iIT0iPT09cjohcnx8KHQrPSIiLCI9Ij09PXI/dD09PWk6IiE9Ij09PXI/dCE9PWk6Il49Ij09PXI/aSYmMD09PXQuaW5kZXhPZihpKToiKj0iPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6IiQ9Ij09PXI/aSYmdC5zbGljZSgtaS5sZW5ndGgpPT09aToifj0iPT09cj8tMTwoIiAiK3QucmVwbGFjZSh2LCIgIikrIiAiKS5pbmRleE9mKGkpOiJ8PSI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihkLGUsdCxoLGcpe3ZhciB2PSJudGgiIT09ZC5zbGljZSgwLDMpLHk9Imxhc3QiIT09ZC5zbGljZSgtNCksbT0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09aCYmMD09PWc/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHU9diE9PXk/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixsPWUucGFyZW50Tm9kZSxjPW0mJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxmPSFuJiYhbSxwPSExO2lmKGwpe2lmKHYpe3doaWxlKHUpe289ZTt3aGlsZShvPW9bdV0paWYobT9mZShvLGMpOjE9PT1vLm5vZGVUeXBlKXJldHVybiExO3M9dT0ib25seSI9PT1kJiYhcyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihzPVt5P2wuZmlyc3RDaGlsZDpsLmxhc3RDaGlsZF0seSYmZil7cD0oYT0ocj0oaT1sW1NdfHwobFtTXT17fSkpW2RdfHxbXSlbMF09PT1FJiZyWzFdKSYmclsyXSxvPWEmJmwuY2hpbGROb2Rlc1thXTt3aGlsZShvPSsrYSYmbyYmb1t1XXx8KHA9YT0wKXx8cy5wb3AoKSlpZigxPT09by5ub2RlVHlwZSYmKytwJiZvPT09ZSl7aVtkXT1bRSxhLHBdO2JyZWFrfX1lbHNlIGlmKGYmJihwPWE9KHI9KGk9ZVtTXXx8KGVbU109e30pKVtkXXx8W10pWzBdPT09RSYmclsxXSksITE9PT1wKXdoaWxlKG89KythJiZvJiZvW3VdfHwocD1hPTApfHxzLnBvcCgpKWlmKChtP2ZlKG8sYyk6MT09PW8ubm9kZVR5cGUpJiYrK3AmJihmJiYoKGk9b1tTXXx8KG9bU109e30pKVtkXT1bRSxwXSksbz09PWUpKWJyZWFrO3JldHVybihwLT1nKT09PWh8fHAlaD09MCYmMDw9cC9ofX19LFBTRVVETzpmdW5jdGlvbihlLG8pe3ZhciB0LGE9Yi5wc2V1ZG9zW2VdfHxiLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8SS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP0YoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoZSxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249c2UuY2FsbChlLHJbaV0pXT0hKHRbbl09cltpXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gYShlLDAsdCl9KTphfX0scHNldWRvczp7bm90OkYoZnVuY3Rpb24oZSl7dmFyIHI9W10saT1bXSxzPW5lKGUucmVwbGFjZSh2ZSwiJDEiKSk7cmV0dXJuIHNbU10/RihmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXMoZSxudWxsLHIsW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShpPW9bYV0pJiYoZVthXT0hKHRbYV09aSkpfSk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByWzBdPWUscyhyLG51bGwsbixpKSxyWzBdPW51bGwsIWkucG9wKCl9fSksaGFzOkYoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAwPEkodCxlKS5sZW5ndGh9fSksY29udGFpbnM6RihmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoTyxQKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8Y2UudGV4dChlKSkuaW5kZXhPZih0KX19KSxsYW5nOkYoZnVuY3Rpb24obil7cmV0dXJuIEEudGVzdChufHwiIil8fEkuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrbiksbj1uLnJlcGxhY2UoTyxQKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0O2Rve2lmKHQ9Qz9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobisiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9aWUubG9jYXRpb24mJmllLmxvY2F0aW9uLmhhc2g7cmV0dXJuIHQmJnQuc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09cn0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gVC5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCkmJlQuaGFzRm9jdXMoKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpYKCExKSxkaXNhYmxlZDpYKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLCJpbnB1dCIpJiYhIWUuY2hlY2tlZHx8ZmUoZSwib3B0aW9uIikmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBxLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBOLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSwiaW5wdXQiKSYmImJ1dHRvbiI9PT1lLnR5cGV8fGZlKGUsImJ1dHRvbiIpfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBmZShlLCJpbnB1dCIpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6VShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6VShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6VShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOlUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6VShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OlUoZnVuY3Rpb24oZSx0LG4pe3ZhciByO2ZvcihyPW48MD9uK3Q6dDxuP3Q6bjswPD0tLXI7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OlUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPUIoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSliLnBzZXVkb3NbZV09XyhlKTtmdW5jdGlvbiBHKCl7fWZ1bmN0aW9uIFkoZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsPWNbZSsiICJdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO2E9ZSxzPVtdLHU9Yi5wcmVGaWx0ZXI7d2hpbGUoYSl7Zm9yKG8gaW4gbiYmIShyPXkuZXhlYyhhKSl8fChyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSkscy5wdXNoKGk9W10pKSxuPSExLChyPW0uZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UodmUsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1EW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/SS5lcnJvcihlKTpjKGUscykuc2xpY2UoMCl9ZnVuY3Rpb24gUShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIEooYSxlLHQpe3ZhciBzPWUuZGlyLHU9ZS5uZXh0LGw9dXx8cyxjPXQmJiJwYXJlbnROb2RlIj09PWwsZj1uKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVtzXSlpZigxPT09ZS5ub2RlVHlwZXx8YylyZXR1cm4gYShlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89W0UsZl07aWYobil7d2hpbGUoZT1lW3NdKWlmKCgxPT09ZS5ub2RlVHlwZXx8YykmJmEoZSx0LG4pKXJldHVybiEwfWVsc2Ugd2hpbGUoZT1lW3NdKWlmKDE9PT1lLm5vZGVUeXBlfHxjKWlmKGk9ZVtTXXx8KGVbU109e30pLHUmJmZlKGUsdSkpZT1lW3NdfHxlO2Vsc2V7aWYoKHI9aVtsXSkmJnJbMF09PT1FJiZyWzFdPT09ZilyZXR1cm4gb1syXT1yWzJdO2lmKChpW2xdPW8pWzJdPWEoZSx0LG4pKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiBLKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFooZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBlZShkLGgsZyx2LHksZSl7cmV0dXJuIHYmJiF2W1NdJiYodj1lZSh2KSkseSYmIXlbU10mJih5PWVlKHksZSkpLEYoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdT1bXSxsPVtdLGM9dC5sZW5ndGgsZj1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKUkoZSx0W3JdLG4pO3JldHVybiBufShofHwiKiIsbi5ub2RlVHlwZT9bbl06bixbXSkscD0hZHx8IWUmJmg/ZjpaKGYsdSxkLG4scik7aWYoZz9nKHAscz15fHwoZT9kOmN8fHYpP1tdOnQsbixyKTpzPXAsdil7aT1aKHMsbCksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihzW2xbb11dPSEocFtsW29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmaS5wdXNoKHBbb109YSk7eShudWxsLHM9W10saSxyKX1vPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmLTE8KGk9eT9zZS5jYWxsKGUsYSk6dVtvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2Ugcz1aKHM9PT10P3Muc3BsaWNlKGMscy5sZW5ndGgpOnMpLHk/eShudWxsLHQscyxyKTprLmFwcGx5KHQscyl9KX1mdW5jdGlvbiB0ZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PUooZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1pfSxhLCEwKSxsPUooZnVuY3Rpb24oZSl7cmV0dXJuLTE8c2UuY2FsbChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT13KXx8KChpPXQpLm5vZGVUeXBlP3UoZSx0LG4pOmwoZSx0LG4pKTtyZXR1cm4gaT1udWxsLHJ9XTtzPHI7cysrKWlmKHQ9Yi5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W0ooSyhjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gZWUoMTxzJiZLKGMpLDE8cyYmUShlLnNsaWNlKDAscy0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbcy0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHZlLCIkMSIpLHQsczxuJiZ0ZShlLnNsaWNlKHMsbikpLG48ciYmdGUoZT1lLnNsaWNlKG4pKSxuPHImJlEoZSkpfWMucHVzaCh0KX1yZXR1cm4gSyhjKX1mdW5jdGlvbiBuZShlLHQpe3ZhciBuLHYseSxtLHgscixpPVtdLG89W10sYT11W2UrIiAiXTtpZighYSl7dHx8KHQ9WShlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9dGUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9dShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD0iMCIsYz1lJiZbXSxmPVtdLHA9dyxkPWV8fHgmJmIuZmluZC5UQUcoIioiLGkpLGg9RSs9bnVsbD09cD8xOk1hdGgucmFuZG9tKCl8fC4xLGc9ZC5sZW5ndGg7Zm9yKGkmJih3PXQ9PVR8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PVR8fChWKG8pLG49IUMpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxULG4pKXtrLmNhbGwocixvKTticmVha31pJiYoRT1oKX1tJiYoKG89IXMmJm8pJiZ1LS0sZSYmYy5wdXNoKG8pKX1pZih1Kz1sLG0mJmwhPT11KXthPTA7d2hpbGUocz15W2ErK10pcyhjLGYsdCxuKTtpZihlKXtpZigwPHUpd2hpbGUobC0tKWNbbF18fGZbbF18fChmW2xdPXBlLmNhbGwocikpO2Y9WihmKX1rLmFwcGx5KHIsZiksaSYmIWUmJjA8Zi5sZW5ndGgmJjE8dSt5Lmxlbmd0aCYmY2UudW5pcXVlU29ydChyKX1yZXR1cm4gaSYmKEU9aCx3PXApLGN9LG0/RihyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9ZnVuY3Rpb24gcmUoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJlkoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZDJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKE8sUCksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1ELm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZShPLFApLEgudGVzdChvWzBdLnR5cGUpJiZ6KHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJlEobykpKXJldHVybiBrLmFwcGx5KG4sciksbjticmVha319fXJldHVybihsfHxuZShlLGMpKShyLHQsIUMsbiwhdHx8SC50ZXN0KGUpJiZ6KHQucGFyZW50Tm9kZSl8fHQpLG59Ry5wcm90b3R5cGU9Yi5maWx0ZXJzPWIucHNldWRvcyxiLnNldEZpbHRlcnM9bmV3IEcsbGUuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KGwpLmpvaW4oIiIpPT09UyxWKCksbGUuc29ydERldGFjaGVkPSQoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihULmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksY2UuZmluZD1JLGNlLmV4cHJbIjoiXT1jZS5leHByLnBzZXVkb3MsY2UudW5pcXVlPWNlLnVuaXF1ZVNvcnQsSS5jb21waWxlPW5lLEkuc2VsZWN0PXJlLEkuc2V0RG9jdW1lbnQ9VixJLmVzY2FwZT1jZS5lc2NhcGVTZWxlY3RvcixJLmdldFRleHQ9Y2UudGV4dCxJLmlzWE1MPWNlLmlzWE1MRG9jLEkuc2VsZWN0b3JzPWNlLmV4cHIsSS5zdXBwb3J0PWNlLnN1cHBvcnQsSS51bmlxdWVTb3J0PWNlLnVuaXF1ZVNvcnR9KCk7dmFyIGQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJmNlKGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0saD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sYj1jZS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx3PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFQoZSxuLHIpe3JldHVybiB2KG4pP2NlLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP2NlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP2NlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4tMTxzZS5jYWxsKG4sZSkhPT1yfSk6Y2UuZmlsdGVyKG4sZSxyKX1jZS5maWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Y2UuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Y2UuZmluZC5tYXRjaGVzKGUsY2UuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sY2UuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhjZShlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoY2UuY29udGFpbnMoaVt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0KyspY2UuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9jZS51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhVCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmYi50ZXN0KGUpP2NlKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIGssUz0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhjZS5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8aywic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOlMuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgY2U/dFswXTp0LGNlLm1lcmdlKHRoaXMsY2UucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6QywhMCkpLHcudGVzdChyWzFdKSYmY2UuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KXYodGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1DLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp2KGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKGNlKTpjZS5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1jZS5mbixrPWNlKEMpO3ZhciBFPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLGo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gQShlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9Y2UuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoY2UuY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPSJzdHJpbmciIT10eXBlb2YgZSYmY2UoZSk7aWYoIWIudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP2NlLnVuaXF1ZVNvcnQobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9zZS5jYWxsKGNlKGUpLHRoaXNbMF0pOnNlLmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGNlLnVuaXF1ZVNvcnQoY2UubWVyZ2UodGhpcy5nZXQoKSxjZShlLHQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KSxjZS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBkKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gQShlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBBKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBkKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGQoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBoKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gaChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihmZShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLGNlLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24ocixpKXtjZS5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPWNlLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPWNlLmZpbHRlcih0LG4pKSwxPHRoaXMubGVuZ3RoJiYoaltyXXx8Y2UudW5pcXVlU29ydChuKSxFLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgRD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE4oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gcShlKXt0aHJvdyBlfWZ1bmN0aW9uIEwoZSx0LG4scil7dmFyIGk7dHJ5e2UmJnYoaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmdihpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fWNlLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxjZS5lYWNoKGUubWF0Y2goRCl8fFtdLGZ1bmN0aW9uKGUsdCl7blt0XT0hMH0pLG4pOmNlLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Y2UuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dih0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT14KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGNlLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoLTE8KG49Y2UuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPGNlLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LGNlLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIG89W1sibm90aWZ5IiwicHJvZ3Jlc3MiLGNlLkNhbGxiYWNrcygibWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixjZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixjZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksY2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLGk9InBlbmRpbmciLGE9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBzLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gYS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHM7cmV0dXJuIGNlLkRlZmVycmVkKGZ1bmN0aW9uKHIpe2NlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXYoaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnYoZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLHYodCk/cz90LmNhbGwoZSxsKHUsbyxOLHMpLGwodSxvLHEscykpOih1KyssdC5jYWxsKGUsbCh1LG8sTixzKSxsKHUsbyxxLHMpLGwodSxvLE4sby5ub3RpZnlXaXRoKSkpOihhIT09TiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Y2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmY2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuZXJyb3IpLHU8PWkrMSYmKGEhPT1xJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihjZS5EZWZlcnJlZC5nZXRFcnJvckhvb2s/dC5lcnJvcj1jZS5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTpjZS5EZWZlcnJlZC5nZXRTdGFja0hvb2smJih0LmVycm9yPWNlLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxpZS5zZXRUaW1lb3V0KHQpKX19cmV0dXJuIGNlLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLHYocik/cjpOLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLHYodCk/dDpOKSksb1syXVszXS5hZGQobCgwLGUsdihuKT9uOnEpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9jZS5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gY2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49dFsyXSxyPXRbNV07YVt0WzFdXT1uLmFkZCxyJiZuLmFkZChmdW5jdGlvbigpe2k9cn0sb1szLWVdWzJdLmRpc2FibGUsb1szLWVdWzNdLmRpc2FibGUsb1swXVsyXS5sb2NrLG9bMF1bM10ubG9jayksbi5hZGQodFszXS5maXJlKSxzW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIHNbdFswXSsiV2l0aCJdKHRoaXM9PT1zP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sc1t0WzBdKyJXaXRoIl09bi5maXJlV2l0aH0pLGEucHJvbWlzZShzKSxlJiZlLmNhbGwocyxzKSxzfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgsdD1uLHI9QXJyYXkodCksaT1hZS5jYWxsKGFyZ3VtZW50cyksbz1jZS5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9hZS5jYWxsKGFyZ3VtZW50cyk6ZSwtLW58fG8ucmVzb2x2ZVdpdGgocixpKX19O2lmKG48PTEmJihMKGUsby5kb25lKGEodCkpLnJlc29sdmUsby5yZWplY3QsIW4pLCJwZW5kaW5nIj09PW8uc3RhdGUoKXx8dihpW3RdJiZpW3RdLnRoZW4pKSlyZXR1cm4gby50aGVuKCk7d2hpbGUodC0tKUwoaVt0XSxhKHQpLG8ucmVqZWN0KTtyZXR1cm4gby5wcm9taXNlKCl9fSk7dmFyIEg9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Y2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe2llLmNvbnNvbGUmJmllLmNvbnNvbGUud2FybiYmZSYmSC50ZXN0KGUubmFtZSkmJmllLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sY2UucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7aWUuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX07dmFyIE89Y2UuRGVmZXJyZWQoKTtmdW5jdGlvbiBQKCl7Qy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixQKSxpZS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixQKSxjZS5yZWFkeSgpfWNlLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBPLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Y2UucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxjZS5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLWNlLnJlYWR5V2FpdDpjZS5pc1JlYWR5KXx8KGNlLmlzUmVhZHk9ITApIT09ZSYmMDwtLWNlLnJlYWR5V2FpdHx8Ty5yZXNvbHZlV2l0aChDLFtjZV0pfX0pLGNlLnJlYWR5LnRoZW49Ty50aGVuLCJjb21wbGV0ZSI9PT1DLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PUMucmVhZHlTdGF0ZSYmIUMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2llLnNldFRpbWVvdXQoY2UucmVhZHkpOihDLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFApLGllLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFApKTt2YXIgUj1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSlmb3IocyBpbiBpPSEwLG4pUihlLHQscyxuW3NdLCEwLG8sYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYoaT0hMCx2KHIpfHwoYT0hMCksbCYmKGE/KHQuY2FsbChlLHIpLHQ9bnVsbCk6KGw9dCx0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbC5jYWxsKGNlKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LE09L14tbXMtLyxJPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFcoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEYoZSl7cmV0dXJuIGUucmVwbGFjZShNLCJtcy0iKS5yZXBsYWNlKEksVyl9dmFyICQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBCKCl7dGhpcy5leHBhbmRvPWNlLmV4cGFuZG8rQi51aWQrK31CLnVpZD0xLEIucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LCQoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW0YodCldPW47ZWxzZSBmb3IociBpbiB0KWlbRihyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtGKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChGKToodD1GKHQpKWluIHI/W3RdOnQubWF0Y2goRCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxjZS5pc0VtcHR5T2JqZWN0KHIpKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgZVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT10JiYhY2UuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBfPW5ldyBCLFg9bmV3IEIsVT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLHo9L1tBLVpdL2c7ZnVuY3Rpb24gVihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKHosIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249InRydWUiPT09KGk9bil8fCJmYWxzZSIhPT1pJiYoIm51bGwiPT09aT9udWxsOmk9PT0raSsiIj8raTpVLnRlc3QoaSk/SlNPTi5wYXJzZShpKTppKX1jYXRjaChlKXt9WC5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Y2UuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBYLmhhc0RhdGEoZSl8fF8uaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFguYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1gucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gXy5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe18ucmVtb3ZlKGUsdCl9fSksY2UuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKG4sZSl7dmFyIHQscixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1uKXtpZih0aGlzLmxlbmd0aCYmKGk9WC5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFfLmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe3Q9YS5sZW5ndGg7d2hpbGUodC0tKWFbdF0mJjA9PT0ocj1hW3RdLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUYoci5zbGljZSg1KSksVihvLHIsaVtyXSkpO18uc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXtYLnNldCh0aGlzLG4pfSk6Uih0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PVguZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9VihvLG4pKT90OnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnNldCh0aGlzLG4sZSl9KX0sbnVsbCxlLDE8YXJndW1lbnRzLmxlbmd0aCxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7WC5yZW1vdmUodGhpcyxlKX0pfX0pLGNlLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1fLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPV8uYWNjZXNzKGUsdCxjZS5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Y2UucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89Y2UuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIF8uZ2V0KGUsbil8fF8uYWNjZXNzKGUsbix7ZW1wdHk6Y2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe18ucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLGNlLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/Y2UucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Y2UucXVldWUodGhpcyx0LG4pO2NlLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJmNlLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPWNlLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1fLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciBHPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFk9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK0crIikoW2EteiVdKikkIiwiaSIpLFE9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxKPUMuZG9jdW1lbnRFbGVtZW50LEs9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sWj17Y29tcG9zZWQ6ITB9O0ouZ2V0Um9vdE5vZGUmJihLPWZ1bmN0aW9uKGUpe3JldHVybiBjZS5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fGUuZ2V0Um9vdE5vZGUoWik9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgZWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmSyhlKSYmIm5vbmUiPT09Y2UuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gdGUoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBjZS5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwoY2UuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9ZS5ub2RlVHlwZSYmKGNlLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmWS5leGVjKGNlLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pY2Uuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixjZS5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciBuZT17fTtmdW5jdGlvbiByZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYobFtjXT1fLmdldChyLCJkaXNwbGF5Iil8fG51bGwsbFtjXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZlZShyKSYmKGxbY109KHU9YT1vPXZvaWQgMCxhPShpPXIpLm93bmVyRG9jdW1lbnQscz1pLm5vZGVOYW1lLCh1PW5lW3NdKXx8KG89YS5ib2R5LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudChzKSksdT1jZS5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSxuZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsXy5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1jZS5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcmUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gcmUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZWUodGhpcyk/Y2UodGhpcykuc2hvdygpOmNlKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciB4ZSxiZSx3ZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxUZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxDZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7eGU9Qy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGJlPUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHhlLmFwcGVuZENoaWxkKGJlKSxsZS5jaGVja0Nsb25lPXhlLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx4ZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGxlLm5vQ2xvbmVDaGVja2VkPSEheGUuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLHhlLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLGxlLm9wdGlvbj0hIXhlLmxhc3RDaGlsZDt2YXIga2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiBTZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmZmUoZSx0KT9jZS5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiBFZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylfLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Xy5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX1rZS50Ym9keT1rZS50Zm9vdD1rZS5jb2xncm91cD1rZS5jYXB0aW9uPWtlLnRoZWFkLGtlLnRoPWtlLnRkLGxlLm9wdGlvbnx8KGtlLm9wdGdyb3VwPWtlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgamU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24gQWUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpY2UubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKGplLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShUZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9a2Vbc118fGtlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rY2UuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDtjZS5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxjZS5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1LKG8pLGE9U2UoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmRWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKUNlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgRGU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWUoKXtyZXR1cm4hMX1mdW5jdGlvbiBMZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KUxlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPXFlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiBjZSgpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPWNlLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe2NlLmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9ZnVuY3Rpb24gSGUoZSxyLHQpe3Q/KF8uc2V0KGUsciwhMSksY2UuZXZlbnQuYWRkKGUscix7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj1fLmdldCh0aGlzLHIpO2lmKDEmZS5pc1RyaWdnZXImJnRoaXNbcl0pe2lmKG4pKGNlLmV2ZW50LnNwZWNpYWxbcl18fHt9KS5kZWxlZ2F0ZVR5cGUmJmUuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihuPWFlLmNhbGwoYXJndW1lbnRzKSxfLnNldCh0aGlzLHIsbiksdGhpc1tyXSgpLHQ9Xy5nZXQodGhpcyxyKSxfLnNldCh0aGlzLHIsITEpLG4hPT10KXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSx0fWVsc2UgbiYmKF8uc2V0KHRoaXMscixjZS5ldmVudC50cmlnZ2VyKG5bMF0sbi5zbGljZSgxKSx0aGlzKSksZS5zdG9wUHJvcGFnYXRpb24oKSxlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPU5lKX19KSk6dm9pZCAwPT09Xy5nZXQoZSxyKSYmY2UuZXZlbnQuYWRkKGUscixOZSl9Y2UuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9Xy5nZXQodCk7aWYoJCh0KSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmY2UuZmluZC5tYXRjaGVzU2VsZWN0b3IoSixpKSxuLmd1aWR8fChuLmd1aWQ9Y2UuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBjZSYmY2UuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP2NlLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goRCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPURlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9Y2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Y2UuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJmNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbigiLiIpfSxvKSwocD11W2RdKXx8KChwPXVbZF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsaCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsYyk6cC5wdXNoKGMpLGNlLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9Xy5oYXNEYXRhKGUpJiZfLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChEKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9RGUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxjZS5yZW1vdmVFdmVudChlLGQsdi5oYW5kbGUpLGRlbGV0ZSB1W2RdKX1lbHNlIGZvcihkIGluIHUpY2UuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7Y2UuaXNFbXB0eU9iamVjdCh1KSYmXy5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9Y2UuZXZlbnQuZml4KGUpLGw9KF8uZ2V0KHRoaXMsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPWNlLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Y2UuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoY2UuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmMTw9ZS5idXR0b24pKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxjZShpLHRoaXMpLmluZGV4KGwpOmNlLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2UuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDp2KGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiB3ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsImlucHV0IikmJkhlKHQsImNsaWNrIiwhMCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gd2UudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZmZSh0LCJpbnB1dCIpJiZIZSh0LCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldDtyZXR1cm4gd2UudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZmZSh0LCJpbnB1dCIpJiZfLmdldCh0LCJjbGljayIpfHxmZSh0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sY2UucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbil9LGNlLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgY2UuRXZlbnQpKXJldHVybiBuZXcgY2UuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1lLmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09ZS5yZXR1cm5WYWx1ZT9OZTpxZSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZjZS5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2NlLmV4cGFuZG9dPSEwfSxjZS5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmNlLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpxZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpxZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpxZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1OZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1OZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9TmUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGNlLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ITB9LGNlLmV2ZW50LmFkZFByb3ApLGNlLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHIsaSl7ZnVuY3Rpb24gbyhlKXtpZihDLmRvY3VtZW50TW9kZSl7dmFyIHQ9Xy5nZXQodGhpcywiaGFuZGxlIiksbj1jZS5ldmVudC5maXgoZSk7bi50eXBlPSJmb2N1c2luIj09PWUudHlwZT8iZm9jdXMiOiJibHVyIixuLmlzU2ltdWxhdGVkPSEwLHQoZSksbi50YXJnZXQ9PT1uLmN1cnJlbnRUYXJnZXQmJnQobil9ZWxzZSBjZS5ldmVudC5zaW11bGF0ZShpLGUudGFyZ2V0LGNlLmV2ZW50LmZpeChlKSl9Y2UuZXZlbnQuc3BlY2lhbFtyXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZTtpZihIZSh0aGlzLHIsITApLCFDLmRvY3VtZW50TW9kZSlyZXR1cm4hMTsoZT1fLmdldCh0aGlzLGkpKXx8dGhpcy5hZGRFdmVudExpc3RlbmVyKGksbyksXy5zZXQodGhpcyxpLChlfHwwKSsxKX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBIZSh0aGlzLHIpLCEwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlO2lmKCFDLmRvY3VtZW50TW9kZSlyZXR1cm4hMTsoZT1fLmdldCh0aGlzLGkpLTEpP18uc2V0KHRoaXMsaSxlKToodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGksbyksXy5yZW1vdmUodGhpcyxpKSl9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBfLmdldChlLnRhcmdldCxyKX0sZGVsZWdhdGVUeXBlOml9LGNlLmV2ZW50LnNwZWNpYWxbaV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9Qy5kb2N1bWVudE1vZGU/dGhpczplLG49Xy5nZXQodCxpKTtufHwoQy5kb2N1bWVudE1vZGU/dGhpcy5hZGRFdmVudExpc3RlbmVyKGksbyk6ZS5hZGRFdmVudExpc3RlbmVyKHIsbywhMCkpLF8uc2V0KHQsaSwobnx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9Qy5kb2N1bWVudE1vZGU/dGhpczplLG49Xy5nZXQodCxpKS0xO24/Xy5zZXQodCxpLG4pOihDLmRvY3VtZW50TW9kZT90aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSxvKTplLnJlbW92ZUV2ZW50TGlzdGVuZXIocixvLCEwKSxfLnJlbW92ZSh0LGkpKX19fSksY2UuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtjZS5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6aSxiaW5kVHlwZTppLGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgdCxuPWUucmVsYXRlZFRhcmdldCxyPWUuaGFuZGxlT2JqO3JldHVybiBuJiYobj09PXRoaXN8fGNlLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxjZS5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBMZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIExlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLGNlKGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT10JiYiZnVuY3Rpb24iIT10eXBlb2YgdHx8KG49dCx0PXZvaWQgMCksITE9PT1uJiYobj1xZSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE9lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLFBlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLFJlPS9eXHMqPCFcW0NEQVRBXFt8XF1cXT5ccyokL2c7ZnVuY3Rpb24gTWUoZSx0KXtyZXR1cm4gZmUoZSwidGFibGUiKSYmZmUoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZjZShlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBJZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIFdlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBGZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoXy5oYXNEYXRhKGUpJiYocz1fLmdldChlKS5ldmVudHMpKWZvcihpIGluIF8ucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKWNlLmV2ZW50LmFkZCh0LGksc1tpXVtuXSk7WC5oYXNEYXRhKGUpJiYobz1YLmFjY2VzcyhlKSxhPWNlLmV4dGVuZCh7fSxvKSxYLnNldCh0LGEpKX19ZnVuY3Rpb24gJGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD12KGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYhbGUuY2hlY2tDbG9uZSYmUGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLCRlKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9QWUocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPWNlLm1hcChTZShlLCJzY3JpcHQiKSxJZSkpLmxlbmd0aDtjPGY7YysrKXU9ZSxjIT09cCYmKHU9Y2UuY2xvbmUodSwhMCwhMCkscyYmY2UubWVyZ2UoYSxTZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsY2UubWFwKGEsV2UpLGM9MDtjPHM7YysrKXU9YVtjXSxDZS50ZXN0KHUudHlwZXx8IiIpJiYhXy5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZjZS5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Y2UuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZjZS5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9LGwpOm0odS50ZXh0Q29udGVudC5yZXBsYWNlKFJlLCIiKSx1LGwpKX1yZXR1cm4gbn1mdW5jdGlvbiBCZShlLHQsbil7Zm9yKHZhciByLGk9dD9jZS5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fGNlLmNsZWFuRGF0YShTZShyKSksci5wYXJlbnROb2RlJiYobiYmSyhyKSYmRWUoU2Uociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Y2UuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz1lLmNsb25lTm9kZSghMCksZj1LKGUpO2lmKCEobGUubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fGNlLmlzWE1MRG9jKGUpKSlmb3IoYT1TZShjKSxyPTAsaT0obz1TZShlKSkubGVuZ3RoO3I8aTtyKyspcz1vW3JdLHU9YVtyXSx2b2lkIDAsImlucHV0Ij09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJndlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOiJpbnB1dCIhPT1sJiYidGV4dGFyZWEiIT09bHx8KHUuZGVmYXVsdFZhbHVlPXMuZGVmYXVsdFZhbHVlKTtpZih0KWlmKG4pZm9yKG89b3x8U2UoZSksYT1hfHxTZShjKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKUZlKG9bcl0sYVtyXSk7ZWxzZSBGZShlLGMpO3JldHVybiAwPChhPVNlKGMsInNjcmlwdCIpKS5sZW5ndGgmJkVlKGEsIWYmJlNlKGUsInNjcmlwdCIpKSxjfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpPWNlLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZigkKG4pKXtpZih0PW5bXy5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9jZS5ldmVudC5yZW1vdmUobixyKTpjZS5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bXy5leHBhbmRvXT12b2lkIDB9bltYLmV4cGFuZG9dJiYobltYLmV4cGFuZG9dPXZvaWQgMCl9fX0pLGNlLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBCZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFIodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9jZS50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuICRlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxNZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PU1lKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKGNlLmNsZWFuRGF0YShTZShlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGNlLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiBSKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIU9lLnRlc3QoZSkmJiFrZVsoVGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Y2UuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihjZS5jbGVhbkRhdGEoU2UodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2NlLmluQXJyYXkodGhpcyxuKTwwJiYoY2UuY2xlYW5EYXRhKFNlKHRoaXMpKSx0JiZ0LnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sbil9fSksY2UuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsYSl7Y2UuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1jZShlKSxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXQ9bz09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxjZShyW29dKVthXSh0KSxzLmFwcGx5KG4sdC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4pfX0pO3ZhciBfZT1uZXcgUmVnRXhwKCJeKCIrRysiKSg/IXB4KVthLXolXSskIiwiaSIpLFhlPS9eLS0vLFVlPWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PWllKSx0LmdldENvbXB1dGVkU3R5bGUoZSl9LHplPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKGkgaW4gdClvW2ldPWUuc3R5bGVbaV0sZS5zdHlsZVtpXT10W2ldO2ZvcihpIGluIHI9bi5jYWxsKGUpLHQpZS5zdHlsZVtpXT1vW2ldO3JldHVybiByfSxWZT1uZXcgUmVnRXhwKFEuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gR2UoZSx0LG4pe3ZhciByLGksbyxhLHM9WGUudGVzdCh0KSx1PWUuc3R5bGU7cmV0dXJuKG49bnx8VWUoZSkpJiYoYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0scyYmYSYmKGE9YS5yZXBsYWNlKHZlLCIkMSIpfHx2b2lkIDApLCIiIT09YXx8SyhlKXx8KGE9Y2Uuc3R5bGUoZSx0KSksIWxlLnBpeGVsQm94U3R5bGVzKCkmJl9lLnRlc3QoYSkmJlZlLnRlc3QodCkmJihyPXUud2lkdGgsaT11Lm1pbldpZHRoLG89dS5tYXhXaWR0aCx1Lm1pbldpZHRoPXUubWF4V2lkdGg9dS53aWR0aD1hLGE9bi53aWR0aCx1LndpZHRoPXIsdS5taW5XaWR0aD1pLHUubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIFllKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLEouYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9aWUuZ2V0Q29tcHV0ZWRTdHlsZShsKTtuPSIxJSIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KGwub2Zmc2V0V2lkdGgvMyksSi5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9Qy5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUMuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsbGUuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLGNlLmV4dGVuZChsZSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUMuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUMuY3JlYXRlRWxlbWVudCgidHIiKSxuPUMuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZSIsdC5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MXB4IHNvbGlkIix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixuLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixKLmFwcGVuZENoaWxkKGUpLmFwcGVuZENoaWxkKHQpLmFwcGVuZENoaWxkKG4pLHI9aWUuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPXBhcnNlSW50KHIuaGVpZ2h0LDEwKStwYXJzZUludChyLmJvcmRlclRvcFdpZHRoLDEwKStwYXJzZUludChyLmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PXQub2Zmc2V0SGVpZ2h0LEoucmVtb3ZlQ2hpbGQoZSkpLGF9fSkpfSgpO3ZhciBRZT1bIldlYmtpdCIsIk1veiIsIm1zIl0sSmU9Qy5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxLZT17fTtmdW5jdGlvbiBaZShlKXt2YXIgdD1jZS5jc3NQcm9wc1tlXXx8S2VbZV07cmV0dXJuIHR8fChlIGluIEplP2U6S2VbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1RZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPVFlW25dK3QpaW4gSmUpcmV0dXJuIGV9KGUpfHxlKX12YXIgZXQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLHR0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxudD17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gcnQoZSx0LG4pe3ZhciByPVkuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6dH1mdW5jdGlvbiBpdChlLHQsbixyLGksbyl7dmFyIGE9IndpZHRoIj09PXQ/MTowLHM9MCx1PTAsbD0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYobCs9Y2UuY3NzKGUsbitRW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Y2UuY3NzKGUsInBhZGRpbmciK1FbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPWNlLmNzcyhlLCJib3JkZXIiK1FbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1jZS5jc3MoZSwicGFkZGluZyIrUVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPWNlLmNzcyhlLCJib3JkZXIiK1FbYV0rIldpZHRoIiwhMCxpKTpzKz1jZS5jc3MoZSwiYm9yZGVyIitRW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdStsfWZ1bmN0aW9uIG90KGUsdCxuKXt2YXIgcj1VZShlKSxpPSghbGUuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PWNlLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPUdlKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKF9lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybighbGUuYm94U2l6aW5nUmVsaWFibGUoKSYmaXx8IWxlLnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJmZlKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PWNlLmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihpPSJib3JkZXItYm94Ij09PWNlLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStpdChlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBhdChlLHQsbixyLGkpe3JldHVybiBuZXcgYXQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1jZS5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1HZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlU2xpY2U6ITAsY29sdW1uQ291bnQ6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCxzY2FsZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1GKHQpLHU9WGUudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9WmUocykpLGE9Y2UuY3NzSG9va3NbdF18fGNlLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT1ZLmV4ZWMobikpJiZpWzFdJiYobj10ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChjZS5jc3NOdW1iZXJbc10/IiI6InB4IikpLGxlLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Rih0KTtyZXR1cm4gWGUudGVzdCh0KXx8KHQ9WmUocykpLChhPWNlLmNzc0hvb2tzW3RdfHxjZS5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9R2UoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gbnQmJihpPW50W3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxjZS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHUpe2NlLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIWV0LnRlc3QoY2UuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/b3QoZSx1LG4pOnplKGUsdHQsZnVuY3Rpb24oKXtyZXR1cm4gb3QoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1VZShlKSxvPSFsZS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiYiYm9yZGVyLWJveCI9PT1jZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/aXQoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktaXQoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9WS5leGVjKHQpKSYmInB4IiE9PShyWzNdfHwicHgiKSYmKGUuc3R5bGVbdV09dCx0PWNlLmNzcyhlLHUpKSxydCgwLHQscyl9fX0pLGNlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9WWUobGUucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChHZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtemUoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLGNlLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe2NlLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krUVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihjZS5jc3NIb29rc1tpK29dLnNldD1ydCl9KSxjZS5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiBSKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9VWUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09Y2UuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9jZS5zdHlsZShlLHQsbik6Y2UuY3NzKGUsdCl9LGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfX0pLCgoY2UuVHdlZW49YXQpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YXQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Y2UuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoY2UuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1hdC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6YXQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49YXQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PWNlLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6YXQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPWF0LnByb3RvdHlwZSwoYXQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Y2UuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtjZS5meC5zdGVwW2UucHJvcF0/Y2UuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFjZS5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWmUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Y2Uuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9YXQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sY2UuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sY2UuZng9YXQucHJvdG90eXBlLmluaXQsY2UuZnguc3RlcD17fTt2YXIgc3QsdXQsbHQsY3QsZnQ9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHB0PS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZHQoKXt1dCYmKCExPT09Qy5oaWRkZW4mJmllLnJlcXVlc3RBbmltYXRpb25GcmFtZT9pZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZHQpOmllLnNldFRpbWVvdXQoZHQsY2UuZnguaW50ZXJ2YWwpLGNlLmZ4LnRpY2soKSl9ZnVuY3Rpb24gaHQoKXtyZXR1cm4gaWUuc2V0VGltZW91dChmdW5jdGlvbigpe3N0PXZvaWQgMH0pLHN0PURhdGUubm93KCl9ZnVuY3Rpb24gZ3QoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVsibWFyZ2luIisobj1RW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gdnQoZSx0LG4pe2Zvcih2YXIgcixpPSh5dC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdCh5dC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiB5dChvLGUsdCl7dmFyIG4sYSxyPTAsaT15dC5wcmVmaWx0ZXJzLmxlbmd0aCxzPWNlLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihhKXJldHVybiExO2Zvcih2YXIgZT1zdHx8aHQoKSx0PU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi1lKSxuPTEtKHQvbC5kdXJhdGlvbnx8MCkscj0wLGk9bC50d2VlbnMubGVuZ3RoO3I8aTtyKyspbC50d2VlbnNbcl0ucnVuKG4pO3JldHVybiBzLm5vdGlmeVdpdGgobyxbbCxuLHRdKSxuPDEmJmk/dDooaXx8cy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTpvLHByb3BzOmNlLmV4dGVuZCh7fSxlKSxvcHRzOmNlLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Y2UuZWFzaW5nLl9kZWZhdWx0fSx0KSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6dCxzdGFydFRpbWU6c3R8fGh0KCksZHVyYXRpb246dC5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSx0KXt2YXIgbj1jZS5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9RihuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1jZS5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3I8aTtyKyspaWYobj15dC5wcmVmaWx0ZXJzW3JdLmNhbGwobCxvLGMsbC5vcHRzKSlyZXR1cm4gdihuLnN0b3ApJiYoY2UuX3F1ZXVlSG9va3MobC5lbGVtLGwub3B0cy5xdWV1ZSkuc3RvcD1uLnN0b3AuYmluZChuKSksbjtyZXR1cm4gY2UubWFwKGMsdnQsbCksdihsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLGNlLmZ4LnRpbWVyKGNlLmV4dGVuZCh1LHtlbGVtOm8sYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsfWNlLkFuaW1hdGlvbj1jZS5leHRlbmQoeXQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiB0ZShuLmVsZW0sZSxZLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7dihlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChEKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0seXQudHdlZW5lcnNbbl09eXQudHdlZW5lcnNbbl18fFtdLHl0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZlZShlKSx2PV8uZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1jZS5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxjZS5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxmdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9ZFtyXT12JiZ2W3JdfHxjZS5zdHlsZShlLHIpfWlmKCh1PSFjZS5pc0VtcHR5T2JqZWN0KHQpKXx8IWNlLmlzRW1wdHlPYmplY3QoZCkpZm9yKHIgaW4gZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSxudWxsPT0obD12JiZ2LmRpc3BsYXkpJiYobD1fLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPWNlLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KHJlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1jZS5jc3MoZSwiZGlzcGxheSIpLHJlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT1jZS5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPSJub25lIj09PWM/IiI6YykpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGQpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1fLmFjY2VzcyhlLCJmeHNob3ciLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJnJlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8cmUoW2VdKSxfLnJlbW92ZShlLCJmeHNob3ciKSxkKWNlLnN0eWxlKGUscixkW3JdKX0pKSx1PXZ0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD95dC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6eXQucHJlZmlsdGVycy5wdXNoKGUpfX0pLGNlLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/Y2UuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8dihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhdih0KSYmdH07cmV0dXJuIGNlLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBjZS5meC5zcGVlZHM/ci5kdXJhdGlvbj1jZS5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1jZS5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmY2UuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxjZS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoZWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWNlLmlzRW1wdHlPYmplY3QodCksbz1jZS5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPXl0KHRoaXMsY2UuZXh0ZW5kKHt9LHQpLG8pOyhpfHxfLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGkmJihvPWUsZT1pLGk9dm9pZCAwKSxlJiZ0aGlzLnF1ZXVlKGl8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLHQ9bnVsbCE9aSYmaSsicXVldWVIb29rcyIsbj1jZS50aW1lcnMscj1fLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZwdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxjZS5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1fLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9Y2UudGltZXJzLG89bj9uLmxlbmd0aDowO2Zvcih0LmZpbmlzaD0hMCxjZS5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxjZS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPWNlLmZuW3JdO2NlLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ3QociwhMCksZSx0LG4pfX0pLGNlLmVhY2goe3NsaWRlRG93bjpndCgic2hvdyIpLHNsaWRlVXA6Z3QoImhpZGUiKSxzbGlkZVRvZ2dsZTpndCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe2NlLmZuW2VdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5hbmltYXRlKHIsZSx0LG4pfX0pLGNlLnRpbWVycz1bXSxjZS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49Y2UudGltZXJzO2ZvcihzdD1EYXRlLm5vdygpO3Q8bi5sZW5ndGg7dCsrKShlPW5bdF0pKCl8fG5bdF0hPT1lfHxuLnNwbGljZSh0LS0sMSk7bi5sZW5ndGh8fGNlLmZ4LnN0b3AoKSxzdD12b2lkIDB9LGNlLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2NlLnRpbWVycy5wdXNoKGUpLGNlLmZ4LnN0YXJ0KCl9LGNlLmZ4LmludGVydmFsPTEzLGNlLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7dXR8fCh1dD0hMCxkdCgpKX0sY2UuZnguc3RvcD1mdW5jdGlvbigpe3V0PW51bGx9LGNlLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxjZS5mbi5kZWxheT1mdW5jdGlvbihyLGUpe3JldHVybiByPWNlLmZ4JiZjZS5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPWllLnNldFRpbWVvdXQoZSxyKTt0LnN0b3A9ZnVuY3Rpb24oKXtpZS5jbGVhclRpbWVvdXQobil9fSl9LGx0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjdD1DLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGx0LnR5cGU9ImNoZWNrYm94IixsZS5jaGVja09uPSIiIT09bHQudmFsdWUsbGUub3B0U2VsZWN0ZWQ9Y3Quc2VsZWN0ZWQsKGx0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGx0LnR5cGU9InJhZGlvIixsZS5yYWRpb1ZhbHVlPSJ0Ij09PWx0LnZhbHVlO3ZhciBtdCx4dD1jZS5leHByLmF0dHJIYW5kbGU7Y2UuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFIodGhpcyxjZS5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxjZS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZT9jZS5wcm9wKGUsdCxuKTooMT09PW8mJmNlLmlzWE1MRG9jKGUpfHwoaT1jZS5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KGNlLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP210OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBjZS5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1jZS5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCFsZS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmZmUoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKEQpO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLG10PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9jZS5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0sY2UuZWFjaChjZS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT14dFt0XXx8Y2UuZmluZC5hdHRyO3h0W3RdPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89dC50b0xvd2VyQ2FzZSgpO3JldHVybiBufHwoaT14dFtvXSx4dFtvXT1yLHI9bnVsbCE9YShlLHQsbik/bzpudWxsLHh0W29dPWkpLHJ9fSk7dmFyIGJ0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksd3Q9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIFR0KGUpe3JldHVybihlLm1hdGNoKEQpfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIEN0KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIGt0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlJiZlLm1hdGNoKEQpfHxbXX1jZS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUih0aGlzLGNlLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2NlLnByb3BGaXhbZV18fGVdfSl9fSksY2UuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmY2UuaXNYTUxEb2MoZSl8fCh0PWNlLnByb3BGaXhbdF18fHQsaT1jZS5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWNlLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmJ0LnRlc3QoZS5ub2RlTmFtZSl8fHd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLGxlLm9wdFNlbGVjdGVkfHwoY2UucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxjZS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtjZS5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGNlLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhO3JldHVybiB2KHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLEN0KHRoaXMpKSl9KTooZT1rdCh0KSkubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHI9Q3QodGhpcyksbj0xPT09dGhpcy5ub2RlVHlwZSYmIiAiK1R0KHIpKyIgIil7Zm9yKG89MDtvPGUubGVuZ3RoO28rKylpPWVbb10sbi5pbmRleE9mKCIgIitpKyIgIik8MCYmKG4rPWkrIiAiKTthPVR0KG4pLHIhPT1hJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfX0pOnRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYTtyZXR1cm4gdih0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSxDdCh0aGlzKSkpfSk6YXJndW1lbnRzLmxlbmd0aD8oZT1rdCh0KSkubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHI9Q3QodGhpcyksbj0xPT09dGhpcy5ub2RlVHlwZSYmIiAiK1R0KHIpKyIgIil7Zm9yKG89MDtvPGUubGVuZ3RoO28rKyl7aT1lW29dO3doaWxlKC0xPG4uaW5kZXhPZigiICIraSsiICIpKW49bi5yZXBsYWNlKCIgIitpKyIgIiwiICIpfWE9VHQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9fSk6dGhpczp0aGlzLmF0dHIoImNsYXNzIiwiIil9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG8sYT10eXBlb2YgdCxzPSJzdHJpbmciPT09YXx8QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4gdih0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykudG9nZ2xlQ2xhc3ModC5jYWxsKHRoaXMsZSxDdCh0aGlzKSxuKSxuKX0pOiJib29sZWFuIj09dHlwZW9mIG4mJnM/bj90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6KGU9a3QodCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYocylmb3Iobz1jZSh0aGlzKSxpPTA7aTxlLmxlbmd0aDtpKyspcj1lW2ldLG8uaGFzQ2xhc3Mocik/by5yZW1vdmVDbGFzcyhyKTpvLmFkZENsYXNzKHIpO2Vsc2Ugdm9pZCAwIT09dCYmImJvb2xlYW4iIT09YXx8KChyPUN0KHRoaXMpKSYmXy5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsciksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIscnx8ITE9PT10PyIiOl8uZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pKX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJi0xPCgiICIrVHQoQ3QobikpKyIgIikuaW5kZXhPZih0KSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU3Q9L1xyL2c7Y2UuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT12KG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxjZSh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9Y2UubWFwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwocj1jZS52YWxIb29rc1t0aGlzLnR5cGVdfHxjZS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPWNlLnZhbEhvb2tzW3QudHlwZV18fGNlLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZShTdCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxjZS5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1jZS5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90OlR0KGNlLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhZmUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1jZShuKS52YWwoKSxhKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPWNlLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Y2UuaW5BcnJheShjZS52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksY2UuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2NlLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8Y2UuaW5BcnJheShjZShlKS52YWwoKSx0KX19LGxlLmNoZWNrT258fChjZS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pO3ZhciBFdD1pZS5sb2NhdGlvbixqdD17Z3VpZDpEYXRlLm5vdygpfSxBdD0vXD8vO2NlLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IGllLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7fXJldHVybiBuPXQmJnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF0sdCYmIW58fGNlLmVycm9yKCJJbnZhbGlkIFhNTDogIisobj9jZS5tYXAobi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkuam9pbigiXG4iKTplKSksdH07dmFyIER0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxOdD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTtjZS5leHRlbmQoY2UuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxDXSxkPXVlLmNhbGwoZSwidHlwZSIpP2UudHlwZTplLGg9dWUuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8QywzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFEdC50ZXN0KGQrY2UuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbY2UuZXhwYW5kb10/ZTpuZXcgY2UuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOmNlLm1ha2VBcnJheSh0LFtlXSksYz1jZS5ldmVudC5zcGVjaWFsW2RdfHx7fSxyfHwhYy50cmlnZ2VyfHwhMSE9PWMudHJpZ2dlci5hcHBseShuLHQpKSl7aWYoIXImJiFjLm5vQnViYmxlJiYheShuKSl7Zm9yKHM9Yy5kZWxlZ2F0ZVR5cGV8fGQsRHQudGVzdChzK2QpfHwobz1vLnBhcmVudE5vZGUpO287bz1vLnBhcmVudE5vZGUpcC5wdXNoKG8pLGE9bzthPT09KG4ub3duZXJEb2N1bWVudHx8QykmJnAucHVzaChhLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvd3x8aWUpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oXy5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJl8uZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiYkKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhJChuKXx8dSYmdihuW2RdKSYmIXkobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksY2UuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCxOdCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsTnQpLGNlLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWNlLmV4dGVuZChuZXcgY2UuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Y2UuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksY2UuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2NlLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBjZS5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KTt2YXIgcXQ9L1xbXF0kLyxMdD0vXHI/XG4vZyxIdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksT3Q9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFB0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpY2UuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8cXQudGVzdChuKT9pKG4sdCk6UHQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXgoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlQdChuKyJbIit0KyJdIixlW3RdLHIsaSl9Y2UucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj12KHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFjZS5pc1BsYWluT2JqZWN0KGUpKWNlLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKVB0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sY2UuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gY2UucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1jZS5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/Y2UubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWNlKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmT3QudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUh0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCF3ZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPWNlKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9jZS5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEx0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShMdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBSdD0vJTIwL2csTXQ9LyMuKiQvLEl0PS8oWz8mXSlfPVteJl0qLyxXdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZ0PS9eKD86R0VUfEhFQUQpJC8sJHQ9L15cL1wvLyxCdD17fSxfdD17fSxYdD0iKi8iLmNvbmNhdCgiKiIpLFV0PUMuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIHp0KG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSIqIik7dmFyIG4scj0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKEQpfHxbXTtpZih2KHQpKXdoaWxlKG49aVtyKytdKSIrIj09PW5bMF0/KG49bi5zbGljZSgxKXx8IioiLChvW25dPW9bbl18fFtdKS51bnNoaWZ0KHQpKToob1tuXT1vW25dfHxbXSkucHVzaCh0KX19ZnVuY3Rpb24gVnQodCxpLG8sYSl7dmFyIHM9e30sdT10PT09X3Q7ZnVuY3Rpb24gbChlKXt2YXIgcjtyZXR1cm4gc1tlXT0hMCxjZS5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gR3QoZSx0KXt2YXIgbixyLGk9Y2UuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmNlLmV4dGVuZCghMCxlLHIpLGV9VXQuaHJlZj1FdC5ocmVmLGNlLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6RXQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChFdC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpYdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Y2UucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0d0KEd0KGUsY2UuYWpheFNldHRpbmdzKSx0KTpHdChjZS5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6enQoQnQpLGFqYXhUcmFuc3BvcnQ6enQoX3QpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1jZS5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/Y2UoeSk6Y2UuZXZlbnQseD1jZS5EZWZlcnJlZCgpLGI9Y2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHc9di5zdGF0dXNDb2RlfHx7fSxhPXt9LHM9e30sdT0iY2FuY2VsZWQiLFQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihoKXtpZighbil7bj17fTt3aGlsZSh0PVd0LmV4ZWMocCkpblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdCh0WzJdKX10PW5bZS50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PXQ/bnVsbDp0LmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBoP3A6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1oJiYoZT1zW2UudG9Mb3dlckNhc2UoKV09c1tlLnRvTG93ZXJDYXNlKCldfHxlLGFbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09aCYmKHYubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGgpVC5hbHdheXMoZVtULnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl3W3RdPVt3W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx1O3JldHVybiBjJiZjLmFib3J0KHQpLGwoMCx0KSx0aGlzfX07aWYoeC5wcm9taXNlKFQpLHYudXJsPSgoZXx8di51cmx8fEV0LmhyZWYpKyIiKS5yZXBsYWNlKCR0LEV0LnByb3RvY29sKyIvLyIpLHYudHlwZT10Lm1ldGhvZHx8dC50eXBlfHx2Lm1ldGhvZHx8di50eXBlLHYuZGF0YVR5cGVzPSh2LmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRCl8fFsiIl0sbnVsbD09di5jcm9zc0RvbWFpbil7cj1DLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7ci5ocmVmPXYudXJsLHIuaHJlZj1yLmhyZWYsdi5jcm9zc0RvbWFpbj1VdC5wcm90b2NvbCsiLy8iK1V0Lmhvc3QhPXIucHJvdG9jb2wrIi8vIityLmhvc3R9Y2F0Y2goZSl7di5jcm9zc0RvbWFpbj0hMH19aWYodi5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHYuZGF0YSYmKHYuZGF0YT1jZS5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLFZ0KEJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Y2UuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Y2UuYWN0aXZlKysmJmNlLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IUZ0LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UoTXQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKFJ0LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oQXQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoSXQsIiQxIiksbz0oQXQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK2p0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKGNlLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsY2UubGFzdE1vZGlmaWVkW2ZdKSxjZS5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGNlLmV0YWdbZl0pKSwodi5kYXRhJiZ2Lmhhc0NvbnRlbnQmJiExIT09di5jb250ZW50VHlwZXx8dC5jb250ZW50VHlwZSkmJlQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsdi5kYXRhVHlwZXNbMF0mJnYuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0/di5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXSsoIioiIT09di5kYXRhVHlwZXNbMF0/IiwgIitYdCsiOyBxPTAuMDEiOiIiKTp2LmFjY2VwdHNbIioiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT0iYWJvcnQiLGIuYWRkKHYuY29tcGxldGUpLFQuZG9uZSh2LnN1Y2Nlc3MpLFQuZmFpbCh2LmVycm9yKSxjPVZ0KF90LHYsdCxUKSl7aWYoVC5yZWFkeVN0YXRlPTEsZyYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW1Qsdl0pLGgpcmV0dXJuIFQ7di5hc3luYyYmMDx2LnRpbWVvdXQmJihkPWllLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtULmFib3J0KCJ0aW1lb3V0Iil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIGwoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXQ7aHx8KGg9ITAsZCYmaWUuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxjZS5pbkFycmF5KCJzY3JpcHQiLHYuZGF0YVR5cGVzKSYmY2UuaW5BcnJheSgianNvbiIsdi5kYXRhVHlwZXMpPDAmJih2LmNvbnZlcnRlcnNbInRleHQgc2NyaXB0Il09ZnVuY3Rpb24oKXt9KSxzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19KHYscyxULGkpLGk/KHYuaWZNb2RpZmllZCYmKCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihjZS5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKGNlLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1jZS5hY3RpdmV8fGNlLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGNlLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY2UuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIpfX0pLGNlLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtjZVtpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdih0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLGNlLmFqYXgoY2UuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxjZS5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksY2UuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlLmhlYWRlcnMpImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCkmJihlLmNvbnRlbnRUeXBlPWUuaGVhZGVyc1t0XXx8IiIpfSksY2UuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjZS5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtjZS5nbG9iYWxFdmFsKGUsdCxuKX19KX0sY2UuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYodihlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PWNlKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gdihuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykud3JhcElubmVyKG4uY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWNlKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPXYodCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Y2UodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksY2UuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hY2UuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LGNlLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sY2UuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IGllLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBZdD17MDoyMDAsMTIyMzoyMDR9LFF0PWNlLmFqYXhTZXR0aW5ncy54aHIoKTtsZS5jb3JzPSEhUXQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gUXQsbGUuYWpheD1RdD0hIVF0LGNlLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oaSl7dmFyIG8sYTtpZihsZS5jb3JzfHxRdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChZdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmaWUuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLGNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLGNlLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gY2UuZ2xvYmFsRXZhbChlKSxlfX19KSxjZS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLGNlLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1jZSgiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksQy5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIEp0LEt0PVtdLFp0PS8oPSlcPyg/PSZ8JCl8XD9cPy87Y2UuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1LdC5wb3AoKXx8Y2UuZXhwYW5kbysiXyIranQuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksY2UuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFp0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmWnQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9dihlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFp0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShBdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8Y2UuZXJyb3IocisiIHdhcyBub3QgY2FsbGVkIiksb1swXX0sZS5kYXRhVHlwZXNbMF09Impzb24iLGk9aWVbcl0saWVbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP2NlKGllKS5yZW1vdmVQcm9wKHIpOmllW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssS3QucHVzaChyKSksbyYmdihpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSxsZS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChKdD1DLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PUp0LmNoaWxkTm9kZXMubGVuZ3RoKSxjZS5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwobGUuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1DLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1DLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUMpLG89IW4mJltdLChpPXcuZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9QWUoW2VdLHQsbyksbyYmby5sZW5ndGgmJmNlKG8pLnJlbW92ZSgpLGNlLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LGNlLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj1UdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksdih0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmY2UuYWpheCh7dXJsOmUsdHlwZTppfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTp0fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj9jZSgiPGRpdj4iKS5hcHBlbmQoY2UucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sY2UuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBjZS5ncmVwKGNlLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sY2Uub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsPWNlLmNzcyhlLCJwb3NpdGlvbiIpLGM9Y2UoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPWNlLmNzcyhlLCJ0b3AiKSx1PWNlLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLHYodCkmJih0PXQuY2FsbChlLG4sY2UuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpjLmNzcyhmKX19LGNlLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2Uub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1jZS5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Y2UuY3NzKGUsInBvc2l0aW9uIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9Y2UoZSkub2Zmc2V0KCkpLnRvcCs9Y2UuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz1jZS5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3AtY2UuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1jZS5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09Y2UuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8Sn0pfX0pLGNlLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxpKXt2YXIgbz0icGFnZVlPZmZzZXQiPT09aTtjZS5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gUih0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih5KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxjZS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7Y2UuY3NzSG9va3Nbbl09WWUobGUucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9R2UoZSxuKSxfZS50ZXN0KHQpP2NlKGUpLnBvc2l0aW9uKClbbl0rInB4Ijp0fSl9KSxjZS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxzKXtjZS5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe2NlLmZuW29dPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10PyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gUih0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4geShlKT8wPT09by5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIithXTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09ZS5ub2RlVHlwZT8ocj1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrYV0sclsic2Nyb2xsIithXSxlLmJvZHlbIm9mZnNldCIrYV0sclsib2Zmc2V0IithXSxyWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09bj9jZS5jc3MoZSx0LGkpOmNlLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxjZS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXtjZS5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLGNlLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLGNlLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSxuKXtjZS5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIGVuPS9eW1xzXHVGRUZGXHhBMF0rfChbXlxzXHVGRUZGXHhBMF0pW1xzXHVGRUZGXHhBMF0rJC9nO2NlLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSx2KGUpKXJldHVybiByPWFlLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChhZS5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8Y2UuZ3VpZCsrLGl9LGNlLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP2NlLnJlYWR5V2FpdCsrOmNlLnJlYWR5KCEwKX0sY2UuaXNBcnJheT1BcnJheS5pc0FycmF5LGNlLnBhcnNlSlNPTj1KU09OLnBhcnNlLGNlLm5vZGVOYW1lPWZlLGNlLmlzRnVuY3Rpb249dixjZS5pc1dpbmRvdz15LGNlLmNhbWVsQ2FzZT1GLGNlLnR5cGU9eCxjZS5ub3c9RGF0ZS5ub3csY2UuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PWNlLnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LGNlLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoZW4sIiQxIil9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBjZX0pO3ZhciB0bj1pZS5qUXVlcnksbm49aWUuJDtyZXR1cm4gY2Uubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gaWUuJD09PWNlJiYoaWUuJD1ubiksZSYmaWUualF1ZXJ5PT09Y2UmJihpZS5qUXVlcnk9dG4pLGNlfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihpZS5qUXVlcnk9aWUuJD1jZSksY2V9KTsK"},{"meta":{"name":"sweetalert2.all.min.js","url":"https://registry.npmmirror.com/sweetalert2/10.16.6/files/dist/sweetalert2.all.min.js","ts":1708420280829,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuU3dlZXRhbGVydDI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuKHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBhKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiBlJiZvKHQucHJvdG90eXBlLGUpLG4mJm8odCxuKSx0fWZ1bmN0aW9uIHUoKXtyZXR1cm4odT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbixvPWFyZ3VtZW50c1tlXTtmb3IobiBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLG4pJiYodFtuXT1vW25dKX1yZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuKGw9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGQoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4oaT1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlLG4pe3ZhciBvPVtudWxsXTtvLnB1c2guYXBwbHkobyxlKTtvPW5ldyhGdW5jdGlvbi5iaW5kLmFwcGx5KHQsbykpO3JldHVybiBuJiZsKG8sbi5wcm90b3R5cGUpLG99KS5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP2Z1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0odCk6ZX1mdW5jdGlvbiBmKHQsZSxuKXtyZXR1cm4oZj0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uKHQsZSxuKXt0PWZ1bmN0aW9uKHQsZSl7Zm9yKDshT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJm51bGwhPT0odD1jKHQpKTspO3JldHVybiB0fSh0LGUpO2lmKHQpe2U9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpO3JldHVybiBlLmdldD9lLmdldC5jYWxsKG4pOmUudmFsdWV9fSkodCxlLG58fHQpfWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1mdW5jdGlvbiBoKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KX1mdW5jdGlvbiBnKHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KX1mdW5jdGlvbiB2KHQsZSl7ZT0nIicuY29uY2F0KHQsJyIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFBsZWFzZSB1c2UgIicpLmNvbmNhdChlLCciIGluc3RlYWQuJyksLTE9PT1ZLmluZGV4T2YoZSkmJihZLnB1c2goZSksVyhlKSl9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9Qcm9taXNlfWZ1bmN0aW9uIHkodCl7cmV0dXJuIGIodCk/dC50b1Byb21pc2UoKTpQcm9taXNlLnJlc29sdmUodCl9ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdCYmUHJvbWlzZS5yZXNvbHZlKHQpPT09dH1mdW5jdGlvbiBDKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRWxlbWVudHx8Im9iamVjdCI9PT1yKHQ9dCkmJnQuanF1ZXJ5fWZ1bmN0aW9uIGsoKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5jb250YWluZXIpKX1mdW5jdGlvbiBlKHQpe3ZhciBlPWsoKTtyZXR1cm4gZT9lLnF1ZXJ5U2VsZWN0b3IodCk6bnVsbH1mdW5jdGlvbiB0KHQpe3JldHVybiBlKCIuIi5jb25jYXQodCkpfWZ1bmN0aW9uIEEoKXtyZXR1cm4gdCgkLnBvcHVwKX1mdW5jdGlvbiB4KCl7cmV0dXJuIHQoJC5pY29uKX1mdW5jdGlvbiBCKCl7cmV0dXJuIHQoJC50aXRsZSl9ZnVuY3Rpb24gUCgpe3JldHVybiB0KCQuY29udGVudCl9ZnVuY3Rpb24gTygpe3JldHVybiB0KCRbImh0bWwtY29udGFpbmVyIl0pfWZ1bmN0aW9uIEUoKXtyZXR1cm4gdCgkLmltYWdlKX1mdW5jdGlvbiBuKCl7cmV0dXJuIHQoJFsicHJvZ3Jlc3Mtc3RlcHMiXSl9ZnVuY3Rpb24gUygpe3JldHVybiB0KCRbInZhbGlkYXRpb24tbWVzc2FnZSJdKX1mdW5jdGlvbiBUKCl7cmV0dXJuIGUoIi4iLmNvbmNhdCgkLmFjdGlvbnMsIiAuIikuY29uY2F0KCQuY29uZmlybSkpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gZSgiLiIuY29uY2F0KCQuYWN0aW9ucywiIC4iKS5jb25jYXQoJC5kZW55KSl9ZnVuY3Rpb24gRCgpe3JldHVybiBlKCIuIi5jb25jYXQoJC5sb2FkZXIpKX1mdW5jdGlvbiBxKCl7cmV0dXJuIGUoIi4iLmNvbmNhdCgkLmFjdGlvbnMsIiAuIikuY29uY2F0KCQuY2FuY2VsKSl9ZnVuY3Rpb24gaigpe3JldHVybiB0KCQuYWN0aW9ucyl9ZnVuY3Rpb24gTSgpe3JldHVybiB0KCQuaGVhZGVyKX1mdW5jdGlvbiBJKCl7cmV0dXJuIHQoJC5mb290ZXIpfWZ1bmN0aW9uIEgoKXtyZXR1cm4gdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSl9ZnVuY3Rpb24gVigpe3JldHVybiB0KCQuY2xvc2UpfWZ1bmN0aW9uIFIoKXt2YXIgdD1nKEEoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Ii0xIl0pOm5vdChbdGFiaW5kZXg9IjAiXSknKSkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKSwoZT1wYXJzZUludChlLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkpPHQ/MTp0PGU/LTE6MH0pLGU9ZyhBKCkucXVlcnlTZWxlY3RvckFsbCgnXG4gIGFbaHJlZl0sXG4gIGFyZWFbaHJlZl0sXG4gIGlucHV0Om5vdChbZGlzYWJsZWRdKSxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxuICBidXR0b246bm90KFtkaXNhYmxlZF0pLFxuICBpZnJhbWUsXG4gIG9iamVjdCxcbiAgZW1iZWQsXG4gIFt0YWJpbmRleD0iMCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbicpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIi0xIiE9PXQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspLTE9PT1lLmluZGV4T2YodFtuXSkmJmUucHVzaCh0W25dKTtyZXR1cm4gZX0odC5jb25jYXQoZSkpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gd3QodCl9KX1mdW5jdGlvbiBOKCl7cmV0dXJuIUcoKSYmIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCRbIm5vLWJhY2tkcm9wIl0pfWZ1bmN0aW9uIFUoZSx0KXtlLnRleHRDb250ZW50PSIiLHQmJih0PShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC9odG1sIiksZyh0LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQodCl9KSxnKHQucXVlcnlTZWxlY3RvcigiYm9keSIpLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pKX1mdW5jdGlvbiBGKHQsZSl7aWYoZSl7Zm9yKHZhciBuPWUuc3BsaXQoL1xzKy8pLG89MDtvPG4ubGVuZ3RoO28rKylpZighdC5jbGFzc0xpc3QuY29udGFpbnMobltvXSkpcmV0dXJuO3JldHVybiAxfX1mdW5jdGlvbiBfKHQsZSxuKXt2YXIgbyxpO2lmKGk9ZSxnKChvPXQpLmNsYXNzTGlzdCkuZm9yRWFjaChmdW5jdGlvbih0KXstMT09PWgoJCkuaW5kZXhPZih0KSYmLTE9PT1oKFgpLmluZGV4T2YodCkmJi0xPT09aChpLnNob3dDbGFzcykuaW5kZXhPZih0KSYmby5jbGFzc0xpc3QucmVtb3ZlKHQpfSksZS5jdXN0b21DbGFzcyYmZS5jdXN0b21DbGFzc1tuXSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmN1c3RvbUNsYXNzW25dJiYhZS5jdXN0b21DbGFzc1tuXS5mb3JFYWNoKXJldHVybiBXKCJJbnZhbGlkIHR5cGUgb2YgY3VzdG9tQ2xhc3MuIi5jb25jYXQobiwnISBFeHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUgb2JqZWN0LCBnb3QgIicpLmNvbmNhdChyKGUuY3VzdG9tQ2xhc3Nbbl0pLCciJykpO3Z0KHQsZS5jdXN0b21DbGFzc1tuXSl9fXZhciB6PSJTd2VldEFsZXJ0MjoiLFc9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCIiLmNvbmNhdCh6LCIgIikuY29uY2F0KCJvYmplY3QiPT09cih0KT90LmpvaW4oIiAiKTp0KSl9LEs9ZnVuY3Rpb24odCl7Y29uc29sZS5lcnJvcigiIi5jb25jYXQoeiwiICIpLmNvbmNhdCh0KSl9LFk9W10sWj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90KCk6dH0sUT1PYmplY3QuZnJlZXplKHtjYW5jZWw6ImNhbmNlbCIsYmFja2Ryb3A6ImJhY2tkcm9wIixjbG9zZToiY2xvc2UiLGVzYzoiZXNjIix0aW1lcjoidGltZXIifSksSj1mdW5jdGlvbih0KXt2YXIgZSxuPXt9O2ZvcihlIGluIHQpblt0W2VdXT0ic3dhbDItIit0W2VdO3JldHVybiBufSwkPUooWyJjb250YWluZXIiLCJzaG93biIsImhlaWdodC1hdXRvIiwiaW9zZml4IiwicG9wdXAiLCJtb2RhbCIsIm5vLWJhY2tkcm9wIiwibm8tdHJhbnNpdGlvbiIsInRvYXN0IiwidG9hc3Qtc2hvd24iLCJzaG93IiwiaGlkZSIsImNsb3NlIiwidGl0bGUiLCJoZWFkZXIiLCJjb250ZW50IiwiaHRtbC1jb250YWluZXIiLCJhY3Rpb25zIiwiY29uZmlybSIsImRlbnkiLCJjYW5jZWwiLCJmb290ZXIiLCJpY29uIiwiaWNvbi1jb250ZW50IiwiaW1hZ2UiLCJpbnB1dCIsImZpbGUiLCJyYW5nZSIsInNlbGVjdCIsInJhZGlvIiwiY2hlY2tib3giLCJsYWJlbCIsInRleHRhcmVhIiwiaW5wdXRlcnJvciIsImlucHV0LWxhYmVsIiwidmFsaWRhdGlvbi1tZXNzYWdlIiwicHJvZ3Jlc3Mtc3RlcHMiLCJhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCIsInByb2dyZXNzLXN0ZXAiLCJwcm9ncmVzcy1zdGVwLWxpbmUiLCJsb2FkZXIiLCJsb2FkaW5nIiwic3R5bGVkIiwidG9wIiwidG9wLXN0YXJ0IiwidG9wLWVuZCIsInRvcC1sZWZ0IiwidG9wLXJpZ2h0IiwiY2VudGVyIiwiY2VudGVyLXN0YXJ0IiwiY2VudGVyLWVuZCIsImNlbnRlci1sZWZ0IiwiY2VudGVyLXJpZ2h0IiwiYm90dG9tIiwiYm90dG9tLXN0YXJ0IiwiYm90dG9tLWVuZCIsImJvdHRvbS1sZWZ0IiwiYm90dG9tLXJpZ2h0IiwiZ3Jvdy1yb3ciLCJncm93LWNvbHVtbiIsImdyb3ctZnVsbHNjcmVlbiIsInJ0bCIsInRpbWVyLXByb2dyZXNzLWJhciIsInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXIiLCJzY3JvbGxiYXItbWVhc3VyZSIsImljb24tc3VjY2VzcyIsImljb24td2FybmluZyIsImljb24taW5mbyIsImljb24tcXVlc3Rpb24iLCJpY29uLWVycm9yIl0pLFg9SihbInN1Y2Nlc3MiLCJ3YXJuaW5nIiwiaW5mbyIsInF1ZXN0aW9uIiwiZXJyb3IiXSksRz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygkWyJ0b2FzdC1zaG93biJdKX0sdHQ9e3ByZXZpb3VzQm9keVBhZGRpbmc6bnVsbH07ZnVuY3Rpb24gZXQodCxlKXtpZighZSlyZXR1cm4gbnVsbDtzd2l0Y2goZSl7Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmNhc2UiZmlsZSI6cmV0dXJuIHl0KHQsJFtlXSk7Y2FzZSJjaGVja2JveCI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KCQuY2hlY2tib3gsIiBpbnB1dCIpKTtjYXNlInJhZGlvIjpyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5yYWRpbywiIGlucHV0OmNoZWNrZWQiKSl8fHQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KCQucmFkaW8sIiBpbnB1dDpmaXJzdC1jaGlsZCIpKTtjYXNlInJhbmdlIjpyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoJC5yYW5nZSwiIGlucHV0IikpO2RlZmF1bHQ6cmV0dXJuIHl0KHQsJC5pbnB1dCl9fWZ1bmN0aW9uIG50KHQpe3ZhciBlO3QuZm9jdXMoKSwiZmlsZSIhPT10LnR5cGUmJihlPXQudmFsdWUsdC52YWx1ZT0iIix0LnZhbHVlPWUpfWZ1bmN0aW9uIG90KHQsZSxuKXt0JiZlJiYoZT0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOmUpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5mb3JFYWNoP3QuZm9yRWFjaChmdW5jdGlvbih0KXtuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTpuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KX1mdW5jdGlvbiBpdCh0LGUsbil7KG49bj09PSIiLmNvbmNhdChwYXJzZUludChuKSk/cGFyc2VJbnQobik6bil8fDA9PT1wYXJzZUludChuKT90LnN0eWxlW2VdPSJudW1iZXIiPT10eXBlb2Ygbj8iIi5jb25jYXQobiwicHgiKTpuOnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9ZnVuY3Rpb24gcnQodCl7dC5zdHlsZS5kaXNwbGF5PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiZmxleCJ9ZnVuY3Rpb24gYXQodCl7dC5zdHlsZS5kaXNwbGF5PSJub25lIn1mdW5jdGlvbiBzdCh0LGUsbixvKXsoZT10LnF1ZXJ5U2VsZWN0b3IoZSkpJiYoZS5zdHlsZVtuXT1vKX1mdW5jdGlvbiB1dCh0LGUsbil7ZT9ydCh0LG4pOmF0KHQpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiEhKHQuc2Nyb2xsSGVpZ2h0PnQuY2xpZW50SGVpZ2h0KX1mdW5jdGlvbiBsdCh0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KSx0PXBhcnNlRmxvYXQoZS5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tZHVyYXRpb24iKXx8IjAiKSxlPXBhcnNlRmxvYXQoZS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIil8fCIwIik7cmV0dXJuIDA8dHx8MDxlfWZ1bmN0aW9uIGR0KHQpe3ZhciBlPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbj1IKCk7d3QobikmJihlJiYobi5zdHlsZS50cmFuc2l0aW9uPSJub25lIixuLnN0eWxlLndpZHRoPSIxMDAlIiksc2V0VGltZW91dChmdW5jdGlvbigpe24uc3R5bGUudHJhbnNpdGlvbj0id2lkdGggIi5jb25jYXQodC8xZTMsInMgbGluZWFyIiksbi5zdHlsZS53aWR0aD0iMCUifSwxMCkpfWZ1bmN0aW9uIHB0KCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnR9ZnVuY3Rpb24gZnQodCl7TW4uaXNWaXNpYmxlKCkmJmd0IT09dC50YXJnZXQudmFsdWUmJk1uLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxndD10LnRhcmdldC52YWx1ZX1mdW5jdGlvbiBtdCh0LGUpe3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9lLmFwcGVuZENoaWxkKHQpOiJvYmplY3QiPT09cih0KT9BdCh0LGUpOnQmJlUoZSx0KX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPWooKSxvPUQoKSxpPVQoKSxyPUwoKSxhPXEoKTtlLnNob3dDb25maXJtQnV0dG9ufHxlLnNob3dEZW55QnV0dG9ufHxlLnNob3dDYW5jZWxCdXR0b258fGF0KG4pLF8obixlLCJhY3Rpb25zIiksUHQoaSwiY29uZmlybSIsZSksUHQociwiZGVueSIsZSksUHQoYSwiY2FuY2VsIixlKSxmdW5jdGlvbih0LGUsbixvKXtpZighby5idXR0b25zU3R5bGluZylyZXR1cm4gYnQoW3QsZSxuXSwkLnN0eWxlZCk7dnQoW3QsZSxuXSwkLnN0eWxlZCksby5jb25maXJtQnV0dG9uQ29sb3ImJih0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmNvbmZpcm1CdXR0b25Db2xvcik7by5kZW55QnV0dG9uQ29sb3ImJihlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLmRlbnlCdXR0b25Db2xvcik7by5jYW5jZWxCdXR0b25Db2xvciYmKG4uc3R5bGUuYmFja2dyb3VuZENvbG9yPW8uY2FuY2VsQnV0dG9uQ29sb3IpfShpLHIsYSxlKSxlLnJldmVyc2VCdXR0b25zJiYobi5pbnNlcnRCZWZvcmUoYSxvKSxuLmluc2VydEJlZm9yZShyLG8pLG4uaW5zZXJ0QmVmb3JlKGksbykpLFUobyxlLmxvYWRlckh0bWwpLF8obyxlLCJsb2FkZXIiKX12YXIgZ3QsdnQ9ZnVuY3Rpb24odCxlKXtvdCh0LGUsITApfSxidD1mdW5jdGlvbih0LGUpe290KHQsZSwhMSl9LHl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkTm9kZXMubGVuZ3RoO24rKylpZihGKHQuY2hpbGROb2Rlc1tuXSxlKSlyZXR1cm4gdC5jaGlsZE5vZGVzW25dfSx3dD1mdW5jdGlvbih0KXtyZXR1cm4hKCF0fHwhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSl9LEN0PSdcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT0iJy5jb25jYXQoJC50aXRsZSwnIiBhcmlhLWRlc2NyaWJlZGJ5PSInKS5jb25jYXQoJC5jb250ZW50LCciIGNsYXNzPSInKS5jb25jYXQoJC5wb3B1cCwnIiB0YWJpbmRleD0iLTEiPlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQuaGVhZGVyLCciPlxuICAgICA8dWwgY2xhc3M9IicpLmNvbmNhdCgkWyJwcm9ncmVzcy1zdGVwcyJdLCciPjwvdWw+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmljb24sJyI+PC9kaXY+XG4gICAgIDxpbWcgY2xhc3M9IicpLmNvbmNhdCgkLmltYWdlLCciIC8+XG4gICAgIDxoMiBjbGFzcz0iJykuY29uY2F0KCQudGl0bGUsJyIgaWQ9IicpLmNvbmNhdCgkLnRpdGxlLCciPjwvaDI+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KCQuY2xvc2UsJyI+PC9idXR0b24+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmNvbnRlbnQsJyI+XG4gICAgIDxkaXYgaWQ9IicpLmNvbmNhdCgkLmNvbnRlbnQsJyIgY2xhc3M9IicpLmNvbmNhdCgkWyJodG1sLWNvbnRhaW5lciJdLCciPjwvZGl2PlxuICAgICA8aW5wdXQgY2xhc3M9IicpLmNvbmNhdCgkLmlucHV0LCciIC8+XG4gICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBjbGFzcz0iJykuY29uY2F0KCQuZmlsZSwnIiAvPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoJC5yYW5nZSwnIj5cbiAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIC8+XG4gICAgICAgPG91dHB1dD48L291dHB1dD5cbiAgICAgPC9kaXY+XG4gICAgIDxzZWxlY3QgY2xhc3M9IicpLmNvbmNhdCgkLnNlbGVjdCwnIj48L3NlbGVjdD5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQucmFkaW8sJyI+PC9kaXY+XG4gICAgIDxsYWJlbCBmb3I9IicpLmNvbmNhdCgkLmNoZWNrYm94LCciIGNsYXNzPSInKS5jb25jYXQoJC5jaGVja2JveCwnIj5cbiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIC8+XG4gICAgICAgPHNwYW4gY2xhc3M9IicpLmNvbmNhdCgkLmxhYmVsLCciPjwvc3Bhbj5cbiAgICAgPC9sYWJlbD5cbiAgICAgPHRleHRhcmVhIGNsYXNzPSInKS5jb25jYXQoJC50ZXh0YXJlYSwnIj48L3RleHRhcmVhPlxuICAgICA8ZGl2IGNsYXNzPSInKS5jb25jYXQoJFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sJyIgaWQ9IicpLmNvbmNhdCgkWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSwnIj48L2Rpdj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQuYWN0aW9ucywnIj5cbiAgICAgPGRpdiBjbGFzcz0iJykuY29uY2F0KCQubG9hZGVyLCciPjwvZGl2PlxuICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicpLmNvbmNhdCgkLmNvbmZpcm0sJyI+PC9idXR0b24+XG4gICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJykuY29uY2F0KCQuZGVueSwnIj48L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInKS5jb25jYXQoJC5jYW5jZWwsJyI+PC9idXR0b24+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkLmZvb3RlciwnIj48L2Rpdj5cbiAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyIl0sJyI+XG4gICAgIDxkaXYgY2xhc3M9IicpLmNvbmNhdCgkWyJ0aW1lci1wcm9ncmVzcy1iYXIiXSwnIj48L2Rpdj5cbiAgIDwvZGl2PlxuIDwvZGl2PlxuJykucmVwbGFjZSgvKF58XG4pXHMqL2csIiIpLGt0PWZ1bmN0aW9uKHQpe3ZhciBlLG4sbyxpLHIsYT0hIShpPWsoKSkmJihpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSksYnQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbJFsibm8tYmFja2Ryb3AiXSwkWyJ0b2FzdC1zaG93biJdLCRbImhhcy1jb2x1bW4iXV0pLCEwKTtwdCgpP0soIlN3ZWV0QWxlcnQyIHJlcXVpcmVzIGRvY3VtZW50IHRvIGluaXRpYWxpemUiKTooKHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTmFtZT0kLmNvbnRhaW5lcixhJiZ2dChyLCRbIm5vLXRyYW5zaXRpb24iXSksVShyLEN0KSwoaT0ic3RyaW5nIj09dHlwZW9mKGU9dC50YXJnZXQpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6ZSkuYXBwZW5kQ2hpbGQociksYT10LChlPUEoKSkuc2V0QXR0cmlidXRlKCJyb2xlIixhLnRvYXN0PyJhbGVydCI6ImRpYWxvZyIpLGUuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLGEudG9hc3Q/InBvbGl0ZSI6ImFzc2VydGl2ZSIpLGEudG9hc3R8fGUuc2V0QXR0cmlidXRlKCJhcmlhLW1vZGFsIiwidHJ1ZSIpLHI9aSwicnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHIpLmRpcmVjdGlvbiYmdnQoaygpLCQucnRsKSx0PVAoKSxhPXl0KHQsJC5pbnB1dCksZT15dCh0LCQuZmlsZSksbj10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLnJhbmdlLCIgaW5wdXQiKSksbz10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLnJhbmdlLCIgb3V0cHV0IikpLGk9eXQodCwkLnNlbGVjdCkscj10LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdCgkLmNoZWNrYm94LCIgaW5wdXQiKSksdD15dCh0LCQudGV4dGFyZWEpLGEub25pbnB1dD1mdCxlLm9uY2hhbmdlPWZ0LGkub25jaGFuZ2U9ZnQsci5vbmNoYW5nZT1mdCx0Lm9uaW5wdXQ9ZnQsbi5vbmlucHV0PWZ1bmN0aW9uKHQpe2Z0KHQpLG8udmFsdWU9bi52YWx1ZX0sbi5vbmNoYW5nZT1mdW5jdGlvbih0KXtmdCh0KSxuLm5leHRTaWJsaW5nLnZhbHVlPW4udmFsdWV9KX0sQXQ9ZnVuY3Rpb24odCxlKXt0LmpxdWVyeT94dChlLHQpOlUoZSx0LnRvU3RyaW5nKCkpfSx4dD1mdW5jdGlvbih0LGUpe2lmKHQudGV4dENvbnRlbnQ9IiIsMCBpbiBlKWZvcih2YXIgbj0wO24gaW4gZTtuKyspdC5hcHBlbmRDaGlsZChlW25dLmNsb25lTm9kZSghMCkpO2Vsc2UgdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpfSxCdD1mdW5jdGlvbigpe2lmKHB0KCkpcmV0dXJuITE7dmFyIHQsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXtXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsT0FuaW1hdGlvbjoib0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kIixhbmltYXRpb246ImFuaW1hdGlvbmVuZCJ9O2Zvcih0IGluIG4paWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdCkmJnZvaWQgMCE9PWUuc3R5bGVbdF0pcmV0dXJuIG5bdF07cmV0dXJuITF9KCk7ZnVuY3Rpb24gUHQodCxlLG4pe3V0KHQsblsic2hvdyIuY29uY2F0KG0oZSksIkJ1dHRvbiIpXSwiaW5saW5lLWJsb2NrIiksVSh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvblRleHQiKV0pLHQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixuWyIiLmNvbmNhdChlLCJCdXR0b25BcmlhTGFiZWwiKV0pLHQuY2xhc3NOYW1lPSRbZV0sXyh0LG4sIiIuY29uY2F0KGUsIkJ1dHRvbiIpKSx2dCh0LG5bIiIuY29uY2F0KGUsIkJ1dHRvbkNsYXNzIildKX1mdW5jdGlvbiBPdCh0LGUpe3ZhciBuLG8saT1rKCk7aSYmKG89aSwic3RyaW5nIj09dHlwZW9mKG49ZS5iYWNrZHJvcCk/by5zdHlsZS5iYWNrZ3JvdW5kPW46bnx8dnQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSwkWyJuby1iYWNrZHJvcCJdKSwhZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmVygnImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpLG89aSwobj1lLnBvc2l0aW9uKWluICQ/dnQobywkW25dKTooVygnVGhlICJwb3NpdGlvbiIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiY2VudGVyIicpLHZ0KG8sJC5jZW50ZXIpKSxuPWksIShvPWUuZ3Jvdyl8fCJzdHJpbmciIT10eXBlb2Ygb3x8KG89Imdyb3ctIi5jb25jYXQobykpaW4gJCYmdnQobiwkW29dKSxfKGksZSwiY29udGFpbmVyIiksKGU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtc3dhbDItcXVldWUtc3RlcCIpKSYmKGkuc2V0QXR0cmlidXRlKCJkYXRhLXF1ZXVlLXN0ZXAiLGUpLGRvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAiKSkpfWZ1bmN0aW9uIEV0KHQsZSl7dC5wbGFjZWhvbGRlciYmIWUuaW5wdXRQbGFjZWhvbGRlcnx8KHQucGxhY2Vob2xkZXI9ZS5pbnB1dFBsYWNlaG9sZGVyKX1mdW5jdGlvbiBTdCh0LGUsbil7dmFyIG8saTtuLmlucHV0TGFiZWwmJih0LmlkPSQuaW5wdXQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLGk9JFsiaW5wdXQtbGFiZWwiXSxvLnNldEF0dHJpYnV0ZSgiZm9yIix0LmlkKSxvLmNsYXNzTmFtZT1pLHZ0KG8sbi5jdXN0b21DbGFzcy5pbnB1dExhYmVsKSxvLmlubmVyVGV4dD1uLmlucHV0TGFiZWwsZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWJlZ2luIixvKSl9dmFyIFR0PXtwcm9taXNlOm5ldyBXZWFrTWFwLGlubmVyUGFyYW1zOm5ldyBXZWFrTWFwLGRvbUNhY2hlOm5ldyBXZWFrTWFwfSxMdD1bImlucHV0IiwiZmlsZSIsInJhbmdlIiwic2VsZWN0IiwicmFkaW8iLCJjaGVja2JveCIsInRleHRhcmVhIl0sRHQ9ZnVuY3Rpb24odCl7aWYoIUl0W3QuaW5wdXRdKXJldHVybiBLKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXQhIEV4cGVjdGVkICJ0ZXh0IiwgImVtYWlsIiwgInBhc3N3b3JkIiwgIm51bWJlciIsICJ0ZWwiLCAic2VsZWN0IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInRleHRhcmVhIiwgImZpbGUiIG9yICJ1cmwiLCBnb3QgIicuY29uY2F0KHQuaW5wdXQsJyInKSk7dmFyIGU9TXQodC5pbnB1dCksbj1JdFt0LmlucHV0XShlLHQpO3J0KG4pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtudChuKX0pfSxxdD1mdW5jdGlvbih0LGUpe3ZhciBuPWV0KFAoKSx0KTtpZihuKWZvcih2YXIgbyBpbiFmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXt2YXIgbj10LmF0dHJpYnV0ZXNbZV0ubmFtZTstMT09PVsidHlwZSIsInZhbHVlIiwic3R5bGUiXS5pbmRleE9mKG4pJiZ0LnJlbW92ZUF0dHJpYnV0ZShuKX19KG4pLGUpInJhbmdlIj09PXQmJiJwbGFjZWhvbGRlciI9PT1vfHxuLnNldEF0dHJpYnV0ZShvLGVbb10pfSxqdD1mdW5jdGlvbih0KXt2YXIgZT1NdCh0LmlucHV0KTt0LmN1c3RvbUNsYXNzJiZ2dChlLHQuY3VzdG9tQ2xhc3MuaW5wdXQpfSxNdD1mdW5jdGlvbih0KXt0PSRbdF18fCQuaW5wdXQ7cmV0dXJuIHl0KFAoKSx0KX0sSXQ9e307SXQudGV4dD1JdC5lbWFpbD1JdC5wYXNzd29yZD1JdC5udW1iZXI9SXQudGVsPUl0LnVybD1mdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZS5pbnB1dFZhbHVlfHwibnVtYmVyIj09dHlwZW9mIGUuaW5wdXRWYWx1ZT90LnZhbHVlPWUuaW5wdXRWYWx1ZTp3KGUuaW5wdXRWYWx1ZSl8fFcoJ1VuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCAic3RyaW5nIiwgIm51bWJlciIgb3IgIlByb21pc2UiLCBnb3QgIicuY29uY2F0KHIoZS5pbnB1dFZhbHVlKSwnIicpKSxTdCh0LHQsZSksRXQodCxlKSx0LnR5cGU9ZS5pbnB1dCx0fSxJdC5maWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0KHQsdCxlKSxFdCh0LGUpLHR9LEl0LnJhbmdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLG89dC5xdWVyeVNlbGVjdG9yKCJvdXRwdXQiKTtyZXR1cm4gbi52YWx1ZT1lLmlucHV0VmFsdWUsbi50eXBlPWUuaW5wdXQsby52YWx1ZT1lLmlucHV0VmFsdWUsU3Qobix0LGUpLHR9LEl0LnNlbGVjdD1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiB0LnRleHRDb250ZW50PSIiLGUuaW5wdXRQbGFjZWhvbGRlciYmKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIiksVShuLGUuaW5wdXRQbGFjZWhvbGRlciksbi52YWx1ZT0iIixuLmRpc2FibGVkPSEwLG4uc2VsZWN0ZWQ9ITAsdC5hcHBlbmRDaGlsZChuKSksU3QodCx0LGUpLHR9LEl0LnJhZGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50PSIiLHR9LEl0LmNoZWNrYm94PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZXQoUCgpLCJjaGVja2JveCIpO24udmFsdWU9MSxuLmlkPSQuY2hlY2tib3gsbi5jaGVja2VkPUJvb2xlYW4oZS5pbnB1dFZhbHVlKTtuPXQucXVlcnlTZWxlY3Rvcigic3BhbiIpO3JldHVybiBVKG4sZS5pbnB1dFBsYWNlaG9sZGVyKSx0fSxJdC50ZXh0YXJlYT1mdW5jdGlvbihlLHQpe2UudmFsdWU9dC5pbnB1dFZhbHVlLEV0KGUsdCksU3QoZSxlLHQpO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLnBhZGRpbmdMZWZ0KStwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5wYWRkaW5nUmlnaHQpfXZhciBvO3JldHVybiJNdXRhdGlvbk9ic2VydmVyImluIHdpbmRvdyYmKG89cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoQSgpKS53aWR0aCksbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt2YXIgdD1lLm9mZnNldFdpZHRoK24oQSgpKStuKFAoKSk7QSgpLnN0eWxlLndpZHRoPW88dD8iIi5jb25jYXQodCwicHgiKTpudWxsfSkub2JzZXJ2ZShlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbInN0eWxlIl19KSksZX07ZnVuY3Rpb24gSHQodCxlKXt2YXIgbyxpLHIsbj1PKCk7XyhuLGUsImh0bWxDb250YWluZXIiKSxlLmh0bWw/KG10KGUuaHRtbCxuKSxydChuLCJibG9jayIpKTplLnRleHQ/KG4udGV4dENvbnRlbnQ9ZS50ZXh0LHJ0KG4sImJsb2NrIikpOmF0KG4pLHQ9dCxvPWUsaT1QKCksdD1UdC5pbm5lclBhcmFtcy5nZXQodCkscj0hdHx8by5pbnB1dCE9PXQuaW5wdXQsTHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT0kW3RdLG49eXQoaSxlKTtxdCh0LG8uaW5wdXRBdHRyaWJ1dGVzKSxuLmNsYXNzTmFtZT1lLHImJmF0KG4pfSksby5pbnB1dCYmKHImJkR0KG8pLGp0KG8pKSxfKFAoKSxlLCJjb250ZW50Iil9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gaygpJiZrKCkuZ2V0QXR0cmlidXRlKCJkYXRhLXF1ZXVlLXN0ZXAiKX1mdW5jdGlvbiBSdCh0LG8pe3ZhciBpPW4oKTtpZighby5wcm9ncmVzc1N0ZXBzfHwwPT09by5wcm9ncmVzc1N0ZXBzLmxlbmd0aClyZXR1cm4gYXQoaSksMDtydChpKSxpLnRleHRDb250ZW50PSIiO3ZhciByPXBhcnNlSW50KHZvaWQgMD09PW8uY3VycmVudFByb2dyZXNzU3RlcD9WdCgpOm8uY3VycmVudFByb2dyZXNzU3RlcCk7cj49by5wcm9ncmVzc1N0ZXBzLmxlbmd0aCYmVygiSW52YWxpZCBjdXJyZW50UHJvZ3Jlc3NTdGVwIHBhcmFtZXRlciwgaXQgc2hvdWxkIGJlIGxlc3MgdGhhbiBwcm9ncmVzc1N0ZXBzLmxlbmd0aCAoY3VycmVudFByb2dyZXNzU3RlcCBsaWtlIEpTIGFycmF5cyBzdGFydHMgZnJvbSAwKSIpLG8ucHJvZ3Jlc3NTdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG4sdD0obj10LHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSx2dCh0LCRbInByb2dyZXNzLXN0ZXAiXSksVSh0LG4pLHQpO2kuYXBwZW5kQ2hpbGQodCksZT09PXImJnZ0KHQsJFsiYWN0aXZlLXByb2dyZXNzLXN0ZXAiXSksZSE9PW8ucHJvZ3Jlc3NTdGVwcy5sZW5ndGgtMSYmKHQ9byxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksdnQoZSwkWyJwcm9ncmVzcy1zdGVwLWxpbmUiXSksdC5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UmJihlLnN0eWxlLndpZHRoPXQucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlKSxpLmFwcGVuZENoaWxkKGUpKX0pfWZ1bmN0aW9uIE50KHQsZSl7dmFyIG4sbz1NKCk7XyhvLGUsImhlYWRlciIpLFJ0KDAsZSksbj10LG89ZSx0PVR0LmlubmVyUGFyYW1zLmdldChuKSxuPXgoKSx0JiZvLmljb249PT10Lmljb24/KFd0KG4sbyksX3QobixvKSk6by5pY29ufHxvLmljb25IdG1sP28uaWNvbiYmLTE9PT1PYmplY3Qua2V5cyhYKS5pbmRleE9mKG8uaWNvbik/KEsoJ1Vua25vd24gaWNvbiEgRXhwZWN0ZWQgInN1Y2Nlc3MiLCAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiBvciAicXVlc3Rpb24iLCBnb3QgIicuY29uY2F0KG8uaWNvbiwnIicpKSxhdChuKSk6KHJ0KG4pLFd0KG4sbyksX3QobixvKSx2dChuLG8uc2hvd0NsYXNzLmljb24pKTphdChuKSxmdW5jdGlvbih0KXt2YXIgZT1FKCk7aWYoIXQuaW1hZ2VVcmwpcmV0dXJuIGF0KGUpO3J0KGUsIiIpLGUuc2V0QXR0cmlidXRlKCJzcmMiLHQuaW1hZ2VVcmwpLGUuc2V0QXR0cmlidXRlKCJhbHQiLHQuaW1hZ2VBbHQpLGl0KGUsIndpZHRoIix0LmltYWdlV2lkdGgpLGl0KGUsImhlaWdodCIsdC5pbWFnZUhlaWdodCksZS5jbGFzc05hbWU9JC5pbWFnZSxfKGUsdCwiaW1hZ2UiKX0oZSksbz1lLG49QigpLHV0KG4sby50aXRsZXx8by50aXRsZVRleHQsImJsb2NrIiksby50aXRsZSYmbXQoby50aXRsZSxuKSxvLnRpdGxlVGV4dCYmKG4uaW5uZXJUZXh0PW8udGl0bGVUZXh0KSxfKG4sbywidGl0bGUiKSxvPWUsZT1WKCksVShlLG8uY2xvc2VCdXR0b25IdG1sKSxfKGUsbywiY2xvc2VCdXR0b24iKSx1dChlLG8uc2hvd0Nsb3NlQnV0dG9uKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsby5jbG9zZUJ1dHRvbkFyaWFMYWJlbCl9ZnVuY3Rpb24gVXQodCxlKXt2YXIgbixvLGk7aT1lLG49aygpLG89QSgpLGkudG9hc3Q/KGl0KG4sIndpZHRoIixpLndpZHRoKSxvLnN0eWxlLndpZHRoPSIxMDAlIik6aXQobywid2lkdGgiLGkud2lkdGgpLGl0KG8sInBhZGRpbmciLGkucGFkZGluZyksaS5iYWNrZ3JvdW5kJiYoby5zdHlsZS5iYWNrZ3JvdW5kPWkuYmFja2dyb3VuZCksYXQoUygpKSxRdChvLGkpLE90KDAsZSksTnQodCxlKSxIdCh0LGUpLGh0KDAsZSksaT1lLHQ9SSgpLHV0KHQsaS5mb290ZXIpLGkuZm9vdGVyJiZtdChpLmZvb3Rlcix0KSxfKHQsaSwiZm9vdGVyIiksImZ1bmN0aW9uIj09dHlwZW9mIGUuZGlkUmVuZGVyP2UuZGlkUmVuZGVyKEEoKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUub25SZW5kZXImJmUub25SZW5kZXIoQSgpKX1mdW5jdGlvbiBGdCgpe3JldHVybiBUKCkmJlQoKS5jbGljaygpfXZhciBfdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBYKWUuaWNvbiE9PW4mJmJ0KHQsWFtuXSk7dnQodCxYW2UuaWNvbl0pLEt0KHQsZSksenQoKSxfKHQsZSwiaWNvbiIpfSx6dD1mdW5jdGlvbigpe2Zvcih2YXIgdD1BKCksZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIiksbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIltjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXSwgLnN3YWwyLXN1Y2Nlc3MtZml4Iiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uc3R5bGUuYmFja2dyb3VuZENvbG9yPWV9LFd0PWZ1bmN0aW9uKHQsZSl7dC50ZXh0Q29udGVudD0iIixlLmljb25IdG1sP1UodCxZdChlLmljb25IdG1sKSk6InN1Y2Nlc3MiPT09ZS5pY29uP1UodCwnXG4gICAgICA8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLXRpcCI+PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1saW5lLWxvbmciPjwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+IDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodCI+PC9kaXY+XG4gICAgJyk6ImVycm9yIj09PWUuaWNvbj9VKHQsJ1xuICAgICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1sZWZ0Ij48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzd2FsMi14LW1hcmstbGluZS1yaWdodCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICcpOlUodCxZdCh7cXVlc3Rpb246Ij8iLHdhcm5pbmc6IiEiLGluZm86ImkifVtlLmljb25dKSl9LEt0PWZ1bmN0aW9uKHQsZSl7aWYoZS5pY29uQ29sb3Ipe3Quc3R5bGUuY29sb3I9ZS5pY29uQ29sb3IsdC5zdHlsZS5ib3JkZXJDb2xvcj1lLmljb25Db2xvcjtmb3IodmFyIG49MCxvPVsiLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAiLCIuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmciLCIuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCIsIi5zd2FsMi14LW1hcmstbGluZS1yaWdodCJdO248by5sZW5ndGg7bisrKXN0KHQsb1tuXSwiYmFja2dyb3VuZENvbG9yIixlLmljb25Db2xvcik7c3QodCwiLnN3YWwyLXN1Y2Nlc3MtcmluZyIsImJvcmRlckNvbG9yIixlLmljb25Db2xvcil9fSxZdD1mdW5jdGlvbih0KXtyZXR1cm4nPGRpdiBjbGFzcz0iJy5jb25jYXQoJFsiaWNvbi1jb250ZW50Il0sJyI+JykuY29uY2F0KHQsIjwvZGl2PiIpfSxadD1bXSxRdD1mdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lPSIiLmNvbmNhdCgkLnBvcHVwLCIgIikuY29uY2F0KHd0KHQpP2Uuc2hvd0NsYXNzLnBvcHVwOiIiKSxlLnRvYXN0Pyh2dChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLCRbInRvYXN0LXNob3duIl0pLHZ0KHQsJC50b2FzdCkpOnZ0KHQsJC5tb2RhbCksXyh0LGUsInBvcHVwIiksInN0cmluZyI9PXR5cGVvZiBlLmN1c3RvbUNsYXNzJiZ2dCh0LGUuY3VzdG9tQ2xhc3MpLGUuaWNvbiYmdnQodCwkWyJpY29uLSIuY29uY2F0KGUuaWNvbildKX07ZnVuY3Rpb24gSnQodCl7KGU9QSgpKXx8TW4uZmlyZSgpO3ZhciBlPUEoKSxuPWooKSxvPUQoKTshdCYmd3QoVCgpKSYmKHQ9VCgpKSxydChuKSx0JiYoYXQodCksby5zZXRBdHRyaWJ1dGUoImRhdGEtYnV0dG9uLXRvLXJlcGxhY2UiLHQuY2xhc3NOYW1lKSksby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvLHQpLHZ0KFtlLG5dLCQubG9hZGluZykscnQobyksZS5zZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGluZyIsITApLGUuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCEwKSxlLmZvY3VzKCl9ZnVuY3Rpb24gJHQobyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe2lmKCFvKXJldHVybiB0KCk7dmFyIGU9d2luZG93LnNjcm9sbFgsbj13aW5kb3cuc2Nyb2xsWTt0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQmJnRlLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cz8odGUucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCksdGUucHJldmlvdXNBY3RpdmVFbGVtZW50PW51bGwpOmRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuZm9jdXMoKSx0KCl9LDEwMCksdm9pZCAwIT09ZSYmdm9pZCAwIT09biYmd2luZG93LnNjcm9sbFRvKGUsbil9KX1mdW5jdGlvbiBYdCgpe2lmKHRlLnRpbWVvdXQpcmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9SCgpLGU9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2lkdGgpO3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSx0LnN0eWxlLndpZHRoPSIxMDAlIjt2YXIgbj1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCksbj1wYXJzZUludChlL24qMTAwKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIiksdC5zdHlsZS53aWR0aD0iIi5jb25jYXQobiwiJSIpfSgpLHRlLnRpbWVvdXQuc3RvcCgpfWZ1bmN0aW9uIEd0KCl7aWYodGUudGltZW91dCl7dmFyIHQ9dGUudGltZW91dC5zdGFydCgpO3JldHVybiBkdCh0KSx0fX12YXIgdGU9e30sZWU9ITEsbmU9e307ZnVuY3Rpb24gb2UodCl7Zm9yKHZhciBlPXQudGFyZ2V0O2UmJmUhPT1kb2N1bWVudDtlPWUucGFyZW50Tm9kZSlmb3IodmFyIG4gaW4gbmUpe3ZhciBvPWUuZ2V0QXR0cmlidXRlKG4pO2lmKG8pcmV0dXJuIHZvaWQgbmVbbl0uZmlyZSh7dGVtcGxhdGU6b30pfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlLHQpfWZ1bmN0aW9uIHJlKHQpe3JldHVybiBjZVt0XX1mdW5jdGlvbiBhZSh0KXtmb3IodmFyIGUgaW4gdClpZShuPWUpfHxXKCdVbmtub3duIHBhcmFtZXRlciAiJy5jb25jYXQobiwnIicpKSx0LnRvYXN0JiYobj1lLC0xIT09bGUuaW5kZXhPZihuKSYmVygnVGhlIHBhcmFtZXRlciAiJy5jb25jYXQobiwnIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHMnKSkpLHJlKGU9ZSkmJnYoZSxyZShlKSk7dmFyIG59dmFyIHNlPXt0aXRsZToiIix0aXRsZVRleHQ6IiIsdGV4dDoiIixodG1sOiIiLGZvb3RlcjoiIixpY29uOnZvaWQgMCxpY29uQ29sb3I6dm9pZCAwLGljb25IdG1sOnZvaWQgMCx0ZW1wbGF0ZTp2b2lkIDAsdG9hc3Q6ITEsYW5pbWF0aW9uOiEwLHNob3dDbGFzczp7cG9wdXA6InN3YWwyLXNob3ciLGJhY2tkcm9wOiJzd2FsMi1iYWNrZHJvcC1zaG93IixpY29uOiJzd2FsMi1pY29uLXNob3cifSxoaWRlQ2xhc3M6e3BvcHVwOiJzd2FsMi1oaWRlIixiYWNrZHJvcDoic3dhbDItYmFja2Ryb3AtaGlkZSIsaWNvbjoic3dhbDItaWNvbi1oaWRlIn0sY3VzdG9tQ2xhc3M6e30sdGFyZ2V0OiJib2R5IixiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dEZW55QnV0dG9uOiExLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAscHJlRGVueTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6Ik9LIixjb25maXJtQnV0dG9uQXJpYUxhYmVsOiIiLGNvbmZpcm1CdXR0b25Db2xvcjp2b2lkIDAsZGVueUJ1dHRvblRleHQ6Ik5vIixkZW55QnV0dG9uQXJpYUxhYmVsOiIiLGRlbnlCdXR0b25Db2xvcjp2b2lkIDAsY2FuY2VsQnV0dG9uVGV4dDoiQ2FuY2VsIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6IiIsY2FuY2VsQnV0dG9uQ29sb3I6dm9pZCAwLGJ1dHRvbnNTdHlsaW5nOiEwLHJldmVyc2VCdXR0b25zOiExLGZvY3VzQ29uZmlybTohMCxmb2N1c0Rlbnk6ITEsZm9jdXNDYW5jZWw6ITEscmV0dXJuRm9jdXM6ITAsc2hvd0Nsb3NlQnV0dG9uOiExLGNsb3NlQnV0dG9uSHRtbDoiJnRpbWVzOyIsY2xvc2VCdXR0b25BcmlhTGFiZWw6IkNsb3NlIHRoaXMgZGlhbG9nIixsb2FkZXJIdG1sOiIiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsc2hvd0xvYWRlck9uRGVueTohMSxpbWFnZVVybDp2b2lkIDAsaW1hZ2VXaWR0aDp2b2lkIDAsaW1hZ2VIZWlnaHQ6dm9pZCAwLGltYWdlQWx0OiIiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjoiIixpbnB1dExhYmVsOiIiLGlucHV0VmFsdWU6IiIsaW5wdXRPcHRpb25zOnt9LGlucHV0QXV0b1RyaW06ITAsaW5wdXRBdHRyaWJ1dGVzOnt9LGlucHV0VmFsaWRhdG9yOnZvaWQgMCxyZXR1cm5JbnB1dFZhbHVlT25EZW55OiExLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOiJjZW50ZXIiLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDp2b2lkIDAscHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOnZvaWQgMCxvbkJlZm9yZU9wZW46dm9pZCAwLG9uT3Blbjp2b2lkIDAsd2lsbE9wZW46dm9pZCAwLGRpZE9wZW46dm9pZCAwLG9uUmVuZGVyOnZvaWQgMCxkaWRSZW5kZXI6dm9pZCAwLG9uQ2xvc2U6dm9pZCAwLG9uQWZ0ZXJDbG9zZTp2b2lkIDAsd2lsbENsb3NlOnZvaWQgMCxkaWRDbG9zZTp2b2lkIDAsb25EZXN0cm95OnZvaWQgMCxkaWREZXN0cm95OnZvaWQgMCxzY3JvbGxiYXJQYWRkaW5nOiEwfSx1ZT1bImFsbG93RXNjYXBlS2V5IiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYnV0dG9uc1N0eWxpbmciLCJjYW5jZWxCdXR0b25BcmlhTGFiZWwiLCJjYW5jZWxCdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvblRleHQiLCJjbG9zZUJ1dHRvbkFyaWFMYWJlbCIsImNsb3NlQnV0dG9uSHRtbCIsImNvbmZpcm1CdXR0b25BcmlhTGFiZWwiLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsImN1cnJlbnRQcm9ncmVzc1N0ZXAiLCJjdXN0b21DbGFzcyIsImRlbnlCdXR0b25BcmlhTGFiZWwiLCJkZW55QnV0dG9uQ29sb3IiLCJkZW55QnV0dG9uVGV4dCIsImRpZENsb3NlIiwiZGlkRGVzdHJveSIsImZvb3RlciIsImhpZGVDbGFzcyIsImh0bWwiLCJpY29uIiwiaWNvbkNvbG9yIiwiaWNvbkh0bWwiLCJpbWFnZUFsdCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VVcmwiLCJpbWFnZVdpZHRoIiwib25BZnRlckNsb3NlIiwib25DbG9zZSIsIm9uRGVzdHJveSIsInByb2dyZXNzU3RlcHMiLCJyZXR1cm5Gb2N1cyIsInJldmVyc2VCdXR0b25zIiwic2hvd0NhbmNlbEJ1dHRvbiIsInNob3dDbG9zZUJ1dHRvbiIsInNob3dDb25maXJtQnV0dG9uIiwic2hvd0RlbnlCdXR0b24iLCJ0ZXh0IiwidGl0bGUiLCJ0aXRsZVRleHQiLCJ3aWxsQ2xvc2UiXSxjZT17YW5pbWF0aW9uOidzaG93Q2xhc3MiIGFuZCAiaGlkZUNsYXNzJyxvbkJlZm9yZU9wZW46IndpbGxPcGVuIixvbk9wZW46ImRpZE9wZW4iLG9uUmVuZGVyOiJkaWRSZW5kZXIiLG9uQ2xvc2U6IndpbGxDbG9zZSIsb25BZnRlckNsb3NlOiJkaWRDbG9zZSIsb25EZXN0cm95OiJkaWREZXN0cm95In0sbGU9WyJhbGxvd091dHNpZGVDbGljayIsImFsbG93RW50ZXJLZXkiLCJiYWNrZHJvcCIsImZvY3VzQ29uZmlybSIsImZvY3VzRGVueSIsImZvY3VzQ2FuY2VsIiwicmV0dXJuRm9jdXMiLCJoZWlnaHRBdXRvIiwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSJdLGRlPU9iamVjdC5mcmVlemUoe2lzVmFsaWRQYXJhbWV0ZXI6aWUsaXNVcGRhdGFibGVQYXJhbWV0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuLTEhPT11ZS5pbmRleE9mKHQpfSxpc0RlcHJlY2F0ZWRQYXJhbWV0ZXI6cmUsYXJnc1RvUGFyYW1zOmZ1bmN0aW9uKG4pe3ZhciBvPXt9O3JldHVybiJvYmplY3QiIT09cihuWzBdKXx8QyhuWzBdKT9bInRpdGxlIiwiaHRtbCIsImljb24iXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZT1uW2VdOyJzdHJpbmciPT10eXBlb2YgZXx8QyhlKT9vW3RdPWU6dm9pZCAwIT09ZSYmSygiVW5leHBlY3RlZCB0eXBlIG9mICIuY29uY2F0KHQsJyEgRXhwZWN0ZWQgInN0cmluZyIgb3IgIkVsZW1lbnQiLCBnb3QgJykuY29uY2F0KHIoZSkpKX0pOnUobyxuWzBdKSxvfSxpc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gd3QoQSgpKX0sY2xpY2tDb25maXJtOkZ0LGNsaWNrRGVueTpmdW5jdGlvbigpe3JldHVybiBMKCkmJkwoKS5jbGljaygpfSxjbGlja0NhbmNlbDpmdW5jdGlvbigpe3JldHVybiBxKCkmJnEoKS5jbGljaygpfSxnZXRDb250YWluZXI6ayxnZXRQb3B1cDpBLGdldFRpdGxlOkIsZ2V0Q29udGVudDpQLGdldEh0bWxDb250YWluZXI6TyxnZXRJbWFnZTpFLGdldEljb246eCxnZXRJbnB1dExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHQoJFsiaW5wdXQtbGFiZWwiXSl9LGdldENsb3NlQnV0dG9uOlYsZ2V0QWN0aW9uczpqLGdldENvbmZpcm1CdXR0b246VCxnZXREZW55QnV0dG9uOkwsZ2V0Q2FuY2VsQnV0dG9uOnEsZ2V0TG9hZGVyOkQsZ2V0SGVhZGVyOk0sZ2V0Rm9vdGVyOkksZ2V0VGltZXJQcm9ncmVzc0JhcjpILGdldEZvY3VzYWJsZUVsZW1lbnRzOlIsZ2V0VmFsaWRhdGlvbk1lc3NhZ2U6Uyxpc0xvYWRpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gQSgpLmhhc0F0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIil9LGZpcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gaSh0aGlzLGUpfSxtaXhpbjpmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmwodCxlKX0oaSx0KTt2YXIgbixvLGU9KG49aSxvPWQoKSxmdW5jdGlvbigpe3ZhciB0LGU9YyhuKTtyZXR1cm4gcCh0aGlzLG8/KHQ9Yyh0aGlzKS5jb25zdHJ1Y3RvcixSZWZsZWN0LmNvbnN0cnVjdChlLGFyZ3VtZW50cyx0KSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSk7ZnVuY3Rpb24gaSgpe3JldHVybiBhKHRoaXMsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHMoaSxbe2tleToiX21haW4iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYoYyhpLnByb3RvdHlwZSksIl9tYWluIix0aGlzKS5jYWxsKHRoaXMsdCx1KHt9LHIsZSkpfX1dKSxpfSh0aGlzKX0scXVldWU6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztadD10O2Z1bmN0aW9uIGEodCxlKXtadD1bXSx0KGUpfXZhciBzPVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpKXshZnVuY3Rpb24gZShuLG8pe248WnQubGVuZ3RoPyhkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgiZGF0YS1zd2FsMi1xdWV1ZS1zdGVwIixuKSxyLmZpcmUoWnRbbl0pLnRoZW4oZnVuY3Rpb24odCl7dm9pZCAwIT09dC52YWx1ZT8ocy5wdXNoKHQudmFsdWUpLGUobisxLG8pKTphKGkse2Rpc21pc3M6dC5kaXNtaXNzfSl9KSk6YShpLHt2YWx1ZTpzfSl9KDApfSl9LGdldFF1ZXVlU3RlcDpWdCxpbnNlcnRRdWV1ZVN0ZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSYmZTxadC5sZW5ndGg/WnQuc3BsaWNlKGUsMCx0KTpadC5wdXNoKHQpfSxkZWxldGVRdWV1ZVN0ZXA6ZnVuY3Rpb24odCl7dm9pZCAwIT09WnRbdF0mJlp0LnNwbGljZSh0LDEpfSxzaG93TG9hZGluZzpKdCxlbmFibGVMb2FkaW5nOkp0LGdldFRpbWVyTGVmdDpmdW5jdGlvbigpe3JldHVybiB0ZS50aW1lb3V0JiZ0ZS50aW1lb3V0LmdldFRpbWVyTGVmdCgpfSxzdG9wVGltZXI6WHQscmVzdW1lVGltZXI6R3QsdG9nZ2xlVGltZXI6ZnVuY3Rpb24oKXt2YXIgdD10ZS50aW1lb3V0O3JldHVybiB0JiYodC5ydW5uaW5nP1h0Okd0KSgpfSxpbmNyZWFzZVRpbWVyOmZ1bmN0aW9uKHQpe2lmKHRlLnRpbWVvdXQpe3Q9dGUudGltZW91dC5pbmNyZWFzZSh0KTtyZXR1cm4gZHQodCwhMCksdH19LGlzVGltZXJSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRlLnRpbWVvdXQmJnRlLnRpbWVvdXQuaXNSdW5uaW5nKCl9LGJpbmRDbGlja0hhbmRsZXI6ZnVuY3Rpb24oKXtuZVswPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ImRhdGEtc3dhbC10ZW1wbGF0ZSJdPXRoaXMsZWV8fChkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvZSksZWU9ITApfX0pO2Z1bmN0aW9uIHBlKCl7dmFyIHQsZTtUdC5pbm5lclBhcmFtcy5nZXQodGhpcykmJih0PVR0LmRvbUNhY2hlLmdldCh0aGlzKSxhdCh0LmxvYWRlciksKGU9dC5wb3B1cC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQubG9hZGVyLmdldEF0dHJpYnV0ZSgiZGF0YS1idXR0b24tdG8tcmVwbGFjZSIpKSkubGVuZ3RoP3J0KGVbMF0sImlubGluZS1ibG9jayIpOnd0KFQoKSl8fHd0KEwoKSl8fHd0KHEoKSl8fGF0KHQuYWN0aW9ucyksYnQoW3QucG9wdXAsdC5hY3Rpb25zXSwkLmxvYWRpbmcpLHQucG9wdXAucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWJ1c3kiKSx0LnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1sb2FkaW5nIiksdC5jb25maXJtQnV0dG9uLmRpc2FibGVkPSExLHQuZGVueUJ1dHRvbi5kaXNhYmxlZD0hMSx0LmNhbmNlbEJ1dHRvbi5kaXNhYmxlZD0hMSl9ZnVuY3Rpb24gZmUoKXtudWxsPT09dHQucHJldmlvdXNCb2R5UGFkZGluZyYmZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0JiYodHQucHJldmlvdXNCb2R5UGFkZGluZz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IikpLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiLmNvbmNhdCh0dC5wcmV2aW91c0JvZHlQYWRkaW5nK2Z1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc05hbWU9JFsic2Nyb2xsYmFyLW1lYXN1cmUiXSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfSgpLCJweCIpKX1mdW5jdGlvbiBtZSgpe3JldHVybiEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0JiYhIWRvY3VtZW50LmRvY3VtZW50TW9kZX1mdW5jdGlvbiBoZSgpe3ZhciB0PWsoKSxlPUEoKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJhbGlnbi1pdGVtcyIpLGUub2Zmc2V0VG9wPDAmJih0LnN0eWxlLmFsaWduSXRlbXM9ImZsZXgtc3RhcnQiKX12YXIgZ2U9ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oQ3JpT1N8RnhpT1N8RWRnaU9TfFlhQnJvd3NlcnxVQ0Jyb3dzZXIpL2kpfHxBKCkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodC00NCYmKGsoKS5zdHlsZS5wYWRkaW5nQm90dG9tPSIiLmNvbmNhdCg0NCwicHgiKSl9LHZlPWZ1bmN0aW9uKCl7dmFyIGUsdD1rKCk7dC5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24odCl7ZT1iZSh0KX0sdC5vbnRvdWNobW92ZT1mdW5jdGlvbih0KXtlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfX0sYmU9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQsbj1rKCk7cmV0dXJuIXllKHQpJiYhd2UodCkmJihlPT09bnx8IShjdChuKXx8IklOUFVUIj09PWUudGFnTmFtZXx8Y3QoUCgpKSYmUCgpLmNvbnRhaW5zKGUpKSl9LHllPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGgmJiJzdHlsdXMiPT09dC50b3VjaGVzWzBdLnRvdWNoVHlwZX0sd2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG91Y2hlcyYmMTx0LnRvdWNoZXMubGVuZ3RofSxDZT17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwfTtmdW5jdGlvbiBrZSh0LGUsbixvKXtHKCk/RWUodCxvKTooJHQobikudGhlbihmdW5jdGlvbigpe3JldHVybiBFZSh0LG8pfSksdGUua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0ZS5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTp0ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksdGUua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksZS5wYXJlbnROb2RlJiYhZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtc3dhbDItcXVldWUtc3RlcCIpJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksTigpJiYobnVsbCE9PXR0LnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIi5jb25jYXQodHQucHJldmlvdXNCb2R5UGFkZGluZywicHgiKSx0dC5wcmV2aW91c0JvZHlQYWRkaW5nPW51bGwpLEYoZG9jdW1lbnQuYm9keSwkLmlvc2ZpeCkmJihlPXBhcnNlSW50KGRvY3VtZW50LmJvZHkuc3R5bGUudG9wLDEwKSxidChkb2N1bWVudC5ib2R5LCQuaW9zZml4KSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0tMSplKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmbWUoKSYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsaGUpLGcoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0Lmhhc0F0dHJpYnV0ZSgiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbiIpPyh0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuIikpOnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSkpLGJ0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWyQuc2hvd24sJFsiaGVpZ2h0LWF1dG8iXSwkWyJuby1iYWNrZHJvcCJdLCRbInRvYXN0LXNob3duIl1dKX1mdW5jdGlvbiBBZSh0KXt2YXIgZSxuLG8saT1BKCk7aSYmKHQ9eGUodCksKGU9VHQuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpKSYmIUYoaSxlLmhpZGVDbGFzcy5wb3B1cCkmJihuPUNlLnN3YWxQcm9taXNlUmVzb2x2ZS5nZXQodGhpcyksYnQoaSxlLnNob3dDbGFzcy5wb3B1cCksdnQoaSxlLmhpZGVDbGFzcy5wb3B1cCksbz1rKCksYnQobyxlLnNob3dDbGFzcy5iYWNrZHJvcCksdnQobyxlLmhpZGVDbGFzcy5iYWNrZHJvcCksQmUodGhpcyxpLGUpLG4odCkpKX1mdW5jdGlvbiB4ZSh0KXtyZXR1cm4gdm9pZCAwPT09dD97aXNDb25maXJtZWQ6ITEsaXNEZW5pZWQ6ITEsaXNEaXNtaXNzZWQ6ITB9OnUoe2lzQ29uZmlybWVkOiExLGlzRGVuaWVkOiExLGlzRGlzbWlzc2VkOiExfSx0KX1mdW5jdGlvbiBCZSh0LGUsbil7dmFyIG89aygpLGk9QnQmJmx0KGUpLHI9bi5vbkNsb3NlLGE9bi5vbkFmdGVyQ2xvc2Uscz1uLndpbGxDbG9zZSx1PW4uZGlkQ2xvc2U7UGUoZSxzLHIpLGk/T2UodCxlLG8sbi5yZXR1cm5Gb2N1cyx1fHxhKTprZSh0LG8sbi5yZXR1cm5Gb2N1cyx1fHxhKX12YXIgUGU9ZnVuY3Rpb24odCxlLG4pe251bGwhPT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgZT9lKHQpOm51bGwhPT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0KX0sT2U9ZnVuY3Rpb24odCxlLG4sbyxpKXt0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2s9a2UuYmluZChudWxsLHQsbixvLGkpLGUuYWRkRXZlbnRMaXN0ZW5lcihCdCxmdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJih0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKX0pfSxFZT1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgpLHQuX2Rlc3Ryb3koKX0pfTtmdW5jdGlvbiBTZSh0LGUsbil7dmFyIG89VHQuZG9tQ2FjaGUuZ2V0KHQpO2UuZm9yRWFjaChmdW5jdGlvbih0KXtvW3RdLmRpc2FibGVkPW59KX1mdW5jdGlvbiBUZSh0LGUpe2lmKCF0KXJldHVybiExO2lmKCJyYWRpbyI9PT10LnR5cGUpZm9yKHZhciBuPXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Iiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uZGlzYWJsZWQ9ZTtlbHNlIHQuZGlzYWJsZWQ9ZX12YXIgTGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSl7YSh0aGlzLG4pLHRoaXMuY2FsbGJhY2s9dCx0aGlzLnJlbWFpbmluZz1lLHRoaXMucnVubmluZz0hMSx0aGlzLnN0YXJ0KCl9cmV0dXJuIHMobixbe2tleToic3RhcnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz0hMCx0aGlzLnN0YXJ0ZWQ9bmV3IERhdGUsdGhpcy5pZD1zZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssdGhpcy5yZW1haW5pbmcpKSx0aGlzLnJlbWFpbmluZ319LHtrZXk6InN0b3AiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMucnVubmluZz0hMSxjbGVhclRpbWVvdXQodGhpcy5pZCksdGhpcy5yZW1haW5pbmctPW5ldyBEYXRlLXRoaXMuc3RhcnRlZCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpbmNyZWFzZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ydW5uaW5nO3JldHVybiBlJiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9dCxlJiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJnZXRUaW1lckxlZnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZyYmKHRoaXMuc3RvcCgpLHRoaXMuc3RhcnQoKSksdGhpcy5yZW1haW5pbmd9fSx7a2V5OiJpc1J1bm5pbmciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnVubmluZ319XSksbn0oKSxEZT17ZW1haWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4vXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcLlthLXpBLVowLTktXXsyLDI0fSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIGVtYWlsIGFkZHJlc3MiKX0sdXJsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuL15odHRwcz86XC9cLyh3d3dcLik/Wy1hLXpBLVowLTlAOiUuXyt+Iz1dezEsMjU2fVwuW2Etel17Miw2M31cYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fCJJbnZhbGlkIFVSTCIpfX07ZnVuY3Rpb24gcWUodCl7dmFyIGUsbjsoZT10KS5pbnB1dFZhbGlkYXRvcnx8T2JqZWN0LmtleXMoRGUpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5pbnB1dD09PXQmJihlLmlucHV0VmFsaWRhdG9yPURlW3RdKX0pLHQuc2hvd0xvYWRlck9uQ29uZmlybSYmIXQucHJlQ29uZmlybSYmVygic2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXG5zaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XG5odHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0IiksdC5hbmltYXRpb249Wih0LmFuaW1hdGlvbiksKG49dCkudGFyZ2V0JiYoInN0cmluZyIhPXR5cGVvZiBuLnRhcmdldHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuLnRhcmdldCkpJiYoInN0cmluZyI9PXR5cGVvZiBuLnRhcmdldHx8bi50YXJnZXQuYXBwZW5kQ2hpbGQpfHwoVygnVGFyZ2V0IHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImJvZHkiJyksbi50YXJnZXQ9ImJvZHkiKSwic3RyaW5nIj09dHlwZW9mIHQudGl0bGUmJih0LnRpdGxlPXQudGl0bGUuc3BsaXQoIlxuIikuam9pbigiPGJyIC8+IikpLGt0KHQpfWZ1bmN0aW9uIGplKHQpe3ZhciBlPWsoKSxuPUEoKTsiZnVuY3Rpb24iPT10eXBlb2YgdC53aWxsT3Blbj90LndpbGxPcGVuKG4pOiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uQmVmb3JlT3BlbiYmdC5vbkJlZm9yZU9wZW4obik7dmFyIG89d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkub3ZlcmZsb3dZO0plKGUsbix0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WmUoZSxuKX0sMTApLE4oKSYmKFFlKGUsdC5zY3JvbGxiYXJQYWRkaW5nLG8pLGcoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09aygpfHxmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnRhaW5zKXJldHVybiB0LmNvbnRhaW5zKGUpfSh0LGsoKSl8fCh0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSYmdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4iLHQuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIikpfSkpLEcoKXx8dGUucHJldmlvdXNBY3RpdmVFbGVtZW50fHwodGUucHJldmlvdXNBY3RpdmVFbGVtZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFllKG4sdCksYnQoZSwkWyJuby10cmFuc2l0aW9uIl0pfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPUEoKTt0LnRhcmdldD09PWUmJih0PWsoKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoQnQsTWUpLHQuc3R5bGUub3ZlcmZsb3dZPSJhdXRvIil9ZnVuY3Rpb24gSWUodCxlKXt0LmNsb3NlUG9wdXAoe2lzQ29uZmlybWVkOiEwLHZhbHVlOmV9KX1mdW5jdGlvbiBIZSh0LGUsbil7dmFyIG89UigpO2lmKG8ubGVuZ3RoKXJldHVybihlKz1uKT09PW8ubGVuZ3RoP2U9MDotMT09PWUmJihlPW8ubGVuZ3RoLTEpLG9bZV0uZm9jdXMoKTtBKCkuZm9jdXMoKX12YXIgVmU9WyJzd2FsLXRpdGxlIiwic3dhbC1odG1sIiwic3dhbC1mb290ZXIiXSxSZT1mdW5jdGlvbih0KXt2YXIgbj17fTtyZXR1cm4gZyh0LnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtcGFyYW0iKSkuZm9yRWFjaChmdW5jdGlvbih0KXtLZSh0LFsibmFtZSIsInZhbHVlIl0pO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJuYW1lIiksdD10LmdldEF0dHJpYnV0ZSgidmFsdWUiKTsiYm9vbGVhbiI9PXR5cGVvZiBzZVtlXSYmImZhbHNlIj09PXQmJih0PSExKSwib2JqZWN0Ij09PXIoc2VbZV0pJiYodD1KU09OLnBhcnNlKHQpKSxuW2VdPXR9KSxufSxOZT1mdW5jdGlvbih0KXt2YXIgbj17fTtyZXR1cm4gZyh0LnF1ZXJ5U2VsZWN0b3JBbGwoInN3YWwtYnV0dG9uIikpLmZvckVhY2goZnVuY3Rpb24odCl7S2UodCxbInR5cGUiLCJjb2xvciIsImFyaWEtbGFiZWwiXSk7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInR5cGUiKTtuWyIiLmNvbmNhdChlLCJCdXR0b25UZXh0IildPXQuaW5uZXJIVE1MLG5bInNob3ciLmNvbmNhdChtKGUpLCJCdXR0b24iKV09ITAsdC5oYXNBdHRyaWJ1dGUoImNvbG9yIikmJihuWyIiLmNvbmNhdChlLCJCdXR0b25Db2xvciIpXT10LmdldEF0dHJpYnV0ZSgiY29sb3IiKSksdC5oYXNBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKSYmKG5bIiIuY29uY2F0KGUsIkJ1dHRvbkFyaWFMYWJlbCIpXT10LmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpKX0pLG59LFVlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9LHQ9dC5xdWVyeVNlbGVjdG9yKCJzd2FsLWltYWdlIik7cmV0dXJuIHQmJihLZSh0LFsic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJhbHQiXSksdC5oYXNBdHRyaWJ1dGUoInNyYyIpJiYoZS5pbWFnZVVybD10LmdldEF0dHJpYnV0ZSgic3JjIikpLHQuaGFzQXR0cmlidXRlKCJ3aWR0aCIpJiYoZS5pbWFnZVdpZHRoPXQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpKSx0Lmhhc0F0dHJpYnV0ZSgiaGVpZ2h0IikmJihlLmltYWdlSGVpZ2h0PXQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSksdC5oYXNBdHRyaWJ1dGUoImFsdCIpJiYoZS5pbWFnZUFsdD10LmdldEF0dHJpYnV0ZSgiYWx0IikpKSxlfSxGZT1mdW5jdGlvbih0KXt2YXIgZT17fSx0PXQucXVlcnlTZWxlY3Rvcigic3dhbC1pY29uIik7cmV0dXJuIHQmJihLZSh0LFsidHlwZSIsImNvbG9yIl0pLHQuaGFzQXR0cmlidXRlKCJ0eXBlIikmJihlLmljb249dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSksdC5oYXNBdHRyaWJ1dGUoImNvbG9yIikmJihlLmljb25Db2xvcj10LmdldEF0dHJpYnV0ZSgiY29sb3IiKSksZS5pY29uSHRtbD10LmlubmVySFRNTCksZX0sX2U9ZnVuY3Rpb24odCl7dmFyIG49e30sZT10LnF1ZXJ5U2VsZWN0b3IoInN3YWwtaW5wdXQiKTtlJiYoS2UoZSxbInR5cGUiLCJsYWJlbCIsInBsYWNlaG9sZGVyIiwidmFsdWUiXSksbi5pbnB1dD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpfHwidGV4dCIsZS5oYXNBdHRyaWJ1dGUoImxhYmVsIikmJihuLmlucHV0TGFiZWw9ZS5nZXRBdHRyaWJ1dGUoImxhYmVsIikpLGUuaGFzQXR0cmlidXRlKCJwbGFjZWhvbGRlciIpJiYobi5pbnB1dFBsYWNlaG9sZGVyPWUuZ2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIpKSxlLmhhc0F0dHJpYnV0ZSgidmFsdWUiKSYmKG4uaW5wdXRWYWx1ZT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKSkpO3Q9dC5xdWVyeVNlbGVjdG9yQWxsKCJzd2FsLWlucHV0LW9wdGlvbiIpO3JldHVybiB0Lmxlbmd0aCYmKG4uaW5wdXRPcHRpb25zPXt9LGcodCkuZm9yRWFjaChmdW5jdGlvbih0KXtLZSh0LFsidmFsdWUiXSk7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInZhbHVlIiksdD10LmlubmVySFRNTDtuLmlucHV0T3B0aW9uc1tlXT10fSkpLG59LHplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz17fTtmb3IobiBpbiBlKXt2YXIgaT1lW25dLHI9dC5xdWVyeVNlbGVjdG9yKGkpO3ImJihLZShyLFtdKSxvW2kucmVwbGFjZSgvXnN3YWwtLywiIildPXIuaW5uZXJIVE1MLnRyaW0oKSl9cmV0dXJuIG99LFdlPWZ1bmN0aW9uKGUpe3ZhciBuPVZlLmNvbmNhdChbInN3YWwtcGFyYW0iLCJzd2FsLWJ1dHRvbiIsInN3YWwtaW1hZ2UiLCJzd2FsLWljb24iLCJzd2FsLWlucHV0Iiwic3dhbC1pbnB1dC1vcHRpb24iXSk7ZyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSkuZm9yRWFjaChmdW5jdGlvbih0KXt0LnBhcmVudE5vZGU9PT1lJiYodD10LnRhZ05hbWUudG9Mb3dlckNhc2UoKSwtMT09PW4uaW5kZXhPZih0KSYmVygiVW5yZWNvZ25pemVkIGVsZW1lbnQgPCIuY29uY2F0KHQsIj4iKSkpfSl9LEtlPWZ1bmN0aW9uKGUsbil7ZyhlLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24odCl7LTE9PT1uLmluZGV4T2YodC5uYW1lKSYmVyhbJ1VucmVjb2duaXplZCBhdHRyaWJ1dGUgIicuY29uY2F0KHQubmFtZSwnIiBvbiA8JykuY29uY2F0KGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpLCI+LiIpLCIiLmNvbmNhdChuLmxlbmd0aD8iQWxsb3dlZCBhdHRyaWJ1dGVzIGFyZTogIi5jb25jYXQobi5qb2luKCIsICIpKToiVG8gc2V0IHRoZSB2YWx1ZSwgdXNlIEhUTUwgd2l0aGluIHRoZSBlbGVtZW50LiIpXSl9KX0sWWU9ZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZS5kaWRPcGVuP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5kaWRPcGVuKHQpfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGUub25PcGVuJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUub25PcGVuKHQpfSl9LFplPWZ1bmN0aW9uKHQsZSl7QnQmJmx0KGUpPyh0LnN0eWxlLm92ZXJmbG93WT0iaGlkZGVuIixlLmFkZEV2ZW50TGlzdGVuZXIoQnQsTWUpKTp0LnN0eWxlLm92ZXJmbG93WT0iYXV0byJ9LFFlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzsoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW18fCJNYWNJbnRlbCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJjE8bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzKSYmIUYoZG9jdW1lbnQuYm9keSwkLmlvc2ZpeCkmJihvPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSIiLmNvbmNhdCgtMSpvLCJweCIpLHZ0KGRvY3VtZW50LmJvZHksJC5pb3NmaXgpLHZlKCksZ2UoKSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm1lKCkmJihoZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGhlKSksZSYmImhpZGRlbiIhPT1uJiZmZSgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNjcm9sbFRvcD0wfSl9LEplPWZ1bmN0aW9uKHQsZSxuKXt2dCh0LG4uc2hvd0NsYXNzLmJhY2tkcm9wKSxlLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwiMCIsImltcG9ydGFudCIpLHJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt2dChlLG4uc2hvd0NsYXNzLnBvcHVwKSxlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvcGFjaXR5Iil9LDEwKSx2dChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLCQuc2hvd24pLG4uaGVpZ2h0QXV0byYmbi5iYWNrZHJvcCYmIW4udG9hc3QmJnZ0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sJFsiaGVpZ2h0LWF1dG8iXSl9LCRlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWQ/MTowfSxYZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGVja2VkP3QudmFsdWU6bnVsbH0sR2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsZXMubGVuZ3RoP251bGwhPT10LmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKT90LmZpbGVzOnQuZmlsZXNbMF06bnVsbH0sdG49ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBvKHQpe3JldHVybiBubltuLmlucHV0XShpLG9uKHQpLG4pfXZhciBpPVAoKTtiKG4uaW5wdXRPcHRpb25zKXx8dyhuLmlucHV0T3B0aW9ucyk/KEp0KFQoKSkseShuLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbih0KXtlLmhpZGVMb2FkaW5nKCksbyh0KX0pKToib2JqZWN0Ij09PXIobi5pbnB1dE9wdGlvbnMpP28obi5pbnB1dE9wdGlvbnMpOksoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAiLmNvbmNhdChyKG4uaW5wdXRPcHRpb25zKSkpfSxlbj1mdW5jdGlvbihlLG4pe3ZhciBvPWUuZ2V0SW5wdXQoKTthdChvKSx5KG4uaW5wdXRWYWx1ZSkudGhlbihmdW5jdGlvbih0KXtvLnZhbHVlPSJudW1iZXIiPT09bi5pbnB1dD9wYXJzZUZsb2F0KHQpfHwwOiIiLmNvbmNhdCh0KSxydChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSkuY2F0Y2goZnVuY3Rpb24odCl7SygiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiAiLmNvbmNhdCh0KSksby52YWx1ZT0iIixydChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSl9LG5uPXtzZWxlY3Q6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLG4pe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9bixVKG8sZSksby5zZWxlY3RlZD1ybihuLGkuaW5wdXRWYWx1ZSksdC5hcHBlbmRDaGlsZChvKX12YXIgcj15dCh0LCQuc2VsZWN0KTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGUsbj10WzBdLHQ9dFsxXTtBcnJheS5pc0FycmF5KHQpPygoZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRncm91cCIpKS5sYWJlbD1uLGUuZGlzYWJsZWQ9ITEsci5hcHBlbmRDaGlsZChlKSx0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIG8oZSx0WzFdLHRbMF0pfSkpOm8ocix0LG4pfSksci5mb2N1cygpfSxyYWRpbzpmdW5jdGlvbih0LGUsaSl7dmFyIHI9eXQodCwkLnJhZGlvKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtvLnR5cGU9InJhZGlvIixvLm5hbWU9JC5yYWRpbyxvLnZhbHVlPWUscm4oZSxpLmlucHV0VmFsdWUpJiYoby5jaGVja2VkPSEwKTtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtVKGUsbiksZS5jbGFzc05hbWU9JC5sYWJlbCx0LmFwcGVuZENoaWxkKG8pLHQuYXBwZW5kQ2hpbGQoZSksci5hcHBlbmRDaGlsZCh0KX0pO2U9ci5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCIpO2UubGVuZ3RoJiZlWzBdLmZvY3VzKCl9fSxvbj1mdW5jdGlvbiBuKG8pe3ZhciBpPVtdO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiZvIGluc3RhbmNlb2YgTWFwP28uZm9yRWFjaChmdW5jdGlvbih0LGUpeyJvYmplY3QiPT09cih0KSYmKHQ9bih0KSksaS5wdXNoKFtlLHRdKX0pOk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9b1t0XTsib2JqZWN0Ij09PXIoZSkmJihlPW4oZSkpLGkucHVzaChbdCxlXSl9KSxpfSxybj1mdW5jdGlvbih0LGUpe3JldHVybiBlJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCl9LGFuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0SW5wdXQoKTtpZighbilyZXR1cm4gbnVsbDtzd2l0Y2goZS5pbnB1dCl7Y2FzZSJjaGVja2JveCI6cmV0dXJuICRlKG4pO2Nhc2UicmFkaW8iOnJldHVybiBYZShuKTtjYXNlImZpbGUiOnJldHVybiBHZShuKTtkZWZhdWx0OnJldHVybiBlLmlucHV0QXV0b1RyaW0/bi52YWx1ZS50cmltKCk6bi52YWx1ZX19KHQsZSk7ZS5pbnB1dFZhbGlkYXRvcj9zbih0LGUsbyk6dC5nZXRJbnB1dCgpLmNoZWNrVmFsaWRpdHkoKT8oImRlbnkiPT09bj91bjpjbikodCxlLG8pOih0LmVuYWJsZUJ1dHRvbnMoKSx0LnNob3dWYWxpZGF0aW9uTWVzc2FnZShlLnZhbGlkYXRpb25NZXNzYWdlKSl9LHNuPWZ1bmN0aW9uKGUsbixvKXtlLmRpc2FibGVJbnB1dCgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geShuLmlucHV0VmFsaWRhdG9yKG8sbi52YWxpZGF0aW9uTWVzc2FnZSkpfSkudGhlbihmdW5jdGlvbih0KXtlLmVuYWJsZUJ1dHRvbnMoKSxlLmVuYWJsZUlucHV0KCksdD9lLnNob3dWYWxpZGF0aW9uTWVzc2FnZSh0KTpjbihlLG4sbyl9KX0sdW49ZnVuY3Rpb24oZSx0LG4pe3Quc2hvd0xvYWRlck9uRGVueSYmSnQoTCgpKSx0LnByZURlbnk/UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB5KHQucHJlRGVueShuLHQudmFsaWRhdGlvbk1lc3NhZ2UpKX0pLnRoZW4oZnVuY3Rpb24odCl7ITE9PT10P2UuaGlkZUxvYWRpbmcoKTplLmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOnZvaWQgMD09PXQ/bjp0fSl9KTplLmNsb3NlUG9wdXAoe2lzRGVuaWVkOiEwLHZhbHVlOm59KX0sY249ZnVuY3Rpb24oZSx0LG4pe3Quc2hvd0xvYWRlck9uQ29uZmlybSYmSnQoKSx0LnByZUNvbmZpcm0/KGUucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geSh0LnByZUNvbmZpcm0obix0LnZhbGlkYXRpb25NZXNzYWdlKSl9KS50aGVuKGZ1bmN0aW9uKHQpe3d0KFMoKSl8fCExPT09dD9lLmhpZGVMb2FkaW5nKCk6SWUoZSx2b2lkIDA9PT10P246dCl9KSk6SWUoZSxuKX0sbG49WyJBcnJvd1JpZ2h0IiwiQXJyb3dEb3duIiwiUmlnaHQiLCJEb3duIl0sZG49WyJBcnJvd0xlZnQiLCJBcnJvd1VwIiwiTGVmdCIsIlVwIl0scG49WyJFc2NhcGUiLCJFc2MiXSxmbj1mdW5jdGlvbih0LGUsbil7dmFyIG89VHQuaW5uZXJQYXJhbXMuZ2V0KHQpO28mJihvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksIkVudGVyIj09PWUua2V5P21uKHQsZSxvKToiVGFiIj09PWUua2V5P2huKGUsbyk6LTEhPT1bXS5jb25jYXQobG4sZG4pLmluZGV4T2YoZS5rZXkpP2duKGUua2V5KTotMSE9PXBuLmluZGV4T2YoZS5rZXkpJiZ2bihlLG8sbikpfSxtbj1mdW5jdGlvbih0LGUsbil7ZS5pc0NvbXBvc2luZ3x8ZS50YXJnZXQmJnQuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09dC5nZXRJbnB1dCgpLm91dGVySFRNTCYmLTE9PT1bInRleHRhcmVhIiwiZmlsZSJdLmluZGV4T2Yobi5pbnB1dCkmJihGdCgpLGUucHJldmVudERlZmF1bHQoKSl9LGhuPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQudGFyZ2V0LG89UigpLGk9LTEscj0wO3I8by5sZW5ndGg7cisrKWlmKG49PT1vW3JdKXtpPXI7YnJlYWt9dC5zaGlmdEtleT9IZSgwLGksLTEpOkhlKDAsaSwxKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKX0sZ249ZnVuY3Rpb24odCl7LTEhPT1bVCgpLEwoKSxxKCldLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmJih0PS0xIT09bG4uaW5kZXhPZih0KT8ibmV4dEVsZW1lbnRTaWJsaW5nIjoicHJldmlvdXNFbGVtZW50U2libGluZyIsKHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudFt0XSkmJnQuZm9jdXMoKSl9LHZuPWZ1bmN0aW9uKHQsZSxuKXtaKGUuYWxsb3dFc2NhcGVLZXkpJiYodC5wcmV2ZW50RGVmYXVsdCgpLG4oUS5lc2MpKX0sYm49ZnVuY3Rpb24oZSx0LG4pe3QucG9wdXAub25jbGljaz1mdW5jdGlvbigpe3ZhciB0PVR0LmlubmVyUGFyYW1zLmdldChlKTt0LnNob3dDb25maXJtQnV0dG9ufHx0LnNob3dEZW55QnV0dG9ufHx0LnNob3dDYW5jZWxCdXR0b258fHQuc2hvd0Nsb3NlQnV0dG9ufHx0LnRpbWVyfHx0LmlucHV0fHxuKFEuY2xvc2UpfX0seW49ITEsd249ZnVuY3Rpb24oZSl7ZS5wb3B1cC5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2UuY29udGFpbmVyLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLmNvbnRhaW5lci5vbm1vdXNldXA9dm9pZCAwLHQudGFyZ2V0PT09ZS5jb250YWluZXImJih5bj0hMCl9fX0sQ249ZnVuY3Rpb24oZSl7ZS5jb250YWluZXIub25tb3VzZWRvd249ZnVuY3Rpb24oKXtlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD12b2lkIDAsdC50YXJnZXQhPT1lLnBvcHVwJiYhZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCl8fCh5bj0hMCl9fX0sa249ZnVuY3Rpb24obixvLGkpe28uY29udGFpbmVyLm9uY2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9VHQuaW5uZXJQYXJhbXMuZ2V0KG4pO3luP3luPSExOnQudGFyZ2V0PT09by5jb250YWluZXImJlooZS5hbGxvd091dHNpZGVDbGljaykmJmkoUS5iYWNrZHJvcCl9fTtmdW5jdGlvbiBBbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3Q9InN0cmluZyI9PXR5cGVvZiB0LnRlbXBsYXRlP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodC50ZW1wbGF0ZSk6dC50ZW1wbGF0ZTtpZighdClyZXR1cm57fTt0PXQuY29udGVudHx8dDtyZXR1cm4gV2UodCksdShSZSh0KSxOZSh0KSxVZSh0KSxGZSh0KSxfZSh0KSx6ZSh0LFZlKSl9KHQpO3JldHVybihuPXUoe30sc2UsZSxuLHQpKS5zaG93Q2xhc3M9dSh7fSxzZS5zaG93Q2xhc3Msbi5zaG93Q2xhc3MpLG4uaGlkZUNsYXNzPXUoe30sc2UuaGlkZUNsYXNzLG4uaGlkZUNsYXNzKSwhMT09PXQuYW5pbWF0aW9uJiYobi5zaG93Q2xhc3M9e3BvcHVwOiJzd2FsMi1ub2FuaW1hdGlvbiIsYmFja2Ryb3A6InN3YWwyLW5vYW5pbWF0aW9uIn0sbi5oaWRlQ2xhc3M9e30pLG59ZnVuY3Rpb24geG4oYSxzLHUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2EuY2xvc2VQb3B1cCh7aXNEaXNtaXNzZWQ6ITAsZGlzbWlzczp0fSl9dmFyIG4sbyxpLHI7Q2Uuc3dhbFByb21pc2VSZXNvbHZlLnNldChhLHQpLHMuY29uZmlybUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGU9dSwodD1hKS5kaXNhYmxlQnV0dG9ucygpLHZvaWQoZS5pbnB1dD9hbih0LGUsImNvbmZpcm0iKTpjbih0LGUsITApKTt2YXIgdCxlfSxzLmRlbnlCdXR0b24ub25jbGljaz1mdW5jdGlvbigpe3JldHVybiBlPXUsKHQ9YSkuZGlzYWJsZUJ1dHRvbnMoKSx2b2lkKGUucmV0dXJuSW5wdXRWYWx1ZU9uRGVueT9hbih0LGUsImRlbnkiKTp1bih0LGUsITEpKTt2YXIgdCxlfSxzLmNhbmNlbEJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHQ9ZSxhLmRpc2FibGVCdXR0b25zKCksdm9pZCB0KFEuY2FuY2VsKTt2YXIgdH0scy5jbG9zZUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUoUS5jbG9zZSl9LG49YSxyPXMsdD1lLFR0LmlubmVyUGFyYW1zLmdldChuKS50b2FzdD9ibihuLHIsdCk6KHduKHIpLENuKHIpLGtuKG4scix0KSksbz1hLHI9dSxpPWUsKHQ9dGUpLmtleWRvd25UYXJnZXQmJnQua2V5ZG93bkhhbmRsZXJBZGRlZCYmKHQua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOnQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLHQua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksci50b2FzdHx8KHQua2V5ZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZuKG8sdCxpKX0sdC5rZXlkb3duVGFyZ2V0PXIua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6QSgpLHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1yLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsdC5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHQua2V5ZG93bkhhbmRsZXIse2NhcHR1cmU6dC5rZXlkb3duTGlzdGVuZXJDYXB0dXJlfSksdC5rZXlkb3duSGFuZGxlckFkZGVkPSEwKSxyPWEsInNlbGVjdCI9PT0odD11KS5pbnB1dHx8InJhZGlvIj09PXQuaW5wdXQ/dG4ocix0KTotMSE9PVsidGV4dCIsImVtYWlsIiwibnVtYmVyIiwidGVsIiwidGV4dGFyZWEiXS5pbmRleE9mKHQuaW5wdXQpJiYoYih0LmlucHV0VmFsdWUpfHx3KHQuaW5wdXRWYWx1ZSkpJiZlbihyLHQpLGplKHUpLFBuKHRlLHUsZSksT24ocyx1KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5jb250YWluZXIuc2Nyb2xsVG9wPTB9KX0pfWZ1bmN0aW9uIEJuKHQpe3ZhciBlPXtwb3B1cDpBKCksY29udGFpbmVyOmsoKSxjb250ZW50OlAoKSxhY3Rpb25zOmooKSxjb25maXJtQnV0dG9uOlQoKSxkZW55QnV0dG9uOkwoKSxjYW5jZWxCdXR0b246cSgpLGxvYWRlcjpEKCksY2xvc2VCdXR0b246VigpLHZhbGlkYXRpb25NZXNzYWdlOlMoKSxwcm9ncmVzc1N0ZXBzOm4oKX07cmV0dXJuIFR0LmRvbUNhY2hlLnNldCh0LGUpLGV9dmFyIFBuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1IKCk7YXQobyksZS50aW1lciYmKHQudGltZW91dD1uZXcgTGUoZnVuY3Rpb24oKXtuKCJ0aW1lciIpLGRlbGV0ZSB0LnRpbWVvdXR9LGUudGltZXIpLGUudGltZXJQcm9ncmVzc0JhciYmKHJ0KG8pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnRpbWVvdXQmJnQudGltZW91dC5ydW5uaW5nJiZkdChlLnRpbWVyKX0pKSl9LE9uPWZ1bmN0aW9uKHQsZSl7aWYoIWUudG9hc3QpcmV0dXJuIFooZS5hbGxvd0VudGVyS2V5KT92b2lkKEVuKHQsZSl8fEhlKDAsLTEsMSkpOlNuKCl9LEVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9jdXNEZW55JiZ3dCh0LmRlbnlCdXR0b24pPyh0LmRlbnlCdXR0b24uZm9jdXMoKSwhMCk6ZS5mb2N1c0NhbmNlbCYmd3QodC5jYW5jZWxCdXR0b24pPyh0LmNhbmNlbEJ1dHRvbi5mb2N1cygpLCEwKTohKCFlLmZvY3VzQ29uZmlybXx8IXd0KHQuY29uZmlybUJ1dHRvbikpJiYodC5jb25maXJtQnV0dG9uLmZvY3VzKCksITApfSxTbj1mdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpfTtmdW5jdGlvbiBUbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdC5kaWREZXN0cm95P3QuZGlkRGVzdHJveSgpOiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uRGVzdHJveSYmdC5vbkRlc3Ryb3koKX1mdW5jdGlvbiBMbih0KXtkZWxldGUgdC5wYXJhbXMsZGVsZXRlIHRlLmtleWRvd25IYW5kbGVyLGRlbGV0ZSB0ZS5rZXlkb3duVGFyZ2V0LHFuKFR0KSxxbihDZSl9dmFyIERuLHFuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KXRbZV09bmV3IFdlYWtNYXB9LEo9T2JqZWN0LmZyZWV6ZSh7aGlkZUxvYWRpbmc6cGUsZGlzYWJsZUxvYWRpbmc6cGUsZ2V0SW5wdXQ6ZnVuY3Rpb24odCl7dmFyIGU9VHQuaW5uZXJQYXJhbXMuZ2V0KHR8fHRoaXMpO3JldHVybih0PVR0LmRvbUNhY2hlLmdldCh0fHx0aGlzKSk/ZXQodC5jb250ZW50LGUuaW5wdXQpOm51bGx9LGNsb3NlOkFlLGNsb3NlUG9wdXA6QWUsY2xvc2VNb2RhbDpBZSxjbG9zZVRvYXN0OkFlLGVuYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtTZSh0aGlzLFsiY29uZmlybUJ1dHRvbiIsImRlbnlCdXR0b24iLCJjYW5jZWxCdXR0b24iXSwhMSl9LGRpc2FibGVCdXR0b25zOmZ1bmN0aW9uKCl7U2UodGhpcyxbImNvbmZpcm1CdXR0b24iLCJkZW55QnV0dG9uIiwiY2FuY2VsQnV0dG9uIl0sITApfSxlbmFibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBUZSh0aGlzLmdldElucHV0KCksITEpfSxkaXNhYmxlSW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVGUodGhpcy5nZXRJbnB1dCgpLCEwKX0sc2hvd1ZhbGlkYXRpb25NZXNzYWdlOmZ1bmN0aW9uKHQpe3ZhciBlPVR0LmRvbUNhY2hlLmdldCh0aGlzKSxuPVR0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtVKGUudmFsaWRhdGlvbk1lc3NhZ2UsdCksZS52YWxpZGF0aW9uTWVzc2FnZS5jbGFzc05hbWU9JFsidmFsaWRhdGlvbi1tZXNzYWdlIl0sbi5jdXN0b21DbGFzcyYmbi5jdXN0b21DbGFzcy52YWxpZGF0aW9uTWVzc2FnZSYmdnQoZS52YWxpZGF0aW9uTWVzc2FnZSxuLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSxydChlLnZhbGlkYXRpb25NZXNzYWdlKSwoZT10aGlzLmdldElucHV0KCkpJiYoZS5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsITApLGUuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZEJ5IiwkWyJ2YWxpZGF0aW9uLW1lc3NhZ2UiXSksbnQoZSksdnQoZSwkLmlucHV0ZXJyb3IpKX0scmVzZXRWYWxpZGF0aW9uTWVzc2FnZTpmdW5jdGlvbigpe3ZhciB0PVR0LmRvbUNhY2hlLmdldCh0aGlzKTt0LnZhbGlkYXRpb25NZXNzYWdlJiZhdCh0LnZhbGlkYXRpb25NZXNzYWdlKSwodD10aGlzLmdldElucHV0KCkpJiYodC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpLHQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZEJ5IiksYnQodCwkLmlucHV0ZXJyb3IpKX0sZ2V0UHJvZ3Jlc3NTdGVwczpmdW5jdGlvbigpe3JldHVybiBUdC5kb21DYWNoZS5nZXQodGhpcykucHJvZ3Jlc3NTdGVwc30sX21haW46ZnVuY3Rpb24odCl7dmFyIGU9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiBhZSh1KHt9LGUsdCkpLHRlLmN1cnJlbnRJbnN0YW5jZSYmdGUuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksdGUuY3VycmVudEluc3RhbmNlPXRoaXMscWUodD1Bbih0LGUpKSxPYmplY3QuZnJlZXplKHQpLHRlLnRpbWVvdXQmJih0ZS50aW1lb3V0LnN0b3AoKSxkZWxldGUgdGUudGltZW91dCksY2xlYXJUaW1lb3V0KHRlLnJlc3RvcmVGb2N1c1RpbWVvdXQpLGU9Qm4odGhpcyksVXQodGhpcyx0KSxUdC5pbm5lclBhcmFtcy5zZXQodGhpcyx0KSx4bih0aGlzLGUsdCl9LHVwZGF0ZTpmdW5jdGlvbihlKXt2YXIgdD1BKCksbj1UdC5pbm5lclBhcmFtcy5nZXQodGhpcyk7aWYoIXR8fEYodCxuLmhpZGVDbGFzcy5wb3B1cCkpcmV0dXJuIFcoIllvdSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjbG9zZWQgb3IgY2xvc2luZyBwb3B1cCwgdGhhdCB3b24ndCB3b3JrLiBVc2UgdGhlIHVwZGF0ZSgpIG1ldGhvZCBpbiBwcmVDb25maXJtIHBhcmFtZXRlciBvciBzaG93IGEgbmV3IHBvcHVwLiIpO3ZhciBvPXt9O09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7TW4uaXNVcGRhdGFibGVQYXJhbWV0ZXIodCk/b1t0XT1lW3RdOlcoJ0ludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogIicuY29uY2F0KHQsJyIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qc1xuXG5JZiB5b3UgdGhpbmsgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVwZGF0YWJsZSwgcmVxdWVzdCBpdCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzL25ldz90ZW1wbGF0ZT0wMl9mZWF0dXJlX3JlcXVlc3QubWQnKSl9KSxuPXUoe30sbixvKSxVdCh0aGlzLG4pLFR0LmlubmVyUGFyYW1zLnNldCh0aGlzLG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6dSh7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PVR0LmRvbUNhY2hlLmdldCh0aGlzKSxlPVR0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodC5wb3B1cCYmdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrJiYodGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIHRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayksdGUuZGVmZXJEaXNwb3NhbFRpbWVyJiYoY2xlYXJUaW1lb3V0KHRlLmRlZmVyRGlzcG9zYWxUaW1lciksZGVsZXRlIHRlLmRlZmVyRGlzcG9zYWxUaW1lciksVG4oZSksTG4odGhpcykpfX0pLGpuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSgpe2lmKGEodGhpcyxpKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7InVuZGVmaW5lZCI9PXR5cGVvZiBQcm9taXNlJiZLKCJUaGlzIHBhY2thZ2UgcmVxdWlyZXMgYSBQcm9taXNlIGxpYnJhcnksIHBsZWFzZSBpbmNsdWRlIGEgc2hpbSB0byBlbmFibGUgaXQgaW4gdGhpcyBicm93c2VyIChTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi93aWtpL01pZ3JhdGlvbi1mcm9tLVN3ZWV0QWxlcnQtdG8tU3dlZXRBbGVydDIjMS1pZS1zdXBwb3J0KSIpLERuPXRoaXM7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07dmFyIG89T2JqZWN0LmZyZWV6ZSh0aGlzLmNvbnN0cnVjdG9yLmFyZ3NUb1BhcmFtcyhlKSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cGFyYW1zOnt2YWx1ZTpvLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pO289dGhpcy5fbWFpbih0aGlzLnBhcmFtcyk7VHQucHJvbWlzZS5zZXQodGhpcyxvKX19cmV0dXJuIHMoaSxbe2tleToidGhlbiIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIFR0LnByb21pc2UuZ2V0KHRoaXMpLnRoZW4odCl9fSx7a2V5OiJmaW5hbGx5Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gVHQucHJvbWlzZS5nZXQodGhpcykuZmluYWxseSh0KX19XSksaX0oKTt1KGpuLnByb3RvdHlwZSxKKSx1KGpuLGRlKSxPYmplY3Qua2V5cyhKKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2puW3RdPWZ1bmN0aW9uKCl7aWYoRG4pcmV0dXJuIERuW3RdLmFwcGx5KERuLGFyZ3VtZW50cyl9fSksam4uRGlzbWlzc1JlYXNvbj1RLGpuLnZlcnNpb249IjEwLjE2LjYiO3ZhciBNbj1qbjtyZXR1cm4gTW4uZGVmYXVsdD1Nbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7CiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2lmKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuKSxuLnN0eWxlU2hlZXQpbi5zdHlsZVNoZWV0LmRpc2FibGVkfHwobi5zdHlsZVNoZWV0LmNzc1RleHQ9dCk7ZWxzZSB0cnl7bi5pbm5lckhUTUw9dH1jYXRjaChlKXtuLmlubmVyVGV4dD10fX0oZG9jdW1lbnQsIi5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdHtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaDt3aWR0aDphdXRvO3BhZGRpbmc6MS4yNWVtO292ZXJmbG93LXk6aGlkZGVuO2JhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAuNjI1ZW0gI2Q5ZDlkOX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpyb3c7cGFkZGluZzowfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7ZmxleC1ncm93OjE7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7bWFyZ2luOjAgLjYyNWVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5ne2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pbnB1dHtoZWlnaHQ6MmVtO21hcmdpbjouMzEyNWVtIGF1dG87Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7cG9zaXRpb246c3RhdGljO3dpZHRoOi44ZW07aGVpZ2h0Oi44ZW07bGluZS1oZWlnaHQ6Ljh9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1jb250ZW50e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O21hcmdpbjowIC42MjVlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1odG1sLWNvbnRhaW5lcntwYWRkaW5nOi42MjVlbSAwIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1odG1sLWNvbnRhaW5lcjplbXB0eXtwYWRkaW5nOjB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29ue3dpZHRoOjJlbTttaW4td2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOjAgLjVlbSAwIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MS44ZW07Zm9udC13ZWlnaHQ6NzAwfUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKSwoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtmb250LXNpemU6LjI1ZW19fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItYWN0aW9uc3tmbGV4OjE7ZmxleC1iYXNpczphdXRvIWltcG9ydGFudDthbGlnbi1zZWxmOnN0cmV0Y2g7d2lkdGg6YXV0bztoZWlnaHQ6Mi4yZW07aGVpZ2h0OmF1dG87bWFyZ2luOjAgLjMxMjVlbTttYXJnaW4tdG9wOi4zMTI1ZW07cGFkZGluZzowfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3R5bGVke21hcmdpbjouMTI1ZW0gLjMxMjVlbTtwYWRkaW5nOi4zMTI1ZW0gLjYyNWVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdHlsZWQ6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2fS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MS42ZW07aGVpZ2h0OjNlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LS44ZW07bGVmdDotLjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjoyZW0gMmVtO2JvcmRlci1yYWRpdXM6NGVtIDAgMCA0ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotLjI1ZW07bGVmdDouOTM3NWVtO3RyYW5zZm9ybS1vcmlnaW46MCAxLjVlbTtib3JkZXItcmFkaXVzOjAgNGVtIDRlbSAwfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3dpZHRoOjJlbTtoZWlnaHQ6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7dG9wOjA7bGVmdDouNDM3NWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjIuNjg3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17aGVpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXB7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25ney13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1czthbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdC5zd2FsMi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LXNob3cgLjVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItaGlkZXstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1oaWRlIC4xcyBmb3J3YXJkczthbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHN9LnN3YWwyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDYwO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zd2FsMi1jb250YWluZXIuc3dhbDItYmFja2Ryb3Atc2hvdywuc3dhbDItY29udGFpbmVyLnN3YWwyLW5vYW5pbWF0aW9ue2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNCl9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1oaWRle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXJ7YWxpZ24taXRlbXM6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnR7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te2FsaWduLWl0ZW1zOmZsZXgtZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7YWxpZ24taXRlbXM6ZmxleC1lbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e2FsaWduLWl0ZW1zOmZsZXgtZW5kO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1lbmQ+OmZpcnN0LWNoaWxkLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQ+OmZpcnN0LWNoaWxkLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0PjpmaXJzdC1jaGlsZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydD46Zmlyc3QtY2hpbGQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6YXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctZnVsbHNjcmVlbj4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tc2VsZjpzdHJldGNoO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LXJvdz4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1ue2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20sLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXIsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3B7YWxpZ24taXRlbXM6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLWxlZnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tc3RhcnQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXItbGVmdCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1zdGFydCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcC1sZWZ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLXJpZ2h0LC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1yaWdodCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcC1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi10b3AtcmlnaHR7YWxpZ24taXRlbXM6ZmxleC1lbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbj4uc3dhbDItbW9kYWx7ZGlzcGxheTpmbGV4IWltcG9ydGFudDtmbGV4OjE7YWxpZ24tY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLW5vLXRyYW5zaXRpb257dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH0uc3dhbDItY29udGFpbmVyOm5vdCguc3dhbDItdG9wKTpub3QoLnN3YWwyLXRvcC1zdGFydCk6bm90KC5zd2FsMi10b3AtZW5kKTpub3QoLnN3YWwyLXRvcC1sZWZ0KTpub3QoLnN3YWwyLXRvcC1yaWdodCk6bm90KC5zd2FsMi1jZW50ZXItc3RhcnQpOm5vdCguc3dhbDItY2VudGVyLWVuZCk6bm90KC5zd2FsMi1jZW50ZXItbGVmdCk6bm90KC5zd2FsMi1jZW50ZXItcmlnaHQpOm5vdCguc3dhbDItYm90dG9tKTpub3QoLnN3YWwyLWJvdHRvbS1zdGFydCk6bm90KC5zd2FsMi1ib3R0b20tZW5kKTpub3QoLnN3YWwyLWJvdHRvbS1sZWZ0KTpub3QoLnN3YWwyLWJvdHRvbS1yaWdodCk6bm90KC5zd2FsMi1ncm93LWZ1bGxzY3JlZW4pPi5zd2FsMi1tb2RhbHttYXJnaW46YXV0b31AbWVkaWEgYWxsIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6bm9uZSksKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7LnN3YWwyLWNvbnRhaW5lciAuc3dhbDItbW9kYWx7bWFyZ2luOjAhaW1wb3J0YW50fX0uc3dhbDItcG9wdXB7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDozMmVtO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MS4yNWVtO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxcmVtfS5zd2FsMi1wb3B1cDpmb2N1c3tvdXRsaW5lOjB9LnN3YWwyLXBvcHVwLnN3YWwyLWxvYWRpbmd7b3ZlcmZsb3cteTpoaWRkZW59LnN3YWwyLWhlYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjAgMS44ZW19LnN3YWwyLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowIDAgLjRlbTtwYWRkaW5nOjA7Y29sb3I6IzU5NTk1OTtmb250LXNpemU6MS44NzVlbTtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC10cmFuc2Zvcm06bm9uZTt3b3JkLXdyYXA6YnJlYWstd29yZH0uc3dhbDItYWN0aW9uc3tkaXNwbGF5OmZsZXg7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0byAwO3BhZGRpbmc6MH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWRbZGlzYWJsZWRde29wYWNpdHk6LjR9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjEpLHJnYmEoMCwwLDAsLjEpKX0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6YWN0aXZle2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjIpLHJnYmEoMCwwLDAsLjIpKX0uc3dhbDItbG9hZGVye2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXItd2lkdGg6LjI1ZW07Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6IzI3NzhjNCB0cmFuc3BhcmVudCAjMjc3OGM0IHRyYW5zcGFyZW50fS5zd2FsMi1zdHlsZWR7bWFyZ2luOi4zMTI1ZW07cGFkZGluZzouNjI1ZW0gMS4xZW07Ym94LXNoYWRvdzpub25lO2ZvbnQtd2VpZ2h0OjUwMH0uc3dhbDItc3R5bGVkOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojMjc3OGM0O2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWRlbnl7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojZDE0NTI5O2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbHtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiM3NTc1NzU7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1zdHlsZWQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9LnN3YWwyLWZvb3RlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxLjI1ZW0gMCAwO3BhZGRpbmc6MWVtIDAgMDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2NvbG9yOiM1NDU0NTQ7Zm9udC1zaXplOjFlbX0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtoZWlnaHQ6LjI1ZW07b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjVweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjVweH0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3dpZHRoOjEwMCU7aGVpZ2h0Oi4yNWVtO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMil9LnN3YWwyLWltYWdle21heC13aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0b30uc3dhbDItY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO3RvcDowO3JpZ2h0OjA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZS1vdXQ7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDowIDA7Y29sb3I6I2NjYztmb250LWZhbWlseTpzZXJpZjtmb250LXNpemU6Mi41ZW07bGluZS1oZWlnaHQ6MS4yO2N1cnNvcjpwb2ludGVyfS5zd2FsMi1jbG9zZTpob3Zlcnt0cmFuc2Zvcm06bm9uZTtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojZjI3NDc0fS5zd2FsMi1jbG9zZTpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLWNsb3NlOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1jb250ZW50e3otaW5kZXg6MTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowO3BhZGRpbmc6MCAxLjZlbTtjb2xvcjojNTQ1NDU0O2ZvbnQtc2l6ZToxLjEyNWVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXI7d29yZC13cmFwOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSBhdXRvfS5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItdGV4dGFyZWF7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjNzLGJveC1zaGFkb3cgLjNzO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtib3JkZXItcmFkaXVzOi4xODc1ZW07YmFja2dyb3VuZDppbmhlcml0O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA2KTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLWlucHV0LnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLXRleHRhcmVhLnN3YWwyLWlucHV0ZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0IWltcG9ydGFudH0uc3dhbDItZmlsZTpmb2N1cywuc3dhbDItaW5wdXQ6Zm9jdXMsLnN3YWwyLXRleHRhcmVhOmZvY3Vze2JvcmRlcjoxcHggc29saWQgI2I0ZGJlZDtvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLWZpbGU6Oi1tb3otcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0OjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1maWxlOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTo6cGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0OjpwbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6OnBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLXJhbmdle21hcmdpbjoxZW0gYXV0bztiYWNrZ3JvdW5kOiNmZmZ9LnN3YWwyLXJhbmdlIGlucHV0e3dpZHRoOjgwJX0uc3dhbDItcmFuZ2Ugb3V0cHV0e3dpZHRoOjIwJTtjb2xvcjppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItcmFuZ2UgaW5wdXQsLnN3YWwyLXJhbmdlIG91dHB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjEuMTI1ZW07bGluZS1oZWlnaHQ6Mi42MjVlbX0uc3dhbDItaW5wdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowIC43NWVtfS5zd2FsMi1pbnB1dFt0eXBlPW51bWJlcl17bWF4LXdpZHRoOjEwZW19LnN3YWwyLWZpbGV7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19LnN3YWwyLXNlbGVjdHttaW4td2lkdGg6NTAlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjM3NWVtIC42MjVlbTtiYWNrZ3JvdW5kOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3gsLnN3YWwyLXJhZGlve2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1jaGVja2JveCBsYWJlbCwuc3dhbDItcmFkaW8gbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3ggaW5wdXQsLnN3YWwyLXJhZGlvIGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvfS5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjAgLTIuN2VtO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOiNmMGYwZjA7Y29sb3I6IzY2Njtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjMwMH0uc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlOjpiZWZvcmV7Y29udGVudDpcIiFcIjtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxLjVlbTttaW4td2lkdGg6MS41ZW07aGVpZ2h0OjEuNWVtO21hcmdpbjowIC42MjVlbTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLWljb257cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpjb250ZW50LWJveDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjVlbTtoZWlnaHQ6NWVtO21hcmdpbjoxLjI1ZW0gYXV0byAxLjg3NWVtO2JvcmRlcjouMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXItY29sb3I6IzAwMDtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTozLjc1ZW19LnN3YWwyLWljb24uc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciAuc3dhbDIteC1tYXJre3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjIuMzEyNWVtO3dpZHRoOjIuOTM3NWVtO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0OjFlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZ3tib3JkZXItY29sb3I6I2ZhY2VhODtjb2xvcjojZjhiYjg2fS5zd2FsMi1pY29uLnN3YWwyLWluZm97Ym9yZGVyLWNvbG9yOiM5ZGUwZjY7Y29sb3I6IzNmYzNlZX0uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODY7Y29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozLjc1ZW07aGVpZ2h0OjcuNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1sZWZ0XXt0b3A6LS40Mzc1ZW07bGVmdDotMi4wNjM1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46My43NWVtIDMuNzVlbTtib3JkZXItcmFkaXVzOjcuNWVtIDAgMCA3LjVlbX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotLjY4NzVlbTtsZWZ0OjEuODc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MCAzLjc1ZW07Ym9yZGVyLXJhZGl1czowIDcuNWVtIDcuNWVtIDB9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LS4yNWVtO2xlZnQ6LS4yNWVtO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6LjI1ZW0gc29saWQgcmdiYSgxNjUsMjIwLDEzNCwuMyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXh7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDouNWVtO2xlZnQ6MS42MjVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDo1LjYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjIuODc1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD1sb25nXXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25ney13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWluO2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW59LnN3YWwyLXByb2dyZXNzLXN0ZXBze2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXgtd2lkdGg6MTAwJTttYXJnaW46MCAwIDEuMjVlbTtwYWRkaW5nOjA7YmFja2dyb3VuZDppbmhlcml0O2ZvbnQtd2VpZ2h0OjYwMH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiMyNzc4YzQ7Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6IzI3NzhjNH0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB+LnN3YWwyLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDojYWRkOGU2O2NvbG9yOiNmZmZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7YmFja2dyb3VuZDojYWRkOGU2fS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le3otaW5kZXg6MTA7ZmxleC1zaHJpbms6MDt3aWR0aDoyLjVlbTtoZWlnaHQ6LjRlbTttYXJnaW46MCAtMXB4O2JhY2tncm91bmQ6IzI3NzhjNH1bY2xhc3NePXN3YWwyXXstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnN3YWwyLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItc2hvdyAuM3M7YW5pbWF0aW9uOnN3YWwyLXNob3cgLjNzfS5zd2FsMi1oaWRley13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWhpZGUgLjE1cyBmb3J3YXJkczthbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzfS5zd2FsMi1ub2FuaW1hdGlvbnt0cmFuc2l0aW9uOm5vbmV9LnN3YWwyLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfS5zd2FsMi1ydGwgLnN3YWwyLWNsb3Nle3JpZ2h0OmF1dG87bGVmdDowfS5zd2FsMi1ydGwgLnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcntyaWdodDowO2xlZnQ6YXV0b31Ac3VwcG9ydHMgKC1tcy1hY2NlbGVyYXRvcjp0cnVlKXsuc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnN3YWwyLXJhbmdlIG91dHB1dHtkaXNwbGF5Om5vbmV9fUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKSwoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnN3YWwyLXJhbmdlIG91dHB1dHtkaXNwbGF5Om5vbmV9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6LjU2MjVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOi4xMjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6LjYyNWVtO2xlZnQ6LS4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHN3YWwyLXNob3d7MCV7dHJhbnNmb3JtOnNjYWxlKC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoLjk1KX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDoxLjE4NzVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOjEuMDYyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDoyLjE4NzVlbTtsZWZ0Oi0uMzc1ZW07d2lkdGg6My4xMjVlbX04NCV7dG9wOjNlbTtsZWZ0OjEuMzEyNWVtO3dpZHRoOjEuMDYyNWVtfTEwMCV7dG9wOjIuODEyNWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTUle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0xMiV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH01MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTgwJXttYXJnaW4tdG9wOi0uMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLWljb257MCV7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZ3swJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3c6aGlkZGVufWJvZHkuc3dhbDItaGVpZ2h0LWF1dG97aGVpZ2h0OmF1dG8haW1wb3J0YW50fWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lcnt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzttYXgtd2lkdGg6Y2FsYygxMDAlIC0gLjYyNWVtICogMik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyPi5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsLjQpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7dG9wOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7dG9wOjA7bGVmdDowfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdCxib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0e3RvcDo1MCU7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7dG9wOjUwJTtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217Ym90dG9tOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0LGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7Ym90dG9tOjA7bGVmdDowfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tcmlnaHR7cmlnaHQ6MDtib3R0b206MH1AbWVkaWEgcHJpbnR7Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdy15OnNjcm9sbCFpbXBvcnRhbnR9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKT5bYXJpYS1oaWRkZW49dHJ1ZV17ZGlzcGxheTpub25lfWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bikgLnN3YWwyLWNvbnRhaW5lcntwb3NpdGlvbjpzdGF0aWMhaW1wb3J0YW50fX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9we3RvcDowO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1yaWdodHt0b3A6MDtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0b31ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1zdGFydHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydHt0b3A6NTAlO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXJ7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXJpZ2h0e3RvcDo1MCU7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnR7dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbXt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTowO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tcmlnaHR7dG9wOmF1dG87cmlnaHQ6MDtib3R0b206MDtsZWZ0OmF1dG99Iik7"},{"meta":{"name":"md5.min.js","url":"https://registry.npmmirror.com/js-md5/0.7.3/files/build/md5.min.js","ts":1708420280777,"mimetype":"text/javascript"},"source":"LyoqCiAqIFtqcy1tZDVde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtbWQ1fQogKgogKiBAbmFtZXNwYWNlIG1kNQogKiBAdmVyc2lvbiAwLjcuMwogKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXQogKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTQtMjAxNwogKiBAbGljZW5zZSBNSVQKICovCiFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KHQpe2lmKHQpZFswXT1kWzE2XT1kWzFdPWRbMl09ZFszXT1kWzRdPWRbNV09ZFs2XT1kWzddPWRbOF09ZFs5XT1kWzEwXT1kWzExXT1kWzEyXT1kWzEzXT1kWzE0XT1kWzE1XT0wLHRoaXMuYmxvY2tzPWQsdGhpcy5idWZmZXI4PWw7ZWxzZSBpZihhKXt2YXIgcj1uZXcgQXJyYXlCdWZmZXIoNjgpO3RoaXMuYnVmZmVyOD1uZXcgVWludDhBcnJheShyKSx0aGlzLmJsb2Nrcz1uZXcgVWludDMyQXJyYXkocil9ZWxzZSB0aGlzLmJsb2Nrcz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTt0aGlzLmgwPXRoaXMuaDE9dGhpcy5oMj10aGlzLmgzPXRoaXMuc3RhcnQ9dGhpcy5ieXRlcz10aGlzLmhCeXRlcz0wLHRoaXMuZmluYWxpemVkPXRoaXMuaGFzaGVkPSExLHRoaXMuZmlyc3Q9ITB9dmFyIHI9ImlucHV0IGlzIGludmFsaWQgdHlwZSIsZT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyxpPWU/d2luZG93Ont9O2kuSlNfTUQ1X05PX1dJTkRPVyYmKGU9ITEpO3ZhciBzPSFlJiYib2JqZWN0Ij09dHlwZW9mIHNlbGYsaD0haS5KU19NRDVfTk9fTk9ERV9KUyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGU7aD9pPWdsb2JhbDpzJiYoaT1zZWxmKTt2YXIgZj0haS5KU19NRDVfTk9fQ09NTU9OX0pTJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMsbz0iZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kLGE9IWkuSlNfTUQ1X05PX0FSUkFZX0JVRkZFUiYmInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlcixuPSIwMTIzNDU2Nzg5YWJjZGVmIi5zcGxpdCgiIiksdT1bMTI4LDMyNzY4LDgzODg2MDgsLTIxNDc0ODM2NDhdLHk9WzAsOCwxNiwyNF0sYz1bImhleCIsImFycmF5IiwiZGlnZXN0IiwiYnVmZmVyIiwiYXJyYXlCdWZmZXIiLCJiYXNlNjQiXSxwPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIi5zcGxpdCgiIiksZD1bXSxsO2lmKGEpe3ZhciBBPW5ldyBBcnJheUJ1ZmZlcig2OCk7bD1uZXcgVWludDhBcnJheShBKSxkPW5ldyBVaW50MzJBcnJheShBKX0haS5KU19NRDVfTk9fTk9ERV9KUyYmQXJyYXkuaXNBcnJheXx8KEFycmF5LmlzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0pLCFhfHwhaS5KU19NRDVfTk9fQVJSQVlfQlVGRkVSX0lTX1ZJRVcmJkFycmF5QnVmZmVyLmlzVmlld3x8KEFycmF5QnVmZmVyLmlzVmlldz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuYnVmZmVyJiZ0LmJ1ZmZlci5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyfSk7dmFyIGI9ZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCghMCkudXBkYXRlKGUpW3JdKCl9fSx2PWZ1bmN0aW9uKCl7dmFyIHI9YigiaGV4Iik7aCYmKHI9dyhyKSksci5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHR9LHIudXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiByLmNyZWF0ZSgpLnVwZGF0ZSh0KX07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDsrK2Upe3ZhciBpPWNbZV07cltpXT1iKGkpfXJldHVybiByfSx3PWZ1bmN0aW9uKHQpe3ZhciBlPWV2YWwoInJlcXVpcmUoJ2NyeXB0bycpIiksaT1ldmFsKCJyZXF1aXJlKCdidWZmZXInKS5CdWZmZXIiKSxzPWZ1bmN0aW9uKHMpe2lmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gZS5jcmVhdGVIYXNoKCJtZDUiKS51cGRhdGUocywidXRmOCIpLmRpZ2VzdCgiaGV4Iik7aWYobnVsbD09PXN8fHZvaWQgMD09PXMpdGhyb3cgcjtyZXR1cm4gcy5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyJiYocz1uZXcgVWludDhBcnJheShzKSksQXJyYXkuaXNBcnJheShzKXx8QXJyYXlCdWZmZXIuaXNWaWV3KHMpfHxzLmNvbnN0cnVjdG9yPT09aT9lLmNyZWF0ZUhhc2goIm1kNSIpLnVwZGF0ZShuZXcgaShzKSkuZGlnZXN0KCJoZXgiKTp0KHMpfTtyZXR1cm4gc307dC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmZpbmFsaXplZCl7dmFyIGUsaT10eXBlb2YgdDtpZigic3RyaW5nIiE9PWkpe2lmKCJvYmplY3QiIT09aSl0aHJvdyByO2lmKG51bGw9PT10KXRocm93IHI7aWYoYSYmdC5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyKXQ9bmV3IFVpbnQ4QXJyYXkodCk7ZWxzZSBpZighKEFycmF5LmlzQXJyYXkodCl8fGEmJkFycmF5QnVmZmVyLmlzVmlldyh0KSkpdGhyb3cgcjtlPSEwfWZvcih2YXIgcyxoLGY9MCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja3MsdT10aGlzLmJ1ZmZlcjg7ZjxvOyl7aWYodGhpcy5oYXNoZWQmJih0aGlzLmhhc2hlZD0hMSxuWzBdPW5bMTZdLG5bMTZdPW5bMV09blsyXT1uWzNdPW5bNF09bls1XT1uWzZdPW5bN109bls4XT1uWzldPW5bMTBdPW5bMTFdPW5bMTJdPW5bMTNdPW5bMTRdPW5bMTVdPTApLGUpaWYoYSlmb3IoaD10aGlzLnN0YXJ0O2Y8byYmaDw2NDsrK2YpdVtoKytdPXRbZl07ZWxzZSBmb3IoaD10aGlzLnN0YXJ0O2Y8byYmaDw2NDsrK2YpbltoPj4yXXw9dFtmXTw8eVszJmgrK107ZWxzZSBpZihhKWZvcihoPXRoaXMuc3RhcnQ7ZjxvJiZoPDY0OysrZikocz10LmNoYXJDb2RlQXQoZikpPDEyOD91W2grK109czpzPDIwNDg/KHVbaCsrXT0xOTJ8cz4+Nix1W2grK109MTI4fDYzJnMpOnM8NTUyOTZ8fHM+PTU3MzQ0Pyh1W2grK109MjI0fHM+PjEyLHVbaCsrXT0xMjh8cz4+NiY2Myx1W2grK109MTI4fDYzJnMpOihzPTY1NTM2KygoMTAyMyZzKTw8MTB8MTAyMyZ0LmNoYXJDb2RlQXQoKytmKSksdVtoKytdPTI0MHxzPj4xOCx1W2grK109MTI4fHM+PjEyJjYzLHVbaCsrXT0xMjh8cz4+NiY2Myx1W2grK109MTI4fDYzJnMpO2Vsc2UgZm9yKGg9dGhpcy5zdGFydDtmPG8mJmg8NjQ7KytmKShzPXQuY2hhckNvZGVBdChmKSk8MTI4P25baD4+Ml18PXM8PHlbMyZoKytdOnM8MjA0OD8obltoPj4yXXw9KDE5MnxzPj42KTw8eVszJmgrK10sbltoPj4yXXw9KDEyOHw2MyZzKTw8eVszJmgrK10pOnM8NTUyOTZ8fHM+PTU3MzQ0PyhuW2g+PjJdfD0oMjI0fHM+PjEyKTw8eVszJmgrK10sbltoPj4yXXw9KDEyOHxzPj42JjYzKTw8eVszJmgrK10sbltoPj4yXXw9KDEyOHw2MyZzKTw8eVszJmgrK10pOihzPTY1NTM2KygoMTAyMyZzKTw8MTB8MTAyMyZ0LmNoYXJDb2RlQXQoKytmKSksbltoPj4yXXw9KDI0MHxzPj4xOCk8PHlbMyZoKytdLG5baD4+Ml18PSgxMjh8cz4+MTImNjMpPDx5WzMmaCsrXSxuW2g+PjJdfD0oMTI4fHM+PjYmNjMpPDx5WzMmaCsrXSxuW2g+PjJdfD0oMTI4fDYzJnMpPDx5WzMmaCsrXSk7dGhpcy5sYXN0Qnl0ZUluZGV4PWgsdGhpcy5ieXRlcys9aC10aGlzLnN0YXJ0LGg+PTY0Pyh0aGlzLnN0YXJ0PWgtNjQsdGhpcy5oYXNoKCksdGhpcy5oYXNoZWQ9ITApOnRoaXMuc3RhcnQ9aH1yZXR1cm4gdGhpcy5ieXRlcz40Mjk0OTY3Mjk1JiYodGhpcy5oQnl0ZXMrPXRoaXMuYnl0ZXMvNDI5NDk2NzI5Njw8MCx0aGlzLmJ5dGVzPXRoaXMuYnl0ZXMlNDI5NDk2NzI5NiksdGhpc319LHQucHJvdG90eXBlLmZpbmFsaXplPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZmluYWxpemVkKXt0aGlzLmZpbmFsaXplZD0hMDt2YXIgdD10aGlzLmJsb2NrcyxyPXRoaXMubGFzdEJ5dGVJbmRleDt0W3I+PjJdfD11WzMmcl0scj49NTYmJih0aGlzLmhhc2hlZHx8dGhpcy5oYXNoKCksdFswXT10WzE2XSx0WzE2XT10WzFdPXRbMl09dFszXT10WzRdPXRbNV09dFs2XT10WzddPXRbOF09dFs5XT10WzEwXT10WzExXT10WzEyXT10WzEzXT10WzE0XT10WzE1XT0wKSx0WzE0XT10aGlzLmJ5dGVzPDwzLHRbMTVdPXRoaXMuaEJ5dGVzPDwzfHRoaXMuYnl0ZXM+Pj4yOSx0aGlzLmhhc2goKX19LHQucHJvdG90eXBlLmhhc2g9ZnVuY3Rpb24oKXt2YXIgdCxyLGUsaSxzLGgsZj10aGlzLmJsb2Nrczt0aGlzLmZpcnN0P3I9KChyPSgodD0oKHQ9ZlswXS02ODA4NzY5MzcpPDw3fHQ+Pj4yNSktMjcxNzMzODc5PDwwKV4oZT0oKGU9KC0yNzE3MzM4NzleKGk9KChpPSgtMTczMjU4NDE5NF4yMDA0MzE4MDcxJnQpK2ZbMV0tMTE3ODMwNzA4KTw8MTJ8aT4+PjIwKSt0PDwwKSYoLTI3MTczMzg3OV50KSkrZlsyXS0xMTI2NDc4Mzc1KTw8MTd8ZT4+PjE1KStpPDwwKSYoaV50KSkrZlszXS0xMzE2MjU5MjA5KTw8MjJ8cj4+PjEwKStlPDwwOih0PXRoaXMuaDAscj10aGlzLmgxLGU9dGhpcy5oMixyPSgocis9KCh0PSgodCs9KChpPXRoaXMuaDMpXnImKGVeaSkpK2ZbMF0tNjgwODc2OTM2KTw8N3x0Pj4+MjUpK3I8PDApXihlPSgoZSs9KHJeKGk9KChpKz0oZV50JihyXmUpKStmWzFdLTM4OTU2NDU4Nik8PDEyfGk+Pj4yMCkrdDw8MCkmKHRecikpK2ZbMl0rNjA2MTA1ODE5KTw8MTd8ZT4+PjE1KStpPDwwKSYoaV50KSkrZlszXS0xMDQ0NTI1MzMwKTw8MjJ8cj4+PjEwKStlPDwwKSxyPSgocis9KCh0PSgodCs9KGleciYoZV5pKSkrZls0XS0xNzY0MTg4OTcpPDw3fHQ+Pj4yNSkrcjw8MCleKGU9KChlKz0ocl4oaT0oKGkrPShlXnQmKHJeZSkpK2ZbNV0rMTIwMDA4MDQyNik8PDEyfGk+Pj4yMCkrdDw8MCkmKHRecikpK2ZbNl0tMTQ3MzIzMTM0MSk8PDE3fGU+Pj4xNSkraTw8MCkmKGledCkpK2ZbN10tNDU3MDU5ODMpPDwyMnxyPj4+MTApK2U8PDAscj0oKHIrPSgodD0oKHQrPShpXnImKGVeaSkpK2ZbOF0rMTc3MDAzNTQxNik8PDd8dD4+PjI1KStyPDwwKV4oZT0oKGUrPShyXihpPSgoaSs9KGVedCYocl5lKSkrZls5XS0xOTU4NDE0NDE3KTw8MTJ8aT4+PjIwKSt0PDwwKSYodF5yKSkrZlsxMF0tNDIwNjMpPDwxN3xlPj4+MTUpK2k8PDApJihpXnQpKStmWzExXS0xOTkwNDA0MTYyKTw8MjJ8cj4+PjEwKStlPDwwLHI9KChyKz0oKHQ9KCh0Kz0oaV5yJihlXmkpKStmWzEyXSsxODA0NjAzNjgyKTw8N3x0Pj4+MjUpK3I8PDApXihlPSgoZSs9KHJeKGk9KChpKz0oZV50JihyXmUpKStmWzEzXS00MDM0MTEwMSk8PDEyfGk+Pj4yMCkrdDw8MCkmKHRecikpK2ZbMTRdLTE1MDIwMDIyOTApPDwxN3xlPj4+MTUpK2k8PDApJihpXnQpKStmWzE1XSsxMjM2NTM1MzI5KTw8MjJ8cj4+PjEwKStlPDwwLHI9KChyKz0oKGk9KChpKz0ocl5lJigodD0oKHQrPShlXmkmKHJeZSkpK2ZbMV0tMTY1Nzk2NTEwKTw8NXx0Pj4+MjcpK3I8PDApXnIpKStmWzZdLTEwNjk1MDE2MzIpPDw5fGk+Pj4yMykrdDw8MCledCYoKGU9KChlKz0odF5yJihpXnQpKStmWzExXSs2NDM3MTc3MTMpPDwxNHxlPj4+MTgpK2k8PDApXmkpKStmWzBdLTM3Mzg5NzMwMik8PDIwfHI+Pj4xMikrZTw8MCxyPSgocis9KChpPSgoaSs9KHJeZSYoKHQ9KCh0Kz0oZV5pJihyXmUpKStmWzVdLTcwMTU1ODY5MSk8PDV8dD4+PjI3KStyPDwwKV5yKSkrZlsxMF0rMzgwMTYwODMpPDw5fGk+Pj4yMykrdDw8MCledCYoKGU9KChlKz0odF5yJihpXnQpKStmWzE1XS02NjA0NzgzMzUpPDwxNHxlPj4+MTgpK2k8PDApXmkpKStmWzRdLTQwNTUzNzg0OCk8PDIwfHI+Pj4xMikrZTw8MCxyPSgocis9KChpPSgoaSs9KHJeZSYoKHQ9KCh0Kz0oZV5pJihyXmUpKStmWzldKzU2ODQ0NjQzOCk8PDV8dD4+PjI3KStyPDwwKV5yKSkrZlsxNF0tMTAxOTgwMzY5MCk8PDl8aT4+PjIzKSt0PDwwKV50JigoZT0oKGUrPSh0XnImKGledCkpK2ZbM10tMTg3MzYzOTYxKTw8MTR8ZT4+PjE4KStpPDwwKV5pKSkrZls4XSsxMTYzNTMxNTAxKTw8MjB8cj4+PjEyKStlPDwwLHI9KChyKz0oKGk9KChpKz0ocl5lJigodD0oKHQrPShlXmkmKHJeZSkpK2ZbMTNdLTE0NDQ2ODE0NjcpPDw1fHQ+Pj4yNykrcjw8MClecikpK2ZbMl0tNTE0MDM3ODQpPDw5fGk+Pj4yMykrdDw8MCledCYoKGU9KChlKz0odF5yJihpXnQpKStmWzddKzE3MzUzMjg0NzMpPDwxNHxlPj4+MTgpK2k8PDApXmkpKStmWzEyXS0xOTI2NjA3NzM0KTw8MjB8cj4+PjEyKStlPDwwLHI9KChyKz0oKGg9KGk9KChpKz0oKHM9cl5lKV4odD0oKHQrPShzXmkpK2ZbNV0tMzc4NTU4KTw8NHx0Pj4+MjgpK3I8PDApKStmWzhdLTIwMjI1NzQ0NjMpPDwxMXxpPj4+MjEpK3Q8PDApXnQpXihlPSgoZSs9KGhecikrZlsxMV0rMTgzOTAzMDU2Mik8PDE2fGU+Pj4xNikraTw8MCkpK2ZbMTRdLTM1MzA5NTU2KTw8MjN8cj4+PjkpK2U8PDAscj0oKHIrPSgoaD0oaT0oKGkrPSgocz1yXmUpXih0PSgodCs9KHNeaSkrZlsxXS0xNTMwOTkyMDYwKTw8NHx0Pj4+MjgpK3I8PDApKStmWzRdKzEyNzI4OTMzNTMpPDwxMXxpPj4+MjEpK3Q8PDApXnQpXihlPSgoZSs9KGhecikrZls3XS0xNTU0OTc2MzIpPDwxNnxlPj4+MTYpK2k8PDApKStmWzEwXS0xMDk0NzMwNjQwKTw8MjN8cj4+PjkpK2U8PDAscj0oKHIrPSgoaD0oaT0oKGkrPSgocz1yXmUpXih0PSgodCs9KHNeaSkrZlsxM10rNjgxMjc5MTc0KTw8NHx0Pj4+MjgpK3I8PDApKStmWzBdLTM1ODUzNzIyMik8PDExfGk+Pj4yMSkrdDw8MCledCleKGU9KChlKz0oaF5yKStmWzNdLTcyMjUyMTk3OSk8PDE2fGU+Pj4xNikraTw8MCkpK2ZbNl0rNzYwMjkxODkpPDwyM3xyPj4+OSkrZTw8MCxyPSgocis9KChoPShpPSgoaSs9KChzPXJeZSleKHQ9KCh0Kz0oc15pKStmWzldLTY0MDM2NDQ4Nyk8PDR8dD4+PjI4KStyPDwwKSkrZlsxMl0tNDIxODE1ODM1KTw8MTF8aT4+PjIxKSt0PDwwKV50KV4oZT0oKGUrPShoXnIpK2ZbMTVdKzUzMDc0MjUyMCk8PDE2fGU+Pj4xNikraTw8MCkpK2ZbMl0tOTk1MzM4NjUxKTw8MjN8cj4+PjkpK2U8PDAscj0oKHIrPSgoaT0oKGkrPShyXigodD0oKHQrPShlXihyfH5pKSkrZlswXS0xOTg2MzA4NDQpPDw2fHQ+Pj4yNikrcjw8MCl8fmUpKStmWzddKzExMjY4OTE0MTUpPDwxMHxpPj4+MjIpK3Q8PDApXigoZT0oKGUrPSh0XihpfH5yKSkrZlsxNF0tMTQxNjM1NDkwNSk8PDE1fGU+Pj4xNykraTw8MCl8fnQpKStmWzVdLTU3NDM0MDU1KTw8MjF8cj4+PjExKStlPDwwLHI9KChyKz0oKGk9KChpKz0ocl4oKHQ9KCh0Kz0oZV4ocnx+aSkpK2ZbMTJdKzE3MDA0ODU1NzEpPDw2fHQ+Pj4yNikrcjw8MCl8fmUpKStmWzNdLTE4OTQ5ODY2MDYpPDwxMHxpPj4+MjIpK3Q8PDApXigoZT0oKGUrPSh0XihpfH5yKSkrZlsxMF0tMTA1MTUyMyk8PDE1fGU+Pj4xNykraTw8MCl8fnQpKStmWzFdLTIwNTQ5MjI3OTkpPDwyMXxyPj4+MTEpK2U8PDAscj0oKHIrPSgoaT0oKGkrPShyXigodD0oKHQrPShlXihyfH5pKSkrZls4XSsxODczMzEzMzU5KTw8Nnx0Pj4+MjYpK3I8PDApfH5lKSkrZlsxNV0tMzA2MTE3NDQpPDwxMHxpPj4+MjIpK3Q8PDApXigoZT0oKGUrPSh0XihpfH5yKSkrZls2XS0xNTYwMTk4MzgwKTw8MTV8ZT4+PjE3KStpPDwwKXx+dCkpK2ZbMTNdKzEzMDkxNTE2NDkpPDwyMXxyPj4+MTEpK2U8PDAscj0oKHIrPSgoaT0oKGkrPShyXigodD0oKHQrPShlXihyfH5pKSkrZls0XS0xNDU1MjMwNzApPDw2fHQ+Pj4yNikrcjw8MCl8fmUpKStmWzExXS0xMTIwMjEwMzc5KTw8MTB8aT4+PjIyKSt0PDwwKV4oKGU9KChlKz0odF4oaXx+cikpK2ZbMl0rNzE4Nzg3MjU5KTw8MTV8ZT4+PjE3KStpPDwwKXx+dCkpK2ZbOV0tMzQzNDg1NTUxKTw8MjF8cj4+PjExKStlPDwwLHRoaXMuZmlyc3Q/KHRoaXMuaDA9dCsxNzMyNTg0MTkzPDwwLHRoaXMuaDE9ci0yNzE3MzM4Nzk8PDAsdGhpcy5oMj1lLTE3MzI1ODQxOTQ8PDAsdGhpcy5oMz1pKzI3MTczMzg3ODw8MCx0aGlzLmZpcnN0PSExKToodGhpcy5oMD10aGlzLmgwK3Q8PDAsdGhpcy5oMT10aGlzLmgxK3I8PDAsdGhpcy5oMj10aGlzLmgyK2U8PDAsdGhpcy5oMz10aGlzLmgzK2k8PDApfSx0LnByb3RvdHlwZS5oZXg9ZnVuY3Rpb24oKXt0aGlzLmZpbmFsaXplKCk7dmFyIHQ9dGhpcy5oMCxyPXRoaXMuaDEsZT10aGlzLmgyLGk9dGhpcy5oMztyZXR1cm4gblt0Pj40JjE1XStuWzE1JnRdK25bdD4+MTImMTVdK25bdD4+OCYxNV0rblt0Pj4yMCYxNV0rblt0Pj4xNiYxNV0rblt0Pj4yOCYxNV0rblt0Pj4yNCYxNV0rbltyPj40JjE1XStuWzE1JnJdK25bcj4+MTImMTVdK25bcj4+OCYxNV0rbltyPj4yMCYxNV0rbltyPj4xNiYxNV0rbltyPj4yOCYxNV0rbltyPj4yNCYxNV0rbltlPj40JjE1XStuWzE1JmVdK25bZT4+MTImMTVdK25bZT4+OCYxNV0rbltlPj4yMCYxNV0rbltlPj4xNiYxNV0rbltlPj4yOCYxNV0rbltlPj4yNCYxNV0rbltpPj40JjE1XStuWzE1JmldK25baT4+MTImMTVdK25baT4+OCYxNV0rbltpPj4yMCYxNV0rbltpPj4xNiYxNV0rbltpPj4yOCYxNV0rbltpPj4yNCYxNV19LHQucHJvdG90eXBlLnRvU3RyaW5nPXQucHJvdG90eXBlLmhleCx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt0aGlzLmZpbmFsaXplKCk7dmFyIHQ9dGhpcy5oMCxyPXRoaXMuaDEsZT10aGlzLmgyLGk9dGhpcy5oMztyZXR1cm5bMjU1JnQsdD4+OCYyNTUsdD4+MTYmMjU1LHQ+PjI0JjI1NSwyNTUmcixyPj44JjI1NSxyPj4xNiYyNTUscj4+MjQmMjU1LDI1NSZlLGU+PjgmMjU1LGU+PjE2JjI1NSxlPj4yNCYyNTUsMjU1JmksaT4+OCYyNTUsaT4+MTYmMjU1LGk+PjI0JjI1NV19LHQucHJvdG90eXBlLmFycmF5PXQucHJvdG90eXBlLmRpZ2VzdCx0LnByb3RvdHlwZS5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3RoaXMuZmluYWxpemUoKTt2YXIgdD1uZXcgQXJyYXlCdWZmZXIoMTYpLHI9bmV3IFVpbnQzMkFycmF5KHQpO3JldHVybiByWzBdPXRoaXMuaDAsclsxXT10aGlzLmgxLHJbMl09dGhpcy5oMixyWzNdPXRoaXMuaDMsdH0sdC5wcm90b3R5cGUuYnVmZmVyPXQucHJvdG90eXBlLmFycmF5QnVmZmVyLHQucHJvdG90eXBlLmJhc2U2ND1mdW5jdGlvbigpe2Zvcih2YXIgdCxyLGUsaT0iIixzPXRoaXMuYXJyYXkoKSxoPTA7aDwxNTspdD1zW2grK10scj1zW2grK10sZT1zW2grK10saSs9cFt0Pj4+Ml0rcFs2MyYodDw8NHxyPj4+NCldK3BbNjMmKHI8PDJ8ZT4+PjYpXStwWzYzJmVdO3JldHVybiB0PXNbaF0saSs9cFt0Pj4+Ml0rcFt0PDw0JjYzXSsiPT0ifTt2YXIgXz12KCk7Zj9tb2R1bGUuZXhwb3J0cz1fOihpLm1kNT1fLG8mJmRlZmluZShmdW5jdGlvbigpe3JldHVybiBffSkpfSgpOw=="}]}]}