ZGlmZiAtLWdpdCBhLy5naXRodWIvRlVORElORy55bWwgYi8uZ2l0aHViL0ZVTkRJTkcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2E2NmQKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aHViL0ZVTkRJTkcueW1sCkBAIC0wLDAgKzEgQEAKK2N1c3RvbTogaHR0cHM6Ly9naXRlZS5jb20vd2hpdGVzaGFkZXIvcnVveWktcmVhY3QKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODM2OGEKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgVG9vbHMKKworLmdyYWRsZQorL2J1aWxkLworIWdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCit0YXJnZXQvCishLm12bi93cmFwcGVyL21hdmVuLXdyYXBwZXIuamFyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSURFCisKKyMjIyBTVFMgIyMjCisuYXB0X2dlbmVyYXRlZAorLmNsYXNzcGF0aAorLmZhY3RvcnlwYXRoCisucHJvamVjdAorLnNldHRpbmdzCisuc3ByaW5nQmVhbnMKKworIyMjIEludGVsbGlKIElERUEgIyMjCisuaWRlYQorKi5pd3MKKyouaW1sCisqLmlwcgorCisjIyMgSlJlYmVsICMjIworcmViZWwueG1sCisKKyMjIyBOZXRCZWFucyAjIyMKK25icHJvamVjdC9wcml2YXRlLworYnVpbGQvKgorbmJidWlsZC8KK2Rpc3QvCituYmRpc3QvCisubmItZ3JhZGxlLworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE90aGVycworKi5sb2cKKyoueG1sLnZlcnNpb25zQmFja3VwCisqLnN3cAorCishKi9idWlsZC8qLmphdmEKKyEqL2J1aWxkLyouaHRtbAorISovYnVpbGQvKi54bWwKZGlmZiAtLWdpdCBhLy52c2NvZGUvc2V0dGluZ3MuanNvbiBiLy52c2NvZGUvc2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQxZGNkCi0tLSAvZGV2L251bGwKKysrIGIvLnZzY29kZS9zZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAiZmlsZXMuZXhjbHVkZSI6IHsKKyAgICAgICAgIioqLy5jbGFzc3BhdGgiOiB0cnVlLAorICAgICAgICAiKiovLnByb2plY3QiOiB0cnVlLAorICAgICAgICAiKiovLnNldHRpbmdzIjogdHJ1ZSwKKyAgICAgICAgIioqLy5mYWN0b3J5cGF0aCI6IHRydWUKKyAgICB9LAorICAgICJqYXZhLmNvbXBpbGUubnVsbEFuYWx5c2lzLm1vZGUiOiAiYXV0b21hdGljIiwKKyAgICAiamF2YS5jb25maWd1cmF0aW9uLnVwZGF0ZUJ1aWxkQ29uZmlndXJhdGlvbiI6ICJpbnRlcmFjdGl2ZSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY0ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRQpAQCAtMCwwICsxLDIwIEBACitUaGUgTUlUIExpY2Vuc2UgKE1JVCkKKworQ29weXJpZ2h0IChjKSAyMDE4IFJ1b1lpCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKK3RoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgordGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKK0NPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGQ5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwxMzggQEAKKyMjIOW5s+WPsOeugOS7iworCivpobnnm67pk77mjqXvvJpodHRwczovL2dpdGVlLmNvbS93aGl0ZXNoYWRlci9ydW95aS1yZWFjdAorCivlvq7mnI3liqHliIbmlK/vvJpodHRwczovL2dpdGVlLmNvbS93aGl0ZXNoYWRlci9ydW95aS1yZWFjdC90cmVlL3NwcmluZy1jbG91ZC12My8KKwor6Iul5L6dKFJ1b3lpLVJlYWN0KeaYr+S4gOWll+WFqOmDqOW8gOa6kOeahOW/q+mAn+W8gOWPkeW5s+WPsO+8jOavq+aXoOS/neeVmee7meS4quS6uuWPiuS8geS4muWFjei0ueS9v+eUqOOAggorCisqIOWJjeerr+mHh+eUqFJlYWN0IDE444CBQW50IERlc2lnbiBQcm8gNuOAgVR5cGVTY3JpcHQgNeOAggorKiDlkI7nq6/ph4fnlKhKREsxNywgU3ByaW5nIEJvb3QgdjPjgIFTcHJpbmcgU2VjdXJpdHnjgIFSZWRpcyAmIEp3dOOAggorKiDmnYPpmZDorqTor4Hkvb/nlKhKd3TvvIzmlK/mjIHlpJrnu4jnq6/orqTor4Hns7vnu5/jgIIKKyog5pSv5oyB5Yqg6L295Yqo5oCB5p2D6ZmQ6I+c5Y2V77yM5aSa5pa55byP6L275p2+5p2D6ZmQ5o6n5Yi244CCCisqIOmrmOaViOeOh+W8gOWPke+8jOS9v+eUqOS7o+eggeeUn+aIkOWZqOWPr+S7peS4gOmUrueUn+aIkOWJjeWQjuerr+S7o+eggeOAggorCisKKyMjIOWGhee9ruWKn+iDvQorCisxLiAg55So5oi3566h55CG77ya55So5oi35piv57O757uf5pON5L2c6ICF77yM6K+l5Yqf6IO95Li76KaB5a6M5oiQ57O757uf55So5oi36YWN572u44CCCisyLiAg6YOo6Zeo566h55CG77ya6YWN572u57O757uf57uE57uH5py65p6E77yI5YWs5Y+444CB6YOo6Zeo44CB5bCP57uE77yJ77yM5qCR57uT5p6E5bGV546w5pSv5oyB5pWw5o2u5p2D6ZmQ44CCCiszLiAg5bKX5L2N566h55CG77ya6YWN572u57O757uf55So5oi35omA5bGe5ouF5Lu76IGM5Yqh44CCCis0LiAg6I+c5Y2V566h55CG77ya6YWN572u57O757uf6I+c5Y2V77yM5pON5L2c5p2D6ZmQ77yM5oyJ6ZKu5p2D6ZmQ5qCH6K+G562J44CCCis1LiAg6KeS6Imy566h55CG77ya6KeS6Imy6I+c5Y2V5p2D6ZmQ5YiG6YWN44CB6K6+572u6KeS6Imy5oyJ5py65p6E6L+b6KGM5pWw5o2u6IyD5Zu05p2D6ZmQ5YiS5YiG44CCCis2LiAg5a2X5YW4566h55CG77ya5a+557O757uf5Lit57uP5bi45L2/55So55qE5LiA5Lqb6L6D5Li65Zu65a6a55qE5pWw5o2u6L+b6KGM57u05oqk44CCCis3LiAg5Y+C5pWw566h55CG77ya5a+557O757uf5Yqo5oCB6YWN572u5bi455So5Y+C5pWw44CCCis4LiAg6YCa55+l5YWs5ZGK77ya57O757uf6YCa55+l5YWs5ZGK5L+h5oGv5Y+R5biD57u05oqk44CCCis5LiAg5pON5L2c5pel5b+X77ya57O757uf5q2j5bi45pON5L2c5pel5b+X6K6w5b2V5ZKM5p+l6K+i77yb57O757uf5byC5bi45L+h5oGv5pel5b+X6K6w5b2V5ZKM5p+l6K+i44CCCisxMC4g55m75b2V5pel5b+X77ya57O757uf55m75b2V5pel5b+X6K6w5b2V5p+l6K+i5YyF5ZCr55m75b2V5byC5bi444CCCisxMS4g5Zyo57q/55So5oi377ya5b2T5YmN57O757uf5Lit5rS76LeD55So5oi354q25oCB55uR5o6n44CCCisxMi4g5a6a5pe25Lu75Yqh77ya5Zyo57q/77yI5re75Yqg44CB5L+u5pS544CB5Yig6ZmkKeS7u+WKoeiwg+W6puWMheWQq+aJp+ihjOe7k+aenOaXpeW/l+OAggorMTMuIOS7o+eggeeUn+aIkO+8muWJjeWQjuerr+S7o+eggeeahOeUn+aIkO+8iGphdmHjgIFodG1s44CBeG1s44CBc3Fs77yJ5pSv5oyBQ1JVROS4i+i9vSDjgIIKKzE0LiDns7vnu5/mjqXlj6PvvJrmoLnmja7kuJrliqHku6PnoIHoh6rliqjnlJ/miJDnm7jlhbPnmoRhcGnmjqXlj6PmlofmoaPjgIIKKzE1LiDmnI3liqHnm5HmjqfvvJrnm5Hop4blvZPliY3ns7vnu59DUFXjgIHlhoXlrZjjgIHno4Hnm5jjgIHloIbmoIjnrYnnm7jlhbPkv6Hmga/jgIIKKzE2LiDlnKjnur/mnoTlu7rlmajvvJrmi5bliqjooajljZXlhYPntKDnlJ/miJDnm7jlupTnmoRIVE1M5Luj56CB44CCCisxNy4g6L+e5o6l5rGg55uR6KeG77ya55uR6KeG5b2T5YmN57O757uf5pWw5o2u5bqT6L+e5o6l5rGg54q25oCB77yM5Y+v6L+b6KGM5YiG5p6QU1FM5om+5Ye657O757uf5oCn6IO955O26aKI44CCCisKKyMjIOWcqOe6v+S9k+mqjAorCistIGFkbWluL2FkbWluMTIzICAKKy0gcnkvMTIzNDU2CisKK+a8lOekuuWcsOWdgO+8muaaguaXtuayoeaciQorIAoraHR0cHM6Ly9naXRlZS5jb20vd2hpdGVzaGFkZXIvcnVveWktY2xvdWQtdmJlbi9ibG9iL21hc3Rlci9ydW95aS1yZWFjdC1kZW1vLTIwMjMtMDQtMjcuZ2lmCisKKyMjIOWJjeerr+W8gOWPkeazqOaEj+S6i+mhuQorCitOb2Rl77ya5bu66K6udjE25oiW5Lul5LiKCisKK+WuieijheS+nei1luivt+aUr+ihjO+8mm5wbSBpCisKK+ato+W4uOWQr+WKqOivt+i/kOihjDogbnBtIHJ1biBkZXYKKworTW9ja+a1i+ivleaooeW8j+ivt+i/kOihjDogbnBtIHJ1biBzdGFydAorCivlj5HluIPmiZPljIXor7fov5DooYw6IG5wbSBydW4gYnVpbGQKKworIyMg55u45YWz5oqA5pyv5paH5qGjCisKKyMjIyDlkI7nq6/or7TmmI7mlofmoaMKK2h0dHA6Ly9kb2MucnVveWkudmlwL3J1b3lpLWNsb3VkLworCisjIyMgVHlwZVNjcmlwdAoraHR0cHM6Ly93d3cudHNsYW5nLmNuL2RvY3MvaG9tZS5odG1sCisKKyMjIyBSZWFjdCBKcworaHR0cHM6Ly9yZWFjdC5kb2NzY2hpbmEub3JnL2RvY3MvZ2V0dGluZy1zdGFydGVkLmh0bWwKKworIyMjIEFudCBEZXNpZ24gCitodHRwczovL2FudC5kZXNpZ24vY29tcG9uZW50cy9vdmVydmlldy1jbi8KKworIyMjIEFudCBEZXNpZ24gUHJvCitodHRwczovL3Byby5hbnQuZGVzaWduL3poLUNOL2RvY3Mvb3ZlcnZpZXcKKworIyMjIEFudCBEZXNpZ24gQ2hhcnQKK2h0dHBzOi8vY2hhcnRzLmFudC5kZXNpZ24vemgKKworIyMjIFVtaSBKcworaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9pbnRyb2R1Y2UvaW50cm9kdWNlCisKKyMjIOmDqOe9sgoraHR0cDovL2RvYy5ydW95aS52aXAvcnVveWktdnVlL2RvY3VtZW50L2hqYnMuaHRtbCNuZ2lueCVFOSU4NSU4RCVFNyVCRCVBRQorCisjIyDmvJTnpLrlm74KKworPHRhYmxlPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxpbWcgc3JjPSJodHRwczovL29zY2ltZy5vc2NoaW5hLm5ldC9vc2NuZXQvdXAtOTk5NmIyNzQ4ODZlODEzNDA2NmNjZWUwOTZmZGUyMDg5ZGQucG5nIi8+PC90ZD4KKyAgICAgICAgPHRkPjxpbWcgc3JjPSJodHRwczovL29zY2ltZy5vc2NoaW5hLm5ldC9vc2NuZXQvdXAtNjZhZmUwNjg4NWQzNDQ4Mjg2MjUzNmU0ZjAwYzg3YzA0NzUucG5nIi8+PC90ZD4KKyAgICA8L3RyPiAgICAKKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWYyNzllZTRlNDE5ZTliYTgwYTc3ZmQ4OThlYmQ4YzlhYzQ1LnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWI1NmM4OTFlMjlkMWRmZDAyMTNiMDAwMzM5ZWZmZDI1NmRiLnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTI2ZDRhMGY1Njk2N2Y0YzMxOWQ2ZTk1Y2FiOTY1MmJkYmZlLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTEyNWFlZDQ4YTgyMTQ1NTFjYjJjZTVhYTVhMTQwM2Q3OGU5LnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTU5YmMxZWZlNWQ4ZjEwOWU1NjMwNWFhODYxOTJmZjU2YmIwLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTZlMDgxMDQ0YTZmODY0Yzk2ZGY5YTI1YWFhMjY1MTZmN2ZjLnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKwk8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWVkMmU2N2Y0MWM4YTU2ZTBkYjEyMTU2NDVhMGQ5ZGQxZTUyLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTI3ODgyNDFmNzg5M2FjOGZiZmQyYjg0ODEzZjYwNDUxNzU1LnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKwk8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWVkYTE3NzBmNjM4M2UwMDAxNDM5YjU2YzMzOTIwMTIyMTNkLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTMxYzQ4N2Q3NDE5YjE2YmM3OWRlMGQ2YTZhMTI3ODlmMDQ4LnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTMxYzQ4N2Q3NDE5YjE2YmM3OWRlMGQ2YTZhMTI3ODlmMDQ4LnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTRkOGNkODZiYTE5OGYwMjYzZjkwYTBiZDM2YzQ3YjAzMTdiLnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKwk8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTZkMGJhNzAzYTAwZjhiMDJhMDU0MDkzMWM5ZTY3ZmU4MTZjLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTM3NjE1OTk2NmFhNjdlN2UyZmRkOTcxYmY2OGZiMGEzMzc1LnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTc3YjE4NjM2MWM3NTRiZDlhYmM2YmVhYzdiMmRkMzcxODU4LnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTgwMGFiYTg1MDc5M2ZlYjExZTUyNzIwMTUzYTgwMWNjMmU1LnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTg4MzVjZjI4OWJlMjFkOWVkODE5NzQ3NjQ2NzBkNzhkMTIwLnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLTMxYTk2ODk0OGJlNDVhYmIwYTMwYmQ3YjY5ZmQ5YmVlNTAxLnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWVkOGI2NTRhMzViNzBkNWIxNDI4MWM3ZDVmMDg2NjU4ZTI3LnBuZyIvPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIHNyYz0iaHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L3VwLWU3ZjNlMzI5YWEyMDUyZDMyZjY0YTM3MmYyNWFkOWY1ZGYxLnBuZyIvPjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKworIyMg6Iul5L6dKFJ1b3lpLVJlYWN0KeWJjeWQjuerr+WIhuemu+S6pOa1gee+pAorCitRUee+pO+8miBbIVvliqDlhaVRUee+pF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8yMDEzOTYzNDktYmx1ZS5zdmcpXShodHRwczovL2pxLnFxLmNvbS8/X3d2PTEwMjcmaz11NThWRUVRSykg54K55Ye75oyJ6ZKu5YWl576k44CCCisKKworIyMg5oSf6LCi5o2Q6LWg55qE5LyZ5Ly0LOiwouiwouS9oOS7rOeahOaUr+aMgQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Jpbi9jbGVhbi5iYXQgYi9iaW4vY2xlYW4uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzA5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vY2xlYW4uYmF0CkBAIC0wLDAgKzEsMTIgQEAKK0BlY2hvIG9mZgorZWNoby4KK2VjaG8gW9DFz6JdIMflwO25pLPMdGFyZ2V0yfqzycK3vrahoworZWNoby4KKworJX5kMAorY2QgJX5kcDAKKworY2QgLi4KK2NhbGwgbXZuIGNsZWFuCisKK3BhdXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3BhY2thZ2UuYmF0IGIvYmluL3BhY2thZ2UuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTNlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcGFja2FnZS5iYXQKQEAgLTAsMCArMSwxMiBAQAorQGVjaG8gb2ZmCitlY2hvLgorZWNobyBb0MXPol0gtPKw/FdlYrmks8yjrMn6s8l3YXIvamFysPzOxLz+oaMKK2VjaG8uCisKKyV+ZDAKK2NkICV+ZHAwCisKK2NkIC4uCitjYWxsIG12biBjbGVhbiBwYWNrYWdlIC1EbWF2ZW4udGVzdC5za2lwPXRydWUKKworcGF1c2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW4vcnVuLmJhdCBiL2Jpbi9ydW4uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWZiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcnVuLmJhdApAQCAtMCwwICsxLDE0IEBACitAZWNobyBvZmYKK2VjaG8uCitlY2hvIFvQxc+iXSDKudPDSmFyw/zB7tTL0NBXZWK5pLPMoaMKK2VjaG8uCisKK2NkICV+ZHAwCitjZCAuLi9ydW95aS1hZG1pbi90YXJnZXQKKworc2V0IEpBVkFfT1BUUz0tWG1zMjU2bSAtWG14MTAyNG0gLVhYOk1ldGFzcGFjZVNpemU9MTI4bSAtWFg6TWF4TWV0YXNwYWNlU2l6ZT01MTJtCisKK2phdmEgLWphciAlSkFWQV9PUFRTJSBydW95aS1hZG1pbi5qYXIKKworY2QgYmluCitwYXVzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS9kb2MvXDM1MFwyMTNcMjQ1XDM0NFwyNzZcMjM1XDM0N1wyMTZcMjU3XDM0NVwyNDJcMjAzXDM0NFwyNzVcMjc3XDM0N1wyMjRcMjUwXDM0NlwyMTFcMjEzXDM0NVwyMDZcMjE0LmRvY3giICJiL2RvYy9cMzUwXDIxM1wyNDVcMzQ0XDI3NlwyMzVcMzQ3XDIxNlwyNTdcMzQ1XDI0MlwyMDNcMzQ0XDI3NVwyNzdcMzQ3XDIyNFwyNTBcMzQ2XDIxMVwyMTNcMzQ1XDIwNlwyMTQuZG9jeCIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0ZGFlZgotLS0gL2Rldi9udWxsCisrKyAiYi9kb2MvXDM1MFwyMTNcMjQ1XDM0NFwyNzZcMjM1XDM0N1wyMTZcMjU3XDM0NVwyNDJcMjAzXDM0NFwyNzVcMjc3XDM0N1wyMjRcMjUwXDM0NlwyMTFcMjEzXDM0NVwyMDZcMjE0LmRvY3giCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2E4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMjQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJCisgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnJ1b3lpPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjMuOC44PC92ZXJzaW9uPgorCisgICAgPG5hbWU+cnVveWk8L25hbWU+CisgICAgPHVybD5odHRwOi8vd3d3LnJ1b3lpLnZpcDwvdXJsPgorICAgIDxkZXNjcmlwdGlvbj7oi6Xkvp3nrqHnkIbns7vnu588L2Rlc2NyaXB0aW9uPgorICAgIAorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cnVveWkudmVyc2lvbj4zLjguODwvcnVveWkudmVyc2lvbj4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgICAgIDxwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRFbmNvZGluZz5VVEYtODwvcHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+CisgICAgICAgIDxqYXZhLnZlcnNpb24+MTc8L2phdmEudmVyc2lvbj4KKyAgICAgICAgPG1hdmVuLWphci1wbHVnaW4udmVyc2lvbj4zLjEuMTwvbWF2ZW4tamFyLXBsdWdpbi52ZXJzaW9uPgorICAgICAgICA8bXliYXRpcy1zcHJpbmctYm9vdC52ZXJzaW9uPjMuMC4zPC9teWJhdGlzLXNwcmluZy1ib290LnZlcnNpb24+CisgICAgICAgIDxkcnVpZC52ZXJzaW9uPjEuMi4yMzwvZHJ1aWQudmVyc2lvbj4KKyAgICAgICAgPGJpdHdhbGtlci52ZXJzaW9uPjEuMjE8L2JpdHdhbGtlci52ZXJzaW9uPgorICAgICAgICA8c3dhZ2dlci52ZXJzaW9uPjMuMC4wPC9zd2FnZ2VyLnZlcnNpb24+CisgICAgICAgIDxrYXB0Y2hhLnZlcnNpb24+Mi4zLjM8L2thcHRjaGEudmVyc2lvbj4KKyAgICAgICAgPHBhZ2VoZWxwZXIuYm9vdC52ZXJzaW9uPjIuMS4wPC9wYWdlaGVscGVyLmJvb3QudmVyc2lvbj4KKyAgICAgICAgPGZhc3Rqc29uLnZlcnNpb24+Mi4wLjQzPC9mYXN0anNvbi52ZXJzaW9uPgorICAgICAgICA8b3NoaS52ZXJzaW9uPjYuNi4zPC9vc2hpLnZlcnNpb24+CisgICAgICAgIDxjb21tb25zLmlvLnZlcnNpb24+Mi4xMy4wPC9jb21tb25zLmlvLnZlcnNpb24+CisgICAgICAgIDxwb2kudmVyc2lvbj40LjEuMjwvcG9pLnZlcnNpb24+CisgICAgICAgIDx2ZWxvY2l0eS52ZXJzaW9uPjIuMzwvdmVsb2NpdHkudmVyc2lvbj4KKyAgICAgICAgPGp3dC52ZXJzaW9uPjAuOS4xPC9qd3QudmVyc2lvbj4KKyAgICAgICAgPG15c3FsLnZlcnNpb24+OC4yLjA8L215c3FsLnZlcnNpb24+CisgICAgICAgIDxqYXhiLWFwaS52ZXJzaW9uPjIuMy4xPC9qYXhiLWFwaS52ZXJzaW9uPgorICAgICAgICA8amFrYXJ0YS52ZXJzaW9uPjYuMC4wPC9qYWthcnRhLnZlcnNpb24+CisgICAgICAgIDxzcHJpbmdkb2MudmVyc2lvbj4yLjUuMDwvc3ByaW5nZG9jLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPCEtLSDkvp3otZblo7DmmI4gLS0+CisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgICAgICA8IS0tIFNwcmluZ0Jvb3TnmoTkvp3otZbphY3nva4tLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1kZXBlbmRlbmNpZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4zLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgIDxzY29wZT5pbXBvcnQ8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIOmYv+mHjOaVsOaNruW6k+i/nuaOpeaxoCAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5hbGliYWJhPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRydWlkLXNwcmluZy1ib290LTMtc3RhcnRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2RydWlkLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIOino+aekOWuouaIt+err+aTjeS9nOezu+e7n+OAgea1j+iniOWZqOetiSAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmV1LmJpdHdhbGtlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5Vc2VyQWdlbnRVdGlsczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JpdHdhbGtlci52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPCEtLSBwYWdlaGVscGVyIOWIhumhteaPkuS7tiAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIucGFnZWhlbHBlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYWdlaGVscGVyLXNwcmluZy1ib290LXN0YXJ0ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwYWdlaGVscGVyLmJvb3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5teWJhdGlzLnNwcmluZy5ib290PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15YmF0aXMtc3ByaW5nLWJvb3Qtc3RhcnRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke215YmF0aXMtc3ByaW5nLWJvb3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5teXNxbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teXNxbC1jb25uZWN0b3ItajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke215c3FsLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pheGItYXBpLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pha2FydGEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g6I635Y+W57O757uf5L+h5oGvIC0tPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5vc2hpPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9zaGktY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke29zaGkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0gc3ByaW5nLWRvYyAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdkb2M8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nZG9jLW9wZW5hcGktc3RhcnRlci13ZWJtdmMtdWk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmdkb2MudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0gaW/luLjnlKjlt6XlhbfnsbsgLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmlvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIGV4Y2Vs5bel5YW3IC0tPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5wb2k8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cG9pLW9veG1sPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9pLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIHZlbG9jaXR55Luj56CB55Sf5oiQ5L2/55So5qih5p2/IC0tPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS52ZWxvY2l0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52ZWxvY2l0eS1lbmdpbmUtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3ZlbG9jaXR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIOmYv+mHjEpTT07op6PmnpDlmaggLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uYWxpYmFiYS5mYXN0anNvbjI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmFzdGpzb24yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZmFzdGpzb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0gVG9rZW7nlJ/miJDkuI7op6PmnpAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmlvLmpzb253ZWJ0b2tlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qand0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7and0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIOmqjOivgeeggSAtLT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPnByby5mZXNzaW9uYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+a2FwdGNoYTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2thcHRjaGEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g5a6a5pe25Lu75YqhLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktcXVhcnR6PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnVveWkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g5Luj56CB55Sf5oiQLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktZ2VuZXJhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnVveWkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g5qC45b+D5qih5Z2XLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktZnJhbWV3b3JrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnVveWkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g57O757uf5qih5Z2XLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktc3lzdGVtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnVveWkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0g6YCa55So5bel5YW3LS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnVveWkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPnJ1b3lpLWFkbWluPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cnVveWktZnJhbWV3b3JrPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cnVveWktc3lzdGVtPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cnVveWktcXVhcnR6PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cnVveWktZ2VuZXJhdG9yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cnVveWktY29tbW9uPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTMuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlcnM+dHJ1ZTwvcGFyYW1ldGVycz4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2phdmEudmVyc2lvbn08L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPiR7cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZ308L2VuY29kaW5nPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHJlcG9zaXRvcmllcz4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICA8aWQ+cHVibGljPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPmFsaXl1biBuZXh1czwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9tYXZlbi5hbGl5dW4uY29tL3JlcG9zaXRvcnkvcHVibGljPC91cmw+CisgICAgICAgICAgICA8cmVsZWFzZXM+CisgICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgICAgICAgIDwvcmVsZWFzZXM+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8L3JlcG9zaXRvcmllcz4KKworICAgIDxwbHVnaW5SZXBvc2l0b3JpZXM+CisgICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgorICAgICAgICAgICAgPGlkPnB1YmxpYzwvaWQ+CisgICAgICAgICAgICA8bmFtZT5hbGl5dW4gbmV4dXM8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vbWF2ZW4uYWxpeXVuLmNvbS9yZXBvc2l0b3J5L3B1YmxpYzwvdXJsPgorICAgICAgICAgICAgPHJlbGVhc2VzPgorICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICAgICAgICA8L3JlbGVhc2VzPgorICAgICAgICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKyAgICAgICAgICAgIDwvc25hcHNob3RzPgorICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+CisgICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZWRpdG9yY29uZmlnIGIvcmVhY3QtdWkvLmVkaXRvcmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTM2NDlhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmVkaXRvcmNvbmZpZwpAQCAtMCwwICsxLDE2IEBACisjIGh0dHA6Ly9lZGl0b3Jjb25maWcub3JnCityb290ID0gdHJ1ZQorCitbKl0KK2luZGVudF9zdHlsZSA9IHNwYWNlCitpbmRlbnRfc2l6ZSA9IDIKK2VuZF9vZl9saW5lID0gbGYKK2NoYXJzZXQgPSB1dGYtOAordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZQoraW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlCisKK1sqLm1kXQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworW01ha2VmaWxlXQoraW5kZW50X3N0eWxlID0gdGFiCmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZXNsaW50aWdub3JlIGIvcmVhY3QtdWkvLmVzbGludGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM2ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmVzbGludGlnbm9yZQpAQCAtMCwwICsxLDggQEAKKy9sYW1iZGEvCisvc2NyaXB0cworL2NvbmZpZworLmhpc3RvcnkKK3B1YmxpYworZGlzdAorLnVtaQorbW9jawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5lc2xpbnRyYy5qcyBiL3JlYWN0LXVpLy5lc2xpbnRyYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWMzOWVmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmVzbGludHJjLmpzCkBAIC0wLDAgKzEsNyBAQAorbW9kdWxlLmV4cG9ydHMgPSB7CisgIGV4dGVuZHM6IFtyZXF1aXJlLnJlc29sdmUoJ0B1bWlqcy9saW50L2Rpc3QvY29uZmlnL2VzbGludCcpXSwKKyAgZ2xvYmFsczogeworICAgIHBhZ2U6IHRydWUsCisgICAgUkVBQ1RfQVBQX0VOVjogdHJ1ZSwKKyAgfSwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZ2l0aHViL0ZVTkRJTkcueW1sIGIvcmVhY3QtdWkvLmdpdGh1Yi9GVU5ESU5HLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmIwMGUyCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmdpdGh1Yi9GVU5ESU5HLnltbApAQCAtMCwwICsxLDEyIEBACisjIFRoZXNlIGFyZSBzdXBwb3J0ZWQgZnVuZGluZyBtb2RlbCBwbGF0Zm9ybXMKKworZ2l0aHViOiAjIFJlcGxhY2Ugd2l0aCB1cCB0byA0IEdpdEh1YiBTcG9uc29ycy1lbmFibGVkIHVzZXJuYW1lcyBlLmcuLCBbdXNlcjEsIHVzZXIyXQorcGF0cmVvbjogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgUGF0cmVvbiB1c2VybmFtZQorb3Blbl9jb2xsZWN0aXZlOiBhbnQtZGVzaWduCitrb19maTogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgS28tZmkgdXNlcm5hbWUKK3RpZGVsaWZ0OiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBUaWRlbGlmdCBwbGF0Zm9ybS1uYW1lL3BhY2thZ2UtbmFtZSBlLmcuLCBucG0vYmFiZWwKK2NvbW11bml0eV9icmlkZ2U6ICMgUmVwbGFjZSB3aXRoIGEgc2luZ2xlIENvbW11bml0eSBCcmlkZ2UgcHJvamVjdC1uYW1lIGUuZy4sIGNsb3VkLWZvdW5kcnkKK2xpYmVyYXBheTogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgTGliZXJhcGF5IHVzZXJuYW1lCitpc3N1ZWh1bnQ6ICMgUmVwbGFjZSB3aXRoIGEgc2luZ2xlIElzc3VlSHVudCB1c2VybmFtZQorb3RlY2hpZTogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgT3RlY2hpZSB1c2VybmFtZQorY3VzdG9tOiAjIFJlcGxhY2Ugd2l0aCB1cCB0byA0IGN1c3RvbSBzcG9uc29yc2hpcCBVUkxzIGUuZy4sIFsnbGluazEnLCAnbGluazInXQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kIGIvcmVhY3QtdWkvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjI2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2J1Z19yZXBvcnQubWQKQEAgLTAsMCArMSw0OCBAQAorLS0tCituYW1lOiAn5oql5ZGKIEJ1ZyB8IFJlcG9ydCBidWcg8J+QmycKK2Fib3V0OiDmiqXlkYogQW50IERlc2lnbiBQcm8g55qEIGJ1ZwordGl0bGU6ICfwn5CbIFtCVUddJworbGFiZWxzOiAn8J+QmyBidWcnCithc3NpZ25lZXM6ICcnCistLS0KKworIyMjIPCfkJsgYnVnIOaPj+i/sAorCis8IS0tCivor6bnu4blnLDmj4/ov7AgYnVn77yM6K6p5aSn5a626YO96IO955CG6KejCitEZXNjcmliZSB0aGUgYnVnIGluIGRldGFpbCBzbyB0aGF0IGV2ZXJ5b25lIGNhbiB1bmRlcnN0YW5kIGl0CistLT4KKworIyMjIPCfk7cg5aSN546w5q2l6aqkIHwgUmVjdXJyZW5jZSBzdGVwcworCis8IS0tCivmuIXmmbDmj4/ov7DlpI3njrDmraXpqqTvvIzorqnliKvkurrkuZ/og73nnIvliLDpl67popgKK0NsZWFybHkgZGVzY3JpYmUgdGhlIHJlY3VycmVuY2Ugc3RlcHMgc28gdGhhdCBvdGhlcnMgY2FuIHNlZSB0aGUgcHJvYmxlbQorLS0+CisKKyMjIyDwn4+eIOacn+acm+e7k+aenCB8IEV4cGVjdGVkIHJlc3VsdHMKKworPCEtLQor5o+P6L+w5L2g5Y6f5pys5pyf5pyb55yL5Yiw55qE57uT5p6cCitEZXNjcmliZSB3aGF0IHlvdSBleHBlY3RlZCB0byBzZWUKKy0tPgorCisjIyMg8J+SuyDlpI3njrDku6PnoIEgfCBSZWN1cnJlbmNlIGNvZGUKKworPCEtLQor5o+Q5L6b5Y+v5aSN546w55qE5Luj56CB77yM5LuT5bqT77yM5oiW57q/5LiK56S65L6LCitQcm92aWRlIHJlcHJvZHVjaWJsZSBjb2RlLCB3YXJlaG91c2UsIG9yIG9ubGluZSBleGFtcGxlcworLS0+CisKKyMjIyDCqSDniYjmnKzkv6Hmga8KKworLSBBbnQgRGVzaWduIFBybyDniYjmnKw6IFtlLmcuIDQuMC4wXQorLSB1bWkg54mI5pysCistIOa1j+iniOWZqOeOr+WigworLSDlvIDlj5Hnjq/looMgW2UuZy4gbWFjIE9TXQorCisjIyMg8J+akSDlhbbku5bkv6Hmga8KKworPCEtLQor5aaC5oiq5Zu+562J5YW25LuW5L+h5oGv5Y+v5Lul6LS05Zyo6L+Z6YeMCistLT4KZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRodWIvSVNTVUVfVEVNUExBVEUvZmVhdHVyZV9yZXF1ZXN0Lm1kIGIvcmVhY3QtdWkvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9mZWF0dXJlX3JlcXVlc3QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiODY2YQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5naXRodWIvSVNTVUVfVEVNUExBVEUvZmVhdHVyZV9yZXF1ZXN0Lm1kCkBAIC0wLDAgKzEsMjggQEAKKy0tLQorbmFtZTogJ+WKn+iDvemcgOaxgiB8IEZlYXR1cmUgUmVxdWlyZW1lbnRzIOKcqCcKK2Fib3V0OiDlr7kgQW50IERlc2lnbiBQcm8gIOeahOmcgOaxguaIluW7uuiurgordGl0bGU6ICfwn5GRIFvpnIDmsYIgfCBGZWF0dXJlXScKK2xhYmVsczogJ/CfkZEgRmVhdHVyZSBSZXF1ZXN0JworYXNzaWduZWVzOiAnJworLS0tCisKKyMjIyDwn6WwIOmcgOaxguaPj+i/sCB8IFJlcXVpcmVtZW50cyBkZXNjcmlwdGlvbgorCis8IS0tCivor6bnu4blnLDmj4/ov7DpnIDmsYLvvIzorqnlpKflrrbpg73og73nkIbop6MKK0Rlc2NyaWJlIHRoZSByZXF1aXJlbWVudHMgaW4gZGV0YWlsIHNvIHRoYXQgZXZlcnlvbmUgY2FuIHVuZGVyc3RhbmQgdGhlbQorLS0+CisKKyMjIyDwn6eQIOino+WGs+aWueahiCB8IFNvbHV0aW9uCisKKzwhLS0KK+WmguaenOS9oOacieino+WGs+aWueahiO+8jOWcqOi/memHjOa4heaZsOWcsOmYkOi/sAorSWYgeW91IGhhdmUgYSBzb2x1dGlvbiwgZXhwbGFpbiBpdCBjbGVhcmx5IGhlcmUKKy0tPgorCisjIyMg8J+akSDlhbbku5bkv6Hmga8gfCBPdGhlciBpbmZvcm1hdGlvbgorCis8IS0tCivlpoLmiKrlm77nrYnlhbbku5bkv6Hmga/lj6/ku6XotLTlnKjov5nph4wKK090aGVyIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2NyZWVuc2hvdHMgY2FuIGJlIHBvc3RlZCBoZXJlCistLT4KZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRodWIvSVNTVUVfVEVNUExBVEUvcXVlc3Rpb24ubWQgYi9yZWFjdC11aS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL3F1ZXN0aW9uLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZmJlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL3F1ZXN0aW9uLm1kCkBAIC0wLDAgKzEsMzQgQEAKKy0tLQorbmFtZTogJ+eWkemXruaIlumcgOimgeW4ruWKqSB8IFF1ZXN0aW9ucyBvciBuZWVkIGhlbHAg4p2TJworYWJvdXQ6IOWvuSBBbnQgRGVzaWduIFBybyDkvb/nlKjnmoTnlpHpl67miJbpnIDopoHluK7liqkKK3RpdGxlOiAn8J+nkFvpl67popggfCBxdWVzdGlvbl0nCitsYWJlbHM6ICfwn6eQIHF1ZXN0aW9uJworYXNzaWduZWVzOiAnJworLS0tCisKKyMjIyDwn6eQIOmXrumimOaPj+i/sCB8IFByb2JsZW0gZGVzY3JpcHRpb24KKworPCEtLQor6K+m57uG5Zyw5o+P6L+w6Zeu6aKY77yM6K6p5aSn5a626YO96IO955CG6KejCitEZXNjcmliZSB0aGUgcHJvYmxlbSBpbiBkZXRhaWwgc28gdGhhdCBldmVyeW9uZSBjYW4gdW5kZXJzdGFuZCBpdAorLS0+CisKKyMjIyDwn5K7IOekuuS+i+S7o+eggSB8IFNhbXBsZSBjb2RlCisKKzwhLS0KK+S4gOS4quacgOWwj+WPr+mHjeeOsOeahOS7o+egge+8jOiuqeW8gOWPkeiAheWPr+S7peW/q+mAn+eahOWumuS9jemXrumimAorQSBtaW5pbWFsIHJlcHJvZHVjaWJsZSBjb2RlIHRoYXQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcXVpY2tseSBsb2NhdGUgcHJvYmxlbXMKKy0tPgorCisjIyMg8J+akSDlhbbku5bkv6Hmga8gfCBPdGhlciBpbmZvcm1hdGlvbgorCis8IS0tCivlpoLmiKrlm77nrYnlhbbku5bkv6Hmga/lj6/ku6XotLTlnKjov5nph4wKK090aGVyIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2NyZWVuc2hvdHMgY2FuIGJlIHBvc3RlZCBoZXJlCistLT4KKworT1M6CisKK05vZGXvvJoKKwor5rWP6KeI5ZmoIHwgYnJvd3Nlcu+8mgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZjU2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9jaS55bWwKQEAgLTAsMCArMSwzMCBAQAorbmFtZTogTm9kZSBDSQorCitvbjogW3B1c2gsIHB1bGxfcmVxdWVzdF0KKworcGVybWlzc2lvbnM6CisgIGNvbnRlbnRzOiByZWFkCisKK2pvYnM6CisgIGJ1aWxkOgorICAgIHJ1bnMtb246ICR7eyBtYXRyaXgub3MgfX0KKyAgICBzdHJhdGVneToKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgbm9kZV92ZXJzaW9uOiBbMTYueCwgMTQueF0KKyAgICAgICAgb3M6IFt1YnVudHUtbGF0ZXN0LCB3aW5kb3dzLWxhdGVzdCwgbWFjT1MtbGF0ZXN0XQorICAgIHN0ZXBzOgorICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYxCisgICAgICAtIG5hbWU6IFVzZSBOb2RlLmpzICR7eyBtYXRyaXgubm9kZV92ZXJzaW9uIH19CisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtbm9kZUB2MQorICAgICAgICB3aXRoOgorICAgICAgICAgIG5vZGUtdmVyc2lvbjogJHt7IG1hdHJpeC5ub2RlX3ZlcnNpb24gfX0KKyAgICAgIC0gcnVuOiBlY2hvICR7e2dpdGh1Yi5yZWZ9fQorICAgICAgLSBydW46IG5wbSBpbnN0YWxsCisgICAgICAtIHJ1bjogeWFybiBydW4gbGludAorICAgICAgLSBydW46IHlhcm4gcnVuIHRzYworICAgICAgLSBydW46IHlhcm4gcnVuIGJ1aWxkCisgICAgICAgIGVudjoKKyAgICAgICAgICBDSTogdHJ1ZQorICAgICAgICAgIFBST0dSRVNTOiBub25lCisgICAgICAgICAgTk9ERV9FTlY6IHRlc3QKKyAgICAgICAgICBOT0RFX09QVElPTlM6IC0tbWF4X29sZF9zcGFjZV9zaXplPTQwOTYKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL2NvZGVxbC55bWwgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9jb2RlcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWIzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9jb2RlcWwueW1sCkBAIC0wLDAgKzEsNDEgQEAKK25hbWU6ICJDb2RlUUwiCisKK29uOgorICBwdXNoOgorICAgIGJyYW5jaGVzOiBbICJtYXN0ZXIiIF0KKyAgcHVsbF9yZXF1ZXN0OgorICAgIGJyYW5jaGVzOiBbICJtYXN0ZXIiIF0KKyAgc2NoZWR1bGU6CisgICAgLSBjcm9uOiAiNDggMTIgKiAqIDIiCisKK2pvYnM6CisgIGFuYWx5emU6CisgICAgbmFtZTogQW5hbHl6ZQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBwZXJtaXNzaW9uczoKKyAgICAgIGFjdGlvbnM6IHJlYWQKKyAgICAgIGNvbnRlbnRzOiByZWFkCisgICAgICBzZWN1cml0eS1ldmVudHM6IHdyaXRlCisKKyAgICBzdHJhdGVneToKKyAgICAgIGZhaWwtZmFzdDogZmFsc2UKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgbGFuZ3VhZ2U6IFsgamF2YXNjcmlwdCBdCisKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogQ2hlY2tvdXQKKyAgICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEB2MworCisgICAgICAtIG5hbWU6IEluaXRpYWxpemUgQ29kZVFMCisgICAgICAgIHVzZXM6IGdpdGh1Yi9jb2RlcWwtYWN0aW9uL2luaXRAdjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBsYW5ndWFnZXM6ICR7eyBtYXRyaXgubGFuZ3VhZ2UgfX0KKyAgICAgICAgICBxdWVyaWVzOiArc2VjdXJpdHktYW5kLXF1YWxpdHkKKworICAgICAgLSBuYW1lOiBBdXRvYnVpbGQKKyAgICAgICAgdXNlczogZ2l0aHViL2NvZGVxbC1hY3Rpb24vYXV0b2J1aWxkQHYyCisKKyAgICAgIC0gbmFtZTogUGVyZm9ybSBDb2RlUUwgQW5hbHlzaXMKKyAgICAgICAgdXNlczogZ2l0aHViL2NvZGVxbC1hY3Rpb24vYW5hbHl6ZUB2MgorICAgICAgICB3aXRoOgorICAgICAgICAgIGNhdGVnb3J5OiAiL2xhbmd1YWdlOiR7eyBtYXRyaXgubGFuZ3VhZ2UgfX0iCmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9jb3ZlcmFnZS55bWwgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9jb3ZlcmFnZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0NTc1MwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL2NvdmVyYWdlLnltbApAQCAtMCwwICsxLDI3IEBACituYW1lOiBjb3ZlcmFnZSBDSQorCitvbjogW3B1c2gsIHB1bGxfcmVxdWVzdF0KKworcGVybWlzc2lvbnM6CisgIGNvbnRlbnRzOiByZWFkCisKK2pvYnM6CisgIGJ1aWxkOgorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MQorICAgICAgLSBuYW1lOiBVc2UgTm9kZS5qcyAxNi54CisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtbm9kZUB2MQorICAgICAgICB3aXRoOgorICAgICAgICAgIG5vZGUtdmVyc2lvbjogMTYueAorICAgICAgLSBydW46IGVjaG8gJHt7Z2l0aHViLnJlZn19CisgICAgICAtIHJ1bjogY3VybCAtZiBodHRwczovL2dldC5wbnBtLmlvL3Y2LjE2LmpzIHwgbm9kZSAtIGFkZCAtLWdsb2JhbCBwbnBtQDcKKyAgICAgIC0gcnVuOiBwbnBtIGNvbmZpZyBzZXQgc3RvcmUtZGlyIH4vLnBucG0tc3RvcmUKKyAgICAgIC0gcnVuOiBwbnBtIGluc3RhbGwgIC0tc3RyaWN0LXBlZXItZGVwZW5kZW5jaWVzPWZhbHNlCisgICAgICAtIHJ1bjogeWFybiBydW4gdGVzdDpjb3ZlcmFnZQorICAgICAgICBlbnY6CisgICAgICAgICAgQ0k6IHRydWUKKyAgICAgICAgICBQUk9HUkVTUzogbm9uZQorICAgICAgICAgIE5PREVfRU5WOiB0ZXN0CisgICAgICAgICAgTk9ERV9PUFRJT05TOiAtLW1heF9vbGRfc3BhY2Vfc2l6ZT00MDk2CisgICAgICAtIHJ1bjogYmFzaCA8KGN1cmwgLXMgaHR0cHM6Ly9jb2RlY292LmlvL2Jhc2gpCmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9lbW9qaS1oZWxwZXIueW1sIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvZW1vamktaGVscGVyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY1YTFhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvZW1vamktaGVscGVyLnltbApAQCAtMCwwICsxLDE0IEBACituYW1lOiBFbW9qaSBIZWxwZXIKKworb246CisgIHJlbGVhc2U6CisgICAgdHlwZXM6IFtwdWJsaXNoZWRdCisKK2pvYnM6CisgIGVtb2ppOgorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAgIC0gdXNlczogYWN0aW9ucy1jb29sL2Vtb2ppLWhlbHBlckB2MS4wLjAKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB0eXBlOiAncmVsZWFzZScKKyAgICAgICAgICBlbW9qaTogJysxLCBsYXVnaCwgaGVhcnQsIGhvb3JheSwgcm9ja2V0LCBleWVzJwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvaXNzdWUtbGFiZWxlZC55bWwgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9pc3N1ZS1sYWJlbGVkLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2U4YjVmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvaXNzdWUtbGFiZWxlZC55bWwKQEAgLTAsMCArMSwzNyBAQAorbmFtZTogSXNzdWUgbGFiZWxlZAorCitvbjoKKyAgaXNzdWVzOgorICAgIHR5cGVzOiBbbGFiZWxlZF0KKworam9iczoKKyAgcmVwbHktaGVscGVyOgorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogaGVscCB3YW50ZWQKKyAgICAgICAgaWY6IGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICfinaTvuI8gaGVscCB3YW50ZWQnIHx8IGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICfwn6SdV2VsY29tZSBQUicKKyAgICAgICAgdXNlczogYWN0aW9ucy1jb29sL2lzc3Vlcy1oZWxwZXJAdjEuMTEKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBhY3Rpb25zOiAnY3JlYXRlLWNvbW1lbnQnCisgICAgICAgICAgdG9rZW46ICR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fQorICAgICAgICAgIGlzc3VlLW51bWJlcjogJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfX0KKyAgICAgICAgICBib2R5OiB8CisgICAgICAgICAgICBIZWxsbyBAJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS51c2VyLmxvZ2luIH19LiBXZSB0b3RhbGx5IGxpa2UgeW91ciBwcm9wb3NhbC9mZWVkYmFjaywgd2VsY29tZSB0byBbc2VuZCB1cyBhIFB1bGwgUmVxdWVzdF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYXJ0aWNsZXMvY3JlYXRpbmctYS1wdWxsLXJlcXVlc3QpIGZvciBpdC4gUGxlYXNlIHByb3ZpZGUgY2hhbmdlbG9nL1R5cGVTY3JpcHQvZG9jdW1lbnRhdGlvbi90ZXN0IGNhc2VzIGlmIG5lZWRlZCBhbmQgbWFrZSBzdXJlIENJIHBhc3NlZCwgd2Ugd2lsbCByZXZpZXcgaXQgc29vbi4gV2UgYXBwcmVjaWF0ZSB5b3VyIGVmZm9ydCBpbiBhZHZhbmNlIGFuZCBsb29raW5nIGZvcndhcmQgdG8geW91ciBjb250cmlidXRpb24hCisKKyAgICAgICAgICAgIOS9oOWlvSBAJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS51c2VyLmxvZ2luIH1977yM5oiR5Lus5a6M5YWo5ZCM5oSP5L2g55qE5o+Q6K6uL+WPjemmiO+8jOasoui/juebtOaOpeWcqOatpOS7k+W6kyBb5Yib5bu65LiA5LiqIFB1bGwgUmVxdWVzdF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYXJ0aWNsZXMvY3JlYXRpbmctYS1wdWxsLXJlcXVlc3QpIOadpeino+WGs+i/meS4qumXrumimOOAguivt+WKoeW/heaPkOS+m+aUueWKqOaJgOmcgOebuOW6lOeahCBjaGFuZ2Vsb2fjgIFUeXBlU2NyaXB0IOWumuS5ieOAgea1i+ivleeUqOS+i+OAgeaWh+aho+etie+8jOW5tuehruS/nSBDSSDpgJrov4fvvIzmiJHku6zkvJrlsL3lv6vov5vooYwgUmV2aWV377yM5o+Q5YmN5oSf6LCi5ZKM5pyf5b6F5oKo55qE6LSh54yu44CCCisKKyAgICAgICAgICAgICFbZ2lwaHldKGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzUwNzYxNS82MjM0MjY2OC00NzM1ZGMwMC1iNTFhLTExZTktOTJhNy1kNDZmYmIxY2MwYzcuZ2lmKQorCisgICAgICAtIG5hbWU6IE5lZWQgUmVwcm9kdWNlCisgICAgICAgIGlmOiBnaXRodWIuZXZlbnQubGFiZWwubmFtZSA9PSAn8J+klCBOZWVkIFJlcHJvZHVjZScKKyAgICAgICAgdXNlczogYWN0aW9ucy1jb29sL2lzc3Vlcy1oZWxwZXJAdjEuMTEKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBhY3Rpb25zOiAnY3JlYXRlLWNvbW1lbnQnCisgICAgICAgICAgdG9rZW46ICR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fQorICAgICAgICAgIGlzc3VlLW51bWJlcjogJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfX0KKyAgICAgICAgICBib2R5OiB8CisgICAgICAgICAgICBIZWxsbyBAJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS51c2VyLmxvZ2luIH19LiBQbGVhc2UgcHJvdmlkZSBhIG9ubGluZSByZXByb2R1Y3Rpb24gYnkgZm9ya2luZyB0aGlzIGxpbmsgaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby8gb3IgYSBtaW5pbWFsIEdpdEh1YiByZXBvc2l0b3J5LgorCisgICAgICAgICAgICDkvaDlpb0gQCR7eyBnaXRodWIuZXZlbnQuaXNzdWUudXNlci5sb2dpbiB9fSwg5oiR5Lus6ZyA6KaB5L2g5o+Q5L6b5LiA5Liq5Zyo57q/55qE6YeN546w5a6e5L6L5Lul5L6/5LqO5oiR5Lus5biu5L2g5o6S5p+l6Zeu6aKY44CC5L2g5Y+v5Lul6YCa6L+H54K55Ye7IFvmraTlpIRdKGh0dHBzOi8vY29kZXNhbmRib3guaW8vKSDliJvlu7rkuIDkuKogY29kZXNhbmRib3gg5oiW6ICF5o+Q5L6b5LiA5Liq5pyA5bCP5YyW55qEIEdpdEh1YiDku5PlupPjgIIKKworICAgICAgICAgICAgIVtdKGh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL2FudGZpbmNkbi95OWt3ZzdEVkNkL3JlcHJvZHVjZS5naWYpCmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9pc3N1ZS1vcGVuLWNoZWNrLnltbCBiL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL2lzc3VlLW9wZW4tY2hlY2sueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDQyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9pc3N1ZS1vcGVuLWNoZWNrLnltbApAQCAtMCwwICsxLDM0IEBACituYW1lOiBJc3N1ZSBPcGVuIENoZWNrCisKK29uOgorICBpc3N1ZXM6CisgICAgdHlwZXM6IFtvcGVuZWQsIGVkaXRlZF0KKworam9iczoKKyAgY2hlY2staXNzdWU6CisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIHN0ZXBzOgorICAgICAgLSB1c2VzOiBhY3Rpb25zLWNvb2wvaXNzdWVzLWhlbHBlckB2Mi4yLjAKKyAgICAgICAgaWQ6IGNoZWNrCisgICAgICAgIHdpdGg6CisgICAgICAgICAgYWN0aW9uczogJ2NoZWNrLWlzc3VlJworICAgICAgICAgIGlzc3VlLW51bWJlcjogJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfX0KKyAgICAgICAgICB0aXRsZS1leGNsdWRlczogJ/CfkJsgW0JVR10sIPCfkZEgW+mcgOaxgiB8IEZlYXR1cmVdLCDwn6eQW+mXrumimCB8IHF1ZXN0aW9uXScKKworICAgICAgLSBpZjogc3RlcHMuY2hlY2sub3V0cHV0cy5jaGVjay1yZXN1bHQgPT0gJ2ZhbHNlJyAmJiBnaXRodWIuZXZlbnQuaXNzdWUuc3RhdGUgPT0gJ29wZW4nCisgICAgICAgIHVzZXM6IGFjdGlvbnMtY29vbC9pc3N1ZXMtaGVscGVyQHYyLjIuMAorICAgICAgICB3aXRoOgorICAgICAgICAgIGFjdGlvbnM6ICdjcmVhdGUtY29tbWVudCwgY2xvc2UtaXNzdWUnCisgICAgICAgICAgaXNzdWUtbnVtYmVyOiAke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB9fQorICAgICAgICAgIGJvZHk6IHwKKyAgICAgICAgICAgIOW9k+WJjSBJc3N1ZSDmnKrmo4DmtYvliLDmoIfpopjvvIzor7fop4TojIPloavlhpnvvIzosKLosKLvvIEKKworICAgICAgICAgICAgVGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IGlzc3VlIGlzIG5vdCBkZXRlY3RlZCwgcGxlYXNlIGZpbGwgaW4gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9ucywgdGhhbmsgeW91IQorCisgICAgICAtIGlmOiBzdGVwcy5jaGVjay5vdXRwdXRzLmNoZWNrLXJlc3VsdCA9PSAndHJ1ZScKKyAgICAgICAgdXNlczogYWN0aW9ucy1jb29sL2lzc3Vlcy1zaW1pbGFyaXR5LWFuYWx5c2lzQHYxCisgICAgICAgIHdpdGg6CisgICAgICAgICAgZmlsdGVyLXRocmVzaG9sZDogMC44CisgICAgICAgICAgdGl0bGUtZXhjbHVkZXM6ICfwn5CbW0JVR10sIPCfkZEgW+mcgOaxgiB8IEZlYXR1cmVdLCDwn6eQW+mXrumimCB8IHF1ZXN0aW9uXScKKyAgICAgICAgICBjb21tZW50LXRpdGxlOiAnIyMjIOS7peS4i+eahCBJc3N1ZXMg5Y+v6IO95Lya5biu5Yqp5Yiw5L2gIC8gVGhlIGZvbGxvd2luZyBpc3N1ZXMgbWF5IGhlbHAgeW91JworICAgICAgICAgIHNob3ctZm9vdGVyOiBmYWxzZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvcG5wbS55bWwgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9wbnBtLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JiMmU0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvcG5wbS55bWwKQEAgLTAsMCArMSwzMyBAQAorbmFtZTogTm9kZSBwbnBtIENJCisKK29uOiBbcHVzaCwgcHVsbF9yZXF1ZXN0XQorCitwZXJtaXNzaW9uczoKKyAgY29udGVudHM6IHJlYWQKKworam9iczoKKyAgYnVpbGQ6CisgICAgcnVucy1vbjogJHt7IG1hdHJpeC5vcyB9fQorICAgIHN0cmF0ZWd5OgorICAgICAgbWF0cml4OgorICAgICAgICBub2RlX3ZlcnNpb246IFsxNi54XQorICAgICAgICBvczogW3VidW50dS1sYXRlc3QsIHdpbmRvd3MtbGF0ZXN0LCBtYWNPUy1sYXRlc3RdCisgICAgc3RlcHM6CisgICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjEKKyAgICAgIC0gbmFtZTogVXNlIE5vZGUuanMgJHt7IG1hdHJpeC5ub2RlX3ZlcnNpb24gfX0KKyAgICAgICAgdXNlczogYWN0aW9ucy9zZXR1cC1ub2RlQHYxCisgICAgICAgIHdpdGg6CisgICAgICAgICAgbm9kZS12ZXJzaW9uOiAke3sgbWF0cml4Lm5vZGVfdmVyc2lvbiB9fQorICAgICAgLSBydW46IGVjaG8gJHt7Z2l0aHViLnJlZn19CisgICAgICAtIHJ1bjogY3VybCAtZiBodHRwczovL2dldC5wbnBtLmlvL3Y2LjE2LmpzIHwgbm9kZSAtIGFkZCAtLWdsb2JhbCBwbnBtQDcKKyAgICAgIC0gcnVuOiBwbnBtIGNvbmZpZyBzZXQgc3RvcmUtZGlyIH4vLnBucG0tc3RvcmUKKyAgICAgIC0gcnVuOiBwbnBtIGluc3RhbGwgIC0tc3RyaWN0LXBlZXItZGVwZW5kZW5jaWVzPWZhbHNlCisgICAgICAtIHJ1bjogcG5wbSBydW4gbGludAorICAgICAgLSBydW46IHBucG0gcnVuIHRzYworICAgICAgLSBydW46IHBucG0gcnVuIGJ1aWxkCisgICAgICAtIHJ1bjogcG5wbSBydW4gdGVzdAorICAgICAgICBlbnY6CisgICAgICAgICAgQ0k6IHRydWUKKyAgICAgICAgICBQUk9HUkVTUzogbm9uZQorICAgICAgICAgIE5PREVfRU5WOiB0ZXN0CisgICAgICAgICAgTk9ERV9PUFRJT05TOiAtLW1heF9vbGRfc3BhY2Vfc2l6ZT00MDk2CmRpZmYgLS1naXQgYS9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9wcmV2aWV3LWJ1aWxkLnltbCBiL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL3ByZXZpZXctYnVpbGQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjY3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aHViL3dvcmtmbG93cy9wcmV2aWV3LWJ1aWxkLnltbApAQCAtMCwwICsxLDQxIEBACituYW1lOiBQcmV2aWV3IEJ1aWxkCisKK29uOgorICBwdWxsX3JlcXVlc3Q6CisgICAgdHlwZXM6IFtvcGVuZWQsIHN5bmNocm9uaXplLCByZW9wZW5lZF0KKworcGVybWlzc2lvbnM6CisgIGNvbnRlbnRzOiByZWFkCisKK2pvYnM6CisgIGJ1aWxkLXByZXZpZXc6CisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorCisgICAgc3RlcHM6CisgICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICByZWY6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIH19CisKKyAgICAgIC0gbmFtZTogYnVpbGQKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgeWFybgorICAgICAgICAgIHlhcm4gYWRkIHVtaS1wbHVnaW4tcHJvIC0tc2F2ZQorICAgICAgICAgIHlhcm4gYnVpbGQKKworICAgICAgLSBuYW1lOiB1cGxvYWQgZGlzdCBhcnRpZmFjdAorICAgICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MgorICAgICAgICB3aXRoOgorICAgICAgICAgIG5hbWU6IGRpc3QKKyAgICAgICAgICBwYXRoOiBkaXN0LworICAgICAgICAgIHJldGVudGlvbi1kYXlzOiA1CisKKyAgICAgIC0gbmFtZTogU2F2ZSBQUiBudW1iZXIKKyAgICAgICAgaWY6ICR7eyBhbHdheXMoKSB9fQorICAgICAgICBydW46IGVjaG8gJHt7IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0gPiAuL3ByLWlkLnR4dAorCisgICAgICAtIG5hbWU6IFVwbG9hZCBQUiBudW1iZXIKKyAgICAgICAgaWY6ICR7eyBhbHdheXMoKSB9fQorICAgICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MgorICAgICAgICB3aXRoOgorICAgICAgICAgIG5hbWU6IHByCisgICAgICAgICAgcGF0aDogLi9wci1pZC50eHQKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL3ByZXZpZXctZGVwbG95LnltbCBiL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL3ByZXZpZXctZGVwbG95LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE2OTlmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvcHJldmlldy1kZXBsb3kueW1sCkBAIC0wLDAgKzEsMTAwIEBACituYW1lOiBQcmV2aWV3IERlcGxveQorCitvbjoKKyAgd29ya2Zsb3dfcnVuOgorICAgIHdvcmtmbG93czogWydQcmV2aWV3IEJ1aWxkJ10KKyAgICB0eXBlczoKKyAgICAgIC0gY29tcGxldGVkCisKK3Blcm1pc3Npb25zOgorICBjb250ZW50czogcmVhZAorCitqb2JzOgorICBzdWNjZXNzOgorICAgIHBlcm1pc3Npb25zOgorICAgICAgYWN0aW9uczogcmVhZCAjIGZvciBkYXdpZGQ2L2FjdGlvbi1kb3dubG9hZC1hcnRpZmFjdCB0byBxdWVyeSBhbmQgZG93bmxvYWQgYXJ0aWZhY3RzCisgICAgICBpc3N1ZXM6IHdyaXRlICMgZm9yIGFjdGlvbnMtY29vbC9tYWludGFpbi1vbmUtY29tbWVudCB0byBtb2RpZnkgb3IgY3JlYXRlIGlzc3VlIGNvbW1lbnRzCisgICAgICBwdWxsLXJlcXVlc3RzOiB3cml0ZSAjIGZvciBhY3Rpb25zLWNvb2wvbWFpbnRhaW4tb25lLWNvbW1lbnQgdG8gbW9kaWZ5IG9yIGNyZWF0ZSBQUiBjb21tZW50cworICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBpZjogZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5ldmVudCA9PSAncHVsbF9yZXF1ZXN0JyAmJiBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLmNvbmNsdXNpb24gPT0gJ3N1Y2Nlc3MnCisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IGRvd25sb2FkIHByIGFydGlmYWN0CisgICAgICAgIHVzZXM6IGRhd2lkZDYvYWN0aW9uLWRvd25sb2FkLWFydGlmYWN0QHYyCisgICAgICAgIHdpdGg6CisgICAgICAgICAgd29ya2Zsb3c6ICR7eyBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLndvcmtmbG93X2lkIH19CisgICAgICAgICAgbmFtZTogcHIKKworICAgICAgLSBuYW1lOiBzYXZlIFBSIGlkCisgICAgICAgIGlkOiBwcgorICAgICAgICBydW46IGVjaG8gIjo6c2V0LW91dHB1dCBuYW1lPWlkOjokKDxwci1pZC50eHQpIgorCisgICAgICAtIG5hbWU6IGRvd25sb2FkIGRpc3QgYXJ0aWZhY3QKKyAgICAgICAgdXNlczogZGF3aWRkNi9hY3Rpb24tZG93bmxvYWQtYXJ0aWZhY3RAdjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB3b3JrZmxvdzogJHt7IGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4ud29ya2Zsb3dfaWQgfX0KKyAgICAgICAgICB3b3JrZmxvd19jb25jbHVzaW9uOiBzdWNjZXNzCisgICAgICAgICAgbmFtZTogZGlzdAorCisgICAgICAtIG5hbWU6IHVwbG9hZCBzdXJnZSBzZXJ2aWNlCisgICAgICAgIGlkOiBkZXBsb3kKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgZXhwb3J0IERFUExPWV9ET01BSU49aHR0cHM6Ly9hbnQtZGVzaWduLXByby1wcmV2aWV3LXByLSR7eyBzdGVwcy5wci5vdXRwdXRzLmlkIH19LnN1cmdlLnNoCisgICAgICAgICAgbnB4IHN1cmdlIC0tcHJvamVjdCAuLyAtLWRvbWFpbiAkREVQTE9ZX0RPTUFJTiAtLXRva2VuICR7eyBzZWNyZXRzLlNVUkdFX1RPS0VOIH19CisKKyAgICAgIC0gbmFtZTogdXBkYXRlIHN0YXR1cyBjb21tZW50CisgICAgICAgIHVzZXM6IGFjdGlvbnMtY29vbC9tYWludGFpbi1vbmUtY29tbWVudEB2MS4yLjEKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB0b2tlbjogJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19CisgICAgICAgICAgYm9keTogfAorICAgICAgICAgICAg8J+OiiBQUiBQcmV2aWV3IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBidWlsdCBhbmQgZGVwbG95ZWQgdG8gaHR0cHM6Ly9hbnQtZGVzaWduLXByby1wcmV2aWV3LXByLSR7eyBzdGVwcy5wci5vdXRwdXRzLmlkIH19LnN1cmdlLnNoCisKKyAgICAgICAgICAgIDxpbWcgd2lkdGg9IjMwMCIgc3JjPSJodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS81MDc2MTUvOTAyNTAzNjYtODgyMzM5MDAtZGU2ZS0xMWVhLTk1YTUtODRmMDc2MmZmZDM5LnBuZyI+CisKKyAgICAgICAgICAgIDwhLS0gU3RpY2t5IFB1bGwgUmVxdWVzdCBDb21tZW50IC0tPgorICAgICAgICAgIGJvZHktaW5jbHVkZTogJzwhLS0gU3RpY2t5IFB1bGwgUmVxdWVzdCBDb21tZW50IC0tPicKKyAgICAgICAgICBudW1iZXI6ICR7eyBzdGVwcy5wci5vdXRwdXRzLmlkIH19CisKKyAgICAgIC0gbmFtZTogVGhlIGpvYiBmYWlsZWQKKyAgICAgICAgaWY6ICR7eyBmYWlsdXJlKCkgfX0KKyAgICAgICAgdXNlczogYWN0aW9ucy1jb29sL21haW50YWluLW9uZS1jb21tZW50QHYxLjIuMQorICAgICAgICB3aXRoOgorICAgICAgICAgIHRva2VuOiAke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0KKyAgICAgICAgICBib2R5OiB8CisgICAgICAgICAgICDwn5itIERlcGxveSBQUiBQcmV2aWV3IGZhaWxlZC4KKworICAgICAgICAgICAgPGltZyB3aWR0aD0iMzAwIiBzcmM9Imh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzUwNzYxNS85MDI1MDgyNC00ZTA2NjcwMC1kZTZmLTExZWEtODIzMC02MDBlY2MzZDZhNmIucG5nIj4KKworICAgICAgICAgICAgPCEtLSBTdGlja3kgUHVsbCBSZXF1ZXN0IENvbW1lbnQgLS0+CisgICAgICAgICAgYm9keS1pbmNsdWRlOiAnPCEtLSBTdGlja3kgUHVsbCBSZXF1ZXN0IENvbW1lbnQgLS0+JworICAgICAgICAgIG51bWJlcjogJHt7IHN0ZXBzLnByLm91dHB1dHMuaWQgfX0KKworICBmYWlsZWQ6CisgICAgcGVybWlzc2lvbnM6CisgICAgICBhY3Rpb25zOiByZWFkICMgZm9yIGRhd2lkZDYvYWN0aW9uLWRvd25sb2FkLWFydGlmYWN0IHRvIHF1ZXJ5IGFuZCBkb3dubG9hZCBhcnRpZmFjdHMKKyAgICAgIGlzc3Vlczogd3JpdGUgIyBmb3IgYWN0aW9ucy1jb29sL21haW50YWluLW9uZS1jb21tZW50IHRvIG1vZGlmeSBvciBjcmVhdGUgaXNzdWUgY29tbWVudHMKKyAgICAgIHB1bGwtcmVxdWVzdHM6IHdyaXRlICMgZm9yIGFjdGlvbnMtY29vbC9tYWludGFpbi1vbmUtY29tbWVudCB0byBtb2RpZnkgb3IgY3JlYXRlIFBSIGNvbW1lbnRzCisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIGlmOiBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLmV2ZW50ID09ICdwdWxsX3JlcXVlc3QnICYmIGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4uY29uY2x1c2lvbiA9PSAnZmFpbHVyZScKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogZG93bmxvYWQgcHIgYXJ0aWZhY3QKKyAgICAgICAgdXNlczogZGF3aWRkNi9hY3Rpb24tZG93bmxvYWQtYXJ0aWZhY3RAdjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB3b3JrZmxvdzogJHt7IGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4ud29ya2Zsb3dfaWQgfX0KKyAgICAgICAgICBuYW1lOiBwcgorCisgICAgICAtIG5hbWU6IHNhdmUgUFIgaWQKKyAgICAgICAgaWQ6IHByCisgICAgICAgIHJ1bjogZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9aWQ6OiQoPHByLWlkLnR4dCkiCisKKyAgICAgIC0gbmFtZTogVGhlIGpvYiBmYWlsZWQKKyAgICAgICAgdXNlczogYWN0aW9ucy1jb29sL21haW50YWluLW9uZS1jb21tZW50QHYxLjIuMQorICAgICAgICB3aXRoOgorICAgICAgICAgIHRva2VuOiAke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0KKyAgICAgICAgICBib2R5OiB8CisgICAgICAgICAgICDwn5itIERlcGxveSBQUiBQcmV2aWV3IGZhaWxlZC4KKworICAgICAgICAgICAgPGltZyB3aWR0aD0iMzAwIiBzcmM9Imh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzUwNzYxNS85MDI1MDgyNC00ZTA2NjcwMC1kZTZmLTExZWEtODIzMC02MDBlY2MzZDZhNmIucG5nIj4KKworICAgICAgICAgICAgPCEtLSBTdGlja3kgUHVsbCBSZXF1ZXN0IENvbW1lbnQgLS0+CisgICAgICAgICAgYm9keS1pbmNsdWRlOiAnPCEtLSBTdGlja3kgUHVsbCBSZXF1ZXN0IENvbW1lbnQgLS0+JworICAgICAgICAgIG51bWJlcjogJHt7IHN0ZXBzLnByLm91dHB1dHMuaWQgfX0KZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL3ByZXZpZXctc3RhcnQueW1sIGIvcmVhY3QtdWkvLmdpdGh1Yi93b3JrZmxvd3MvcHJldmlldy1zdGFydC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmNTYxZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5naXRodWIvd29ya2Zsb3dzL3ByZXZpZXctc3RhcnQueW1sCkBAIC0wLDAgKzEsMjQgQEAKK25hbWU6IFByZXZpZXcgU3RhcnQKKworb246IHB1bGxfcmVxdWVzdF90YXJnZXQKKworcGVybWlzc2lvbnM6CisgIGNvbnRlbnRzOiByZWFkCisKK2pvYnM6CisgIHByZXZpZXc6CisgICAgcGVybWlzc2lvbnM6CisgICAgICBpc3N1ZXM6IHdyaXRlICMgZm9yIGFjdGlvbnMtY29vbC9tYWludGFpbi1vbmUtY29tbWVudCB0byBtb2RpZnkgb3IgY3JlYXRlIGlzc3VlIGNvbW1lbnRzCisgICAgICBwdWxsLXJlcXVlc3RzOiB3cml0ZSAjIGZvciBhY3Rpb25zLWNvb2wvbWFpbnRhaW4tb25lLWNvbW1lbnQgdG8gbW9kaWZ5IG9yIGNyZWF0ZSBQUiBjb21tZW50cworICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogY3JlYXRlCisgICAgICAgIHVzZXM6IGFjdGlvbnMtY29vbC9tYWludGFpbi1vbmUtY29tbWVudEB2MS4yLjEKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB0b2tlbjogJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19CisgICAgICAgICAgYm9keTogfAorICAgICAgICAgICAg4pqh77iPIERlcGxveWluZyBQUiBQcmV2aWV3Li4uCisgICAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vNTA3NjE1LzkwMjQwMjk0LThkMmFiZDAwLWRlNWItMTFlYS04MTQwLTQ4NDBhMGIyZDU3MS5naWYiIHdpZHRoPSIzMDAiIC8+CisKKyAgICAgICAgICAgIDwhLS0gU3RpY2t5IFB1bGwgUmVxdWVzdCBDb21tZW50IC0tPgorICAgICAgICAgIGJvZHktaW5jbHVkZTogJzwhLS0gU3RpY2t5IFB1bGwgUmVxdWVzdCBDb21tZW50IC0tPicKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5naXRpZ25vcmUgYi9yZWFjdC11aS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2FkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDMgQEAKKyMgU2VlIGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2lnbm9yaW5nLWZpbGVzLyBmb3IgbW9yZSBhYm91dCBpZ25vcmluZyBmaWxlcy4KKworIyBkZXBlbmRlbmNpZXMKKyoqL25vZGVfbW9kdWxlcworIyByb2FkaG9nLWFwaS1kb2MgaWdub3JlCisvc3JjL3V0aWxzL3JlcXVlc3QtdGVtcC5qcworX3JvYWRob2ctYXBpLWRvYworCisjIHByb2R1Y3Rpb24KKy9kaXN0CisKKyMgbWlzYworLkRTX1N0b3JlCitucG0tZGVidWcubG9nKgoreWFybi1lcnJvci5sb2cKKworL2NvdmVyYWdlCisuaWRlYQoreWFybi5sb2NrCitwYWNrYWdlLWxvY2suanNvbgorKmJhaworLnZzY29kZQorCisKKyMgdmlzdWFsIHN0dWRpbyBjb2RlCisuaGlzdG9yeQorKi5sb2cKK2Z1bmN0aW9ucy8qCisudGVtcC8qKgorCisjIHVtaQorLnVtaQorLnVtaS1wcm9kdWN0aW9uCisudW1pLXRlc3QKKworIyBzY3JlZW5zaG90CitzY3JlZW5zaG90CisuZmlyZWJhc2UKKy5lc2xpbnRjYWNoZQorCitidWlsZAorCitwbnBtLWxvY2sueWFtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5odXNreS9jb21taXQtbXNnIGIvcmVhY3QtdWkvLmh1c2t5L2NvbW1pdC1tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0YWE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5odXNreS9jb21taXQtbXNnCkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL3NoCisuICIkKGRpcm5hbWUgIiQwIikvXy9odXNreS5zaCIKKworIyBFeHBvcnQgR2l0IGhvb2sgcGFyYW1zCitleHBvcnQgR0lUX1BBUkFNUz0kKgorCisjIG5weCAtLW5vLWluc3RhbGwgZmFicmljIHZlcmlmeS1jb21taXQKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5odXNreS9wcmUtY29tbWl0IGIvcmVhY3QtdWkvLmh1c2t5L3ByZS1jb21taXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0OTA3MgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5odXNreS9wcmUtY29tbWl0CkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisuICIkKGRpcm5hbWUgIiQwIikvXy9odXNreS5zaCIKKworIyBucHggLS1uby1pbnN0YWxsIGxpbnQtc3RhZ2VkCmRpZmYgLS1naXQgYS9yZWFjdC11aS8ucHJldHRpZXJpZ25vcmUgYi9yZWFjdC11aS8ucHJldHRpZXJpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5OWNjZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5wcmV0dGllcmlnbm9yZQpAQCAtMCwwICsxLDIyIEBACisqKi8qLnN2ZworLnVtaQorLnVtaS1wcm9kdWN0aW9uCisvZGlzdAorLmRvY2tlcmlnbm9yZQorLkRTX1N0b3JlCisuZXNsaW50aWdub3JlCisqLnBuZworKi50b21sCitkb2NrZXIKKy5lZGl0b3Jjb25maWcKK0RvY2tlcmZpbGUqCisuZ2l0aWdub3JlCisucHJldHRpZXJpZ25vcmUKK0xJQ0VOU0UKKy5lc2xpbnRjYWNoZQorKi5sb2NrCit5YXJuLWVycm9yLmxvZworLmhpc3RvcnkKK0NOQU1FCisvYnVpbGQKKy9wdWJsaWMKZGlmZiAtLWdpdCBhL3JlYWN0LXVpLy5wcmV0dGllcnJjLmpzIGIvcmVhY3QtdWkvLnByZXR0aWVycmMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0N2ExYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpLy5wcmV0dGllcnJjLmpzCkBAIC0wLDAgKzEsMjEgQEAKK21vZHVsZS5leHBvcnRzID0geworICBzaW5nbGVRdW90ZTogdHJ1ZSwKKyAgdHJhaWxpbmdDb21tYTogJ2FsbCcsCisgIHByaW50V2lkdGg6IDEwMCwKKyAgcHJvc2VXcmFwOiAnbmV2ZXInLAorICBlbmRPZkxpbmU6ICdsZicsCisgIG92ZXJyaWRlczogWworICAgIHsKKyAgICAgIGZpbGVzOiAnLnByZXR0aWVycmMnLAorICAgICAgb3B0aW9uczogeworICAgICAgICBwYXJzZXI6ICdqc29uJywKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICBmaWxlczogJ2RvY3VtZW50LmVqcycsCisgICAgICBvcHRpb25zOiB7CisgICAgICAgIHBhcnNlcjogJ2h0bWwnLAorICAgICAgfSwKKyAgICB9LAorICBdLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL0NPREVfT0ZfQ09ORFVDVC5tZCBiL3JlYWN0LXVpL0NPREVfT0ZfQ09ORFVDVC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQ1NzFjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvQ09ERV9PRl9DT05EVUNULm1kCkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29udHJpYnV0b3IgQ292ZW5hbnQgQ29kZSBvZiBDb25kdWN0CisKKyMjIE91ciBQbGVkZ2UKKworSW4gdGhlIGludGVyZXN0IG9mIGZvc3RlcmluZyBhbiBvcGVuIGFuZCB3ZWxjb21pbmcgZW52aXJvbm1lbnQsIHdlIGFzIGNvbnRyaWJ1dG9ycyBhbmQgbWFpbnRhaW5lcnMgcGxlZGdlIHRvIG1ha2luZyBwYXJ0aWNpcGF0aW9uIGluIG91ciBwcm9qZWN0IGFuZCBvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keSBzaXplLCBkaXNhYmlsaXR5LCBldGhuaWNpdHksIGdlbmRlciBpZGVudGl0eSBhbmQgZXhwcmVzc2lvbiwgbGV2ZWwgb2YgZXhwZXJpZW5jZSwgbmF0aW9uYWxpdHksIHBlcnNvbmFsIGFwcGVhcmFuY2UsIHJhY2UsIHJlbGlnaW9uLCBvciBzZXh1YWwgaWRlbnRpdHkgYW5kIG9yaWVudGF0aW9uLgorCisjIyBPdXIgU3RhbmRhcmRzCisKK0V4YW1wbGVzIG9mIGJlaGF2aW9yIHRoYXQgY29udHJpYnV0ZXMgdG8gY3JlYXRpbmcgYSBwb3NpdGl2ZSBlbnZpcm9ubWVudCBpbmNsdWRlOgorCistIFVzaW5nIHdlbGNvbWluZyBhbmQgaW5jbHVzaXZlIGxhbmd1YWdlCistIEJlaW5nIHJlc3BlY3RmdWwgb2YgZGlmZmVyaW5nIHZpZXdwb2ludHMgYW5kIGV4cGVyaWVuY2VzCistIEdyYWNlZnVsbHkgYWNjZXB0aW5nIGNvbnN0cnVjdGl2ZSBjcml0aWNpc20KKy0gRm9jdXNpbmcgb24gd2hhdCBpcyBiZXN0IGZvciB0aGUgY29tbXVuaXR5CistIFNob3dpbmcgZW1wYXRoeSB0b3dhcmRzIG90aGVyIGNvbW11bml0eSBtZW1iZXJzCisKK0V4YW1wbGVzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvciBieSBwYXJ0aWNpcGFudHMgaW5jbHVkZToKKworLSBUaGUgdXNlIG9mIHNleHVhbGl6ZWQgbGFuZ3VhZ2Ugb3IgaW1hZ2VyeSBhbmQgdW53ZWxjb21lIHNleHVhbCBhdHRlbnRpb24gb3IgYWR2YW5jZXMKKy0gVHJvbGxpbmcsIGluc3VsdGluZy9kZXJvZ2F0b3J5IGNvbW1lbnRzLCBhbmQgcGVyc29uYWwgb3IgcG9saXRpY2FsIGF0dGFja3MKKy0gUHVibGljIG9yIHByaXZhdGUgaGFyYXNzbWVudAorLSBQdWJsaXNoaW5nIG90aGVycycgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhIHBoeXNpY2FsIG9yIGVsZWN0cm9uaWMgYWRkcmVzcywgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCistIE90aGVyIGNvbmR1Y3Qgd2hpY2ggY291bGQgcmVhc29uYWJseSBiZSBjb25zaWRlcmVkIGluYXBwcm9wcmlhdGUgaW4gYSBwcm9mZXNzaW9uYWwgc2V0dGluZworCisjIyBPdXIgUmVzcG9uc2liaWxpdGllcworCitQcm9qZWN0IG1haW50YWluZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgY2xhcmlmeWluZyB0aGUgc3RhbmRhcmRzIG9mIGFjY2VwdGFibGUgYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluIHJlc3BvbnNlIHRvIGFueSBpbnN0YW5jZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yLgorCitQcm9qZWN0IG1haW50YWluZXJzIGhhdmUgdGhlIHJpZ2h0IGFuZCByZXNwb25zaWJpbGl0eSB0byByZW1vdmUsIGVkaXQsIG9yIHJlamVjdCBjb21tZW50cywgY29tbWl0cywgY29kZSwgd2lraSBlZGl0cywgaXNzdWVzLCBhbmQgb3RoZXIgY29udHJpYnV0aW9ucyB0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yIHBlcm1hbmVudGx5IGFueSBjb250cmlidXRvciBmb3Igb3RoZXIgYmVoYXZpb3JzIHRoYXQgdGhleSBkZWVtIGluYXBwcm9wcmlhdGUsIHRocmVhdGVuaW5nLCBvZmZlbnNpdmUsIG9yIGhhcm1mdWwuCisKKyMjIFNjb3BlCisKK1RoaXMgQ29kZSBvZiBDb25kdWN0IGFwcGxpZXMgYm90aCB3aXRoaW4gcHJvamVjdCBzcGFjZXMgYW5kIGluIHB1YmxpYyBzcGFjZXMgd2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZiByZXByZXNlbnRpbmcgYSBwcm9qZWN0IG9yIGNvbW11bml0eSBpbmNsdWRlIHVzaW5nIGFuIG9mZmljaWFsIHByb2plY3QgZS1tYWlsIGFkZHJlc3MsIHBvc3RpbmcgdmlhIGFuIG9mZmljaWFsIHNvY2lhbCBtZWRpYSBhY2NvdW50LCBvciBhY3RpbmcgYXMgYW4gYXBwb2ludGVkIHJlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlIGZ1cnRoZXIgZGVmaW5lZCBhbmQgY2xhcmlmaWVkIGJ5IHByb2plY3QgbWFpbnRhaW5lcnMuCisKKyMjIEVuZm9yY2VtZW50CisKK0luc3RhbmNlcyBvZiBhYnVzaXZlLCBoYXJhc3NpbmcsIG9yIG90aGVyd2lzZSB1bmFjY2VwdGFibGUgYmVoYXZpb3IgbWF5IGJlIHJlcG9ydGVkIGJ5IGNvbnRhY3RpbmcgdGhlIHByb2plY3QgdGVhbSBhdCBhZmMxNjNAZ21haWwuY29tLiBUaGUgcHJvamVjdCB0ZWFtIHdpbGwgcmV2aWV3IGFuZCBpbnZlc3RpZ2F0ZSBhbGwgY29tcGxhaW50cywgYW5kIHdpbGwgcmVzcG9uZCBpbiBhIHdheSB0aGF0IGl0IGRlZW1zIGFwcHJvcHJpYXRlIHRvIHRoZSBjaXJjdW1zdGFuY2VzLiBUaGUgcHJvamVjdCB0ZWFtIGlzIG9ibGlnYXRlZCB0byBtYWludGFpbiBjb25maWRlbnRpYWxpdHkgd2l0aCByZWdhcmQgdG8gdGhlIHJlcG9ydGVyIG9mIGFuIGluY2lkZW50LiBGdXJ0aGVyIGRldGFpbHMgb2Ygc3BlY2lmaWMgZW5mb3JjZW1lbnQgcG9saWNpZXMgbWF5IGJlIHBvc3RlZCBzZXBhcmF0ZWx5LgorCitQcm9qZWN0IG1haW50YWluZXJzIHdobyBkbyBub3QgZm9sbG93IG9yIGVuZm9yY2UgdGhlIENvZGUgb2YgQ29uZHVjdCBpbiBnb29kIGZhaXRoIG1heSBmYWNlIHRlbXBvcmFyeSBvciBwZXJtYW5lbnQgcmVwZXJjdXNzaW9ucyBhcyBkZXRlcm1pbmVkIGJ5IG90aGVyIG1lbWJlcnMgb2YgdGhlIHByb2plY3QncyBsZWFkZXJzaGlwLgorCisjIyBBdHRyaWJ1dGlvbgorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBpcyBhZGFwdGVkIGZyb20gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF1baG9tZXBhZ2VdLCB2ZXJzaW9uIDEuNCwgYXZhaWxhYmxlIGF0IFtodHRwOi8vY29udHJpYnV0b3ItY292ZW5hbnQub3JnL3ZlcnNpb24vMS80XVt2ZXJzaW9uXQorCitbaG9tZXBhZ2VdOiBodHRwOi8vY29udHJpYnV0b3ItY292ZW5hbnQub3JnCitbdmVyc2lvbl06IGh0dHA6Ly9jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzQvCmRpZmYgLS1naXQgYS9yZWFjdC11aS9MSUNFTlNFIGIvcmVhY3QtdWkvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU5NThlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvTElDRU5TRQpAQCAtMCwwICsxLDIxIEBACitNSVQgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTktcHJlc2VudCBBbGlwYXkuaW5jCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKK1NPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvUkVBRE1FLm1kIGIvcmVhY3QtdWkvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjRkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9SRUFETUUubWQKQEAgLTAsMCArMSwxMzMgQEAKK0xhbmd1YWdlIDog8J+HuvCfh7ggfCBb8J+HqPCfh7NdKC4vUkVBRE1FLnpoLUNOLm1kKSB8IFvwn4e38J+Hul0oLi9SRUFETUUucnUtUlUubWQpIHwgW/Cfh7nwn4e3XSguL1JFQURNRS50ci1UUi5tZCkgfCBb8J+Hr/Cfh7VdKC4vUkVBRE1FLmphLUpQLm1kKSB8IFvwn4er8J+Ht10oLi9SRUFETUUuZnItRlIubWQpIHwgW/Cfh7Xwn4e5XSguL1JFQURNRS5wdC1CUi5tZCkgfCBb8J+HuPCfh6ZdKC4vUkVBRE1FLmFyLURaLm1kKQorCis8aDEgYWxpZ249ImNlbnRlciI+QW50IERlc2lnbiBQcm88L2gxPgorCis8ZGl2IGFsaWduPSJjZW50ZXIiPgorCitBbiBvdXQtb2YtYm94IFVJIHNvbHV0aW9uIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcyBhIFJlYWN0IGJvaWxlcnBsYXRlLgorCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vZGV2LmF6dXJlLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24tcHJvL19hcGlzL2J1aWxkL3N0YXR1cy9hbnQtZGVzaWduLmFudC1kZXNpZ24tcHJvP2JyYW5jaE5hbWU9bWFzdGVyKV0oaHR0cHM6Ly9kZXYuYXp1cmUuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi1wcm8vX2J1aWxkL2xhdGVzdD9kZWZpbml0aW9uSWQ9MT9icmFuY2hOYW1lPW1hc3RlcikgIVtHaXRodWIgQWN0aW9uXShodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXByby93b3JrZmxvd3MvTm9kZSUyMENJL2JhZGdlLnN2ZykgIVtEZXBsb3ldKGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24tcHJvL3dvcmtmbG93cy9EZXBsb3klMjBDSS9iYWRnZS5zdmcpCisKK1shW0dpdHRlcl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXR0ZXIvcm9vbS9hbnQtZGVzaWduL3Byby1lbmdsaXNoLnN2Zz9zdHlsZT1mbGF0LXNxdWFyZSZsb2dvV2lkdGg9MjAmbG9nbz1kYXRhJTNBaW1hZ2UlMkZzdmclMkJ4bWwlM0JiYXNlNjQlMkNQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejROQ2p4emRtY2dlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJZ2QybGtkR2c5SWpFeU16VWlJR2hsYVdkb2REMGlOalV3SWlCMmFXVjNRbTk0UFNJd0lEQWdOelF4TUNBek9UQXdJajROQ2p4eVpXTjBJSGRwWkhSb1BTSTNOREV3SWlCb1pXbG5hSFE5SWpNNU1EQWlJR1pwYkd3OUlpTmlNakl5TXpRaUx6NE5Danh3WVhSb0lHUTlJazB3TERRMU1FZzNOREV3YlRBc05qQXdTREJ0TUN3Mk1EQklOelF4TUcwd0xEWXdNRWd3YlRBc05qQXdTRGMwTVRCdE1DdzJNREJJTUNJZ2MzUnliMnRsUFNJalptWm1JaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqTXdNQ0l2UGcwS1BISmxZM1FnZDJsa2RHZzlJakk1TmpRaUlHaGxhV2RvZEQwaU1qRXdNQ0lnWm1sc2JEMGlJek5qTTJJMlpTSXZQZzBLUEdjZ1ptbHNiRDBpSTJabVppSSUyQkRRbzhaeUJwWkQwaWN6RTRJajROQ2p4bklHbGtQU0p6T1NJJTJCRFFvOFp5QnBaRDBpY3pVaVBnMEtQR2NnYVdROUluTTBJajROQ2p4d1lYUm9JR2xrUFNKeklpQmtQU0pOTWpRM0xEa3dJRE14Tnk0MU16UXlNekFzTXpBM0xqQTRNakF6T1NBeE16SXVPRGN6TWpFNExERTNNaTQ1TVRjNU5qRklNell4TGpFeU5qYzRNa3d4TnpZdU5EWTFOemN3TERNd055NHdPREl3TXpsNklpOCUyQkRRbzhkWE5sSUhoc2FXNXJPbWh5WldZOUlpTnpJaUI1UFNJME1qQWlMejROQ2p4MWMyVWdlR3hwYm1zNmFISmxaajBpSTNNaUlIazlJamcwTUNJdlBnMEtQSFZ6WlNCNGJHbHVhenBvY21WbVBTSWpjeUlnZVQwaU1USTJNQ0l2UGcwS1BDOW5QZzBLUEhWelpTQjRiR2x1YXpwb2NtVm1QU0lqY3lJZ2VUMGlNVFk0TUNJdlBnMEtQQzluUGcwS1BIVnpaU0I0YkdsdWF6cG9jbVZtUFNJamN6UWlJSGc5SWpJME55SWdlVDBpTWpFd0lpOCUyQkRRbzhMMmMlMkJEUW84ZFhObElIaHNhVzVyT21oeVpXWTlJaU56T1NJZ2VEMGlORGswSWk4JTJCRFFvOEwyYyUyQkRRbzhkWE5sSUhoc2FXNXJPbWh5WldZOUlpTnpNVGdpSUhnOUlqazRPQ0l2UGcwS1BIVnpaU0I0YkdsdWF6cG9jbVZtUFNJamN6a2lJSGc5SWpFNU56WWlMejROQ2p4MWMyVWdlR3hwYm1zNmFISmxaajBpSTNNMUlpQjRQU0l5TkRjd0lpOCUyQkRRbzhMMmMlMkJEUW84TDNOMlp6NCUzRCldKGh0dHBzOi8vZ2l0dGVyLmltL2FudC1kZXNpZ24vcHJvLWVuZ2xpc2g/dXRtX3NvdXJjZT1iYWRnZSZ1dG1fbWVkaXVtPWJhZGdlJnV0bV9jYW1wYWlnbj1wci1iYWRnZSkgWyFbSm9pbiB0aGUgY2hhdCBhdCBodHRwczovL2dpdHRlci5pbS9hbnQtZGVzaWduL2FudC1kZXNpZ24tcHJvXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdHRlci9yb29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi1wcm8uc3ZnP3N0eWxlPWZsYXQtc3F1YXJlJmxvZ29XaWR0aD0yMCZsb2dvPWRhdGElM0FpbWFnZSUyRnN2ZyUyQnhtbCUzQmJhc2U2NCUyQ1BEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaVB6NE5Danh6ZG1jZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZDJsa2RHZzlJamt3TUNJZ2FHVnBaMmgwUFNJMk1EQWlJSFpwWlhkQ2IzZzlJakFnTUNBek1DQXlNQ0klMkJEUW84WkdWbWN6NE5Danh3WVhSb0lHbGtQU0p6SWlCa1BTSk5NQ3d0TVNBd0xqVTROemM0TlN3d0xqZ3dPVEF4TnlBdE1DNDVOVEV3TlRjc0xUQXVNekE1TURFM1NEQXVPVFV4TURVM1RDMHdMalU0TnpjNE5Td3dMamd3T1RBeE4zb2lJR1pwYkd3OUlpTm1abVJsTURBaUx6NE5Dand2WkdWbWN6NE5Danh5WldOMElIZHBaSFJvUFNJek1DSWdhR1ZwWjJoMFBTSXlNQ0lnWm1sc2JEMGlJMlJsTWpreE1DSXZQZzBLUEhWelpTQjRiR2x1YXpwb2NtVm1QU0lqY3lJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9OU3cxS1NCelkyRnNaU2d6S1NJdlBnMEtQSFZ6WlNCNGJHbHVhenBvY21WbVBTSWpjeUlnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb01UQXNNaWtnY205MFlYUmxLREl6TGpBek5qSTBNeWtpTHo0TkNqeDFjMlVnZUd4cGJtczZhSEpsWmowaUkzTWlJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RFeUxEUXBJSEp2ZEdGMFpTZzBOUzQ0TmprNE9UZ3BJaTglMkJEUW84ZFhObElIaHNhVzVyT21oeVpXWTlJaU56SWlCMGNtRnVjMlp2Y20wOUluUnlZVzV6YkdGMFpTZ3hNaXczS1NCeWIzUmhkR1VvTmprdU9UUTFNemsyS1NJdlBnMEtQSFZ6WlNCNGJHbHVhenBvY21WbVBTSWpjeUlnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb01UQXNPU2tnY205MFlYUmxLREl3TGpZMU9UZ3dPQ2tpTHo0TkNqd3ZjM1puUGclM0QlM0QpXShodHRwczovL2dpdHRlci5pbS9hbnQtZGVzaWduL2FudC1kZXNpZ24tcHJvP3V0bV9zb3VyY2U9YmFkZ2UmdXRtX21lZGl1bT1iYWRnZSZ1dG1fY2FtcGFpZ249cHItYmFkZ2UpIFshW0J1aWxkIFdpdGggVW1pXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2J1aWxkJTIwd2l0aC11bWktMDI4ZmU0LnN2Zz9zdHlsZT1mbGF0LXNxdWFyZSldKGh0dHA6Ly91bWlqcy5vcmcvKSAhW10oaHR0cHM6Ly9iYWRnZW4ubmV0L2JhZGdlL2ljb24vQW50JTIwRGVzaWduP2ljb249aHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYW50ZmluY2RuL1BwNFdQZ1ZEQjMvS0RwZ3ZndU1wR2ZxYUhQamljUksuc3ZnJmxhYmVsKQorCishW10oaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vODE4NjY2NC80NDk1MzE5NS01ODFlM2Q4MC1hZWM0LTExZTgtOGRjYi01NGI5ZGIzOGVjMTEucG5nKQorCis8L2Rpdj4KKworLSBQcmV2aWV3OiBodHRwOi8vcHJldmlldy5wcm8uYW50LmRlc2lnbgorLSBIb21lIFBhZ2U6IGh0dHA6Ly9wcm8uYW50LmRlc2lnbgorLSBEb2N1bWVudGF0aW9uOiBodHRwOi8vcHJvLmFudC5kZXNpZ24vZG9jcy9nZXR0aW5nLXN0YXJ0ZWQKKy0gQ2hhbmdlTG9nOiBodHRwOi8vcHJvLmFudC5kZXNpZ24vZG9jcy9jaGFuZ2Vsb2cKKy0gRkFROiBodHRwOi8vcHJvLmFudC5kZXNpZ24vZG9jcy9mYXEKKy0gTWlycm9yIFNpdGUgaW4gQ2hpbmE6IGh0dHA6Ly9hbnQtZGVzaWduLXByby5naXRlZS5pbworCisjIyA1LjAgaXMgb3V0ISDwn46J8J+OifCfjokKKworW0FudCBEZXNpZ24gUHJvIDUuMC4wXShodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXByby9pc3N1ZXMvODY1NikKKworIyMgVHJhbnNsYXRpb24gUmVjcnVpdG1lbnQgOmxvdWRzcGVha2VyOgorCitXZSBuZWVkIHlvdXIgaGVscDogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi1wcm8vaXNzdWVzLzEyMAorCisjIyBGZWF0dXJlcworCistIDpidWxiOiAqKlR5cGVTY3JpcHQqKjogQSBsYW5ndWFnZSBmb3IgYXBwbGljYXRpb24tc2NhbGUgSmF2YVNjcmlwdAorLSA6c2Nyb2xsOiAqKkJsb2NrcyoqOiBCdWlsZCBwYWdlIHdpdGggYmxvY2sgdGVtcGxhdGUKKy0gOmdlbTogKipOZWF0IERlc2lnbioqOiBGb2xsb3cgW0FudCBEZXNpZ24gc3BlY2lmaWNhdGlvbl0oaHR0cDovL2FudC5kZXNpZ24vKQorLSA6dHJpYW5ndWxhcl9ydWxlcjogKipDb21tb24gVGVtcGxhdGVzKio6IFR5cGljYWwgdGVtcGxhdGVzIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucworLSA6cm9ja2V0OiAqKlN0YXRlIG9mIFRoZSBBcnQgRGV2ZWxvcG1lbnQqKjogTmV3ZXN0IGRldmVsb3BtZW50IHN0YWNrIG9mIFJlYWN0L3VtaS9kdmEvYW50ZAorLSA6aXBob25lOiAqKlJlc3BvbnNpdmUqKjogRGVzaWduZWQgZm9yIHZhcmlhYmxlIHNjcmVlbiBzaXplcworLSA6YXJ0OiAqKlRoZW1pbmcqKjogQ3VzdG9taXphYmxlIHRoZW1lIHdpdGggc2ltcGxlIGNvbmZpZworLSA6Z2xvYmVfd2l0aF9tZXJpZGlhbnM6ICoqSW50ZXJuYXRpb25hbCoqOiBCdWlsdC1pbiBpMThuIHNvbHV0aW9uCistIDpnZWFyOiAqKkJlc3QgUHJhY3RpY2VzKio6IFNvbGlkIHdvcmtmbG93IHRvIG1ha2UgeW91ciBjb2RlIGhlYWx0aHkKKy0gOjEyMzQ6ICoqTW9jayBkZXZlbG9wbWVudCoqOiBFYXN5IHRvIHVzZSBtb2NrIGRldmVsb3BtZW50IHNvbHV0aW9uCistIDp3aGl0ZV9jaGVja19tYXJrOiAqKlVJIFRlc3QqKjogRmx5IHNhZmVseSB3aXRoIHVuaXQgYW5kIGUyZSB0ZXN0cworCisjIyBUZW1wbGF0ZXMKKworYGBgCistIERhc2hib2FyZAorICAtIEFuYWx5dGljCisgIC0gTW9uaXRvcgorICAtIFdvcmtzcGFjZQorLSBGb3JtCisgIC0gQmFzaWMgRm9ybQorICAtIFN0ZXAgRm9ybQorICAtIEFkdmFuY2VkIEZyb20KKy0gTGlzdAorICAtIFN0YW5kYXJkIFRhYmxlCisgIC0gU3RhbmRhcmQgTGlzdAorICAtIENhcmQgTGlzdAorICAtIFNlYXJjaCBMaXN0IChQcm9qZWN0L0FwcGxpY2F0aW9ucy9BcnRpY2xlKQorLSBQcm9maWxlCisgIC0gU2ltcGxlIFByb2ZpbGUKKyAgLSBBZHZhbmNlZCBQcm9maWxlCistIEFjY291bnQKKyAgLSBBY2NvdW50IENlbnRlcgorICAtIEFjY291bnQgU2V0dGluZ3MKKy0gUmVzdWx0CisgIC0gU3VjY2VzcworICAtIEZhaWxlZAorLSBFeGNlcHRpb24KKyAgLSA0MDMKKyAgLSA0MDQKKyAgLSA1MDAKKy0gVXNlcgorICAtIExvZ2luCisgIC0gUmVnaXN0ZXIKKyAgLSBSZWdpc3RlciBSZXN1bHQKK2BgYAorCisjIyBVc2FnZQorCisjIyMgVXNlIGJhc2gKKworV2UgcHJvdmlkZSBwcm8tY2xpIHRvIHF1aWNrbHkgaW5pdGlhbGl6ZSBzY2FmZm9sZGluZy4KKworYGBgYmFzaAorIyB1c2UgbnBtCitucG0gaSBAYW50LWRlc2lnbi9wcm8tY2xpIC1nCitwcm8gY3JlYXRlIG15YXBwCitgYGAKKworc2VsZWN0IHVtaSB2ZXJzaW9uCisKK2BgYHNoZWxsCivwn5CCIFVzZSB1bWlANCBvciB1bWlAMyA/IChVc2UgYXJyb3cga2V5cykKK+KdryB1bWlANAorICB1bWlAMworYGBgCisKKz4gSWYgdGhlIHVtaUA0IHZlcnNpb24gaXMgc2VsZWN0ZWQsIGZ1bGwgYmxvY2tzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4KKworSWYgeW91IGNob29zZSB1bWlAMywgeW91IGNhbiBhbHNvIGNob29zZSB0aGUgcHJvIHRlbXBsYXRlLiBQcm8gaXMgdGhlIGJhc2ljIHRlbXBsYXRlLCB3aGljaCBvbmx5IHByb3ZpZGVzIHRoZSBiYXNpYyBjb250ZW50IG9mIHRoZSBmcmFtZXdvcmsgb3BlcmF0aW9uLiBDb21wbGV0ZSBjb250YWlucyBhbGwgYmxvY2tzLCB3aGljaCBpcyBub3Qgc3VpdGFibGUgZm9yIHNlY29uZGFyeSBkZXZlbG9wbWVudCBhcyBhIGJhc2ljIHRlbXBsYXRlLgorCitgYGBzaGVsbAorPyDwn5qAIEZ1bGwgb3IgYSBzaW1wbGUgc2NhZmZvbGQ/IChVc2UgYXJyb3cga2V5cykKK+KdryBzaW1wbGUKKyAgY29tcGxldGUKK2BgYAorCitJbnN0YWxsIGRlcGVuZGVuY2llczoKKworYGBgc2hlbGwKKyQgY2QgbXlhcHAgJiYgdHlhcm4KKy8vIG9yCiskIGNkIG15YXBwICYmIG5wbSBpbnN0YWxsCitgYGAKKworIyMgQnJvd3NlcnMgc3VwcG9ydAorCitNb2Rlcm4gYnJvd3NlcnMuCisKK3wgWzxpbWcgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWxycmEvYnJvd3Nlci1sb2dvcy9tYXN0ZXIvc3JjL2VkZ2UvZWRnZV80OHg0OC5wbmciIGFsdD0iRWRnZSIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgLz5dKGh0dHA6Ly9nb2RiYW4uZ2l0aHViLmlvL2Jyb3dzZXJzLXN1cHBvcnQtYmFkZ2VzLyk8L2JyPkVkZ2UgfCBbPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbHJyYS9icm93c2VyLWxvZ29zL21hc3Rlci9zcmMvZmlyZWZveC9maXJlZm94XzQ4eDQ4LnBuZyIgYWx0PSJGaXJlZm94IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiAvPl0oaHR0cDovL2dvZGJhbi5naXRodWIuaW8vYnJvd3NlcnMtc3VwcG9ydC1iYWRnZXMvKTwvYnI+RmlyZWZveCB8IFs8aW1nIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FscnJhL2Jyb3dzZXItbG9nb3MvbWFzdGVyL3NyYy9jaHJvbWUvY2hyb21lXzQ4eDQ4LnBuZyIgYWx0PSJDaHJvbWUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIC8+XShodHRwOi8vZ29kYmFuLmdpdGh1Yi5pby9icm93c2Vycy1zdXBwb3J0LWJhZGdlcy8pPC9icj5DaHJvbWUgfCBbPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbHJyYS9icm93c2VyLWxvZ29zL21hc3Rlci9zcmMvc2FmYXJpL3NhZmFyaV80OHg0OC5wbmciIGFsdD0iU2FmYXJpIiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiAvPl0oaHR0cDovL2dvZGJhbi5naXRodWIuaW8vYnJvd3NlcnMtc3VwcG9ydC1iYWRnZXMvKTwvYnI+U2FmYXJpIHwgWzxpbWcgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWxycmEvYnJvd3Nlci1sb2dvcy9tYXN0ZXIvc3JjL29wZXJhL29wZXJhXzQ4eDQ4LnBuZyIgYWx0PSJPcGVyYSIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgLz5dKGh0dHA6Ly9nb2RiYW4uZ2l0aHViLmlvL2Jyb3dzZXJzLXN1cHBvcnQtYmFkZ2VzLyk8L2JyPk9wZXJhIHwKK3wgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHwKK3wgRWRnZSB8IGxhc3QgMiB2ZXJzaW9ucyB8IGxhc3QgMiB2ZXJzaW9ucyB8IGxhc3QgMiB2ZXJzaW9ucyB8IGxhc3QgMiB2ZXJzaW9ucyB8CisKKyMjIENvbnRyaWJ1dGluZworCitBbnkgdHlwZSBvZiBjb250cmlidXRpb24gaXMgd2VsY29tZSwgaGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgeW91IG1heSBjb250cmlidXRlIHRvIHRoaXMgcHJvamVjdDoKKworLSBVc2UgQW50IERlc2lnbiBQcm8gaW4geW91ciBkYWlseSB3b3JrLgorLSBTdWJtaXQgW2lzc3Vlc10oaHR0cDovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXByby9pc3N1ZXMpIHRvIHJlcG9ydCBidWdzIG9yIGFzayBxdWVzdGlvbnMuCistIFByb3Bvc2UgW3B1bGwgcmVxdWVzdHNdKGh0dHA6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi1wcm8vcHVsbHMpIHRvIGltcHJvdmUgb3VyIGNvZGUuCmRpZmYgLS1naXQgYS9yZWFjdC11aS9jb25maWcvY29uZmlnLnRzIGIvcmVhY3QtdWkvY29uZmlnL2NvbmZpZy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDAwNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvY29uZmlnL2NvbmZpZy50cwpAQCAtMCwwICsxLDE1NiBAQAorLy8gaHR0cHM6Ly91bWlqcy5vcmcvY29uZmlnLworaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7CitpbXBvcnQgZGVmYXVsdFNldHRpbmdzIGZyb20gJy4vZGVmYXVsdFNldHRpbmdzJzsKK2ltcG9ydCBwcm94eSBmcm9tICcuL3Byb3h5JzsKK2ltcG9ydCByb3V0ZXMgZnJvbSAnLi9yb3V0ZXMnOworCitjb25zdCB7IFJFQUNUX0FQUF9FTlYgPSAnZGV2JyB9ID0gcHJvY2Vzcy5lbnY7CisKK2V4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7CisgIC8qKgorICAgKiBAbmFtZSDlvIDlkK8gaGFzaCDmqKHlvI8KKyAgICogQGRlc2NyaXB0aW9uIOiuqSBidWlsZCDkuYvlkI7nmoTkuqfnianljIXlkKsgaGFzaCDlkI7nvIDjgILpgJrluLjnlKjkuo7lop7ph4/lj5HluIPlkozpgb/lhY3mtY/op4jlmajliqDovb3nvJPlrZjjgIIKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL2FwaS9jb25maWcjaGFzaAorICAgKi8KKyAgaGFzaDogdHJ1ZSwKKworICAvKioKKyAgICogQG5hbWUg5YW85a655oCn6K6+572uCisgICAqIEBkZXNjcmlwdGlvbiDorr7nva4gaWUxMSDkuI3kuIDlrprlroznvo7lhbzlrrnvvIzpnIDopoHmo4Dmn6Xoh6rlt7Hkvb/nlKjnmoTmiYDmnInkvp3otZYKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL2FwaS9jb25maWcjdGFyZ2V0cworICAgKi8KKyAgLy8gdGFyZ2V0czogeworICAvLyAgIGllOiAxMSwKKyAgLy8gfSwKKyAgLyoqCisgICAqIEBuYW1lIOi3r+eUseeahOmFjee9ru+8jOS4jeWcqOi3r+eUseS4reW8leWFpeeahOaWh+S7tuS4jeS8mue8luivkQorICAgKiBAZGVzY3JpcHRpb24g5Y+q5pSv5oyBIHBhdGjvvIxjb21wb25lbnTvvIxyb3V0ZXPvvIxyZWRpcmVjdO+8jHdyYXBwZXJz77yMdGl0bGUg55qE6YWN572uCisgICAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9ndWlkZXMvcm91dGVzCisgICAqLworICAvLyB1bWkgcm91dGVzOiBodHRwczovL3VtaWpzLm9yZy9kb2NzL3JvdXRpbmcKKyAgcm91dGVzLAorICAvKioKKyAgICogQG5hbWUg5Li76aKY55qE6YWN572uCisgICAqIEBkZXNjcmlwdGlvbiDomb3nhLblj6vkuLvpopjvvIzkvYbmmK/lhbblrp7lj6rmmK8gbGVzcyDnmoTlj5jph4/orr7nva4KKyAgICogQGRvYyBhbnRk55qE5Li76aKY6K6+572uIGh0dHBzOi8vYW50LmRlc2lnbi9kb2NzL3JlYWN0L2N1c3RvbWl6ZS10aGVtZS1jbgorICAgKiBAZG9jIHVtaSDnmoR0aGVtZSDphY3nva4gaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9hcGkvY29uZmlnI3RoZW1lCisgICAqLworICB0aGVtZTogeworICAgIC8vIOWmguaenOS4jeaDs+imgSBjb25maWdQcm92aWRlIOWKqOaAgeiuvue9ruS4u+mimOmcgOimgeaKiui/meS4quiuvue9ruS4uiBkZWZhdWx0CisgICAgLy8g5Y+q5pyJ6K6+572u5Li6IHZhcmlhYmxl77yMIOaJjeiDveS9v+eUqCBjb25maWdQcm92aWRlIOWKqOaAgeiuvue9ruS4u+iJsuiwgworICAgICdyb290LWVudHJ5LW5hbWUnOiAndmFyaWFibGUnLAorICB9LAorICAvKioKKyAgICogQG5hbWUgbW9tZW50IOeahOWbvemZheWMlumFjee9rgorICAgKiBAZGVzY3JpcHRpb24g5aaC5p6c5a+55Zu96ZmF5YyW5rKh5pyJ6KaB5rGC77yM5omT5byA5LmL5ZCO6IO95YeP5bCRanPnmoTljIXlpKflsI8KKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL2FwaS9jb25maWcjaWdub3JlbW9tZW50bG9jYWxlCisgICAqLworICBpZ25vcmVNb21lbnRMb2NhbGU6IHRydWUsCisgIC8qKgorICAgKiBAbmFtZSDku6PnkIbphY3nva4KKyAgICogQGRlc2NyaXB0aW9uIOWPr+S7peiuqeS9oOeahOacrOWcsOacjeWKoeWZqOS7o+eQhuWIsOS9oOeahOacjeWKoeWZqOS4iu+8jOi/meagt+S9oOWwseWPr+S7peiuv+mXruacjeWKoeWZqOeahOaVsOaNruS6hgorICAgKiBAc2VlIOimgeazqOaEj+S7peS4iyDku6PnkIblj6rog73lnKjmnKzlnLDlvIDlj5Hml7bkvb/nlKjvvIxidWlsZCDkuYvlkI7lsLHml6Dms5Xkvb/nlKjkuobjgIIKKyAgICogQGRvYyDku6PnkIbku4vnu40gaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9ndWlkZXMvcHJveHkKKyAgICogQGRvYyDku6PnkIbphY3nva4gaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9hcGkvY29uZmlnI3Byb3h5CisgICAqLworICBwcm94eTogcHJveHlbUkVBQ1RfQVBQX0VOViBhcyBrZXlvZiB0eXBlb2YgcHJveHldLAorICAvKioKKyAgICogQG5hbWUg5b+r6YCf54Ot5pu05paw6YWN572uCisgICAqIEBkZXNjcmlwdGlvbiDkuIDkuKrkuI3plJnnmoTng63mm7TmlrDnu4Tku7bvvIzmm7TmlrDml7blj6/ku6Xkv53nlZkgc3RhdGUKKyAgICovCisgIGZhc3RSZWZyZXNoOiB0cnVlLAorICAvLz09PT09PT09PT09PT09IOS7peS4i+mDveaYr21heOeahOaPkuS7tumFjee9riA9PT09PT09PT09PT09PT0KKyAgLyoqCisgICAqIEBuYW1lIOaVsOaNrua1geaPkuS7tgorICAgKiBAQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL21heC9kYXRhLWZsb3cKKyAgICovCisgIG1vZGVsOiB7fSwKKyAgLyoqCisgICAqIOS4gOS4quWFqOWxgOeahOWIneWni+aVsOaNrua1ge+8jOWPr+S7peeUqOWug+WcqOaPkuS7tuS5i+mXtOWFseS6q+aVsOaNrgorICAgKiBAZGVzY3JpcHRpb24g5Y+v5Lul55So5p2l5a2Y5pS+5LiA5Lqb5YWo5bGA55qE5pWw5o2u77yM5q+U5aaC55So5oi35L+h5oGv77yM5oiW6ICF5LiA5Lqb5YWo5bGA55qE54q25oCB77yM5YWo5bGA5Yid5aeL54q25oCB5Zyo5pW05LiqIFVtaSDpobnnm67nmoTmnIDlvIDlp4vliJvlu7rjgIIKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL21heC9kYXRhLWZsb3cjJUU1JTg1JUE4JUU1JUIxJTgwJUU1JTg4JTlEJUU1JUE3JThCJUU3JThBJUI2JUU2JTgwJTgxCisgICAqLworICBpbml0aWFsU3RhdGU6IHt9LAorICAvKioKKyAgICogQG5hbWUgbGF5b3V0IOaPkuS7tgorICAgKiBAZG9jIGh0dHBzOi8vdW1panMub3JnL2RvY3MvbWF4L2xheW91dC1tZW51CisgICAqLworICB0aXRsZTogJ0FudCBEZXNpZ24gUHJvJywKKyAgbGF5b3V0OiB7CisgICAgbG9jYWxlOiB0cnVlLAorICAgIC4uLmRlZmF1bHRTZXR0aW5ncywKKyAgfSwKKyAgLyoqCisgICAqIEBuYW1lIG1vbWVudDJkYXlqcyDmj5Lku7YKKyAgICogQGRlc2NyaXB0aW9uIOWwhumhueebruS4reeahCBtb21lbnQg5pu/5o2i5Li6IGRheWpzCisgICAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9tYXgvbW9tZW50MmRheWpzCisgICAqLworICBtb21lbnQyZGF5anM6IHsKKyAgICBwcmVzZXQ6ICdhbnRkJywKKyAgICBwbHVnaW5zOiBbJ2R1cmF0aW9uJ10sCisgIH0sCisgIC8qKgorICAgKiBAbmFtZSDlm73pmYXljJbmj5Lku7YKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL21heC9pMThuCisgICAqLworICBsb2NhbGU6IHsKKyAgICAvLyBkZWZhdWx0IHpoLUNOCisgICAgZGVmYXVsdDogJ3poLUNOJywKKyAgICBhbnRkOiB0cnVlLAorICAgIC8vIGRlZmF1bHQgdHJ1ZSwgd2hlbiBpdCBpcyB0cnVlLCB3aWxsIHVzZSBgbmF2aWdhdG9yLmxhbmd1YWdlYCBvdmVyd3JpdGUgZGVmYXVsdAorICAgIGJhc2VOYXZpZ2F0b3I6IHRydWUsCisgIH0sCisgIC8qKgorICAgKiBAbmFtZSBhbnRkIOaPkuS7tgorICAgKiBAZGVzY3JpcHRpb24g5YaF572u5LqGIGJhYmVsIGltcG9ydCDmj5Lku7YKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL21heC9hbnRkI2FudGQKKyAgICovCisgIGFudGQ6IHt9LAorICAvKioKKyAgICogQG5hbWUg572R57uc6K+35rGC6YWN572uCisgICAqIEBkZXNjcmlwdGlvbiDlroPln7rkuo4gYXhpb3Mg5ZKMIGFob29rcyDnmoQgdXNlUmVxdWVzdCDmj5DkvpvkuobkuIDlpZfnu5/kuIDnmoTnvZHnu5zor7fmsYLlkozplJnor6/lpITnkIbmlrnmoYjjgIIKKyAgICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL21heC9yZXF1ZXN0CisgICAqLworICByZXF1ZXN0OiB7fSwKKyAgLyoqCisgICAqIEBuYW1lIOadg+mZkOaPkuS7tgorICAgKiBAZGVzY3JpcHRpb24g5Z+65LqOIGluaXRpYWxTdGF0ZSDnmoTmnYPpmZDmj5Lku7bvvIzlv4XpobvlhYjmiZPlvIAgaW5pdGlhbFN0YXRlCisgICAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9tYXgvYWNjZXNzCisgICAqLworICBhY2Nlc3M6IHt9LAorICAvKioKKyAgICogQG5hbWUgPGhlYWQ+IOS4remineWklueahCBzY3JpcHQKKyAgICogQGRlc2NyaXB0aW9uIOmFjee9riA8aGVhZD4g5Lit6aKd5aSW55qEIHNjcmlwdAorICAgKi8KKyAgaGVhZFNjcmlwdHM6IFsKKyAgICAvLyDop6PlhrPpppbmrKHliqDovb3ml7bnmb3lsY/nmoTpl67popgKKyAgICB7IHNyYzogJy9zY3JpcHRzL2xvYWRpbmcuanMnLCBhc3luYzogdHJ1ZSB9LAorICBdLAorICAvLz09PT09PT09PT09PT09PT0gcHJvIOaPkuS7tumFjee9riA9PT09PT09PT09PT09PT09PQorICBwcmVzZXRzOiBbJ3VtaS1wcmVzZXRzLXBybyddLAorICAvKioKKyAgICogQG5hbWUgb3BlbkFQSSDmj5Lku7bnmoTphY3nva4KKyAgICogQGRlc2NyaXB0aW9uIOWfuuS6jiBvcGVuYXBpIOeahOinhOiMg+eUn+aIkHNlcnZlIOWSjG1vY2vvvIzog73lh4/lsJHlvojlpJrmoLfmnb/ku6PnoIEKKyAgICogQGRvYyBodHRwczovL3Byby5hbnQuZGVzaWduL3poLWNuL2RvY3Mvb3BlbmFwaS8KKyAgICovCisgIG9wZW5BUEk6IFsKKyAgICB7CisgICAgICByZXF1ZXN0TGliUGF0aDogImltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JyIsCisgICAgICAvLyDmiJbogIXkvb/nlKjlnKjnur/nmoTniYjmnKwKKyAgICAgIC8vIHNjaGVtYVBhdGg6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL29zL2FudGZpbmNkbi9NJTI0anJ6VFRZSk4vb25lYXBpLmpzb24iCisgICAgICBzY2hlbWFQYXRoOiBqb2luKF9fZGlybmFtZSwgJ29uZWFwaS5qc29uJyksCisgICAgICBtb2NrOiBmYWxzZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHJlcXVlc3RMaWJQYXRoOiAiaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnIiwKKyAgICAgIHNjaGVtYVBhdGg6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL29zL2FudGZpbmNkbi9DQTFkT20lMjYzMUIvb3BlbmFwaS5qc29uJywKKyAgICAgIHByb2plY3ROYW1lOiAnc3dhZ2dlcicsCisgICAgfSwKKyAgXSwKKyAgbWZzdTogeworICAgIHN0cmF0ZWd5OiAnbm9ybWFsJywKKyAgfSwKKyAgZXNidWlsZE1pbmlmeUlJRkU6IHRydWUsCisgIHJlcXVlc3RSZWNvcmQ6IHt9LAorfSk7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9jb25maWcvZGVmYXVsdFNldHRpbmdzLnRzIGIvcmVhY3QtdWkvY29uZmlnL2RlZmF1bHRTZXR0aW5ncy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk2YTdlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvY29uZmlnL2RlZmF1bHRTZXR0aW5ncy50cwpAQCAtMCwwICsxLDI4IEBACitpbXBvcnQgeyBQcm9MYXlvdXRQcm9wcyB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKKworLyoqCisgKiBAbmFtZQorICovCitjb25zdCBTZXR0aW5nczogUHJvTGF5b3V0UHJvcHMgJiB7CisgIHB3YT86IGJvb2xlYW47CisgIGxvZ28/OiBzdHJpbmc7Cit9ID0geworICBuYXZUaGVtZTogJ2xpZ2h0JywKKyAgLy8g5ouC5pmT6JOdCisgIGNvbG9yUHJpbWFyeTogJyMxODkwZmYnLAorICBsYXlvdXQ6ICdtaXgnLAorICBjb250ZW50V2lkdGg6ICdGbHVpZCcsCisgIGZpeGVkSGVhZGVyOiBmYWxzZSwKKyAgZml4U2lkZXJiYXI6IHRydWUsCisgIGNvbG9yV2VhazogZmFsc2UsCisgIHRpdGxlOiAnQW50IERlc2lnbiBQcm8nLAorICBwd2E6IHRydWUsCisgIGxvZ286ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvS0RwZ3ZndU1wR2ZxYUhQamljUksuc3ZnJywKKyAgaWNvbmZvbnRVcmw6ICcnLAorICB0b2tlbjogeworICAgIC8vIOWPguingXRz5aOw5piO77yMZGVtbyDop4HmlofmoaPvvIzpgJrov4d0b2tlbiDkv67mlLnmoLflvI8KKyAgICAvL2h0dHBzOi8vcHJvY29tcG9uZW50cy5hbnQuZGVzaWduL2NvbXBvbmVudHMvbGF5b3V0IyVFOSU4MCU5QSVFOCVCRiU4Ny10b2tlbi0lRTQlQkYlQUUlRTYlOTQlQjklRTYlQTAlQjclRTUlQkMlOEYKKyAgfSwKK307CisKK2V4cG9ydCBkZWZhdWx0IFNldHRpbmdzOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvY29uZmlnL29uZWFwaS5qc29uIGIvcmVhY3QtdWkvY29uZmlnL29uZWFwaS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2Q5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9jb25maWcvb25lYXBpLmpzb24KQEAgLTAsMCArMSw1OTMgQEAKK3sKKyAgIm9wZW5hcGkiOiAiMy4wLjEiLAorICAiaW5mbyI6IHsKKyAgICAidGl0bGUiOiAiQW50IERlc2lnbiBQcm8iLAorICAgICJ2ZXJzaW9uIjogIjEuMC4wIgorICB9LAorICAic2VydmVycyI6IFsKKyAgICB7CisgICAgICAidXJsIjogImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC8iCisgICAgfSwKKyAgICB7CisgICAgICAidXJsIjogImh0dHBzOi8vbG9jYWxob3N0OjgwMDAvIgorICAgIH0KKyAgXSwKKyAgInBhdGhzIjogeworICAgICIvYXBpL2N1cnJlbnRVc2VyIjogeworICAgICAgImdldCI6IHsKKyAgICAgICAgInRhZ3MiOiBbImFwaSJdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAi6I635Y+W5b2T5YmN55qE55So5oi3IiwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogImN1cnJlbnRVc2VyIiwKKyAgICAgICAgInJlc3BvbnNlcyI6IHsKKyAgICAgICAgICAiMjAwIjogeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9DdXJyZW50VXNlciIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICI0MDEiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXJyb3IiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9FcnJvclJlc3BvbnNlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJ4LXN3YWdnZXItcm91dGVyLWNvbnRyb2xsZXIiOiAiYXBpIgorICAgIH0sCisgICAgIi9hcGkvbG9naW4vY2FwdGNoYSI6IHsKKyAgICAgICJwb3N0IjogeworICAgICAgICAiZGVzY3JpcHRpb24iOiAi5Y+R6YCB6aqM6K+B56CBIiwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogImdldEZha2VDYXB0Y2hhIiwKKyAgICAgICAgInRhZ3MiOiBbImxvZ2luIl0sCisgICAgICAgICJwYXJhbWV0ZXJzIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogInBob25lIiwKKyAgICAgICAgICAgICJpbiI6ICJxdWVyeSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi5omL5py65Y+3IiwKKyAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJyZXNwb25zZXMiOiB7CisgICAgICAgICAgIjIwMCI6IHsKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTdWNjZXNzIiwKKyAgICAgICAgICAgICJjb250ZW50IjogeworICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKKyAgICAgICAgICAgICAgICAic2NoZW1hIjogeworICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvRmFrZUNhcHRjaGEiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiL2FwaS9sb2dpbi9vdXRMb2dpbiI6IHsKKyAgICAgICJwb3N0IjogeworICAgICAgICAiZGVzY3JpcHRpb24iOiAi55m75b2V5o6l5Y+jIiwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogIm91dExvZ2luIiwKKyAgICAgICAgInRhZ3MiOiBbImxvZ2luIl0sCisgICAgICAgICJyZXNwb25zZXMiOiB7CisgICAgICAgICAgIjIwMCI6IHsKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTdWNjZXNzIiwKKyAgICAgICAgICAgICJjb250ZW50IjogeworICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKKyAgICAgICAgICAgICAgICAic2NoZW1hIjogeworICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgIjQwMSI6IHsKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFcnJvciIsCisgICAgICAgICAgICAiY29udGVudCI6IHsKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CisgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0Vycm9yUmVzcG9uc2UiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgIngtc3dhZ2dlci1yb3V0ZXItY29udHJvbGxlciI6ICJhcGkiCisgICAgfSwKKyAgICAiL2FwaS9sb2dpbi9hY2NvdW50IjogeworICAgICAgInBvc3QiOiB7CisgICAgICAgICJ0YWdzIjogWyJsb2dpbiJdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAi55m75b2V5o6l5Y+jIiwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogImxvZ2luIiwKKyAgICAgICAgInJlcXVlc3RCb2R5IjogeworICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICLnmbvlvZXns7vnu58iLAorICAgICAgICAgICJjb250ZW50IjogeworICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CisgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvTG9naW5QYXJhbXMiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlc3BvbnNlcyI6IHsKKyAgICAgICAgICAiMjAwIjogeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9Mb2dpblJlc3VsdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICI0MDEiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXJyb3IiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9FcnJvclJlc3BvbnNlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIngtY29kZWdlbi1yZXF1ZXN0LWJvZHktbmFtZSI6ICJib2R5IgorICAgICAgfSwKKyAgICAgICJ4LXN3YWdnZXItcm91dGVyLWNvbnRyb2xsZXIiOiAiYXBpIgorICAgIH0sCisgICAgIi9hcGkvbm90aWNlcyI6IHsKKyAgICAgICJzdW1tYXJ5IjogImdldE5vdGljZXMiLAorICAgICAgImRlc2NyaXB0aW9uIjogIk5vdGljZUljb25JdGVtIiwKKyAgICAgICJnZXQiOiB7CisgICAgICAgICJ0YWdzIjogWyJhcGkiXSwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogImdldE5vdGljZXMiLAorICAgICAgICAicmVzcG9uc2VzIjogeworICAgICAgICAgICIyMDAiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3VjY2VzcyIsCisgICAgICAgICAgICAiY29udGVudCI6IHsKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CisgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL05vdGljZUljb25MaXN0IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIi9hcGkvcnVsZSI6IHsKKyAgICAgICJnZXQiOiB7CisgICAgICAgICJ0YWdzIjogWyJydWxlIl0sCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICLojrflj5bop4TliJnliJfooagiLAorICAgICAgICAib3BlcmF0aW9uSWQiOiAicnVsZSIsCisgICAgICAgICJwYXJhbWV0ZXJzIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogImN1cnJlbnQiLAorICAgICAgICAgICAgImluIjogInF1ZXJ5IiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICLlvZPliY3nmoTpobXnoIEiLAorICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAicGFnZVNpemUiLAorICAgICAgICAgICAgImluIjogInF1ZXJ5IiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICLpobXpnaLnmoTlrrnph48iLAorICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInJlc3BvbnNlcyI6IHsKKyAgICAgICAgICAiMjAwIjogeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9SdWxlTGlzdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICI0MDEiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXJyb3IiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9FcnJvclJlc3BvbnNlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJwb3N0IjogeworICAgICAgICAidGFncyI6IFsicnVsZSJdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAi5paw5bu66KeE5YiZIiwKKyAgICAgICAgIm9wZXJhdGlvbklkIjogImFkZFJ1bGUiLAorICAgICAgICAicmVzcG9uc2VzIjogeworICAgICAgICAgICIyMDAiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3VjY2VzcyIsCisgICAgICAgICAgICAiY29udGVudCI6IHsKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CisgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL1J1bGVMaXN0SXRlbSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICI0MDEiOiB7CisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXJyb3IiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9FcnJvclJlc3BvbnNlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJwdXQiOiB7CisgICAgICAgICJ0YWdzIjogWyJydWxlIl0sCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICLmlrDlu7rop4TliJkiLAorICAgICAgICAib3BlcmF0aW9uSWQiOiAidXBkYXRlUnVsZSIsCisgICAgICAgICJyZXNwb25zZXMiOiB7CisgICAgICAgICAgIjIwMCI6IHsKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTdWNjZXNzIiwKKyAgICAgICAgICAgICJjb250ZW50IjogeworICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKKyAgICAgICAgICAgICAgICAic2NoZW1hIjogeworICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvUnVsZUxpc3RJdGVtIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgIjQwMSI6IHsKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFcnJvciIsCisgICAgICAgICAgICAiY29udGVudCI6IHsKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CisgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKKyAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0Vycm9yUmVzcG9uc2UiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgImRlbGV0ZSI6IHsKKyAgICAgICAgInRhZ3MiOiBbInJ1bGUiXSwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIuWIoOmZpOinhOWImSIsCisgICAgICAgICJvcGVyYXRpb25JZCI6ICJyZW1vdmVSdWxlIiwKKyAgICAgICAgInJlc3BvbnNlcyI6IHsKKyAgICAgICAgICAiMjAwIjogeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN1Y2Nlc3MiLAorICAgICAgICAgICAgImNvbnRlbnQiOiB7CisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogeworICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CisgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAiNDAxIjogeworICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVycm9yIiwKKyAgICAgICAgICAgICJjb250ZW50IjogeworICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKKyAgICAgICAgICAgICAgICAic2NoZW1hIjogeworICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvRXJyb3JSZXNwb25zZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAieC1zd2FnZ2VyLXJvdXRlci1jb250cm9sbGVyIjogImFwaSIKKyAgICB9LAorICAgICIvc3dhZ2dlciI6IHsKKyAgICAgICJ4LXN3YWdnZXItcGlwZSI6ICJzd2FnZ2VyX3JhdyIKKyAgICB9CisgIH0sCisgICJjb21wb25lbnRzIjogeworICAgICJzY2hlbWFzIjogeworICAgICAgIkN1cnJlbnRVc2VyIjogeworICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAibmFtZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJhdmF0YXIiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAidXNlcmlkIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgImVtYWlsIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgInNpZ25hdHVyZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0aXRsZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJncm91cCI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0YWdzIjogeworICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAia2V5IjogeworICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImxhYmVsIjogeworICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgIm5vdGlmeUNvdW50IjogeworICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAiZm9ybWF0IjogImludDMyIgorICAgICAgICAgIH0sCisgICAgICAgICAgInVucmVhZENvdW50IjogeworICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAiZm9ybWF0IjogImludDMyIgorICAgICAgICAgIH0sCisgICAgICAgICAgImNvdW50cnkiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAiYWNjZXNzIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgImdlb2dyYXBoaWMiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICJwcm92aW5jZSI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICAgImxhYmVsIjogeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgImNpdHkiOiB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAgICJsYWJlbCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJhZGRyZXNzIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgInBob25lIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJMb2dpblJlc3VsdCI6IHsKKyAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgInN0YXR1cyI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0eXBlIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgImN1cnJlbnRBdXRob3JpdHkiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgIlBhZ2VQYXJhbXMiOiB7CisgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICJjdXJyZW50IjogeworICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgorICAgICAgICAgIH0sCisgICAgICAgICAgInBhZ2VTaXplIjogeworICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJSdWxlTGlzdEl0ZW0iOiB7CisgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJmb3JtYXQiOiAiaW50MzIiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGlzYWJsZWQiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgIH0sCisgICAgICAgICAgImhyZWYiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAiYXZhdGFyIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgIm5hbWUiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAib3duZXIiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVzYyI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJjYWxsTm8iOiB7CisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJmb3JtYXQiOiAiaW50MzIiCisgICAgICAgICAgfSwKKyAgICAgICAgICAic3RhdHVzIjogeworICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAiZm9ybWF0IjogImludDMyIgorICAgICAgICAgIH0sCisgICAgICAgICAgInVwZGF0ZWRBdCI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAiZm9ybWF0IjogImRhdGV0aW1lIgorICAgICAgICAgIH0sCisgICAgICAgICAgImNyZWF0ZWRBdCI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAiZm9ybWF0IjogImRhdGV0aW1lIgorICAgICAgICAgIH0sCisgICAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAiZm9ybWF0IjogImludDMyIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJSdWxlTGlzdCI6IHsKKyAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgImRhdGEiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL1J1bGVMaXN0SXRlbSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJ0b3RhbCI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIuWIl+ihqOeahOWGheWuueaAu+aVsCIsCisgICAgICAgICAgICAiZm9ybWF0IjogImludDMyIgorICAgICAgICAgIH0sCisgICAgICAgICAgInN1Y2Nlc3MiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJGYWtlQ2FwdGNoYSI6IHsKKyAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgImNvZGUiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJmb3JtYXQiOiAiaW50MzIiCisgICAgICAgICAgfSwKKyAgICAgICAgICAic3RhdHVzIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJMb2dpblBhcmFtcyI6IHsKKyAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgInVzZXJuYW1lIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgInBhc3N3b3JkIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgImF1dG9Mb2dpbiI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCisgICAgICAgICAgfSwKKyAgICAgICAgICAidHlwZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAiRXJyb3JSZXNwb25zZSI6IHsKKyAgICAgICAgInJlcXVpcmVkIjogWyJlcnJvckNvZGUiXSwKKyAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgImVycm9yQ29kZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi5Lia5Yqh57qm5a6a55qE6ZSZ6K+v56CBIgorICAgICAgICAgIH0sCisgICAgICAgICAgImVycm9yTWVzc2FnZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi5Lia5Yqh5LiK55qE6ZSZ6K+v5L+h5oGvIgorICAgICAgICAgIH0sCisgICAgICAgICAgInN1Y2Nlc3MiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICLkuJrliqHkuIrnmoTor7fmsYLmmK/lkKbmiJDlip8iCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LAorICAgICAgIk5vdGljZUljb25MaXN0IjogeworICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAiZGF0YSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvTm90aWNlSWNvbkl0ZW0iCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAidG90YWwiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICLliJfooajnmoTlhoXlrrnmgLvmlbAiLAorICAgICAgICAgICAgImZvcm1hdCI6ICJpbnQzMiIKKyAgICAgICAgICB9LAorICAgICAgICAgICJzdWNjZXNzIjogeworICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAiTm90aWNlSWNvbkl0ZW1UeXBlIjogeworICAgICAgICAidGl0bGUiOiAiTm90aWNlSWNvbkl0ZW1UeXBlIiwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIuW3suivu+acquivu+WIl+ihqOeahOaemuS4viIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJwcm9wZXJ0aWVzIjoge30sCisgICAgICAgICJlbnVtIjogWyJub3RpZmljYXRpb24iLCAibWVzc2FnZSIsICJldmVudCJdCisgICAgICB9LAorICAgICAgIk5vdGljZUljb25JdGVtIjogeworICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAiaWQiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZXh0cmEiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgImZvcm1hdCI6ICJhbnkiCisgICAgICAgICAgfSwKKyAgICAgICAgICAia2V5IjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgInJlYWQiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgIH0sCisgICAgICAgICAgImF2YXRhciI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0aXRsZSI6IHsKKyAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgICAgICB9LAorICAgICAgICAgICJzdGF0dXMiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGF0ZXRpbWUiOiB7CisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgImZvcm1hdCI6ICJkYXRlIgorICAgICAgICAgIH0sCisgICAgICAgICAgImRlc2NyaXB0aW9uIjogeworICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgICAgIH0sCisgICAgICAgICAgInR5cGUiOiB7CisgICAgICAgICAgICAiZXh0ZW5zaW9ucyI6IHsKKyAgICAgICAgICAgICAgIngtaXMtZW51bSI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9Ob3RpY2VJY29uSXRlbVR5cGUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9jb25maWcvcHJveHkudHMgYi9yZWFjdC11aS9jb25maWcvcHJveHkudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MGM2YQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL2NvbmZpZy9wcm94eS50cwpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIEBuYW1lIOS7o+eQhueahOmFjee9rgorICogQHNlZSDlnKjnlJ/kuqfnjq/looMg5Luj55CG5piv5peg5rOV55Sf5pWI55qE77yM5omA5Lul6L+Z6YeM5rKh5pyJ55Sf5Lqn546v5aKD55qE6YWN572uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgYWdlbnQgY2Fubm90IHRha2UgZWZmZWN0IGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50CisgKiBzbyB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIG9mIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50CisgKiBGb3IgZGV0YWlscywgcGxlYXNlIHNlZQorICogaHR0cHM6Ly9wcm8uYW50LmRlc2lnbi9kb2NzL2RlcGxveQorICoKKyAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9ndWlkZXMvcHJveHkKKyAqLworZXhwb3J0IGRlZmF1bHQgeworICAvLyDlpoLmnpzpnIDopoHoh6rlrprkuYnmnKzlnLDlvIDlj5HmnI3liqHlmaggIOivt+WPlua2iOazqOmHiuaMiemcgOiwg+aVtAorICBkZXY6IHsKKyAgICAvLyBsb2NhbGhvc3Q6ODAwMC9hcGkvKiogLT4gaHR0cHM6Ly9wcmV2aWV3LnByby5hbnQuZGVzaWduL2FwaS8qKgorICAgICcvYXBpLyc6IHsKKyAgICAgIC8vIOimgeS7o+eQhueahOWcsOWdgAorICAgICAgdGFyZ2V0OiAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJywKKyAgICAgIC8vIOmFjee9ruS6hui/meS4quWPr+S7peS7jiBodHRwIOS7o+eQhuWIsCBodHRwcworICAgICAgLy8g5L6d6LWWIG9yaWdpbiDnmoTlip/og73lj6/og73pnIDopoHov5nkuKrvvIzmr5TlpoIgY29va2llCisgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsCisgICAgICBwYXRoUmV3cml0ZTogeyAnXi9hcGknOiAnJyB9LAorICAgIH0sCisgICAgJy9wcm9maWxlL2F2YXRhci8nOiB7CisgICAgICB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjgwODAnLAorICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLAorICAgIH0KKyAgfSwKKworICAvKioKKyAgICogQG5hbWUg6K+m57uG55qE5Luj55CG6YWN572uCisgICAqIEBkb2MgaHR0cHM6Ly9naXRodWIuY29tL2NoaW11cmFpL2h0dHAtcHJveHktbWlkZGxld2FyZQorICAgKi8KKyAgdGVzdDogeworICAgIC8vIGxvY2FsaG9zdDo4MDAwL2FwaS8qKiAtPiBodHRwczovL3ByZXZpZXcucHJvLmFudC5kZXNpZ24vYXBpLyoqCisgICAgJy9hcGkvJzogeworICAgICAgdGFyZ2V0OiAnaHR0cHM6Ly9wcm9hcGkuYXp1cmV3ZWJzaXRlcy5uZXQnLAorICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLAorICAgICAgcGF0aFJld3JpdGU6IHsgJ14nOiAnJyB9LAorICAgIH0sCisgIH0sCisgIHByZTogeworICAgICcvYXBpLyc6IHsKKyAgICAgIHRhcmdldDogJ3lvdXIgcHJlIHVybCcsCisgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsCisgICAgICBwYXRoUmV3cml0ZTogeyAnXic6ICcnIH0sCisgICAgfSwKKyAgfSwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9jb25maWcvcm91dGVzLnRzIGIvcmVhY3QtdWkvY29uZmlnL3JvdXRlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFkMDJmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvY29uZmlnL3JvdXRlcy50cwpAQCAtMCwwICsxLDkyIEBACivvu78vKioKKyAqIEBuYW1lIHVtaSDnmoTot6/nlLHphY3nva4KKyAqIEBkZXNjcmlwdGlvbiDlj6rmlK/mjIEgcGF0aCxjb21wb25lbnQscm91dGVzLHJlZGlyZWN0LHdyYXBwZXJzLG5hbWUsaWNvbiDnmoTphY3nva4KKyAqIEBwYXJhbSBwYXRoICBwYXRoIOWPquaUr+aMgeS4pOenjeWNoOS9jeespumFjee9ru+8jOesrOS4gOenjeaYr+WKqOaAgeWPguaVsCA6aWQg55qE5b2i5byP77yM56ys5LqM56eN5pivICog6YCa6YWN56ym77yM6YCa6YWN56ym5Y+q6IO95Ye6546w6Lev55Sx5a2X56ym5Liy55qE5pyA5ZCO44CCCisgKiBAcGFyYW0gY29tcG9uZW50IOmFjee9riBsb2NhdGlvbiDlkowgcGF0aCDljLnphY3lkI7nlKjkuo7muLLmn5PnmoQgUmVhY3Qg57uE5Lu26Lev5b6E44CC5Y+v5Lul5piv57ud5a+56Lev5b6E77yM5Lmf5Y+v5Lul5piv55u45a+56Lev5b6E77yM5aaC5p6c5piv55u45a+56Lev5b6E77yM5Lya5LuOIHNyYy9wYWdlcyDlvIDlp4vmib7otbfjgIIKKyAqIEBwYXJhbSByb3V0ZXMg6YWN572u5a2Q6Lev55Sx77yM6YCa5bi45Zyo6ZyA6KaB5Li65aSa5Liq6Lev5b6E5aKe5YqgIGxheW91dCDnu4Tku7bml7bkvb/nlKjjgIIKKyAqIEBwYXJhbSByZWRpcmVjdCDphY3nva7ot6/nlLHot7PovawKKyAqIEBwYXJhbSB3cmFwcGVycyDphY3nva7ot6/nlLHnu4Tku7bnmoTljIXoo4Xnu4Tku7bvvIzpgJrov4fljIXoo4Xnu4Tku7blj6/ku6XkuLrlvZPliY3nmoTot6/nlLHnu4Tku7bnu4TlkIjov5vmm7TlpJrnmoTlip/og73jgIIg5q+U5aaC77yM5Y+v5Lul55So5LqO6Lev55Sx57qn5Yir55qE5p2D6ZmQ5qCh6aqMCisgKiBAcGFyYW0gbmFtZSDphY3nva7ot6/nlLHnmoTmoIfpopjvvIzpu5jorqTor7vlj5blm73pmYXljJbmlofku7YgbWVudS50cyDkuK0gbWVudS54eHh4IOeahOWAvO+8jOWmgumFjee9riBuYW1lIOS4uiBsb2dpbu+8jOWImeivu+WPliBtZW51LnRzIOS4rSBtZW51LmxvZ2luIOeahOWPluWAvOS9nOS4uuagh+mimAorICogQHBhcmFtIGljb24g6YWN572u6Lev55Sx55qE5Zu+5qCH77yM5Y+W5YC85Y+C6ICDIGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb24tY27vvIwg5rOo5oSP5Y676Zmk6aOO5qC85ZCO57yA5ZKM5aSn5bCP5YaZ77yM5aaC5oOz6KaB6YWN572u5Zu+5qCH5Li6IDxTdGVwQmFja3dhcmRPdXRsaW5lZCAvPiDliJnlj5blgLzlupTkuLogc3RlcEJhY2t3YXJkIOaIliBTdGVwQmFja3dhcmTvvIzlpoLmg7PopoHphY3nva7lm77moIfkuLogPFVzZXJPdXRsaW5lZCAvPiDliJnlj5blgLzlupTkuLogdXNlciDmiJbogIUgVXNlcgorICogQGRvYyBodHRwczovL3VtaWpzLm9yZy9kb2NzL2d1aWRlcy9yb3V0ZXMKKyAqLworZXhwb3J0IGRlZmF1bHQgWworICB7CisgICAgcGF0aDogJy8nLAorICAgIHJlZGlyZWN0OiAnL2FjY291bnQvY2VudGVyJywKKyAgfSwKKyAgeworICAgIHBhdGg6ICcqJywKKyAgICBsYXlvdXQ6IGZhbHNlLAorICAgIGNvbXBvbmVudDogJy4vNDA0JywKKyAgfSwKKyAgeworICAgIHBhdGg6ICcvdXNlcicsCisgICAgbGF5b3V0OiBmYWxzZSwKKyAgICByb3V0ZXM6IFsKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ2xvZ2luJywKKyAgICAgICAgcGF0aDogJy91c2VyL2xvZ2luJywKKyAgICAgICAgY29tcG9uZW50OiAnLi9Vc2VyL0xvZ2luJywKKyAgICAgIH0sCisgICAgXSwKKyAgfSwKKyAgeworICAgIHBhdGg6ICcvYWNjb3VudCcsCisgICAgcm91dGVzOiBbCisgICAgICB7CisgICAgICAgIG5hbWU6ICdhY2VudGVyJywKKyAgICAgICAgcGF0aDogJy9hY2NvdW50L2NlbnRlcicsCisgICAgICAgIGNvbXBvbmVudDogJy4vVXNlci9DZW50ZXInLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ2FzZXR0aW5ncycsCisgICAgICAgIHBhdGg6ICcvYWNjb3VudC9zZXR0aW5ncycsCisgICAgICAgIGNvbXBvbmVudDogJy4vVXNlci9TZXR0aW5ncycsCisgICAgICB9LAorICAgIF0sCisgIH0sCisgIHsKKyAgICBuYW1lOiAnc3lzdGVtJywKKyAgICBwYXRoOiAnL3N5c3RlbScsCisgICAgcm91dGVzOiBbCisgICAgICB7CisgICAgICAgIG5hbWU6ICflrZflhbjmlbDmja4nLAorICAgICAgICBwYXRoOiAnL3N5c3RlbS9kaWN0LWRhdGEvaW5kZXgvOmlkJywKKyAgICAgICAgY29tcG9uZW50OiAnLi9TeXN0ZW0vRGljdERhdGEnLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ+WIhumFjeeUqOaItycsCisgICAgICAgIHBhdGg6ICcvc3lzdGVtL3JvbGUtYXV0aC91c2VyLzppZCcsCisgICAgICAgIGNvbXBvbmVudDogJy4vU3lzdGVtL1JvbGUvYXV0aFVzZXInLAorICAgICAgfSwKKyAgICBdCisgIH0sCisgIHsKKyAgICBuYW1lOiAnbW9uaXRvcicsCisgICAgcGF0aDogJy9tb25pdG9yJywKKyAgICByb3V0ZXM6IFsKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ+S7u+WKoeaXpeW/lycsCisgICAgICAgIHBhdGg6ICcvbW9uaXRvci9qb2ItbG9nL2luZGV4LzppZCcsCisgICAgICAgIGNvbXBvbmVudDogJy4vTW9uaXRvci9Kb2JMb2cnLAorICAgICAgfSwKKyAgICBdCisgIH0sCisgIHsKKyAgICBuYW1lOiAndG9vbCcsCisgICAgcGF0aDogJy90b29sJywKKyAgICByb3V0ZXM6IFsKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ+WvvOWFpeihqCcsCisgICAgICAgIHBhdGg6ICcvdG9vbC9nZW4vaW1wb3J0JywKKyAgICAgICAgY29tcG9uZW50OiAnLi9Ub29sL0dlbi9pbXBvcnQnLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgbmFtZTogJ+e8lui+keihqCcsCisgICAgICAgIHBhdGg6ICcvdG9vbC9nZW4vZWRpdCcsCisgICAgICAgIGNvbXBvbmVudDogJy4vVG9vbC9HZW4vZWRpdCcsCisgICAgICB9LAorICAgIF0KKyAgfSwKK107CmRpZmYgLS1naXQgYS9yZWFjdC11aS9qZXN0LmNvbmZpZy50cyBiL3JlYWN0LXVpL2plc3QuY29uZmlnLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTJhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9qZXN0LmNvbmZpZy50cwpAQCAtMCwwICsxLDIzIEBACitpbXBvcnQgeyBjb25maWdVbWlBbGlhcywgY3JlYXRlQ29uZmlnIH0gZnJvbSAnQHVtaWpzL21heC90ZXN0JzsKKworZXhwb3J0IGRlZmF1bHQgYXN5bmMgKCkgPT4geworICBjb25zdCBjb25maWcgPSBhd2FpdCBjb25maWdVbWlBbGlhcyh7CisgICAgLi4uY3JlYXRlQ29uZmlnKHsKKyAgICAgIHRhcmdldDogJ2Jyb3dzZXInLAorICAgIH0pLAorICB9KTsKKworICBjb25zb2xlLmxvZygpOworICByZXR1cm4geworICAgIC4uLmNvbmZpZywKKyAgICB0ZXN0RW52aXJvbm1lbnRPcHRpb25zOiB7CisgICAgICAuLi4oY29uZmlnPy50ZXN0RW52aXJvbm1lbnRPcHRpb25zIHx8IHt9KSwKKyAgICAgIHVybDogJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMCcsCisgICAgfSwKKyAgICBzZXR1cEZpbGVzOiBbLi4uKGNvbmZpZy5zZXR1cEZpbGVzIHx8IFtdKSwgJy4vdGVzdHMvc2V0dXBUZXN0cy5qc3gnXSwKKyAgICBnbG9iYWxzOiB7CisgICAgICAuLi5jb25maWcuZ2xvYmFscywKKyAgICAgIGxvY2FsU3RvcmFnZTogbnVsbCwKKyAgICB9LAorICB9OworfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL2pzY29uZmlnLmpzb24gYi9yZWFjdC11aS9qc2NvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5N2JlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9qc2NvbmZpZy5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgImNvbXBpbGVyT3B0aW9ucyI6IHsKKyAgICAianN4IjogInJlYWN0LWpzeCIsCisgICAgImVtaXREZWNvcmF0b3JNZXRhZGF0YSI6IHRydWUsCisgICAgImV4cGVyaW1lbnRhbERlY29yYXRvcnMiOiB0cnVlLAorICAgICJiYXNlVXJsIjogIi4iLAorICAgICJwYXRocyI6IHsKKyAgICAgICJALyoiOiBbIi4vc3JjLyoiXQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvbW9jay9saXN0VGFibGVMaXN0LnRzIGIvcmVhY3QtdWkvbW9jay9saXN0VGFibGVMaXN0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZWMzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9tb2NrL2xpc3RUYWJsZUxpc3QudHMKQEAgLTAsMCArMSwxNzYgQEAKK2ltcG9ydCB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7CitpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7CitpbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7CisKKy8vIG1vY2sgdGFibGVMaXN0RGF0YVNvdXJjZQorY29uc3QgZ2VuTGlzdCA9IChjdXJyZW50OiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpID0+IHsKKyAgY29uc3QgdGFibGVMaXN0RGF0YVNvdXJjZTogQVBJLlJ1bGVMaXN0SXRlbVtdID0gW107CisKKyAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlU2l6ZTsgaSArPSAxKSB7CisgICAgY29uc3QgaW5kZXggPSAoY3VycmVudCAtIDEpICogMTAgKyBpOworICAgIHRhYmxlTGlzdERhdGFTb3VyY2UucHVzaCh7CisgICAgICBrZXk6IGluZGV4LAorICAgICAgZGlzYWJsZWQ6IGkgJSA2ID09PSAwLAorICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICBhdmF0YXI6IFsKKyAgICAgICAgJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICBdW2kgJSAyXSwKKyAgICAgIG5hbWU6IGBUcmFkZUNvZGUgJHtpbmRleH1gLAorICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICBjYWxsTm86IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApLAorICAgICAgc3RhdHVzOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCkgJSA0LAorICAgICAgdXBkYXRlZEF0OiBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKKyAgICAgIGNyZWF0ZWRBdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyksCisgICAgICBwcm9ncmVzczogTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiAxMDApLAorICAgIH0pOworICB9CisgIHRhYmxlTGlzdERhdGFTb3VyY2UucmV2ZXJzZSgpOworICByZXR1cm4gdGFibGVMaXN0RGF0YVNvdXJjZTsKK307CisKK2xldCB0YWJsZUxpc3REYXRhU291cmNlID0gZ2VuTGlzdCgxLCAxMDApOworCitmdW5jdGlvbiBnZXRSdWxlKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgdTogc3RyaW5nKSB7CisgIGxldCByZWFsVXJsID0gdTsKKyAgaWYgKCFyZWFsVXJsIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZWFsVXJsKSAhPT0gJ1tvYmplY3QgU3RyaW5nXScpIHsKKyAgICByZWFsVXJsID0gcmVxLnVybDsKKyAgfQorICBjb25zdCB7IGN1cnJlbnQgPSAxLCBwYWdlU2l6ZSA9IDEwIH0gPSByZXEucXVlcnk7CisgIGNvbnN0IHBhcmFtcyA9IHBhcnNlKHJlYWxVcmwsIHRydWUpLnF1ZXJ5IGFzIHVua25vd24gYXMgQVBJLlBhZ2VQYXJhbXMgJgorICAgIEFQSS5SdWxlTGlzdEl0ZW0gJiB7CisgICAgICBzb3J0ZXI6IGFueTsKKyAgICAgIGZpbHRlcjogYW55OworICAgIH07CisKKyAgbGV0IGRhdGFTb3VyY2UgPSBbLi4udGFibGVMaXN0RGF0YVNvdXJjZV0uc2xpY2UoCisgICAgKChjdXJyZW50IGFzIG51bWJlcikgLSAxKSAqIChwYWdlU2l6ZSBhcyBudW1iZXIpLAorICAgIChjdXJyZW50IGFzIG51bWJlcikgKiAocGFnZVNpemUgYXMgbnVtYmVyKSwKKyAgKTsKKyAgaWYgKHBhcmFtcy5zb3J0ZXIpIHsKKyAgICBjb25zdCBzb3J0ZXIgPSBKU09OLnBhcnNlKHBhcmFtcy5zb3J0ZXIpOworICAgIGRhdGFTb3VyY2UgPSBkYXRhU291cmNlLnNvcnQoKHByZXYsIG5leHQpID0+IHsKKyAgICAgIGxldCBzb3J0TnVtYmVyID0gMDsKKyAgICAgIChPYmplY3Qua2V5cyhzb3J0ZXIpIGFzIEFycmF5PGtleW9mIEFQSS5SdWxlTGlzdEl0ZW0+KS5mb3JFYWNoKChrZXkpID0+IHsKKyAgICAgICAgbGV0IG5leHRTb3J0ID0gbmV4dD8uW2tleV0gYXMgbnVtYmVyOworICAgICAgICBsZXQgcHJlU29ydCA9IHByZXY/LltrZXldIGFzIG51bWJlcjsKKyAgICAgICAgaWYgKHNvcnRlcltrZXldID09PSAnZGVzY2VuZCcpIHsKKyAgICAgICAgICBpZiAocHJlU29ydCAtIG5leHRTb3J0ID4gMCkgeworICAgICAgICAgICAgc29ydE51bWJlciArPSAtMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc29ydE51bWJlciArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZVNvcnQgLSBuZXh0U29ydCA+IDApIHsKKyAgICAgICAgICBzb3J0TnVtYmVyICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc29ydE51bWJlciArPSAtMTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gc29ydE51bWJlcjsKKyAgICB9KTsKKyAgfQorICBpZiAocGFyYW1zLmZpbHRlcikgeworICAgIGNvbnN0IGZpbHRlciA9IEpTT04ucGFyc2UocGFyYW1zLmZpbHRlciBhcyBhbnkpIGFzIHsKKyAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdOworICAgIH07CisgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCkgeworICAgICAgZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2UuZmlsdGVyKChpdGVtKSA9PiB7CisgICAgICAgIHJldHVybiAoT2JqZWN0LmtleXMoZmlsdGVyKSBhcyBBcnJheTxrZXlvZiBBUEkuUnVsZUxpc3RJdGVtPikuc29tZSgoa2V5KSA9PiB7CisgICAgICAgICAgaWYgKCFmaWx0ZXJba2V5XSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmaWx0ZXJba2V5XS5pbmNsdWRlcyhgJHtpdGVtW2tleV19YCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgaWYgKHBhcmFtcy5uYW1lKSB7CisgICAgZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2UuZmlsdGVyKChkYXRhKSA9PiBkYXRhPy5uYW1lPy5pbmNsdWRlcyhwYXJhbXMubmFtZSB8fCAnJykpOworICB9CisgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICBkYXRhOiBkYXRhU291cmNlLAorICAgIHRvdGFsOiB0YWJsZUxpc3REYXRhU291cmNlLmxlbmd0aCwKKyAgICBzdWNjZXNzOiB0cnVlLAorICAgIHBhZ2VTaXplLAorICAgIGN1cnJlbnQ6IHBhcnNlSW50KGAke3BhcmFtcy5jdXJyZW50fWAsIDEwKSB8fCAxLAorICB9OworCisgIHJldHVybiByZXMuanNvbihyZXN1bHQpOworfQorCitmdW5jdGlvbiBwb3N0UnVsZShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIHU6IHN0cmluZywgYjogUmVxdWVzdCkgeworICBsZXQgcmVhbFVybCA9IHU7CisgIGlmICghcmVhbFVybCB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmVhbFVybCkgIT09ICdbb2JqZWN0IFN0cmluZ10nKSB7CisgICAgcmVhbFVybCA9IHJlcS51cmw7CisgIH0KKworICBjb25zdCBib2R5ID0gKGIgJiYgYi5ib2R5KSB8fCByZXEuYm9keTsKKyAgY29uc3QgeyBtZXRob2QsIG5hbWUsIGRlc2MsIGtleSB9ID0gYm9keTsKKworICBzd2l0Y2ggKG1ldGhvZCkgeworICAgIC8qIGVzbGludCBuby1jYXNlLWRlY2xhcmF0aW9uczowICovCisgICAgY2FzZSAnZGVsZXRlJzoKKyAgICAgIHRhYmxlTGlzdERhdGFTb3VyY2UgPSB0YWJsZUxpc3REYXRhU291cmNlLmZpbHRlcigoaXRlbSkgPT4ga2V5LmluZGV4T2YoaXRlbS5rZXkpID09PSAtMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdwb3N0JzoKKyAgICAgICgoKSA9PiB7CisgICAgICAgIGNvbnN0IGkgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMDAwKTsKKyAgICAgICAgY29uc3QgbmV3UnVsZTogQVBJLlJ1bGVMaXN0SXRlbSA9IHsKKyAgICAgICAgICBrZXk6IHRhYmxlTGlzdERhdGFTb3VyY2UubGVuZ3RoLAorICAgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICAgIGF2YXRhcjogWworICAgICAgICAgICAgJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICAgICAgJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICAgIF1baSAlIDJdLAorICAgICAgICAgIG5hbWUsCisgICAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICAgIGRlc2MsCisgICAgICAgICAgY2FsbE5vOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKSwKKyAgICAgICAgICBzdGF0dXM6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKSAlIDIsCisgICAgICAgICAgdXBkYXRlZEF0OiBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKKyAgICAgICAgICBjcmVhdGVkQXQ6IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLAorICAgICAgICAgIHByb2dyZXNzOiBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMCksCisgICAgICAgIH07CisgICAgICAgIHRhYmxlTGlzdERhdGFTb3VyY2UudW5zaGlmdChuZXdSdWxlKTsKKyAgICAgICAgcmV0dXJuIHJlcy5qc29uKG5ld1J1bGUpOworICAgICAgfSkoKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgJ3VwZGF0ZSc6CisgICAgICAoKCkgPT4geworICAgICAgICBsZXQgbmV3UnVsZSA9IHt9OworICAgICAgICB0YWJsZUxpc3REYXRhU291cmNlID0gdGFibGVMaXN0RGF0YVNvdXJjZS5tYXAoKGl0ZW0pID0+IHsKKyAgICAgICAgICBpZiAoaXRlbS5rZXkgPT09IGtleSkgeworICAgICAgICAgICAgbmV3UnVsZSA9IHsgLi4uaXRlbSwgZGVzYywgbmFtZSB9OworICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgZGVzYywgbmFtZSB9OworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXMuanNvbihuZXdSdWxlKTsKKyAgICAgIH0pKCk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgY29uc3QgcmVzdWx0ID0geworICAgIGxpc3Q6IHRhYmxlTGlzdERhdGFTb3VyY2UsCisgICAgcGFnaW5hdGlvbjogeworICAgICAgdG90YWw6IHRhYmxlTGlzdERhdGFTb3VyY2UubGVuZ3RoLAorICAgIH0sCisgIH07CisKKyAgcmVzLmpzb24ocmVzdWx0KTsKK30KKworZXhwb3J0IGRlZmF1bHQgeworICAnR0VUIC9hcGkvcnVsZSc6IGdldFJ1bGUsCisgICdQT1NUIC9hcGkvcnVsZSc6IHBvc3RSdWxlLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL21vY2svbm90aWNlcy50cyBiL3JlYWN0LXVpL21vY2svbm90aWNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZjOTIxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvbW9jay9ub3RpY2VzLnRzCkBAIC0wLDAgKzEsMTE1IEBACitpbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnOworCitjb25zdCBnZXROb3RpY2VzID0gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4geworICByZXMuanNvbih7CisgICAgZGF0YTogWworICAgICAgeworICAgICAgICBpZDogJzAwMDAwMDAwMScsCisgICAgICAgIGF2YXRhcjoKKyAgICAgICAgICAnaHR0cHM6Ly9tZG4uYWxpcGF5b2JqZWN0cy5jb20veXV5YW5fcWswb3hoL2FmdHMvaW1nL01TYkRSNEZSMk1VQUFBQUFBQUFBQUFBQUZsOTRBUUJyJywKKyAgICAgICAgdGl0bGU6ICfkvaDmlLbliLDkuoYgMTQg5Lu95paw5ZGo5oqlJywKKyAgICAgICAgZGF0ZXRpbWU6ICcyMDE3LTA4LTA5JywKKyAgICAgICAgdHlwZTogJ25vdGlmaWNhdGlvbicsCisgICAgICB9LAorICAgICAgeworICAgICAgICBpZDogJzAwMDAwMDAwMicsCisgICAgICAgIGF2YXRhcjoKKyAgICAgICAgICAnaHR0cHM6Ly9tZG4uYWxpcGF5b2JqZWN0cy5jb20veXV5YW5fcWswb3hoL2FmdHMvaW1nL2hYLVBUYXZZSXE0QUFBQUFBQUFBQUFBQUZsOTRBUUJyJywKKyAgICAgICAgdGl0bGU6ICfkvaDmjqjojZDnmoQg5puy5aau5aauIOW3sumAmui/h+esrOS4iei9rumdouivlScsCisgICAgICAgIGRhdGV0aW1lOiAnMjAxNy0wOC0wOCcsCisgICAgICAgIHR5cGU6ICdub3RpZmljYXRpb24nLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgaWQ6ICcwMDAwMDAwMDMnLAorICAgICAgICBhdmF0YXI6CisgICAgICAgICAgJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy9qSFg1UjVsM1FqUUFBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIHRpdGxlOiAn6L+Z56eN5qih5p2/5Y+v5Lul5Yy65YiG5aSa56eN6YCa55+l57G75Z6LJywKKyAgICAgICAgZGF0ZXRpbWU6ICcyMDE3LTA4LTA3JywKKyAgICAgICAgcmVhZDogdHJ1ZSwKKyAgICAgICAgdHlwZTogJ25vdGlmaWNhdGlvbicsCisgICAgICB9LAorICAgICAgeworICAgICAgICBpZDogJzAwMDAwMDAwNCcsCisgICAgICAgIGF2YXRhcjoKKyAgICAgICAgICAnaHR0cHM6Ly9tZG4uYWxpcGF5b2JqZWN0cy5jb20veXV5YW5fcWswb3hoL2FmdHMvaW1nL1dyNG1RcXg2amZ3QUFBQUFBQUFBQUFBQUZsOTRBUUJyJywKKyAgICAgICAgdGl0bGU6ICflt6bkvqflm77moIfnlKjkuo7ljLrliIbkuI3lkIznmoTnsbvlnosnLAorICAgICAgICBkYXRldGltZTogJzIwMTctMDgtMDcnLAorICAgICAgICB0eXBlOiAnbm90aWZpY2F0aW9uJywKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGlkOiAnMDAwMDAwMDA1JywKKyAgICAgICAgYXZhdGFyOgorICAgICAgICAgICdodHRwczovL21kbi5hbGlwYXlvYmplY3RzLmNvbS95dXlhbl9xazBveGgvYWZ0cy9pbWcvTXpqX1RiY1dVajRBQUFBQUFBQUFBQUFBRmw5NEFRQnInLAorICAgICAgICB0aXRsZTogJ+WGheWuueS4jeimgei2hei/h+S4pOihjOWtl++8jOi2heWHuuaXtuiHquWKqOaIquaWrScsCisgICAgICAgIGRhdGV0aW1lOiAnMjAxNy0wOC0wNycsCisgICAgICAgIHR5cGU6ICdub3RpZmljYXRpb24nLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgaWQ6ICcwMDAwMDAwMDYnLAorICAgICAgICBhdmF0YXI6CisgICAgICAgICAgJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy9lWEx6UmJQcVFFNEFBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIHRpdGxlOiAn5puy5Li95Li9IOivhOiuuuS6huS9oCcsCisgICAgICAgIGRlc2NyaXB0aW9uOiAn5o+P6L+w5L+h5oGv5o+P6L+w5L+h5oGv5o+P6L+w5L+h5oGvJywKKyAgICAgICAgZGF0ZXRpbWU6ICcyMDE3LTA4LTA3JywKKyAgICAgICAgdHlwZTogJ21lc3NhZ2UnLAorICAgICAgICBjbGlja0Nsb3NlOiB0cnVlLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgaWQ6ICcwMDAwMDAwMDcnLAorICAgICAgICBhdmF0YXI6CisgICAgICAgICAgJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy93NW1SUVkyQW1FRUFBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIHRpdGxlOiAn5pyx5YGP5Y+zIOWbnuWkjeS6huS9oCcsCisgICAgICAgIGRlc2NyaXB0aW9uOiAn6L+Z56eN5qih5p2/55So5LqO5o+Q6YaS6LCB5LiO5L2g5Y+R55Sf5LqG5LqS5Yqo77yM5bem5L6n5pS+44CO6LCB44CP55qE5aS05YOPJywKKyAgICAgICAgZGF0ZXRpbWU6ICcyMDE3LTA4LTA3JywKKyAgICAgICAgdHlwZTogJ21lc3NhZ2UnLAorICAgICAgICBjbGlja0Nsb3NlOiB0cnVlLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgaWQ6ICcwMDAwMDAwMDgnLAorICAgICAgICBhdmF0YXI6CisgICAgICAgICAgJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy93UGFkUjVNOTkxOEFBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIHRpdGxlOiAn5qCH6aKYJywKKyAgICAgICAgZGVzY3JpcHRpb246ICfov5nnp43mqKHmnb/nlKjkuo7mj5DphpLosIHkuI7kvaDlj5HnlJ/kuobkupLliqjvvIzlt6bkvqfmlL7jgI7osIHjgI/nmoTlpLTlg48nLAorICAgICAgICBkYXRldGltZTogJzIwMTctMDgtMDcnLAorICAgICAgICB0eXBlOiAnbWVzc2FnZScsCisgICAgICAgIGNsaWNrQ2xvc2U6IHRydWUsCisgICAgICB9LAorICAgICAgeworICAgICAgICBpZDogJzAwMDAwMDAwOScsCisgICAgICAgIHRpdGxlOiAn5Lu75Yqh5ZCN56ewJywKKyAgICAgICAgZGVzY3JpcHRpb246ICfku7vliqHpnIDopoHlnKggMjAxNy0wMS0xMiAyMDowMCDliY3lkK/liqgnLAorICAgICAgICBleHRyYTogJ+acquW8gOWniycsCisgICAgICAgIHN0YXR1czogJ3RvZG8nLAorICAgICAgICB0eXBlOiAnZXZlbnQnLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgaWQ6ICcwMDAwMDAwMTAnLAorICAgICAgICB0aXRsZTogJ+esrOS4ieaWuee0p+aApeS7o+eggeWPmOabtCcsCisgICAgICAgIGRlc2NyaXB0aW9uOiAn5Yag6ZyW5o+Q5Lqk5LqOIDIwMTctMDEtMDbvvIzpnIDlnKggMjAxNy0wMS0wNyDliY3lrozmiJDku6PnoIHlj5jmm7Tku7vliqEnLAorICAgICAgICBleHRyYTogJ+mprOS4iuWIsOacnycsCisgICAgICAgIHN0YXR1czogJ3VyZ2VudCcsCisgICAgICAgIHR5cGU6ICdldmVudCcsCisgICAgICB9LAorICAgICAgeworICAgICAgICBpZDogJzAwMDAwMDAxMScsCisgICAgICAgIHRpdGxlOiAn5L+h5oGv5a6J5YWo6ICD6K+VJywKKyAgICAgICAgZGVzY3JpcHRpb246ICfmjIfmtL7nq7nlsJTkuo4gMjAxNy0wMS0wOSDliY3lrozmiJDmm7TmlrDlubblj5HluIMnLAorICAgICAgICBleHRyYTogJ+W3suiAl+aXtiA4IOWkqScsCisgICAgICAgIHN0YXR1czogJ2RvaW5nJywKKyAgICAgICAgdHlwZTogJ2V2ZW50JywKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGlkOiAnMDAwMDAwMDEyJywKKyAgICAgICAgdGl0bGU6ICdBQkNEIOeJiOacrOWPkeW4gycsCisgICAgICAgIGRlc2NyaXB0aW9uOiAn5Yag6ZyW5o+Q5Lqk5LqOIDIwMTctMDEtMDbvvIzpnIDlnKggMjAxNy0wMS0wNyDliY3lrozmiJDku6PnoIHlj5jmm7Tku7vliqEnLAorICAgICAgICBleHRyYTogJ+i/m+ihjOS4rScsCisgICAgICAgIHN0YXR1czogJ3Byb2Nlc3NpbmcnLAorICAgICAgICB0eXBlOiAnZXZlbnQnLAorICAgICAgfSwKKyAgICBdLAorICB9KTsKK307CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ0dFVCAvYXBpL25vdGljZXMnOiBnZXROb3RpY2VzLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL21vY2svcmVxdWVzdFJlY29yZC5tb2NrLmpzIGIvcmVhY3QtdWkvbW9jay9yZXF1ZXN0UmVjb3JkLm1vY2suanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OWUxOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL21vY2svcmVxdWVzdFJlY29yZC5tb2NrLmpzCkBAIC0wLDAgKzEsMzI0IEBACittb2R1bGUuZXhwb3J0cyA9IHsKKyAgJ0dFVCAvYXBpL2N1cnJlbnRVc2VyJzogeworICAgIGRhdGE6IHsKKyAgICAgIG5hbWU6ICdTZXJhdGkgTWEnLAorICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL0JpYXpmYW54bWFtTlJveHhWeGthLnBuZycsCisgICAgICB1c2VyaWQ6ICcwMDAwMDAwMScsCisgICAgICBlbWFpbDogJ2FudGRlc2lnbkBhbGlwYXkuY29tJywKKyAgICAgIHNpZ25hdHVyZTogJ+a1t+e6s+eZvuW3ne+8jOacieWuueS5g+WkpycsCisgICAgICB0aXRsZTogJ+S6pOS6kuS4k+WuticsCisgICAgICBncm91cDogJ+iaguiagemHkeacje+8jeafkOafkOafkOS6i+S4mue+pO+8jeafkOafkOW5s+WPsOmDqO+8jeafkOafkOaKgOacr+mDqO+8jVVFRCcsCisgICAgICB0YWdzOiBbCisgICAgICAgIHsga2V5OiAnMCcsIGxhYmVsOiAn5b6I5pyJ5oOz5rOV55qEJyB9LAorICAgICAgICB7IGtleTogJzEnLCBsYWJlbDogJ+S4k+azqOiuvuiuoScgfSwKKyAgICAgICAgeyBrZXk6ICcyJywgbGFiZWw6ICfovqN+JyB9LAorICAgICAgICB7IGtleTogJzMnLCBsYWJlbDogJ+Wkp+mVv+iFvycgfSwKKyAgICAgICAgeyBrZXk6ICc0JywgbGFiZWw6ICflt53lprnlrZAnIH0sCisgICAgICAgIHsga2V5OiAnNScsIGxhYmVsOiAn5rW357qz55m+5bedJyB9LAorICAgICAgXSwKKyAgICAgIG5vdGlmeUNvdW50OiAxMiwKKyAgICAgIHVucmVhZENvdW50OiAxMSwKKyAgICAgIGNvdW50cnk6ICdDaGluYScsCisgICAgICBnZW9ncmFwaGljOiB7CisgICAgICAgIHByb3ZpbmNlOiB7IGxhYmVsOiAn5rWZ5rGf55yBJywga2V5OiAnMzMwMDAwJyB9LAorICAgICAgICBjaXR5OiB7IGxhYmVsOiAn5p2t5bee5biCJywga2V5OiAnMzMwMTAwJyB9LAorICAgICAgfSwKKyAgICAgIGFkZHJlc3M6ICfopb/muZbljLrlt6XkuJPot68gNzcg5Y+3JywKKyAgICAgIHBob25lOiAnMDc1Mi0yNjg4ODg4ODgnLAorICAgIH0sCisgIH0sCisgICdHRVQgL2FwaS9ydWxlJzogeworICAgIGRhdGE6IFsKKyAgICAgIHsKKyAgICAgICAga2V5OiA5OSwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTknLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDUwMywKKyAgICAgICAgc3RhdHVzOiAnMCcsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA4MSwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTgsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDk4JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiAxNjQsCisgICAgICAgIHN0YXR1czogJzAnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMTIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDk3LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5NycsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMTc0LAorICAgICAgICBzdGF0dXM6ICcxJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDgxLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5NiwKKyAgICAgICAgZGlzYWJsZWQ6IHRydWUsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5NicsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogOTE0LAorICAgICAgICBzdGF0dXM6ICcwJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDcsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDk1LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5NScsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogNjk4LAorICAgICAgICBzdGF0dXM6ICcyJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDgyLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5NCwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTQnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDQ4OCwKKyAgICAgICAgc3RhdHVzOiAnMScsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiAxNCwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTMsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDkzJywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA1ODAsCisgICAgICAgIHN0YXR1czogJzInLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogNzcsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDkyLAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5MicsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMjQ0LAorICAgICAgICBzdGF0dXM6ICczJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDU4LAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5MSwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTEnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDk1OSwKKyAgICAgICAgc3RhdHVzOiAnMCcsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA2NiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTAsCisgICAgICAgIGRpc2FibGVkOiB0cnVlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTAnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDk1OCwKKyAgICAgICAgc3RhdHVzOiAnMCcsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA3MiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODksCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDg5JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiAzMDEsCisgICAgICAgIHN0YXR1czogJzInLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODgsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDg4JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiAyNzcsCisgICAgICAgIHN0YXR1czogJzEnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMTIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDg3LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4NycsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogODEwLAorICAgICAgICBzdGF0dXM6ICcxJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDgyLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4NiwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgODYnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDc4MCwKKyAgICAgICAgc3RhdHVzOiAnMycsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiAyMiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODUsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDg1JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA3MDUsCisgICAgICAgIHN0YXR1czogJzMnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMTIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDg0LAorICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDg0JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiAyMDMsCisgICAgICAgIHN0YXR1czogJzAnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogNzksCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDgzLAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4MycsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogNDkxLAorICAgICAgICBzdGF0dXM6ICcyJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDU5LAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4MiwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgODInLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDczLAorICAgICAgICBzdGF0dXM6ICcwJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDEwMCwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODEsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDgxJywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA0MDYsCisgICAgICAgIHN0YXR1czogJzMnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogNjEsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDgwLAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4MCcsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMTEyLAorICAgICAgICBzdGF0dXM6ICcyJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDIwLAorICAgICAgfSwKKyAgICBdLAorICAgIHRvdGFsOiAxMDAsCisgICAgc3VjY2VzczogdHJ1ZSwKKyAgICBwYWdlU2l6ZTogMjAsCisgICAgY3VycmVudDogMSwKKyAgfSwKKyAgJ1BPU1QgL2FwaS9sb2dpbi9vdXRMb2dpbic6IHsgZGF0YToge30sIHN1Y2Nlc3M6IHRydWUgfSwKKyAgJ1BPU1QgL2FwaS9sb2dpbi9hY2NvdW50JzogeworICAgIHN0YXR1czogJ29rJywKKyAgICB0eXBlOiAnYWNjb3VudCcsCisgICAgY3VycmVudEF1dGhvcml0eTogJ2FkbWluJywKKyAgfSwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9tb2NrL3JvdXRlLnRzIGIvcmVhY3QtdWkvbW9jay9yb3V0ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThkMTBmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvbW9jay9yb3V0ZS50cwpAQCAtMCwwICsxLDUgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJy9hcGkvYXV0aF9yb3V0ZXMnOiB7CisgICAgJy9mb3JtL2FkdmFuY2VkLWZvcm0nOiB7IGF1dGhvcml0eTogWydhZG1pbicsICd1c2VyJ10gfSwKKyAgfSwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9tb2NrL3VzZXIudHMgYi9yZWFjdC11aS9tb2NrL3VzZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZGQzNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL21vY2svdXNlci50cwpAQCAtMCwwICsxLDIwMyBAQAoraW1wb3J0IHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJzsKKworY29uc3Qgd2FpdFRpbWUgPSAodGltZTogbnVtYmVyID0gMTAwKSA9PiB7CisgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geworICAgIHNldFRpbWVvdXQoKCkgPT4geworICAgICAgcmVzb2x2ZSh0cnVlKTsKKyAgICB9LCB0aW1lKTsKKyAgfSk7Cit9OworCithc3luYyBmdW5jdGlvbiBnZXRGYWtlQ2FwdGNoYShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHsKKyAgYXdhaXQgd2FpdFRpbWUoMjAwMCk7CisgIHJldHVybiByZXMuanNvbignY2FwdGNoYS14eHgnKTsKK30KKworY29uc3QgeyBBTlRfREVTSUdOX1BST19PTkxZX0RPX05PVF9VU0VfSU5fWU9VUl9QUk9EVUNUSU9OIH0gPSBwcm9jZXNzLmVudjsKKworLyoqCisgKiDlvZPliY3nlKjmiLfnmoTmnYPpmZDvvIzlpoLmnpzkuLrnqbrku6PooajmsqHnmbvlvZUKKyAqIGN1cnJlbnQgdXNlciBhY2Nlc3PvvIwgaWYgaXMgJycsIHVzZXIgbmVlZCBsb2dpbgorICog5aaC5p6c5pivIHBybyDnmoTpooTop4jvvIzpu5jorqTmmK/mnInmnYPpmZDnmoQKKyAqLworbGV0IGFjY2VzcyA9IEFOVF9ERVNJR05fUFJPX09OTFlfRE9fTk9UX1VTRV9JTl9ZT1VSX1BST0RVQ1RJT04gPT09ICdzaXRlJyA/ICdhZG1pbicgOiAnJzsKKworY29uc3QgZ2V0QWNjZXNzID0gKCkgPT4geworICByZXR1cm4gYWNjZXNzOworfTsKKworLy8g5Luj56CB5Lit5Lya5YW85a655pys5ZywIHNlcnZpY2UgbW9jayDku6Xlj4rpg6jnvbLnq5nngrnnmoTpnZnmgIHmlbDmja4KK2V4cG9ydCBkZWZhdWx0IHsKKyAgLy8g5pSv5oyB5YC85Li6IE9iamVjdCDlkowgQXJyYXkKKyAgJ0dFVCAvYXBpL2N1cnJlbnRVc2VyJzogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4geworICAgIGlmICghZ2V0QWNjZXNzKCkpIHsKKyAgICAgIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHsKKyAgICAgICAgZGF0YTogeworICAgICAgICAgIGlzTG9naW46IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBlcnJvckNvZGU6ICc0MDEnLAorICAgICAgICBlcnJvck1lc3NhZ2U6ICfor7flhYjnmbvlvZXvvIEnLAorICAgICAgICBzdWNjZXNzOiB0cnVlLAorICAgICAgfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcy5zZW5kKHsKKyAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICBkYXRhOiB7CisgICAgICAgIG5hbWU6ICdTZXJhdGkgTWEnLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9hbnRmaW5jZG4vWEFvc1h1Tlp5Ri9CaWF6ZmFueG1hbU5Sb3h4VnhrYS5wbmcnLAorICAgICAgICB1c2VyaWQ6ICcwMDAwMDAwMScsCisgICAgICAgIGVtYWlsOiAnYW50ZGVzaWduQGFsaXBheS5jb20nLAorICAgICAgICBzaWduYXR1cmU6ICfmtbfnurPnmb7lt53vvIzmnInlrrnkuYPlpKcnLAorICAgICAgICB0aXRsZTogJ+S6pOS6kuS4k+WuticsCisgICAgICAgIGdyb3VwOiAn6JqC6JqB6YeR5pyN77yN5p+Q5p+Q5p+Q5LqL5Lia576k77yN5p+Q5p+Q5bmz5Y+w6YOo77yN5p+Q5p+Q5oqA5pyv6YOo77yNVUVEJywKKyAgICAgICAgdGFnczogWworICAgICAgICAgIHsKKyAgICAgICAgICAgIGtleTogJzAnLAorICAgICAgICAgICAgbGFiZWw6ICflvojmnInmg7Pms5XnmoQnLAorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAga2V5OiAnMScsCisgICAgICAgICAgICBsYWJlbDogJ+S4k+azqOiuvuiuoScsCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICBrZXk6ICcyJywKKyAgICAgICAgICAgIGxhYmVsOiAn6L6jficsCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICBrZXk6ICczJywKKyAgICAgICAgICAgIGxhYmVsOiAn5aSn6ZW/6IW/JywKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGtleTogJzQnLAorICAgICAgICAgICAgbGFiZWw6ICflt53lprnlrZAnLAorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAga2V5OiAnNScsCisgICAgICAgICAgICBsYWJlbDogJ+a1t+e6s+eZvuW3nScsCisgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICAgICAgbm90aWZ5Q291bnQ6IDEyLAorICAgICAgICB1bnJlYWRDb3VudDogMTEsCisgICAgICAgIGNvdW50cnk6ICdDaGluYScsCisgICAgICAgIGFjY2VzczogZ2V0QWNjZXNzKCksCisgICAgICAgIGdlb2dyYXBoaWM6IHsKKyAgICAgICAgICBwcm92aW5jZTogeworICAgICAgICAgICAgbGFiZWw6ICfmtZnmsZ/nnIEnLAorICAgICAgICAgICAga2V5OiAnMzMwMDAwJywKKyAgICAgICAgICB9LAorICAgICAgICAgIGNpdHk6IHsKKyAgICAgICAgICAgIGxhYmVsOiAn5p2t5bee5biCJywKKyAgICAgICAgICAgIGtleTogJzMzMDEwMCcsCisgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgYWRkcmVzczogJ+ilv+a5luWMuuW3peS4k+i3ryA3NyDlj7cnLAorICAgICAgICBwaG9uZTogJzA3NTItMjY4ODg4ODg4JywKKyAgICAgIH0sCisgICAgfSk7CisgIH0sCisgIC8vIEdFVCBQT1NUIOWPr+ecgeeVpQorICAnR0VUIC9hcGkvdXNlcnMnOiBbCisgICAgeworICAgICAga2V5OiAnMScsCisgICAgICBuYW1lOiAnSm9obiBCcm93bicsCisgICAgICBhZ2U6IDMyLAorICAgICAgYWRkcmVzczogJ05ldyBZb3JrIE5vLiAxIExha2UgUGFyaycsCisgICAgfSwKKyAgICB7CisgICAgICBrZXk6ICcyJywKKyAgICAgIG5hbWU6ICdKaW0gR3JlZW4nLAorICAgICAgYWdlOiA0MiwKKyAgICAgIGFkZHJlc3M6ICdMb25kb24gTm8uIDEgTGFrZSBQYXJrJywKKyAgICB9LAorICAgIHsKKyAgICAgIGtleTogJzMnLAorICAgICAgbmFtZTogJ0pvZSBCbGFjaycsCisgICAgICBhZ2U6IDMyLAorICAgICAgYWRkcmVzczogJ1NpZG5leSBOby4gMSBMYWtlIFBhcmsnLAorICAgIH0sCisgIF0sCisgICdQT1NUIC9hcGkvbG9naW4vYWNjb3VudCc6IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHsKKyAgICBjb25zdCB7IHBhc3N3b3JkLCB1c2VybmFtZSwgdHlwZSB9ID0gcmVxLmJvZHk7CisgICAgYXdhaXQgd2FpdFRpbWUoMjAwMCk7CisgICAgaWYgKHBhc3N3b3JkID09PSAnYW50LmRlc2lnbicgJiYgdXNlcm5hbWUgPT09ICdhZG1pbicpIHsKKyAgICAgIHJlcy5zZW5kKHsKKyAgICAgICAgc3RhdHVzOiAnb2snLAorICAgICAgICB0eXBlLAorICAgICAgICBjdXJyZW50QXV0aG9yaXR5OiAnYWRtaW4nLAorICAgICAgfSk7CisgICAgICBhY2Nlc3MgPSAnYWRtaW4nOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocGFzc3dvcmQgPT09ICdhbnQuZGVzaWduJyAmJiB1c2VybmFtZSA9PT0gJ3VzZXInKSB7CisgICAgICByZXMuc2VuZCh7CisgICAgICAgIHN0YXR1czogJ29rJywKKyAgICAgICAgdHlwZSwKKyAgICAgICAgY3VycmVudEF1dGhvcml0eTogJ3VzZXInLAorICAgICAgfSk7CisgICAgICBhY2Nlc3MgPSAndXNlcic7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh0eXBlID09PSAnbW9iaWxlJykgeworICAgICAgcmVzLnNlbmQoeworICAgICAgICBzdGF0dXM6ICdvaycsCisgICAgICAgIHR5cGUsCisgICAgICAgIGN1cnJlbnRBdXRob3JpdHk6ICdhZG1pbicsCisgICAgICB9KTsKKyAgICAgIGFjY2VzcyA9ICdhZG1pbic7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzLnNlbmQoeworICAgICAgc3RhdHVzOiAnZXJyb3InLAorICAgICAgdHlwZSwKKyAgICAgIGN1cnJlbnRBdXRob3JpdHk6ICdndWVzdCcsCisgICAgfSk7CisgICAgYWNjZXNzID0gJ2d1ZXN0JzsKKyAgfSwKKyAgJ1BPU1QgL2FwaS9sb2dpbi9vdXRMb2dpbic6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHsKKyAgICBhY2Nlc3MgPSAnJzsKKyAgICByZXMuc2VuZCh7IGRhdGE6IHt9LCBzdWNjZXNzOiB0cnVlIH0pOworICB9LAorICAnUE9TVCAvYXBpL3JlZ2lzdGVyJzogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4geworICAgIHJlcy5zZW5kKHsgc3RhdHVzOiAnb2snLCBjdXJyZW50QXV0aG9yaXR5OiAndXNlcicsIHN1Y2Nlc3M6IHRydWUgfSk7CisgIH0sCisgICdHRVQgL2FwaS81MDAnOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7CisgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoeworICAgICAgdGltZXN0YW1wOiAxNTEzOTMyNTU1MTA0LAorICAgICAgc3RhdHVzOiA1MDAsCisgICAgICBlcnJvcjogJ2Vycm9yJywKKyAgICAgIG1lc3NhZ2U6ICdlcnJvcicsCisgICAgICBwYXRoOiAnL2Jhc2UvY2F0ZWdvcnkvbGlzdCcsCisgICAgfSk7CisgIH0sCisgICdHRVQgL2FwaS80MDQnOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7CisgICAgcmVzLnN0YXR1cyg0MDQpLnNlbmQoeworICAgICAgdGltZXN0YW1wOiAxNTEzOTMyNjQzNDMxLAorICAgICAgc3RhdHVzOiA0MDQsCisgICAgICBlcnJvcjogJ05vdCBGb3VuZCcsCisgICAgICBtZXNzYWdlOiAnTm8gbWVzc2FnZSBhdmFpbGFibGUnLAorICAgICAgcGF0aDogJy9iYXNlL2NhdGVnb3J5L2xpc3QvMjEyMTIxMicsCisgICAgfSk7CisgIH0sCisgICdHRVQgL2FwaS80MDMnOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7CisgICAgcmVzLnN0YXR1cyg0MDMpLnNlbmQoeworICAgICAgdGltZXN0YW1wOiAxNTEzOTMyNTU1MTA0LAorICAgICAgc3RhdHVzOiA0MDMsCisgICAgICBlcnJvcjogJ0ZvcmJpZGRlbicsCisgICAgICBtZXNzYWdlOiAnRm9yYmlkZGVuJywKKyAgICAgIHBhdGg6ICcvYmFzZS9jYXRlZ29yeS9saXN0JywKKyAgICB9KTsKKyAgfSwKKyAgJ0dFVCAvYXBpLzQwMSc6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHsKKyAgICByZXMuc3RhdHVzKDQwMSkuc2VuZCh7CisgICAgICB0aW1lc3RhbXA6IDE1MTM5MzI1NTUxMDQsCisgICAgICBzdGF0dXM6IDQwMSwKKyAgICAgIGVycm9yOiAnVW5hdXRob3JpemVkJywKKyAgICAgIG1lc3NhZ2U6ICdVbmF1dGhvcml6ZWQnLAorICAgICAgcGF0aDogJy9iYXNlL2NhdGVnb3J5L2xpc3QnLAorICAgIH0pOworICB9LAorCisgICdHRVQgIC9hcGkvbG9naW4vY2FwdGNoYSc6IGdldEZha2VDYXB0Y2hhLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3BhY2thZ2UuanNvbiBiL3JlYWN0LXVpL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzYzZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsMTQzIEBACit7CisgICJuYW1lIjogImFudC1kZXNpZ24tcHJvIiwKKyAgInZlcnNpb24iOiAiNi4wLjAiLAorICAicHJpdmF0ZSI6IHRydWUsCisgICJkZXNjcmlwdGlvbiI6ICJBbiBvdXQtb2YtYm94IFVJIHNvbHV0aW9uIGZvciBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyIsCisgICJzY3JpcHRzIjogeworICAgICJkZXYiOiAibnBtIHJ1biBzdGFydDpkZXYiLAorICAgICJidWlsZCI6ICJtYXggYnVpbGQiLAorICAgICJkZXBsb3kiOiAibnBtIHJ1biBidWlsZCAmJiBucG0gcnVuIGdoLXBhZ2VzIiwKKyAgICAicHJldmlldyI6ICJucG0gcnVuIGJ1aWxkICYmIG1heCBwcmV2aWV3IC0tcG9ydCA4MDAwIiwKKyAgICAic2VydmUiOiAidW1pLXNlcnZlIiwKKyAgICAic3RhcnQiOiAiY3Jvc3MtZW52IFVNSV9FTlY9ZGV2IG1heCBkZXYiLAorICAgICJzdGFydDpkZXYiOiAiY3Jvc3MtZW52IFJFQUNUX0FQUF9FTlY9ZGV2IE1PQ0s9bm9uZSBVTUlfRU5WPWRldiBtYXggZGV2IiwKKyAgICAic3RhcnQ6bm8tbW9jayI6ICJjcm9zcy1lbnYgTU9DSz1ub25lIFVNSV9FTlY9ZGV2IG1heCBkZXYiLAorICAgICJzdGFydDpwcmUiOiAiY3Jvc3MtZW52IFJFQUNUX0FQUF9FTlY9cHJlIFVNSV9FTlY9ZGV2IG1heCBkZXYiLAorICAgICJzdGFydDp0ZXN0IjogImNyb3NzLWVudiBSRUFDVF9BUFBfRU5WPXRlc3QgTU9DSz1ub25lIFVNSV9FTlY9ZGV2IG1heCBkZXYiLAorICAgICJ0ZXN0IjogImplc3QiLAorICAgICJ0ZXN0OmNvdmVyYWdlIjogIm5wbSBydW4gamVzdCAtLSAtLWNvdmVyYWdlIiwKKyAgICAidGVzdDp1cGRhdGUiOiAibnBtIHJ1biBqZXN0IC0tIC11IiwKKyAgICAiZG9ja2VyLWh1YjpidWlsZCI6ICJkb2NrZXIgYnVpbGQgIC1mIERvY2tlcmZpbGUuaHViIC10ICBhbnQtZGVzaWduLXBybyAuLyIsCisgICAgImRvY2tlci1wcm9kOmJ1aWxkIjogImRvY2tlci1jb21wb3NlIC1mIC4vZG9ja2VyL2RvY2tlci1jb21wb3NlLnltbCBidWlsZCIsCisgICAgImRvY2tlci1wcm9kOmRldiI6ICJkb2NrZXItY29tcG9zZSAtZiAuL2RvY2tlci9kb2NrZXItY29tcG9zZS55bWwgdXAiLAorICAgICJkb2NrZXI6YnVpbGQiOiAiZG9ja2VyLWNvbXBvc2UgLWYgLi9kb2NrZXIvZG9ja2VyLWNvbXBvc2UuZGV2LnltbCBidWlsZCIsCisgICAgImRvY2tlcjpkZXYiOiAiZG9ja2VyLWNvbXBvc2UgLWYgLi9kb2NrZXIvZG9ja2VyLWNvbXBvc2UuZGV2LnltbCB1cCIsCisgICAgImRvY2tlcjpwdXNoIjogIm5wbSBydW4gZG9ja2VyLWh1YjpidWlsZCAmJiBucG0gcnVuIGRvY2tlcjp0YWcgJiYgZG9ja2VyIHB1c2ggYW50ZGVzaWduL2FudC1kZXNpZ24tcHJvIiwKKyAgICAiZG9ja2VyOnRhZyI6ICJkb2NrZXIgdGFnIGFudC1kZXNpZ24tcHJvIGFudGRlc2lnbi9hbnQtZGVzaWduLXBybyIsCisgICAgImFuYWx5emUiOiAiY3Jvc3MtZW52IEFOQUxZWkU9MSBtYXggYnVpbGQiLAorICAgICJnaC1wYWdlcyI6ICJnaC1wYWdlcyAtZCBkaXN0IiwKKyAgICAiaTE4bi1yZW1vdmUiOiAicHJvIGkxOG4tcmVtb3ZlIC0tbG9jYWxlPXpoLUNOIC0td3JpdGUiLAorICAgICJwb3N0aW5zdGFsbCI6ICJtYXggc2V0dXAiLAorICAgICJqZXN0IjogImplc3QiLAorICAgICJsaW50IjogIm5wbSBydW4gbGludDpqcyAmJiBucG0gcnVuIGxpbnQ6cHJldHRpZXIgJiYgbnBtIHJ1biB0c2MiLAorICAgICJsaW50LXN0YWdlZCI6ICJsaW50LXN0YWdlZCIsCisgICAgImxpbnQtc3RhZ2VkOmpzIjogImVzbGludCAtLWV4dCAuanMsLmpzeCwudHMsLnRzeCAiLAorICAgICJsaW50OmZpeCI6ICJlc2xpbnQgLS1maXggLS1jYWNoZSAtLWV4dCAuanMsLmpzeCwudHMsLnRzeCAtLWZvcm1hdD1wcmV0dHkgLi9zcmMgIiwKKyAgICAibGludDpqcyI6ICJlc2xpbnQgLS1jYWNoZSAtLWV4dCAuanMsLmpzeCwudHMsLnRzeCAtLWZvcm1hdD1wcmV0dHkgLi9zcmMiLAorICAgICJsaW50OnByZXR0aWVyIjogInByZXR0aWVyIC1jIC0td3JpdGUgXCIqKi8qKi57anMsanN4LHRzeCx0cyxsZXNzLG1kLGpzb259XCIgLS1lbmQtb2YtbGluZSBhdXRvIiwKKyAgICAib3BlbmFwaSI6ICJtYXggb3BlbmFwaSIsCisgICAgInByZXBhcmUiOiAiY2QgLi4gJiYgaHVza3kgaW5zdGFsbCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC1jIC0td3JpdGUgXCIqKi8qKi57anMsanN4LHRzeCx0cyxsZXNzLG1kLGpzb259XCIiLAorICAgICJ0c2MiOiAidHNjIC0tbm9FbWl0IiwKKyAgICAicmVjb3JkIjogImNyb3NzLWVudiBOT0RFX0VOVj1kZXZlbG9wbWVudCBSRUFDVF9BUFBfRU5WPXRlc3QgbWF4IHJlY29yZCAtLXNjZW5lPWxvZ2luIgorICB9LAorICAibGludC1zdGFnZWQiOiB7CisgICAgIioqLyoue2pzLGpzeCx0cyx0c3h9IjogIm5wbSBydW4gbGludC1zdGFnZWQ6anMiLAorICAgICIqKi8qLntqcyxqc3gsdHN4LHRzLGxlc3MsbWQsanNvbn0iOiBbCisgICAgICAicHJldHRpZXIgLS13cml0ZSIKKyAgICBdCisgIH0sCisgICJicm93c2Vyc2xpc3QiOiBbCisgICAgIj4gMSUiLAorICAgICJsYXN0IDIgdmVyc2lvbnMiLAorICAgICJub3QgaWUgPD0gMTAiCisgIF0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgIkBhbnQtZGVzaWduL2ljb25zIjogIl41LjUuMCIsCisgICAgIkBhbnQtZGVzaWduL3Bsb3RzIjogIl4yLjMuMiIsCisgICAgIkBhbnQtZGVzaWduL3Byby1jb21wb25lbnRzIjogIl4yLjcuMTkiLAorICAgICJAYW50LWRlc2lnbi91c2UtZW1vdGlvbi1jc3MiOiAiMS4wLjQiLAorICAgICJAdGVzdGluZy1saWJyYXJ5L2RvbSI6ICJeMTAuNC4wIiwKKyAgICAiQHVtaWpzL3JvdXRlLXV0aWxzIjogIl40LjAuMSIsCisgICAgImFudC1kZXNpZ24tcHJvIjogImZpbGU6IiwKKyAgICAiYW50ZCI6ICJeNS4yMS4xIiwKKyAgICAiYW50ZC1zdHlsZSI6ICJeMy42LjIiLAorICAgICJjbGFzc25hbWVzIjogIl4yLjUuMSIsCisgICAgImRheWpzIjogIl4xLjExLjEzIiwKKyAgICAiZmFicmljIjogIl42LjQuMCIsCisgICAgImhpZ2hsaWdodC5qcyI6ICJeMTEuMTAuMCIsCisgICAgImxvZGFzaCI6ICJeNC4xNy4yMSIsCisgICAgIm1vbWVudCI6ICJeMi4zMC4xIiwKKyAgICAib21pdC5qcyI6ICJeMi4wLjIiLAorICAgICJxdWVyeS1zdHJpbmciOiAiXjkuMS4wIiwKKyAgICAicmMtbWVudSI6ICJeOS4xNS4wIiwKKyAgICAicmMtdXRpbCI6ICJeNS40My4wIiwKKyAgICAicmVhY3QiOiAiXjE4LjMuMCIsCisgICAgInJlYWN0LWNyb3BwZXIiOiAiXjIuMy4zIiwKKyAgICAicmVhY3QtZGV2LWluc3BlY3RvciI6ICJeMi4wLjEiLAorICAgICJyZWFjdC1kb20iOiAiXjE4LjMuMCIsCisgICAgInJlYWN0LWhlbG1ldC1hc3luYyI6ICJeMi4wLjAiLAorICAgICJyZWFjdC1oaWdobGlnaHQiOiAiXjAuMTUuMCIKKyAgfSwKKyAgImRldkRlcGVuZGVuY2llcyI6IHsKKyAgICAiQGFudC1kZXNpZ24vcHJvLWNsaSI6ICJeMy4zLjAiLAorICAgICJAdGVzdGluZy1saWJyYXJ5L3JlYWN0IjogIl4xNi4wLjEiLAorICAgICJAdHlwZXMvY2xhc3NuYW1lcyI6ICJeMi4zLjEiLAorICAgICJAdHlwZXMvZXhwcmVzcyI6ICJeNC4xNy4yMSIsCisgICAgIkB0eXBlcy9oaXN0b3J5IjogIl40LjcuMTEiLAorICAgICJAdHlwZXMvamVzdCI6ICJeMjkuNS4xMiIsCisgICAgIkB0eXBlcy9sb2Rhc2giOiAiXjQuMTcuNCIsCisgICAgIkB0eXBlcy9yZWFjdCI6ICJeMTguMy4wIiwKKyAgICAiQHR5cGVzL3JlYWN0LWRvbSI6ICJeMTguMy4wIiwKKyAgICAiQHR5cGVzL3JlYWN0LWhlbG1ldCI6ICJeNi4xLjExIiwKKyAgICAiQHVtaWpzL2ZhYnJpYyI6ICJeMi4xNC4xIiwKKyAgICAiQHVtaWpzL2xpbnQiOiAiXjQuMi45IiwKKyAgICAiQHVtaWpzL21heCI6ICJeNC4yLjkiLAorICAgICJjcm9zcy1lbnYiOiAiXjcuMC4zIiwKKyAgICAiZXNsaW50IjogIl45LjExLjAiLAorICAgICJleHByZXNzIjogIl40LjIxLjAiLAorICAgICJnaC1wYWdlcyI6ICJeNi4xLjAiLAorICAgICJodXNreSI6ICJeOS4xLjMiLAorICAgICJqZXN0IjogIl4yOS43LjAiLAorICAgICJqZXN0LWVudmlyb25tZW50LWpzZG9tIjogIl4yOS43LjAiLAorICAgICJsaW50LXN0YWdlZCI6ICJeMTUuMi4wIiwKKyAgICAibW9ja2pzIjogIl4xLjEuMCIsCisgICAgInByZXR0aWVyIjogIl4zLjMuMCIsCisgICAgInN3YWdnZXItdWktZGlzdCI6ICJeNS4xNy4xNCIsCisgICAgInRzLW5vZGUiOiAiXjEwLjkuMSIsCisgICAgInR5cGVzY3JpcHQiOiAiXjUuNi4yIiwKKyAgICAidW1pLXByZXNldHMtcHJvIjogIl4yLjAuMCIKKyAgfSwKKyAgImVuZ2luZXMiOiB7CisgICAgIm5vZGUiOiAiPj0xMi4wLjAiCisgIH0sCisgICJjcmVhdGUtdW1pIjogeworICAgICJpZ25vcmVTY3JpcHQiOiBbCisgICAgICAiZG9ja2VyKiIsCisgICAgICAiZnVuY3Rpb25zKiIsCisgICAgICAic2l0ZSIsCisgICAgICAiZ2VuZXJhdGVNb2NrIgorICAgIF0sCisgICAgImlnbm9yZURlcGVuZGVuY2llcyI6IFsKKyAgICAgICJuZXRsaWZ5KiIsCisgICAgICAic2VydmVybGVzcyIKKyAgICBdLAorICAgICJpZ25vcmUiOiBbCisgICAgICAiLmRvY2tlcmlnbm9yZSIsCisgICAgICAiLmdpdCIsCisgICAgICAiLmdpdGh1YiIsCisgICAgICAiLmdpdHBvZC55bWwiLAorICAgICAgIkNPREVfT0ZfQ09ORFVDVC5tZCIsCisgICAgICAiRG9ja2VyZmlsZSIsCisgICAgICAiRG9ja2VyZmlsZS4qIiwKKyAgICAgICJsYW1iZGEiLAorICAgICAgIkxJQ0VOU0UiLAorICAgICAgIm5ldGxpZnkudG9tbCIsCisgICAgICAiUkVBRE1FLioubWQiLAorICAgICAgImF6dXJlLXBpcGVsaW5lcy55bWwiLAorICAgICAgImRvY2tlciIsCisgICAgICAiQ05BTUUiLAorICAgICAgImNyZWF0ZS11bWkiCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9wdWJsaWMvQ05BTUUgYi9yZWFjdC11aS9wdWJsaWMvQ05BTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMmQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3B1YmxpYy9DTkFNRQpAQCAtMCwwICsxIEBACitwcmV2aWV3LnByby5hbnQuZGVzaWduClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvcHVibGljL2Zhdmljb24uaWNvIGIvcmVhY3QtdWkvcHVibGljL2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTkzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9wdWJsaWMvZmF2aWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tMTI4eDEyOC5wbmcgYi9yZWFjdC11aS9wdWJsaWMvaWNvbnMvaWNvbi0xMjh4MTI4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQwZTIzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tMTI4eDEyOC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tMTkyeDE5Mi5wbmcgYi9yZWFjdC11aS9wdWJsaWMvaWNvbnMvaWNvbi0xOTJ4MTkyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhlOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tMTkyeDE5Mi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tNTEyeDUxMi5wbmcgYi9yZWFjdC11aS9wdWJsaWMvaWNvbnMvaWNvbi01MTJ4NTEyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZjMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvcHVibGljL2ljb25zL2ljb24tNTEyeDUxMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvcHVibGljL2xvZ28uc3ZnIGIvcmVhY3QtdWkvcHVibGljL2xvZ28uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWJmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9wdWJsaWMvbG9nby5zdmcKQEAgLTAsMCArMSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjAwIDIwMCI+PHRpdGxlPkdyb3VwIDI4IENvcHkgNTwvdGl0bGU+PGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudC0xIiB4MT0iNjIuMTAyJSIgeDI9IjEwOC4xOTclIiB5MT0iMCUiIHkyPSIzNy44NjQlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjNDI4NUVCIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMkVDN0ZGIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50LTIiIHgxPSI2OS42NDQlIiB4Mj0iNTQuMDQzJSIgeTE9IjAlIiB5Mj0iMTA4LjQ1NyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMyOUNERkYiLz48c3RvcCBvZmZzZXQ9IjM3Ljg2JSIgc3RvcC1jb2xvcj0iIzE0OEVGRiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzBBNjBGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudC0zIiB4MT0iNjkuNjkxJSIgeDI9IjE2LjcyMyUiIHkxPSItMTIuOTc0JSIgeTI9IjExNy4zOTElIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjRkE4MTZFIi8+PHN0b3Agb2Zmc2V0PSI0MS40NzMlIiBzdG9wLWNvbG9yPSIjRjc0QTVDIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjRjUxRDJDIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50LTQiIHgxPSI2OC4xMjglIiB4Mj0iMzAuNDQlIiB5MT0iLTM1LjY5MSUiIHkyPSIxMTQuOTQzJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI0ZBOEU3RCIvPjxzdG9wIG9mZnNldD0iNTEuMjY0JSIgc3RvcC1jb2xvcj0iI0Y3NEE1QyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI0Y1MUQyQyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxnIGlkPSJQYWdlLTEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiPjxnIGlkPSJsb2dvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAuMDAwMDAwLCAtMjAuMDAwMDAwKSI+PGcgaWQ9Ikdyb3VwLTI4LUNvcHktNSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAuMDAwMDAwLCAyMC4wMDAwMDApIj48ZyBpZD0iR3JvdXAtMjctQ29weS0zIj48ZyBpZD0iR3JvdXAtMjUiIGZpbGwtcnVsZT0ibm9uemVybyI+PGcgaWQ9IjIiPjxwYXRoIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xKSIgZD0iTTkxLjU4ODA4NjMsNC4xNzY1MjgyMyBMNC4xNzk5NjU0NCw5MS41MTI3NzI4IEMtMC41MTkyNDA2MDUsOTYuMjA4MTE0NiAtMC41MTkyNDA2MDUsMTAzLjc5MTg4NSA0LjE3OTk2NTQ0LDEwOC40ODcyMjcgTDkxLjU4ODA4NjMsMTk1LjgyMzQ3MiBDOTYuMjg3MjkyMywyMDAuNTE4ODE0IDEwMy44NzczMDQsMjAwLjUxODgxNCAxMDguNTc2NTEsMTk1LjgyMzQ3MiBMMTQ1LjIyNTQ4NywxNTkuMjA0NjMyIEMxNDkuNDMzOTY5LDE1NC45OTk2MTEgMTQ5LjQzMzk2OSwxNDguMTgxOTI0IDE0NS4yMjU0ODcsMTQzLjk3NjkwMyBDMTQxLjAxNzAwNSwxMzkuNzcxODgxIDEzNC4xOTM3MDcsMTM5Ljc3MTg4MSAxMjkuOTg1MjI1LDE0My45NzY5MDMgTDEwMi4yMDE5MywxNzEuNzM3MzUyIEMxMDEuMDMyMzA1LDE3Mi45MDYwMTUgOTkuMjU3MTYwOSwxNzIuOTA2MDE1IDk4LjA4NzUzNTksMTcxLjczNzM1MiBMMjguMjg1OTA4LDEwMS45OTMxMjIgQzI3LjExNjI4MzEsMTAwLjgyNDQ1OSAyNy4xMTYyODMxLDk5LjA1MDc3NSAyOC4yODU5MDgsOTcuODgyMTExOCBMOTguMDg3NTM1OSwyOC4xMzc4ODIzIEM5OS4yNTcxNjA5LDI2Ljk2OTIxOTEgMTAxLjAzMjMwNSwyNi45NjkyMTkxIDEwMi4yMDE5MywyOC4xMzc4ODIzIEwxMjkuOTg1MjI1LDU1Ljg5ODMzMTQgQzEzNC4xOTM3MDcsNjAuMTAzMzUyOCAxNDEuMDE3MDA1LDYwLjEwMzM1MjggMTQ1LjIyNTQ4Nyw1NS44OTgzMzE0IEMxNDkuNDMzOTY5LDUxLjY5MzMxIDE0OS40MzM5NjksNDQuODc1NjIzMiAxNDUuMjI1NDg3LDQwLjY3MDYwMTggTDEwOC41ODA1NSw0LjA1NTc0NTkyIEMxMDMuODYyMDQ5LC0wLjUzNzk4Njg0NiA5Ni4yNjkyNjE4LC0wLjUwMDc5NzkwNiA5MS41ODgwODYzLDQuMTc2NTI4MjMgWiIvPjxwYXRoIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0yKSIgZD0iTTkxLjU4ODA4NjMsNC4xNzY1MjgyMyBMNC4xNzk5NjU0NCw5MS41MTI3NzI4IEMtMC41MTkyNDA2MDUsOTYuMjA4MTE0NiAtMC41MTkyNDA2MDUsMTAzLjc5MTg4NSA0LjE3OTk2NTQ0LDEwOC40ODcyMjcgTDkxLjU4ODA4NjMsMTk1LjgyMzQ3MiBDOTYuMjg3MjkyMywyMDAuNTE4ODE0IDEwMy44NzczMDQsMjAwLjUxODgxNCAxMDguNTc2NTEsMTk1LjgyMzQ3MiBMMTQ1LjIyNTQ4NywxNTkuMjA0NjMyIEMxNDkuNDMzOTY5LDE1NC45OTk2MTEgMTQ5LjQzMzk2OSwxNDguMTgxOTI0IDE0NS4yMjU0ODcsMTQzLjk3NjkwMyBDMTQxLjAxNzAwNSwxMzkuNzcxODgxIDEzNC4xOTM3MDcsMTM5Ljc3MTg4MSAxMjkuOTg1MjI1LDE0My45NzY5MDMgTDEwMi4yMDE5MywxNzEuNzM3MzUyIEMxMDEuMDMyMzA1LDE3Mi45MDYwMTUgOTkuMjU3MTYwOSwxNzIuOTA2MDE1IDk4LjA4NzUzNTksMTcxLjczNzM1MiBMMjguMjg1OTA4LDEwMS45OTMxMjIgQzI3LjExNjI4MzEsMTAwLjgyNDQ1OSAyNy4xMTYyODMxLDk5LjA1MDc3NSAyOC4yODU5MDgsOTcuODgyMTExOCBMOTguMDg3NTM1OSwyOC4xMzc4ODIzIEMxMDAuOTk5ODY0LDI1LjYyNzE4MzYgMTA1Ljc1MTY0MiwyMC41NDE4MjQgMTEyLjcyOTY1MiwxOS4zNTI0NDg3IEMxMTcuOTE1NTg1LDE4LjQ2ODUyNjEgMTIzLjU4NTIxOSwyMC40MTQwMjM5IDEyOS43Mzg1NTQsMjUuMTg4OTQyNCBDMTI1LjYyNDY2MywyMS4wNzg0MjkyIDExOC41NzE5OTUsMTQuMDM0MDMwNCAxMDguNTgwNTUsNC4wNTU3NDU5MiBDMTAzLjg2MjA0OSwtMC41Mzc5ODY4NDYgOTYuMjY5MjYxOCwtMC41MDA3OTc5MDYgOTEuNTg4MDg2Myw0LjE3NjUyODIzIFoiLz48L2c+PHBhdGggaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBkPSJNMTUzLjY4NTYzMywxMzUuODU0NTc5IEMxNTcuODk0MTE1LDE0MC4wNTk2IDE2NC43MTc0MTIsMTQwLjA1OTYgMTY4LjkyNTg5NCwxMzUuODU0NTc5IEwxOTUuOTU5OTc3LDEwOC44NDI3MjYgQzIwMC42NTkxODMsMTA0LjE0NzM4NCAyMDAuNjU5MTgzLDk2LjU2MzYxMzMgMTk1Ljk2MDUyNyw5MS44Njg4MTk0IEwxNjguNjkwNzc3LDY0LjcxODExNTkgQzE2NC40NzIzMzIsNjAuNTE4MDg1OCAxNTcuNjQ2ODY4LDYwLjUyNDE0MjUgMTUzLjQzNTg5NSw2NC43MzE2NTI2IEMxNDkuMjI3NDEzLDY4LjkzNjY3NCAxNDkuMjI3NDEzLDc1Ljc1NDM2MDcgMTUzLjQzNTg5NSw3OS45NTkzODIxIEwxNzEuODU0MDM1LDk4LjM2MjM3NjUgQzE3My4wMjM2Niw5OS41MzEwMzk2IDE3My4wMjM2NiwxMDEuMzA0NzI0IDE3MS44NTQwMzUsMTAyLjQ3MzM4NyBMMTUzLjY4NTYzMywxMjAuNjI2ODQ5IEMxNDkuNDc3MTUsMTI0LjgzMTg3IDE0OS40NzcxNSwxMzEuNjQ5NTU3IDE1My42ODU2MzMsMTM1Ljg1NDU3OSBaIi8+PC9nPjxlbGxpcHNlIGlkPSJDb21iaW5lZC1TaGFwZSIgY3g9IjEwMC41MTkiIGN5PSIxMDAuNDM3IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTQpIiByeD0iMjMuNiIgcnk9IjIzLjU4MSIvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS9wdWJsaWMvcHJvX2ljb24uc3ZnIGIvcmVhY3QtdWkvcHVibGljL3Byb19pY29uLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc1Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvcHVibGljL3Byb19pY29uLnN2ZwpAQCAtMCwwICsxLDUgQEAKKzxzdmcgd2lkdGg9IjQyIiBoZWlnaHQ9IjQyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgorIDxnPgorICA8cGF0aCBmaWxsPSIjMDcwNzA3IiBkPSJtNi43MTczOTIsMTMuNzczOTEybDUuNiwwYzIuOCwwIDQuNywxLjkgNC43LDQuN2MwLDIuOCAtMiw0LjcgLTQuOSw0LjdsLTIuNSwwbDAsNC4zbC0yLjksMGwwLC0xMy43em0yLjksMi4ybDAsNC45bDEuOSwwYzEuNiwwIDIuNiwtMC45IDIuNiwtMi40YzAsLTEuNiAtMC45LC0yLjQgLTIuNiwtMi40bC0xLjksMGwwLC0wLjF6bTguOSwxMS41bDIuNywwbDAsLTUuN2MwLC0xLjQgMC44LC0yLjMgMi4yLC0yLjNjMC40LDAgMC44LDAuMSAxLDAuMmwwLC0yLjRjLTAuMiwtMC4xIC0wLjUsLTAuMSAtMC44LC0wLjFjLTEuMiwwIC0yLjEsMC43IC0yLjQsMmwtMC4xLDBsMCwtMS45bC0yLjcsMGwwLDEwLjJsMC4xLDB6bTExLjcsMC4xYy0zLjEsMCAtNSwtMiAtNSwtNS4zYzAsLTMuMyAyLC01LjMgNSwtNS4zczUsMiA1LDUuM2MwLDMuNCAtMS45LDUuMyAtNSw1LjN6bTAsLTIuMWMxLjQsMCAyLjIsLTEuMSAyLjIsLTMuMmMwLC0yIC0wLjgsLTMuMiAtMi4yLC0zLjJjLTEuNCwwIC0yLjIsMS4yIC0yLjIsMy4yYzAsMi4xIDAuOCwzLjIgMi4yLDMuMnoiIGNsYXNzPSJzdDAiIGlkPSJBbnQtRGVzaWduLVBybyIvPgorIDwvZz4KKzwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3B1YmxpYy9zY3JpcHRzL2xvYWRpbmcuanMgYi9yZWFjdC11aS9wdWJsaWMvc2NyaXB0cy9sb2FkaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2VkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9wdWJsaWMvc2NyaXB0cy9sb2FkaW5nLmpzCkBAIC0wLDAgKzEsMjAyIEBACisvKioKKyAqIGxvYWRpbmcg5Y2g5L2NCisgKiDop6PlhrPpppbmrKHliqDovb3ml7bnmb3lsY/nmoTpl67popgKKyAqLworIChmdW5jdGlvbiAoKSB7CisgIGNvbnN0IF9yb290ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKKyAgaWYgKF9yb290ICYmIF9yb290LmlubmVySFRNTCA9PT0gJycpIHsKKyAgICBfcm9vdC5pbm5lckhUTUwgPSBgCisgICAgICA8c3R5bGU+CisgICAgICAgIGh0bWwsCisgICAgICAgIGJvZHksCisgICAgICAgICNyb290IHsKKyAgICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgICAgbWFyZ2luOiAwOworICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIH0KKyAgICAgICAgI3Jvb3QgeworICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87CisgICAgICAgIH0KKworICAgICAgICAubG9hZGluZy10aXRsZSB7CisgICAgICAgICAgZm9udC1zaXplOiAxLjFyZW07CisgICAgICAgIH0KKworICAgICAgICAubG9hZGluZy1zdWItdGl0bGUgeworICAgICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CisgICAgICAgICAgZm9udC1zaXplOiAxcmVtOworICAgICAgICAgIGNvbG9yOiAjODg4OworICAgICAgICB9CisKKyAgICAgICAgLnBhZ2UtbG9hZGluZy13YXJwIHsKKyAgICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICAgICAgcGFkZGluZzogMjZweDsKKyAgICAgICAgfQorICAgICAgICAuYW50LXNwaW4geworICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICBkaXNwbGF5OiBub25lOworICAgICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNjUpOworICAgICAgICAgIGNvbG9yOiAjMTg5MGZmOworICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICAgICAgICBmb250LXZhcmlhbnQ6IHRhYnVsYXItbnVtczsKKyAgICAgICAgICBsaW5lLWhlaWdodDogMS41OworICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOworICAgICAgICAgIG9wYWNpdHk6IDA7CisgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjNzCisgICAgICAgICAgICBjdWJpYy1iZXppZXIoMC43OCwgMC4xNCwgMC4xNSwgMC44Nik7CisgICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcworICAgICAgICAgICAgY3ViaWMtYmV6aWVyKDAuNzgsIDAuMTQsIDAuMTUsIDAuODYpOworICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjc4LCAwLjE0LCAwLjE1LCAwLjg2KTsKKyAgICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBjdWJpYy1iZXppZXIoMC43OCwgMC4xNCwgMC4xNSwgMC44NiksCisgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjc4LCAwLjE0LCAwLjE1LCAwLjg2KTsKKyAgICAgICAgICAtd2Via2l0LWZvbnQtZmVhdHVyZS1zZXR0aW5nczogInRudW0iOworICAgICAgICAgIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogInRudW0iOworICAgICAgICB9CisKKyAgICAgICAgLmFudC1zcGluLXNwaW5uaW5nIHsKKyAgICAgICAgICBwb3NpdGlvbjogc3RhdGljOworICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICBvcGFjaXR5OiAxOworICAgICAgICB9CisKKyAgICAgICAgLmFudC1zcGluLWRvdCB7CisgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICB3aWR0aDogMjBweDsKKyAgICAgICAgICBoZWlnaHQ6IDIwcHg7CisgICAgICAgICAgZm9udC1zaXplOiAyMHB4OworICAgICAgICB9CisKKyAgICAgICAgLmFudC1zcGluLWRvdC1pdGVtIHsKKyAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgd2lkdGg6IDlweDsKKyAgICAgICAgICBoZWlnaHQ6IDlweDsKKyAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTg5MGZmOworICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CisgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNzUpOworICAgICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuNzUpOworICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC43NSk7CisgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlOworICAgICAgICAgIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlOworICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7CisgICAgICAgICAgb3BhY2l0eTogMC4zOworICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBhbnRzcGlubW92ZSAxcyBpbmZpbml0ZSBsaW5lYXIgYWx0ZXJuYXRlOworICAgICAgICAgIGFuaW1hdGlvbjogYW50U3Bpbk1vdmUgMXMgaW5maW5pdGUgbGluZWFyIGFsdGVybmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC5hbnQtc3Bpbi1kb3QtaXRlbTpudGgtY2hpbGQoMSkgeworICAgICAgICAgIHRvcDogMDsKKyAgICAgICAgICBsZWZ0OiAwOworICAgICAgICB9CisKKyAgICAgICAgLmFudC1zcGluLWRvdC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgdG9wOiAwOworICAgICAgICAgIHJpZ2h0OiAwOworICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjRzOworICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC40czsKKyAgICAgICAgfQorCisgICAgICAgIC5hbnQtc3Bpbi1kb3QtaXRlbTpudGgtY2hpbGQoMykgeworICAgICAgICAgIHJpZ2h0OiAwOworICAgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC44czsKKyAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuOHM7CisgICAgICAgIH0KKworICAgICAgICAuYW50LXNwaW4tZG90LWl0ZW06bnRoLWNoaWxkKDQpIHsKKyAgICAgICAgICBib3R0b206IDA7CisgICAgICAgICAgbGVmdDogMDsKKyAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMS4yczsKKyAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDEuMnM7CisgICAgICAgIH0KKworICAgICAgICAuYW50LXNwaW4tZG90LXNwaW4geworICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOworICAgICAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7CisgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOworICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBhbnRyb3RhdGUgMS4ycyBpbmZpbml0ZSBsaW5lYXI7CisgICAgICAgICAgYW5pbWF0aW9uOiBhbnRSb3RhdGUgMS4ycyBpbmZpbml0ZSBsaW5lYXI7CisgICAgICAgIH0KKworICAgICAgICAuYW50LXNwaW4tbGcgLmFudC1zcGluLWRvdCB7CisgICAgICAgICAgd2lkdGg6IDMycHg7CisgICAgICAgICAgaGVpZ2h0OiAzMnB4OworICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDsKKyAgICAgICAgfQorCisgICAgICAgIC5hbnQtc3Bpbi1sZyAuYW50LXNwaW4tZG90IGkgeworICAgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICAgIGhlaWdodDogMTRweDsKKyAgICAgICAgfQorCisgICAgICAgIEBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDogbm9uZSksICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSB7CisgICAgICAgICAgLmFudC1zcGluLWJsdXIgeworICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgICAgICAgIG9wYWNpdHk6IDAuNTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgYW50U3Bpbk1vdmUgeworICAgICAgICAgIHRvIHsKKyAgICAgICAgICAgIG9wYWNpdHk6IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQGtleWZyYW1lcyBhbnRTcGluTW92ZSB7CisgICAgICAgICAgdG8geworICAgICAgICAgICAgb3BhY2l0eTogMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgYW50Um90YXRlIHsKKyAgICAgICAgICB0byB7CisgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7CisgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBrZXlmcmFtZXMgYW50Um90YXRlIHsKKyAgICAgICAgICB0byB7CisgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7CisgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgPC9zdHlsZT4KKworICAgICAgPGRpdiBzdHlsZT0iCisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIG1pbi1oZWlnaHQ6IDM2MnB4OworICAgICAgIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1sb2FkaW5nLXdhcnAiPgorICAgICAgICAgIDxkaXYgY2xhc3M9ImFudC1zcGluIGFudC1zcGluLWxnIGFudC1zcGluLXNwaW5uaW5nIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhbnQtc3Bpbi1kb3QgYW50LXNwaW4tZG90LXNwaW4iPgorICAgICAgICAgICAgICA8aSBjbGFzcz0iYW50LXNwaW4tZG90LWl0ZW0iPjwvaT4KKyAgICAgICAgICAgICAgPGkgY2xhc3M9ImFudC1zcGluLWRvdC1pdGVtIj48L2k+CisgICAgICAgICAgICAgIDxpIGNsYXNzPSJhbnQtc3Bpbi1kb3QtaXRlbSI+PC9pPgorICAgICAgICAgICAgICA8aSBjbGFzcz0iYW50LXNwaW4tZG90LWl0ZW0iPjwvaT4KKyAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctdGl0bGUiPgorICAgICAgICAgIOato+WcqOWKoOi9vei1hOa6kAorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zdWItdGl0bGUiPgorICAgICAgICAgIOWIneasoeWKoOi9vei1hOa6kOWPr+iDvemcgOimgei+g+WkmuaXtumXtCDor7fogJDlv4PnrYnlvoUKKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICBgOworICB9Cit9KSgpOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2FjY2Vzcy50cyBiL3JlYWN0LXVpL3NyYy9hY2Nlc3MudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxMWYzMQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9hY2Nlc3MudHMKQEAgLTAsMCArMSw1NSBAQAoraW1wb3J0IHsgY2hlY2tSb2xlLCBtYXRjaFBlcm1pc3Npb24gfSBmcm9tICcuL3V0aWxzL3Blcm1pc3Npb24nOworLyoqCisgKiBAc2VlIGh0dHBzOi8vdW1panMub3JnL3poLUNOL3BsdWdpbnMvcGx1Z2luLWFjY2VzcworICogKi8KK2V4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFjY2Vzcyhpbml0aWFsU3RhdGU6IHsgY3VycmVudFVzZXI/OiBBUEkuQ3VycmVudFVzZXIgfSB8IHVuZGVmaW5lZCkgeworICBjb25zdCB7IGN1cnJlbnRVc2VyIH0gPSBpbml0aWFsU3RhdGUgPz8ge307CisgIGNvbnN0IGhhc1Blcm1zID0gKHBlcm06IHN0cmluZykgPT4geworICAgIHJldHVybiBtYXRjaFBlcm1pc3Npb24oaW5pdGlhbFN0YXRlPy5jdXJyZW50VXNlcj8ucGVybWlzc2lvbnMsIHBlcm0pOworICB9OworICBjb25zdCByb2xlRmlsZXIgPSAocm91dGU6IHsgYXV0aG9yaXR5OiBzdHJpbmdbXSB9KSA9PiB7CisgICAgcmV0dXJuIGNoZWNrUm9sZShpbml0aWFsU3RhdGU/LmN1cnJlbnRVc2VyPy5yb2xlcywgcm91dGUuYXV0aG9yaXR5KTsKKyAgfTsKKyAgcmV0dXJuIHsKKyAgICBjYW5BZG1pbjogY3VycmVudFVzZXIgJiYgY3VycmVudFVzZXIuYWNjZXNzID09PSAnYWRtaW4nLAorICAgIGhhc1Blcm1zLAorICAgIHJvbGVGaWxlciwKKyAgfTsKK30KKworZXhwb3J0IGZ1bmN0aW9uIHNldFNlc3Npb25Ub2tlbigKKyAgYWNjZXNzX3Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsCisgIHJlZnJlc2hfdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwKKyAgZXhwaXJlVGltZTogbnVtYmVyLAorKTogdm9pZCB7CisgIGlmIChhY2Nlc3NfdG9rZW4pIHsKKyAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzX3Rva2VuKTsKKyAgfSBlbHNlIHsKKyAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYWNjZXNzX3Rva2VuJyk7CisgIH0KKyAgaWYgKHJlZnJlc2hfdG9rZW4pIHsKKyAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVmcmVzaF90b2tlbicsIHJlZnJlc2hfdG9rZW4pOworICB9IGVsc2UgeworICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdyZWZyZXNoX3Rva2VuJyk7CisgIH0KKyAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2V4cGlyZVRpbWUnLCBgJHtleHBpcmVUaW1lfWApOworfQorCitleHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oKSB7CisgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyk7Cit9CisKK2V4cG9ydCBmdW5jdGlvbiBnZXRSZWZyZXNoVG9rZW4oKSB7CisgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVmcmVzaF90b2tlbicpOworfQorCitleHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW5FeHBpcmVUaW1lKCkgeworICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4cGlyZVRpbWUnKTsKK30KKworZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU2Vzc2lvblRva2VuKCkgeworICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd1c2VyJyk7CisgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdhY2Nlc3NfdG9rZW4nKTsKKyAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZnJlc2hfdG9rZW4nKTsKKyAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2V4cGlyZVRpbWUnKTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9hcHAudHN4IGIvcmVhY3QtdWkvc3JjL2FwcC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNzZiNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9hcHAudHN4CkBAIC0wLDAgKzEsMjMzIEBACitpbXBvcnQgeyBGb290ZXIsIFF1ZXN0aW9uLCBTZWxlY3RMYW5nLCBBdmF0YXJEcm9wZG93biwgQXZhdGFyTmFtZSB9IGZyb20gJ0AvY29tcG9uZW50cyc7CitpbXBvcnQgeyBMaW5rT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgdHlwZSB7IFNldHRpbmdzIGFzIExheW91dFNldHRpbmdzIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgU2V0dGluZ0RyYXdlciB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB0eXBlIHsgUnVuVGltZUxheW91dENvbmZpZyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgaGlzdG9yeSwgTGluayB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IGRlZmF1bHRTZXR0aW5ncyBmcm9tICcuLi9jb25maWcvZGVmYXVsdFNldHRpbmdzJzsKK2ltcG9ydCB7IGVycm9yQ29uZmlnIH0gZnJvbSAnLi9yZXF1ZXN0RXJyb3JDb25maWcnOworaW1wb3J0IHsgY2xlYXJTZXNzaW9uVG9rZW4sIGdldEFjY2Vzc1Rva2VuLCBnZXRSZWZyZXNoVG9rZW4sIGdldFRva2VuRXhwaXJlVGltZSB9IGZyb20gJy4vYWNjZXNzJzsKK2ltcG9ydCB7IGdldFJlbW90ZU1lbnUsIGdldFJvdXRlcnNJbmZvLCBnZXRVc2VySW5mbywgcGF0Y2hSb3V0ZVdpdGhSZW1vdGVNZW51cywgc2V0UmVtb3RlTWVudSB9IGZyb20gJy4vc2VydmljZXMvc2Vzc2lvbic7CitpbXBvcnQgeyBQYWdlRW51bSB9IGZyb20gJy4vZW51bXMvcGFnZXNFbnVtcyc7CisKKworY29uc3QgaXNEZXYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JzsKKworCisKKy8qKgorICogQHNlZSAgaHR0cHM6Ly91bWlqcy5vcmcvemgtQ04vcGx1Z2lucy9wbHVnaW4taW5pdGlhbC1zdGF0ZQorICogKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKTogUHJvbWlzZTx7CisgIHNldHRpbmdzPzogUGFydGlhbDxMYXlvdXRTZXR0aW5ncz47CisgIGN1cnJlbnRVc2VyPzogQVBJLkN1cnJlbnRVc2VyOworICBsb2FkaW5nPzogYm9vbGVhbjsKKyAgZmV0Y2hVc2VySW5mbz86ICgpID0+IFByb21pc2U8QVBJLkN1cnJlbnRVc2VyIHwgdW5kZWZpbmVkPjsKK30+IHsKKyAgY29uc3QgZmV0Y2hVc2VySW5mbyA9IGFzeW5jICgpID0+IHsKKyAgICB0cnkgeworICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRVc2VySW5mbyh7CisgICAgICAgIHNraXBFcnJvckhhbmRsZXI6IHRydWUsCisgICAgICB9KTsKKyAgICAgIGlmIChyZXNwb25zZS51c2VyLmF2YXRhciA9PT0gJycpIHsKKyAgICAgICAgcmVzcG9uc2UudXNlci5hdmF0YXIgPQorICAgICAgICAgICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvQmlhemZhbnhtYW1OUm94eFZ4a2EucG5nJzsKKyAgICAgIH0KKyAgICAgIHJldHVybiB7CisgICAgICAgIC4uLnJlc3BvbnNlLnVzZXIsCisgICAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucywKKyAgICAgICAgcm9sZXM6IHJlc3BvbnNlLnJvbGVzLAorICAgICAgfSBhcyBBUEkuQ3VycmVudFVzZXI7CisgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKKyAgICAgIGhpc3RvcnkucHVzaChQYWdlRW51bS5MT0dJTik7CisgICAgfQorICAgIHJldHVybiB1bmRlZmluZWQ7CisgIH07CisgIC8vIOWmguaenOS4jeaYr+eZu+W9lemhtemdou+8jOaJp+ihjAorICBjb25zdCB7IGxvY2F0aW9uIH0gPSBoaXN0b3J5OworICBpZiAobG9jYXRpb24ucGF0aG5hbWUgIT09IFBhZ2VFbnVtLkxPR0lOKSB7CisgICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBmZXRjaFVzZXJJbmZvKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIGZldGNoVXNlckluZm8sCisgICAgICBjdXJyZW50VXNlciwKKyAgICAgIHNldHRpbmdzOiBkZWZhdWx0U2V0dGluZ3MgYXMgUGFydGlhbDxMYXlvdXRTZXR0aW5ncz4sCisgICAgfTsKKyAgfQorICByZXR1cm4geworICAgIGZldGNoVXNlckluZm8sCisgICAgc2V0dGluZ3M6IGRlZmF1bHRTZXR0aW5ncyBhcyBQYXJ0aWFsPExheW91dFNldHRpbmdzPiwKKyAgfTsKK30KKworLy8gUHJvTGF5b3V0IOaUr+aMgeeahGFwaSBodHRwczovL3Byb2NvbXBvbmVudHMuYW50LmRlc2lnbi9jb21wb25lbnRzL2xheW91dAorZXhwb3J0IGNvbnN0IGxheW91dDogUnVuVGltZUxheW91dENvbmZpZyA9ICh7IGluaXRpYWxTdGF0ZSwgc2V0SW5pdGlhbFN0YXRlIH0pID0+IHsKKyAgcmV0dXJuIHsKKyAgICBhY3Rpb25zUmVuZGVyOiAoKSA9PiBbPFF1ZXN0aW9uIGtleT0iZG9jIiAvPiwgPFNlbGVjdExhbmcga2V5PSJTZWxlY3RMYW5nIiAvPl0sCisgICAgYXZhdGFyUHJvcHM6IHsKKyAgICAgIHNyYzogaW5pdGlhbFN0YXRlPy5jdXJyZW50VXNlcj8uYXZhdGFyLAorICAgICAgdGl0bGU6IDxBdmF0YXJOYW1lIC8+LAorICAgICAgcmVuZGVyOiAoXywgYXZhdGFyQ2hpbGRyZW4pID0+IHsKKyAgICAgICAgcmV0dXJuIDxBdmF0YXJEcm9wZG93biBtZW51PSJUcnVlIj57YXZhdGFyQ2hpbGRyZW59PC9BdmF0YXJEcm9wZG93bj47CisgICAgICB9LAorICAgIH0sCisgICAgd2F0ZXJNYXJrUHJvcHM6IHsKKyAgICAgIC8vIGNvbnRlbnQ6IGluaXRpYWxTdGF0ZT8uY3VycmVudFVzZXI/Lm5pY2tOYW1lLAorICAgIH0sCisgICAgbWVudTogeworICAgICAgbG9jYWxlOiBmYWxzZSwKKyAgICAgIC8vIOavj+W9kyBpbml0aWFsU3RhdGU/LmN1cnJlbnRVc2VyPy51c2VyaWQg5Y+R55Sf5L+u5pS55pe26YeN5paw5omn6KGMIHJlcXVlc3QKKyAgICAgIHBhcmFtczogeworICAgICAgICB1c2VySWQ6IGluaXRpYWxTdGF0ZT8uY3VycmVudFVzZXI/LnVzZXJJZCwKKyAgICAgIH0sCisgICAgICByZXF1ZXN0OiBhc3luYyAoKSA9PiB7CisgICAgICAgIGlmICghaW5pdGlhbFN0YXRlPy5jdXJyZW50VXNlcj8udXNlcklkKSB7CisgICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRSZW1vdGVNZW51KCk7CisgICAgICB9LAorICAgIH0sCisgICAgZm9vdGVyUmVuZGVyOiAoKSA9PiA8Rm9vdGVyIC8+LAorICAgIG9uUGFnZUNoYW5nZTogKCkgPT4geworICAgICAgY29uc3QgeyBsb2NhdGlvbiB9ID0gaGlzdG9yeTsKKyAgICAgIC8vIOWmguaenOayoeacieeZu+W9le+8jOmHjeWumuWQkeWIsCBsb2dpbgorICAgICAgaWYgKCFpbml0aWFsU3RhdGU/LmN1cnJlbnRVc2VyICYmIGxvY2F0aW9uLnBhdGhuYW1lICE9PSBQYWdlRW51bS5MT0dJTikgeworICAgICAgICBoaXN0b3J5LnB1c2goUGFnZUVudW0uTE9HSU4pOworICAgICAgfQorICAgIH0sCisgICAgbGF5b3V0QmdJbWdMaXN0OiBbCisgICAgICB7CisgICAgICAgIHNyYzogJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy9EMkxXU3FObnk0c0FBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIGxlZnQ6IDg1LAorICAgICAgICBib3R0b206IDEwMCwKKyAgICAgICAgaGVpZ2h0OiAnMzAzcHgnLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgc3JjOiAnaHR0cHM6Ly9tZG4uYWxpcGF5b2JqZWN0cy5jb20veXV5YW5fcWswb3hoL2FmdHMvaW1nL0MyVFdScEpwaUMwQUFBQUFBQUFBQUFBQUZsOTRBUUJyJywKKyAgICAgICAgYm90dG9tOiAtNjgsCisgICAgICAgIHJpZ2h0OiAtNDUsCisgICAgICAgIGhlaWdodDogJzMwM3B4JywKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIHNyYzogJ2h0dHBzOi8vbWRuLmFsaXBheW9iamVjdHMuY29tL3l1eWFuX3FrMG94aC9hZnRzL2ltZy9GNnZTVGJqOEtwWUFBQUFBQUFBQUFBQUFGbDk0QVFCcicsCisgICAgICAgIGJvdHRvbTogMCwKKyAgICAgICAgbGVmdDogMCwKKyAgICAgICAgd2lkdGg6ICczMzFweCcsCisgICAgICB9LAorICAgIF0sCisgICAgbGlua3M6IGlzRGV2CisgICAgICA/IFsKKyAgICAgICAgPExpbmsga2V5PSJvcGVuYXBpIiB0bz0iL3VtaS9wbHVnaW4vb3BlbmFwaSIgdGFyZ2V0PSJfYmxhbmsiPgorICAgICAgICAgIDxMaW5rT3V0bGluZWQgLz4KKyAgICAgICAgICA8c3Bhbj5PcGVuQVBJIOaWh+ahozwvc3Bhbj4KKyAgICAgICAgPC9MaW5rPiwKKyAgICAgIF0KKyAgICAgIDogW10sCisgICAgbWVudUhlYWRlclJlbmRlcjogdW5kZWZpbmVkLAorICAgIC8vIOiHquWumuS5iSA0MDMg6aG16Z2iCisgICAgLy8gdW5BY2Nlc3NpYmxlOiA8ZGl2PnVuQWNjZXNzaWJsZTwvZGl2PiwKKyAgICAvLyDlop7liqDkuIDkuKogbG9hZGluZyDnmoTnirbmgIEKKyAgICBjaGlsZHJlblJlbmRlcjogKGNoaWxkcmVuKSA9PiB7CisgICAgICAvLyBpZiAoaW5pdGlhbFN0YXRlPy5sb2FkaW5nKSByZXR1cm4gPFBhZ2VMb2FkaW5nIC8+OworICAgICAgcmV0dXJuICgKKyAgICAgICAgPD4KKyAgICAgICAgICB7Y2hpbGRyZW59CisgICAgICAgICAgPFNldHRpbmdEcmF3ZXIKKyAgICAgICAgICAgIGRpc2FibGVVcmxQYXJhbXMKKyAgICAgICAgICAgIGVuYWJsZURhcmtUaGVtZQorICAgICAgICAgICAgc2V0dGluZ3M9e2luaXRpYWxTdGF0ZT8uc2V0dGluZ3N9CisgICAgICAgICAgICBvblNldHRpbmdDaGFuZ2U9eyhzZXR0aW5ncykgPT4geworICAgICAgICAgICAgICBzZXRJbml0aWFsU3RhdGUoKHByZUluaXRpYWxTdGF0ZSkgPT4gKHsKKyAgICAgICAgICAgICAgICAuLi5wcmVJbml0aWFsU3RhdGUsCisgICAgICAgICAgICAgICAgc2V0dGluZ3MsCisgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgLz4KKyAgICAgICAgPC8+CisgICAgICApOworICAgIH0sCisgICAgLi4uaW5pdGlhbFN0YXRlPy5zZXR0aW5ncywKKyAgfTsKK307CisKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBvblJvdXRlQ2hhbmdlKHsgY2xpZW50Um91dGVzLCBsb2NhdGlvbiB9KSB7CisgIGNvbnN0IG1lbnVzID0gZ2V0UmVtb3RlTWVudSgpOworIC8vIGNvbnNvbGUubG9nKCdvblJvdXRlQ2hhbmdlJywgY2xpZW50Um91dGVzLCBsb2NhdGlvbiwgbWVudXMpOworICBpZihtZW51cyA9PT0gbnVsbCAmJiBsb2NhdGlvbi5wYXRobmFtZSAhPT0gUGFnZUVudW0uTE9HSU4pIHsKKyAgICBjb25zb2xlLmxvZygncmVmcmVzaCcpCisgICAgaGlzdG9yeS5nbygwKTsKKyAgfQorfQorCisvLyBleHBvcnQgZnVuY3Rpb24gcGF0Y2hSb3V0ZXMoeyByb3V0ZXMsIHJvdXRlQ29tcG9uZW50cyB9KSB7CisvLyAgIGNvbnNvbGUubG9nKCdwYXRjaFJvdXRlcycsIHJvdXRlcywgcm91dGVDb21wb25lbnRzKTsKKy8vIH0KKworCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcGF0Y2hDbGllbnRSb3V0ZXMoeyByb3V0ZXMgfSkgeworICAvLyBjb25zb2xlLmxvZygncGF0Y2hDbGllbnRSb3V0ZXMnLCByb3V0ZXMpOworICBwYXRjaFJvdXRlV2l0aFJlbW90ZU1lbnVzKHJvdXRlcyk7Cit9CisKK2V4cG9ydCBmdW5jdGlvbiByZW5kZXIob2xkUmVuZGVyOiAoKSA9PiB2b2lkKSB7CisgIC8vIGNvbnNvbGUubG9nKCdyZW5kZXIgZ2V0IHJvdXRlcnMnLCBvbGRSZW5kZXIpCisgIGNvbnN0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oKTsKKyAgaWYoIXRva2VuIHx8IHRva2VuPy5sZW5ndGggPT09IDApIHsKKyAgICBvbGRSZW5kZXIoKTsKKyAgICByZXR1cm47CisgIH0KKyAgZ2V0Um91dGVyc0luZm8oKS50aGVuKHJlcyA9PiB7CisgICAgc2V0UmVtb3RlTWVudShyZXMpOworICAgIG9sZFJlbmRlcigpCisgIH0pOworfQorCisvKioKKyAqIEBuYW1lIHJlcXVlc3Qg6YWN572u77yM5Y+v5Lul6YWN572u6ZSZ6K+v5aSE55CGCisgKiDlroPln7rkuo4gYXhpb3Mg5ZKMIGFob29rcyDnmoQgdXNlUmVxdWVzdCDmj5DkvpvkuobkuIDlpZfnu5/kuIDnmoTnvZHnu5zor7fmsYLlkozplJnor6/lpITnkIbmlrnmoYjjgIIKKyAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9tYXgvcmVxdWVzdCPphY3nva4KKyAqLworY29uc3QgY2hlY2tSZWdpb24gPSA1ICogNjAgKiAxMDAwOworCitleHBvcnQgY29uc3QgcmVxdWVzdCA9IHsKKyAgLi4uZXJyb3JDb25maWcsCisgIHJlcXVlc3RJbnRlcmNlcHRvcnM6IFsKKyAgICAodXJsOiBhbnksIG9wdGlvbnM6IHsgaGVhZGVyczogYW55IH0pID0+IHsKKyAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgPyBvcHRpb25zLmhlYWRlcnMgOiBbXTsKKyAgICAgIGNvbnNvbGUubG9nKCdyZXF1ZXN0ID09PT0+OicsIHVybCk7CisgICAgICBjb25zdCBhdXRoSGVhZGVyID0gaGVhZGVyc1snQXV0aG9yaXphdGlvbiddOworICAgICAgY29uc3QgaXNUb2tlbiA9IGhlYWRlcnNbJ2lzVG9rZW4nXTsKKyAgICAgIGlmICghYXV0aEhlYWRlciAmJiBpc1Rva2VuICE9PSBmYWxzZSkgeworICAgICAgICBjb25zdCBleHBpcmVUaW1lID0gZ2V0VG9rZW5FeHBpcmVUaW1lKCk7CisgICAgICAgIGlmIChleHBpcmVUaW1lKSB7CisgICAgICAgICAgY29uc3QgbGVmdCA9IE51bWJlcihleHBpcmVUaW1lKSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IGdldFJlZnJlc2hUb2tlbigpOworICAgICAgICAgIGlmIChsZWZ0IDwgY2hlY2tSZWdpb24gJiYgcmVmcmVzaFRva2VuKSB7CisgICAgICAgICAgICBpZiAobGVmdCA8IDApIHsKKyAgICAgICAgICAgICAgY2xlYXJTZXNzaW9uVG9rZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBnZXRBY2Nlc3NUb2tlbigpOworICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuKSB7CisgICAgICAgICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbGVhclNlc3Npb25Ub2tlbigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4geyB1cmwsIG9wdGlvbnMgfTsKKyAgICB9LAorICBdLAorICByZXNwb25zZUludGVyY2VwdG9yczogWworICAgIC8vIChyZXNwb25zZSkgPT4KKyAgICAvLyB7CisgICAgLy8gICAvLyAvLyDkuI3lho3pnIDopoHlvILmraXlpITnkIbor7vlj5bov5Tlm57kvZPlhoXlrrnvvIzlj6/nm7TmjqXlnKhkYXRh5Lit6K+75Ye677yM6YOo5YiG5a2X5q615Y+v5ZyoIGNvbmZpZyDkuK3mib7liLAKKyAgICAvLyAgIC8vIGNvbnN0IHsgZGF0YSA9IHt9IGFzIGFueSwgY29uZmlnIH0gPSByZXNwb25zZTsKKyAgICAvLyAgIC8vIC8vIGRvIHNvbWV0aGluZworICAgIC8vICAgLy8gY29uc29sZS5sb2coJ2RhdGE6ICcsIGRhdGEpCisgICAgLy8gICAvLyBjb25zb2xlLmxvZygnY29uZmlnOiAnLCBjb25maWcpCisgICAgLy8gICByZXR1cm4gcmVzcG9uc2UKKyAgICAvLyB9LAorICBdLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0RpY3RUYWcvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvRGljdFRhZy9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYTc5MQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0RpY3RUYWcvaW5kZXgudHN4CkBAIC0wLDAgKzEsMTE1IEBACitpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOworaW1wb3J0IHsgVGFnIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBQcm9TY2hlbWFWYWx1ZUVudW1UeXBlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgRGVmYXVsdE9wdGlvblR5cGUgfSBmcm9tICdhbnRkL2VzL3NlbGVjdCc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8xMAorICoKKyAqICovCisKK2V4cG9ydCBpbnRlcmZhY2UgRGljdFZhbHVlRW51bVR5cGUgZXh0ZW5kcyBQcm9TY2hlbWFWYWx1ZUVudW1UeXBlIHsKKyAgICBpZD86IHN0cmluZyB8IG51bWJlcjsKKyAgICBrZXk/OiBzdHJpbmcgfCBudW1iZXI7CisgICAgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsKKyAgICBsYWJlbDogc3RyaW5nOworICAgIGxpc3RDbGFzcz86IHN0cmluZzsKK30KKworZXhwb3J0IGludGVyZmFjZSBEaWN0T3B0aW9uVHlwZSBleHRlbmRzIERlZmF1bHRPcHRpb25UeXBlIHsKKyAgICBpZD86IHN0cmluZyB8IG51bWJlcjsKKyAgICBrZXk/OiBzdHJpbmcgfCBudW1iZXI7CisgICAgdGV4dDogc3RyaW5nOworICAgIGxpc3RDbGFzcz86IHN0cmluZzsKK30KKworCitleHBvcnQgdHlwZSBEaWN0VmFsdWVFbnVtT2JqID0gUmVjb3JkPHN0cmluZyB8IG51bWJlciwgRGljdFZhbHVlRW51bVR5cGU+OworCitleHBvcnQgdHlwZSBEaWN0VGFnUHJvcHMgPSB7CisgICAga2V5Pzogc3RyaW5nOworICAgIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyOworICAgIGVudW1zPzogRGljdFZhbHVlRW51bU9iajsKKyAgICBvcHRpb25zPzogRGljdE9wdGlvblR5cGVbXTsKK307CisKK2NvbnN0IERpY3RUYWc6IFJlYWN0LkZDPERpY3RUYWdQcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgICBmdW5jdGlvbiBnZXREaWN0Q29sb3IodHlwZT86IHN0cmluZykgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ3ByaW1hcnknOgorICAgICAgICAgICAgICAgIHJldHVybiAnYmx1ZSc7CisgICAgICAgICAgICBjYXNlICdzdWNjZXNzJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnOworICAgICAgICAgICAgY2FzZSAnaW5mbyc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdncmVlbic7CisgICAgICAgICAgICBjYXNlICd3YXJuaW5nJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3dhcm5pbmcnOworICAgICAgICAgICAgY2FzZSAnZGFuZ2VyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2Vycm9yJzsKKyAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2RlZmF1bHQnOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0RGljdExhYmVsQnlWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHsKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcHMuZW51bXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcm9wcy5lbnVtc1t2YWx1ZV07CisgICAgICAgICAgICByZXR1cm4gaXRlbS5sYWJlbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcHMub3B0aW9ucykgeworICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BzLm9wdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RpY3RUYWcgb3B0aW9ucyBpcyBubyBhcnJheSEnKQorICAgICAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwcm9wcy5vcHRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmcocHJvcHMudmFsdWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGdldERpY3RMaXN0Q2xhc3NCeVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcgeworICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JzsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcHMuZW51bXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcm9wcy5lbnVtc1t2YWx1ZV07CisgICAgICAgICAgICByZXR1cm4gaXRlbS5saXN0Q2xhc3MgfHwgJ2RlZmF1bHQnOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9wcy5vcHRpb25zKSB7CisgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcHMub3B0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGljdFRhZyBvcHRpb25zIGlzIG5vIGFycmF5IScpCisgICAgICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwcm9wcy5vcHRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxpc3RDbGFzcyB8fCAnZGVmYXVsdCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmcocHJvcHMudmFsdWUpOworICAgIH0KKworICAgIGNvbnN0IGdldFRhZ0NvbG9yID0gKCkgPT4geworICAgICAgICByZXR1cm4gZ2V0RGljdENvbG9yKGdldERpY3RMaXN0Q2xhc3NCeVZhbHVlKHByb3BzLnZhbHVlKS50b0xvd2VyQ2FzZSgpKTsKKyAgICB9OworCisgICAgY29uc3QgZ2V0VGFnVGV4dCA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICByZXR1cm4gZ2V0RGljdExhYmVsQnlWYWx1ZShwcm9wcy52YWx1ZSk7CisgICAgfTsKKworICAgIHJldHVybiAoCisgICAgICAgIDxUYWcgY29sb3I9e2dldFRhZ0NvbG9yKCl9PntnZXRUYWdUZXh0KCl9PC9UYWc+CisgICAgKQorfQorCisKK2V4cG9ydCBkZWZhdWx0IERpY3RUYWc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvRm9vdGVyL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0Zvb3Rlci9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNGFjMgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0Zvb3Rlci9pbmRleC50c3gKQEAgLTAsMCArMSwzNSBAQAoraW1wb3J0IHsgR2l0aHViT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBEZWZhdWx0Rm9vdGVyIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsKKworY29uc3QgRm9vdGVyOiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgcmV0dXJuICgKKyAgICA8RGVmYXVsdEZvb3RlcgorICAgICAgc3R5bGU9e3sKKyAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnLAorICAgICAgfX0KKyAgICAgIGxpbmtzPXtbCisgICAgICAgIHsKKyAgICAgICAgICBrZXk6ICdBbnQgRGVzaWduIFBybycsCisgICAgICAgICAgdGl0bGU6ICdBbnQgRGVzaWduIFBybycsCisgICAgICAgICAgaHJlZjogJ2h0dHBzOi8vcHJvLmFudC5kZXNpZ24nLAorICAgICAgICAgIGJsYW5rVGFyZ2V0OiB0cnVlLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAga2V5OiAnZ2l0aHViJywKKyAgICAgICAgICB0aXRsZTogPEdpdGh1Yk91dGxpbmVkIC8+LAorICAgICAgICAgIGhyZWY6ICdodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduLXBybycsCisgICAgICAgICAgYmxhbmtUYXJnZXQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBrZXk6ICdBbnQgRGVzaWduJywKKyAgICAgICAgICB0aXRsZTogJ0FudCBEZXNpZ24nLAorICAgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICAgIGJsYW5rVGFyZ2V0OiB0cnVlLAorICAgICAgICB9LAorICAgICAgXX0KKyAgICAvPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgRm9vdGVyOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSGVhZGVyRHJvcGRvd24vaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSGVhZGVyRHJvcGRvd24vaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTA1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9IZWFkZXJEcm9wZG93bi9pbmRleC50c3gKQEAgLTAsMCArMSwyNyBAQAoraW1wb3J0IHsgRHJvcGRvd24gfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB0eXBlIHsgRHJvcERvd25Qcm9wcyB9IGZyb20gJ2FudGQvZXMvZHJvcGRvd24nOworaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IGNyZWF0ZVN0eWxlcyB9IGZyb20gJ2FudGQtc3R5bGUnOworaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7CisKK2NvbnN0IHVzZVN0eWxlcyA9IGNyZWF0ZVN0eWxlcygoeyB0b2tlbiB9KSA9PiB7CisgIHJldHVybiB7CisgICAgZHJvcGRvd246IHsKKyAgICAgIFtgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJHt0b2tlbi5zY3JlZW5YU31weClgXTogeworICAgICAgICB3aWR0aDogJzEwMCUnLAorICAgICAgfSwKKyAgICB9LAorICB9OworfSk7CisKK2V4cG9ydCB0eXBlIEhlYWRlckRyb3Bkb3duUHJvcHMgPSB7CisgIG92ZXJsYXlDbGFzc05hbWU/OiBzdHJpbmc7CisgIHBsYWNlbWVudD86ICdib3R0b21MZWZ0JyB8ICdib3R0b21SaWdodCcgfCAndG9wTGVmdCcgfCAndG9wQ2VudGVyJyB8ICd0b3BSaWdodCcgfCAnYm90dG9tQ2VudGVyJzsKK30gJiBPbWl0PERyb3BEb3duUHJvcHMsICdvdmVybGF5Jz47CisKK2NvbnN0IEhlYWRlckRyb3Bkb3duOiBSZWFjdC5GQzxIZWFkZXJEcm9wZG93blByb3BzPiA9ICh7IG92ZXJsYXlDbGFzc05hbWU6IGNscywgLi4ucmVzdFByb3BzIH0pID0+IHsKKyAgY29uc3QgeyBzdHlsZXMgfSA9IHVzZVN0eWxlcygpOworICByZXR1cm4gPERyb3Bkb3duIG92ZXJsYXlDbGFzc05hbWU9e2NsYXNzTmFtZXMoc3R5bGVzLmRyb3Bkb3duLCBjbHMpfSB7Li4ucmVzdFByb3BzfSAvPjsKK307CisKK2V4cG9ydCBkZWZhdWx0IEhlYWRlckRyb3Bkb3duOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL0NhdGVnb3J5LnRzeCBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9DYXRlZ29yeS50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwZTkzZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9DYXRlZ29yeS50c3gKQEAgLTAsMCArMSw2MyBAQAoraW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOworaW1wb3J0IENvcHlhYmxlSWNvbiBmcm9tICcuL0NvcHlhYmxlSWNvbic7CitpbXBvcnQgdHlwZSB7IFRoZW1lVHlwZSB9IGZyb20gJy4vaW5kZXgnOworaW1wb3J0IHR5cGUgeyBDYXRlZ29yaWVzS2V5cyB9IGZyb20gJy4vZmllbGRzJzsKK2ltcG9ydCB7IHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCBzdHlsZXMgZnJvbSAnLi9zdHlsZS5sZXNzJzsKKworaW50ZXJmYWNlIENhdGVnb3J5UHJvcHMgeworICB0aXRsZTogQ2F0ZWdvcmllc0tleXM7CisgIGljb25zOiBzdHJpbmdbXTsKKyAgdGhlbWU6IFRoZW1lVHlwZTsKKyAgbmV3SWNvbnM6IHN0cmluZ1tdOworICBvblNlbGVjdDogKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiBhbnk7Cit9CisKK2NvbnN0IENhdGVnb3J5OiBSZWFjdC5GQzxDYXRlZ29yeVByb3BzPiA9IHByb3BzID0+IHsKKworICBjb25zdCB7IGljb25zLCB0aXRsZSwgbmV3SWNvbnMsIHRoZW1lIH0gPSBwcm9wczsKKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKyAgY29uc3QgW2p1c3RDb3BpZWQsIHNldEp1c3RDb3BpZWRdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7CisgIGNvbnN0IGNvcHlJZCA9IFJlYWN0LnVzZVJlZjxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpOworICBjb25zdCBvblNlbGVjdCA9IFJlYWN0LnVzZUNhbGxiYWNrKCh0eXBlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4geworICAgIGNvbnN0IHsgb25TZWxlY3QgfSA9IHByb3BzOworICAgIGlmIChvblNlbGVjdCkgeworICAgICAgb25TZWxlY3QodHlwZSwgdGV4dCk7CisgICAgfQorICAgIHNldEp1c3RDb3BpZWQodHlwZSk7CisgICAgY29weUlkLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHsKKyAgICAgIHNldEp1c3RDb3BpZWQobnVsbCk7CisgICAgfSwgMjAwMCk7CisgIH0sIFtdKTsKKyAgUmVhY3QudXNlRWZmZWN0KAorICAgICgpID0+ICgpID0+IHsKKyAgICAgIGlmIChjb3B5SWQuY3VycmVudCkgeworICAgICAgICBjbGVhclRpbWVvdXQoY29weUlkLmN1cnJlbnQpOworICAgICAgfQorICAgIH0sCisgICAgW10sCisgICk7CisKKyAgcmV0dXJuICgKKyAgICA8ZGl2PgorICAgICAgPGg0PntpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogYGFwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5jYXRlZ29yeS4ke3RpdGxlfWAsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgIH0pfTwvaDQ+CisgICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMuYW50aWNvbnNMaXN0fT4KKyAgICAgICAge2ljb25zLm1hcChuYW1lID0+ICgKKyAgICAgICAgICA8Q29weWFibGVJY29uCisgICAgICAgICAgICBrZXk9e25hbWV9CisgICAgICAgICAgICBuYW1lPXtuYW1lfQorICAgICAgICAgICAgdGhlbWU9e3RoZW1lfQorICAgICAgICAgICAgaXNOZXc9e25ld0ljb25zLmluY2x1ZGVzKG5hbWUpfQorICAgICAgICAgICAganVzdENvcGllZD17anVzdENvcGllZH0KKyAgICAgICAgICAgIG9uU2VsZWN0PXtvblNlbGVjdH0KKyAgICAgICAgICAvPgorICAgICAgICApKX0KKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBDYXRlZ29yeTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9Db3B5YWJsZUljb24udHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL0NvcHlhYmxlSWNvbi50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxY2JhMAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9Db3B5YWJsZUljb24udHN4CkBAIC0wLDAgKzEsNDcgQEAKK2ltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnOworaW1wb3J0ICogYXMgQW50ZEljb25zIGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB0eXBlIHsgVGhlbWVUeXBlIH0gZnJvbSAnLi9pbmRleCc7CitpbXBvcnQgc3R5bGVzIGZyb20gJy4vc3R5bGUubGVzcyc7CisKK2NvbnN0IGFsbEljb25zOiB7CisgIFtrZXk6IHN0cmluZ106IGFueTsKK30gPSBBbnRkSWNvbnM7CisKK2V4cG9ydCBpbnRlcmZhY2UgQ29weWFibGVJY29uUHJvcHMgeworICBuYW1lOiBzdHJpbmc7CisgIGlzTmV3OiBib29sZWFuOworICB0aGVtZTogVGhlbWVUeXBlOworICBqdXN0Q29waWVkOiBzdHJpbmcgfCBudWxsOworICBvblNlbGVjdDogKHR5cGU6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiBhbnk7Cit9CisKK2NvbnN0IENvcHlhYmxlSWNvbjogUmVhY3QuRkM8Q29weWFibGVJY29uUHJvcHM+ID0gKHsKKyAgbmFtZSwKKyAganVzdENvcGllZCwKKyAgb25TZWxlY3QsCisgIHRoZW1lLAorfSkgPT4geworICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzKHsKKyAgICBjb3BpZWQ6IGp1c3RDb3BpZWQgPT09IG5hbWUsCisgICAgW3RoZW1lXTogISF0aGVtZSwKKyAgfSk7CisgIHJldHVybiAoCisgICAgPGxpIGNsYXNzTmFtZT17Y2xhc3NOYW1lfQorICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICBpZiAob25TZWxlY3QpIHsKKyAgICAgICAgICBvblNlbGVjdCh0aGVtZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH19PgorICAgICAgPFRvb2x0aXAgdGl0bGU9e25hbWV9PgorICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChhbGxJY29uc1tuYW1lXSwgeyBjbGFzc05hbWU6IHN0eWxlcy5hbnRpY29uIH0pfQorICAgICAgPC9Ub29sdGlwPgorICAgICAgey8qIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmFudGljb25DbGFzc30+CisgICAgICAgICAgPEJhZGdlIGRvdD17aXNOZXd9PntuYW1lfTwvQmFkZ2U+CisgICAgICAgIDwvc3Bhbj4gKi99CisgICAgPC9saT4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IENvcHlhYmxlSWNvbjsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9JY29uUGljU2VhcmNoZXIudHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL0ljb25QaWNTZWFyY2hlci50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0Y2YwMQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9JY29uUGljU2VhcmNoZXIudHN4CkBAIC0wLDAgKzEsMjMzIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBVcGxvYWQsIFRvb2x0aXAsIFBvcG92ZXIsIE1vZGFsLCBQcm9ncmVzcywgU3BpbiwgUmVzdWx0IH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgKiBhcyBBbnRkSWNvbnMgZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IHsgdXNlSW50bCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0ICcuL3N0eWxlLmxlc3MnOworCitjb25zdCBhbGxJY29uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IEFudGRJY29uczsKKworY29uc3QgeyBEcmFnZ2VyIH0gPSBVcGxvYWQ7CitpbnRlcmZhY2UgQW50ZEljb25DbGFzc2lmaWVyIHsKKyAgbG9hZDogKCkgPT4gdm9pZDsKKyAgcHJlZGljdDogKGltZ0VsOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB2b2lkOworfQorZGVjbGFyZSBnbG9iYWwgeworICBpbnRlcmZhY2UgV2luZG93IHsKKyAgICBhbnRkSWNvbkNsYXNzaWZpZXI6IEFudGRJY29uQ2xhc3NpZmllcjsKKyAgfQorfQorCitpbnRlcmZhY2UgUGljU2VhcmNoZXJTdGF0ZSB7CisgIGxvYWRpbmc6IGJvb2xlYW47CisgIG1vZGFsT3BlbjogYm9vbGVhbjsKKyAgcG9wb3ZlclZpc2libGU6IGJvb2xlYW47CisgIGljb25zOiBpY29uT2JqZWN0W107CisgIGZpbGVMaXN0OiBhbnlbXTsKKyAgZXJyb3I6IGJvb2xlYW47CisgIG1vZGVsTG9hZGVkOiBib29sZWFuOworfQorCitpbnRlcmZhY2UgaWNvbk9iamVjdCB7CisgIHR5cGU6IHN0cmluZzsKKyAgc2NvcmU6IG51bWJlcjsKK30KKworY29uc3QgUGljU2VhcmNoZXI6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCB7Zm9ybWF0TWVzc2FnZX0gPSBpbnRsOworICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlPFBpY1NlYXJjaGVyU3RhdGU+KHsKKyAgICBsb2FkaW5nOiBmYWxzZSwKKyAgICBtb2RhbE9wZW46IGZhbHNlLAorICAgIHBvcG92ZXJWaXNpYmxlOiBmYWxzZSwKKyAgICBpY29uczogW10sCisgICAgZmlsZUxpc3Q6IFtdLAorICAgIGVycm9yOiBmYWxzZSwKKyAgICBtb2RlbExvYWRlZDogZmFsc2UsCisgIH0pOworICBjb25zdCBwcmVkaWN0ID0gKGltZ0VsOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7CisgICAgdHJ5IHsKKyAgICAgIGxldCBpY29uczogYW55W10gPSB3aW5kb3cuYW50ZEljb25DbGFzc2lmaWVyLnByZWRpY3QoaW1nRWwpOworICAgICAgaWYgKGd0YWcgJiYgaWNvbnMubGVuZ3RoKSB7CisgICAgICAgIGd0YWcoJ2V2ZW50JywgJ2ljb24nLCB7CisgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6ICdzZWFyY2gtYnktaW1hZ2UnLAorICAgICAgICAgIGV2ZW50X2xhYmVsOiBpY29uc1swXS5jbGFzc05hbWUsCisgICAgICAgIH0pOworICAgICAgfQorICAgICAgaWNvbnMgPSBpY29ucy5tYXAoaSA9PiAoeyBzY29yZTogaS5zY29yZSwgdHlwZTogaS5jbGFzc05hbWUucmVwbGFjZSgvXHMvZywgJy0nKSB9KSk7CisgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogZmFsc2UsIGljb25zIH0pKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgbG9hZGluZzogZmFsc2UsIGVycm9yOiB0cnVlIH0pKTsKKyAgICB9CisgIH07CisgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzCisgIGNvbnN0IHRvSW1hZ2UgPSAodXJsOiBzdHJpbmcpID0+CisgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CisgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsKKyAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ2Nyb3NzT3JpZ2luJywgJ2Fub255bW91cycpOworICAgICAgaW1nLnNyYyA9IHVybDsKKyAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7CisgICAgICAgIHJlc29sdmUoaW1nKTsKKyAgICAgIH07CisgICAgfSk7CisKKyAgY29uc3QgdXBsb2FkRmlsZSA9IHVzZUNhbGxiYWNrKChmaWxlOiBGaWxlKSA9PiB7CisgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBsb2FkaW5nOiB0cnVlIH0pKTsKKyAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOworICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7CisgICAgICB0b0ltYWdlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKS50aGVuKHByZWRpY3QpOworICAgICAgc2V0U3RhdGUocHJldiA9PiAoeworICAgICAgICAuLi5wcmV2LAorICAgICAgICBmaWxlTGlzdDogW3sgdWlkOiAxLCBuYW1lOiBmaWxlLm5hbWUsIHN0YXR1czogJ2RvbmUnLCB1cmw6IHJlYWRlci5yZXN1bHQgfV0sCisgICAgICB9KSk7CisgICAgfTsKKyAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKKyAgfSwgW10pOworCisgIGNvbnN0IG9uUGFzdGUgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7CisgICAgY29uc3QgaXRlbXMgPSBldmVudC5jbGlwYm9hcmREYXRhICYmIGV2ZW50LmNsaXBib2FyZERhdGEuaXRlbXM7CisgICAgbGV0IGZpbGUgPSBudWxsOworICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1zW2ldLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJykpIHsKKyAgICAgICAgICBmaWxlID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbGUpIHsKKyAgICAgIHVwbG9hZEZpbGUoZmlsZSk7CisgICAgfQorICB9LCBbXSk7CisgIGNvbnN0IHRvZ2dsZU1vZGFsID0gdXNlQ2FsbGJhY2soKCkgPT4geworICAgIHNldFN0YXRlKHByZXYgPT4gKHsKKyAgICAgIC4uLnByZXYsCisgICAgICBtb2RhbE9wZW46ICFwcmV2Lm1vZGFsT3BlbiwKKyAgICAgIHBvcG92ZXJWaXNpYmxlOiBmYWxzZSwKKyAgICAgIGZpbGVMaXN0OiBbXSwKKyAgICAgIGljb25zOiBbXSwKKyAgICB9KSk7CisgICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGlzYWJsZUljb25UaXAnKSkgeworICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rpc2FibGVJY29uVGlwJywgJ3RydWUnKTsKKyAgICB9CisgIH0sIFtdKTsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOworICAgIHNjcmlwdC5vbmxvYWQgPSBhc3luYyAoKSA9PiB7CisgICAgICBhd2FpdCB3aW5kb3cuYW50ZEljb25DbGFzc2lmaWVyLmxvYWQoKTsKKyAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgbW9kZWxMb2FkZWQ6IHRydWUgfSkpOworICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBvblBhc3RlKTsKKyAgICB9OworICAgIHNjcmlwdC5zcmMgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2xld2lzNjE3L2FudGQtaWNvbi1jbGFzc2lmaWVyQDAuMC9kaXN0L21haW4uanMnOworICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKyAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHBvcG92ZXJWaXNpYmxlOiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rpc2FibGVJY29uVGlwJykgfSkpOworICAgIHJldHVybiAoKSA9PiB7CisgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIG9uUGFzdGUpOworICAgIH07CisgIH0sIFtdKTsKKworICByZXR1cm4gKAorICAgIDxkaXYgY2xhc3NOYW1lPSJpY29uUGljU2VhcmNoZXIiPgorICAgICAgPFBvcG92ZXIKKyAgICAgICAgY29udGVudD17Zm9ybWF0TWVzc2FnZSh7aWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLmludHJvJ30pfQorICAgICAgICBvcGVuPXtzdGF0ZS5wb3BvdmVyVmlzaWJsZX0KKyAgICAgID4KKyAgICAgICAgPEFudGRJY29ucy5DYW1lcmFPdXRsaW5lZCBjbGFzc05hbWU9Imljb24tcGljLWJ0biIgb25DbGljaz17dG9nZ2xlTW9kYWx9IC8+CisgICAgICA8L1BvcG92ZXI+CisgICAgICA8TW9kYWwKKyAgICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgaWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnRpdGxlJywKKyAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgIH0pfQorICAgICAgICBvcGVuPXtzdGF0ZS5tb2RhbE9wZW59CisgICAgICAgIG9uQ2FuY2VsPXt0b2dnbGVNb2RhbH0KKyAgICAgICAgZm9vdGVyPXtudWxsfQorICAgICAgPgorICAgICAgICB7c3RhdGUubW9kZWxMb2FkZWQgfHwgKAorICAgICAgICAgIDxTcGluCisgICAgICAgICAgICBzcGlubmluZz17IXN0YXRlLm1vZGVsTG9hZGVkfQorICAgICAgICAgICAgdGlwPXtmb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgaWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLm1vZGVsbG9hZGluZycsCisKKyAgICAgICAgICAgIH0pfQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgaGVpZ2h0OiAxMDAgfX0gLz4KKyAgICAgICAgICA8L1NwaW4+CisgICAgICAgICl9CisgICAgICAgIHtzdGF0ZS5tb2RlbExvYWRlZCAmJiAoCisgICAgICAgICAgPERyYWdnZXIKKyAgICAgICAgICAgIGFjY2VwdD0iaW1hZ2UvanBlZywgaW1hZ2UvcG5nIgorICAgICAgICAgICAgbGlzdFR5cGU9InBpY3R1cmUiCisgICAgICAgICAgICBjdXN0b21SZXF1ZXN0PXtvID0+IHVwbG9hZEZpbGUoby5maWxlIGFzIEZpbGUpfQorICAgICAgICAgICAgZmlsZUxpc3Q9e3N0YXRlLmZpbGVMaXN0fQorICAgICAgICAgICAgc2hvd1VwbG9hZExpc3Q9e3sgc2hvd1ByZXZpZXdJY29uOiBmYWxzZSwgc2hvd1JlbW92ZUljb246IGZhbHNlIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJhbnQtdXBsb2FkLWRyYWctaWNvbiI+CisgICAgICAgICAgICAgIDxBbnRkSWNvbnMuSW5ib3hPdXRsaW5lZCAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJhbnQtdXBsb2FkLXRleHQiPgorICAgICAgICAgICAgICB7Zm9ybWF0TWVzc2FnZSh7aWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnVwbG9hZC10ZXh0J30pfQorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJhbnQtdXBsb2FkLWhpbnQiPgorICAgICAgICAgICAgICB7Zm9ybWF0TWVzc2FnZSh7aWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnVwbG9hZC1oaW50J30pfQorICAgICAgICAgICAgPC9wPgorICAgICAgICAgIDwvRHJhZ2dlcj4KKyAgICAgICAgKX0KKyAgICAgICAgPFNwaW4KKyAgICAgICAgICBzcGlubmluZz17c3RhdGUubG9hZGluZ30KKyAgICAgICAgICB0aXA9e2Zvcm1hdE1lc3NhZ2Uoe2lkOiAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci5tYXRjaGluZyd9KX0KKyAgICAgICAgPgorICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJpY29uLXBpYy1zZWFyY2gtcmVzdWx0Ij4KKyAgICAgICAgICAgIHtzdGF0ZS5pY29ucy5sZW5ndGggPiAwICYmICgKKyAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InJlc3VsdC10aXAiPgorICAgICAgICAgICAgICAgIHtmb3JtYXRNZXNzYWdlKHtpZDogJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIucmVzdWx0LXRpcCd9KX0KKyAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICApfQorICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICB7c3RhdGUuaWNvbnMubGVuZ3RoID4gMCAmJiAoCisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJjb2wtaWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAge2Zvcm1hdE1lc3NhZ2Uoe2lkOiAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci50aC1pY29uJ30pfQorICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+e2Zvcm1hdE1lc3NhZ2Uoe2lkOiAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci50aC1zY29yZSd9KX08L3RoPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICApfQorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAge3N0YXRlLmljb25zLm1hcChpY29uID0+IHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gaWNvbjsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGljb25OYW1lID0gYCR7dHlwZQorICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJy0nKQorICAgICAgICAgICAgICAgICAgICAubWFwKHN0ciA9PiBgJHtzdHJbMF0udG9VcHBlckNhc2UoKX0ke3N0ci5zbGljZSgxKX1gKQorICAgICAgICAgICAgICAgICAgICAuam9pbignJyl9T3V0bGluZWRgOworICAgICAgICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICAgICAgPHRyIGtleT17aWNvbk5hbWV9PgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9ImNvbC1pY29uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e2ljb24udHlwZX0gcGxhY2VtZW50PSJyaWdodCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoYWxsSWNvbnNbaWNvbk5hbWVdKX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgPFByb2dyZXNzIHBlcmNlbnQ9e01hdGguY2VpbChpY29uLnNjb3JlICogMTAwKX0gLz4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9KX0KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICB7c3RhdGUuZXJyb3IgJiYgKAorICAgICAgICAgICAgICA8UmVzdWx0CisgICAgICAgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICAgICAgICAgICAgdGl0bGU9IjUwMyIKKyAgICAgICAgICAgICAgICBzdWJUaXRsZT17Zm9ybWF0TWVzc2FnZSh7aWQ6ICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnNlcnZlci1lcnJvcid9KX0KKyAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICl9CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvU3Bpbj4KKyAgICAgIDwvTW9kYWw+CisgICAgPC9kaXY+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBQaWNTZWFyY2hlcjsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9maWVsZHMudHMgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9JY29uU2VsZWN0b3IvZmllbGRzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzdlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9JY29uU2VsZWN0b3IvZmllbGRzLnRzCkBAIC0wLDAgKzEsMjIzIEBACitpbXBvcnQgKiBhcyBBbnRkSWNvbnMgZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zJzsKKworY29uc3QgYWxsID0gT2JqZWN0LmtleXMoQW50ZEljb25zKQorICAubWFwKG4gPT4gbi5yZXBsYWNlKC8oT3V0bGluZWR8RmlsbGVkfFR3b1RvbmUpJC8sICcnKSkKKyAgLmZpbHRlcigobiwgaSwgYXJyKSA9PiBhcnIuaW5kZXhPZihuKSA9PT0gaSk7CisKK2NvbnN0IGRpcmVjdGlvbiA9IFsKKyAgJ1N0ZXBCYWNrd2FyZCcsCisgICdTdGVwRm9yd2FyZCcsCisgICdGYXN0QmFja3dhcmQnLAorICAnRmFzdEZvcndhcmQnLAorICAnU2hyaW5rJywKKyAgJ0Fycm93c0FsdCcsCisgICdEb3duJywKKyAgJ1VwJywKKyAgJ0xlZnQnLAorICAnUmlnaHQnLAorICAnQ2FyZXRVcCcsCisgICdDYXJldERvd24nLAorICAnQ2FyZXRMZWZ0JywKKyAgJ0NhcmV0UmlnaHQnLAorICAnVXBDaXJjbGUnLAorICAnRG93bkNpcmNsZScsCisgICdMZWZ0Q2lyY2xlJywKKyAgJ1JpZ2h0Q2lyY2xlJywKKyAgJ0RvdWJsZVJpZ2h0JywKKyAgJ0RvdWJsZUxlZnQnLAorICAnVmVydGljYWxMZWZ0JywKKyAgJ1ZlcnRpY2FsUmlnaHQnLAorICAnVmVydGljYWxBbGlnblRvcCcsCisgICdWZXJ0aWNhbEFsaWduTWlkZGxlJywKKyAgJ1ZlcnRpY2FsQWxpZ25Cb3R0b20nLAorICAnRm9yd2FyZCcsCisgICdCYWNrd2FyZCcsCisgICdSb2xsYmFjaycsCisgICdFbnRlcicsCisgICdSZXR3ZWV0JywKKyAgJ1N3YXAnLAorICAnU3dhcExlZnQnLAorICAnU3dhcFJpZ2h0JywKKyAgJ0Fycm93VXAnLAorICAnQXJyb3dEb3duJywKKyAgJ0Fycm93TGVmdCcsCisgICdBcnJvd1JpZ2h0JywKKyAgJ1BsYXlDaXJjbGUnLAorICAnVXBTcXVhcmUnLAorICAnRG93blNxdWFyZScsCisgICdMZWZ0U3F1YXJlJywKKyAgJ1JpZ2h0U3F1YXJlJywKKyAgJ0xvZ2luJywKKyAgJ0xvZ291dCcsCisgICdNZW51Rm9sZCcsCisgICdNZW51VW5mb2xkJywKKyAgJ0JvcmRlckJvdHRvbScsCisgICdCb3JkZXJIb3Jpem9udGFsJywKKyAgJ0JvcmRlcklubmVyJywKKyAgJ0JvcmRlck91dGVyJywKKyAgJ0JvcmRlckxlZnQnLAorICAnQm9yZGVyUmlnaHQnLAorICAnQm9yZGVyVG9wJywKKyAgJ0JvcmRlclZlcnRpY2xlJywKKyAgJ1BpY0NlbnRlcicsCisgICdQaWNMZWZ0JywKKyAgJ1BpY1JpZ2h0JywKKyAgJ1JhZGl1c0JvdHRvbWxlZnQnLAorICAnUmFkaXVzQm90dG9tcmlnaHQnLAorICAnUmFkaXVzVXBsZWZ0JywKKyAgJ1JhZGl1c1VwcmlnaHQnLAorICAnRnVsbHNjcmVlbicsCisgICdGdWxsc2NyZWVuRXhpdCcsCitdOworCitjb25zdCBzdWdnZXN0aW9uID0gWworICAnUXVlc3Rpb24nLAorICAnUXVlc3Rpb25DaXJjbGUnLAorICAnUGx1cycsCisgICdQbHVzQ2lyY2xlJywKKyAgJ1BhdXNlJywKKyAgJ1BhdXNlQ2lyY2xlJywKKyAgJ01pbnVzJywKKyAgJ01pbnVzQ2lyY2xlJywKKyAgJ1BsdXNTcXVhcmUnLAorICAnTWludXNTcXVhcmUnLAorICAnSW5mbycsCisgICdJbmZvQ2lyY2xlJywKKyAgJ0V4Y2xhbWF0aW9uJywKKyAgJ0V4Y2xhbWF0aW9uQ2lyY2xlJywKKyAgJ0Nsb3NlJywKKyAgJ0Nsb3NlQ2lyY2xlJywKKyAgJ0Nsb3NlU3F1YXJlJywKKyAgJ0NoZWNrJywKKyAgJ0NoZWNrQ2lyY2xlJywKKyAgJ0NoZWNrU3F1YXJlJywKKyAgJ0Nsb2NrQ2lyY2xlJywKKyAgJ1dhcm5pbmcnLAorICAnSXNzdWVzQ2xvc2UnLAorICAnU3RvcCcsCitdOworCitjb25zdCBlZGl0b3IgPSBbCisgICdFZGl0JywKKyAgJ0Zvcm0nLAorICAnQ29weScsCisgICdTY2lzc29yJywKKyAgJ0RlbGV0ZScsCisgICdTbmlwcGV0cycsCisgICdEaWZmJywKKyAgJ0hpZ2hsaWdodCcsCisgICdBbGlnbkNlbnRlcicsCisgICdBbGlnbkxlZnQnLAorICAnQWxpZ25SaWdodCcsCisgICdCZ0NvbG9ycycsCisgICdCb2xkJywKKyAgJ0l0YWxpYycsCisgICdVbmRlcmxpbmUnLAorICAnU3RyaWtldGhyb3VnaCcsCisgICdSZWRvJywKKyAgJ1VuZG8nLAorICAnWm9vbUluJywKKyAgJ1pvb21PdXQnLAorICAnRm9udENvbG9ycycsCisgICdGb250U2l6ZScsCisgICdMaW5lSGVpZ2h0JywKKyAgJ0Rhc2gnLAorICAnU21hbGxEYXNoJywKKyAgJ1NvcnRBc2NlbmRpbmcnLAorICAnU29ydERlc2NlbmRpbmcnLAorICAnRHJhZycsCisgICdPcmRlcmVkTGlzdCcsCisgICdVbm9yZGVyZWRMaXN0JywKKyAgJ1JhZGl1c1NldHRpbmcnLAorICAnQ29sdW1uV2lkdGgnLAorICAnQ29sdW1uSGVpZ2h0JywKK107CisKK2NvbnN0IGRhdGEgPSBbCisgICdBcmVhQ2hhcnQnLAorICAnUGllQ2hhcnQnLAorICAnQmFyQ2hhcnQnLAorICAnRG90Q2hhcnQnLAorICAnTGluZUNoYXJ0JywKKyAgJ1JhZGFyQ2hhcnQnLAorICAnSGVhdE1hcCcsCisgICdGYWxsJywKKyAgJ1Jpc2UnLAorICAnU3RvY2snLAorICAnQm94UGxvdCcsCisgICdGdW5kJywKKyAgJ1NsaWRlcnMnLAorXTsKKworY29uc3QgbG9nbyA9IFsKKyAgJ0FuZHJvaWQnLAorICAnQXBwbGUnLAorICAnV2luZG93cycsCisgICdJZScsCisgICdDaHJvbWUnLAorICAnR2l0aHViJywKKyAgJ0FsaXdhbmd3YW5nJywKKyAgJ0RpbmdkaW5nJywKKyAgJ1dlaWJvU3F1YXJlJywKKyAgJ1dlaWJvQ2lyY2xlJywKKyAgJ1Rhb2Jhb0NpcmNsZScsCisgICdIdG1sNScsCisgICdXZWlibycsCisgICdUd2l0dGVyJywKKyAgJ1dlY2hhdCcsCisgICdZb3V0dWJlJywKKyAgJ0FsaXBheUNpcmNsZScsCisgICdUYW9iYW8nLAorICAnU2t5cGUnLAorICAnUXEnLAorICAnTWVkaXVtV29ya21hcmsnLAorICAnR2l0bGFiJywKKyAgJ01lZGl1bScsCisgICdMaW5rZWRpbicsCisgICdHb29nbGVQbHVzJywKKyAgJ0Ryb3Bib3gnLAorICAnRmFjZWJvb2snLAorICAnQ29kZXBlbicsCisgICdDb2RlU2FuZGJveCcsCisgICdDb2RlU2FuZGJveENpcmNsZScsCisgICdBbWF6b24nLAorICAnR29vZ2xlJywKKyAgJ0NvZGVwZW5DaXJjbGUnLAorICAnQWxpcGF5JywKKyAgJ0FudERlc2lnbicsCisgICdBbnRDbG91ZCcsCisgICdBbGl5dW4nLAorICAnWmhpaHUnLAorICAnU2xhY2snLAorICAnU2xhY2tTcXVhcmUnLAorICAnQmVoYW5jZScsCisgICdCZWhhbmNlU3F1YXJlJywKKyAgJ0RyaWJiYmxlJywKKyAgJ0RyaWJiYmxlU3F1YXJlJywKKyAgJ0luc3RhZ3JhbScsCisgICdZdXF1ZScsCisgICdBbGliYWJhJywKKyAgJ1lhaG9vJywKKyAgJ1JlZGRpdCcsCisgICdTa2V0Y2gnLAorICAnV2hhdHNBcHAnLAorICAnRGluZ3RhbGsnLAorXTsKKworY29uc3QgZGF0dW0gPSBbLi4uZGlyZWN0aW9uLCAuLi5zdWdnZXN0aW9uLCAuLi5lZGl0b3IsIC4uLmRhdGEsIC4uLmxvZ29dOworCitjb25zdCBvdGhlciA9IGFsbC5maWx0ZXIobiA9PiAhZGF0dW0uaW5jbHVkZXMobikpOworCitleHBvcnQgY29uc3QgY2F0ZWdvcmllcyA9IHsKKyAgZGlyZWN0aW9uLAorICBzdWdnZXN0aW9uLAorICBlZGl0b3IsCisgIGRhdGEsCisgIGxvZ28sCisgIG90aGVyLAorfTsKKworZXhwb3J0IGRlZmF1bHQgY2F0ZWdvcmllczsKKworZXhwb3J0IHR5cGUgQ2F0ZWdvcmllcyA9IHR5cGVvZiBjYXRlZ29yaWVzOworZXhwb3J0IHR5cGUgQ2F0ZWdvcmllc0tleXMgPSBrZXlvZiBDYXRlZ29yaWVzOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkYzkzMQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9pbmRleC50c3gKQEAgLTAsMCArMSwxNDIgQEAKK2ltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCBJY29uLCAqIGFzIEFudGRJY29ucyBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBSYWRpbywgSW5wdXQsIEVtcHR5IH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgdHlwZSB7IFJhZGlvQ2hhbmdlRXZlbnQgfSBmcm9tICdhbnRkL2VzL3JhZGlvL2ludGVyZmFjZSc7CitpbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoL2RlYm91bmNlJzsKK2ltcG9ydCBDYXRlZ29yeSBmcm9tICcuL0NhdGVnb3J5JzsKK2ltcG9ydCBJY29uUGljU2VhcmNoZXIgZnJvbSAnLi9JY29uUGljU2VhcmNoZXInOworaW1wb3J0IHsgRmlsbGVkSWNvbiwgT3V0bGluZWRJY29uLCBUd29Ub25lSWNvbiB9IGZyb20gJy4vdGhlbWVJY29ucyc7CitpbXBvcnQgdHlwZSB7IENhdGVnb3JpZXNLZXlzIH0gZnJvbSAnLi9maWVsZHMnOworaW1wb3J0IHsgY2F0ZWdvcmllcyB9IGZyb20gJy4vZmllbGRzJzsKKy8vIGltcG9ydCB7IHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKKworZXhwb3J0IGVudW0gVGhlbWVUeXBlIHsKKyAgRmlsbGVkID0gJ0ZpbGxlZCcsCisgIE91dGxpbmVkID0gJ091dGxpbmVkJywKKyAgVHdvVG9uZSA9ICdUd29Ub25lJywKK30KKworY29uc3QgYWxsSWNvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSBBbnRkSWNvbnM7CisKK2ludGVyZmFjZSBJY29uU2VsZWN0b3JQcm9wcyB7CisgIC8vaW50bDogYW55OworICBvblNlbGVjdDogYW55OworfQorCitpbnRlcmZhY2UgSWNvblNlbGVjdG9yU3RhdGUgeworICB0aGVtZTogVGhlbWVUeXBlOworICBzZWFyY2hLZXk6IHN0cmluZzsKK30KKworY29uc3QgSWNvblNlbGVjdG9yOiBSZWFjdC5GQzxJY29uU2VsZWN0b3JQcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgLy8gY29uc3QgaW50bCA9IHVzZUludGwoKTsKKyAgLy8gY29uc3QgeyBtZXNzYWdlcyB9ID0gaW50bDsKKyAgY29uc3QgeyBvblNlbGVjdCB9ID0gcHJvcHM7CisgIGNvbnN0IFtkaXNwbGF5U3RhdGUsIHNldERpc3BsYXlTdGF0ZV0gPSBSZWFjdC51c2VTdGF0ZTxJY29uU2VsZWN0b3JTdGF0ZT4oeworICAgIHRoZW1lOiBUaGVtZVR5cGUuT3V0bGluZWQsCisgICAgc2VhcmNoS2V5OiAnJywKKyAgfSk7CisKKyAgY29uc3QgbmV3SWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdOworCisgIGNvbnN0IGhhbmRsZVNlYXJjaEljb24gPSBSZWFjdC51c2VDYWxsYmFjaygKKyAgICBkZWJvdW5jZSgoc2VhcmNoS2V5OiBzdHJpbmcpID0+IHsKKyAgICAgIHNldERpc3BsYXlTdGF0ZShwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCBzZWFyY2hLZXkgfSkpOworICAgIH0pLAorICAgIFtdLAorICApOworCisgIGNvbnN0IGhhbmRsZUNoYW5nZVRoZW1lID0gUmVhY3QudXNlQ2FsbGJhY2soKGU6IFJhZGlvQ2hhbmdlRXZlbnQpID0+IHsKKyAgICBzZXREaXNwbGF5U3RhdGUocHJldlN0YXRlID0+ICh7IC4uLnByZXZTdGF0ZSwgdGhlbWU6IGUudGFyZ2V0LnZhbHVlIGFzIFRoZW1lVHlwZSB9KSk7CisgIH0sIFtdKTsKKworICBjb25zdCByZW5kZXJDYXRlZ29yaWVzID0gUmVhY3QudXNlTWVtbzxSZWFjdC5SZWFjdE5vZGUgfCBSZWFjdC5SZWFjdE5vZGVbXT4oKCkgPT4geworICAgIGNvbnN0IHsgc2VhcmNoS2V5ID0gJycsIHRoZW1lIH0gPSBkaXNwbGF5U3RhdGU7CisKKyAgICBjb25zdCBjYXRlZ29yaWVzUmVzdWx0ID0gT2JqZWN0LmtleXMoY2F0ZWdvcmllcykKKyAgICAgIC5tYXAoKGtleTogQ2F0ZWdvcmllc0tleXMpID0+IHsKKyAgICAgICAgbGV0IGljb25MaXN0ID0gY2F0ZWdvcmllc1trZXldOworICAgICAgICBpZiAoc2VhcmNoS2V5KSB7CisgICAgICAgICAgY29uc3QgbWF0Y2hLZXkgPSBzZWFyY2hLZXkKKyAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVnZXgtbGl0ZXJhbHMKKyAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYF48KFthLXpBLVpdKilcXHMvPiRgLCAnZ2knKSwgKF8sIG5hbWUpID0+IG5hbWUpCisgICAgICAgICAgICAucmVwbGFjZSgvKEZpbGxlZHxPdXRsaW5lZHxUd29Ub25lKSQvLCAnJykKKyAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgIGljb25MaXN0ID0gaWNvbkxpc3QuZmlsdGVyKChpY29uTmFtZTpzdHJpbmcpID0+IGljb25OYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobWF0Y2hLZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHlyaWdodENpcmNsZSBpcyBzYW1lIGFzIENvcHlyaWdodCwgZG9uJ3Qgc2hvdyBpdAorICAgICAgICBpY29uTGlzdCA9IGljb25MaXN0LmZpbHRlcigoaWNvbjpzdHJpbmcpID0+IGljb24gIT09ICdDb3B5cmlnaHRDaXJjbGUnKTsKKworICAgICAgICByZXR1cm4geworICAgICAgICAgIGNhdGVnb3J5OiBrZXksCisgICAgICAgICAgaWNvbnM6IGljb25MaXN0Lm1hcCgoaWNvbk5hbWU6c3RyaW5nKSA9PiBpY29uTmFtZSArIHRoZW1lKS5maWx0ZXIoKGljb25OYW1lOnN0cmluZykgPT4gYWxsSWNvbnNbaWNvbk5hbWVdKSwKKyAgICAgICAgfTsKKyAgICAgIH0pCisgICAgICAuZmlsdGVyKCh7IGljb25zIH0pID0+ICEhaWNvbnMubGVuZ3RoKQorICAgICAgLm1hcCgoeyBjYXRlZ29yeSwgaWNvbnMgfSkgPT4gKAorICAgICAgICA8Q2F0ZWdvcnkKKyAgICAgICAgICBrZXk9e2NhdGVnb3J5fQorICAgICAgICAgIHRpdGxlPXtjYXRlZ29yeSBhcyBDYXRlZ29yaWVzS2V5c30KKyAgICAgICAgICB0aGVtZT17dGhlbWV9CisgICAgICAgICAgaWNvbnM9e2ljb25zfQorICAgICAgICAgIG5ld0ljb25zPXtuZXdJY29uTmFtZXN9CisgICAgICAgICAgb25TZWxlY3Q9eyh0eXBlLCBuYW1lKSA9PiB7CisgICAgICAgICAgICBpZiAob25TZWxlY3QpIHsKKyAgICAgICAgICAgICAgb25TZWxlY3QobmFtZSwgYWxsSWNvbnNbbmFtZV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICApKTsKKyAgICByZXR1cm4gY2F0ZWdvcmllc1Jlc3VsdC5sZW5ndGggPT09IDAgPyA8RW1wdHkgc3R5bGU9e3sgbWFyZ2luOiAnMmVtIDAnIH19IC8+IDogY2F0ZWdvcmllc1Jlc3VsdDsKKyAgfSwgW2Rpc3BsYXlTdGF0ZS5zZWFyY2hLZXksIGRpc3BsYXlTdGF0ZS50aGVtZV0pOworICByZXR1cm4gKAorICAgIDw+CisgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyB9fT4KKyAgICAgICAgPFJhZGlvLkdyb3VwCisgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlTdGF0ZS50aGVtZX0KKyAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlVGhlbWV9CisgICAgICAgICAgc2l6ZT0ibGFyZ2UiCisgICAgICAgICAgb3B0aW9uVHlwZT0iYnV0dG9uIgorICAgICAgICAgIGJ1dHRvblN0eWxlPSJzb2xpZCIKKyAgICAgICAgICBvcHRpb25zPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxhYmVsOiAgPEljb24gY29tcG9uZW50PXtPdXRsaW5lZEljb259IC8+LAorICAgICAgICAgICAgICB2YWx1ZTogVGhlbWVUeXBlLk91dGxpbmVkCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsYWJlbDogPEljb24gY29tcG9uZW50PXtGaWxsZWRJY29ufSAvPiwKKyAgICAgICAgICAgICAgdmFsdWU6IFRoZW1lVHlwZS5GaWxsZWQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGxhYmVsOiA8SWNvbiBjb21wb25lbnQ9e1R3b1RvbmVJY29ufSAvPiwKKyAgICAgICAgICAgICAgdmFsdWU6IFRoZW1lVHlwZS5Ud29Ub25lCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgID4KKyAgICAgICAgICB7LyogPFJhZGlvLkJ1dHRvbiB2YWx1ZT17VGhlbWVUeXBlLk91dGxpbmVkfT4KKyAgICAgICAgICAgIDxJY29uIGNvbXBvbmVudD17T3V0bGluZWRJY29ufSAvPiB7bWVzc2FnZXNbJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5vdXRsaW5lZCddfQorICAgICAgICAgIDwvUmFkaW8uQnV0dG9uPgorICAgICAgICAgIDxSYWRpby5CdXR0b24gdmFsdWU9e1RoZW1lVHlwZS5GaWxsZWR9PgorICAgICAgICAgICAgPEljb24gY29tcG9uZW50PXtGaWxsZWRJY29ufSAvPiB7bWVzc2FnZXNbJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5maWxsZWQnXX0KKyAgICAgICAgICA8L1JhZGlvLkJ1dHRvbj4KKyAgICAgICAgICA8UmFkaW8uQnV0dG9uIHZhbHVlPXtUaGVtZVR5cGUuVHdvVG9uZX0+CisgICAgICAgICAgICA8SWNvbiBjb21wb25lbnQ9e1R3b1RvbmVJY29ufSAvPiB7bWVzc2FnZXNbJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi50d28tdG9uZSddfQorICAgICAgICAgIDwvUmFkaW8uQnV0dG9uPiAqL30KKyAgICAgICAgPC9SYWRpby5Hcm91cD4KKyAgICAgICAgPElucHV0LlNlYXJjaAorICAgICAgICAgIC8vIHBsYWNlaG9sZGVyPXttZXNzYWdlc1snYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnNlYXJjaC5wbGFjZWhvbGRlciddfQorICAgICAgICAgIHN0eWxlPXt7IG1hcmdpbjogJzAgMTBweCcsIGZsZXg6IDEgfX0KKyAgICAgICAgICBhbGxvd0NsZWFyCisgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gaGFuZGxlU2VhcmNoSWNvbihlLmN1cnJlbnRUYXJnZXQudmFsdWUpfQorICAgICAgICAgIHNpemU9ImxhcmdlIgorICAgICAgICAgIGF1dG9Gb2N1cworICAgICAgICAgIHN1ZmZpeD17PEljb25QaWNTZWFyY2hlciAvPn0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3JlbmRlckNhdGVnb3JpZXN9CisgICAgPC8+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBJY29uU2VsZWN0b3IKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9zdHlsZS5sZXNzIGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL3N0eWxlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MzUzZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL0ljb25TZWxlY3Rvci9zdHlsZS5sZXNzCkBAIC0wLDAgKzEsMTM3IEBACisuaWNvblBpY1NlYXJjaGVyIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBtYXJnaW46IDAgOHB4OworCisgIC5pY29uLXBpYy1idG4geworICAgIGNvbG9yOiBAdGV4dC1jb2xvci1zZWNvbmRhcnk7CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIHRyYW5zaXRpb246IGFsbCAwLjNzOworCisgICAgJjpob3ZlciB7CisgICAgICBjb2xvcjogQGlucHV0LWljb24taG92ZXItY29sb3I7CisgICAgfQorICB9Cit9CisKKy5pY29uLXBpYy1wcmV2aWV3IHsKKyAgd2lkdGg6IDMwcHg7CisgIGhlaWdodDogMzBweDsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgcGFkZGluZzogOHB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXItY29sb3ItYmFzZTsKKyAgYm9yZGVyLXJhZGl1czogNHB4OworCisgID4gaW1nIHsKKyAgICBtYXgtd2lkdGg6IDUwcHg7CisgICAgbWF4LWhlaWdodDogNTBweDsKKyAgfQorfQorCisuaWNvbi1waWMtc2VhcmNoLXJlc3VsdCB7CisgIG1pbi1oZWlnaHQ6IDUwcHg7CisgIHBhZGRpbmc6IDAgMTBweDsKKworICA+IC5yZXN1bHQtdGlwIHsKKyAgICBwYWRkaW5nOiAxMHB4IDA7CisgICAgY29sb3I6IEB0ZXh0LWNvbG9yLXNlY29uZGFyeTsKKyAgfQorCisgID4gdGFibGUgeworICAgIHdpZHRoOiAxMDAlOworCisgICAgLmNvbC1pY29uIHsKKyAgICAgIHdpZHRoOiA4MHB4OworICAgICAgcGFkZGluZzogMTBweCAwOworCisgICAgICA+IC5hbnRpY29uIHsKKyAgICAgICAgZm9udC1zaXplOiAzMHB4OworCisgICAgICAgIDpob3ZlciB7CisgICAgICAgICAgY29sb3I6IEBsaW5rLWhvdmVyLWNvbG9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3VsLmFudGljb25zTGlzdCB7CisgIG1hcmdpbjogMnB4IDA7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpcmVjdGlvbjogbHRyOworICBsaXN0LXN0eWxlOiBub25lOworCisgIGxpIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDQ4cHg7CisgICAgaGVpZ2h0OiA0OHB4OworICAgIG1hcmdpbjogM3B4IDA7CisgICAgcGFkZGluZzogMnB4IDAgMDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIGNvbG9yOiAjNTU1OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CisgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjNzIGVhc2UtaW4tb3V0LCBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZS1pbi1vdXQ7CisKKyAgICAucnRsICYgeworICAgICAgbWFyZ2luOiAzcHggMDsKKyAgICAgIHBhZGRpbmc6IDJweCAwIDA7CisgICAgfQorCisgICAgLmFudGljb24geworICAgICAgbWFyZ2luOiA0cHggMCAycHg7CisgICAgICBmb250LXNpemU6IDI0cHg7CisgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBlYXNlLWluLW91dDsKKyAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CisgICAgfQorCisgICAgLmFudGljb25DbGFzcyB7CisgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgIGZvbnQtZmFtaWx5OiAnTHVjaWRhIENvbnNvbGUnLCBDb25zb2xhcywgTW9uYWNvLCAnQW5kYWxlIE1vbm8nLCAnVWJ1bnR1IE1vbm8nLCBtb25vc3BhY2U7CisgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjgzKTsKKworICAgICAgLmFudC1iYWRnZSB7CisgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuM3MgZWFzZS1pbi1vdXQ7CisgICAgICB9CisgICAgfQorCisgICAgJjpob3ZlciB7CisgICAgICBjb2xvcjogI2ZmZjsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5LWNvbG9yOworCisgICAgICAuYW50aWNvbiB7CisgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS40KTsKKyAgICAgIH0KKworICAgICAgLmFudC1iYWRnZSB7CisgICAgICAgIGNvbG9yOiAjZmZmOworICAgICAgfQorICAgIH0KKworICAgICYuVHdvVG9uZTpob3ZlciB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOGVjYWZlOworICAgIH0KKworICAgICYuY29waWVkOmhvdmVyIHsKKyAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CisgICAgfQorCisgICAgJi5jb3BpZWQ6OmFmdGVyIHsKKyAgICAgIHRvcDogLTJweDsKKyAgICAgIG9wYWNpdHk6IDE7CisgICAgfQorICB9Cit9CisKKy5jb3BpZWQtY29kZSB7CisgIHBhZGRpbmc6IDJweCA0cHg7CisgIGZvbnQtc2l6ZTogMTJweDsKKyAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL3RoZW1lSWNvbnMudHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yL3RoZW1lSWNvbnMudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWZlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9JY29uU2VsZWN0b3IvdGhlbWVJY29ucy50c3gKQEAgLTAsMCArMSw0MSBAQAoraW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOworCisKK2V4cG9ydCBjb25zdCBGaWxsZWRJY29uOiBSZWFjdC5GQyA9IHByb3BzID0+IHsKKyAgY29uc3QgcGF0aCA9CisgICAgJ004NjQgNjRIMTYwQzEwNyA2NCA2NCAxMDcgNjQgMTYwdicgKworICAgICc3MDRjMCA1MyA0MyA5NiA5NiA5Nmg3MDRjNTMgMCA5Ni00MyA5Ni05NlYxNicgKworICAgICcwYzAtNTMtNDMtOTYtOTYtOTZ6JzsKKyAgcmV0dXJuICgKKyAgICA8c3ZnIHsuLi5wcm9wc30gdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+CisgICAgICA8cGF0aCBkPXtwYXRofSAvPgorICAgIDwvc3ZnPgorICApOworfTsKKworZXhwb3J0IGNvbnN0IE91dGxpbmVkSWNvbjogUmVhY3QuRkMgPSBwcm9wcyA9PiB7CisgIGNvbnN0IHBhdGggPQorICAgICdNODY0IDY0SDE2MEMxMDcgNjQgNjQgMTA3IDY0IDE2MHY3JyArCisgICAgJzA0YzAgNTMgNDMgOTYgOTYgOTZoNzA0YzUzIDAgOTYtNDMgOTYtOTZWMTYwYycgKworICAgICcwLTUzLTQzLTk2LTk2LTk2eiBtLTEyIDgwMEgxNzJjLTYuNiAwLTEyLTUuNC0nICsKKyAgICAnMTItMTJWMTcyYzAtNi42IDUuNC0xMiAxMi0xMmg2ODBjNi42IDAgMTIgNS40JyArCisgICAgJyAxMiAxMnY2ODBjMCA2LjYtNS40IDEyLTEyIDEyeic7CisgIHJldHVybiAoCisgICAgPHN2ZyB7Li4ucHJvcHN9IHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPgorICAgICAgPHBhdGggZD17cGF0aH0gLz4KKyAgICA8L3N2Zz4KKyAgKTsKK307CisKK2V4cG9ydCBjb25zdCBUd29Ub25lSWNvbjogUmVhY3QuRkMgPSBwcm9wcyA9PiB7CisgIGNvbnN0IHBhdGggPQorICAgICdNMTYgNTEyYzAgMjczLjkzMiAyMjIuMDY2IDQ5NiA0OTYgNDknICsKKyAgICAnNnM0OTYtMjIyLjA2OCA0OTYtNDk2Uzc4NS45MzIgMTYgNTEyIDE2IDE2IDIzOC4nICsKKyAgICAnMDY2IDE2IDUxMnogbTQ5NiAzNjhWMTQ0YzIwMy40MSAwIDM2OCAxNjQuNjIyIDMnICsKKyAgICAnNjggMzY4IDAgMjAzLjQxLTE2NC42MjIgMzY4LTM2OCAzNjh6JzsKKyAgcmV0dXJuICgKKyAgICA8c3ZnIHsuLi5wcm9wc30gdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+CisgICAgICA8cGF0aCBkPXtwYXRofSAvPgorICAgIDwvc3ZnPgorICApOworfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL1JpZ2h0Q29udGVudC9BdmF0YXJEcm9wZG93bi50c3ggYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9SaWdodENvbnRlbnQvQXZhdGFyRHJvcGRvd24udHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2ViMTUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9SaWdodENvbnRlbnQvQXZhdGFyRHJvcGRvd24udHN4CkBAIC0wLDAgKzEsMTQyIEBACitpbXBvcnQgeyBMb2dvdXRPdXRsaW5lZCwgU2V0dGluZ091dGxpbmVkLCBVc2VyT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBoaXN0b3J5LCB1c2VNb2RlbCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgU3BpbiB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgY3JlYXRlU3R5bGVzIH0gZnJvbSAnYW50ZC1zdHlsZSc7CitpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICdxdWVyeXN0cmluZyc7CitpbXBvcnQgdHlwZSB7IE1lbnVJbmZvIH0gZnJvbSAncmMtbWVudS9saWIvaW50ZXJmYWNlJzsKK2ltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7CitpbXBvcnQgSGVhZGVyRHJvcGRvd24gZnJvbSAnLi4vSGVhZGVyRHJvcGRvd24nOworaW1wb3J0IHsgc2V0UmVtb3RlTWVudSB9IGZyb20gJ0Avc2VydmljZXMvc2Vzc2lvbic7CitpbXBvcnQgeyBjbGVhclNlc3Npb25Ub2tlbiB9IGZyb20gJ0AvYWNjZXNzJzsKK2ltcG9ydCB7IGxvZ291dCB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL2F1dGgnOworCitleHBvcnQgdHlwZSBHbG9iYWxIZWFkZXJSaWdodFByb3BzID0geworICBtZW51PzogYm9vbGVhbjsKKyAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7Cit9OworCitleHBvcnQgY29uc3QgQXZhdGFyTmFtZSA9ICgpID0+IHsKKyAgY29uc3QgeyBpbml0aWFsU3RhdGUgfSA9IHVzZU1vZGVsKCdAQGluaXRpYWxTdGF0ZScpOworICBjb25zdCB7IGN1cnJlbnRVc2VyIH0gPSBpbml0aWFsU3RhdGUgfHwge307CisgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9ImFudGljb24iPntjdXJyZW50VXNlcj8ubmlja05hbWV9PC9zcGFuPjsKK307CisKK2NvbnN0IHVzZVN0eWxlcyA9IGNyZWF0ZVN0eWxlcygoeyB0b2tlbiB9KSA9PiB7CisgIHJldHVybiB7CisgICAgYWN0aW9uOiB7CisgICAgICBkaXNwbGF5OiAnZmxleCcsCisgICAgICBoZWlnaHQ6ICc0OHB4JywKKyAgICAgIG1hcmdpbkxlZnQ6ICdhdXRvJywKKyAgICAgIG92ZXJmbG93OiAnaGlkZGVuJywKKyAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLAorICAgICAgcGFkZGluZzogJzAgOHB4JywKKyAgICAgIGN1cnNvcjogJ3BvaW50ZXInLAorICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsCisgICAgICAnJjpob3Zlcic6IHsKKyAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0b2tlbi5jb2xvckJnVGV4dEhvdmVyLAorICAgICAgfSwKKyAgICB9LAorICB9OworfSk7CisKK2V4cG9ydCBjb25zdCBBdmF0YXJEcm9wZG93bjogUmVhY3QuRkM8R2xvYmFsSGVhZGVyUmlnaHRQcm9wcz4gPSAoeyBtZW51LCBjaGlsZHJlbiB9KSA9PiB7CisgIC8qKgorICAgKiDpgIDlh7rnmbvlvZXvvIzlubbkuJTlsIblvZPliY3nmoQgdXJsIOS/neWtmAorICAgKi8KKyAgY29uc3QgbG9naW5PdXQgPSBhc3luYyAoKSA9PiB7CisgICAgYXdhaXQgbG9nb3V0KCk7CisgICAgY2xlYXJTZXNzaW9uVG9rZW4oKTsKKyAgICBzZXRSZW1vdGVNZW51KG51bGwpOworICAgIGNvbnN0IHsgc2VhcmNoLCBwYXRobmFtZSB9ID0gd2luZG93LmxvY2F0aW9uOworICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtczsKKyAgICAvKiog5q2k5pa55rOV5Lya6Lez6L2s5YiwIHJlZGlyZWN0IOWPguaVsOaJgOWcqOeahOS9jee9riAqLworICAgIGNvbnN0IHJlZGlyZWN0ID0gdXJsUGFyYW1zLmdldCgncmVkaXJlY3QnKTsKKyAgICAvLyBOb3RlOiBUaGVyZSBtYXkgYmUgc2VjdXJpdHkgaXNzdWVzLCBwbGVhc2Ugbm90ZQorICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgIT09ICcvdXNlci9sb2dpbicgJiYgIXJlZGlyZWN0KSB7CisgICAgICBoaXN0b3J5LnJlcGxhY2UoeworICAgICAgICBwYXRobmFtZTogJy91c2VyL2xvZ2luJywKKyAgICAgICAgc2VhcmNoOiBzdHJpbmdpZnkoeworICAgICAgICAgIHJlZGlyZWN0OiBwYXRobmFtZSArIHNlYXJjaCwKKyAgICAgICAgfSksCisgICAgICB9KTsKKyAgICB9CisgIH07CisgIGNvbnN0IHsgc3R5bGVzIH0gPSB1c2VTdHlsZXMoKTsKKworICBjb25zdCB7IGluaXRpYWxTdGF0ZSwgc2V0SW5pdGlhbFN0YXRlIH0gPSB1c2VNb2RlbCgnQEBpbml0aWFsU3RhdGUnKTsKKworICBjb25zdCBvbk1lbnVDbGljayA9IHVzZUNhbGxiYWNrKAorICAgIChldmVudDogTWVudUluZm8pID0+IHsKKyAgICAgIGNvbnN0IHsga2V5IH0gPSBldmVudDsKKyAgICAgIGlmIChrZXkgPT09ICdsb2dvdXQnKSB7CisgICAgICAgIGZsdXNoU3luYygoKSA9PiB7CisgICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKChzKSA9PiAoeyAuLi5zLCBjdXJyZW50VXNlcjogdW5kZWZpbmVkIH0pKTsKKyAgICAgICAgfSk7CisgICAgICAgIGxvZ2luT3V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGhpc3RvcnkucHVzaChgL2FjY291bnQvJHtrZXl9YCk7CisgICAgfSwKKyAgICBbc2V0SW5pdGlhbFN0YXRlXSwKKyAgKTsKKworICBjb25zdCBsb2FkaW5nID0gKAorICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmFjdGlvbn0+CisgICAgICA8U3BpbgorICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICBtYXJnaW5MZWZ0OiA4LAorICAgICAgICAgIG1hcmdpblJpZ2h0OiA4LAorICAgICAgICB9fQorICAgICAgLz4KKyAgICA8L3NwYW4+CisgICk7CisKKyAgaWYgKCFpbml0aWFsU3RhdGUpIHsKKyAgICByZXR1cm4gbG9hZGluZzsKKyAgfQorCisgIGNvbnN0IHsgY3VycmVudFVzZXIgfSA9IGluaXRpYWxTdGF0ZTsKKworICBpZiAoIWN1cnJlbnRVc2VyIHx8ICFjdXJyZW50VXNlci5uaWNrTmFtZSkgeworICAgIHJldHVybiBsb2FkaW5nOworICB9CisKKyAgY29uc3QgbWVudUl0ZW1zID0gWworICAgIC4uLihtZW51CisgICAgICA/IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICBrZXk6ICdjZW50ZXInLAorICAgICAgICAgICAgaWNvbjogPFVzZXJPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgIGxhYmVsOiAn5Liq5Lq65Lit5b+DJywKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGtleTogJ3NldHRpbmdzJywKKyAgICAgICAgICAgIGljb246IDxTZXR0aW5nT3V0bGluZWQgLz4sCisgICAgICAgICAgICBsYWJlbDogJ+S4quS6uuiuvue9ricsCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICB0eXBlOiAnZGl2aWRlcicgYXMgY29uc3QsCisgICAgICAgICAgfSwKKyAgICAgICAgXQorICAgICAgOiBbXSksCisgICAgeworICAgICAga2V5OiAnbG9nb3V0JywKKyAgICAgIGljb246IDxMb2dvdXRPdXRsaW5lZCAvPiwKKyAgICAgIGxhYmVsOiAn6YCA5Ye655m75b2VJywKKyAgICB9LAorICBdOworCisgIHJldHVybiAoCisgICAgPEhlYWRlckRyb3Bkb3duCisgICAgICBtZW51PXt7CisgICAgICAgIHNlbGVjdGVkS2V5czogW10sCisgICAgICAgIG9uQ2xpY2s6IG9uTWVudUNsaWNrLAorICAgICAgICBpdGVtczogbWVudUl0ZW1zLAorICAgICAgfX0KKyAgICA+CisgICAgICB7Y2hpbGRyZW59CisgICAgPC9IZWFkZXJEcm9wZG93bj4KKyAgKTsKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9SaWdodENvbnRlbnQvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvUmlnaHRDb250ZW50L2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE3ODMxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2NvbXBvbmVudHMvUmlnaHRDb250ZW50L2luZGV4LnRzeApAQCAtMCwwICsxLDMxIEBACitpbXBvcnQgeyBRdWVzdGlvbkNpcmNsZU91dGxpbmVkIH0gZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IHsgU2VsZWN0TGFuZyBhcyBVbWlTZWxlY3RMYW5nIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOworCitleHBvcnQgdHlwZSBTaWRlclRoZW1lID0gJ2xpZ2h0JyB8ICdkYXJrJzsKKworZXhwb3J0IGNvbnN0IFNlbGVjdExhbmcgPSAoKSA9PiB7CisgIHJldHVybiAoCisgICAgPFVtaVNlbGVjdExhbmcKKyAgICAgIHN0eWxlPXt7CisgICAgICAgIHBhZGRpbmc6IDQsCisgICAgICB9fQorICAgIC8+CisgICk7Cit9OworCitleHBvcnQgY29uc3QgUXVlc3Rpb24gPSAoKSA9PiB7CisgIHJldHVybiAoCisgICAgPGRpdgorICAgICAgc3R5bGU9e3sKKyAgICAgICAgZGlzcGxheTogJ2ZsZXgnLAorICAgICAgICBoZWlnaHQ6IDI2LAorICAgICAgfX0KKyAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vcHJvLmFudC5kZXNpZ24vZG9jcy9nZXR0aW5nLXN0YXJ0ZWQnKTsKKyAgICAgIH19CisgICAgPgorICAgICAgPFF1ZXN0aW9uQ2lyY2xlT3V0bGluZWQgLz4KKyAgICA8L2Rpdj4KKyAgKTsKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9pbmRleC50cyBiL3JlYWN0LXVpL3NyYy9jb21wb25lbnRzL2luZGV4LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODhhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvY29tcG9uZW50cy9pbmRleC50cwpAQCAtMCwwICsxLDEyIEBACisvKioKKyAqIOi/meS4quaWh+S7tuS9nOS4uue7hOS7tueahOebruW9lQorICog55uu55qE5piv57uf5LiA566h55CG5a+55aSW6L6T5Ye655qE57uE5Lu277yM5pa55L6/5YiG57G7CisgKi8KKy8qKgorICog5biD5bGA57uE5Lu2CisgKi8KK2ltcG9ydCBGb290ZXIgZnJvbSAnLi9Gb290ZXInOworaW1wb3J0IHsgUXVlc3Rpb24sIFNlbGVjdExhbmcgfSBmcm9tICcuL1JpZ2h0Q29udGVudCc7CitpbXBvcnQgeyBBdmF0YXJEcm9wZG93biwgQXZhdGFyTmFtZSB9IGZyb20gJy4vUmlnaHRDb250ZW50L0F2YXRhckRyb3Bkb3duJzsKKworZXhwb3J0IHsgRm9vdGVyLCBRdWVzdGlvbiwgU2VsZWN0TGFuZywgQXZhdGFyRHJvcGRvd24sIEF2YXRhck5hbWUgfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9lbnVtcy9odHRwRW51bS50cyBiL3JlYWN0LXVpL3NyYy9lbnVtcy9odHRwRW51bS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdmZjFmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2VudW1zL2h0dHBFbnVtLnRzCkBAIC0wLDAgKzEsMzEgQEAKKy8qKgorICogQGRlc2NyaXB0aW9uOiBSZXF1ZXN0IHJlc3VsdCBzZXQKKyAqLworZXhwb3J0IGVudW0gSHR0cFJlc3VsdCB7CisgIFNVQ0NFU1MgPSAyMDAsCisgIEVSUk9SID0gLTEsCisgIFRJTUVPVVQgPSA0MDEsCisgIFRZUEUgPSAnc3VjY2VzcycsCit9CisKKy8qKgorICogQGRlc2NyaXB0aW9uOiByZXF1ZXN0IG1ldGhvZAorICovCitleHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kIHsKKyAgR0VUID0gJ0dFVCcsCisgIFBPU1QgPSAnUE9TVCcsCisgIFBVVCA9ICdQVVQnLAorICBERUxFVEUgPSAnREVMRVRFJywKK30KKworLyoqCisgKiBAZGVzY3JpcHRpb246ICBjb250ZW50VHlwZQorICovCitleHBvcnQgZW51bSBDb250ZW50VHlwZSB7CisgIC8vIGpzb24KKyAgSlNPTiA9ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAvLyBmb3JtLWRhdGEgcXMKKyAgRk9STV9VUkxFTkNPREVEID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JywKKyAgLy8gZm9ybS1kYXRhICB1cGxvYWQKKyAgRk9STV9EQVRBID0gJ211bHRpcGFydC9mb3JtLWRhdGE7Y2hhcnNldD1VVEYtOCcsCit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvZW51bXMvcGFnZXNFbnVtcy50cyBiL3JlYWN0LXVpL3NyYy9lbnVtcy9wYWdlc0VudW1zLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGI1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvZW51bXMvcGFnZXNFbnVtcy50cwpAQCAtMCwwICsxLDQgQEAKKworZXhwb3J0IGVudW0gUGFnZUVudW0geworICAgIExPR0lOID0gJy91c2VyL2xvZ2luJworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9nbG9iYWwubGVzcyBiL3JlYWN0LXVpL3NyYy9nbG9iYWwubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEwYzUxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2dsb2JhbC5sZXNzCkBAIC0wLDAgKzEsNTMgQEAKK2h0bWwsCitib2R5LAorI3Jvb3QgeworICBoZWlnaHQ6IDEwMCU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMDsKKyAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwKKyAgICAnTm90byBTYW5zJywgc2Fucy1zZXJpZiwgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCcsCisgICAgJ05vdG8gQ29sb3IgRW1vamknOworfQorCisuY29sb3JXZWFrIHsKKyAgZmlsdGVyOiBpbnZlcnQoODAlKTsKK30KKworLmFudC1sYXlvdXQgeworICBtaW4taGVpZ2h0OiAxMDB2aDsKK30KKy5hbnQtcHJvLXNpZGVyLmFudC1sYXlvdXQtc2lkZXIuYW50LXByby1zaWRlci1maXhlZCB7CisgIGxlZnQ6IHVuc2V0OworfQorCitjYW52YXMgeworICBkaXNwbGF5OiBibG9jazsKK30KKworYm9keSB7CisgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CisgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOworfQorCit1bCwKK29sIHsKKyAgbGlzdC1zdHlsZTogbm9uZTsKK30KKworQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CisgIC5hbnQtdGFibGUgeworICAgIHdpZHRoOiAxMDAlOworICAgIG92ZXJmbG93LXg6IGF1dG87CisgICAgJi10aGVhZCA+IHRyLAorICAgICYtdGJvZHkgPiB0ciB7CisgICAgICA+IHRoLAorICAgICAgPiB0ZCB7CisgICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CisgICAgICAgID4gc3BhbiB7CisgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9nbG9iYWwudHN4IGIvcmVhY3QtdWkvc3JjL2dsb2JhbC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMWZhYgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9nbG9iYWwudHN4CkBAIC0wLDAgKzEsOTEgQEAKK2ltcG9ydCB7IHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgbm90aWZpY2F0aW9uIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgZGVmYXVsdFNldHRpbmdzIGZyb20gJy4uL2NvbmZpZy9kZWZhdWx0U2V0dGluZ3MnOworCitjb25zdCB7IHB3YSB9ID0gZGVmYXVsdFNldHRpbmdzOworY29uc3QgaXNIdHRwcyA9IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JzsKKworY29uc3QgY2xlYXJDYWNoZSA9ICgpID0+IHsKKyAgLy8gcmVtb3ZlIGFsbCBjYWNoZXMKKyAgaWYgKHdpbmRvdy5jYWNoZXMpIHsKKyAgICBjYWNoZXMKKyAgICAgIC5rZXlzKCkKKyAgICAgIC50aGVuKChrZXlzKSA9PiB7CisgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7CisgICAgICAgICAgY2FjaGVzLmRlbGV0ZShrZXkpOworICAgICAgICB9KTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUpKTsKKyAgfQorfTsKKworLy8gaWYgcHdhIGlzIHRydWUKK2lmIChwd2EpIHsKKyAgLy8gTm90aWZ5IHVzZXIgaWYgb2ZmbGluZSBub3cKKyAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N3Lm9mZmxpbmUnLCAoKSA9PiB7CisgICAgbWVzc2FnZS53YXJuaW5nKHVzZUludGwoKS5mb3JtYXRNZXNzYWdlKHsgaWQ6ICdhcHAucHdhLm9mZmxpbmUnIH0pKTsKKyAgfSk7CisKKyAgLy8gUG9wIHVwIGEgcHJvbXB0IG9uIHRoZSBwYWdlIGFza2luZyB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgdmVyc2lvbgorICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3cudXBkYXRlZCcsIChldmVudDogRXZlbnQpID0+IHsKKyAgICBjb25zdCBlID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ7CisgICAgY29uc3QgcmVsb2FkU1cgPSBhc3luYyAoKSA9PiB7CisgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBzdyB3aG9zZSBzdGF0ZSBpcyB3YWl0aW5nIGluIFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24KKyAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uCisgICAgICBjb25zdCB3b3JrZXIgPSBlLmRldGFpbCAmJiBlLmRldGFpbC53YWl0aW5nOworICAgICAgaWYgKCF3b3JrZXIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAvLyBTZW5kIHNraXAtd2FpdGluZyBldmVudCB0byB3YWl0aW5nIFNXIHdpdGggTWVzc2FnZUNoYW5uZWwKKyAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKKyAgICAgICAgY29uc3QgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOworICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IChtc2dFdmVudCkgPT4geworICAgICAgICAgIGlmIChtc2dFdmVudC5kYXRhLmVycm9yKSB7CisgICAgICAgICAgICByZWplY3QobXNnRXZlbnQuZGF0YS5lcnJvcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc29sdmUobXNnRXZlbnQuZGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiAnc2tpcC13YWl0aW5nJyB9LCBbY2hhbm5lbC5wb3J0Ml0pOworICAgICAgfSk7CisKKyAgICAgIGNsZWFyQ2FjaGUoKTsKKyAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH07CisgICAgY29uc3Qga2V5ID0gYG9wZW4ke0RhdGUubm93KCl9YDsKKyAgICBjb25zdCBidG4gPSAoCisgICAgICA8QnV0dG9uCisgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICBub3RpZmljYXRpb24uZGVzdHJveShrZXkpOworICAgICAgICAgIHJlbG9hZFNXKCk7CisgICAgICAgIH19CisgICAgICA+CisgICAgICAgIHt1c2VJbnRsKCkuZm9ybWF0TWVzc2FnZSh7IGlkOiAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQub2snIH0pfQorICAgICAgPC9CdXR0b24+CisgICAgKTsKKyAgICBub3RpZmljYXRpb24ub3Blbih7CisgICAgICBtZXNzYWdlOiB1c2VJbnRsKCkuZm9ybWF0TWVzc2FnZSh7IGlkOiAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQnIH0pLAorICAgICAgZGVzY3JpcHRpb246IHVzZUludGwoKS5mb3JtYXRNZXNzYWdlKHsgaWQ6ICdhcHAucHdhLnNlcnZpY2V3b3JrZXIudXBkYXRlZC5oaW50JyB9KSwKKyAgICAgIGJ0biwKKyAgICAgIGtleSwKKyAgICAgIG9uQ2xvc2U6IGFzeW5jICgpID0+IG51bGwsCisgICAgfSk7CisgIH0pOworfSBlbHNlIGlmICgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yICYmIGlzSHR0cHMpIHsKKyAgLy8gdW5yZWdpc3RlciBzZXJ2aWNlIHdvcmtlcgorICBjb25zdCB7IHNlcnZpY2VXb3JrZXIgfSA9IG5hdmlnYXRvcjsKKyAgaWYgKHNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9ucykgeworICAgIHNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9ucygpLnRoZW4oKHN3cykgPT4geworICAgICAgc3dzLmZvckVhY2goKHN3KSA9PiB7CisgICAgICAgIHN3LnVucmVnaXN0ZXIoKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisgIHNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9uKCkudGhlbigoc3cpID0+IHsKKyAgICBpZiAoc3cpIHN3LnVucmVnaXN0ZXIoKTsKKyAgfSk7CisKKyAgY2xlYXJDYWNoZSgpOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2hvb2tzL25ldC9kaWN0LnRzIGIvcmVhY3QtdWkvc3JjL2hvb2tzL25ldC9kaWN0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmM0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvaG9va3MvbmV0L2RpY3QudHMKQEAgLTAsMCArMSw3IEBACitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAiQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCI7CisKK2V4cG9ydCBmdW5jdGlvbiB1c2VEaWN0RW51bShuYW1lOiBzdHJpbmcpCit7CisgICAgY29uc3QgZGF0YSA9IGdldERpY3RWYWx1ZUVudW0obmFtZSk7CisgICAgcmV0dXJuIGRhdGE7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQwN2QyCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMudHMKQEAgLTAsMCArMSwyNyBAQAoraW1wb3J0IGFwcCBmcm9tICcuL2VuLVVTL2FwcCc7CitpbXBvcnQgY29tcG9uZW50IGZyb20gJy4vZW4tVVMvY29tcG9uZW50JzsKK2ltcG9ydCBnbG9iYWxIZWFkZXIgZnJvbSAnLi9lbi1VUy9nbG9iYWxIZWFkZXInOworaW1wb3J0IG1lbnUgZnJvbSAnLi9lbi1VUy9tZW51JzsKK2ltcG9ydCBwYWdlcyBmcm9tICcuL2VuLVVTL3BhZ2VzJzsKK2ltcG9ydCBwd2EgZnJvbSAnLi9lbi1VUy9wd2EnOworaW1wb3J0IHNldHRpbmdEcmF3ZXIgZnJvbSAnLi9lbi1VUy9zZXR0aW5nRHJhd2VyJzsKK2ltcG9ydCBzZXR0aW5ncyBmcm9tICcuL2VuLVVTL3NldHRpbmdzJzsKKworZXhwb3J0IGRlZmF1bHQgeworICAnbmF2QmFyLmxhbmcnOiAnTGFuZ3VhZ2VzJywKKyAgJ2xheW91dC51c2VyLmxpbmsuaGVscCc6ICdIZWxwJywKKyAgJ2xheW91dC51c2VyLmxpbmsucHJpdmFjeSc6ICdQcml2YWN5JywKKyAgJ2xheW91dC51c2VyLmxpbmsudGVybXMnOiAnVGVybXMnLAorICAnYXBwLmNvcHlyaWdodC5wcm9kdWNlZCc6ICdQcm9kdWNlZCBieSBBbnQgRmluYW5jaWFsIEV4cGVyaWVuY2UgRGVwYXJ0bWVudCcsCisgICdhcHAucHJldmlldy5kb3duLmJsb2NrJzogJ0Rvd25sb2FkIHRoaXMgcGFnZSB0byB5b3VyIGxvY2FsIHByb2plY3QnLAorICAnYXBwLndlbGNvbWUubGluay5mZXRjaC1ibG9ja3MnOiAnR2V0IGFsbCBibG9jaycsCisgICdhcHAud2VsY29tZS5saW5rLmJsb2NrLWxpc3QnOiAnUXVpY2tseSBidWlsZCBzdGFuZGFyZCwgcGFnZXMgYmFzZWQgb24gYGJsb2NrYCBkZXZlbG9wbWVudCcsCisgIC4uLmFwcCwKKyAgLi4uZ2xvYmFsSGVhZGVyLAorICAuLi5tZW51LAorICAuLi5zZXR0aW5nRHJhd2VyLAorICAuLi5zZXR0aW5ncywKKyAgLi4ucHdhLAorICAuLi5jb21wb25lbnQsCisgIC4uLnBhZ2VzLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL2VuLVVTL2FwcC50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL2VuLVVTL2FwcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRkY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvYXBwLnRzCkBAIC0wLDAgKzEsMjYgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnNlYXJjaC5wbGFjZWhvbGRlcic6ICdTZWFyY2ggaWNvbnMgaGVyZSwgY2xpY2sgaWNvbiB0byBjb3B5IGNvZGUnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ub3V0bGluZWQnOiAnT3V0bGluZWQnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uZmlsbGVkJzogJ0ZpbGxlZCcsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi50d28tdG9uZSc6ICdUd28gVG9uZScsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5jYXRlZ29yeS5kaXJlY3Rpb24nOiAnRGlyZWN0aW9uYWwgSWNvbnMnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkuc3VnZ2VzdGlvbic6ICdTdWdnZXN0ZWQgSWNvbnMnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkuZWRpdG9yJzogJ0VkaXRvciBJY29ucycsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5jYXRlZ29yeS5kYXRhJzogJ0RhdGEgSWNvbnMnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkub3RoZXInOiAnQXBwbGljYXRpb24gSWNvbnMnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkubG9nbyc6ICdCcmFuZCBhbmQgTG9nb3MnLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLmludHJvJzoKKwkJJ0FJIFNlYXJjaCBieSBpbWFnZSBpcyBvbmxpbmUsIHlvdSBhcmUgd2VsY29tZSB0byB1c2UgaXQhIPCfjoknLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnRpdGxlJzogJ1NlYXJjaCBieSBpbWFnZScsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIudXBsb2FkLXRleHQnOgorCQknQ2xpY2ssIGRyYWcsIG9yIHBhc3RlIGZpbGUgdG8gdGhpcyBhcmVhIHRvIHVwbG9hZCcsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIudXBsb2FkLWhpbnQnOgorCQknV2Ugd2lsbCBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGljb24gYmFzZWQgb24gdGhlIGltYWdlIHByb3ZpZGVkJywKKwknYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci5zZXJ2ZXItZXJyb3InOgorCQknUHJlZGljdCBzZXJ2aWNlIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJywKKwknYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci5tYXRjaGluZyc6ICdNYXRjaGluZy4uLicsCisJJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIubW9kZWxsb2FkaW5nJzogJ01vZGVsIGlzIGxvYWRpbmcuLi4nLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnJlc3VsdC10aXAnOiAnTWF0Y2hlZCB0aGUgZm9sbG93aW5nIGljb25zIGZvciB5b3U6JywKKwknYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci50aC1pY29uJzogJ0ljb24nLAorCSdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnRoLXNjb3JlJzogJ1Byb2JhYmlsaXR5JywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9jb21wb25lbnQudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9jb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhN2VlZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL2VuLVVTL2NvbXBvbmVudC50cwpAQCAtMCwwICsxLDUgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2NvbXBvbmVudC50YWdTZWxlY3QuZXhwYW5kJzogJ0V4cGFuZCcsCisgICdjb21wb25lbnQudGFnU2VsZWN0LmNvbGxhcHNlJzogJ0NvbGxhcHNlJywKKyAgJ2NvbXBvbmVudC50YWdTZWxlY3QuYWxsJzogJ0FsbCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvZ2xvYmFsSGVhZGVyLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvZ2xvYmFsSGVhZGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9nbG9iYWxIZWFkZXIudHMKQEAgLTAsMCArMSwxNyBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5zZWFyY2gnOiAnU2VhcmNoJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuc2VhcmNoLmV4YW1wbGUxJzogJ1NlYXJjaCBleGFtcGxlIDEnLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5zZWFyY2guZXhhbXBsZTInOiAnU2VhcmNoIGV4YW1wbGUgMicsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLnNlYXJjaC5leGFtcGxlMyc6ICdTZWFyY2ggZXhhbXBsZSAzJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuaGVscCc6ICdIZWxwJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubm90aWZpY2F0aW9uJzogJ05vdGlmaWNhdGlvbicsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLm5vdGlmaWNhdGlvbi5lbXB0eSc6ICdZb3UgaGF2ZSB2aWV3ZWQgYWxsIG5vdGlmaWNhdGlvbnMuJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubWVzc2FnZSc6ICdNZXNzYWdlJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubWVzc2FnZS5lbXB0eSc6ICdZb3UgaGF2ZSB2aWV3ZWQgYWxsIG1lc3NzYWdlcy4nLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5ldmVudCc6ICdFdmVudCcsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLmV2ZW50LmVtcHR5JzogJ1lvdSBoYXZlIHZpZXdlZCBhbGwgZXZlbnRzLicsCisgICdjb21wb25lbnQubm90aWNlSWNvbi5jbGVhcic6ICdDbGVhcicsCisgICdjb21wb25lbnQubm90aWNlSWNvbi5jbGVhcmVkJzogJ0NsZWFyZWQnLAorICAnY29tcG9uZW50Lm5vdGljZUljb24uZW1wdHknOiAnTm8gbm90aWZpY2F0aW9ucycsCisgICdjb21wb25lbnQubm90aWNlSWNvbi52aWV3LW1vcmUnOiAnVmlldyBtb3JlJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9tZW51LnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvbWVudS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUzZTUzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvbWVudS50cwpAQCAtMCwwICsxLDUyIEBACitleHBvcnQgZGVmYXVsdCB7CisgICdtZW51LndlbGNvbWUnOiAnV2VsY29tZScsCisgICdtZW51Lm1vcmUtYmxvY2tzJzogJ01vcmUgQmxvY2tzJywKKyAgJ21lbnUuaG9tZSc6ICdIb21lJywKKyAgJ21lbnUuYWRtaW4nOiAnQWRtaW4nLAorICAnbWVudS5hZG1pbi5zdWItcGFnZSc6ICdTdWItUGFnZScsCisgICdtZW51LmxvZ2luJzogJ0xvZ2luJywKKyAgJ21lbnUucmVnaXN0ZXInOiAnUmVnaXN0ZXInLAorICAnbWVudS5yZWdpc3Rlci1yZXN1bHQnOiAnUmVnaXN0ZXIgUmVzdWx0JywKKyAgJ21lbnUuZGFzaGJvYXJkJzogJ0Rhc2hib2FyZCcsCisgICdtZW51LmRhc2hib2FyZC5hbmFseXNpcyc6ICdBbmFseXNpcycsCisgICdtZW51LmRhc2hib2FyZC5tb25pdG9yJzogJ01vbml0b3InLAorICAnbWVudS5kYXNoYm9hcmQud29ya3BsYWNlJzogJ1dvcmtwbGFjZScsCisgICdtZW51LmV4Y2VwdGlvbi40MDMnOiAnNDAzJywKKyAgJ21lbnUuZXhjZXB0aW9uLjQwNCc6ICc0MDQnLAorICAnbWVudS5leGNlcHRpb24uNTAwJzogJzUwMCcsCisgICdtZW51LmZvcm0nOiAnRm9ybScsCisgICdtZW51LmZvcm0uYmFzaWMtZm9ybSc6ICdCYXNpYyBGb3JtJywKKyAgJ21lbnUuZm9ybS5zdGVwLWZvcm0nOiAnU3RlcCBGb3JtJywKKyAgJ21lbnUuZm9ybS5zdGVwLWZvcm0uaW5mbyc6ICdTdGVwIEZvcm0od3JpdGUgdHJhbnNmZXIgaW5mb3JtYXRpb24pJywKKyAgJ21lbnUuZm9ybS5zdGVwLWZvcm0uY29uZmlybSc6ICdTdGVwIEZvcm0oY29uZmlybSB0cmFuc2ZlciBpbmZvcm1hdGlvbiknLAorICAnbWVudS5mb3JtLnN0ZXAtZm9ybS5yZXN1bHQnOiAnU3RlcCBGb3JtKGZpbmlzaGVkKScsCisgICdtZW51LmZvcm0uYWR2YW5jZWQtZm9ybSc6ICdBZHZhbmNlZCBGb3JtJywKKyAgJ21lbnUubGlzdCc6ICdMaXN0JywKKyAgJ21lbnUubGlzdC50YWJsZS1saXN0JzogJ1NlYXJjaCBUYWJsZScsCisgICdtZW51Lmxpc3QuYmFzaWMtbGlzdCc6ICdCYXNpYyBMaXN0JywKKyAgJ21lbnUubGlzdC5jYXJkLWxpc3QnOiAnQ2FyZCBMaXN0JywKKyAgJ21lbnUubGlzdC5zZWFyY2gtbGlzdCc6ICdTZWFyY2ggTGlzdCcsCisgICdtZW51Lmxpc3Quc2VhcmNoLWxpc3QuYXJ0aWNsZXMnOiAnU2VhcmNoIExpc3QoYXJ0aWNsZXMpJywKKyAgJ21lbnUubGlzdC5zZWFyY2gtbGlzdC5wcm9qZWN0cyc6ICdTZWFyY2ggTGlzdChwcm9qZWN0cyknLAorICAnbWVudS5saXN0LnNlYXJjaC1saXN0LmFwcGxpY2F0aW9ucyc6ICdTZWFyY2ggTGlzdChhcHBsaWNhdGlvbnMpJywKKyAgJ21lbnUucHJvZmlsZSc6ICdQcm9maWxlJywKKyAgJ21lbnUucHJvZmlsZS5iYXNpYyc6ICdCYXNpYyBQcm9maWxlJywKKyAgJ21lbnUucHJvZmlsZS5hZHZhbmNlZCc6ICdBZHZhbmNlZCBQcm9maWxlJywKKyAgJ21lbnUucmVzdWx0JzogJ1Jlc3VsdCcsCisgICdtZW51LnJlc3VsdC5zdWNjZXNzJzogJ1N1Y2Nlc3MnLAorICAnbWVudS5yZXN1bHQuZmFpbCc6ICdGYWlsJywKKyAgJ21lbnUuZXhjZXB0aW9uJzogJ0V4Y2VwdGlvbicsCisgICdtZW51LmV4Y2VwdGlvbi5ub3QtcGVybWlzc2lvbic6ICc0MDMnLAorICAnbWVudS5leGNlcHRpb24ubm90LWZpbmQnOiAnNDA0JywKKyAgJ21lbnUuZXhjZXB0aW9uLnNlcnZlci1lcnJvcic6ICc1MDAnLAorICAnbWVudS5leGNlcHRpb24udHJpZ2dlcic6ICdUcmlnZ2VyJywKKyAgJ21lbnUuYWNjb3VudCc6ICdBY2NvdW50JywKKyAgJ21lbnUuYWNjb3VudC5jZW50ZXInOiAnQWNjb3VudCBDZW50ZXInLAorICAnbWVudS5hY2NvdW50LnNldHRpbmdzJzogJ0FjY291bnQgU2V0dGluZ3MnLAorICAnbWVudS5hY2NvdW50LnRyaWdnZXInOiAnVHJpZ2dlciBFcnJvcicsCisgICdtZW51LmFjY291bnQubG9nb3V0JzogJ0xvZ291dCcsCisgICdtZW51LmVkaXRvcic6ICdHcmFwaGljIEVkaXRvcicsCisgICdtZW51LmVkaXRvci5mbG93JzogJ0Zsb3cgRWRpdG9yJywKKyAgJ21lbnUuZWRpdG9yLm1pbmQnOiAnTWluZCBFZGl0b3InLAorICAnbWVudS5lZGl0b3Iua29uaSc6ICdLb25pIEVkaXRvcicsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvcGFnZXMudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9wYWdlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZmMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvcGFnZXMudHMKQEAgLTAsMCArMSw3MSBAQAorZXhwb3J0IGRlZmF1bHQgeworICAncGFnZXMubGF5b3V0cy51c2VyTGF5b3V0LnRpdGxlJzoKKyAgICAnQW50IERlc2lnbiBpcyB0aGUgbW9zdCBpbmZsdWVudGlhbCB3ZWIgZGVzaWduIHNwZWNpZmljYXRpb24gaW4gWGlodSBkaXN0cmljdCcsCisgICdwYWdlcy5sb2dpbi5hY2NvdW50TG9naW4udGFiJzogJ0FjY291bnQgTG9naW4nLAorICAncGFnZXMubG9naW4uYWNjb3VudExvZ2luLmVycm9yTWVzc2FnZSc6ICdJbmNvcnJlY3QgdXNlcm5hbWUvcGFzc3dvcmQoYWRtaW4vYWRtaW4xMjMpJywKKyAgJ3BhZ2VzLmxvZ2luLmZhaWx1cmUnOiAnTG9naW4gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIScsCisgICdwYWdlcy5sb2dpbi5zdWNjZXNzJzogJ0xvZ2luIHN1Y2Nlc3NmdWwhJywKKyAgJ3BhZ2VzLmxvZ2luLnVzZXJuYW1lLnBsYWNlaG9sZGVyJzogJ1VzZXJuYW1lOiBhZG1pbicsCisgICdwYWdlcy5sb2dpbi51c2VybmFtZS5yZXF1aXJlZCc6ICdQbGVhc2UgaW5wdXQgeW91ciB1c2VybmFtZSEnLAorICAncGFnZXMubG9naW4ucGFzc3dvcmQucGxhY2Vob2xkZXInOiAnUGFzc3dvcmQ6IGFkbWluMTIzJywKKyAgJ3BhZ2VzLmxvZ2luLnBhc3N3b3JkLnJlcXVpcmVkJzogJ1BsZWFzZSBpbnB1dCB5b3VyIHBhc3N3b3JkIScsCisgICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLnRhYic6ICdQaG9uZSBMb2dpbicsCisgICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLmVycm9yTWVzc2FnZSc6ICdWZXJpZmljYXRpb24gQ29kZSBFcnJvcicsCisgICdwYWdlcy5sb2dpbi5waG9uZU51bWJlci5wbGFjZWhvbGRlcic6ICdQaG9uZSBOdW1iZXInLAorICAncGFnZXMubG9naW4ucGhvbmVOdW1iZXIucmVxdWlyZWQnOiAnUGxlYXNlIGlucHV0IHlvdXIgcGhvbmUgbnVtYmVyIScsCisgICdwYWdlcy5sb2dpbi5waG9uZU51bWJlci5pbnZhbGlkJzogJ1Bob25lIG51bWJlciBpcyBpbnZhbGlkIScsCisgICdwYWdlcy5sb2dpbi5jYXB0Y2hhLnBsYWNlaG9sZGVyJzogJ1ZlcmlmaWNhdGlvbiBDb2RlJywKKyAgJ3BhZ2VzLmxvZ2luLmNhcHRjaGEucmVxdWlyZWQnOiAnUGxlYXNlIGlucHV0IHZlcmlmaWNhdGlvbiBjb2RlIScsCisgICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLmdldFZlcmlmaWNhdGlvbkNvZGUnOiAnR2V0IENvZGUnLAorICAncGFnZXMuZ2V0Q2FwdGNoYVNlY29uZFRleHQnOiAnc2VjKHMpJywKKyAgJ3BhZ2VzLmxvZ2luLnJlbWVtYmVyTWUnOiAnUmVtZW1iZXIgbWUnLAorICAncGFnZXMubG9naW4uZm9yZ290UGFzc3dvcmQnOiAnRm9yZ290IFBhc3N3b3JkID8nLAorICAncGFnZXMubG9naW4uc3VibWl0JzogJ0xvZ2luJywKKyAgJ3BhZ2VzLmxvZ2luLmxvZ2luV2l0aCc6ICdMb2dpbiB3aXRoIDonLAorICAncGFnZXMubG9naW4ucmVnaXN0ZXJBY2NvdW50JzogJ1JlZ2lzdGVyIEFjY291bnQnLAorICAncGFnZXMud2VsY29tZS5saW5rJzogJ1dlbGNvbWUnLAorICAncGFnZXMud2VsY29tZS5hbGVydE1lc3NhZ2UnOiAnRmFzdGVyIGFuZCBzdHJvbmdlciBoZWF2eS1kdXR5IGNvbXBvbmVudHMgaGF2ZSBiZWVuIHJlbGVhc2VkLicsCisgICdwYWdlcy5hZG1pbi5zdWJQYWdlLnRpdGxlJzogJ1RoaXMgcGFnZSBjYW4gb25seSBiZSB2aWV3ZWQgYnkgQWRtaW4nLAorICAncGFnZXMuYWRtaW4uc3ViUGFnZS5hbGVydE1lc3NhZ2UnOgorICAgICdVbWkgdWkgaXMgbm93IHJlbGVhc2VkLCB3ZWxjb21lIHRvIHVzZSBucG0gcnVuIHVpIHRvIHN0YXJ0IHRoZSBleHBlcmllbmNlLicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5jcmVhdGVGb3JtLm5ld1J1bGUnOiAnTmV3IFJ1bGUnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlQ29uZmlnJzogJ1J1bGUgY29uZmlndXJhdGlvbicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLmJhc2ljQ29uZmlnJzogJ0Jhc2ljIEluZm9ybWF0aW9uJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZU5hbWUubmFtZUxhYmVsJzogJ1J1bGUgTmFtZScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVOYW1lLm5hbWVSdWxlcyc6ICdQbGVhc2UgZW50ZXIgdGhlIHJ1bGUgbmFtZSEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlRGVzYy5kZXNjTGFiZWwnOiAnUnVsZSBEZXNjcmlwdGlvbicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVEZXNjLmRlc2NQbGFjZWhvbGRlcic6ICdQbGVhc2UgZW50ZXIgYXQgbGVhc3QgZml2ZSBjaGFyYWN0ZXJzJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZURlc2MuZGVzY1J1bGVzJzoKKyAgICAnUGxlYXNlIGVudGVyIGEgcnVsZSBkZXNjcmlwdGlvbiBvZiBhdCBsZWFzdCBmaXZlIGNoYXJhY3RlcnMhJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZVByb3BzLnRpdGxlJzogJ0NvbmZpZ3VyZSBQcm9wZXJ0aWVzJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ub2JqZWN0JzogJ01vbml0b3JpbmcgT2JqZWN0JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZVByb3BzLnRlbXBsYXRlTGFiZWwnOiAnUnVsZSBUZW1wbGF0ZScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVQcm9wcy50eXBlTGFiZWwnOiAnUnVsZSBUeXBlJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uc2NoZWR1bGluZ1BlcmlvZC50aXRsZSc6ICdTZXQgU2NoZWR1bGluZyBQZXJpb2QnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5zY2hlZHVsaW5nUGVyaW9kLnRpbWVMYWJlbCc6ICdTdGFydGluZyBUaW1lJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uc2NoZWR1bGluZ1BlcmlvZC50aW1lUnVsZXMnOiAnUGxlYXNlIGNob29zZSBhIHN0YXJ0IHRpbWUhJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlRGVzYyc6ICdEZXNjcmlwdGlvbicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5ydWxlTmFtZSc6ICdSdWxlIG5hbWUgaXMgcmVxdWlyZWQnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGVDYWxsTm8nOiAnTnVtYmVyIG9mIFNlcnZpY2UgQ2FsbHMnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGVTdGF0dXMnOiAnU3RhdHVzJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMuZGVmYXVsdCc6ICdkZWZhdWx0JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMucnVubmluZyc6ICdydW5uaW5nJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMub25saW5lJzogJ29ubGluZScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5uYW1lU3RhdHVzLmFibm9ybWFsJzogJ2Fibm9ybWFsJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlVXBkYXRlZEF0JzogJ0xhc3QgU2NoZWR1bGVkIGF0JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmV4Y2VwdGlvbic6ICdQbGVhc2UgZW50ZXIgdGhlIHJlYXNvbiBmb3IgdGhlIGV4Y2VwdGlvbiEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24nOiAnT3B0aW9uJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmNvbmZpZyc6ICdDb25maWd1cmF0aW9uJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnN1YnNjcmliZUFsZXJ0JzogJ1N1YnNjcmliZSB0byBhbGVydHMnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGUnOiAnRW5xdWlyeSBGb3JtJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5ldyc6ICdOZXcnLAorICAncGFnZXMuc2VhcmNoVGFibGUuZWRpdCc6ICdFZGl0JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSc6ICdEZWxldGUnLAorICAncGFnZXMuc2VhcmNoVGFibGUuZXhwb3J0JzogJ0V4cG9ydCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4nOiAnY2hvc2VuJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLml0ZW0nOiAnaXRlbScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50b3RhbFNlcnZpY2VDYWxscyc6ICdUb3RhbCBOdW1iZXIgb2YgU2VydmljZSBDYWxscycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50ZW5UaG91c2FuZCc6ICcwMDAwJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoRGVsZXRpb24nOiAnYmF0Y2ggZGVsZXRpb24nLAorICAncGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hBcHByb3ZhbCc6ICdiYXRjaCBhcHByb3ZhbCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvcHdhLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvcHdhLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGQxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9wd2EudHMKQEAgLTAsMCArMSw2IEBACitleHBvcnQgZGVmYXVsdCB7CisgICdhcHAucHdhLm9mZmxpbmUnOiAnWW91IGFyZSBvZmZsaW5lIG5vdycsCisgICdhcHAucHdhLnNlcnZpY2V3b3JrZXIudXBkYXRlZCc6ICdOZXcgY29udGVudCBpcyBhdmFpbGFibGUnLAorICAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQuaGludCc6ICdQbGVhc2UgcHJlc3MgdGhlICJSZWZyZXNoIiBidXR0b24gdG8gcmVsb2FkIGN1cnJlbnQgcGFnZScsCisgICdhcHAucHdhLnNlcnZpY2V3b3JrZXIudXBkYXRlZC5vayc6ICdSZWZyZXNoJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9zZXR0aW5nRHJhd2VyLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvc2V0dGluZ0RyYXdlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQ0OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvZW4tVVMvc2V0dGluZ0RyYXdlci50cwpAQCAtMCwwICsxLDMxIEBACitleHBvcnQgZGVmYXVsdCB7CisgICdhcHAuc2V0dGluZy5wYWdlc3R5bGUnOiAnUGFnZSBzdHlsZSBzZXR0aW5nJywKKyAgJ2FwcC5zZXR0aW5nLnBhZ2VzdHlsZS5kYXJrJzogJ0Rhcmsgc3R5bGUnLAorICAnYXBwLnNldHRpbmcucGFnZXN0eWxlLmxpZ2h0JzogJ0xpZ2h0IHN0eWxlJywKKyAgJ2FwcC5zZXR0aW5nLmNvbnRlbnQtd2lkdGgnOiAnQ29udGVudCBXaWR0aCcsCisgICdhcHAuc2V0dGluZy5jb250ZW50LXdpZHRoLmZpeGVkJzogJ0ZpeGVkJywKKyAgJ2FwcC5zZXR0aW5nLmNvbnRlbnQtd2lkdGguZmx1aWQnOiAnRmx1aWQnLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvcic6ICdUaGVtZSBDb2xvcicsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmR1c3QnOiAnRHVzdCBSZWQnLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci52b2xjYW5vJzogJ1ZvbGNhbm8nLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5zdW5zZXQnOiAnU3Vuc2V0IE9yYW5nZScsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmN5YW4nOiAnQ3lhbicsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmdyZWVuJzogJ1BvbGFyIEdyZWVuJywKKyAgJ2FwcC5zZXR0aW5nLnRoZW1lY29sb3IuZGF5YnJlYWsnOiAnRGF5YnJlYWsgQmx1ZSAoZGVmYXVsdCknLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5nZWVrYmx1ZSc6ICdHZWVrIEdsdWUnLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5wdXJwbGUnOiAnR29sZGVuIFB1cnBsZScsCisgICdhcHAuc2V0dGluZy5uYXZpZ2F0aW9ubW9kZSc6ICdOYXZpZ2F0aW9uIE1vZGUnLAorICAnYXBwLnNldHRpbmcuc2lkZW1lbnUnOiAnU2lkZSBNZW51IExheW91dCcsCisgICdhcHAuc2V0dGluZy50b3BtZW51JzogJ1RvcCBNZW51IExheW91dCcsCisgICdhcHAuc2V0dGluZy5maXhlZGhlYWRlcic6ICdGaXhlZCBIZWFkZXInLAorICAnYXBwLnNldHRpbmcuZml4ZWRzaWRlYmFyJzogJ0ZpeGVkIFNpZGViYXInLAorICAnYXBwLnNldHRpbmcuZml4ZWRzaWRlYmFyLmhpbnQnOiAnV29ya3Mgb24gU2lkZSBNZW51IExheW91dCcsCisgICdhcHAuc2V0dGluZy5oaWRlaGVhZGVyJzogJ0hpZGRlbiBIZWFkZXIgd2hlbiBzY3JvbGxpbmcnLAorICAnYXBwLnNldHRpbmcuaGlkZWhlYWRlci5oaW50JzogJ1dvcmtzIHdoZW4gSGlkZGVuIEhlYWRlciBpcyBlbmFibGVkJywKKyAgJ2FwcC5zZXR0aW5nLm90aGVyc2V0dGluZ3MnOiAnT3RoZXIgU2V0dGluZ3MnLAorICAnYXBwLnNldHRpbmcud2Vha21vZGUnOiAnV2VhayBNb2RlJywKKyAgJ2FwcC5zZXR0aW5nLmNvcHknOiAnQ29weSBTZXR0aW5nJywKKyAgJ2FwcC5zZXR0aW5nLmNvcHlpbmZvJzogJ2NvcHkgc3VjY2Vzc++8jHBsZWFzZSByZXBsYWNlIGRlZmF1bHRTZXR0aW5ncyBpbiBzcmMvbW9kZWxzL3NldHRpbmcuanMnLAorICAnYXBwLnNldHRpbmcucHJvZHVjdGlvbi5oaW50JzoKKyAgICAnU2V0dGluZyBwYW5lbCBzaG93cyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBvbmx5LCBwbGVhc2UgbWFudWFsbHkgbW9kaWZ5JywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9zZXR0aW5ncy50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL2VuLVVTL3NldHRpbmdzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmRkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy9lbi1VUy9zZXR0aW5ncy50cwpAQCAtMCwwICsxLDYwIEBACitleHBvcnQgZGVmYXVsdCB7CisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5iYXNpYyc6ICdCYXNpYyBTZXR0aW5ncycsCisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5zZWN1cml0eSc6ICdTZWN1cml0eSBTZXR0aW5ncycsCisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5iaW5kaW5nJzogJ0FjY291bnQgQmluZGluZycsCisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5ub3RpZmljYXRpb24nOiAnTmV3IE1lc3NhZ2UgTm90aWZpY2F0aW9uJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5hdmF0YXInOiAnQXZhdGFyJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5jaGFuZ2UtYXZhdGFyJzogJ0NoYW5nZSBhdmF0YXInLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmVtYWlsJzogJ0VtYWlsJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5lbWFpbC1tZXNzYWdlJzogJ1BsZWFzZSBpbnB1dCB5b3VyIGVtYWlsIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMubmlja25hbWUnOiAnTmlja25hbWUnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLm5pY2tuYW1lLW1lc3NhZ2UnOiAnUGxlYXNlIGlucHV0IHlvdXIgTmlja25hbWUhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5wcm9maWxlJzogJ1BlcnNvbmFsIHByb2ZpbGUnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnByb2ZpbGUtbWVzc2FnZSc6ICdQbGVhc2UgaW5wdXQgeW91ciBwZXJzb25hbCBwcm9maWxlIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMucHJvZmlsZS1wbGFjZWhvbGRlcic6ICdCcmllZiBpbnRyb2R1Y3Rpb24gdG8geW91cnNlbGYnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmNvdW50cnknOiAnQ291bnRyeS9SZWdpb24nLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmNvdW50cnktbWVzc2FnZSc6ICdQbGVhc2UgaW5wdXQgeW91ciBjb3VudHJ5IScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuZ2VvZ3JhcGhpYyc6ICdQcm92aW5jZSBvciBjaXR5JywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5nZW9ncmFwaGljLW1lc3NhZ2UnOiAnUGxlYXNlIGlucHV0IHlvdXIgZ2VvZ3JhcGhpYyBpbmZvIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuYWRkcmVzcyc6ICdTdHJlZXQgQWRkcmVzcycsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuYWRkcmVzcy1tZXNzYWdlJzogJ1BsZWFzZSBpbnB1dCB5b3VyIGFkZHJlc3MhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5waG9uZSc6ICdQaG9uZSBOdW1iZXInLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnBob25lLW1lc3NhZ2UnOiAnUGxlYXNlIGlucHV0IHlvdXIgcGhvbmUhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy51cGRhdGUnOiAnVXBkYXRlIEluZm9ybWF0aW9uJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5zdHJvbmcnOiAnU3Ryb25nJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tZWRpdW0nOiAnTWVkaXVtJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS53ZWFrJzogJ1dlYWsnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBhc3N3b3JkJzogJ0FjY291bnQgUGFzc3dvcmQnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBhc3N3b3JkLWRlc2NyaXB0aW9uJzogJ0N1cnJlbnQgcGFzc3dvcmQgc3RyZW5ndGgnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBob25lJzogJ1NlY3VyaXR5IFBob25lJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5waG9uZS1kZXNjcmlwdGlvbic6ICdCb3VuZCBwaG9uZScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkucXVlc3Rpb24nOiAnU2VjdXJpdHkgUXVlc3Rpb24nLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnF1ZXN0aW9uLWRlc2NyaXB0aW9uJzoKKyAgICAnVGhlIHNlY3VyaXR5IHF1ZXN0aW9uIGlzIG5vdCBzZXQsIGFuZCB0aGUgc2VjdXJpdHkgcG9saWN5IGNhbiBlZmZlY3RpdmVseSBwcm90ZWN0IHRoZSBhY2NvdW50IHNlY3VyaXR5JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5lbWFpbCc6ICdCYWNrdXAgRW1haWwnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LmVtYWlsLWRlc2NyaXB0aW9uJzogJ0JvdW5kIEVtYWlsJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tZmEnOiAnTUZBIERldmljZScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkubWZhLWRlc2NyaXB0aW9uJzoKKyAgICAnVW5ib3VuZCBNRkEgZGV2aWNlLCBhZnRlciBiaW5kaW5nLCBjYW4gYmUgY29uZmlybWVkIHR3aWNlJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tb2RpZnknOiAnTW9kaWZ5JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5zZXQnOiAnU2V0JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5iaW5kJzogJ0JpbmQnLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcudGFvYmFvJzogJ0JpbmRpbmcgVGFvYmFvJywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLnRhb2Jhby1kZXNjcmlwdGlvbic6ICdDdXJyZW50bHkgdW5ib3VuZCBUYW9iYW8gYWNjb3VudCcsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5hbGlwYXknOiAnQmluZGluZyBBbGlwYXknLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcuYWxpcGF5LWRlc2NyaXB0aW9uJzogJ0N1cnJlbnRseSB1bmJvdW5kIEFsaXBheSBhY2NvdW50JywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLmRpbmdkaW5nJzogJ0JpbmRpbmcgRGluZ1RhbGsnLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcuZGluZ2RpbmctZGVzY3JpcHRpb24nOiAnQ3VycmVudGx5IHVuYm91bmQgRGluZ1RhbGsgYWNjb3VudCcsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5iaW5kJzogJ0JpbmQnLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi5wYXNzd29yZCc6ICdBY2NvdW50IFBhc3N3b3JkJywKKyAgJ2FwcC5zZXR0aW5ncy5ub3RpZmljYXRpb24ucGFzc3dvcmQtZGVzY3JpcHRpb24nOgorICAgICdNZXNzYWdlcyBmcm9tIG90aGVyIHVzZXJzIHdpbGwgYmUgbm90aWZpZWQgaW4gdGhlIGZvcm0gb2YgYSBzdGF0aW9uIGxldHRlcicsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLm1lc3NhZ2VzJzogJ1N5c3RlbSBNZXNzYWdlcycsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLm1lc3NhZ2VzLWRlc2NyaXB0aW9uJzoKKyAgICAnU3lzdGVtIG1lc3NhZ2VzIHdpbGwgYmUgbm90aWZpZWQgaW4gdGhlIGZvcm0gb2YgYSBzdGF0aW9uIGxldHRlcicsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLnRvZG8nOiAnVG8tZG8gTm90aWZpY2F0aW9uJywKKyAgJ2FwcC5zZXR0aW5ncy5ub3RpZmljYXRpb24udG9kby1kZXNjcmlwdGlvbic6CisgICAgJ1RoZSB0by1kbyBsaXN0IHdpbGwgYmUgbm90aWZpZWQgaW4gdGhlIGZvcm0gb2YgYSBsZXR0ZXIgZnJvbSB0aGUgc3RhdGlvbicsCisgICdhcHAuc2V0dGluZ3Mub3Blbic6ICdPcGVuJywKKyAgJ2FwcC5zZXR0aW5ncy5jbG9zZSc6ICdDbG9zZScsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04udHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmUyZWFjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04udHMKQEAgLTAsMCArMSw1NyBAQAoraW1wb3J0IGFwcCBmcm9tICcuL3poLUNOL2FwcCc7CitpbXBvcnQgY29tcG9uZW50IGZyb20gJy4vemgtQ04vY29tcG9uZW50JzsKK2ltcG9ydCBnbG9iYWxIZWFkZXIgZnJvbSAnLi96aC1DTi9nbG9iYWxIZWFkZXInOworaW1wb3J0IHN5c21lbnUgZnJvbSAnLi96aC1DTi9tZW51JzsKK2ltcG9ydCBwYWdlcyBmcm9tICcuL3poLUNOL3BhZ2VzJzsKK2ltcG9ydCBwd2EgZnJvbSAnLi96aC1DTi9wd2EnOworaW1wb3J0IHNldHRpbmdEcmF3ZXIgZnJvbSAnLi96aC1DTi9zZXR0aW5nRHJhd2VyJzsKK2ltcG9ydCBzZXR0aW5ncyBmcm9tICcuL3poLUNOL3NldHRpbmdzJzsKK2ltcG9ydCB1c2VyIGZyb20gJy4vemgtQ04vc3lzdGVtL3VzZXInOworaW1wb3J0IG1lbnUgZnJvbSAnLi96aC1DTi9zeXN0ZW0vbWVudSc7CitpbXBvcnQgZGljdCBmcm9tICcuL3poLUNOL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCBkaWN0RGF0YSBmcm9tICcuL3poLUNOL3N5c3RlbS9kaWN0LWRhdGEnOworaW1wb3J0IHJvbGUgZnJvbSAnLi96aC1DTi9zeXN0ZW0vcm9sZSc7CitpbXBvcnQgZGVwdCBmcm9tICcuL3poLUNOL3N5c3RlbS9kZXB0JzsKK2ltcG9ydCBwb3N0IGZyb20gJy4vemgtQ04vc3lzdGVtL3Bvc3QnOworaW1wb3J0IGNvbmZpZyBmcm9tICcuL3poLUNOL3N5c3RlbS9jb25maWcnOworaW1wb3J0IG5vdGljZSBmcm9tICcuL3poLUNOL3N5c3RlbS9ub3RpY2UnOworaW1wb3J0IG9wZXJsb2cgZnJvbSAnLi96aC1DTi9tb25pdG9yL29wZXJsb2cnOworaW1wb3J0IGxvZ2luaW5mb3IgZnJvbSAnLi96aC1DTi9tb25pdG9yL2xvZ2luaW5mb3InOworaW1wb3J0IG9ubGluZVVzZXIgZnJvbSAnLi96aC1DTi9tb25pdG9yL29ubGluZVVzZXInOworaW1wb3J0IGpvYiBmcm9tICcuL3poLUNOL21vbml0b3Ivam9iJzsKK2ltcG9ydCBqb2Jsb2cgZnJvbSAnLi96aC1DTi9tb25pdG9yL2pvYi1sb2cnOworaW1wb3J0IHNlcnZlciBmcm9tICcuL3poLUNOL21vbml0b3Ivc2VydmVyJzsKKworZXhwb3J0IGRlZmF1bHQgeworICAnbmF2QmFyLmxhbmcnOiAn6K+t6KiAJywKKyAgJ2xheW91dC51c2VyLmxpbmsuaGVscCc6ICfluK7liqknLAorICAnbGF5b3V0LnVzZXIubGluay5wcml2YWN5JzogJ+makOengScsCisgICdsYXlvdXQudXNlci5saW5rLnRlcm1zJzogJ+adoeasvicsCisgICdhcHAuY29weXJpZ2h0LnByb2R1Y2VkJzogJ+iaguiagembhuWbouS9k+mqjOaKgOacr+mDqOWHuuWTgScsCisgICdhcHAucHJldmlldy5kb3duLmJsb2NrJzogJ+S4i+i9veatpOmhtemdouWIsOacrOWcsOmhueebricsCisgICdhcHAud2VsY29tZS5saW5rLmZldGNoLWJsb2Nrcyc6ICfojrflj5blhajpg6jljLrlnZcnLAorICAnYXBwLndlbGNvbWUubGluay5ibG9jay1saXN0JzogJ+WfuuS6jiBibG9jayDlvIDlj5HvvIzlv6vpgJ/mnoTlu7rmoIflh4bpobXpnaInLAorICAuLi5hcHAsCisgIC4uLnBhZ2VzLAorICAuLi5nbG9iYWxIZWFkZXIsCisgIC4uLnN5c21lbnUsCisgIC4uLnNldHRpbmdEcmF3ZXIsCisgIC4uLnNldHRpbmdzLAorICAuLi5wd2EsCisgIC4uLmNvbXBvbmVudCwKKyAgLi4udXNlciwKKyAgLi4ubWVudSwKKyAgLi4uZGljdCwKKyAgLi4uZGljdERhdGEsCisgIC4uLnJvbGUsCisgIC4uLmRlcHQsCisgIC4uLnBvc3QsCisgIC4uLmNvbmZpZywKKyAgLi4ubm90aWNlLAorICAuLi5vcGVybG9nLAorICAuLi5sb2dpbmluZm9yLAorICAuLi5vbmxpbmVVc2VyLAorICAuLi5qb2IsCisgIC4uLmpvYmxvZywKKyAgLi4uc2VydmVyLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL2FwcC50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL2FwcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU2OGUyCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vYXBwLnRzCkBAIC0wLDAgKzEsMjMgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5zZWFyY2gucGxhY2Vob2xkZXInOiAn5Zyo5q2k5pCc57Si5Zu+5qCH77yM54K55Ye75Zu+5qCH5Y+v5aSN5Yi25Luj56CBJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5vdXRsaW5lZCc6ICfnur/moYbpo47moLwnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLmZpbGxlZCc6ICflrp7lupXpo47moLwnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnR3by10b25lJzogJ+WPjOiJsumjjuagvCcsCisgICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkuZGlyZWN0aW9uJzogJ+aWueWQkeaAp+WbvuaghycsCisgICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24uY2F0ZWdvcnkuc3VnZ2VzdGlvbic6ICfmj5DnpLrlu7rorq7mgKflm77moIcnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLmNhdGVnb3J5LmVkaXRvcic6ICfnvJbovpHnsbvlm77moIcnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLmNhdGVnb3J5LmRhdGEnOiAn5pWw5o2u57G75Zu+5qCHJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5jYXRlZ29yeS5vdGhlcic6ICfnvZHnq5npgJrnlKjlm77moIcnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLmNhdGVnb3J5LmxvZ28nOiAn5ZOB54mM5ZKM5qCH6K+GJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIuaW50cm8nOiAnQUkg5oiq5Zu+5pCc57Si5LiK57q/5LqG77yM5b+r5p2l5L2T6aqM5ZCn77yB8J+OiScsCisgICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnRpdGxlJzogJ+S4iuS8oOWbvueJh+aQnOe0ouWbvuaghycsCisgICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnVwbG9hZC10ZXh0JzogJ+eCueWHuy/mi5bmi70v57KY6LS05LiK5Lyg5Zu+54mHJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIudXBsb2FkLWhpbnQnOgorICAgICfmiJHku6zkvJrpgJrov4fkuIrkvKDnmoTlm77niYfov5vooYzljLnphY3vvIzlvpfliLDmnIDnm7jkvLznmoTlm77moIcnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci5zZXJ2ZXItZXJyb3InOiAn6K+G5Yir5pyN5Yqh5pqC5LiN5Y+v55SoJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIubWF0Y2hpbmcnOiAn5Yy56YWN5LitLi4uJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIubW9kZWxsb2FkaW5nJzogJ+elnue7j+e9kee7nOaooeWei+WKoOi9veS4rS4uLicsCisgICdhcHAuZG9jcy5jb21wb25lbnRzLmljb24ucGljLXNlYXJjaGVyLnJlc3VsdC10aXAnOiAn5Li65oKo5Yy56YWN5Yiw5Lul5LiL5Zu+5qCH77yaJywKKyAgJ2FwcC5kb2NzLmNvbXBvbmVudHMuaWNvbi5waWMtc2VhcmNoZXIudGgtaWNvbic6ICflm77moIcnLAorICAnYXBwLmRvY3MuY29tcG9uZW50cy5pY29uLnBpYy1zZWFyY2hlci50aC1zY29yZSc6ICfljLnphY3luqYnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL2NvbXBvbmVudC50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL2NvbXBvbmVudC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjFmZWFkCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vY29tcG9uZW50LnRzCkBAIC0wLDAgKzEsNSBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnY29tcG9uZW50LnRhZ1NlbGVjdC5leHBhbmQnOiAn5bGV5byAJywKKyAgJ2NvbXBvbmVudC50YWdTZWxlY3QuY29sbGFwc2UnOiAn5pS26LW3JywKKyAgJ2NvbXBvbmVudC50YWdTZWxlY3QuYWxsJzogJ+WFqOmDqCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vZ2xvYmFsSGVhZGVyLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vZ2xvYmFsSGVhZGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDY2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9nbG9iYWxIZWFkZXIudHMKQEAgLTAsMCArMSwxNyBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5zZWFyY2gnOiAn56uZ5YaF5pCc57SiJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuc2VhcmNoLmV4YW1wbGUxJzogJ+aQnOe0ouaPkOekuuS4gCcsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLnNlYXJjaC5leGFtcGxlMic6ICfmkJzntKLmj5DnpLrkuownLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5zZWFyY2guZXhhbXBsZTMnOiAn5pCc57Si5o+Q56S65LiJJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuaGVscCc6ICfkvb/nlKjmlofmoaMnLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5ub3RpZmljYXRpb24nOiAn6YCa55+lJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubm90aWZpY2F0aW9uLmVtcHR5JzogJ+S9oOW3suafpeeci+aJgOaciemAmuefpScsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLm1lc3NhZ2UnOiAn5raI5oGvJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubWVzc2FnZS5lbXB0eSc6ICfmgqjlt7Lor7vlrozmiYDmnInmtojmga8nLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5ldmVudCc6ICflvoXlip4nLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5ldmVudC5lbXB0eSc6ICfkvaDlt7LlrozmiJDmiYDmnInlvoXlip4nLAorICAnY29tcG9uZW50Lm5vdGljZUljb24uY2xlYXInOiAn5riF56m6JywKKyAgJ2NvbXBvbmVudC5ub3RpY2VJY29uLmNsZWFyZWQnOiAn5riF56m65LqGJywKKyAgJ2NvbXBvbmVudC5ub3RpY2VJY29uLmVtcHR5JzogJ+aaguaXoOaVsOaNricsCisgICdjb21wb25lbnQubm90aWNlSWNvbi52aWV3LW1vcmUnOiAn5p+l55yL5pu05aSaJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9tZW51LnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbWVudS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWNiNzBhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbWVudS50cwpAQCAtMCwwICsxLDUyIEBACitleHBvcnQgZGVmYXVsdCB7CisgICdtZW51LndlbGNvbWUnOiAn5qyi6L+OJywKKyAgJ21lbnUubW9yZS1ibG9ja3MnOiAn5pu05aSa5Yy65Z2XJywKKyAgJ21lbnUuaG9tZSc6ICfpppbpobUnLAorICAnbWVudS5hZG1pbic6ICfnrqHnkIbpobUnLAorICAnbWVudS5hZG1pbi5zdWItcGFnZSc6ICfkuoznuqfnrqHnkIbpobUnLAorICAnbWVudS5sb2dpbic6ICfnmbvlvZUnLAorICAnbWVudS5yZWdpc3Rlcic6ICfms6jlhownLAorICAnbWVudS5yZWdpc3Rlci1yZXN1bHQnOiAn5rOo5YaM57uT5p6cJywKKyAgJ21lbnUuZGFzaGJvYXJkJzogJ0Rhc2hib2FyZCcsCisgICdtZW51LmRhc2hib2FyZC5hbmFseXNpcyc6ICfliIbmnpDpobUnLAorICAnbWVudS5kYXNoYm9hcmQubW9uaXRvcic6ICfnm5HmjqfpobUnLAorICAnbWVudS5kYXNoYm9hcmQud29ya3BsYWNlJzogJ+W3peS9nOWPsCcsCisgICdtZW51LmV4Y2VwdGlvbi40MDMnOiAnNDAzJywKKyAgJ21lbnUuZXhjZXB0aW9uLjQwNCc6ICc0MDQnLAorICAnbWVudS5leGNlcHRpb24uNTAwJzogJzUwMCcsCisgICdtZW51LmZvcm0nOiAn6KGo5Y2V6aG1JywKKyAgJ21lbnUuZm9ybS5iYXNpYy1mb3JtJzogJ+WfuuehgOihqOWNlScsCisgICdtZW51LmZvcm0uc3RlcC1mb3JtJzogJ+WIhuatpeihqOWNlScsCisgICdtZW51LmZvcm0uc3RlcC1mb3JtLmluZm8nOiAn5YiG5q2l6KGo5Y2V77yI5aGr5YaZ6L2s6LSm5L+h5oGv77yJJywKKyAgJ21lbnUuZm9ybS5zdGVwLWZvcm0uY29uZmlybSc6ICfliIbmraXooajljZXvvIjnoa7orqTovazotKbkv6Hmga/vvIknLAorICAnbWVudS5mb3JtLnN0ZXAtZm9ybS5yZXN1bHQnOiAn5YiG5q2l6KGo5Y2V77yI5a6M5oiQ77yJJywKKyAgJ21lbnUuZm9ybS5hZHZhbmNlZC1mb3JtJzogJ+mrmOe6p+ihqOWNlScsCisgICdtZW51Lmxpc3QnOiAn5YiX6KGo6aG1JywKKyAgJ21lbnUubGlzdC50YWJsZS1saXN0JzogJ+afpeivouihqOagvCcsCisgICdtZW51Lmxpc3QuYmFzaWMtbGlzdCc6ICfmoIflh4bliJfooagnLAorICAnbWVudS5saXN0LmNhcmQtbGlzdCc6ICfljaHniYfliJfooagnLAorICAnbWVudS5saXN0LnNlYXJjaC1saXN0JzogJ+aQnOe0ouWIl+ihqCcsCisgICdtZW51Lmxpc3Quc2VhcmNoLWxpc3QuYXJ0aWNsZXMnOiAn5pCc57Si5YiX6KGo77yI5paH56ug77yJJywKKyAgJ21lbnUubGlzdC5zZWFyY2gtbGlzdC5wcm9qZWN0cyc6ICfmkJzntKLliJfooajvvIjpobnnm67vvIknLAorICAnbWVudS5saXN0LnNlYXJjaC1saXN0LmFwcGxpY2F0aW9ucyc6ICfmkJzntKLliJfooajvvIjlupTnlKjvvIknLAorICAnbWVudS5wcm9maWxlJzogJ+ivpuaDhemhtScsCisgICdtZW51LnByb2ZpbGUuYmFzaWMnOiAn5Z+656GA6K+m5oOF6aG1JywKKyAgJ21lbnUucHJvZmlsZS5hZHZhbmNlZCc6ICfpq5jnuqfor6bmg4XpobUnLAorICAnbWVudS5yZXN1bHQnOiAn57uT5p6c6aG1JywKKyAgJ21lbnUucmVzdWx0LnN1Y2Nlc3MnOiAn5oiQ5Yqf6aG1JywKKyAgJ21lbnUucmVzdWx0LmZhaWwnOiAn5aSx6LSl6aG1JywKKyAgJ21lbnUuZXhjZXB0aW9uJzogJ+W8guW4uOmhtScsCisgICdtZW51LmV4Y2VwdGlvbi5ub3QtcGVybWlzc2lvbic6ICc0MDMnLAorICAnbWVudS5leGNlcHRpb24ubm90LWZpbmQnOiAnNDA0JywKKyAgJ21lbnUuZXhjZXB0aW9uLnNlcnZlci1lcnJvcic6ICc1MDAnLAorICAnbWVudS5leGNlcHRpb24udHJpZ2dlcic6ICfop6blj5HplJnor68nLAorICAnbWVudS5hY2NvdW50JzogJ+S4quS6uumhtScsCisgICdtZW51LmFjY291bnQuY2VudGVyJzogJ+S4quS6uuS4reW/gycsCisgICdtZW51LmFjY291bnQuc2V0dGluZ3MnOiAn5Liq5Lq66K6+572uJywKKyAgJ21lbnUuYWNjb3VudC50cmlnZ2VyJzogJ+inpuWPkeaKpemUmScsCisgICdtZW51LmFjY291bnQubG9nb3V0JzogJ+mAgOWHuueZu+W9lScsCisgICdtZW51LmVkaXRvcic6ICflm77lvaLnvJbovpHlmagnLAorICAnbWVudS5lZGl0b3IuZmxvdyc6ICfmtYHnqIvnvJbovpHlmagnLAorICAnbWVudS5lZGl0b3IubWluZCc6ICfohJHlm77nvJbovpHlmagnLAorICAnbWVudS5lZGl0b3Iua29uaSc6ICfmi5PmiZHnvJbovpHlmagnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivam9iLWxvZy50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivam9iLWxvZy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNmOGQwCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9qb2ItbG9nLnRzCkBAIC0wLDAgKzEsMTggQEAKKy8qKgorICog5a6a5pe25Lu75Yqh6LCD5bqm5pel5b+XCisgKiAKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXIKKyAqIEBkYXRlIDIwMjMtMDItMDcKKyAqLworCitleHBvcnQgZGVmYXVsdCB7CisJJ21vbml0b3Iuam9iLmxvZy50aXRsZSc6ICflrprml7bku7vliqHosIPluqbml6Xlv5cnLAorCSdtb25pdG9yLmpvYi5sb2cuam9iX2xvZ19pZCc6ICfku7vliqHml6Xlv5fnvJblj7cnLAorCSdtb25pdG9yLmpvYi5sb2cuam9iX25hbWUnOiAn5Lu75Yqh5ZCN56ewJywKKwknbW9uaXRvci5qb2IubG9nLmpvYl9ncm91cCc6ICfku7vliqHnu4TlkI0nLAorCSdtb25pdG9yLmpvYi5sb2cuaW52b2tlX3RhcmdldCc6ICfosIPnlKjmlrnms5UnLAorCSdtb25pdG9yLmpvYi5sb2cuam9iX21lc3NhZ2UnOiAn5pel5b+X5L+h5oGvJywKKwknbW9uaXRvci5qb2IubG9nLnN0YXR1cyc6ICfmiafooYznirbmgIEnLAorCSdtb25pdG9yLmpvYi5sb2cuZXhjZXB0aW9uX2luZm8nOiAn5byC5bi45L+h5oGvJywKKwknbW9uaXRvci5qb2IubG9nLmNyZWF0ZV90aW1lJzogJ+WIm+W7uuaXtumXtCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9qb2IudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9tb25pdG9yL2pvYi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBkNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9qb2IudHMKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiDlrprml7bku7vliqHosIPluqYKKyAqIAorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZSAyMDIzLTAyLTA3CisgKi8KKworZXhwb3J0IGRlZmF1bHQgeworCSdtb25pdG9yLmpvYi50aXRsZSc6ICflrprml7bku7vliqHosIPluqYnLAorCSdtb25pdG9yLmpvYi5qb2JfaWQnOiAn5Lu75Yqh57yW5Y+3JywKKwknbW9uaXRvci5qb2Iuam9iX25hbWUnOiAn5Lu75Yqh5ZCN56ewJywKKwknbW9uaXRvci5qb2Iuam9iX2dyb3VwJzogJ+S7u+WKoee7hOWQjScsCisJJ21vbml0b3Iuam9iLmludm9rZV90YXJnZXQnOiAn6LCD55So5pa55rOVJywKKwknbW9uaXRvci5qb2IuY3Jvbl9leHByZXNzaW9uJzogJ2Nyb27miafooYzooajovr7lvI8nLAorCSdtb25pdG9yLmpvYi5taXNmaXJlX3BvbGljeSc6ICfmiafooYznrZbnlaUnLAorCSdtb25pdG9yLmpvYi5jb25jdXJyZW50JzogJ+aYr+WQpuW5tuWPkeaJp+ihjCcsCisJJ21vbml0b3Iuam9iLm5leHRfdmFsaWRfdGltZSc6ICfkuIvmrKHmiafooYzml7bpl7QnLAorCSdtb25pdG9yLmpvYi5zdGF0dXMnOiAn54q25oCBJywKKwknbW9uaXRvci5qb2IuY3JlYXRlX2J5JzogJ+WIm+W7uuiAhScsCisJJ21vbml0b3Iuam9iLmNyZWF0ZV90aW1lJzogJ+WIm+W7uuaXtumXtCcsCisJJ21vbml0b3Iuam9iLnVwZGF0ZV9ieSc6ICfmm7TmlrDogIUnLAorCSdtb25pdG9yLmpvYi51cGRhdGVfdGltZSc6ICfmm7TmlrDml7bpl7QnLAorCSdtb25pdG9yLmpvYi5yZW1hcmsnOiAn5aSH5rOo5L+h5oGvJywKKwknbW9uaXRvci5qb2IuZGV0YWlsJzogJ+S7u+WKoeivpuaDhScsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9sb2dpbmluZm9yLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9sb2dpbmluZm9yLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWE2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9tb25pdG9yL2xvZ2luaW5mb3IudHMKQEAgLTAsMCArMSwxMyBAQAorZXhwb3J0IGRlZmF1bHQgeworCSdtb25pdG9yLmxvZ2luaW5mb3IudGl0bGUnOiAn57O757uf6K6/6Zeu6K6w5b2VJywKKwknbW9uaXRvci5sb2dpbmluZm9yLmluZm9faWQnOiAn6K6/6Zeu57yW5Y+3JywKKwknbW9uaXRvci5sb2dpbmluZm9yLnVzZXJfbmFtZSc6ICfnlKjmiLfotKblj7cnLAorCSdtb25pdG9yLmxvZ2luaW5mb3IuaXBhZGRyJzogJ+eZu+W9lUlQ5Zyw5Z2AJywKKwknbW9uaXRvci5sb2dpbmluZm9yLmxvZ2luX2xvY2F0aW9uJzogJ+eZu+W9leWcsOeCuScsCisJJ21vbml0b3IubG9naW5pbmZvci5icm93c2VyJzogJ+a1j+iniOWZqOexu+WeiycsCisJJ21vbml0b3IubG9naW5pbmZvci5vcyc6ICfmk43kvZzns7vnu58nLAorCSdtb25pdG9yLmxvZ2luaW5mb3Iuc3RhdHVzJzogJ+eZu+W9leeKtuaAgScsCisJJ21vbml0b3IubG9naW5pbmZvci5tc2cnOiAn5o+Q56S65raI5oGvJywKKwknbW9uaXRvci5sb2dpbmluZm9yLmxvZ2luX3RpbWUnOiAn6K6/6Zeu5pe26Ze0JywKKwknbW9uaXRvci5sb2dpbmluZm9yLnVubG9jayc6ICfop6PplIEnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivb25saW5lVXNlci50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivb25saW5lVXNlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjkzY2RlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9vbmxpbmVVc2VyLnRzCkBAIC0wLDAgKzEsMjAgQEAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIxLzA5LzE2CisgKiAKKyAqICovCisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ21vbml0b3Iub25saW5lLnVzZXIuaWQnOiAn57yW5Y+3JywKKyAgJ21vbml0b3Iub25saW5lLnVzZXIudG9rZW5faWQnOiAn5Lya6K+d57yW5Y+3JywKKyAgJ21vbml0b3Iub25saW5lLnVzZXIudXNlcl9uYW1lJzogJ+S8muivnee8luWPtycsCisgICdtb25pdG9yLm9ubGluZS51c2VyLmlwYWRkcic6ICfnmbvlvZVJUOWcsOWdgCcsCisgICdtb25pdG9yLm9ubGluZS51c2VyLmxvZ2luX2xvY2F0aW9uJzogJ+eZu+W9leWcsOeCuScsCisgICdtb25pdG9yLm9ubGluZS51c2VyLmJyb3dzZXInOiAn5rWP6KeI5Zmo57G75Z6LJywKKyAgJ21vbml0b3Iub25saW5lLnVzZXIub3MnOiAn5pON5L2c57O757ufJywKKyAgJ21vbml0b3Iub25saW5lLnVzZXIuZGVwdF9uYW1lJzogJ+mDqOmXqCcsCisgICdtb25pdG9yLm9ubGluZS51c2VyLmxvZ2luX3RpbWUnOiAn6K6/6Zeu5pe26Ze0JywKKyAgJ21vbml0b3Iub25saW5lLnVzZXIuZm9yY2VfbG9nb3V0JzogJ+W8uuWItumAgOWHuicsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9vcGVybG9nLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9vcGVybG9nLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTgyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9tb25pdG9yL29wZXJsb2cudHMKQEAgLTAsMCArMSwxOSBAQAorZXhwb3J0IGRlZmF1bHQgeworCSdtb25pdG9yLm9wZXJsb2cudGl0bGUnOiAn5pON5L2c5pel5b+X6K6w5b2VJywKKwknbW9uaXRvci5vcGVybG9nLm9wZXJfaWQnOiAn5pel5b+X5Li76ZSuJywKKwknbW9uaXRvci5vcGVybG9nLmJ1c2luZXNzX3R5cGUnOiAn5Lia5Yqh57G75Z6LJywKKwknbW9uaXRvci5vcGVybG9nLm1ldGhvZCc6ICfmlrnms5XlkI3np7AnLAorCSdtb25pdG9yLm9wZXJsb2cucmVxdWVzdF9tZXRob2QnOiAn6K+35rGC5pa55byPJywKKwknbW9uaXRvci5vcGVybG9nLm9wZXJhdG9yX3R5cGUnOiAn5pON5L2c57G75YirJywKKwknbW9uaXRvci5vcGVybG9nLm9wZXJfbmFtZSc6ICfmk43kvZzkurrlkZgnLAorCSdtb25pdG9yLm9wZXJsb2cuZGVwdF9uYW1lJzogJ+mDqOmXqOWQjeensCcsCisJJ21vbml0b3Iub3BlcmxvZy5vcGVyX3VybCc6ICfor7fmsYJVUkwnLAorCSdtb25pdG9yLm9wZXJsb2cub3Blcl9pcCc6ICfkuLvmnLrlnLDlnYAnLAorCSdtb25pdG9yLm9wZXJsb2cub3Blcl9sb2NhdGlvbic6ICfmk43kvZzlnLDngrknLAorCSdtb25pdG9yLm9wZXJsb2cub3Blcl9wYXJhbSc6ICfor7fmsYLlj4LmlbAnLAorCSdtb25pdG9yLm9wZXJsb2cuanNvbl9yZXN1bHQnOiAn6L+U5Zue5Y+C5pWwJywKKwknbW9uaXRvci5vcGVybG9nLnN0YXR1cyc6ICfmk43kvZznirbmgIEnLAorCSdtb25pdG9yLm9wZXJsb2cuZXJyb3JfbXNnJzogJ+mUmeivr+a2iOaBrycsCisJJ21vbml0b3Iub3BlcmxvZy5vcGVyX3RpbWUnOiAn5pON5L2c5pe26Ze0JywKKwknbW9uaXRvci5vcGVybG9nLm1vZHVsZSc6ICfmk43kvZzmqKHlnZcnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivc2VydmVyLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vbW9uaXRvci9zZXJ2ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4N2EyMgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL21vbml0b3Ivc2VydmVyLnRzCkBAIC0wLDAgKzEsMjcgQEAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIxLzA5LzE2CisgKiAKKyAqICovCisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ21vbml0b3Iuc2VydmVyLmNwdS5jcHVOdW0nOiAn5qC45b+D5pWwJywKKyAgJ21vbml0b3Iuc2VydmVyLmNwdS50b3RhbCc6ICfmgLvkvb/nlKjnjocnLAorICAnbW9uaXRvci5zZXJ2ZXIuY3B1LnN5cyc6ICfns7vnu5/kvb/nlKjnjocnLAorICAnbW9uaXRvci5zZXJ2ZXIuY3B1LnVzZWQnOiAn55So5oi35L2/55So546HJywKKyAgJ21vbml0b3Iuc2VydmVyLmNwdS53YWl0JzogJ0lP562J5b6FJywKKyAgJ21vbml0b3Iuc2VydmVyLmNwdS5mcmVlJzogJ+W9k+WJjeepuumXsueOhycsCisgICdtb25pdG9yLnNlcnZlci5tZW0udG90YWwnOiAn5oC75YaF5a2YJywKKyAgJ21vbml0b3Iuc2VydmVyLm1lbS51c2VkJzogJ+W3sueUqOWGheWtmCcsCisgICdtb25pdG9yLnNlcnZlci5tZW0uZnJlZSc6ICfliankvZnlhoXlrZgnLAorICAnbW9uaXRvci5zZXJ2ZXIubWVtLnVzYWdlJzogJ+S9v+eUqOeOhycsCisgICdtb25pdG9yLnNlcnZlci5kaXNrLmRpck5hbWUnOiAn55uY56ym6Lev5b6EJywKKyAgJ21vbml0b3Iuc2VydmVyLmRpc2suc3lzVHlwZU5hbWUnOiAn5paH5Lu257O757ufJywKKyAgJ21vbml0b3Iuc2VydmVyLmRpc2sudHlwZU5hbWUnOiAn55uY56ym57G75Z6LJywKKyAgJ21vbml0b3Iuc2VydmVyLmRpc2sudG90YWwnOiAn5oC75aSn5bCPJywKKyAgJ21vbml0b3Iuc2VydmVyLmRpc2suZnJlZSc6ICflj6/nlKjlpKflsI8nLAorICAnbW9uaXRvci5zZXJ2ZXIuZGlzay51c2VkJzogJ+W3sueUqOWkp+WwjycsCisgICdtb25pdG9yLnNlcnZlci5kaXNrLnVzYWdlJzogJ+S9v+eUqOeOhycsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vcGFnZXMudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9wYWdlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdhYmZiCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vcGFnZXMudHMKQEAgLTAsMCArMSw3MSBAQAorZXhwb3J0IGRlZmF1bHQgeworICAncGFnZXMubGF5b3V0cy51c2VyTGF5b3V0LnRpdGxlJzogJ0FudCBEZXNpZ24g5piv6KW/5rmW5Yy65pyA5YW35b2x5ZON5Yqb55qEIFdlYiDorr7orqHop4TojIMnLAorICAncGFnZXMubG9naW4uYWNjb3VudExvZ2luLnRhYic6ICfotKbmiLflr4bnoIHnmbvlvZUnLAorICAncGFnZXMubG9naW4uYWNjb3VudExvZ2luLmVycm9yTWVzc2FnZSc6ICfplJnor6/nmoTnlKjmiLflkI3lkozlr4bnoIEoYWRtaW4vYWRtaW4xMjMpJywKKyAgJ3BhZ2VzLmxvZ2luLmZhaWx1cmUnOiAn55m75b2V5aSx6LSl77yM6K+36YeN6K+V77yBJywKKyAgJ3BhZ2VzLmxvZ2luLnN1Y2Nlc3MnOiAn55m75b2V5oiQ5Yqf77yBJywKKyAgJ3BhZ2VzLmxvZ2luLnVzZXJuYW1lLnBsYWNlaG9sZGVyJzogJ+eUqOaIt+WQjTogYWRtaW4nLAorICAncGFnZXMubG9naW4udXNlcm5hbWUucmVxdWlyZWQnOiAn55So5oi35ZCN5piv5b+F5aGr6aG577yBJywKKyAgJ3BhZ2VzLmxvZ2luLnBhc3N3b3JkLnBsYWNlaG9sZGVyJzogJ+WvhueggTogYWRtaW4xMjMnLAorICAncGFnZXMubG9naW4ucGFzc3dvcmQucmVxdWlyZWQnOiAn5a+G56CB5piv5b+F5aGr6aG577yBJywKKyAgJ3BhZ2VzLmxvZ2luLnBob25lTG9naW4udGFiJzogJ+aJi+acuuWPt+eZu+W9lScsCisgICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLmVycm9yTWVzc2FnZSc6ICfpqozor4HnoIHplJnor68nLAorICAncGFnZXMubG9naW4ucGhvbmVOdW1iZXIucGxhY2Vob2xkZXInOiAn6K+36L6T5YWl5omL5py65Y+377yBJywKKyAgJ3BhZ2VzLmxvZ2luLnBob25lTnVtYmVyLnJlcXVpcmVkJzogJ+aJi+acuuWPt+aYr+W/heWhq+mhue+8gScsCisgICdwYWdlcy5sb2dpbi5waG9uZU51bWJlci5pbnZhbGlkJzogJ+S4jeWQiOazleeahOaJi+acuuWPt++8gScsCisgICdwYWdlcy5sb2dpbi5jYXB0Y2hhLnBsYWNlaG9sZGVyJzogJ+ivt+i+k+WFpemqjOivgeegge+8gScsCisgICdwYWdlcy5sb2dpbi5jYXB0Y2hhLnJlcXVpcmVkJzogJ+mqjOivgeeggeaYr+W/heWhq+mhue+8gScsCisgICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLmdldFZlcmlmaWNhdGlvbkNvZGUnOiAn6I635Y+W6aqM6K+B56CBJywKKyAgJ3BhZ2VzLmdldENhcHRjaGFTZWNvbmRUZXh0JzogJ+enkuWQjumHjeaWsOiOt+WPlicsCisgICdwYWdlcy5sb2dpbi5yZW1lbWJlck1lJzogJ+iHquWKqOeZu+W9lScsCisgICdwYWdlcy5sb2dpbi5mb3Jnb3RQYXNzd29yZCc6ICflv5jorrDlr4bnoIEgPycsCisgICdwYWdlcy5sb2dpbi5zdWJtaXQnOiAn55m75b2VJywKKyAgJ3BhZ2VzLmxvZ2luLmxvZ2luV2l0aCc6ICflhbbku5bnmbvlvZXmlrnlvI8gOicsCisgICdwYWdlcy5sb2dpbi5yZWdpc3RlckFjY291bnQnOiAn5rOo5YaM6LSm5oi3JywKKyAgJ3BhZ2VzLmdvYmFjayc6ICfov5Tlm54nLAorICAncGFnZXMud2VsY29tZS5saW5rJzogJ+asoui/juS9v+eUqCcsCisgICdwYWdlcy53ZWxjb21lLmFsZXJ0TWVzc2FnZSc6ICfmm7Tlv6vmm7TlvLrnmoTph43lnovnu4Tku7bvvIzlt7Lnu4/lj5HluIPjgIInLAorICAncGFnZXMuYWRtaW4uc3ViUGFnZS50aXRsZSc6ICcg6L+Z5Liq6aG16Z2i5Y+q5pyJIGFkbWluIOadg+mZkOaJjeiDveafpeeciycsCisgICdwYWdlcy5hZG1pbi5zdWJQYWdlLmFsZXJ0TWVzc2FnZSc6ICd1bWkgdWkg546w5bey5Y+R5biD77yM5qyi6L+O5L2/55SoIG5wbSBydW4gdWkg5ZCv5Yqo5L2T6aqM44CCJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmNyZWF0ZUZvcm0ubmV3UnVsZSc6ICfmlrDlu7rop4TliJknLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlQ29uZmlnJzogJ+inhOWImemFjee9ricsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLmJhc2ljQ29uZmlnJzogJ+WfuuacrOS/oeaBrycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVOYW1lLm5hbWVMYWJlbCc6ICfop4TliJnlkI3np7AnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlTmFtZS5uYW1lUnVsZXMnOiAn6K+36L6T5YWl6KeE5YiZ5ZCN56ew77yBJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZURlc2MuZGVzY0xhYmVsJzogJ+inhOWImeaPj+i/sCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVEZXNjLmRlc2NQbGFjZWhvbGRlcic6ICfor7fovpPlhaXoh7PlsJHkupTkuKrlrZfnrKYnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlRGVzYy5kZXNjUnVsZXMnOiAn6K+36L6T5YWl6Iez5bCR5LqU5Liq5a2X56ym55qE6KeE5YiZ5o+P6L+w77yBJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZVByb3BzLnRpdGxlJzogJ+mFjee9ruinhOWImeWxnuaApycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLm9iamVjdCc6ICfnm5Hmjqflr7nosaEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlUHJvcHMudGVtcGxhdGVMYWJlbCc6ICfop4TliJnmqKHmnb8nLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlUHJvcHMudHlwZUxhYmVsJzogJ+inhOWImeexu+WeiycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnNjaGVkdWxpbmdQZXJpb2QudGl0bGUnOiAn6K6+5a6a6LCD5bqm5ZGo5pyfJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uc2NoZWR1bGluZ1BlcmlvZC50aW1lTGFiZWwnOiAn5byA5aeL5pe26Ze0JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uc2NoZWR1bGluZ1BlcmlvZC50aW1lUnVsZXMnOiAn6K+36YCJ5oup5byA5aeL5pe26Ze077yBJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucGxlYXNlSW5wdXQnOiAn6K+36L6T5YWlJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlRGVzYyc6ICfmj4/ov7AnLAorICAncGFnZXMuc2VhcmNoVGFibGUucnVsZU5hbWUnOiAn6KeE5YiZ5ZCN56ew5Li65b+F5aGr6aG5JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlQ2FsbE5vJzogJ+acjeWKoeiwg+eUqOasoeaVsCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZVN0YXR1cyc6ICfnirbmgIEnLAorICAncGFnZXMuc2VhcmNoVGFibGUubmFtZVN0YXR1cy5kZWZhdWx0JzogJ+WFs+mXrScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5uYW1lU3RhdHVzLnJ1bm5pbmcnOiAn6L+Q6KGM5LitJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMub25saW5lJzogJ+W3suS4iue6vycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5uYW1lU3RhdHVzLmFibm9ybWFsJzogJ+W8guW4uCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZVVwZGF0ZWRBdCc6ICfkuIrmrKHosIPluqbml7bpl7QnLAorICAncGFnZXMuc2VhcmNoVGFibGUuZXhjZXB0aW9uJzogJ+ivt+i+k+WFpeW8guW4uOWOn+WboO+8gScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZU9wdGlvbic6ICfmk43kvZwnLAorICAncGFnZXMuc2VhcmNoVGFibGUuY29uZmlnJzogJ+mFjee9ricsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5zdWJzY3JpYmVBbGVydCc6ICforqLpmIXorabmiqUnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGUnOiAn5p+l6K+i6KGo5qC8JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5ldyc6ICfmlrDlu7onLAorICAncGFnZXMuc2VhcmNoVGFibGUuZWRpdCc6ICfnvJbovpEnLAorICAncGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlJzogJ+WIoOmZpCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5jbGVhbkFsbCc6ICfmuIXnqbonLAorICAncGFnZXMuc2VhcmNoVGFibGUuZXhwb3J0JzogJ+WvvOWHuicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4nOiAn5bey6YCJ5oupJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLml0ZW0nOiAn6aG5JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRvdGFsU2VydmljZUNhbGxzJzogJ+acjeWKoeiwg+eUqOasoeaVsOaAu+iuoScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50ZW5UaG91c2FuZCc6ICfkuIcnLAorICAncGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbic6ICfmibnph4/liKDpmaQnLAorICAncGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hBcHByb3ZhbCc6ICfmibnph4/lrqHmibknLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3B3YS50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3B3YS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vcHdhLnRzCkBAIC0wLDAgKzEsNiBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnYXBwLnB3YS5vZmZsaW5lJzogJ+W9k+WJjeWkhOS6juemu+e6v+eKtuaAgScsCisgICdhcHAucHdhLnNlcnZpY2V3b3JrZXIudXBkYXRlZCc6ICfmnInmlrDlhoXlrrknLAorICAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQuaGludCc6ICfor7fngrnlh7vigJzliLfmlrDigJ3mjInpkq7miJbogIXmiYvliqjliLfmlrDpobXpnaInLAorICAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQub2snOiAn5Yi35pawJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zZXR0aW5nRHJhd2VyLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc2V0dGluZ0RyYXdlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ0OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc2V0dGluZ0RyYXdlci50cwpAQCAtMCwwICsxLDMxIEBACitleHBvcnQgZGVmYXVsdCB7CisgICdhcHAuc2V0dGluZy5wYWdlc3R5bGUnOiAn5pW05L2T6aOO5qC86K6+572uJywKKyAgJ2FwcC5zZXR0aW5nLnBhZ2VzdHlsZS5kYXJrJzogJ+aal+iJsuiPnOWNlemjjuagvCcsCisgICdhcHAuc2V0dGluZy5wYWdlc3R5bGUubGlnaHQnOiAn5Lqu6Imy6I+c5Y2V6aOO5qC8JywKKyAgJ2FwcC5zZXR0aW5nLmNvbnRlbnQtd2lkdGgnOiAn5YaF5a655Yy65Z+f5a695bqmJywKKyAgJ2FwcC5zZXR0aW5nLmNvbnRlbnQtd2lkdGguZml4ZWQnOiAn5a6a5a69JywKKyAgJ2FwcC5zZXR0aW5nLmNvbnRlbnQtd2lkdGguZmx1aWQnOiAn5rWB5byPJywKKyAgJ2FwcC5zZXR0aW5nLnRoZW1lY29sb3InOiAn5Li76aKY6ImyJywKKyAgJ2FwcC5zZXR0aW5nLnRoZW1lY29sb3IuZHVzdCc6ICfoloTmmq4nLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci52b2xjYW5vJzogJ+eBq+WxsScsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLnN1bnNldCc6ICfml6Xmmq4nLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5jeWFuJzogJ+aYjumdkicsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmdyZWVuJzogJ+aegeWFiee7vycsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmRheWJyZWFrJzogJ+aLguaZk+iTne+8iOm7mOiupO+8iScsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmdlZWtibHVlJzogJ+aegeWuouiTnScsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLnB1cnBsZSc6ICfphbHntKsnLAorICAnYXBwLnNldHRpbmcubmF2aWdhdGlvbm1vZGUnOiAn5a+86Iiq5qih5byPJywKKyAgJ2FwcC5zZXR0aW5nLnNpZGVtZW51JzogJ+S+p+i+ueiPnOWNleW4g+WxgCcsCisgICdhcHAuc2V0dGluZy50b3BtZW51JzogJ+mhtumDqOiPnOWNleW4g+WxgCcsCisgICdhcHAuc2V0dGluZy5maXhlZGhlYWRlcic6ICflm7rlrpogSGVhZGVyJywKKyAgJ2FwcC5zZXR0aW5nLmZpeGVkc2lkZWJhcic6ICflm7rlrprkvqfovrnoj5zljZUnLAorICAnYXBwLnNldHRpbmcuZml4ZWRzaWRlYmFyLmhpbnQnOiAn5L6n6L656I+c5Y2V5biD5bGA5pe25Y+v6YWN572uJywKKyAgJ2FwcC5zZXR0aW5nLmhpZGVoZWFkZXInOiAn5LiL5ruR5pe26ZqQ6JePIEhlYWRlcicsCisgICdhcHAuc2V0dGluZy5oaWRlaGVhZGVyLmhpbnQnOiAn5Zu65a6aIEhlYWRlciDml7blj6/phY3nva4nLAorICAnYXBwLnNldHRpbmcub3RoZXJzZXR0aW5ncyc6ICflhbbku5borr7nva4nLAorICAnYXBwLnNldHRpbmcud2Vha21vZGUnOiAn6Imy5byx5qih5byPJywKKyAgJ2FwcC5zZXR0aW5nLmNvcHknOiAn5ou36LSd6K6+572uJywKKyAgJ2FwcC5zZXR0aW5nLmNvcHlpbmZvJzogJ+aLt+i0neaIkOWKn++8jOivt+WIsCBjb25maWcvZGVmYXVsdFNldHRpbmdzLmpzIOS4reabv+aNoum7mOiupOmFjee9ricsCisgICdhcHAuc2V0dGluZy5wcm9kdWN0aW9uLmhpbnQnOgorICAgICfphY3nva7moI/lj6rlnKjlvIDlj5Hnjq/looPnlKjkuo7pooTop4jvvIznlJ/kuqfnjq/looPkuI3kvJrlsZXnjrDvvIzor7fmi7fotJ3lkI7miYvliqjkv67mlLnphY3nva7mlofku7YnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3NldHRpbmdzLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc2V0dGluZ3MudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4YWY0MwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3NldHRpbmdzLnRzCkBAIC0wLDAgKzEsNTUgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2FwcC5zZXR0aW5ncy5tZW51TWFwLmJhc2ljJzogJ+WfuuacrOiuvue9ricsCisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5zZWN1cml0eSc6ICflronlhajorr7nva4nLAorICAnYXBwLnNldHRpbmdzLm1lbnVNYXAuYmluZGluZyc6ICfotKblj7fnu5HlrponLAorICAnYXBwLnNldHRpbmdzLm1lbnVNYXAubm90aWZpY2F0aW9uJzogJ+aWsOa2iOaBr+mAmuefpScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuYXZhdGFyJzogJ+WktOWDjycsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuY2hhbmdlLWF2YXRhcic6ICfmm7TmjaLlpLTlg48nLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmVtYWlsJzogJ+mCrueusScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuZW1haWwtbWVzc2FnZSc6ICfor7fovpPlhaXmgqjnmoTpgq7nrrEhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5uaWNrbmFtZSc6ICfmmLXnp7AnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLm5pY2tuYW1lLW1lc3NhZ2UnOiAn6K+36L6T5YWl5oKo55qE5pi156ewIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMucHJvZmlsZSc6ICfkuKrkurrnroDku4snLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnByb2ZpbGUtbWVzc2FnZSc6ICfor7fovpPlhaXkuKrkurrnroDku4shJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5wcm9maWxlLXBsYWNlaG9sZGVyJzogJ+S4quS6uueugOS7iycsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuY291bnRyeSc6ICflm73lrrYv5Zyw5Yy6JywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5jb3VudHJ5LW1lc3NhZ2UnOiAn6K+36L6T5YWl5oKo55qE5Zu95a625oiW5Zyw5Yy6IScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuZ2VvZ3JhcGhpYyc6ICfmiYDlnKjnnIHluIInLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmdlb2dyYXBoaWMtbWVzc2FnZSc6ICfor7fovpPlhaXmgqjnmoTmiYDlnKjnnIHluIIhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5hZGRyZXNzJzogJ+ihl+mBk+WcsOWdgCcsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuYWRkcmVzcy1tZXNzYWdlJzogJ+ivt+i+k+WFpeaCqOeahOihl+mBk+WcsOWdgCEnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnBob25lJzogJ+iBlOezu+eUteivnScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMucGhvbmUtbWVzc2FnZSc6ICfor7fovpPlhaXmgqjnmoTogZTns7vnlLXor50hJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy51cGRhdGUnOiAn5pu05paw5Z+65pys5L+h5oGvJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5zdHJvbmcnOiAn5by6JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tZWRpdW0nOiAn5LitJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS53ZWFrJzogJ+W8sScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkucGFzc3dvcmQnOiAn6LSm5oi35a+G56CBJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5wYXNzd29yZC1kZXNjcmlwdGlvbic6ICflvZPliY3lr4bnoIHlvLrluqYnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBob25lJzogJ+WvhuS/neaJi+acuicsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkucGhvbmUtZGVzY3JpcHRpb24nOiAn5bey57uR5a6a5omL5py6JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5xdWVzdGlvbic6ICflr4bkv53pl67popgnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnF1ZXN0aW9uLWRlc2NyaXB0aW9uJzogJ+acquiuvue9ruWvhuS/nemXrumimO+8jOWvhuS/nemXrumimOWPr+acieaViOS/neaKpOi0puaIt+WuieWFqCcsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkuZW1haWwnOiAn5aSH55So6YKu566xJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5lbWFpbC1kZXNjcmlwdGlvbic6ICflt7Lnu5Hlrprpgq7nrrEnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5Lm1mYSc6ICdNRkEg6K6+5aSHJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tZmEtZGVzY3JpcHRpb24nOiAn5pyq57uR5a6aIE1GQSDorr7lpIfvvIznu5HlrprlkI7vvIzlj6/ku6Xov5vooYzkuozmrKHnoa7orqQnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5Lm1vZGlmeSc6ICfkv67mlLknLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnNldCc6ICforr7nva4nLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LmJpbmQnOiAn57uR5a6aJywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLnRhb2Jhbyc6ICfnu5Hlrprmt5jlrp0nLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcudGFvYmFvLWRlc2NyaXB0aW9uJzogJ+W9k+WJjeacque7keWumua3mOWunei0puWPtycsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5hbGlwYXknOiAn57uR5a6a5pSv5LuY5a6dJywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLmFsaXBheS1kZXNjcmlwdGlvbic6ICflvZPliY3mnKrnu5HlrprmlK/ku5jlrp3otKblj7cnLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcuZGluZ2RpbmcnOiAn57uR5a6a6ZKJ6ZKJJywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLmRpbmdkaW5nLWRlc2NyaXB0aW9uJzogJ+W9k+WJjeacque7keWumumSiemSiei0puWPtycsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5iaW5kJzogJ+e7keWumicsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLnBhc3N3b3JkJzogJ+i0puaIt+WvhueggScsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLnBhc3N3b3JkLWRlc2NyaXB0aW9uJzogJ+WFtuS7lueUqOaIt+eahOa2iOaBr+WwhuS7peermeWGheS/oeeahOW9ouW8j+mAmuefpScsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLm1lc3NhZ2VzJzogJ+ezu+e7n+a2iOaBrycsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLm1lc3NhZ2VzLWRlc2NyaXB0aW9uJzogJ+ezu+e7n+a2iOaBr+WwhuS7peermeWGheS/oeeahOW9ouW8j+mAmuefpScsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLnRvZG8nOiAn5b6F5Yqe5Lu75YqhJywKKyAgJ2FwcC5zZXR0aW5ncy5ub3RpZmljYXRpb24udG9kby1kZXNjcmlwdGlvbic6ICflvoXlip7ku7vliqHlsIbku6Xnq5nlhoXkv6HnmoTlvaLlvI/pgJrnn6UnLAorICAnYXBwLnNldHRpbmdzLm9wZW4nOiAn5byAJywKKyAgJ2FwcC5zZXR0aW5ncy5jbG9zZSc6ICflhbMnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9jb25maWcudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vY29uZmlnLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWU3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vY29uZmlnLnRzCkBAIC0wLDAgKzEsMTQgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknc3lzdGVtLmNvbmZpZy50aXRsZSc6ICflj4LmlbDphY3nva4nLAorCSdzeXN0ZW0uY29uZmlnLmNvbmZpZ19pZCc6ICflj4LmlbDkuLvplK4nLAorCSdzeXN0ZW0uY29uZmlnLmNvbmZpZ19uYW1lJzogJ+WPguaVsOWQjeensCcsCisJJ3N5c3RlbS5jb25maWcuY29uZmlnX2tleSc6ICflj4LmlbDplK7lkI0nLAorCSdzeXN0ZW0uY29uZmlnLmNvbmZpZ192YWx1ZSc6ICflj4LmlbDplK7lgLwnLAorCSdzeXN0ZW0uY29uZmlnLmNvbmZpZ190eXBlJzogJ+ezu+e7n+WGhee9ricsCisJJ3N5c3RlbS5jb25maWcuY3JlYXRlX2J5JzogJ+WIm+W7uuiAhScsCisJJ3N5c3RlbS5jb25maWcuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKwknc3lzdGVtLmNvbmZpZy51cGRhdGVfYnknOiAn5pu05paw6ICFJywKKwknc3lzdGVtLmNvbmZpZy51cGRhdGVfdGltZSc6ICfmm7TmlrDml7bpl7QnLAorCSdzeXN0ZW0uY29uZmlnLnJlbWFyayc6ICflpIfms6gnLAorCSdzeXN0ZW0uY29uZmlnLnJlZnJlc2hDYWNoZSc6ICfliLfmlrDnvJPlrZgnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9kZXB0LnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL2RlcHQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NGYyYwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9kZXB0LnRzCkBAIC0wLDAgKzEsMTggQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknc3lzdGVtLmRlcHQudGl0bGUnOiAn6YOo6ZeoJywKKwknc3lzdGVtLmRlcHQuZGVwdF9pZCc6ICfpg6jpl6hpZCcsCisJJ3N5c3RlbS5kZXB0LnBhcmVudF9pZCc6ICfniLbpg6jpl6hpZCcsCisJJ3N5c3RlbS5kZXB0LnBhcmVudF9kZXB0JzogJ+S4iue6p+mDqOmXqCcsCisJJ3N5c3RlbS5kZXB0LmFuY2VzdG9ycyc6ICfnpZbnuqfliJfooagnLAorCSdzeXN0ZW0uZGVwdC5kZXB0X25hbWUnOiAn6YOo6Zeo5ZCN56ewJywKKwknc3lzdGVtLmRlcHQub3JkZXJfbnVtJzogJ+aYvuekuumhuuW6jycsCisJJ3N5c3RlbS5kZXB0LmxlYWRlcic6ICfotJ/otKPkuronLAorCSdzeXN0ZW0uZGVwdC5waG9uZSc6ICfogZTns7vnlLXor50nLAorCSdzeXN0ZW0uZGVwdC5lbWFpbCc6ICfpgq7nrrEnLAorCSdzeXN0ZW0uZGVwdC5zdGF0dXMnOiAn6YOo6Zeo54q25oCBJywKKwknc3lzdGVtLmRlcHQuZGVsX2ZsYWcnOiAn5Yig6Zmk5qCH5b+XJywKKwknc3lzdGVtLmRlcHQuY3JlYXRlX2J5JzogJ+WIm+W7uuiAhScsCisJJ3N5c3RlbS5kZXB0LmNyZWF0ZV90aW1lJzogJ+WIm+W7uuaXtumXtCcsCisJJ3N5c3RlbS5kZXB0LnVwZGF0ZV9ieSc6ICfmm7TmlrDogIUnLAorCSdzeXN0ZW0uZGVwdC51cGRhdGVfdGltZSc6ICfmm7TmlrDml7bpl7QnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9kaWN0LWRhdGEudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vZGljdC1kYXRhLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmM3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vZGljdC1kYXRhLnRzCkBAIC0wLDAgKzEsMTcgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ3N5c3RlbS5kaWN0LmRhdGEudGl0bGUnOiAn5a2X5YW45pWw5o2uJywKKyAgJ3N5c3RlbS5kaWN0LmRhdGEuZGljdF9jb2RlJzogJ+Wtl+WFuOe8lueggScsCisgICdzeXN0ZW0uZGljdC5kYXRhLmRpY3Rfc29ydCc6ICflrZflhbjmjpLluo8nLAorICAnc3lzdGVtLmRpY3QuZGF0YS5kaWN0X2xhYmVsJzogJ+Wtl+WFuOagh+etvicsCisgICdzeXN0ZW0uZGljdC5kYXRhLmRpY3RfdmFsdWUnOiAn5a2X5YW46ZSu5YC8JywKKyAgJ3N5c3RlbS5kaWN0LmRhdGEuZGljdF90eXBlJzogJ+Wtl+WFuOexu+WeiycsCisgICdzeXN0ZW0uZGljdC5kYXRhLmNzc19jbGFzcyc6ICfmoLflvI/lsZ7mgKcnLAorICAnc3lzdGVtLmRpY3QuZGF0YS5saXN0X2NsYXNzJzogJ+WbnuaYvuagt+W8jycsCisgICdzeXN0ZW0uZGljdC5kYXRhLmlzX2RlZmF1bHQnOiAn5piv5ZCm6buY6K6kJywKKyAgJ3N5c3RlbS5kaWN0LmRhdGEuc3RhdHVzJzogJ+eKtuaAgScsCisgICdzeXN0ZW0uZGljdC5kYXRhLmNyZWF0ZV9ieSc6ICfliJvlu7rogIUnLAorICAnc3lzdGVtLmRpY3QuZGF0YS5jcmVhdGVfdGltZSc6ICfliJvlu7rml7bpl7QnLAorICAnc3lzdGVtLmRpY3QuZGF0YS51cGRhdGVfYnknOiAn5pu05paw6ICFJywKKyAgJ3N5c3RlbS5kaWN0LmRhdGEudXBkYXRlX3RpbWUnOiAn5pu05paw5pe26Ze0JywKKyAgJ3N5c3RlbS5kaWN0LmRhdGEucmVtYXJrJzogJ+Wkh+azqCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL2RpY3QudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vZGljdC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAwZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL2RpY3QudHMKQEAgLTAsMCArMSwxMiBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnc3lzdGVtLmRpY3QudGl0bGUnOiAn5a2X5YW457G75Z6LJywKKyAgJ3N5c3RlbS5kaWN0LmRpY3RfaWQnOiAn5a2X5YW45Li76ZSuJywKKyAgJ3N5c3RlbS5kaWN0LmRpY3RfbmFtZSc6ICflrZflhbjlkI3np7AnLAorICAnc3lzdGVtLmRpY3QuZGljdF90eXBlJzogJ+Wtl+WFuOexu+WeiycsCisgICdzeXN0ZW0uZGljdC5zdGF0dXMnOiAn54q25oCBJywKKyAgJ3N5c3RlbS5kaWN0LmNyZWF0ZV9ieSc6ICfliJvlu7rogIUnLAorICAnc3lzdGVtLmRpY3QuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKyAgJ3N5c3RlbS5kaWN0LnVwZGF0ZV9ieSc6ICfmm7TmlrDogIUnLAorICAnc3lzdGVtLmRpY3QudXBkYXRlX3RpbWUnOiAn5pu05paw5pe26Ze0JywKKyAgJ3N5c3RlbS5kaWN0LnJlbWFyayc6ICflpIfms6gnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9tZW51LnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL21lbnUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMWU1OAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9tZW51LnRzCkBAIC0wLDAgKzEsMjIgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknc3lzdGVtLm1lbnUudGl0bGUnOiAn6I+c5Y2V5p2D6ZmQJywKKwknc3lzdGVtLm1lbnUubWVudV9pZCc6ICfoj5zljZXnvJblj7cnLAorCSdzeXN0ZW0ubWVudS5tZW51X25hbWUnOiAn6I+c5Y2V5ZCN56ewJywKKwknc3lzdGVtLm1lbnUucGFyZW50X2lkJzogJ+S4iue6p+iPnOWNlScsCisJJ3N5c3RlbS5tZW51Lm9yZGVyX251bSc6ICfmmL7npLrpobrluo8nLAorCSdzeXN0ZW0ubWVudS5wYXRoJzogJ+i3r+eUseWcsOWdgCcsCisJJ3N5c3RlbS5tZW51LmNvbXBvbmVudCc6ICfnu4Tku7bot6/lvoQnLAorCSdzeXN0ZW0ubWVudS5xdWVyeSc6ICfot6/nlLHlj4LmlbAnLAorCSdzeXN0ZW0ubWVudS5pc19mcmFtZSc6ICfmmK/lkKbkuLrlpJbpk74nLAorCSdzeXN0ZW0ubWVudS5pc19jYWNoZSc6ICfmmK/lkKbnvJPlrZgnLAorCSdzeXN0ZW0ubWVudS5tZW51X3R5cGUnOiAn6I+c5Y2V57G75Z6LJywKKwknc3lzdGVtLm1lbnUudmlzaWJsZSc6ICfmmL7npLrnirbmgIEnLAorCSdzeXN0ZW0ubWVudS5zdGF0dXMnOiAn6I+c5Y2V54q25oCBJywKKwknc3lzdGVtLm1lbnUucGVybXMnOiAn5p2D6ZmQ5qCH6K+GJywKKwknc3lzdGVtLm1lbnUuaWNvbic6ICfoj5zljZXlm77moIcnLAorCSdzeXN0ZW0ubWVudS5jcmVhdGVfYnknOiAn5Yib5bu66ICFJywKKwknc3lzdGVtLm1lbnUuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKwknc3lzdGVtLm1lbnUudXBkYXRlX2J5JzogJ+abtOaWsOiAhScsCisJJ3N5c3RlbS5tZW51LnVwZGF0ZV90aW1lJzogJ+abtOaWsOaXtumXtCcsCisJJ3N5c3RlbS5tZW51LnJlbWFyayc6ICflpIfms6gnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9ub3RpY2UudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vbm90aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vbm90aWNlLnRzCkBAIC0wLDAgKzEsMTMgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknc3lzdGVtLm5vdGljZS50aXRsZSc6ICfpgJrnn6XlhazlkYonLAorCSdzeXN0ZW0ubm90aWNlLm5vdGljZV9pZCc6ICflhazlkYrnvJblj7cnLAorCSdzeXN0ZW0ubm90aWNlLm5vdGljZV90aXRsZSc6ICflhazlkYrmoIfpopgnLAorCSdzeXN0ZW0ubm90aWNlLm5vdGljZV90eXBlJzogJ+WFrOWRiuexu+WeiycsCisJJ3N5c3RlbS5ub3RpY2Uubm90aWNlX2NvbnRlbnQnOiAn5YWs5ZGK5YaF5a65JywKKwknc3lzdGVtLm5vdGljZS5zdGF0dXMnOiAn5YWs5ZGK54q25oCBJywKKwknc3lzdGVtLm5vdGljZS5jcmVhdGVfYnknOiAn5Yib5bu66ICFJywKKwknc3lzdGVtLm5vdGljZS5jcmVhdGVfdGltZSc6ICfliJvlu7rml7bpl7QnLAorCSdzeXN0ZW0ubm90aWNlLnVwZGF0ZV9ieSc6ICfmm7TmlrDogIUnLAorCSdzeXN0ZW0ubm90aWNlLnVwZGF0ZV90aW1lJzogJ+abtOaWsOaXtumXtCcsCisJJ3N5c3RlbS5ub3RpY2UucmVtYXJrJzogJ+Wkh+azqCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL3Bvc3QudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vcG9zdC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU1ODliCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL3Bvc3QudHMKQEAgLTAsMCArMSwxMyBAQAorZXhwb3J0IGRlZmF1bHQgeworCSdzeXN0ZW0ucG9zdC50aXRsZSc6ICflspfkvY3kv6Hmga8nLAorCSdzeXN0ZW0ucG9zdC5wb3N0X2lkJzogJ+Wyl+S9jee8luWPtycsCisJJ3N5c3RlbS5wb3N0LnBvc3RfY29kZSc6ICflspfkvY3nvJbnoIEnLAorCSdzeXN0ZW0ucG9zdC5wb3N0X25hbWUnOiAn5bKX5L2N5ZCN56ewJywKKwknc3lzdGVtLnBvc3QucG9zdF9zb3J0JzogJ+aYvuekuumhuuW6jycsCisJJ3N5c3RlbS5wb3N0LnN0YXR1cyc6ICfnirbmgIEnLAorCSdzeXN0ZW0ucG9zdC5jcmVhdGVfYnknOiAn5Yib5bu66ICFJywKKwknc3lzdGVtLnBvc3QuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKwknc3lzdGVtLnBvc3QudXBkYXRlX2J5JzogJ+abtOaWsOiAhScsCisJJ3N5c3RlbS5wb3N0LnVwZGF0ZV90aW1lJzogJ+abtOaWsOaXtumXtCcsCisJJ3N5c3RlbS5wb3N0LnJlbWFyayc6ICflpIfms6gnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9yb2xlLnRzIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtQ04vc3lzdGVtL3JvbGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4Zjk3OQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS9yb2xlLnRzCkBAIC0wLDAgKzEsMjEgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKwknc3lzdGVtLnJvbGUudGl0bGUnOiAn6KeS6Imy5L+h5oGvJywKKwknc3lzdGVtLnJvbGUucm9sZV9pZCc6ICfop5LoibLnvJblj7cnLAorCSdzeXN0ZW0ucm9sZS5yb2xlX25hbWUnOiAn6KeS6Imy5ZCN56ewJywKKwknc3lzdGVtLnJvbGUucm9sZV9rZXknOiAn5p2D6ZmQ5a2X56ymJywKKwknc3lzdGVtLnJvbGUucm9sZV9zb3J0JzogJ+aYvuekuumhuuW6jycsCisJJ3N5c3RlbS5yb2xlLmRhdGFfc2NvcGUnOiAn5pWw5o2u6IyD5Zu0JywKKwknc3lzdGVtLnJvbGUubWVudV9jaGVja19zdHJpY3RseSc6ICfoj5zljZXmoJHpgInmi6npobnmmK/lkKblhbPogZTmmL7npLonLAorCSdzeXN0ZW0ucm9sZS5kZXB0X2NoZWNrX3N0cmljdGx5JzogJ+mDqOmXqOagkemAieaLqemhueaYr+WQpuWFs+iBlOaYvuekuicsCisJJ3N5c3RlbS5yb2xlLnN0YXR1cyc6ICfop5LoibLnirbmgIEnLAorCSdzeXN0ZW0ucm9sZS5kZWxfZmxhZyc6ICfliKDpmaTmoIflv5cnLAorCSdzeXN0ZW0ucm9sZS5jcmVhdGVfYnknOiAn5Yib5bu66ICFJywKKwknc3lzdGVtLnJvbGUuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKwknc3lzdGVtLnJvbGUudXBkYXRlX2J5JzogJ+abtOaWsOiAhScsCisJJ3N5c3RlbS5yb2xlLnVwZGF0ZV90aW1lJzogJ+abtOaWsOaXtumXtCcsCisJJ3N5c3RlbS5yb2xlLnJlbWFyayc6ICflpIfms6gnLAorCSdzeXN0ZW0ucm9sZS5hdXRoJzogJ+iPnOWNleadg+mZkCcsCisJJ3N5c3RlbS5yb2xlLmF1dGgudXNlcic6ICfpgInmi6nnlKjmiLcnLAorCSdzeXN0ZW0ucm9sZS5hdXRoLmFkZFVzZXInOiAn5re75Yqg55So5oi3JywKKwknc3lzdGVtLnJvbGUuYXV0aC5jYW5jZWxBbGwnOiAn5om56YeP5Y+W5raI5o6I5p2DJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vdXNlci50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLUNOL3N5c3RlbS91c2VyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjc2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1DTi9zeXN0ZW0vdXNlci50cwpAQCAtMCwwICsxLDMxIEBACitleHBvcnQgZGVmYXVsdCB7CisJJ3N5c3RlbS51c2VyLnRpdGxlJzogJ+eUqOaIt+S/oeaBrycsCisJJ3N5c3RlbS51c2VyLnVzZXJfaWQnOiAn55So5oi357yW5Y+3JywKKwknc3lzdGVtLnVzZXIuZGVwdF9uYW1lJzogJ+mDqOmXqCcsCisJJ3N5c3RlbS51c2VyLnVzZXJfbmFtZSc6ICfnlKjmiLfotKblj7cnLAorCSdzeXN0ZW0udXNlci5uaWNrX25hbWUnOiAn55So5oi35pi156ewJywKKwknc3lzdGVtLnVzZXIudXNlcl90eXBlJzogJ+eUqOaIt+exu+WeiycsCisJJ3N5c3RlbS51c2VyLmVtYWlsJzogJ+eUqOaIt+mCrueusScsCisJJ3N5c3RlbS51c2VyLnBob25lbnVtYmVyJzogJ+aJi+acuuWPt+eggScsCisJJ3N5c3RlbS51c2VyLnNleCc6ICfnlKjmiLfmgKfliKsnLAorCSdzeXN0ZW0udXNlci5hdmF0YXInOiAn5aS05YOP5Zyw5Z2AJywKKwknc3lzdGVtLnVzZXIucGFzc3dvcmQnOiAn5a+G56CBJywKKwknc3lzdGVtLnVzZXIuc3RhdHVzJzogJ+W4kOWPt+eKtuaAgScsCisJJ3N5c3RlbS51c2VyLmRlbF9mbGFnJzogJ+WIoOmZpOagh+W/lycsCisJJ3N5c3RlbS51c2VyLmxvZ2luX2lwJzogJ+acgOWQjueZu+W9lUlQJywKKwknc3lzdGVtLnVzZXIubG9naW5fZGF0ZSc6ICfmnIDlkI7nmbvlvZXml7bpl7QnLAorCSdzeXN0ZW0udXNlci5jcmVhdGVfYnknOiAn5Yib5bu66ICFJywKKwknc3lzdGVtLnVzZXIuY3JlYXRlX3RpbWUnOiAn5Yib5bu65pe26Ze0JywKKwknc3lzdGVtLnVzZXIudXBkYXRlX2J5JzogJ+abtOaWsOiAhScsCisJJ3N5c3RlbS51c2VyLnVwZGF0ZV90aW1lJzogJ+abtOaWsOaXtumXtCcsCisJJ3N5c3RlbS51c2VyLnJlbWFyayc6ICflpIfms6gnLAorCSdzeXN0ZW0udXNlci5wb3N0JzogJ+Wyl+S9jScsCisJJ3N5c3RlbS51c2VyLnJvbGUnOiAn6KeS6ImyJywKKwknc3lzdGVtLnVzZXIuYXV0aC5yb2xlJzogJ+WIhumFjeinkuiJsicsCisJJ3N5c3RlbS51c2VyLnJlc2V0LnBhc3N3b3JkJzogJ+WvhueggemHjee9ricsCisJJ3N5c3RlbS51c2VyLm1vZGlmeV9pbmZvJzogJ+e8lui+keeUqOaIt+S/oeaBrycsCisJJ3N5c3RlbS51c2VyLm9sZF9wYXNzd29yZCc6ICfml6flr4bnoIEnLAorCSdzeXN0ZW0udXNlci5uZXdfcGFzc3dvcmQnOiAn5paw5a+G56CBJywKKwknc3lzdGVtLnVzZXIuY29uZmlybV9wYXNzd29yZCc6ICfnoa7orqTlr4bnoIEnLAorCSdzeXN0ZW0udXNlci5tb2RpZnlfYXZhdGFyJzogJ+S/ruaUueWktOWDjycsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtVFcudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQ1ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtVFcudHMKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IGNvbXBvbmVudCBmcm9tICcuL3poLVRXL2NvbXBvbmVudCc7CitpbXBvcnQgZ2xvYmFsSGVhZGVyIGZyb20gJy4vemgtVFcvZ2xvYmFsSGVhZGVyJzsKK2ltcG9ydCBtZW51IGZyb20gJy4vemgtVFcvbWVudSc7CitpbXBvcnQgcHdhIGZyb20gJy4vemgtVFcvcHdhJzsKK2ltcG9ydCBzZXR0aW5nRHJhd2VyIGZyb20gJy4vemgtVFcvc2V0dGluZ0RyYXdlcic7CitpbXBvcnQgc2V0dGluZ3MgZnJvbSAnLi96aC1UVy9zZXR0aW5ncyc7CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ25hdkJhci5sYW5nJzogJ+iqnuiogCcsCisgICdsYXlvdXQudXNlci5saW5rLmhlbHAnOiAn5bmr5YqpJywKKyAgJ2xheW91dC51c2VyLmxpbmsucHJpdmFjeSc6ICfpmrHnp4EnLAorICAnbGF5b3V0LnVzZXIubGluay50ZXJtcyc6ICfmop3mrL4nLAorICAnYXBwLnByZXZpZXcuZG93bi5ibG9jayc6ICfkuIvovInmraTpoIHpnaLliLDmnKzlnLDpoIXnm64nLAorICAuLi5nbG9iYWxIZWFkZXIsCisgIC4uLm1lbnUsCisgIC4uLnNldHRpbmdEcmF3ZXIsCisgIC4uLnNldHRpbmdzLAorICAuLi5wd2EsCisgIC4uLmNvbXBvbmVudCwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9jb21wb25lbnQudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9jb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0OGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL2NvbXBvbmVudC50cwpAQCAtMCwwICsxLDUgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2NvbXBvbmVudC50YWdTZWxlY3QuZXhwYW5kJzogJ+WxlemWiycsCisgICdjb21wb25lbnQudGFnU2VsZWN0LmNvbGxhcHNlJzogJ+aUtui1tycsCisgICdjb21wb25lbnQudGFnU2VsZWN0LmFsbCc6ICflhajpg6gnLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL2dsb2JhbEhlYWRlci50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL2dsb2JhbEhlYWRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU4NDUxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtVFcvZ2xvYmFsSGVhZGVyLnRzCkBAIC0wLDAgKzEsMTcgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuc2VhcmNoJzogJ+ermeWFp+aQnOe0oicsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLnNlYXJjaC5leGFtcGxlMSc6ICfmkJzntKLmj5DnpLrlo7knLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5zZWFyY2guZXhhbXBsZTInOiAn5pCc57Si5o+Q56S65LqMJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuc2VhcmNoLmV4YW1wbGUzJzogJ+aQnOe0ouaPkOekuuS4iScsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLmhlbHAnOiAn5L2/55So5omL5YaKJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIubm90aWZpY2F0aW9uJzogJ+mAmuefpScsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLm5vdGlmaWNhdGlvbi5lbXB0eSc6ICflprPlt7Lmn6XnnIvmiYDmnInpgJrnn6UnLAorICAnY29tcG9uZW50Lmdsb2JhbEhlYWRlci5tZXNzYWdlJzogJ+a2iOaBrycsCisgICdjb21wb25lbnQuZ2xvYmFsSGVhZGVyLm1lc3NhZ2UuZW1wdHknOiAn5oKo5bey6K6A5a6M5omA5pyJ5raI5oGvJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuZXZlbnQnOiAn5b6F6L6mJywKKyAgJ2NvbXBvbmVudC5nbG9iYWxIZWFkZXIuZXZlbnQuZW1wdHknOiAn5aaz5bey5a6M5oiQ5omA5pyJ5b6F6L6mJywKKyAgJ2NvbXBvbmVudC5ub3RpY2VJY29uLmNsZWFyJzogJ+a4heepuicsCisgICdjb21wb25lbnQubm90aWNlSWNvbi5jbGVhcmVkJzogJ+a4heepuuS6hicsCisgICdjb21wb25lbnQubm90aWNlSWNvbi5lbXB0eSc6ICfmmqvnhKHos4fmlpknLAorICAnY29tcG9uZW50Lm5vdGljZUljb24udmlldy1tb3JlJzogJ+afpeeci+abtOWkmicsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtVFcvbWVudS50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL21lbnUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmNTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL21lbnUudHMKQEAgLTAsMCArMSw1MiBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnbWVudS53ZWxjb21lJzogJ+atoei/jicsCisgICdtZW51Lm1vcmUtYmxvY2tzJzogJ+abtOWkmuWNgOWhiicsCisgICdtZW51LmhvbWUnOiAn6aaW6aCBJywKKyAgJ21lbnUuYWRtaW4nOiAn5p2D6ZmQJywKKyAgJ21lbnUuYWRtaW4uc3ViLXBhZ2UnOiAn5LqM57qn566h55CG6aG1JywKKyAgJ21lbnUubG9naW4nOiAn55m76YyEJywKKyAgJ21lbnUucmVnaXN0ZXInOiAn6Ki75YaKJywKKyAgJ21lbnUucmVnaXN0ZXItcmVzdWx0JzogJ+iou+WGiue1kOaenCcsCisgICdtZW51LmRhc2hib2FyZCc6ICdEYXNoYm9hcmQnLAorICAnbWVudS5kYXNoYm9hcmQuYW5hbHlzaXMnOiAn5YiG5p6Q6aCBJywKKyAgJ21lbnUuZGFzaGJvYXJkLm1vbml0b3InOiAn55uj5o6n6aCBJywKKyAgJ21lbnUuZGFzaGJvYXJkLndvcmtwbGFjZSc6ICflt6XkvZzoh7onLAorICAnbWVudS5leGNlcHRpb24uNDAzJzogJzQwMycsCisgICdtZW51LmV4Y2VwdGlvbi40MDQnOiAnNDA0JywKKyAgJ21lbnUuZXhjZXB0aW9uLjUwMCc6ICc1MDAnLAorICAnbWVudS5mb3JtJzogJ+ihqOWWrumggScsCisgICdtZW51LmZvcm0uYmFzaWMtZm9ybSc6ICfln7rnpI7ooajllq4nLAorICAnbWVudS5mb3JtLnN0ZXAtZm9ybSc6ICfliIbmraXooajllq4nLAorICAnbWVudS5mb3JtLnN0ZXAtZm9ybS5pbmZvJzogJ+WIhuatpeihqOWWru+8iOWhq+Wvq+i9ieizrOS/oeaBr++8iScsCisgICdtZW51LmZvcm0uc3RlcC1mb3JtLmNvbmZpcm0nOiAn5YiG5q2l6KGo5Zau77yI56K66KqN6L2J6LOs5L+h5oGv77yJJywKKyAgJ21lbnUuZm9ybS5zdGVwLWZvcm0ucmVzdWx0JzogJ+WIhuatpeihqOWWru+8iOWujOaIkO+8iScsCisgICdtZW51LmZvcm0uYWR2YW5jZWQtZm9ybSc6ICfpq5jntJrooajllq4nLAorICAnbWVudS5saXN0JzogJ+WIl+ihqOmggScsCisgICdtZW51Lmxpc3QudGFibGUtbGlzdCc6ICfmn6XoqaLooajmoLwnLAorICAnbWVudS5saXN0LmJhc2ljLWxpc3QnOiAn5qiZ5reu5YiX6KGoJywKKyAgJ21lbnUubGlzdC5jYXJkLWxpc3QnOiAn5Y2h54mH5YiX6KGoJywKKyAgJ21lbnUubGlzdC5zZWFyY2gtbGlzdCc6ICfmkJzntKLliJfooagnLAorICAnbWVudS5saXN0LnNlYXJjaC1saXN0LmFydGljbGVzJzogJ+aQnOe0ouWIl+ihqO+8iOaWh+eroO+8iScsCisgICdtZW51Lmxpc3Quc2VhcmNoLWxpc3QucHJvamVjdHMnOiAn5pCc57Si5YiX6KGo77yI6aCF55uu77yJJywKKyAgJ21lbnUubGlzdC5zZWFyY2gtbGlzdC5hcHBsaWNhdGlvbnMnOiAn5pCc57Si5YiX6KGo77yI5oeJ55So77yJJywKKyAgJ21lbnUucHJvZmlsZSc6ICfoqbPmg4XpoIEnLAorICAnbWVudS5wcm9maWxlLmJhc2ljJzogJ+Wfuuekjuips+aDhemggScsCisgICdtZW51LnByb2ZpbGUuYWR2YW5jZWQnOiAn6auY57Sa6Kmz5oOF6aCBJywKKyAgJ21lbnUucmVzdWx0JzogJ+e1kOaenOmggScsCisgICdtZW51LnJlc3VsdC5zdWNjZXNzJzogJ+aIkOWKn+mggScsCisgICdtZW51LnJlc3VsdC5mYWlsJzogJ+WkseaVl+mggScsCisgICdtZW51LmV4Y2VwdGlvbic6ICflvILluLjpobUnLAorICAnbWVudS5leGNlcHRpb24ubm90LXBlcm1pc3Npb24nOiAnNDAzJywKKyAgJ21lbnUuZXhjZXB0aW9uLm5vdC1maW5kJzogJzQwNCcsCisgICdtZW51LmV4Y2VwdGlvbi5zZXJ2ZXItZXJyb3InOiAnNTAwJywKKyAgJ21lbnUuZXhjZXB0aW9uLnRyaWdnZXInOiAn6Kem5Y+R6ZSZ6K+vJywKKyAgJ21lbnUuYWNjb3VudCc6ICflgIvkurrpoIEnLAorICAnbWVudS5hY2NvdW50LmNlbnRlcic6ICflgIvkurrkuK3lv4MnLAorICAnbWVudS5hY2NvdW50LnNldHRpbmdzJzogJ+WAi+S6uuioree9ricsCisgICdtZW51LmFjY291bnQudHJpZ2dlcic6ICfop7jnmbzloLHpjK8nLAorICAnbWVudS5hY2NvdW50LmxvZ291dCc6ICfpgIDlh7rnmbvpjIQnLAorICAnbWVudS5lZGl0b3InOiAn5ZyW5b2i57eo6Lyv5ZmoJywKKyAgJ21lbnUuZWRpdG9yLmZsb3cnOiAn5rWB56iL57eo6Lyv5ZmoJywKKyAgJ21lbnUuZWRpdG9yLm1pbmQnOiAn6IWm5ZyW57eo6Lyv5ZmoJywKKyAgJ21lbnUuZWRpdG9yLmtvbmknOiAn5ouT5pKy57eo6Lyv5ZmoJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9wYWdlcy50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL3BhZ2VzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9wYWdlcy50cwpAQCAtMCwwICsxLDY4IEBACitleHBvcnQgZGVmYXVsdCB7CisgICdwYWdlcy5sYXlvdXRzLnVzZXJMYXlvdXQudGl0bGUnOiAnQW50IERlc2lnbiDmmK/opb/muZbljYDmnIDlhbflvbHpn7/lipvnmoQgV2ViIOioreioiOimj+evhCcsCisgICdwYWdlcy5sb2dpbi5hY2NvdW50TG9naW4udGFiJzogJ+izrOaItuWvhueivOeZu+mMhCcsCisgICdwYWdlcy5sb2dpbi5hY2NvdW50TG9naW4uZXJyb3JNZXNzYWdlJzogJ+mMr+iqpOeahOeUqOaItuWQjeWSjOWvhueivChhZG1pbi9hZG1pbjEyMyknLAorICAncGFnZXMubG9naW4uZmFpbHVyZSc6ICfnmbvpjITlpLHmlZfvvIzoq4vph43oqabvvIEnLAorICAncGFnZXMubG9naW4uc3VjY2Vzcyc6ICfnmbvpjITmiJDlip/vvIEnLAorICAncGFnZXMubG9naW4udXNlcm5hbWUucGxhY2Vob2xkZXInOiAn55So5oi25ZCNOiBhZG1pbicsCisgICdwYWdlcy5sb2dpbi51c2VybmFtZS5yZXF1aXJlZCc6ICfnlKjmiLblkI3mmK/lv4XloavpoIXvvIEnLAorICAncGFnZXMubG9naW4ucGFzc3dvcmQucGxhY2Vob2xkZXInOiAn5a+G56K8OiBhZG1pbjEyMycsCisgICdwYWdlcy5sb2dpbi5wYXNzd29yZC5yZXF1aXJlZCc6ICflr4bnorzmmK/lv4XloavpoIXvvIEnLAorICAncGFnZXMubG9naW4ucGhvbmVMb2dpbi50YWInOiAn5omL5qmf6Jmf55m76YyEJywKKyAgJ3BhZ2VzLmxvZ2luLnBob25lTG9naW4uZXJyb3JNZXNzYWdlJzogJ+mpl+itieeivOmMr+iqpCcsCisgICdwYWdlcy5sb2dpbi5waG9uZU51bWJlci5wbGFjZWhvbGRlcic6ICfoq4vovLjlhaXmiYvmqZ/omZ/vvIEnLAorICAncGFnZXMubG9naW4ucGhvbmVOdW1iZXIucmVxdWlyZWQnOiAn5omL5qmf6Jmf5piv5b+F5aGr6aCF77yBJywKKyAgJ3BhZ2VzLmxvZ2luLnBob25lTnVtYmVyLmludmFsaWQnOiAn5LiN5ZCI5rOV55qE5omL5qmf6Jmf77yBJywKKyAgJ3BhZ2VzLmxvZ2luLmNhcHRjaGEucGxhY2Vob2xkZXInOiAn6KuL6Ly45YWl6amX6K2J56K877yBJywKKyAgJ3BhZ2VzLmxvZ2luLmNhcHRjaGEucmVxdWlyZWQnOiAn6amX6K2J56K85piv5b+F5aGr6aCF77yBJywKKyAgJ3BhZ2VzLmxvZ2luLnBob25lTG9naW4uZ2V0VmVyaWZpY2F0aW9uQ29kZSc6ICfnjbLlj5bpqZforYnnorwnLAorICAncGFnZXMuZ2V0Q2FwdGNoYVNlY29uZFRleHQnOiAn56eS5b6M6YeN5paw542y5Y+WJywKKyAgJ3BhZ2VzLmxvZ2luLnJlbWVtYmVyTWUnOiAn6Ieq5YuV55m76YyEJywKKyAgJ3BhZ2VzLmxvZ2luLmZvcmdvdFBhc3N3b3JkJzogJ+W/mOiomOWvhueivCA/JywKKyAgJ3BhZ2VzLmxvZ2luLnN1Ym1pdCc6ICfnmbvpjIQnLAorICAncGFnZXMubG9naW4ubG9naW5XaXRoJzogJ+WFtuS7lueZu+mMhOaWueW8jyA6JywKKyAgJ3BhZ2VzLmxvZ2luLnJlZ2lzdGVyQWNjb3VudCc6ICfoqLvlhoros6zmiLYnLAorICAncGFnZXMud2VsY29tZS5saW5rJzogJ+atoei/juS9v+eUqCcsCisgICdwYWdlcy53ZWxjb21lLmFsZXJ0TWVzc2FnZSc6ICfmm7Tlv6vmm7TlvLfnmoTph43lnovntYTku7bvvIzlt7LntpPnmbzluIPjgIInLAorICAncGFnZXMuYWRtaW4uc3ViUGFnZS50aXRsZSc6ICfpgJnlgIvpoIHpnaLlj6rmnIkgYWRtaW4g5qyK6ZmQ5omN6IO95p+l55yLJywKKyAgJ3BhZ2VzLmFkbWluLnN1YlBhZ2UuYWxlcnRNZXNzYWdlJzogJ3VtaSB1aSDnj77lt7LnmbzkvYjvvIzmraHov47kvb/nlKggbnBtIHJ1biB1aSDllZPli5Xpq5TpqZfjgIInLAorICAncGFnZXMuc2VhcmNoVGFibGUuY3JlYXRlRm9ybS5uZXdSdWxlJzogJ+aWsOW7uuimj+WJhycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVDb25maWcnOiAn6KaP5YmH6YWN572uJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uYmFzaWNDb25maWcnOiAn5Z+65pys5L+h5oGvJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZU5hbWUubmFtZUxhYmVsJzogJ+imj+WJh+WQjeeosScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVOYW1lLm5hbWVSdWxlcyc6ICfoq4vovLjlhaXopo/liYflkI3nqLHvvIEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlRGVzYy5kZXNjTGFiZWwnOiAn6KaP5YmH5o+P6L+wJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ucnVsZURlc2MuZGVzY1BsYWNlaG9sZGVyJzogJ+iri+i8uOWFpeiHs+WwkeS6lOWAi+Wtl+espicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVEZXNjLmRlc2NSdWxlcyc6ICfoq4vovLjlhaXoh7PlsJHkupTlgIvlrZfnrKbnmoTopo/liYfmj4/ov7DvvIEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5ydWxlUHJvcHMudGl0bGUnOiAn6YWN572u6KaP5YmH5bGs5oCnJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0ub2JqZWN0JzogJ+ebo+aOp+WwjeixoScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVQcm9wcy50ZW1wbGF0ZUxhYmVsJzogJ+imj+WJh+aooeadvycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVQcm9wcy50eXBlTGFiZWwnOiAn6KaP5YmH6aGe5Z6LJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnVwZGF0ZUZvcm0uc2NoZWR1bGluZ1BlcmlvZC50aXRsZSc6ICfoqK3lrproqr/luqbpgLHmnJ8nLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5zY2hlZHVsaW5nUGVyaW9kLnRpbWVMYWJlbCc6ICfplovlp4vmmYLplpMnLAorICAncGFnZXMuc2VhcmNoVGFibGUudXBkYXRlRm9ybS5zY2hlZHVsaW5nUGVyaW9kLnRpbWVSdWxlcyc6ICfoq4vpgbjmk4fplovlp4vmmYLplpPvvIEnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGVEZXNjJzogJ+aPj+i/sCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5ydWxlTmFtZSc6ICfopo/liYflkI3nqLHniLLlv4XloavpoIUnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGl0bGVDYWxsTm8nOiAn5pyN5YuZ6Kq/55So5qyh5pW4JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlU3RhdHVzJzogJ+eLgOaFiycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5uYW1lU3RhdHVzLmRlZmF1bHQnOiAn6Zec6ZaJJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMucnVubmluZyc6ICfpgYvooYzkuK0nLAorICAncGFnZXMuc2VhcmNoVGFibGUubmFtZVN0YXR1cy5vbmxpbmUnOiAn5bey5LiK57eaJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLm5hbWVTdGF0dXMuYWJub3JtYWwnOiAn55Ww5bi4JywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlVXBkYXRlZEF0JzogJ+S4iuasoeiqv+W6puaZgumWkycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5leGNlcHRpb24nOiAn6KuL6Ly45YWl55Ww5bi45Y6f5Zug77yBJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uJzogJ+aTjeS9nCcsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5jb25maWcnOiAn6YWN572uJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLnN1YnNjcmliZUFsZXJ0JzogJ+iogumWseitpuWgsScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZSc6ICfmn6XoqaLooajmoLwnLAorICAncGFnZXMuc2VhcmNoVGFibGUubmV3JzogJ+aWsOW7uicsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5lZGl0JzogJ+e3qOi8rycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUnOiAn5Yiq6ZmkJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCc6ICflsI7lh7onLAorICAncGFnZXMuc2VhcmNoVGFibGUuY2hvc2VuJzogJ+W3sumBuOaThycsCisgICdwYWdlcy5zZWFyY2hUYWJsZS5pdGVtJzogJ+mghScsCisgICdwYWdlcy5zZWFyY2hUYWJsZS50b3RhbFNlcnZpY2VDYWxscyc6ICfmnI3li5noqr/nlKjmrKHmlbjnuL3oqIgnLAorICAncGFnZXMuc2VhcmNoVGFibGUudGVuVGhvdXNhbmQnOiAn6JCsJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoRGVsZXRpb24nOiAn5om56YeP5Yiq6ZmkJywKKyAgJ3BhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoQXBwcm92YWwnOiAn5om56YeP5a+p5om5JywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9wd2EudHMgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9wd2EudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4YTZlNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL3B3YS50cwpAQCAtMCwwICsxLDYgQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2FwcC5wd2Eub2ZmbGluZSc6ICfnlbbliY3omZXmlrzpm6Lnt5rni4DmhYsnLAorICAnYXBwLnB3YS5zZXJ2aWNld29ya2VyLnVwZGF0ZWQnOiAn5pyJ5paw5YWn5a65JywKKyAgJ2FwcC5wd2Euc2VydmljZXdvcmtlci51cGRhdGVkLmhpbnQnOiAn6KuL6bue5pOK4oCc5Yi35paw4oCd5oyJ6YiV5oiW6ICF5omL5YuV5Yi35paw6aCB6Z2iJywKKyAgJ2FwcC5wd2Euc2VydmljZXdvcmtlci51cGRhdGVkLm9rJzogJ+WIt+aWsCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL2xvY2FsZXMvemgtVFcvc2V0dGluZ0RyYXdlci50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL3NldHRpbmdEcmF3ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZGEyOAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL3NldHRpbmdEcmF3ZXIudHMKQEAgLTAsMCArMSwzMSBAQAorZXhwb3J0IGRlZmF1bHQgeworICAnYXBwLnNldHRpbmcucGFnZXN0eWxlJzogJ+aVtOmrlOmiqOagvOioree9ricsCisgICdhcHAuc2V0dGluZy5wYWdlc3R5bGUuZGFyayc6ICfmmpfoibLoj5zllq7poqjmoLwnLAorICAnYXBwLnNldHRpbmcucGFnZXN0eWxlLmxpZ2h0JzogJ+S6ruiJsuiPnOWWrumiqOagvCcsCisgICdhcHAuc2V0dGluZy5jb250ZW50LXdpZHRoJzogJ+WFp+WuueWNgOWfn+WvrOW6picsCisgICdhcHAuc2V0dGluZy5jb250ZW50LXdpZHRoLmZpeGVkJzogJ+WumuWvrCcsCisgICdhcHAuc2V0dGluZy5jb250ZW50LXdpZHRoLmZsdWlkJzogJ+a1geW8jycsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yJzogJ+S4u+mhjOiJsicsCisgICdhcHAuc2V0dGluZy50aGVtZWNvbG9yLmR1c3QnOiAn6JaE5pquJywKKyAgJ2FwcC5zZXR0aW5nLnRoZW1lY29sb3Iudm9sY2Fubyc6ICfngavlsbEnLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5zdW5zZXQnOiAn5pel5pquJywKKyAgJ2FwcC5zZXR0aW5nLnRoZW1lY29sb3IuY3lhbic6ICfmmI7pnZInLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5ncmVlbic6ICfmpbXlhYnntqAnLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5kYXlicmVhayc6ICfmi4Lmm4nol43vvIjpu5joqo3vvIknLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5nZWVrYmx1ZSc6ICfmpbXlrqLol40nLAorICAnYXBwLnNldHRpbmcudGhlbWVjb2xvci5wdXJwbGUnOiAn6Yas57SrJywKKyAgJ2FwcC5zZXR0aW5nLm5hdmlnYXRpb25tb2RlJzogJ+WwjuiIquaooeW8jycsCisgICdhcHAuc2V0dGluZy5zaWRlbWVudSc6ICflgbTpgoroj5zllq7luIPlsYAnLAorICAnYXBwLnNldHRpbmcudG9wbWVudSc6ICfpoILpg6joj5zllq7luIPlsYAnLAorICAnYXBwLnNldHRpbmcuZml4ZWRoZWFkZXInOiAn5Zu65a6aIEhlYWRlcicsCisgICdhcHAuc2V0dGluZy5maXhlZHNpZGViYXInOiAn5Zu65a6a5YG06YKK6I+c5ZauJywKKyAgJ2FwcC5zZXR0aW5nLmZpeGVkc2lkZWJhci5oaW50JzogJ+WBtOmCiuiPnOWWruW4g+WxgOaZguWPr+mFjee9ricsCisgICdhcHAuc2V0dGluZy5oaWRlaGVhZGVyJzogJ+S4i+a7keaZgumaseiXjyBIZWFkZXInLAorICAnYXBwLnNldHRpbmcuaGlkZWhlYWRlci5oaW50JzogJ+WbuuWumiBIZWFkZXIg5pmC5Y+v6YWN572uJywKKyAgJ2FwcC5zZXR0aW5nLm90aGVyc2V0dGluZ3MnOiAn5YW25LuW6Kit572uJywKKyAgJ2FwcC5zZXR0aW5nLndlYWttb2RlJzogJ+iJsuW8seaooeW8jycsCisgICdhcHAuc2V0dGluZy5jb3B5JzogJ+aLt+iyneioree9ricsCisgICdhcHAuc2V0dGluZy5jb3B5aW5mbyc6ICfmi7fosp3miJDlip/vvIzoq4vliLAgY29uZmlnL2RlZmF1bHRTZXR0aW5ncy5qcyDkuK3mm7/mj5vpu5joqo3phY3nva4nLAorICAnYXBwLnNldHRpbmcucHJvZHVjdGlvbi5oaW50JzoKKyAgICAn6YWN572u5qyE5Y+q5Zyo6ZaL55m855Kw5aKD55So5pa86aCQ6Ka977yM55Sf55Si55Kw5aKD5LiN5pyD5bGV54++77yM6KuL5ou36LKd5b6M5omL5YuV5L+u5pS56YWN572u5paH5Lu2JywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9zZXR0aW5ncy50cyBiL3JlYWN0LXVpL3NyYy9sb2NhbGVzL3poLVRXL3NldHRpbmdzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbG9jYWxlcy96aC1UVy9zZXR0aW5ncy50cwpAQCAtMCwwICsxLDU1IEBACitleHBvcnQgZGVmYXVsdCB7CisgICdhcHAuc2V0dGluZ3MubWVudU1hcC5iYXNpYyc6ICfln7rmnKzoqK3nva4nLAorICAnYXBwLnNldHRpbmdzLm1lbnVNYXAuc2VjdXJpdHknOiAn5a6J5YWo6Kit572uJywKKyAgJ2FwcC5zZXR0aW5ncy5tZW51TWFwLmJpbmRpbmcnOiAn6LOs6Jmf57aB5a6aJywKKyAgJ2FwcC5zZXR0aW5ncy5tZW51TWFwLm5vdGlmaWNhdGlvbic6ICfmlrDmtojmga/pgJrnn6UnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmF2YXRhcic6ICfpoK3lg48nLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmNoYW5nZS1hdmF0YXInOiAn5pu05o+b6aCt5YOPJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5lbWFpbCc6ICfpg7XnrrEnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmVtYWlsLW1lc3NhZ2UnOiAn6KuL6Ly45YWl5oKo55qE6YO1566xIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMubmlja25hbWUnOiAn5pi156ixJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5uaWNrbmFtZS1tZXNzYWdlJzogJ+iri+i8uOWFpeaCqOeahOaYteeosSEnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnByb2ZpbGUnOiAn5YCL5Lq657Ch5LuLJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5wcm9maWxlLW1lc3NhZ2UnOiAn6KuL6Ly45YWl5YCL5Lq657Ch5LuLIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMucHJvZmlsZS1wbGFjZWhvbGRlcic6ICflgIvkurrnsKHku4snLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmNvdW50cnknOiAn5ZyL5a62L+WcsOWNgCcsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuY291bnRyeS1tZXNzYWdlJzogJ+iri+i8uOWFpeaCqOeahOWci+WutuaIluWcsOWNgCEnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmdlb2dyYXBoaWMnOiAn5omA5Zyo55yB5biCJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5nZW9ncmFwaGljLW1lc3NhZ2UnOiAn6KuL6Ly45YWl5oKo55qE5omA5Zyo55yB5biCIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMuYWRkcmVzcyc6ICfooZfpgZPlnLDlnYAnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLmFkZHJlc3MtbWVzc2FnZSc6ICfoq4vovLjlhaXmgqjnmoTooZfpgZPlnLDlnYAhJywKKyAgJ2FwcC5zZXR0aW5ncy5iYXNpYy5waG9uZSc6ICfoga/ns7vpm7voqbEnLAorICAnYXBwLnNldHRpbmdzLmJhc2ljLnBob25lLW1lc3NhZ2UnOiAn6KuL6Ly45YWl5oKo55qE6IGv57O76Zu76KmxIScsCisgICdhcHAuc2V0dGluZ3MuYmFzaWMudXBkYXRlJzogJ+abtOaWsOWfuuacrOS/oeaBrycsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkuc3Ryb25nJzogJ+W8tycsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkubWVkaXVtJzogJ+S4rScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkud2Vhayc6ICflvLEnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBhc3N3b3JkJzogJ+izrOaItuWvhueivCcsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkucGFzc3dvcmQtZGVzY3JpcHRpb24nOiAn55W25YmN5a+G56K85by35bqmJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5waG9uZSc6ICflr4bkv53miYvmqZ8nLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LnBob25lLWRlc2NyaXB0aW9uJzogJ+W3sue2geWumuaJi+apnycsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkucXVlc3Rpb24nOiAn5a+G5L+d5ZWP6aGMJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5xdWVzdGlvbi1kZXNjcmlwdGlvbic6ICfmnKroqK3nva7lr4bkv53llY/poYzvvIzlr4bkv53llY/poYzlj6/mnInmlYjkv53orbfos6zmiLblronlhagnLAorICAnYXBwLnNldHRpbmdzLnNlY3VyaXR5LmVtYWlsJzogJ+WCmeeUqOmDteeusScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkuZW1haWwtZGVzY3JpcHRpb24nOiAn5bey57aB5a6a6YO1566xJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tZmEnOiAnTUZBIOioreWCmScsCisgICdhcHAuc2V0dGluZ3Muc2VjdXJpdHkubWZhLWRlc2NyaXB0aW9uJzogJ+acque2geWumiBNRkEg6Kit5YKZ77yM57aB5a6a5b6M77yM5Y+v5Lul6YCy6KGM5LqM5qyh56K66KqNJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5tb2RpZnknOiAn5L+u5pS5JywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5zZXQnOiAn6Kit572uJywKKyAgJ2FwcC5zZXR0aW5ncy5zZWN1cml0eS5iaW5kJzogJ+e2geWumicsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy50YW9iYW8nOiAn57aB5a6a5reY5a+2JywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLnRhb2Jhby1kZXNjcmlwdGlvbic6ICfnlbbliY3mnKrntoHlrprmt5jlr7bos6zomZ8nLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcuYWxpcGF5JzogJ+e2geWumuaUr+S7mOWvticsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5hbGlwYXktZGVzY3JpcHRpb24nOiAn55W25YmN5pyq57aB5a6a5pSv5LuY5a+26LOs6JmfJywKKyAgJ2FwcC5zZXR0aW5ncy5iaW5kaW5nLmRpbmdkaW5nJzogJ+e2geWumumHmOmHmCcsCisgICdhcHAuc2V0dGluZ3MuYmluZGluZy5kaW5nZGluZy1kZXNjcmlwdGlvbic6ICfnlbbliY3mnKrntoHlrprph5jph5jos6zomZ8nLAorICAnYXBwLnNldHRpbmdzLmJpbmRpbmcuYmluZCc6ICfntoHlrponLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi5wYXNzd29yZCc6ICfos6zmiLblr4bnorwnLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi5wYXNzd29yZC1kZXNjcmlwdGlvbic6ICflhbbku5bnlKjmiLbnmoTmtojmga/lsIfku6Xnq5nlhafkv6HnmoTlvaLlvI/pgJrnn6UnLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi5tZXNzYWdlcyc6ICfns7vntbHmtojmga8nLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi5tZXNzYWdlcy1kZXNjcmlwdGlvbic6ICfns7vntbHmtojmga/lsIfku6Xnq5nlhafkv6HnmoTlvaLlvI/pgJrnn6UnLAorICAnYXBwLnNldHRpbmdzLm5vdGlmaWNhdGlvbi50b2RvJzogJ+W+hei+puS7u+WLmScsCisgICdhcHAuc2V0dGluZ3Mubm90aWZpY2F0aW9uLnRvZG8tZGVzY3JpcHRpb24nOiAn5b6F6L6m5Lu75YuZ5bCH5Lul56uZ5YWn5L+h55qE5b2i5byP6YCa55+lJywKKyAgJ2FwcC5zZXR0aW5ncy5vcGVuJzogJ+mWiycsCisgICdhcHAuc2V0dGluZ3MuY2xvc2UnOiAn6ZecJywKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvbWFuaWZlc3QuanNvbiBiL3JlYWN0LXVpL3NyYy9tYW5pZmVzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWJjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvbWFuaWZlc3QuanNvbgpAQCAtMCwwICsxLDIyIEBACit7CisgICJuYW1lIjogIkFudCBEZXNpZ24gUHJvIiwKKyAgInNob3J0X25hbWUiOiAiQW50IERlc2lnbiBQcm8iLAorICAiZGlzcGxheSI6ICJzdGFuZGFsb25lIiwKKyAgInN0YXJ0X3VybCI6ICIuLz91dG1fc291cmNlPWhvbWVzY3JlZW4iLAorICAidGhlbWVfY29sb3IiOiAiIzAwMjE0MCIsCisgICJiYWNrZ3JvdW5kX2NvbG9yIjogIiMwMDE1MjkiLAorICAiaWNvbnMiOiBbCisgICAgeworICAgICAgInNyYyI6ICJpY29ucy9pY29uLTE5MngxOTIucG5nIiwKKyAgICAgICJzaXplcyI6ICIxOTJ4MTkyIgorICAgIH0sCisgICAgeworICAgICAgInNyYyI6ICJpY29ucy9pY29uLTEyOHgxMjgucG5nIiwKKyAgICAgICJzaXplcyI6ICIxMjh4MTI4IgorICAgIH0sCisgICAgeworICAgICAgInNyYyI6ICJpY29ucy9pY29uLTUxMng1MTIucG5nIiwKKyAgICAgICJzaXplcyI6ICI1MTJ4NTEyIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzLzQwNC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvNDA0LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjYzNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzLzQwNC50c3gKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IHsgaGlzdG9yeSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgQnV0dG9uLCBSZXN1bHQgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CisKK2NvbnN0IE5vRm91bmRQYWdlOiBSZWFjdC5GQyA9ICgpID0+ICgKKyAgPFJlc3VsdAorICAgIHN0YXR1cz0iNDA0IgorICAgIHRpdGxlPSI0MDQiCisgICAgc3ViVGl0bGU9IlNvcnJ5LCB0aGUgcGFnZSB5b3UgdmlzaXRlZCBkb2VzIG5vdCBleGlzdC4iCisgICAgZXh0cmE9eworICAgICAgPEJ1dHRvbiB0eXBlPSJwcmltYXJ5IiBvbkNsaWNrPXsoKSA9PiBoaXN0b3J5LnB1c2goJy8nKX0+CisgICAgICAgIEJhY2sgSG9tZQorICAgICAgPC9CdXR0b24+CisgICAgfQorICAvPgorKTsKKworZXhwb3J0IGRlZmF1bHQgTm9Gb3VuZFBhZ2U7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9DYWNoZS9MaXN0LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0NhY2hlL0xpc3QudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjE0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9DYWNoZS9MaXN0LnRzeApAQCAtMCwwICsxLDI0MCBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IGNsZWFyQ2FjaGVBbGwsIGNsZWFyQ2FjaGVLZXksIGNsZWFyQ2FjaGVOYW1lLCBnZXRDYWNoZVZhbHVlLCBsaXN0Q2FjaGVLZXksIGxpc3RDYWNoZU5hbWUgfSBmcm9tICdAL3NlcnZpY2VzL21vbml0b3IvY2FjaGVsaXN0JzsKK2ltcG9ydCB7IEJ1dHRvbiwgQ2FyZCwgQ29sLCBGb3JtLCBGb3JtSW5zdGFuY2UsIElucHV0LCBtZXNzYWdlLCBSb3csIFRhYmxlIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgc3R5bGVzIGZyb20gJy4vaW5kZXgubGVzcyc7CitpbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBSZWxvYWRPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IFByb0Zvcm0gfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CisKK2NvbnN0IHsgVGV4dEFyZWEgfSA9IElucHV0OworCisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMi8wNi8yNworICoKKyAqICovCisKKworCitjb25zdCBDYWNoZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBbY2FjaGVOYW1lcywgc2V0Q2FjaGVOYW1lc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2N1cnJlbnRDYWNoZU5hbWUsIHNldEN1cnJlbnRDYWNoZU5hbWVdID0gdXNlU3RhdGU8YW55PihbXSk7CisgIGNvbnN0IFtjYWNoZUtleXMsIHNldENhY2hlS2V5c10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgY29uc3QgZ2V0Q2FjaGVOYW1lcyA9ICgpID0+IHsKKyAgICBsaXN0Q2FjaGVOYW1lKCkudGhlbigocmVzKSA9PiB7CisgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICBzZXRDYWNoZU5hbWVzKHJlcy5kYXRhKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0Q2FjaGVOYW1lcygpOworICB9LCBbXSk7CisKKyAgY29uc3QgZ2V0Q2FjaGVLZXlzID0gKGNhY2hlTmFtZTogc3RyaW5nKSA9PiB7CisgICAgbGlzdENhY2hlS2V5KGNhY2hlTmFtZSkudGhlbihyZXMgPT4geworICAgICAgaWYgKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgICAgbGV0IGluZGV4ID0gMDsKKyAgICAgICAgY29uc3Qga2V5c0RhdGEgPSByZXMuZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4geworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBpbmRleDogaW5kZXgrKywKKyAgICAgICAgICAgIGNhY2hlS2V5OiBpdGVtCisgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgICBzZXRDYWNoZUtleXMoa2V5c0RhdGEpOworICAgICAgfQorICAgIH0pOworICB9OworCisgIGNvbnN0IG9uQ2xlYXJBbGwgPSBhc3luYyAoKSA9PiB7CisgICAgY2xlYXJDYWNoZUFsbCgpLnRoZW4ocmVzID0+IHsKKyAgICAgIGlmKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCLmuIXnkIblhajpg6jnvJPlrZjmiJDlip8iKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfTsKKworICBjb25zdCBvbkNsZWFyQWxsRmFpbGVkID0gKGVycm9ySW5mbzogYW55KSA9PiB7CisgICAgbWVzc2FnZS5lcnJvcignRmFpbGVkOicsIGVycm9ySW5mbyk7CisgIH07CisKKyAgY29uc3QgcmVmcmVzaENhY2hlTmFtZXMgPSAoKSA9PiB7CisgICAgZ2V0Q2FjaGVOYW1lcygpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygi5Yi35paw57yT5a2Y5YiX6KGo5oiQ5YqfIik7CisgIH07CisKKyAgY29uc3QgcmVmcmVzaENhY2hlS2V5cyA9ICgpID0+IHsKKyAgICBnZXRDYWNoZUtleXMoY3VycmVudENhY2hlTmFtZSk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCLliLfmlrDplK7lkI3liJfooajmiJDlip8iKTsKKyAgfTsKKworICBjb25zdCBjb2x1bW5zID0gWworICAgIHsKKyAgICAgIHRpdGxlOiAn57yT5a2Y5ZCN56ewJywKKyAgICAgIGRhdGFJbmRleDogJ2NhY2hlTmFtZScsCisgICAgICBrZXk6ICdjYWNoZU5hbWUnLAorICAgICAgcmVuZGVyOiAoXzogYW55LCByZWNvcmQ6IGFueSkgPT4geworICAgICAgICByZXR1cm4gcmVjb3JkLmNhY2hlTmFtZS5yZXBsYWNlKCI6IiwgIiIpOworICAgICAgfQorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6ICflpIfms6gnLAorICAgICAgZGF0YUluZGV4OiAncmVtYXJrJywKKyAgICAgIGtleTogJ3JlbWFyaycsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzQwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF86IGFueSwgcmVjb3JkOiBBUEkuTW9uaXRvci5DYWNoZUNvbnRlbnQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgY2xlYXJDYWNoZU5hbWUocmVjb3JkLmNhY2hlTmFtZSkudGhlbihyZXMgPT4geworICAgICAgICAgICAgICBpZihyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCLmuIXnkIbnvJPlrZjlkI3np7BbIiArIHJlY29yZC5jYWNoZU5hbWUgKyAiXeaIkOWKnyIpOworICAgICAgICAgICAgICAgIGdldENhY2hlS2V5cyhjdXJyZW50Q2FjaGVOYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUiIGRlZmF1bHRNZXNzYWdlPSLliKDpmaQiIC8+CisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0KKyAgICB9CisgIF07CisKKyAgY29uc3QgY2FjaGVLZXlzQ29sdW1ucyA9IFsKKyAgICB7CisgICAgICB0aXRsZTogJ+W6j+WPtycsCisgICAgICBkYXRhSW5kZXg6ICdpbmRleCcsCisgICAgICBrZXk6ICdpbmRleCcKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn57yT5a2Y6ZSu5ZCNJywKKyAgICAgIGRhdGFJbmRleDogJ2NhY2hlS2V5JywKKyAgICAgIGtleTogJ2NhY2hlS2V5JywKKyAgICAgIHJlbmRlcjogKF86IGFueSwgcmVjb3JkOiBhbnkpID0+IHsKKyAgICAgICAgcmV0dXJuIHJlY29yZC5jYWNoZUtleS5yZXBsYWNlKGN1cnJlbnRDYWNoZU5hbWUsICIiKTsKKyAgICAgIH0KKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnNDBweCcsCisgICAgICB2YWx1ZVR5cGU6ICdvcHRpb24nLAorICAgICAgcmVuZGVyOiAoXzogYW55LCByZWNvcmQ6IEFQSS5Nb25pdG9yLkNhY2hlQ29udGVudCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBjb25zb2xlLmxvZyhyZWNvcmQpCisgICAgICAgICAgICBjbGVhckNhY2hlS2V5KHJlY29yZC5jYWNoZUtleSkudGhlbihyZXMgPT4geworICAgICAgICAgICAgICBpZihyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCLmuIXnkIbnvJPlrZjplK7lkI1bIiArIHJlY29yZC5jYWNoZUtleSArICJd5oiQ5YqfIik7CisgICAgICAgICAgICAgICAgZ2V0Q2FjaGVLZXlzKGN1cnJlbnRDYWNoZU5hbWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSIgZGVmYXVsdE1lc3NhZ2U9IuWIoOmZpCIgLz4KKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgXQorICAgIH0KKyAgXTsKKworICByZXR1cm4gKAorICAgIDxkaXY+CisgICAgICA8Um93IGd1dHRlcj17WzI0LCAyNF19PgorICAgICAgICA8Q29sIHNwYW49ezh9PgorICAgICAgICAgIDxDYXJkIHRpdGxlPSLnvJPlrZjliJfooagiIGV4dHJhPXs8QnV0dG9uIGljb249ezxSZWxvYWRPdXRsaW5lZCAvPn0gb25DbGljaz17KCk9PnsgcmVmcmVzaENhY2hlTmFtZXMoKX19IHR5cGU9ImxpbmsiIC8+fSBjbGFzc05hbWU9e3N0eWxlcy5jYXJkfT4KKyAgICAgICAgICAgIDxUYWJsZQorICAgICAgICAgICAgICByb3dLZXk9ImNhY2hlTmFtZSIKKyAgICAgICAgICAgICAgZGF0YVNvdXJjZT17Y2FjaGVOYW1lc30KKyAgICAgICAgICAgICAgY29sdW1ucz17Y29sdW1uc30KKyAgICAgICAgICAgICAgb25Sb3c9eyhyZWNvcmQ6IEFQSS5Nb25pdG9yLkNhY2hlQ29udGVudCkgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRDYWNoZU5hbWUocmVjb3JkLmNhY2hlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdldENhY2hlS2V5cyhyZWNvcmQuY2FjaGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgPC9DYXJkPgorICAgICAgICA8L0NvbD4KKyAgICAgICAgPENvbCBzcGFuPXs4fT4KKyAgICAgICAgICA8Q2FyZCB0aXRsZT0i6ZSu5ZCN5YiX6KGoIiBleHRyYT17PEJ1dHRvbiBpY29uPXs8UmVsb2FkT3V0bGluZWQgLz59IG9uQ2xpY2s9eygpPT57IHJlZnJlc2hDYWNoZUtleXMoKX19IHR5cGU9ImxpbmsiIC8+fSBjbGFzc05hbWU9e3N0eWxlcy5jYXJkfT4KKyAgICAgICAgICAgIDxUYWJsZQorICAgICAgICAgICAgICByb3dLZXk9ImluZGV4IgorICAgICAgICAgICAgICBkYXRhU291cmNlPXtjYWNoZUtleXN9CisgICAgICAgICAgICAgIGNvbHVtbnM9e2NhY2hlS2V5c0NvbHVtbnN9CisgICAgICAgICAgICAgIG9uUm93PXsocmVjb3JkOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4geworICAgICAgICAgICAgICAgICAgICBnZXRDYWNoZVZhbHVlKGN1cnJlbnRDYWNoZU5hbWUsIHJlY29yZC5jYWNoZUtleSkudGhlbihyZXMgPT4geworICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVOYW1lOiByZXMuZGF0YS5jYWNoZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiByZXMuZGF0YS5jYWNoZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVWYWx1ZTogcmVzLmRhdGEuY2FjaGVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYXJrOiByZXMuZGF0YS5yZW1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgLz4KKyAgICAgICAgICA8L0NhcmQ+CisgICAgICAgIDwvQ29sPgorICAgICAgICA8Q29sIHNwYW49ezh9PgorICAgICAgICAgIDxDYXJkIHRpdGxlPSLnvJPlrZjlhoXlrrkiIGV4dHJhPXs8QnV0dG9uIGljb249ezxSZWxvYWRPdXRsaW5lZCAvPn0gb25DbGljaz17KCk9Pnsgb25DbGVhckFsbCgpfX0gdHlwZT0ibGluayIgPua4heeQhuWFqOmDqDwvQnV0dG9uPn0gY2xhc3NOYW1lPXtzdHlsZXMuY2FyZH0+CisgICAgICAgICAgICA8UHJvRm9ybQorICAgICAgICAgICAgICBuYW1lPSJiYXNpYyIKKyAgICAgICAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgICAgICAgbGFiZWxDb2w9e3sgc3BhbjogOCB9fQorICAgICAgICAgICAgICB3cmFwcGVyQ29sPXt7IHNwYW46IDE2IH19CisgICAgICAgICAgICAgIG9uRmluaXNoPXtvbkNsZWFyQWxsfQorICAgICAgICAgICAgICBvbkZpbmlzaEZhaWxlZD17b25DbGVhckFsbEZhaWxlZH0KKyAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPSJvZmYiCisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxGb3JtLkl0ZW0KKyAgICAgICAgICAgICAgICBsYWJlbD0i57yT5a2Y5ZCN56ewIgorICAgICAgICAgICAgICAgIG5hbWU9ImNhY2hlTmFtZSIKKyAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxJbnB1dCAvPgorICAgICAgICAgICAgICA8L0Zvcm0uSXRlbT4KKyAgICAgICAgICAgICAgPEZvcm0uSXRlbQorICAgICAgICAgICAgICAgIGxhYmVsPSLnvJPlrZjplK7lkI0iCisgICAgICAgICAgICAgICAgbmFtZT0iY2FjaGVLZXkiCisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8SW5wdXQgLz4KKyAgICAgICAgICAgICAgPC9Gb3JtLkl0ZW0+CisgICAgICAgICAgICAgIDxGb3JtLkl0ZW0KKyAgICAgICAgICAgICAgICBsYWJlbD0i57yT5a2Y5YaF5a65IgorICAgICAgICAgICAgICAgIG5hbWU9ImNhY2hlVmFsdWUiCisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8VGV4dEFyZWEgYXV0b1NpemU9e3sgbWluUm93czogMiB9fSAvPgorICAgICAgICAgICAgICA8L0Zvcm0uSXRlbT4KKyAgICAgICAgICAgIDwvUHJvRm9ybT4KKyAgICAgICAgICA8L0NhcmQ+CisgICAgICAgIDwvQ29sPgorICAgICAgPC9Sb3c+CisgICAgPC9kaXY+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBDYWNoZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9DYWNoZS9MaXN0L2luZGV4Lmxlc3MgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9DYWNoZS9MaXN0L2luZGV4Lmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1YWFjZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0NhY2hlL0xpc3QvaW5kZXgubGVzcwpAQCAtMCwwICsxLDEwIEBACisKKworCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjEvMDkvMTYKKyAqCisgKiAqLworCmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9DYWNoZS9pbmRleC5sZXNzIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvQ2FjaGUvaW5kZXgubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTEyYzUwCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvQ2FjaGUvaW5kZXgubGVzcwpAQCAtMCwwICsxLDMzIEBACisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMS8wOS8xNgorICogCisgKiAqLworCisgCisuY2FyZCB7CisgIG1hcmdpbi1ib3R0b206IDEycHg7Cit9CisKKworLm1pbmlDaGFydCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIC5jaGFydENvbnRlbnQgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206IC0yOHB4OworICAgIHdpZHRoOiAxMDAlOworICAgID4gZGl2IHsKKyAgICAgIG1hcmdpbjogMCAtNXB4OworICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICB9CisgIH0KKyAgLmNoYXJ0TG9hZGluZyB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMTZweDsKKyAgICBsZWZ0OiA1MCU7CisgICAgbWFyZ2luLWxlZnQ6IC03cHg7CisgIH0KK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0NhY2hlL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0NhY2hlL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzI0N2VlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvQ2FjaGUvaW5kZXgudHN4CkBAIC0wLDAgKzEsMjAxIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IENhcmQsIENvbCwgUm93LCBUYWJsZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgRGF0YUl0ZW0gfSBmcm9tICdAYW50di9nMnBsb3QvZXNtL2ludGVyZmFjZS9jb25maWcnOworaW1wb3J0IHsgR2F1Z2UsIFBpZSB9IGZyb20gJ0BhbnQtZGVzaWduL3Bsb3RzJzsKK2ltcG9ydCBzdHlsZXMgZnJvbSAnLi9pbmRleC5sZXNzJzsKK2ltcG9ydCB7IGdldENhY2hlSW5mbyB9IGZyb20gJ0Avc2VydmljZXMvbW9uaXRvci9jYWNoZSc7CisKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIxLzA5LzE2CisgKgorICogKi8KKworCitjb25zdCBjb2x1bW5zID0gWworICB7CisgICAgdGl0bGU6ICdjb2wxJywKKyAgICBkYXRhSW5kZXg6ICdjb2wxJywKKyAgICBrZXk6ICdjb2wxJywKKyAgfSwKKyAgeworICAgIHRpdGxlOiAnY29sMicsCisgICAgZGF0YUluZGV4OiAnY29sMicsCisgICAga2V5OiAnY29sMicsCisgIH0sCisgIHsKKyAgICB0aXRsZTogJ2NvbDMnLAorICAgIGRhdGFJbmRleDogJ2NvbDMnLAorICAgIGtleTogJ2NvbDMnLAorICB9LAorICB7CisgICAgdGl0bGU6ICdjb2w0JywKKyAgICBkYXRhSW5kZXg6ICdjb2w0JywKKyAgICBrZXk6ICdjb2w0JywKKyAgfSwKKyAgeworICAgIHRpdGxlOiAnY29sNScsCisgICAgZGF0YUluZGV4OiAnY29sNScsCisgICAga2V5OiAnY29sNScsCisgIH0sCisgIHsKKyAgICB0aXRsZTogJ2NvbDYnLAorICAgIGRhdGFJbmRleDogJ2NvbDYnLAorICAgIGtleTogJ2NvbDYnLAorICB9LAorICB7CisgICAgdGl0bGU6ICdjb2w3JywKKyAgICBkYXRhSW5kZXg6ICdjb2w3JywKKyAgICBrZXk6ICdjb2w3JywKKyAgfSwKKyAgeworICAgIHRpdGxlOiAnY29sOCcsCisgICAgZGF0YUluZGV4OiAnY29sOCcsCisgICAga2V5OiAnY29sOCcsCisgIH0sCitdOworCitjb25zdCB1c2FnZUZvcm1hdHRlciA9ICh2YWw6IHN0cmluZyk6IHN0cmluZyA9PiB7CisgIHN3aXRjaCAodmFsKSB7CisgICAgY2FzZSAnMTAnOgorICAgICAgcmV0dXJuICcxMDAlJzsKKyAgICBjYXNlICc4JzoKKyAgICAgIHJldHVybiAnODAlJzsKKyAgICBjYXNlICc2JzoKKyAgICAgIHJldHVybiAnNjAlJzsKKyAgICBjYXNlICc0JzoKKyAgICAgIHJldHVybiAnNDAlJzsKKyAgICBjYXNlICcyJzoKKyAgICAgIHJldHVybiAnMjAlJzsKKyAgICBjYXNlICcwJzoKKyAgICAgIHJldHVybiAnMCUnOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gJyc7CisgIH0KK307CisKK2NvbnN0IENhY2hlSW5mbzogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IFtiYXNlSW5mb0RhdGEsIHNldEJhc2VJbmZvRGF0YV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW21lbVVzYWdlLCBzZXRNZW1Vc2FnZV0gPSB1c2VTdGF0ZTxOdW1iZXI+KDApOworICBjb25zdCBbbWVtVXNhZ2VUaXRsZSwgc2V0TWVtVXNhZ2VUaXRsZV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2NtZEluZm9EYXRhLCBzZXRDbWRJbmZvRGF0YV0gPSB1c2VTdGF0ZTxEYXRhSXRlbVtdPihbXSk7CisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0Q2FjaGVJbmZvKCkudGhlbigocmVzKSA9PiB7CisgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICBjb25zdCBiYXNlaW5mbyA9IFtdOworICAgICAgICBiYXNlaW5mby5wdXNoKHsKKyAgICAgICAgICBjb2wxOiAnUmVkaXPniYjmnKwnLAorICAgICAgICAgIGNvbDI6IHJlcy5kYXRhLmluZm8ucmVkaXNfdmVyc2lvbiwKKyAgICAgICAgICBjb2wzOiAn6L+Q6KGM5qih5byPJywKKyAgICAgICAgICBjb2w0OiByZXMuZGF0YS5pbmZvLnJlZGlzX21vZGUgPT09ICdzdGFuZGFsb25lJyA/ICfljZXmnLonIDogJ+mbhue+pCcsCisgICAgICAgICAgY29sNTogJ+err+WPoycsCisgICAgICAgICAgY29sNjogcmVzLmRhdGEuaW5mby50Y3BfcG9ydCwKKyAgICAgICAgICBjb2w3OiAn5a6i5oi356uv5pWwJywKKyAgICAgICAgICBjb2w4OiByZXMuZGF0YS5pbmZvLmNvbm5lY3RlZF9jbGllbnRzLAorICAgICAgICB9KTsKKyAgICAgICAgYmFzZWluZm8ucHVzaCh7CisgICAgICAgICAgY29sMTogJ+i/kOihjOaXtumXtCjlpKkpJywKKyAgICAgICAgICBjb2wyOiByZXMuZGF0YS5pbmZvLnVwdGltZV9pbl9kYXlzLAorICAgICAgICAgIGNvbDM6ICfkvb/nlKjlhoXlrZgnLAorICAgICAgICAgIGNvbDQ6IHJlcy5kYXRhLmluZm8udXNlZF9tZW1vcnlfaHVtYW4sCisgICAgICAgICAgY29sNTogJ+S9v+eUqENQVScsCisgICAgICAgICAgY29sNjogYCR7cmVzLmRhdGEuaW5mby51c2VkX2NwdV91c2VyX2NoaWxkcmVufSVgLAorICAgICAgICAgIGNvbDc6ICflhoXlrZjphY3nva4nLAorICAgICAgICAgIGNvbDg6IHJlcy5kYXRhLmluZm8ubWF4bWVtb3J5X2h1bWFuLAorICAgICAgICB9KTsKKyAgICAgICAgYmFzZWluZm8ucHVzaCh7CisgICAgICAgICAgY29sMTogJ0FPRuaYr+WQpuW8gOWQrycsCisgICAgICAgICAgY29sMjogcmVzLmRhdGEuaW5mby5hb2ZfZW5hYmxlZCA9PT0gJzAnID8gJ+WQpicgOiAn5pivJywKKyAgICAgICAgICBjb2wzOiAnUkRC5piv5ZCm5oiQ5YqfJywKKyAgICAgICAgICBjb2w0OiByZXMuZGF0YS5pbmZvLnJkYl9sYXN0X2Jnc2F2ZV9zdGF0dXMsCisgICAgICAgICAgY29sNTogJ0tleeaVsOmHjycsCisgICAgICAgICAgY29sNjogcmVzLmRhdGEuZGJTaXplLAorICAgICAgICAgIGNvbDc6ICfnvZHnu5zlhaXlj6Mv5Ye65Y+jJywKKyAgICAgICAgICBjb2w4OiBgJHtyZXMuZGF0YS5pbmZvLmluc3RhbnRhbmVvdXNfaW5wdXRfa2Jwc30vJHtyZXMuZGF0YS5pbmZvLmluc3RhbnRhbmVvdXNfb3V0cHV0X2ticHN9a3BzYCwKKyAgICAgICAgfSk7CisgICAgICAgIHNldEJhc2VJbmZvRGF0YShiYXNlaW5mbyk7CisKKyAgICAgICAgY29uc3QgZGF0YTogVmlzaXREYXRhVHlwZVtdID0gcmVzLmRhdGEuY29tbWFuZFN0YXRzLm1hcCgoaXRlbSkgPT4geworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICB4OiBpdGVtLm5hbWUsCisgICAgICAgICAgICB5OiBOdW1iZXIoaXRlbS52YWx1ZSksCisgICAgICAgICAgfTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgc2V0Q21kSW5mb0RhdGEoZGF0YSk7CisgICAgICAgIHNldE1lbVVzYWdlVGl0bGUocmVzLmRhdGEuaW5mby51c2VkX21lbW9yeV9odW1hbik7CisgICAgICAgIHNldE1lbVVzYWdlKHJlcy5kYXRhLmluZm8udXNlZF9tZW1vcnkgLyByZXMuZGF0YS5pbmZvLnRvdGFsX3N5c3RlbV9tZW1vcnkpOworICAgICAgfQorICAgIH0pOworICB9LCBbXSk7CisKKyAgcmV0dXJuICgKKyAgICA8ZGl2PgorICAgICAgPFJvdyBndXR0ZXI9e1syNCwgMjRdfT4KKyAgICAgICAgPENvbCBzcGFuPXsyNH0+CisgICAgICAgICAgPENhcmQgdGl0bGU9IuWfuuacrOS/oeaBryIgY2xhc3NOYW1lPXtzdHlsZXMuY2FyZH0+CisgICAgICAgICAgICA8VGFibGUKKyAgICAgICAgICAgICAgcm93S2V5PSJjb2wxIgorICAgICAgICAgICAgICBwYWdpbmF0aW9uPXtmYWxzZX0KKyAgICAgICAgICAgICAgc2hvd0hlYWRlcj17ZmFsc2V9CisgICAgICAgICAgICAgIGRhdGFTb3VyY2U9e2Jhc2VJbmZvRGF0YX0KKyAgICAgICAgICAgICAgY29sdW1ucz17Y29sdW1uc30KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgPC9DYXJkPgorICAgICAgICA8L0NvbD4KKyAgICAgIDwvUm93PgorICAgICAgPFJvdyBndXR0ZXI9e1syNCwgMjRdfT4KKyAgICAgICAgPENvbCBzcGFuPXsxMn0+CisgICAgICAgICAgPENhcmQgdGl0bGU9IuWRveS7pOe7n+iuoSIgY2xhc3NOYW1lPXtzdHlsZXMuY2FyZH0+CisgICAgICAgICAgICA8UGllCisgICAgICAgICAgICAgIGhlaWdodD17MzIwfQorICAgICAgICAgICAgICByYWRpdXM9ezAuOH0KKyAgICAgICAgICAgICAgaW5uZXJSYWRpdXM9ezAuNX0KKyAgICAgICAgICAgICAgYW5nbGVGaWVsZD0ieSIKKyAgICAgICAgICAgICAgY29sb3JGaWVsZD0ieCIKKyAgICAgICAgICAgICAgZGF0YT17Y21kSW5mb0RhdGEgYXMgYW55fQorICAgICAgICAgICAgICBsZWdlbmQ9e2ZhbHNlfQorICAgICAgICAgICAgICBsYWJlbD17eworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3BpZGVyJywKKyAgICAgICAgICAgICAgICB0ZXh0OiAoaXRlbTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSA9PiB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aXRlbS54fTogJHtpdGVtLnl9YDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgLz4KKyAgICAgICAgICA8L0NhcmQ+CisgICAgICAgIDwvQ29sPgorICAgICAgICA8Q29sIHNwYW49ezEyfT4KKyAgICAgICAgICA8Q2FyZCB0aXRsZT0i5YaF5a2Y5L+h5oGvIiBjbGFzc05hbWU9e3N0eWxlcy5jYXJkfT4KKyAgICAgICAgICAgIDxHYXVnZQorICAgICAgICAgICAgICB0aXRsZT17bWVtVXNhZ2VUaXRsZX0KKyAgICAgICAgICAgICAgaGVpZ2h0PXszMjB9CisgICAgICAgICAgICAgIHBlcmNlbnQ9e21lbVVzYWdlfQorICAgICAgICAgICAgICBmb3JtYXR0ZXI9e3VzYWdlRm9ybWF0dGVyfQorICAgICAgICAgICAgICBwYWRkaW5nPXstMTZ9CisgICAgICAgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICgpID0+IHsgcmV0dXJuIG1lbVVzYWdlLnRvRml4ZWQoMikudG9TdHJpbmcoKSArICclJ30sCisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgIGRhdGE9eworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRhcmdldDogbWVtVXNhZ2UsCisgICAgICAgICAgICAgICAgICB0b3RhbDogMTAwLAorICAgICAgICAgICAgICAgICAgbmFtZTogJ3Njb3JlJywKKyAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHM6IFsyMCwgNDAsIDYwLCA4MCwgMTAwXSwKKyAgICAgICAgICAgICAgICB9IGFzIGFueQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1ldGE9e3sKKyAgICAgICAgICAgICAgICBjb2xvcjogeworICAgICAgICAgICAgICAgICAgcmFuZ2U6IFsnI0MzRjcxRicsICcjQjVFNjFEJywgJyNGRkM5MEUnLCAnI0ZGN0YyNycsICcjRkYyNTE4J10sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgPC9DYXJkPgorICAgICAgICA8L0NvbD4KKyAgICAgIDwvUm93PgorICAgIDwvZGl2PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgQ2FjaGVJbmZvOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvRHJ1aWQvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvRHJ1aWQvaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjkyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9EcnVpZC9pbmRleC50c3gKQEAgLTAsMCArMSwzMSBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsgCisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8wNworICogCisgKiAqLworCitjb25zdCBEcnVpZEluZm86IFJlYWN0LkZDID0gKCkgPT4geworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGNvbnN0IGZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JkSWZyYW1lJyk7CisgICAgaWYgKGZyYW1lKSB7CisgICAgICBjb25zdCBkZXZpY2VXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKKyAgICAgIGNvbnN0IGRldmljZUhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CisgICAgICBmcmFtZS5zdHlsZS53aWR0aCA9IGAke051bWJlcihkZXZpY2VXaWR0aCkgLSAyMjB9cHhgOworICAgICAgZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7TnVtYmVyKGRldmljZUhlaWdodCkgLSAxMjB9cHhgOworICAgIH0KKyAgfSk7CisKKyAgcmV0dXJuICgKKyAgICA8aWZyYW1lCisgICAgICBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBib3JkZXI6ICcwcHgnLCBoZWlnaHQ6ICcxMDAlJyB9fQorICAgICAgc3JjPXtgL2FwaS9kcnVpZC9sb2dpbi5odG1sYH0KKyAgICAgIGlkPSJiZElmcmFtZSIKKyAgICAgLz4KKyAgICAvLyA8L1dyYXBDb250ZW50PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgRHJ1aWRJbmZvOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvSm9iL2RldGFpbC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Kb2IvZGV0YWlsLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjdiZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvSm9iL2RldGFpbC50c3gKQEAgLTAsMCArMSwxMzEgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBNb2RhbCwgRGVzY3JpcHRpb25zLCBCdXR0b24gfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IGdldFZhbHVlRW51bUxhYmVsIH0gZnJvbSAnQC91dGlscy9vcHRpb25zJzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8wNworICogCisgKiAqLworCitleHBvcnQgdHlwZSBPcGVybG9nRm9ybVZhbHVlVHlwZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuTW9uaXRvci5Kb2I+OworCitleHBvcnQgdHlwZSBPcGVybG9nRm9ybVByb3BzID0geworICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IE9wZXJsb2dGb3JtVmFsdWVUeXBlKSA9PiB2b2lkOworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLk1vbml0b3IuSm9iPjsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IE9wZXJsb2dGb3JtOiBSZWFjdC5GQzxPcGVybG9nRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCB7IHZhbHVlcywgc3RhdHVzT3B0aW9ucyB9ID0gcHJvcHM7CisKKyAgdXNlRWZmZWN0KCgpID0+IHt9LCBbcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIGNvbnN0IG1pc2ZpcmVQb2xpY3k6IGFueSA9IHsKKyAgICAnMCc6ICfpu5jorqTnrZbnlaUnLAorICAgICcxJzogJ+eri+WNs+aJp+ihjCcsCisgICAgJzInOiAn5omn6KGM5LiA5qyhJywKKyAgICAnMyc6ICfmlL7lvIPmiafooYwnLAorICB9OworCisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICB9OworCisgIHJldHVybiAoCisgICAgPE1vZGFsCisgICAgICB3aWR0aD17ODAwfQorICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgIGlkOiAnbW9uaXRvci5qb2IuZGV0YWlsJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfmk43kvZzml6Xlv5for6bnu4bkv6Hmga8nLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgICBmb290ZXI9e1sKKyAgICAgICAgPEJ1dHRvbiBrZXk9ImJhY2siIG9uQ2xpY2s9e2hhbmRsZUNhbmNlbH0+CisgICAgICAgICAg5YWz6ZetCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF19CisgICAgPgorICAgICAgPERlc2NyaXB0aW9ucyBjb2x1bW49ezI0fT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5qb2JfaWQiIGRlZmF1bHRNZXNzYWdlPSLku7vliqHnvJblj7ciIC8+fQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5qb2JJZH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5qb2JfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IuS7u+WKoeWQjeensCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmpvYk5hbWV9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2Iuam9iX2dyb3VwIiBkZWZhdWx0TWVzc2FnZT0i5Lu75Yqh57uE5ZCNIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuam9iR3JvdXB9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IuY29uY3VycmVudCIgZGVmYXVsdE1lc3NhZ2U9IuaYr+WQpuW5tuWPkeaJp+ihjCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmNvbmN1cnJlbnQgPT09ICcxJyA/ICfnpoHmraInIDogJ+WFgeiuuCd9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXsKKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5taXNmaXJlX3BvbGljeSIgZGVmYXVsdE1lc3NhZ2U9IuiuoeWIkuaJp+ihjOmUmeivr+etlueVpSIgLz4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICB7bWlzZmlyZVBvbGljeVt2YWx1ZXMubWlzZmlyZVBvbGljeSA/IHZhbHVlcy5taXNmaXJlUG9saWN5IDogJzAnXX0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5jcmVhdGVfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuWIm+W7uuaXtumXtCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmNyZWF0ZVRpbWU/LnRvU3RyaW5nKCl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2Iuc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i54q25oCBIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtnZXRWYWx1ZUVudW1MYWJlbChzdGF0dXNPcHRpb25zLCB2YWx1ZXMuc3RhdHVzLCAn5pyq55+lJyl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXsKKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5uZXh0X3ZhbGlkX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLkuIvmrKHmiafooYzml7bpl7QiIC8+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5uZXh0VmFsaWRUaW1lfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsyNH0KKyAgICAgICAgICBsYWJlbD17CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IuY3Jvbl9leHByZXNzaW9uIiBkZWZhdWx0TWVzc2FnZT0iY3JvbuaJp+ihjOihqOi+vuW8jyIgLz4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmNyb25FeHByZXNzaW9ufQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsyNH0KKyAgICAgICAgICBsYWJlbD17CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IuaW52b2tlX3RhcmdldCIgZGVmYXVsdE1lc3NhZ2U9Iuiwg+eUqOebruagh+Wtl+espuS4siIgLz4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmludm9rZVRhcmdldH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgIDwvRGVzY3JpcHRpb25zPgorICAgIDwvTW9kYWw+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBPcGVybG9nRm9ybTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYi9lZGl0LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYi9lZGl0LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGJmYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvSm9iL2VkaXQudHN4CkBAIC0wLDAgKzEsMjMyIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsKKyAgUHJvRm9ybSwKKyAgUHJvRm9ybURpZ2l0LAorICBQcm9Gb3JtVGV4dCwKKyAgUHJvRm9ybVRleHRBcmVhLAorICBQcm9Gb3JtUmFkaW8sCisgIFByb0Zvcm1TZWxlY3QsCisgIFByb0Zvcm1DYXB0Y2hhLAorfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBGb3JtLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgRGljdE9wdGlvblR5cGUsIERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5a6a5pe25Lu75Yqh6LCD5bqmIEVkaXQgRm9ybQorICogCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyCisgKiBAZGF0ZSAyMDIzLTAyLTA3CisgKi8KKworZXhwb3J0IHR5cGUgSm9iRm9ybURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFBhcnRpYWw8QVBJLk1vbml0b3IuSm9iPjsKKworZXhwb3J0IHR5cGUgSm9iRm9ybVByb3BzID0geworICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IEpvYkZvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogSm9iRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuTW9uaXRvci5Kb2I+OworICBqb2JHcm91cE9wdGlvbnM6IERpY3RPcHRpb25UeXBlW107CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7Cit9OworCitjb25zdCBKb2JGb3JtOiBSZWFjdC5GQzxKb2JGb3JtUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgIGNvbnN0IFtmb3JtXSA9IEZvcm0udXNlRm9ybSgpOworICBjb25zdCB7IGpvYkdyb3VwT3B0aW9ucywgc3RhdHVzT3B0aW9ucyB9ID0gcHJvcHM7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgICAgZm9ybS5zZXRGaWVsZHNWYWx1ZSh7CisgICAgICBqb2JJZDogcHJvcHMudmFsdWVzLmpvYklkLAorICAgICAgam9iTmFtZTogcHJvcHMudmFsdWVzLmpvYk5hbWUsCisgICAgICBqb2JHcm91cDogcHJvcHMudmFsdWVzLmpvYkdyb3VwLAorICAgICAgaW52b2tlVGFyZ2V0OiBwcm9wcy52YWx1ZXMuaW52b2tlVGFyZ2V0LAorICAgICAgY3JvbkV4cHJlc3Npb246IHByb3BzLnZhbHVlcy5jcm9uRXhwcmVzc2lvbiwKKyAgICAgIG1pc2ZpcmVQb2xpY3k6IHByb3BzLnZhbHVlcy5taXNmaXJlUG9saWN5LAorICAgICAgY29uY3VycmVudDogcHJvcHMudmFsdWVzLmNvbmN1cnJlbnQsCisgICAgICBzdGF0dXM6IHByb3BzLnZhbHVlcy5zdGF0dXMsCisgICAgICBjcmVhdGVCeTogcHJvcHMudmFsdWVzLmNyZWF0ZUJ5LAorICAgICAgY3JlYXRlVGltZTogcHJvcHMudmFsdWVzLmNyZWF0ZVRpbWUsCisgICAgICB1cGRhdGVCeTogcHJvcHMudmFsdWVzLnVwZGF0ZUJ5LAorICAgICAgdXBkYXRlVGltZTogcHJvcHMudmFsdWVzLnVwZGF0ZVRpbWUsCisgICAgICByZW1hcms6IHByb3BzLnZhbHVlcy5yZW1hcmssCisgICAgfSk7CisgIH0sIFtmb3JtLCBwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGZvcm0uc3VibWl0KCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICAgIGZvcm0ucmVzZXRGaWVsZHMoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgIHByb3BzLm9uU3VibWl0KHZhbHVlcyBhcyBKb2JGb3JtRGF0YSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdtb25pdG9yLmpvYi50aXRsZScsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn57yW6L6R5a6a5pe25Lu75Yqh6LCD5bqmJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKyAgICAgIDxQcm9Gb3JtCisgICAgICAgIGZvcm09e2Zvcm19CisgICAgICAgIGdyaWQ9e3RydWV9CisgICAgICAgIHN1Ym1pdHRlcj17ZmFsc2V9CisgICAgICAgIGxheW91dD0iaG9yaXpvbnRhbCIKKyAgICAgICAgb25GaW5pc2g9e2hhbmRsZUZpbmlzaH0+CisgICAgICAgIDxQcm9Gb3JtRGlnaXQKKyAgICAgICAgICBuYW1lPSJqb2JJZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnbW9uaXRvci5qb2Iuam9iX2lkJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5Lu75Yqh57yW5Y+3JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5Lu75Yqh57yW5Y+3IgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeS7u+WKoee8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeS7u+WKoee8luWPt++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImpvYk5hbWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ21vbml0b3Iuam9iLmpvYl9uYW1lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5Lu75Yqh5ZCN56ewJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5Lu75Yqh5ZCN56ewIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeS7u+WKoeWQjeensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeS7u+WKoeWQjeensO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtU2VsZWN0CisgICAgICAgICAgbmFtZT0iam9iR3JvdXAiCisgICAgICAgICAgb3B0aW9ucz17am9iR3JvdXBPcHRpb25zfQorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdtb25pdG9yLmpvYi5qb2JfZ3JvdXAnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfku7vliqHnu4TlkI0nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXku7vliqHnu4TlkI0iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5Lu75Yqh57uE5ZCN77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5Lu75Yqh57uE5ZCN77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0QXJlYQorICAgICAgICAgIG5hbWU9Imludm9rZVRhcmdldCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnbW9uaXRvci5qb2IuaW52b2tlX3RhcmdldCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iwg+eUqOebruagh+Wtl+espuS4sicsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeiwg+eUqOebruagh+Wtl+espuS4siIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeiwg+eUqOebruagh+Wtl+espuS4su+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeiwg+eUqOebruagh+Wtl+espuS4su+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtQ2FwdGNoYQorICAgICAgICAgIG5hbWU9ImNyb25FeHByZXNzaW9uIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdtb25pdG9yLmpvYi5jcm9uX2V4cHJlc3Npb24nLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdjcm9u5omn6KGM6KGo6L6+5byPJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjYXB0Y2hhVGV4dFJlbmRlcj17KCkgPT4gIueUn+aIkOihqOi+vuW8jyJ9CisgICAgICAgICAgb25HZXRDYXB0Y2hhPXsoKSA9PiB7CisgICAgICAgICAgICAvLyBmb3JtLnNldEZpZWxkVmFsdWUoJ2Nyb25FeHByZXNzaW9uJywgJzAvMjAgKiAqICogKiA/Jyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geworICAgICAgICAgICAgICByZWplY3QoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICBuYW1lPSJtaXNmaXJlUG9saWN5IgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdtb25pdG9yLmpvYi5taXNmaXJlX3BvbGljeScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iuoeWIkuaJp+ihjOmUmeivr+etlueVpScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeiuoeWIkuaJp+ihjOmUmeivr+etlueVpSIKKyAgICAgICAgICB2YWx1ZUVudW09e3sKKyAgICAgICAgICAgIDA6ICfnq4vljbPmiafooYwnLAorICAgICAgICAgICAgMTogJ+aJp+ihjOS4gOasoScsCisgICAgICAgICAgICAzOiAn5pS+5byD5omn6KGMJworICAgICAgICAgIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6K6h5YiS5omn6KGM6ZSZ6K+v562W55Wl77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6K6h5YiS5omn6KGM6ZSZ6K+v562W55Wl77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzPXt7CisgICAgICAgICAgICBvcHRpb25UeXBlOiAiYnV0dG9uIiwKKyAgICAgICAgICAgIGJ1dHRvblN0eWxlOiAic29saWQiCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIG5hbWU9ImNvbmN1cnJlbnQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ21vbml0b3Iuam9iLmNvbmN1cnJlbnQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfmmK/lkKblubblj5HmiafooYwnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmmK/lkKblubblj5HmiafooYwiCisgICAgICAgICAgdmFsdWVFbnVtPXt7CisgICAgICAgICAgICAwOiAn5YWB6K64JywKKyAgICAgICAgICAgIDE6ICfnpoHmraInLAorICAgICAgICAgIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5piv5ZCm5bm25Y+R5omn6KGM77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5piv5ZCm5bm25Y+R5omn6KGM77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzPXt7CisgICAgICAgICAgICBvcHRpb25UeXBlOiAiYnV0dG9uIiwKKyAgICAgICAgICAgIGJ1dHRvblN0eWxlOiAic29saWQiCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ21vbml0b3Iuam9iLnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeKtuaAgSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnirbmgIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnirbmgIHvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgPC9Qcm9Gb3JtPgorICAgIDwvTW9kYWw+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBKb2JGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvSm9iL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYi9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMzBkOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYi9pbmRleC50c3gKQEAgLTAsMCArMSw0NjAgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcywgaGlzdG9yeSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgRHJvcGRvd24sIEZvcm1JbnN0YW5jZSwgU3BhY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCwgRG93bk91dGxpbmVkLCBFZGl0T3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBnZXRKb2JMaXN0LCByZW1vdmVKb2IsIGFkZEpvYiwgdXBkYXRlSm9iLCBleHBvcnRKb2IsIHJ1bkpvYiB9IGZyb20gJ0Avc2VydmljZXMvbW9uaXRvci9qb2InOworaW1wb3J0IHsgZ2V0RGljdFNlbGVjdE9wdGlvbiwgZ2V0RGljdFZhbHVlRW51bSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL2RpY3QnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCBEZXRhaWxGb3JtIGZyb20gJy4vZGV0YWlsJzsKK2ltcG9ydCBEaWN0VGFnIGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworLyoqCisgKiDlrprml7bku7vliqHosIPluqYgTGlzdCBQYWdlCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlcgorICogQGRhdGUgMjAyMy0wMi0wNworICovCisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuTW9uaXRvci5Kb2IpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5re75YqgJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFkZEpvYih7IC4uLmZpZWxkcyB9KTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+a3u+WKoOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a3u+WKoOWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDmm7TmlrDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZVVwZGF0ZSA9IGFzeW5jIChmaWVsZHM6IEFQSS5Nb25pdG9yLkpvYikgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjmm7TmlrAnKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlSm9iKGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuTW9uaXRvci5Kb2JbXSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvd3MpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVKb2Ioc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cuam9iSWQpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZVJlbW92ZU9uZSA9IGFzeW5jIChzZWxlY3RlZFJvdzogQVBJLk1vbml0b3IuSm9iKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93KSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCBwYXJhbXMgPSBbc2VsZWN0ZWRSb3cuam9iSWRdOworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVKb2IocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5a+85Ye65pWw5o2uCisgKgorICovCitjb25zdCBoYW5kbGVFeHBvcnQgPSBhc3luYyAoKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWvvOWHuicpOworICB0cnkgeworICAgIGF3YWl0IGV4cG9ydEpvYigpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKworY29uc3QgSm9iVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworICBjb25zdCBbZGV0YWlsTW9kYWxWaXNpYmxlLCBzZXREZXRhaWxNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5Kb2I+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5Kb2JbXT4oW10pOworCisgIGNvbnN0IFtqb2JHcm91cE9wdGlvbnMsIHNldEpvYkdyb3VwT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFNlbGVjdE9wdGlvbignc3lzX2pvYl9ncm91cCcpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldEpvYkdyb3VwT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfbm9ybWFsX2Rpc2FibGUnKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXRTdGF0dXNPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxBUEkuTW9uaXRvci5Kb2I+W10gPSBbCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5qb2JfaWQiIGRlZmF1bHRNZXNzYWdlPSLku7vliqHnvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAnam9iSWQnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmpvYl9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5Lu75Yqh5ZCN56ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2pvYk5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICByZW5kZXI6IChkb20sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKAorICAgICAgICAgIDxhCisgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICAgIHNldERldGFpbE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICB7ZG9tfQorICAgICAgICAgIDwvYT4KKyAgICAgICAgKTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmpvYl9ncm91cCIgZGVmYXVsdE1lc3NhZ2U9IuS7u+WKoee7hOWQjSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdqb2JHcm91cCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIHZhbHVlRW51bTogam9iR3JvdXBPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcgb3B0aW9ucz17am9iR3JvdXBPcHRpb25zfSB2YWx1ZT17cmVjb3JkLmpvYkdyb3VwfSAvPik7CisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5pbnZva2VfdGFyZ2V0IiBkZWZhdWx0TWVzc2FnZT0i6LCD55So55uu5qCH5a2X56ym5LiyIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2ludm9rZVRhcmdldCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0YXJlYScsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmNyb25fZXhwcmVzc2lvbiIgZGVmYXVsdE1lc3NhZ2U9ImNyb27miafooYzooajovr7lvI8iIC8+LAorICAgICAgZGF0YUluZGV4OiAnY3JvbkV4cHJlc3Npb24nLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IueKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnMjIwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImVkaXQiCisgICAgICAgICAgaWNvbiA9IDxFZGl0T3V0bGluZWQgLz4KKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6am9iOmVkaXQnKX0KKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHJlY29yZCk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOe8lui+kQorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICB0eXBlPSJsaW5rIgorICAgICAgICAgIHNpemU9InNtYWxsIgorICAgICAgICAgIGRhbmdlcgorICAgICAgICAgIGtleT0iYmF0Y2hSZW1vdmUiCisgICAgICAgICAgaWNvbiA9IDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpqb2I6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxEcm9wZG93bgorICAgICAgICAgIGtleT0ibW9yZSIKKyAgICAgICAgICBtZW51PXt7CisgICAgICAgICAgICBpdGVtczogWworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFiZWw6ICfmiafooYzkuIDmrKEnLAorICAgICAgICAgICAgICAgIGtleTogJ3J1bk9uY2UnLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFiZWw6ICfor6bnu4YnLAorICAgICAgICAgICAgICAgIGtleTogJ2RldGFpbCcsCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYWJlbDogJ+WOhuWPsicsCisgICAgICAgICAgICAgICAga2V5OiAnbG9nJywKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBvbkNsaWNrOiAoeyBrZXkgfSkgPT4geworICAgICAgICAgICAgICBpZiAoa2V5ID09PSAncnVuT25jZScpIHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn6K2m5ZGKJywKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7orqTopoHnq4vljbPmiafooYzkuIDmrKHvvJ8nLAorICAgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgcnVuSm9iKHJlY29yZC5qb2JJZCwgcmVjb3JkLmpvYkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+aJp+ihjOaIkOWKnycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ2RldGFpbCcpIHsKKyAgICAgICAgICAgICAgICBzZXREZXRhaWxNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYoIGtleSA9PT0gJ2xvZycpIHsKKyAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2goYC9tb25pdG9yL2pvYi1sb2cvaW5kZXgvJHtyZWNvcmQuam9iSWR9YCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAgPGEgY2xhc3NOYW1lPSJhbnQtZHJvcGRvd24tbGluayIgb25DbGljaz17KGUpID0+IGUucHJldmVudERlZmF1bHQoKX0+CisgICAgICAgICAgICA8U3BhY2U+CisgICAgICAgICAgICAgIDxEb3duT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAg5pu05aSaCisgICAgICAgICAgICA8L1NwYWNlPgorICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9Ecm9wZG93bj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuTW9uaXRvci5Kb2I+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJqb2JJZCIKKyAgICAgICAgICBrZXk9ImpvYkxpc3QiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iYWRkIgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6am9iOmFkZCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUubmV3IiBkZWZhdWx0TWVzc2FnZT0i5paw5bu6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpqb2I6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImV4cG9ydCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmpvYjpleHBvcnQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGhhbmRsZUV4cG9ydCgpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5leHBvcnQiIGRlZmF1bHRNZXNzYWdlPSLlr7zlh7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgXX0KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0Sm9iTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5Nb25pdG9yLkpvYkxpc3RQYXJhbXMpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7CisgICAgICAgICAgICAgICAgZGF0YTogcmVzLnJvd3MsCisgICAgICAgICAgICAgICAgdG90YWw6IHJlcy50b3RhbCwKKyAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSkKKyAgICAgICAgICB9CisgICAgICAgICAgY29sdW1ucz17Y29sdW1uc30KKyAgICAgICAgICByb3dTZWxlY3Rpb249e3sKKyAgICAgICAgICAgIG9uQ2hhbmdlOiAoXywgc2VsZWN0ZWRSb3dzKSA9PiB7CisgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgPC9kaXY+CisgICAgICB7c2VsZWN0ZWRSb3dzPy5sZW5ndGggPiAwICYmICgKKyAgICAgICAgPEZvb3RlclRvb2xiYXIKKyAgICAgICAgICBleHRyYT17CisgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuY2hvc2VuIiBkZWZhdWx0TWVzc2FnZT0i5bey6YCJ5oupIiAvPgorICAgICAgICAgICAgICA8YSBzdHlsZT17eyBmb250V2VpZ2h0OiA2MDAgfX0+e3NlbGVjdGVkUm93cy5sZW5ndGh9PC9hPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuaXRlbSIgZGVmYXVsdE1lc3NhZ2U9IumhuSIgLz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIH0KKyAgICAgICAgPgorICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6am9iOmRlbCcpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgICAgPFVwZGF0ZUZvcm0KKyAgICAgICAgb25TdWJtaXQ9e2FzeW5jICh2YWx1ZXMpID0+IHsKKyAgICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgIGlmICh2YWx1ZXMuam9iSWQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVcGRhdGUoeyAuLi52YWx1ZXMgfSBhcyBBUEkuTW9uaXRvci5Kb2IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLk1vbml0b3IuSm9iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICB9fQorICAgICAgICBvcGVuPXttb2RhbFZpc2libGV9CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgICAgam9iR3JvdXBPcHRpb25zPXtqb2JHcm91cE9wdGlvbnN8fHt9fQorICAgICAgICBzdGF0dXNPcHRpb25zPXtzdGF0dXNPcHRpb25zfQorICAgICAgLz4KKyAgICAgIDxEZXRhaWxGb3JtCisgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgICAgc2V0RGV0YWlsTW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgIH19CisgICAgICAgIG9wZW49e2RldGFpbE1vZGFsVmlzaWJsZX0KKyAgICAgICAgdmFsdWVzPXtjdXJyZW50Um93IHx8IHt9fQorICAgICAgICBzdGF0dXNPcHRpb25zPXtzdGF0dXNPcHRpb25zfQorICAgICAgLz4KKyAgICA8L1BhZ2VDb250YWluZXI+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBKb2JUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Kb2JMb2cvZGV0YWlsLnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYkxvZy9kZXRhaWwudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDg4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Kb2JMb2cvZGV0YWlsLnRzeApAQCAtMCwwICsxLDEwNSBAQAoraW1wb3J0IHsgZ2V0VmFsdWVFbnVtTGFiZWwgfSBmcm9tICdAL3V0aWxzL29wdGlvbnMnOworaW1wb3J0IHsgRm9ybWF0dGVkTWVzc2FnZSwgdXNlSW50bCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgRGVzY3JpcHRpb25zLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMS8wOS8xNgorICogCisgKiAqLworCitleHBvcnQgdHlwZSBKb2JMb2dGb3JtVmFsdWVUeXBlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBQYXJ0aWFsPEFQSS5Nb25pdG9yLkpvYkxvZz47CisKK2V4cG9ydCB0eXBlIEpvYkxvZ0Zvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBKb2JMb2dGb3JtVmFsdWVUeXBlKSA9PiB2b2lkOworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLk1vbml0b3IuSm9iTG9nPjsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKKyAgam9iR3JvdXBPcHRpb25zOiBEaWN0VmFsdWVFbnVtT2JqOworfTsKKworY29uc3QgSm9iTG9nRGV0YWlsRm9ybTogUmVhY3QuRkM8Sm9iTG9nRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworCisgIGNvbnN0IHsgdmFsdWVzLCBzdGF0dXNPcHRpb25zLCBqb2JHcm91cE9wdGlvbnMgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgIH0sIFtdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgfTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uQ2FuY2VsKCk7CisgIH07CisgIAorICByZXR1cm4gKAorICAgIDxNb2RhbAorICAgICAgd2lkdGg9ezY0MH0KKyAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogJ21vbml0b3Iuam9iLmxvZy50aXRsZScsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5a6a5pe25Lu75Yqh6LCD5bqm5pel5b+XJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKyAgICAgIDxEZXNjcmlwdGlvbnMgY29sdW1uPXsyNH0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2Iuam9iX2lkIiBkZWZhdWx0TWVzc2FnZT0i5Lu75Yqh57yW5Y+3IiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuam9iTG9nSWR9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IuY3JlYXRlX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLmiafooYzml7bpl7QiIC8+fQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5jcmVhdGVUaW1lPy50b1N0cmluZygpfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsxMn0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmpvYl9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5Lu75Yqh5ZCN56ewIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuam9iTmFtZX0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5qb2JfZ3JvdXAiIGRlZmF1bHRNZXNzYWdlPSLku7vliqHnu4TlkI0iIC8+fQorICAgICAgICA+CisgICAgICAgICAge2dldFZhbHVlRW51bUxhYmVsKGpvYkdyb3VwT3B0aW9ucywgdmFsdWVzLmpvYkdyb3VwLCAn5pegJyl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezI0fQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IuaW52b2tlX3RhcmdldCIgZGVmYXVsdE1lc3NhZ2U9Iuiwg+eUqOebruaghyIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmludm9rZVRhcmdldH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MjR9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5sb2cuam9iX21lc3NhZ2UiIGRlZmF1bHRNZXNzYWdlPSLml6Xlv5fkv6Hmga8iIC8+fQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5qb2JNZXNzYWdlfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsyNH0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmxvZy5leGNlcHRpb25faW5mbyIgZGVmYXVsdE1lc3NhZ2U9IuW8guW4uOS/oeaBryIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLmV4Y2VwdGlvbkluZm99CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2Iuc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i5omn6KGM54q25oCBIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtnZXRWYWx1ZUVudW1MYWJlbChzdGF0dXNPcHRpb25zLCB2YWx1ZXMuc3RhdHVzLCAn5pyq55+lJyl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICA8L0Rlc2NyaXB0aW9ucz4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgSm9iTG9nRGV0YWlsRm9ybTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0pvYkxvZy9pbmRleC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Kb2JMb2cvaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Kb2JMb2cvaW5kZXgudHN4CkBAIC0wLDAgKzEsMzQzIEBACisKK2ltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlLCB1c2VBY2Nlc3MsIHVzZVBhcmFtcywgaGlzdG9yeSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldEpvYkxvZ0xpc3QsIHJlbW92ZUpvYkxvZywgZXhwb3J0Sm9iTG9nIH0gZnJvbSAnQC9zZXJ2aWNlcy9tb25pdG9yL2pvYkxvZyc7CitpbXBvcnQgRGV0YWlsRm9ybSBmcm9tICcuL2RldGFpbCc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgeyBnZXRKb2IgfSBmcm9tICdAL3NlcnZpY2VzL21vbml0b3Ivam9iJzsKK2ltcG9ydCBEaWN0VGFnIGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworLyoqCisgKiDlrprml7bku7vliqHosIPluqbml6Xlv5cgTGlzdCBQYWdlCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlcgorICogQGRhdGUgMjAyMy0wMi0wNworICovCisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuTW9uaXRvci5Kb2JMb2dbXSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvd3MpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVKb2JMb2coc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cuam9iTG9nSWQpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZVJlbW92ZU9uZSA9IGFzeW5jIChzZWxlY3RlZFJvdzogQVBJLk1vbml0b3IuSm9iTG9nKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93KSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCBwYXJhbXMgPSBbc2VsZWN0ZWRSb3cuam9iTG9nSWRdOworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVKb2JMb2cocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5riF56m65pel5b+X5pWw5o2uCisgKgorICovCitjb25zdCBoYW5kbGVFeHBvcnQgPSBhc3luYyAoKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWvvOWHuicpOworICB0cnkgeworICAgIGF3YWl0IGV4cG9ydEpvYkxvZygpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKworY29uc3QgSm9iTG9nVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxPcGVuLCBzZXRNb2RhbE9wZW5dID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5Kb2JMb2c+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5Kb2JMb2dbXT4oW10pOworCisgIGNvbnN0IFtqb2JHcm91cE9wdGlvbnMsIHNldEpvYkdyb3VwT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgW3F1ZXJ5UGFyYW1zLCBzZXRRdWVyeVBhcmFtc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICAvKiog5Zu96ZmF5YyW6YWN572uICovCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7CisgIGlmIChwYXJhbXMuaWQgPT09IHVuZGVmaW5lZCkgeworICAgIGhpc3RvcnkucHVzaCgnL21vbml0b3Ivam9iJyk7CisgIH0KKyAgY29uc3Qgam9iSWQgPSBwYXJhbXMuaWQgfHwgMDsKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBpZiAoam9iSWQgIT09IHVuZGVmaW5lZCAmJiBqb2JJZCAhPT0gMCkgeworICAgICAgZ2V0Sm9iKE51bWJlcihqb2JJZCkpLnRoZW4ocmVzcG9uc2UgPT4geworICAgICAgICBzZXRRdWVyeVBhcmFtcyh7CisgICAgICAgICAgam9iTmFtZTogcmVzcG9uc2UuZGF0YS5qb2JOYW1lLAorICAgICAgICAgIGpvYkdyb3VwOiByZXNwb25zZS5kYXRhLmpvYkdyb3VwCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICAgIGdldERpY3RWYWx1ZUVudW0oJ3N5c19qb2Jfc3RhdHVzJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0U3RhdHVzT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfam9iX2dyb3VwJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0Sm9iR3JvdXBPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxBUEkuTW9uaXRvci5Kb2JMb2c+W10gPSBbCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmpvYi5sb2cuam9iX2xvZ19pZCIgZGVmYXVsdE1lc3NhZ2U9IuS7u+WKoeaXpeW/l+e8luWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdqb2JMb2dJZCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IubG9nLmpvYl9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5Lu75Yqh5ZCN56ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2pvYk5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmxvZy5qb2JfZ3JvdXAiIGRlZmF1bHRNZXNzYWdlPSLku7vliqHnu4TlkI0iIC8+LAorICAgICAgZGF0YUluZGV4OiAnam9iR3JvdXAnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmxvZy5pbnZva2VfdGFyZ2V0IiBkZWZhdWx0TWVzc2FnZT0i6LCD55So55uu5qCH5a2X56ym5LiyIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2ludm9rZVRhcmdldCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0YXJlYScsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuam9iLmxvZy5qb2JfbWVzc2FnZSIgZGVmYXVsdE1lc3NhZ2U9IuaXpeW/l+S/oeaBryIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdqb2JNZXNzYWdlJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHRhcmVhJywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IubG9nLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuaJp+ihjOeKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5qb2IubG9nLmNyZWF0ZV90aW1lIiBkZWZhdWx0TWVzc2FnZT0i5byC5bi45L+h5oGvIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NyZWF0ZVRpbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzEyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpqb2ItbG9nOmVkaXQnKX0KKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHJlY29yZCk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOe8lui+kQorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICB0eXBlPSJsaW5rIgorICAgICAgICAgIHNpemU9InNtYWxsIgorICAgICAgICAgIGRhbmdlcgorICAgICAgICAgIGtleT0iYmF0Y2hSZW1vdmUiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmpvYi1sb2c6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuTW9uaXRvci5Kb2JMb2c+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJqb2JMb2dJZCIKKyAgICAgICAgICBrZXk9ImpvYi1sb2dMaXN0IgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImFkZCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmpvYi1sb2c6YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgc2V0TW9kYWxPcGVuKHRydWUpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5uZXciIGRlZmF1bHRNZXNzYWdlPSLmlrDlu7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmpvYi1sb2c6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImV4cG9ydCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmpvYi1sb2c6ZXhwb3J0Jyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFeHBvcnQoKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZXhwb3J0IiBkZWZhdWx0TWVzc2FnZT0i5a+85Ye6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgIF19CisgICAgICAgICAgcGFyYW1zPXtxdWVyeVBhcmFtc30KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0Sm9iTG9nTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5Nb25pdG9yLkpvYkxvZ0xpc3RQYXJhbXMpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7CisgICAgICAgICAgICAgICAgZGF0YTogcmVzLnJvd3MsCisgICAgICAgICAgICAgICAgdG90YWw6IHJlcy50b3RhbCwKKyAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSkKKyAgICAgICAgICB9CisgICAgICAgICAgY29sdW1ucz17Y29sdW1uc30KKyAgICAgICAgICByb3dTZWxlY3Rpb249e3sKKyAgICAgICAgICAgIG9uQ2hhbmdlOiAoXywgc2VsZWN0ZWRSb3dzKSA9PiB7CisgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgPC9kaXY+CisgICAgICB7c2VsZWN0ZWRSb3dzPy5sZW5ndGggPiAwICYmICgKKyAgICAgICAgPEZvb3RlclRvb2xiYXIKKyAgICAgICAgICBleHRyYT17CisgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuY2hvc2VuIiBkZWZhdWx0TWVzc2FnZT0i5bey6YCJ5oupIiAvPgorICAgICAgICAgICAgICA8YSBzdHlsZT17eyBmb250V2VpZ2h0OiA2MDAgfX0+e3NlbGVjdGVkUm93cy5sZW5ndGh9PC9hPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuaXRlbSIgZGVmYXVsdE1lc3NhZ2U9IumhuSIgLz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIH0KKyAgICAgICAgPgorICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6am9iLWxvZzpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxEZXRhaWxGb3JtCisgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgICAgc2V0TW9kYWxPcGVuKGZhbHNlKTsKKyAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgIH19CisgICAgICAgIG9wZW49e21vZGFsT3Blbn0KKyAgICAgICAgdmFsdWVzPXtjdXJyZW50Um93IHx8IHt9fQorICAgICAgICBzdGF0dXNPcHRpb25zPXtzdGF0dXNPcHRpb25zfQorICAgICAgICBqb2JHcm91cE9wdGlvbnM9e2pvYkdyb3VwT3B0aW9uc30KKyAgICAgIC8+CisgICAgPC9QYWdlQ29udGFpbmVyPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgSm9iTG9nVGFibGVMaXN0OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvTG9naW5pbmZvci9lZGl0LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0xvZ2luaW5mb3IvZWRpdC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0MzE5MQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0xvZ2luaW5mb3IvZWRpdC50c3gKQEAgLTAsMCArMSwyMTYgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeworICBQcm9Gb3JtLAorICBQcm9Gb3JtRGlnaXQsCisgIFByb0Zvcm1UZXh0LAorICBQcm9Gb3JtUmFkaW8sCisgIFByb0Zvcm1UaW1lUGlja2VyLAorICB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIExvZ2luaW5mb3JGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPjsKKworZXhwb3J0IHR5cGUgTG9naW5pbmZvckZvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBMb2dpbmluZm9yRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBMb2dpbmluZm9yRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPjsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IExvZ2luaW5mb3JGb3JtOiBSZWFjdC5GQzxMb2dpbmluZm9yRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgCisgIGNvbnN0IHsgc3RhdHVzT3B0aW9ucywgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworCQkJaW5mb0lkOiBwcm9wcy52YWx1ZXMuaW5mb0lkLAorCQkJdXNlck5hbWU6IHByb3BzLnZhbHVlcy51c2VyTmFtZSwKKwkJCWlwYWRkcjogcHJvcHMudmFsdWVzLmlwYWRkciwKKwkJCWxvZ2luTG9jYXRpb246IHByb3BzLnZhbHVlcy5sb2dpbkxvY2F0aW9uLAorCQkJYnJvd3NlcjogcHJvcHMudmFsdWVzLmJyb3dzZXIsCisJCQlvczogcHJvcHMudmFsdWVzLm9zLAorCQkJc3RhdHVzOiBwcm9wcy52YWx1ZXMuc3RhdHVzLAorCQkJbXNnOiBwcm9wcy52YWx1ZXMubXNnLAorCQkJbG9naW5UaW1lOiBwcm9wcy52YWx1ZXMubG9naW5UaW1lLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBwcm9wcy5vblN1Ym1pdCh2YWx1ZXMgYXMgTG9naW5pbmZvckZvcm1EYXRhKTsKKyAgfTsKKworICByZXR1cm4gKAorICAgIDxNb2RhbAorICAgICAgd2lkdGg9ezY0MH0KKyAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLnRpdGxlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnvJbovpHns7vnu5/orr/pl67orrDlvZUnLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorCQkgIDxQcm9Gb3JtIAorICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICBsYXlvdXQ9Imhvcml6b250YWwiIAorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9ImluZm9JZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IuaW5mb19pZCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iuv+mXrue8luWPtycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6K6/6Zeu57yW5Y+3IgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeiuv+mXrue8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeiuv+mXrue8luWPt++8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InVzZXJOYW1lIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci51c2VyX25hbWUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnlKjmiLfotKblj7cnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+i0puWPtyIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnlKjmiLfotKblj7fvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnlKjmiLfotKblj7fvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJpcGFkZHIiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLmlwYWRkcicsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eZu+W9lUlQ5Zyw5Z2AJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXnmbvlvZVJUOWcsOWdgCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnmbvlvZVJUOWcsOWdgO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeZu+W9lUlQ5Zyw5Z2A77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ibG9naW5Mb2NhdGlvbiIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IubG9naW5fbG9jYXRpb24nLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnmbvlvZXlnLDngrknLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeZu+W9leWcsOeCuSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnmbvlvZXlnLDngrnvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnmbvlvZXlnLDngrnvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJicm93c2VyIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci5icm93c2VyJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5rWP6KeI5Zmo57G75Z6LJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmtY/op4jlmajnsbvlnosiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5rWP6KeI5Zmo57G75Z6L77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5rWP6KeI5Zmo57G75Z6L77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ib3MiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLm9zJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5pON5L2c57O757ufJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmk43kvZzns7vnu58iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5pON5L2c57O757uf77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5pON5L2c57O757uf77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eZu+W9leeKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl55m75b2V54q25oCBIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeZu+W9leeKtuaAge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeZu+W9leeKtuaAge+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9Im1zZyIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IubXNnJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5o+Q56S65raI5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmj5DnpLrmtojmga8iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5o+Q56S65raI5oGv77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5o+Q56S65raI5oGv77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UaW1lUGlja2VyCisgICAgICAgICAgbmFtZT0ibG9naW5UaW1lIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci5sb2dpbl90aW1lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6K6/6Zeu5pe26Ze0JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXorr/pl67ml7bpl7QiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6K6/6Zeu5pe26Ze077yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6K6/6Zeu5pe26Ze077yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgTG9naW5pbmZvckZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Mb2dpbmluZm9yL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL0xvZ2luaW5mb3IvaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzkyODEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9Mb2dpbmluZm9yL2luZGV4LnRzeApAQCAtMCwwICsxLDMzNSBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgdHlwZSB7IEZvcm1JbnN0YW5jZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQnV0dG9uLCBtZXNzYWdlLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQWN0aW9uVHlwZSwgRm9vdGVyVG9vbGJhciwgUGFnZUNvbnRhaW5lciwgUHJvQ29sdW1ucywgUHJvVGFibGUgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBQbHVzT3V0bGluZWQsIERlbGV0ZU91dGxpbmVkLCBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLCBVbmxvY2tPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldExvZ2luaW5mb3JMaXN0LCByZW1vdmVMb2dpbmluZm9yLCBleHBvcnRMb2dpbmluZm9yLCB1bmxvY2tMb2dpbmluZm9yLCBjbGVhbkxvZ2luaW5mb3IgfSBmcm9tICdAL3NlcnZpY2VzL21vbml0b3IvbG9naW5pbmZvcic7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuTW9uaXRvci5Mb2dpbmluZm9yW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlTG9naW5pbmZvcihzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy5pbmZvSWQpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZUNsZWFuID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfor7fnqI3lgJknKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgY2xlYW5Mb2dpbmluZm9yKCk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmuIXnqbrmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfor7fmsYLlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZVVubG9jayA9IGFzeW5jICh1c2VyTmFtZTogc3RyaW5nKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOino+mUgScpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB1bmxvY2tMb2dpbmluZm9yKHVzZXJOYW1lKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+ino+mUgeaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+ino+mUgeWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDlr7zlh7rmlbDmja4KKyAqCisgKiBAcGFyYW0gaWQKKyAqLworY29uc3QgaGFuZGxlRXhwb3J0ID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjlr7zlh7onKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCBleHBvcnRMb2dpbmluZm9yKCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBMb2dpbmluZm9yVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBhY3Rpb25SZWYgPSB1c2VSZWY8QWN0aW9uVHlwZT4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5Nb25pdG9yLkxvZ2luaW5mb3JbXT4oW10pOworCisgIGNvbnN0IGFjY2VzcyA9IHVzZUFjY2VzcygpOworCisgIGNvbnN0IHN0YXR1c09wdGlvbnMgPSB7CisgICAgMDogeworICAgICAgbGFiZWw6ICfmiJDlip8nLAorICAgICAga2V5OiAnMCcsCisgICAgICB2YWx1ZTogJzAnLAorICAgICAgdGV4dDogJ+aIkOWKnycsCisgICAgICBzdGF0dXM6ICdzdWNjZXNzJywKKyAgICAgIGxpc3RDbGFzczogJ3N1Y2Nlc3MnCisgICAgfSwKKyAgICAxOiB7CisgICAgICBsYWJlbDogJ+Wksei0pScsCisgICAgICBrZXk6ICcxJywKKyAgICAgIHZhbHVlOiAnMScsCisgICAgICB0ZXh0OiAn5aSx6LSlJywKKyAgICAgIHN0YXR1czogJ2Vycm9yJywKKyAgICAgIGxpc3RDbGFzczogJ2RhbmdlcicKKyAgICB9LAorICB9OworCisgIC8qKiDlm73pmYXljJbphY3nva4gKi8KKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKworICB1c2VFZmZlY3QoKCkgPT4geworCisgIH0sIFtdKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5Nb25pdG9yLkxvZ2luaW5mb3I+W10gPSBbCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IuaW5mb19pZCIgZGVmYXVsdE1lc3NhZ2U9Iuiuv+mXrue8luWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdpbmZvSWQnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci51c2VyX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfotKblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAndXNlck5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5pcGFkZHIiIGRlZmF1bHRNZXNzYWdlPSLnmbvlvZVJUOWcsOWdgCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdpcGFkZHInLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5sb2dpbl9sb2NhdGlvbiIgZGVmYXVsdE1lc3NhZ2U9IueZu+W9leWcsOeCuSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdsb2dpbkxvY2F0aW9uJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IuYnJvd3NlciIgZGVmYXVsdE1lc3NhZ2U9Iua1j+iniOWZqOexu+WeiyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdicm93c2VyJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3Iub3MiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzns7vnu58iIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3MnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5zdGF0dXMiIGRlZmF1bHRNZXNzYWdlPSLnmbvlvZXnirbmgIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAnc3RhdHVzJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17c3RhdHVzT3B0aW9uc30gdmFsdWU9e3JlY29yZC5zdGF0dXN9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5tc2ciIGRlZmF1bHRNZXNzYWdlPSLmj5DnpLrmtojmga8iIC8+LAorICAgICAgZGF0YUluZGV4OiAnbXNnJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IubG9naW5fdGltZSIgZGVmYXVsdE1lc3NhZ2U9Iuiuv+mXruaXtumXtCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdsb2dpblRpbWUnLAorICAgICAgdmFsdWVUeXBlOiAnZGF0ZVRpbWUnLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0iaW5mb0lkIgorICAgICAgICAgIGtleT0ibG9naW5pbmZvckxpc3QiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImNsZWFuIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5riF56m65omA5pyJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZUNsZWFuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHsgfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jbGVhbkFsbCIgZGVmYXVsdE1lc3NhZ2U9Iua4heepuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJ1bmxvY2siCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpsb2dpbmluZm9yOnVubG9jaycpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOino+mUgeivpeeUqOaIt+eahOaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVbmxvY2soc2VsZWN0ZWRSb3dzWzBdLnVzZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCkgeyB9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8VW5sb2NrT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci51bmxvY2siIGRlZmF1bHRNZXNzYWdlPSLop6PplIEiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6bG9naW5pbmZvcjpleHBvcnQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGhhbmRsZUV4cG9ydCgpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5leHBvcnQiIGRlZmF1bHRNZXNzYWdlPSLlr7zlh7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgXX0KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0TG9naW5pbmZvckxpc3QoeyAuLi5wYXJhbXMgfSBhcyBBUEkuTW9uaXRvci5Mb2dpbmluZm9yTGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpsb2dpbmluZm9yOnJlbW92ZScpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IExvZ2luaW5mb3JUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9PbmxpbmUvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvT25saW5lL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgxZTNiCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvT25saW5lL2luZGV4LnRzeApAQCAtMCwwICsxLDE2MiBAQAoraW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZ2V0T25saW5lVXNlckxpc3QsIGZvcmNlTG9nb3V0IH0gZnJvbSAnQC9zZXJ2aWNlcy9tb25pdG9yL29ubGluZSc7CitpbXBvcnQgeyBBY3Rpb25UeXBlLCBQcm9Db2x1bW5zLCBQcm9UYWJsZSB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IERlbGV0ZU91dGxpbmVkIH0gZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworIAorCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjMvMDIvMDcKKyAqIAorICogKi8KKworCitjb25zdCBoYW5kbGVGb3JjZUxvZ291dCA9IGFzeW5jIChzZWxlY3RlZFJvdzogQVBJLk1vbml0b3IuT25saW5lVXNlclR5cGUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5by65Yi25LiL57q/Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZm9yY2VMb2dvdXQoc2VsZWN0ZWRSb3cudG9rZW5JZCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5by65Yi25LiL57q/5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+W8uuWItuS4i+e6v+Wksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgT25saW5lVXNlclRhYmxlTGlzdDogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IGZvcm1UYWJsZVJlZiA9IHVzZVJlZjxGb3JtSW5zdGFuY2U+KCk7CisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKworICB1c2VFZmZlY3QoKCkgPT4ge30sIFtdKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5Nb25pdG9yLk9ubGluZVVzZXJUeXBlPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vbmxpbmUudXNlci50b2tlbl9pZCIgZGVmYXVsdE1lc3NhZ2U9IuS8muivnee8luWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICd0b2tlbklkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9ubGluZS51c2VyLnVzZXJfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IueUqOaIt+i0puWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICd1c2VyTmFtZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vbmxpbmUudXNlci5kZXB0X25hbWUiIGRlZmF1bHRNZXNzYWdlPSLpg6jpl6jlkI3np7AiIC8+LAorICAgICAgZGF0YUluZGV4OiAnZGVwdE5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub25saW5lLnVzZXIuaXBhZGRyIiBkZWZhdWx0TWVzc2FnZT0i55m75b2VSVDlnLDlnYAiIC8+LAorICAgICAgZGF0YUluZGV4OiAnaXBhZGRyJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9ubGluZS51c2VyLmxvZ2luX2xvY2F0aW9uIiBkZWZhdWx0TWVzc2FnZT0i55m75b2V5Zyw54K5IiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2xvZ2luTG9jYXRpb24nLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub25saW5lLnVzZXIuYnJvd3NlciIgZGVmYXVsdE1lc3NhZ2U9Iua1j+iniOWZqOexu+WeiyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdicm93c2VyJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9ubGluZS51c2VyLm9zIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c57O757ufIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29zJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9ubGluZS51c2VyLmxvZ2luX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLnmbvlvZXml7bpl7QiIC8+LAorICAgICAgZGF0YUluZGV4OiAnbG9naW5UaW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ2RhdGVSYW5nZScsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IDxzcGFuPntyZWNvcmQubG9naW5UaW1lfTwvc3Bhbj4sCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgICBzZWFyY2g6IHsKKyAgICAgICAgdHJhbnNmb3JtOiAodmFsdWUpID0+IHsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3BhcmFtc1tiZWdpblRpbWVdJzogdmFsdWVbMF0sCisgICAgICAgICAgICAncGFyYW1zW2VuZFRpbWVdJzogdmFsdWVbMV0sCisgICAgICAgICAgfTsKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzYwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGljb249PERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOm9ubGluZTpmb3JjZUxvZ291dCcpfQorICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICB0aXRsZTogJ+W8uui4oicsCisgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprlvLrliLblsIbor6XnlKjmiLfouKLkuIvnur/lkJfvvJ8nLAorICAgICAgICAgICAgICBva1RleHQ6ICfnoa7orqQnLAorICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVGb3JjZUxvZ291dChyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOW8uumAgAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuTW9uaXRvci5PbmxpbmVVc2VyVHlwZT4KKyAgICAgICAgICBoZWFkZXJUaXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAncGFnZXMuc2VhcmNoVGFibGUudGl0bGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfkv6Hmga8nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGFjdGlvblJlZj17YWN0aW9uUmVmfQorICAgICAgICAgIGZvcm1SZWY9e2Zvcm1UYWJsZVJlZn0KKyAgICAgICAgICByb3dLZXk9InRva2VuSWQiCisgICAgICAgICAga2V5PSJsb2dpbmluZm9yTGlzdCIKKyAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgIGxhYmVsV2lkdGg6IDEyMCwKKyAgICAgICAgICB9fQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXRPbmxpbmVVc2VyTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5Nb25pdG9yLk9ubGluZVVzZXJMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE9ubGluZVVzZXJUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9PcGVybG9nL2RldGFpbC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9PcGVybG9nL2RldGFpbC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0NzUyMgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Nb25pdG9yL09wZXJsb2cvZGV0YWlsLnRzeApAQCAtMCwwICsxLDExMyBAQAoraW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IERlc2NyaXB0aW9ucywgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CitpbXBvcnQgeyBnZXRWYWx1ZUVudW1MYWJlbCB9IGZyb20gJ0AvdXRpbHMvb3B0aW9ucyc7CisKK2V4cG9ydCB0eXBlIE9wZXJsb2dGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuTW9uaXRvci5PcGVybG9nPjsKKworZXhwb3J0IHR5cGUgT3BlcmxvZ0Zvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBPcGVybG9nRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBPcGVybG9nRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuTW9uaXRvci5PcGVybG9nPjsKKyAgYnVzaW5lc3NUeXBlT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKKyAgb3BlcmF0b3JUeXBlT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IE9wZXJsb2dEZXRhaWxGb3JtOiBSZWFjdC5GQzxPcGVybG9nRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworCisgIGNvbnN0IHsgdmFsdWVzLCBidXNpbmVzc1R5cGVPcHRpb25zLCBvcGVyYXRvclR5cGVPcHRpb25zLCBzdGF0dXNPcHRpb25zLCB9ID0gcHJvcHM7CisKKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKyAgY29uc3QgaGFuZGxlT2sgPSAoKSA9PiB7fTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uQ2FuY2VsKCk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdtb25pdG9yLm9wZXJsb2cudGl0bGUnLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e8lui+keaTjeS9nOaXpeW/l+iusOW9lScsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKyAgICAgIDxEZXNjcmlwdGlvbnMgY29sdW1uPXsyNH0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm1vZHVsZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaooeWdlyIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7YCR7dmFsdWVzLnRpdGxlfS8ke2dldFZhbHVlRW51bUxhYmVsKGJ1c2luZXNzVHlwZU9wdGlvbnMsIHZhbHVlcy5idXNpbmVzc1R5cGUpfWB9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLnJlcXVlc3RfbWV0aG9kIiBkZWZhdWx0TWVzc2FnZT0i6K+35rGC5pa55byPIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMucmVxdWVzdE1ldGhvZH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cub3Blcl9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c5Lq65ZGYIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtgJHt2YWx1ZXMub3Blck5hbWV9LyR7dmFsdWVzLm9wZXJJcH1gfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsxMn0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyYXRvcl90eXBlIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c57G75YirIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtnZXRWYWx1ZUVudW1MYWJlbChvcGVyYXRvclR5cGVPcHRpb25zLCB2YWx1ZXMub3BlcmF0b3JUeXBlKX0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MjR9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cubWV0aG9kIiBkZWZhdWx0TWVzc2FnZT0i5pa55rOV5ZCN56ewIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMubWV0aG9kfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsyNH0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX3VybCIgZGVmYXVsdE1lc3NhZ2U9Iuivt+axglVSTCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLm9wZXJVcmx9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezI0fQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfcGFyYW0iIGRlZmF1bHRNZXNzYWdlPSLor7fmsYLlj4LmlbAiIC8+fQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5vcGVyUGFyYW19CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezI0fQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLmpzb25fcmVzdWx0IiBkZWZhdWx0TWVzc2FnZT0i6L+U5Zue5Y+C5pWwIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuanNvblJlc3VsdH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MjR9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cuZXJyb3JfbXNnIiBkZWZhdWx0TWVzc2FnZT0i6ZSZ6K+v5raI5oGvIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuZXJyb3JNc2d9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOeKtuaAgSIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7Z2V0VmFsdWVFbnVtTGFiZWwoc3RhdHVzT3B0aW9ucywgdmFsdWVzLnN0YXR1cyl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaXtumXtCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLm9wZXJUaW1lPy50b1N0cmluZygpfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgPC9EZXNjcmlwdGlvbnM+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE9wZXJsb2dEZXRhaWxGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvT3BlcmxvZy9pbmRleC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9PcGVybG9nL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQwYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvT3BlcmxvZy9pbmRleC50c3gKQEAgLTAsMCArMSwzNjUgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldE9wZXJsb2dMaXN0LCByZW1vdmVPcGVybG9nLCBhZGRPcGVybG9nLCB1cGRhdGVPcGVybG9nLCBleHBvcnRPcGVybG9nIH0gZnJvbSAnQC9zZXJ2aWNlcy9tb25pdG9yL29wZXJsb2cnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9kZXRhaWwnOworaW1wb3J0IHsgZ2V0RGljdFZhbHVlRW51bSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL2RpY3QnOworaW1wb3J0IERpY3RUYWcgZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworCisvKioKKyAqIOa3u+WKoOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlQWRkID0gYXN5bmMgKGZpZWxkczogQVBJLk1vbml0b3IuT3BlcmxvZykgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjmt7vliqAnKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgYWRkT3BlcmxvZyh7IC4uLmZpZWxkcyB9KTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+a3u+WKoOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a3u+WKoOWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDmm7TmlrDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZVVwZGF0ZSA9IGFzeW5jIChmaWVsZHM6IEFQSS5Nb25pdG9yLk9wZXJsb2cpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5pu05pawJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHVwZGF0ZU9wZXJsb2coZmllbGRzKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+abtOaWsOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+mFjee9ruWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGhhbmRsZVJlbW92ZSA9IGFzeW5jIChzZWxlY3RlZFJvd3M6IEFQSS5Nb25pdG9yLk9wZXJsb2dbXSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvd3MpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVPcGVybG9nKHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4gcm93Lm9wZXJJZCkuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WIoOmZpOaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCisvKioKKyAqIOWvvOWHuuaVsOaNrgorICoKKyAqCisgKi8KK2NvbnN0IGhhbmRsZUV4cG9ydCA9IGFzeW5jICgpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5a+85Ye6Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZXhwb3J0T3BlcmxvZygpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKworY29uc3QgT3BlcmxvZ1RhYmxlTGlzdDogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IGZvcm1UYWJsZVJlZiA9IHVzZVJlZjxGb3JtSW5zdGFuY2U+KCk7CisKKyAgY29uc3QgW21vZGFsVmlzaWJsZSwgc2V0TW9kYWxWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsKKworICBjb25zdCBhY3Rpb25SZWYgPSB1c2VSZWY8QWN0aW9uVHlwZT4oKTsKKyAgY29uc3QgW2N1cnJlbnRSb3csIHNldEN1cnJlbnRSb3ddID0gdXNlU3RhdGU8QVBJLk1vbml0b3IuT3BlcmxvZz4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5Nb25pdG9yLk9wZXJsb2dbXT4oW10pOworCisgIGNvbnN0IFtidXNpbmVzc1R5cGVPcHRpb25zLCBzZXRCdXNpbmVzc1R5cGVPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbb3BlcmF0b3JUeXBlT3B0aW9ucywgc2V0T3BlcmF0b3JUeXBlT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX29wZXJfdHlwZScsIHRydWUpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldEJ1c2luZXNzVHlwZU9wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX29wZXJfdHlwZScsIHRydWUpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldE9wZXJhdG9yVHlwZU9wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX2NvbW1vbl9zdGF0dXMnLCB0cnVlKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXRTdGF0dXNPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxBUEkuTW9uaXRvci5PcGVybG9nPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfaWQiIGRlZmF1bHRNZXNzYWdlPSLml6Xlv5fkuLvplK4iIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlcklkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cudGl0bGUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzmqKHlnZciIC8+LAorICAgICAgZGF0YUluZGV4OiAndGl0bGUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5idXNpbmVzc190eXBlIiBkZWZhdWx0TWVzc2FnZT0i5Lia5Yqh57G75Z6LIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2J1c2luZXNzVHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBidXNpbmVzc1R5cGVPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcgZW51bXM9e2J1c2luZXNzVHlwZU9wdGlvbnN9IHZhbHVlPXtyZWNvcmQuYnVzaW5lc3NUeXBlfSAvPik7CisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cucmVxdWVzdF9tZXRob2QiIGRlZmF1bHRNZXNzYWdlPSLor7fmsYLmlrnlvI8iIC8+LAorICAgICAgZGF0YUluZGV4OiAncmVxdWVzdE1ldGhvZCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJhdG9yX3R5cGUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZznsbvliKsiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlcmF0b3JUeXBlJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IG9wZXJhdG9yVHlwZU9wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17b3BlcmF0b3JUeXBlT3B0aW9uc30gdmFsdWU9e3JlY29yZC5vcGVyYXRvclR5cGV9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzkurrlkZgiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3Blck5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX2lwIiBkZWZhdWx0TWVzc2FnZT0i5Li75py65Zyw5Z2AIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wZXJJcCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfbG9jYXRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzlnLDngrkiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlckxvY2F0aW9uJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cuc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c54q25oCBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3N0YXR1cycsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBzdGF0dXNPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcga2V5PSJzdGF0dXMiIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaXtumXtCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdvcGVyVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICdkYXRlVGltZScsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzEyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm9wZXJsb2c6ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg6K+m57uGCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5Nb25pdG9yLk9wZXJsb2c+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJvcGVySWQiCisgICAgICAgICAga2V5PSJvcGVybG9nTGlzdCIKKyAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgIGxhYmVsV2lkdGg6IDEyMCwKKyAgICAgICAgICB9fQorICAgICAgICAgIHRvb2xCYXJSZW5kZXI9eygpID0+IFsKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJhZGQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm9wZXJsb2c6YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5uZXciIGRlZmF1bHRNZXNzYWdlPSLmlrDlu7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06b3BlcmxvZzpyZW1vdmUnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKyAgICAgICAgICAgICAgICAgIGljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICBhc3luYyBvbk9rKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHsgfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUiIGRlZmF1bHRNZXNzYWdlPSLliKDpmaQiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpvcGVybG9nOmV4cG9ydCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhwb3J0KCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXRPcGVybG9nTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5Nb25pdG9yLk9wZXJsb2dMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgIDxGb290ZXJUb29sYmFyCisgICAgICAgICAgZXh0cmE9eworICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmNob3NlbiIgZGVmYXVsdE1lc3NhZ2U9IuW3sumAieaLqSIgLz4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLml0ZW0iIGRlZmF1bHRNZXNzYWdlPSLpobkiIC8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06b3BlcmxvZzpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxVcGRhdGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzKSA9PiB7CisgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICBpZiAodmFsdWVzLm9wZXJJZCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVVwZGF0ZSh7IC4uLnZhbHVlcyB9IGFzIEFQSS5Nb25pdG9yLk9wZXJsb2cpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLk1vbml0b3IuT3BlcmxvZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17bW9kYWxWaXNpYmxlfQorICAgICAgICB2YWx1ZXM9e2N1cnJlbnRSb3cgfHwge319CisgICAgICAgIGJ1c2luZXNzVHlwZU9wdGlvbnM9e2J1c2luZXNzVHlwZU9wdGlvbnN9CisgICAgICAgIG9wZXJhdG9yVHlwZU9wdGlvbnM9e29wZXJhdG9yVHlwZU9wdGlvbnN9CisgICAgICAgIHN0YXR1c09wdGlvbnM9e3N0YXR1c09wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE9wZXJsb2dUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9TZXJ2ZXIvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvU2VydmVyL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEzOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvU2VydmVyL2luZGV4LnRzeApAQCAtMCwwICsxLDI2NyBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBnZXRTZXJ2ZXJJbmZvIH0gZnJvbSAnQC9zZXJ2aWNlcy9tb25pdG9yL3NlcnZlcic7CitpbXBvcnQgeyBDYXJkLCBDb2wsIFJvdywgVGFibGUgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCBzdHlsZXMgZnJvbSAnLi9zdHlsZS5sZXNzJzsKKworCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjMvMDIvMDcKKyAqIAorICogKi8KKworCitjb25zdCBjb2x1bW5zID0gWworCXsKKwkJdGl0bGU6ICflsZ7mgKcnLAorCQlkYXRhSW5kZXg6ICduYW1lJywKKwkJa2V5OiAnbmFtZScsCisJfSwKKwl7CisJCXRpdGxlOiAn5YC8JywKKwkJZGF0YUluZGV4OiAndmFsdWUnLAorCQlrZXk6ICd2YWx1ZScsCisJfSwKK107CisKK2NvbnN0IG1lbUNvbHVtbnMgPSBbCisJeworCQl0aXRsZTogJ+WxnuaApycsCisJCWRhdGFJbmRleDogJ25hbWUnLAorCQlrZXk6ICduYW1lJywKKwl9LAorCXsKKwkJdGl0bGU6ICflhoXlrZgnLAorCQlkYXRhSW5kZXg6ICdtZW0nLAorCQlrZXk6ICdtZW0nLAorCX0sCisJeworCQl0aXRsZTogJ0pWTScsCisJCWRhdGFJbmRleDogJ2p2bScsCisJCWtleTogJ2p2bScsCisJfSwKK107CisKK2NvbnN0IGhvc3RDb2x1bW5zID0gWworCXsKKwkJdGl0bGU6ICdjb2wxJywKKwkJZGF0YUluZGV4OiAnY29sMScsCisJCWtleTogJ2NvbDEnLAorCX0sCisJeworCQl0aXRsZTogJ2NvbDInLAorCQlkYXRhSW5kZXg6ICdjb2wyJywKKwkJa2V5OiAnY29sMicsCisJfSwKKwl7CisJCXRpdGxlOiAnY29sMycsCisJCWRhdGFJbmRleDogJ2NvbDMnLAorCQlrZXk6ICdjb2wzJywKKwl9LAorCXsKKwkJdGl0bGU6ICdjb2w0JywKKwkJZGF0YUluZGV4OiAnY29sNCcsCisJCWtleTogJ2NvbDQnLAorCX0sCitdOworCitjb25zdCBkaXNrQ29sdW1ucyA9IFsKKwl7CisJCXRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5zZXJ2ZXIuZGlzay5kaXJOYW1lIiBkZWZhdWx0TWVzc2FnZT0i55uY56ym6Lev5b6EIiAvPiwKKwkJZGF0YUluZGV4OiAnZGlyTmFtZScsCisJCWtleTogJ2Rpck5hbWUnLAorCX0sCisJeworCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuc2VydmVyLmRpc2suc3lzVHlwZU5hbWUiIGRlZmF1bHRNZXNzYWdlPSLmlofku7bns7vnu58iIC8+LAorCQlkYXRhSW5kZXg6ICdzeXNUeXBlTmFtZScsCisJCWtleTogJ3N5c1R5cGVOYW1lJywKKwl9LAorCXsKKwkJdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLnNlcnZlci5kaXNrLnR5cGVOYW1lIiBkZWZhdWx0TWVzc2FnZT0i55uY56ym57G75Z6LIiAvPiwKKwkJZGF0YUluZGV4OiAndHlwZU5hbWUnLAorCQlrZXk6ICd0eXBlTmFtZScsCisJfSwKKwl7CisJCXRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5zZXJ2ZXIuZGlzay50b3RhbCIgZGVmYXVsdE1lc3NhZ2U9IuaAu+Wkp+WwjyIgLz4sCisJCWRhdGFJbmRleDogJ3RvdGFsJywKKwkJa2V5OiAndG90YWwnLAorCX0sCisJeworCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iuc2VydmVyLmRpc2suZnJlZSIgZGVmYXVsdE1lc3NhZ2U9IuWPr+eUqOWkp+WwjyIgLz4sCisJCWRhdGFJbmRleDogJ2ZyZWUnLAorCQlrZXk6ICdmcmVlJywKKwl9LAorCXsKKwkJdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLnNlcnZlci5kaXNrLnVzZWQiIGRlZmF1bHRNZXNzYWdlPSLlt7LnlKjlpKflsI8iIC8+LAorCQlkYXRhSW5kZXg6ICd1c2VkJywKKwkJa2V5OiAndXNlZCcsCisJfSwKKwl7CisJCXRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5zZXJ2ZXIuZGlzay51c2FnZSIgZGVmYXVsdE1lc3NhZ2U9IuW3sueUqOeZvuWIhuavlCIgLz4sCisJCWRhdGFJbmRleDogJ3VzYWdlJywKKwkJa2V5OiAndXNhZ2UnLAorCX0sCitdOworCitjb25zdCBTZXJ2ZXJJbmZvOiBSZWFjdC5GQyA9ICgpID0+IHsKKwljb25zdCBbY3B1RGF0YSwgc2V0Q3B1RGF0YV0gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5DcHVSb3dUeXBlW10+KFtdKTsKKwljb25zdCBbbWVtRGF0YSwgc2V0TWVtRGF0YV0gPSB1c2VTdGF0ZTxBUEkuTW9uaXRvci5NZW1Sb3dUeXBlW10+KFtdKTsKKwljb25zdCBbaG9zdERhdGEsIHNldEhvc3REYXRhXSA9IHVzZVN0YXRlPGFueT4oW10pOworCWNvbnN0IFtqdm1EYXRhLCBzZXRKdm1EYXRhXSA9IHVzZVN0YXRlPGFueT4oW10pOworCWNvbnN0IFtkaXNrRGF0YSwgc2V0RGlza0RhdGFdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKwl1c2VFZmZlY3QoKCkgPT4geworCQlnZXRTZXJ2ZXJJbmZvKCkudGhlbigocmVzOiBBUEkuTW9uaXRvci5TZXJ2ZXJJbmZvUmVzcG9uc2VUeXBlKSA9PiB7CisJCQlpZiAocmVzLmNvZGUgPT09IDIwMCkgeworCQkJCS8vIGNvbnN0IGNwdWluZm86IENwdVJvd1R5cGVbXSA9IFtdOworCQkJCS8vIE9iamVjdC5rZXlzKHJlcy5kYXRhLmNwdSkuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7CisJCQkJLy8gICBjcHVpbmZvLnB1c2goeworCQkJCS8vICAgICBuYW1lOiBpdGVtLAorCQkJCS8vICAgICB2YWx1ZTogcmVzLmRhdGEuY3B1W2l0ZW1dLAorCQkJCS8vICAgfSk7CisJCQkJLy8gfSk7CisJCQkJLy8gc2V0Q3B1RGF0YShjcHVpbmZvKTsKKworCQkJCWNvbnN0IGNwdWluZm86IEFQSS5Nb25pdG9yLkNwdVJvd1R5cGVbXSA9IFtdOworCQkJCWNwdWluZm8ucHVzaCh7IG5hbWU6ICfmoLjlv4PmlbAnLCB2YWx1ZTogcmVzLmRhdGEuY3B1LmNwdU51bSB9KTsKKwkJCQljcHVpbmZvLnB1c2goeyBuYW1lOiAn55So5oi35L2/55So546HJywgdmFsdWU6IGAke3Jlcy5kYXRhLmNwdS51c2VkfSVgIH0pOworCQkJCWNwdWluZm8ucHVzaCh7IG5hbWU6ICfns7vnu5/kvb/nlKjnjocnLCB2YWx1ZTogYCR7cmVzLmRhdGEuY3B1LnN5c30lYCB9KTsKKwkJCQljcHVpbmZvLnB1c2goeyBuYW1lOiAn5b2T5YmN56m66Zey546HJywgdmFsdWU6IGAke3Jlcy5kYXRhLmNwdS5mcmVlfSVgIH0pOworCisJCQkJc2V0Q3B1RGF0YShjcHVpbmZvKTsKKworCQkJCWNvbnN0IG1lbURhdGFzOiBBUEkuTW9uaXRvci5NZW1Sb3dUeXBlW10gPSBbXTsKKwkJCQltZW1EYXRhcy5wdXNoKHsKKwkJCQkJbmFtZTogJ+aAu+WGheWtmCcsCisJCQkJCW1lbTogYCR7cmVzLmRhdGEubWVtLnRvdGFsfUdgLAorCQkJCQlqdm06IGAke3Jlcy5kYXRhLmp2bS50b3RhbH1NYCwKKwkJCQl9KTsKKwkJCQltZW1EYXRhcy5wdXNoKHsKKwkJCQkJbmFtZTogJ+W3sueUqOWGheWtmCcsCisJCQkJCW1lbTogYCR7cmVzLmRhdGEubWVtLnVzZWR9R2AsCisJCQkJCWp2bTogYCR7cmVzLmRhdGEuanZtLnVzZWR9TWAsCisJCQkJfSk7CisJCQkJbWVtRGF0YXMucHVzaCh7CisJCQkJCW5hbWU6ICfliankvZnlhoXlrZgnLAorCQkJCQltZW06IGAke3Jlcy5kYXRhLm1lbS5mcmVlfUdgLAorCQkJCQlqdm06IGAke3Jlcy5kYXRhLmp2bS5mcmVlfU1gLAorCQkJCX0pOworCQkJCW1lbURhdGFzLnB1c2goeworCQkJCQluYW1lOiAn5L2/55So546HJywKKwkJCQkJbWVtOiBgJHtyZXMuZGF0YS5tZW0udXNhZ2V9JWAsCisJCQkJCWp2bTogYCR7cmVzLmRhdGEuanZtLnVzYWdlfSVgLAorCQkJCX0pOworCQkJCXNldE1lbURhdGEobWVtRGF0YXMpOworCisJCQkJY29uc3QgaG9zdGluZm8gPSBbXTsKKwkJCQlob3N0aW5mby5wdXNoKHsKKwkJCQkJY29sMTogJ+acjeWKoeWZqOWQjeensCcsCisJCQkJCWNvbDI6IHJlcy5kYXRhLnN5cy5jb21wdXRlck5hbWUsCisJCQkJCWNvbDM6ICfmk43kvZzns7vnu58nLAorCQkJCQljb2w0OiByZXMuZGF0YS5zeXMub3NOYW1lLAorCQkJCX0pOworCQkJCWhvc3RpbmZvLnB1c2goeworCQkJCQljb2wxOiAn5pyN5Yqh5ZmoSVAnLAorCQkJCQljb2wyOiByZXMuZGF0YS5zeXMuY29tcHV0ZXJJcCwKKwkJCQkJY29sMzogJ+ezu+e7n+aetuaehCcsCisJCQkJCWNvbDQ6IHJlcy5kYXRhLnN5cy5vc0FyY2gsCisJCQkJfSk7CisJCQkJc2V0SG9zdERhdGEoaG9zdGluZm8pOworCisJCQkJY29uc3QganZtaW5mbyA9IFtdOworCQkJCWp2bWluZm8ucHVzaCh7CisJCQkJCWNvbDE6ICdKYXZh5ZCN56ewJywKKwkJCQkJY29sMjogcmVzLmRhdGEuanZtLm5hbWUsCisJCQkJCWNvbDM6ICdKYXZh54mI5pysJywKKwkJCQkJY29sNDogcmVzLmRhdGEuanZtLnZlcnNpb24sCisJCQkJfSk7CisJCQkJanZtaW5mby5wdXNoKHsKKwkJCQkJY29sMTogJ+WQr+WKqOaXtumXtCcsCisJCQkJCWNvbDI6IHJlcy5kYXRhLmp2bS5zdGFydFRpbWUsCisJCQkJCWNvbDM6ICfov5DooYzml7bplb8nLAorCQkJCQljb2w0OiByZXMuZGF0YS5qdm0ucnVuVGltZSwKKwkJCQl9KTsKKwkJCQlqdm1pbmZvLnB1c2goeworCQkJCQljb2wxOiAn5a6J6KOF6Lev5b6EJywKKwkJCQkJY29sMjogcmVzLmRhdGEuanZtLmhvbWUsCisJCQkJCWNvbDM6ICfpobnnm67ot6/lvoQnLAorCQkJCQljb2w0OiByZXMuZGF0YS5zeXMudXNlckRpciwKKwkJCQl9KTsKKwkJCQlzZXRKdm1EYXRhKGp2bWluZm8pOworCisJCQkJY29uc3QgZGlza2luZm8gPSByZXMuZGF0YS5zeXNGaWxlcy5tYXAoKGl0ZW06IEFQSS5Nb25pdG9yLkRpc2tJbmZvVHlwZSkgPT4geworCQkJCQlyZXR1cm4geworCQkJCQkJZGlyTmFtZTogaXRlbS5kaXJOYW1lLAorCQkJCQkJc3lzVHlwZU5hbWU6IGl0ZW0uc3lzVHlwZU5hbWUsCisJCQkJCQl0eXBlTmFtZTogaXRlbS50eXBlTmFtZSwKKwkJCQkJCXRvdGFsOiBpdGVtLnRvdGFsLAorCQkJCQkJZnJlZTogaXRlbS5mcmVlLAorCQkJCQkJdXNlZDogaXRlbS51c2VkLAorCQkJCQkJdXNhZ2U6IGAke2l0ZW0udXNhZ2V9JWAsCisJCQkJCX07CisJCQkJfSk7CisJCQkJc2V0RGlza0RhdGEoZGlza2luZm8pOworCQkJfQorCQl9KTsKKwl9LCBbXSk7CisKKwlyZXR1cm4gKAorCQk8ZGl2PgorCQkJPFJvdyBndXR0ZXI9e1syNCwgMjRdfT4KKwkJCQk8Q29sIHNwYW49ezEyfT4KKwkJCQkJPENhcmQgdGl0bGU9IkNQVSIgY2xhc3NOYW1lPXtzdHlsZXMuY2FyZH0+CisJCQkJCQk8VGFibGUgcm93S2V5PSJuYW1lIiBwYWdpbmF0aW9uPXtmYWxzZX0gc2hvd0hlYWRlcj17ZmFsc2V9IGRhdGFTb3VyY2U9e2NwdURhdGF9IGNvbHVtbnM9e2NvbHVtbnN9IC8+CisJCQkJCTwvQ2FyZD4KKwkJCQk8L0NvbD4KKwkJCQk8Q29sIHNwYW49ezEyfT4KKwkJCQkJPENhcmQgdGl0bGU9IuWGheWtmCIgY2xhc3NOYW1lPXtzdHlsZXMuY2FyZH0+CisJCQkJCQk8VGFibGUKKwkJCQkJCQlyb3dLZXk9Im5hbWUiCisJCQkJCQkJcGFnaW5hdGlvbj17ZmFsc2V9CisJCQkJCQkJc2hvd0hlYWRlcj17ZmFsc2V9CisJCQkJCQkJZGF0YVNvdXJjZT17bWVtRGF0YX0KKwkJCQkJCQljb2x1bW5zPXttZW1Db2x1bW5zfQorCQkJCQkJLz4KKwkJCQkJPC9DYXJkPgorCQkJCTwvQ29sPgorCQkJPC9Sb3c+CisJCQk8Um93IGd1dHRlcj17WzE2LCAxNl19PgorCQkJCTxDb2wgc3Bhbj17MjR9PgorCQkJCQk8Q2FyZCB0aXRsZT0i5pyN5Yqh5Zmo5L+h5oGvIiBjbGFzc05hbWU9e3N0eWxlcy5jYXJkfT4KKwkJCQkJCTxUYWJsZQorCQkJCQkJCXJvd0tleT0iY29sMSIKKwkJCQkJCQlwYWdpbmF0aW9uPXtmYWxzZX0KKwkJCQkJCQlzaG93SGVhZGVyPXtmYWxzZX0KKwkJCQkJCQlkYXRhU291cmNlPXtob3N0RGF0YX0KKwkJCQkJCQljb2x1bW5zPXtob3N0Q29sdW1uc30KKwkJCQkJCS8+CisJCQkJCTwvQ2FyZD4KKwkJCQk8L0NvbD4KKwkJCTwvUm93PgorCQkJPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKwkJCQk8Q29sIHNwYW49ezI0fT4KKwkJCQkJPENhcmQgdGl0bGU9IkphdmHomZrmi5/mnLrkv6Hmga8iIGNsYXNzTmFtZT17c3R5bGVzLmNhcmR9PgorCQkJCQkJPFRhYmxlCisJCQkJCQkJcm93S2V5PSJjb2wxIgorCQkJCQkJCXBhZ2luYXRpb249e2ZhbHNlfQorCQkJCQkJCXNob3dIZWFkZXI9e2ZhbHNlfQorCQkJCQkJCWRhdGFTb3VyY2U9e2p2bURhdGF9CisJCQkJCQkJY29sdW1ucz17aG9zdENvbHVtbnN9CisJCQkJCQkvPgorCQkJCQk8L0NhcmQ+CisJCQkJPC9Db2w+CisJCQk8L1Jvdz4KKwkJCTxSb3cgZ3V0dGVyPXtbMTYsIDE2XX0+CisJCQkJPENvbCBzcGFuPXsyNH0+CisJCQkJCTxDYXJkIHRpdGxlPSLno4Hnm5jnirbmgIEiIGNsYXNzTmFtZT17c3R5bGVzLmNhcmR9PgorCQkJCQkJPFRhYmxlIHJvd0tleT0iZGlyTmFtZSIgcGFnaW5hdGlvbj17ZmFsc2V9IGRhdGFTb3VyY2U9e2Rpc2tEYXRhfSBjb2x1bW5zPXtkaXNrQ29sdW1uc30gLz4KKwkJCQkJPC9DYXJkPgorCQkJCTwvQ29sPgorCQkJPC9Sb3c+CisJCTwvZGl2PgorCSk7Cit9OworCitleHBvcnQgZGVmYXVsdCBTZXJ2ZXJJbmZvOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvU2VydmVyL3N0eWxlLmxlc3MgYi9yZWFjdC11aS9zcmMvcGFnZXMvTW9uaXRvci9TZXJ2ZXIvc3R5bGUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ0YTUzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL01vbml0b3IvU2VydmVyL3N0eWxlLmxlc3MKQEAgLTAsMCArMSwxMSBAQAorCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjEvMDkvMTYKKyAqIAorICogKi8KKworLmNhcmQgeworICBtYXJnaW4tYm90dG9tOiAxMnB4OworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Db25maWcvZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0NvbmZpZy9lZGl0LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2IzOTQyCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Db25maWcvZWRpdC50c3gKQEAgLTAsMCArMSwxNzIgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeworICBQcm9Gb3JtLAorICBQcm9Gb3JtRGlnaXQsCisgIFByb0Zvcm1UZXh0LAorICBQcm9Gb3JtVGV4dEFyZWEsCisgIFByb0Zvcm1SYWRpbywKKyAgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBGb3JtLCBNb2RhbH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBEaWN0VmFsdWVFbnVtT2JqIH0gZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworCitleHBvcnQgdHlwZSBDb25maWdGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuU3lzdGVtLkNvbmZpZz47CisKK2V4cG9ydCB0eXBlIENvbmZpZ0Zvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBDb25maWdGb3JtRGF0YSkgPT4gdm9pZDsKKyAgb25TdWJtaXQ6ICh2YWx1ZXM6IENvbmZpZ0Zvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLlN5c3RlbS5Db25maWc+OworICBjb25maWdUeXBlT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IENvbmZpZ0Zvcm06IFJlYWN0LkZDPENvbmZpZ0Zvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisgIAorICBjb25zdCB7IGNvbmZpZ1R5cGVPcHRpb25zIH0gPSBwcm9wczsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGZvcm0ucmVzZXRGaWVsZHMoKTsKKyAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKwkJCWNvbmZpZ0lkOiBwcm9wcy52YWx1ZXMuY29uZmlnSWQsCisJCQljb25maWdOYW1lOiBwcm9wcy52YWx1ZXMuY29uZmlnTmFtZSwKKwkJCWNvbmZpZ0tleTogcHJvcHMudmFsdWVzLmNvbmZpZ0tleSwKKwkJCWNvbmZpZ1ZhbHVlOiBwcm9wcy52YWx1ZXMuY29uZmlnVmFsdWUsCisJCQljb25maWdUeXBlOiBwcm9wcy52YWx1ZXMuY29uZmlnVHlwZSwKKwkJCWNyZWF0ZUJ5OiBwcm9wcy52YWx1ZXMuY3JlYXRlQnksCisJCQljcmVhdGVUaW1lOiBwcm9wcy52YWx1ZXMuY3JlYXRlVGltZSwKKwkJCXVwZGF0ZUJ5OiBwcm9wcy52YWx1ZXMudXBkYXRlQnksCisJCQl1cGRhdGVUaW1lOiBwcm9wcy52YWx1ZXMudXBkYXRlVGltZSwKKwkJCXJlbWFyazogcHJvcHMudmFsdWVzLnJlbWFyaywKKyAgICB9KTsKKyAgfSwgW2Zvcm0sIHByb3BzXSk7CisKKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKyAgY29uc3QgaGFuZGxlT2sgPSAoKSA9PiB7CisgICAgZm9ybS5zdWJtaXQoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uQ2FuY2VsKCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBwcm9wcy5vblN1Ym1pdCh2YWx1ZXMgYXMgQ29uZmlnRm9ybURhdGEpOworICB9OworCisgIHJldHVybiAoCisgICAgPE1vZGFsCisgICAgICB3aWR0aD17NjQwfQorICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgIGlkOiAnc3lzdGVtLmNvbmZpZy50aXRsZScsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn57yW6L6R5Y+C5pWw6YWN572uJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKwkJICA8UHJvRm9ybSAKKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgc3VibWl0dGVyPXtmYWxzZX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIiAKKyAgICAgICAgb25GaW5pc2g9e2hhbmRsZUZpbmlzaH0+CisgICAgICAgIDxQcm9Gb3JtRGlnaXQKKyAgICAgICAgICBuYW1lPSJjb25maWdJZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmNvbmZpZy5jb25maWdfaWQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflj4LmlbDkuLvplK4nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlj4LmlbDkuLvplK4iCisgICAgICAgICAgZGlzYWJsZWQKKyAgICAgICAgICBoaWRkZW49e3RydWV9CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5Y+C5pWw5Li76ZSu77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5Y+C5pWw5Li76ZSu77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0iY29uZmlnTmFtZSIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmNvbmZpZy5jb25maWdfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WPguaVsOWQjeensCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWPguaVsOWQjeensCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlj4LmlbDlkI3np7DvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlj4LmlbDlkI3np7DvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJjb25maWdLZXkiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5jb25maWcuY29uZmlnX2tleScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WPguaVsOmUruWQjScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWPguaVsOmUruWQjSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlj4LmlbDplK7lkI3vvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlj4LmlbDplK7lkI3vvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0iY29uZmlnVmFsdWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5jb25maWcuY29uZmlnX3ZhbHVlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5Y+C5pWw6ZSu5YC8JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5Y+C5pWw6ZSu5YC8IgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWPguaVsOmUruWAvO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWPguaVsOmUruWAvO+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICB2YWx1ZUVudW09e2NvbmZpZ1R5cGVPcHRpb25zfQorICAgICAgICAgIG5hbWU9ImNvbmZpZ1R5cGUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5jb25maWcuY29uZmlnX3R5cGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfns7vnu5/lhoXnva4nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXns7vnu5/lhoXnva4iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl57O757uf5YaF572u77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl57O757uf5YaF572u77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0QXJlYQorICAgICAgICAgIG5hbWU9InJlbWFyayIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmNvbmZpZy5yZW1hcmsnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflpIfms6gnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlpIfms6giCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5aSH5rOo77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5aSH5rOo77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgQ29uZmlnRm9ybTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vQ29uZmlnL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vQ29uZmlnL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI4ODkxCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Db25maWcvaW5kZXgudHN4CkBAIC0wLDAgKzEsMzk3IEBACisKK2ltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlLCB1c2VBY2Nlc3MgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB0eXBlIHsgRm9ybUluc3RhbmNlIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBCdXR0b24sIG1lc3NhZ2UsIE1vZGFsIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBBY3Rpb25UeXBlLCBGb290ZXJUb29sYmFyLCBQYWdlQ29udGFpbmVyLCBQcm9Db2x1bW5zLCBQcm9UYWJsZSB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IFBsdXNPdXRsaW5lZCwgRGVsZXRlT3V0bGluZWQsIEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQsIFJlbG9hZE91dGxpbmVkLCBEb3dubG9hZE91dGxpbmVkIH0gZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IHsgZ2V0Q29uZmlnTGlzdCwgcmVtb3ZlQ29uZmlnLCBhZGRDb25maWcsIHVwZGF0ZUNvbmZpZywgZXhwb3J0Q29uZmlnLCByZWZyZXNoQ29uZmlnQ2FjaGUgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9jb25maWcnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCBEaWN0VGFnIGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworLyoqCisgKiDmt7vliqDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZUFkZCA9IGFzeW5jIChmaWVsZHM6IEFQSS5TeXN0ZW0uQ29uZmlnKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGRDb25maWcoeyAuLi5maWVsZHMgfSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmt7vliqDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfmt7vliqDlpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5pu05paw6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVVcGRhdGUgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLkNvbmZpZykgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjmm7TmlrAnKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlQ29uZmlnKGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuU3lzdGVtLkNvbmZpZ1tdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZUNvbmZpZyhzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy5jb25maWdJZCkuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WIoOmZpOaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVtb3ZlT25lID0gYXN5bmMgKHNlbGVjdGVkUm93OiBBUEkuU3lzdGVtLkNvbmZpZykgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LmNvbmZpZ0lkXTsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlQ29uZmlnKHBhcmFtcy5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOWvvOWHuuaVsOaNrgorICoKKyAqCisgKi8KK2NvbnN0IGhhbmRsZUV4cG9ydCA9IGFzeW5jICgpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5a+85Ye6Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZXhwb3J0Q29uZmlnKCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVmcmVzaENhY2hlID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliLfmlrAnKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCByZWZyZXNoQ29uZmlnQ2FjaGUoKTsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCfliLfmlrDmiJDlip8nKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yi35paw5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjb25zdCBDb25maWdUYWJsZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBmb3JtVGFibGVSZWYgPSB1c2VSZWY8Rm9ybUluc3RhbmNlPigpOworCisgIGNvbnN0IFttb2RhbFZpc2libGUsIHNldE1vZGFsVmlzaWJsZV0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisKKyAgY29uc3QgYWN0aW9uUmVmID0gdXNlUmVmPEFjdGlvblR5cGU+KCk7CisgIGNvbnN0IFtjdXJyZW50Um93LCBzZXRDdXJyZW50Um93XSA9IHVzZVN0YXRlPEFQSS5TeXN0ZW0uQ29uZmlnPigpOworICBjb25zdCBbc2VsZWN0ZWRSb3dzLCBzZXRTZWxlY3RlZFJvd3NdID0gdXNlU3RhdGU8QVBJLlN5c3RlbS5Db25maWdbXT4oW10pOworCisgIGNvbnN0IFtjb25maWdUeXBlT3B0aW9ucywgc2V0Q29uZmlnVHlwZU9wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX3llc19ubycpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldENvbmZpZ1R5cGVPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxBUEkuU3lzdGVtLkNvbmZpZz5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5jb25maWcuY29uZmlnX2lkIiBkZWZhdWx0TWVzc2FnZT0i5Y+C5pWw5Li76ZSuIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NvbmZpZ0lkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uY29uZmlnLmNvbmZpZ19uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5Y+C5pWw5ZCN56ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NvbmZpZ05hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5jb25maWcuY29uZmlnX2tleSIgZGVmYXVsdE1lc3NhZ2U9IuWPguaVsOmUruWQjSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdjb25maWdLZXknLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5jb25maWcuY29uZmlnX3ZhbHVlIiBkZWZhdWx0TWVzc2FnZT0i5Y+C5pWw6ZSu5YC8IiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NvbmZpZ1ZhbHVlJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHRhcmVhJywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLmNvbmZpZy5jb25maWdfdHlwZSIgZGVmYXVsdE1lc3NhZ2U9Iuezu+e7n+WGhee9riIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdjb25maWdUeXBlJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IGNvbmZpZ1R5cGVPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcgZW51bXM9e2NvbmZpZ1R5cGVPcHRpb25zfSB2YWx1ZT17cmVjb3JkLmNvbmZpZ1R5cGV9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5jb25maWcucmVtYXJrIiBkZWZhdWx0TWVzc2FnZT0i5aSH5rOoIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3JlbWFyaycsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0YXJlYScsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzEyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmNvbmZpZzplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDnvJbovpEKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmNvbmZpZzpyZW1vdmUnKX0KKyAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlT25lKHJlY29yZCk7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg5Yig6ZmkCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5TeXN0ZW0uQ29uZmlnPgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0iY29uZmlnSWQiCisgICAgICAgICAga2V5PSJjb25maWdMaXN0IgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImFkZCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06Y29uZmlnOmFkZCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUubmV3IiBkZWZhdWx0TWVzc2FnZT0i5paw5bu6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmNvbmZpZzpyZW1vdmUnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKyAgICAgICAgICAgICAgICAgIGljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICBhc3luYyBvbk9rKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHsgfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUiIGRlZmF1bHRNZXNzYWdlPSLliKDpmaQiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpjb25maWc6ZXhwb3J0Jyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFeHBvcnQoKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERvd25sb2FkT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJyZWZyZXNoIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06Y29uZmlnOnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgaGFuZGxlUmVmcmVzaENhY2hlKCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxSZWxvYWRPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLmNvbmZpZy5yZWZyZXNoQ2FjaGUiIGRlZmF1bHRNZXNzYWdlPSLliLfmlrDnvJPlrZgiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgXX0KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0Q29uZmlnTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5TeXN0ZW0uQ29uZmlnTGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmNvbmZpZzpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxVcGRhdGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzKSA9PiB7CisgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICBpZiAodmFsdWVzLmNvbmZpZ0lkKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlVXBkYXRlKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5Db25maWcpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5Db25maWcpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH19CisgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgIH19CisgICAgICAgIG9wZW49e21vZGFsVmlzaWJsZX0KKyAgICAgICAgdmFsdWVzPXtjdXJyZW50Um93IHx8IHt9fQorICAgICAgICBjb25maWdUeXBlT3B0aW9ucz17Y29uZmlnVHlwZU9wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IENvbmZpZ1RhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGVwdC9lZGl0LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGVwdC9lZGl0LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY0ODEzCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9EZXB0L2VkaXQudHN4CkBAIC0wLDAgKzEsMjEyIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsKKyAgUHJvRm9ybSwKKyAgUHJvRm9ybURpZ2l0LAorICBQcm9Gb3JtVGV4dCwKKyAgUHJvRm9ybVJhZGlvLAorICBQcm9Gb3JtVHJlZVNlbGVjdCwKK30gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgRm9ybSwgTW9kYWx9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgRGF0YU5vZGUgfSBmcm9tICdhbnRkL2VzL3RyZWUnOworaW1wb3J0IHsgRGljdFZhbHVlRW51bU9iaiB9IGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworZXhwb3J0IHR5cGUgRGVwdEZvcm1EYXRhID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBQYXJ0aWFsPEFQSS5TeXN0ZW0uRGVwdD47CisKK2V4cG9ydCB0eXBlIERlcHRGb3JtUHJvcHMgPSB7CisgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogRGVwdEZvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogRGVwdEZvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLlN5c3RlbS5EZXB0PjsKKyAgZGVwdFRyZWU6IERhdGFOb2RlW107CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7Cit9OworCitjb25zdCBEZXB0Rm9ybTogUmVhY3QuRkM8RGVwdEZvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgY29uc3QgeyBzdGF0dXNPcHRpb25zLCBkZXB0VHJlZSB9ID0gcHJvcHM7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgICAgZm9ybS5zZXRGaWVsZHNWYWx1ZSh7CisgICAgICBkZXB0SWQ6IHByb3BzLnZhbHVlcy5kZXB0SWQsCisgICAgICBwYXJlbnRJZDogcHJvcHMudmFsdWVzLnBhcmVudElkLAorICAgICAgYW5jZXN0b3JzOiBwcm9wcy52YWx1ZXMuYW5jZXN0b3JzLAorICAgICAgZGVwdE5hbWU6IHByb3BzLnZhbHVlcy5kZXB0TmFtZSwKKyAgICAgIG9yZGVyTnVtOiBwcm9wcy52YWx1ZXMub3JkZXJOdW0sCisgICAgICBsZWFkZXI6IHByb3BzLnZhbHVlcy5sZWFkZXIsCisgICAgICBwaG9uZTogcHJvcHMudmFsdWVzLnBob25lLAorICAgICAgZW1haWw6IHByb3BzLnZhbHVlcy5lbWFpbCwKKyAgICAgIHN0YXR1czogcHJvcHMudmFsdWVzLnN0YXR1cywKKyAgICAgIGRlbEZsYWc6IHByb3BzLnZhbHVlcy5kZWxGbGFnLAorICAgICAgY3JlYXRlQnk6IHByb3BzLnZhbHVlcy5jcmVhdGVCeSwKKyAgICAgIGNyZWF0ZVRpbWU6IHByb3BzLnZhbHVlcy5jcmVhdGVUaW1lLAorICAgICAgdXBkYXRlQnk6IHByb3BzLnZhbHVlcy51cGRhdGVCeSwKKyAgICAgIHVwZGF0ZVRpbWU6IHByb3BzLnZhbHVlcy51cGRhdGVUaW1lLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgIHByb3BzLm9uU3VibWl0KHZhbHVlcyBhcyBEZXB0Rm9ybURhdGEpOworICB9OworCisgIHJldHVybiAoCisgICAgPE1vZGFsCisgICAgICB3aWR0aD17NjQwfQorICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgIGlkOiAnc3lzdGVtLmRlcHQudGl0bGUnLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e8lui+kemDqOmXqCcsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBmb3JjZVJlbmRlcgorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIG9uT2s9e2hhbmRsZU9rfQorICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH0KKyAgICA+CisgICAgICA8UHJvRm9ybQorICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICBzdWJtaXR0ZXI9e2ZhbHNlfQorICAgICAgICBsYXlvdXQ9Imhvcml6b250YWwiCisgICAgICAgIG9uRmluaXNoPXtoYW5kbGVGaW5pc2h9PgorICAgICAgICA8UHJvRm9ybURpZ2l0CisgICAgICAgICAgbmFtZT0iZGVwdElkIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGVwdC5kZXB0X2lkJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6YOo6ZeoaWQnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpemDqOmXqGlkIgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpemDqOmXqGlk77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6YOo6ZeoaWTvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRyZWVTZWxlY3QKKyAgICAgICAgICBuYW1lPSJwYXJlbnRJZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmRlcHQucGFyZW50X2RlcHQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfkuIrnuqfpg6jpl6g6JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICByZXF1ZXN0PXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gZGVwdFRyZWU7CisgICAgICAgICAgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36YCJ5oup5LiK57qn6YOo6ZeoIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiAoCisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeUqOaIt+aYteensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+mAieaLqeS4iue6p+mDqOmXqCEiIC8+CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImRlcHROYW1lIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGVwdC5kZXB0X25hbWUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfpg6jpl6jlkI3np7AnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpemDqOmXqOWQjeensCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXpg6jpl6jlkI3np7DvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXpg6jpl6jlkI3np7DvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybURpZ2l0CisgICAgICAgICAgbmFtZT0ib3JkZXJOdW0iCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kZXB0Lm9yZGVyX251bScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aYvuekuumhuuW6jycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5pi+56S66aG65bqPIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImxlYWRlciIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmRlcHQubGVhZGVyJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6LSf6LSj5Lq6JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXotJ/otKPkuroiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6LSf6LSj5Lq677yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6LSf6LSj5Lq677yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0icGhvbmUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kZXB0LnBob25lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6IGU57O755S16K+dJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXogZTns7vnlLXor50iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6IGU57O755S16K+d77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6IGU57O755S16K+d77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0iZW1haWwiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kZXB0LmVtYWlsJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6YKu566xJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXpgq7nrrEiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6YKu566x77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6YKu566x77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kZXB0LnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+mDqOmXqOeKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6YOo6Zeo54q25oCBIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpemDqOmXqOeKtuaAge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpemDqOmXqOeKtuaAge+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICA8L1Byb0Zvcm0+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IERlcHRGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9EZXB0L2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGVwdC9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExYzVkZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGVwdC9pbmRleC50c3gKQEAgLTAsMCArMSwzNDYgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldERlcHRMaXN0LCByZW1vdmVEZXB0LCBhZGREZXB0LCB1cGRhdGVEZXB0LCBnZXREZXB0TGlzdEV4Y2x1ZGVDaGlsZCB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL2RlcHQnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCB7IGJ1aWxkVHJlZURhdGEgfSBmcm9tICdAL3V0aWxzL3RyZWUnOworaW1wb3J0IERpY3RUYWcgZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworCisvKioKKyAqIOa3u+WKoOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlQWRkID0gYXN5bmMgKGZpZWxkczogQVBJLlN5c3RlbS5EZXB0KSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGREZXB0KHsgLi4uZmllbGRzIH0pOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5re75Yqg5oiQ5YqfJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5re75Yqg5aSx6LSl6K+36YeN6K+V77yBJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOabtOaWsOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlVXBkYXRlID0gYXN5bmMgKGZpZWxkczogQVBJLlN5c3RlbS5EZXB0KSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOabtOaWsCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB1cGRhdGVEZXB0KGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuU3lzdGVtLkRlcHRbXSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvd3MpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVEZXB0KHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4gcm93LmRlcHRJZCkuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WIoOmZpOaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVtb3ZlT25lID0gYXN5bmMgKHNlbGVjdGVkUm93OiBBUEkuU3lzdGVtLkRlcHQpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3cpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHBhcmFtcyA9IFtzZWxlY3RlZFJvdy5kZXB0SWRdOworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVEZXB0KHBhcmFtcy5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisKK2NvbnN0IERlcHRUYWJsZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBmb3JtVGFibGVSZWYgPSB1c2VSZWY8Rm9ybUluc3RhbmNlPigpOworCisgIGNvbnN0IFttb2RhbFZpc2libGUsIHNldE1vZGFsVmlzaWJsZV0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisKKyAgY29uc3QgYWN0aW9uUmVmID0gdXNlUmVmPEFjdGlvblR5cGU+KCk7CisgIGNvbnN0IFtjdXJyZW50Um93LCBzZXRDdXJyZW50Um93XSA9IHVzZVN0YXRlPEFQSS5TeXN0ZW0uRGVwdD4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5TeXN0ZW0uRGVwdFtdPihbXSk7CisKKyAgY29uc3QgW2RlcHRUcmVlLCBzZXREZXB0VHJlZV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX25vcm1hbF9kaXNhYmxlJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0U3RhdHVzT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgfSwgW10pOworCisgIGNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5EZXB0PltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLmRlcHQuZGVwdF9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i6YOo6Zeo5ZCN56ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2RlcHROYW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGVwdC5vcmRlcl9udW0iIGRlZmF1bHRNZXNzYWdlPSLmmL7npLrpobrluo8iIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3JkZXJOdW0nLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kZXB0LnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IumDqOmXqOeKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnMjIwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImVkaXQiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06ZGVwdDplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgZ2V0RGVwdExpc3RFeGNsdWRlQ2hpbGQocmVjb3JkLmRlcHRJZCkudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgbGV0IGRlcHRzID0gYnVpbGRUcmVlRGF0YShyZXMuZGF0YSwgJ2RlcHRJZCcsICdkZXB0TmFtZScsICcnLCAnJywgJycpOworICAgICAgICAgICAgICAgIGlmKGRlcHRzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgZGVwdHMgPSBbeyBpZDogMCwgdGl0bGU6ICfml6DkuIrnuqcnLCBjaGlsZHJlbjogdW5kZWZpbmVkLCBrZXk6IDAsIHZhbHVlOiAwIH1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXREZXB0VHJlZShkZXB0cyk7CisgICAgICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLndhcm5pbmcocmVzLm1zZyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDnvJbovpEKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRlcHQ6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuU3lzdGVtLkRlcHQ+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJkZXB0SWQiCisgICAgICAgICAga2V5PSJkZXB0TGlzdCIKKyAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgIGxhYmVsV2lkdGg6IDEyMCwKKyAgICAgICAgICB9fQorICAgICAgICAgIHRvb2xCYXJSZW5kZXI9eygpID0+IFsKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJhZGQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRlcHQ6YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBnZXREZXB0TGlzdCgpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGVwdFRyZWUoYnVpbGRUcmVlRGF0YShyZXMuZGF0YSwgJ2RlcHRJZCcsICdkZXB0TmFtZScsICcnLCAnJywgJycpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndhcm5pbmcocmVzLm1zZyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLm5ldyIgZGVmYXVsdE1lc3NhZ2U9IuaWsOW7uiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgICBoaWRkZW49e3NlbGVjdGVkUm93cz8ubGVuZ3RoID09PSAwIHx8ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpkZXB0OnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOWIoOmZpOaJgOmAieaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCkge30sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgIF19CisgICAgICAgICAgcmVxdWVzdD17KHBhcmFtcykgPT4KKyAgICAgICAgICAgIGdldERlcHRMaXN0KHsgLi4ucGFyYW1zIH0gYXMgQVBJLlN5c3RlbS5EZXB0TGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiBidWlsZFRyZWVEYXRhKHJlcy5kYXRhLCAnZGVwdElkJywgJycsICcnLCAnJywgJycpLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMuZGF0YS5sZW5ndGgsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgIDxGb290ZXJUb29sYmFyCisgICAgICAgICAgZXh0cmE9eworICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmNob3NlbiIgZGVmYXVsdE1lc3NhZ2U9IuW3sumAieaLqSIgLz4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLml0ZW0iIGRlZmF1bHRNZXNzYWdlPSLpobkiIC8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06ZGVwdDpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxVcGRhdGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzKSA9PiB7CisgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICBpZiAodmFsdWVzLmRlcHRJZCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVVwZGF0ZSh7IC4uLnZhbHVlcyB9IGFzIEFQSS5TeXN0ZW0uRGVwdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVBZGQoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLkRlcHQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH19CisgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgIH19CisgICAgICAgIG9wZW49e21vZGFsVmlzaWJsZX0KKyAgICAgICAgdmFsdWVzPXtjdXJyZW50Um93IHx8IHt9fQorICAgICAgICBkZXB0VHJlZT17ZGVwdFRyZWV9CisgICAgICAgIHN0YXR1c09wdGlvbnM9e3N0YXR1c09wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IERlcHRUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0RpY3QvZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0RpY3QvZWRpdC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYzFjYgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdC9lZGl0LnRzeApAQCAtMCwwICsxLDE1MiBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7CisgIFByb0Zvcm0sCisgIFByb0Zvcm1EaWdpdCwKKyAgUHJvRm9ybVRleHQsCisgIFByb0Zvcm1SYWRpbywKKyAgUHJvRm9ybVRleHRBcmVhLAorICB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIERpY3RUeXBlRm9ybURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFBhcnRpYWw8QVBJLlN5c3RlbS5EaWN0VHlwZT47CisKK2V4cG9ydCB0eXBlIERpY3RUeXBlRm9ybVByb3BzID0geworICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IERpY3RUeXBlRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBEaWN0VHlwZUZvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLlN5c3RlbS5EaWN0VHlwZT47CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7Cit9OworCitjb25zdCBEaWN0VHlwZUZvcm06IFJlYWN0LkZDPERpY3RUeXBlRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKworICBjb25zdCB7IHN0YXR1c09wdGlvbnMgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworCQkJZGljdElkOiBwcm9wcy52YWx1ZXMuZGljdElkLAorCQkJZGljdE5hbWU6IHByb3BzLnZhbHVlcy5kaWN0TmFtZSwKKwkJCWRpY3RUeXBlOiBwcm9wcy52YWx1ZXMuZGljdFR5cGUsCisJCQlzdGF0dXM6IHByb3BzLnZhbHVlcy5zdGF0dXMsCisJCQljcmVhdGVCeTogcHJvcHMudmFsdWVzLmNyZWF0ZUJ5LAorCQkJY3JlYXRlVGltZTogcHJvcHMudmFsdWVzLmNyZWF0ZVRpbWUsCisJCQl1cGRhdGVCeTogcHJvcHMudmFsdWVzLnVwZGF0ZUJ5LAorCQkJdXBkYXRlVGltZTogcHJvcHMudmFsdWVzLnVwZGF0ZVRpbWUsCisJCQlyZW1hcms6IHByb3BzLnZhbHVlcy5yZW1hcmssCisgICAgfSk7CisgIH0sIFtmb3JtLCBwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGZvcm0uc3VibWl0KCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICB9OworICBjb25zdCBoYW5kbGVGaW5pc2ggPSBhc3luYyAodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7CisgICAgcHJvcHMub25TdWJtaXQodmFsdWVzIGFzIERpY3RUeXBlRm9ybURhdGEpOworICB9OworCisgIHJldHVybiAoCisgICAgPE1vZGFsCisgICAgICB3aWR0aD17NjQwfQorICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgIGlkOiAnc3lzdGVtLmRpY3QudGl0bGUnLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e8lui+keWtl+WFuOexu+WeiycsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBmb3JjZVJlbmRlcgorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIG9uT2s9e2hhbmRsZU9rfQorICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH0KKyAgICA+CisJCSAgPFByb0Zvcm0KKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgc3VibWl0dGVyPXtmYWxzZX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9ImRpY3RJZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmRpY3QuZGljdF9pZCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wtl+WFuOS4u+mUricsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWtl+WFuOS4u+mUriIKKyAgICAgICAgICBkaXNhYmxlZAorICAgICAgICAgIGhpZGRlbj17dHJ1ZX0KKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlrZflhbjkuLvplK7vvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlrZflhbjkuLvplK7vvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJkaWN0TmFtZSIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmRpY3QuZGljdF9uYW1lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5a2X5YW45ZCN56ewJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a2X5YW45ZCN56ewIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWtl+WFuOWQjeensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWtl+WFuOWQjeensO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImRpY3RUeXBlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kaWN0X3R5cGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflrZflhbjnsbvlnosnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlrZflhbjnsbvlnosiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5a2X5YW457G75Z6L77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5a2X5YW457G75Z6L77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kaWN0LnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgaW5pdGlhbFZhbHVlPXsnMCd9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeKtuaAgSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnirbmgIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnirbmgIHvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0icmVtYXJrIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5yZW1hcmsnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflpIfms6gnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlpIfms6giCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5aSH5rOo77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5aSH5rOo77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgRGljdFR5cGVGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9EaWN0L2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdC9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYmMyYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdC9pbmRleC50c3gKQEAgLTAsMCArMSwzOTQgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcywgaGlzdG9yeSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldERpY3RUeXBlTGlzdCwgcmVtb3ZlRGljdFR5cGUsIGFkZERpY3RUeXBlLCB1cGRhdGVEaWN0VHlwZSwgZXhwb3J0RGljdFR5cGUgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCBVcGRhdGVGb3JtIGZyb20gJy4vZWRpdCc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLkRpY3RUeXBlKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGREaWN0VHlwZSh7IC4uLmZpZWxkcyB9KTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+a3u+WKoOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a3u+WKoOWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDmm7TmlrDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZVVwZGF0ZSA9IGFzeW5jIChmaWVsZHM6IEFQSS5TeXN0ZW0uRGljdFR5cGUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5pu05pawJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHVwZGF0ZURpY3RUeXBlKGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuU3lzdGVtLkRpY3RUeXBlW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlRGljdFR5cGUoc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cuZGljdElkKS5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjb25zdCBoYW5kbGVSZW1vdmVPbmUgPSBhc3luYyAoc2VsZWN0ZWRSb3c6IEFQSS5TeXN0ZW0uRGljdFR5cGUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3cpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHBhcmFtcyA9IFtzZWxlY3RlZFJvdy5kaWN0SWRdOworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZW1vdmVEaWN0VHlwZShwYXJhbXMuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WIoOmZpOaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDlr7zlh7rmlbDmja4KKyAqCisgKgorICovCitjb25zdCBoYW5kbGVFeHBvcnQgPSBhc3luYyAoKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWvvOWHuicpOworICB0cnkgeworICAgIGF3YWl0IGV4cG9ydERpY3RUeXBlKCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBEaWN0VGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLkRpY3RUeXBlPigpOworICBjb25zdCBbc2VsZWN0ZWRSb3dzLCBzZXRTZWxlY3RlZFJvd3NdID0gdXNlU3RhdGU8QVBJLlN5c3RlbS5EaWN0VHlwZVtdPihbXSk7CisKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX25vcm1hbF9kaXNhYmxlJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0U3RhdHVzT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgfSwgW10pOworCisgIGNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5EaWN0VHlwZT5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kaWN0LmRpY3RfaWQiIGRlZmF1bHRNZXNzYWdlPSLlrZflhbjnvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAnZGljdElkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5kaWN0X25hbWUiIGRlZmF1bHRNZXNzYWdlPSLlrZflhbjlkI3np7AiIC8+LAorICAgICAgZGF0YUluZGV4OiAnZGljdE5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kaWN0LmRpY3RfdHlwZSIgZGVmYXVsdE1lc3NhZ2U9IuWtl+WFuOexu+WeiyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdkaWN0VHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIHJlbmRlcjogKGRvbSwgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgPGEKKyAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgICAgaGlzdG9yeS5wdXNoKGAvc3lzdGVtL2RpY3QtZGF0YS9pbmRleC8ke3JlY29yZC5kaWN0SWR9YCk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIHtkb219CisgICAgICAgICAgPC9hPgorICAgICAgICApOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLmRpY3Quc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i54q25oCBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3N0YXR1cycsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBzdGF0dXNPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcgZW51bXM9e3N0YXR1c09wdGlvbnN9IHZhbHVlPXtyZWNvcmQuc3RhdHVzfSAvPik7CisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5yZW1hcmsiIGRlZmF1bHRNZXNzYWdlPSLlpIfms6giIC8+LAorICAgICAgZGF0YUluZGV4OiAncmVtYXJrJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHRhcmVhJywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnJvbGUuY3JlYXRlX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLliJvlu7rml7bpl7QiIC8+LAorICAgICAgZGF0YUluZGV4OiAnY3JlYXRlVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICdkYXRlUmFuZ2UnLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPHNwYW4+e3JlY29yZC5jcmVhdGVUaW1lLnRvU3RyaW5nKCl9IDwvc3Bhbj4pOworICAgICAgfSwKKyAgICAgIHNlYXJjaDogeworICAgICAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4geworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAncGFyYW1zW2JlZ2luVGltZV0nOiB2YWx1ZVswXSwKKyAgICAgICAgICAgICdwYXJhbXNbZW5kVGltZV0nOiB2YWx1ZVsxXSwKKyAgICAgICAgICB9OworICAgICAgICB9LAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnMjIwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImVkaXQiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06ZGljdFR5cGU6ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg57yW6L6RCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAga2V5PSJiYXRjaFJlbW92ZSIKKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpkaWN0VHlwZTpyZW1vdmUnKX0KKyAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlT25lKHJlY29yZCk7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg5Yig6ZmkCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5TeXN0ZW0uRGljdFR5cGU+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJkaWN0SWQiCisgICAgICAgICAga2V5PSJkaWN0VHlwZUxpc3QiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iYWRkIgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpkaWN0VHlwZTphZGQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLm5ldyIgZGVmYXVsdE1lc3NhZ2U9IuaWsOW7uiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgICBoaWRkZW49e3NlbGVjdGVkUm93cz8ubGVuZ3RoID09PSAwIHx8ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpkaWN0VHlwZTpyZW1vdmUnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKyAgICAgICAgICAgICAgICAgIGljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICBhc3luYyBvbk9rKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHt9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8RGVsZXRlT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSIgZGVmYXVsdE1lc3NhZ2U9IuWIoOmZpCIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJleHBvcnQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRpY3RUeXBlOmV4cG9ydCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhwb3J0KCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXREaWN0VHlwZUxpc3QoeyAuLi5wYXJhbXMgfSBhcyBBUEkuU3lzdGVtLkRpY3RUeXBlTGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRpY3RUeXBlOmRlbCcpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgICAgPFVwZGF0ZUZvcm0KKyAgICAgICAgb25TdWJtaXQ9e2FzeW5jICh2YWx1ZXMpID0+IHsKKyAgICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgIGlmICh2YWx1ZXMuZGljdElkKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlVXBkYXRlKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5EaWN0VHlwZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVBZGQoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLkRpY3RUeXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICB9fQorICAgICAgICBvcGVuPXttb2RhbFZpc2libGV9CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgICAgc3RhdHVzT3B0aW9ucz17c3RhdHVzT3B0aW9uc30KKyAgICAgIC8+CisgICAgPC9QYWdlQ29udGFpbmVyPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgRGljdFRhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdERhdGEvZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0RpY3REYXRhL2VkaXQudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGUwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0RpY3REYXRhL2VkaXQudHN4CkBAIC0wLDAgKzEsMjUyIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsKKyAgUHJvRm9ybSwKKyAgUHJvRm9ybURpZ2l0LAorICBQcm9Gb3JtVGV4dCwKKyAgUHJvRm9ybVNlbGVjdCwKKyAgUHJvRm9ybVJhZGlvLAorICBQcm9Gb3JtVGV4dEFyZWEsCit9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIERhdGFGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuU3lzdGVtLkRpY3REYXRhPjsKKworZXhwb3J0IHR5cGUgRGF0YUZvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBEYXRhRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBEYXRhRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuU3lzdGVtLkRpY3REYXRhPjsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IERpY3REYXRhRm9ybTogUmVhY3QuRkM8RGF0YUZvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgY29uc3QgeyBzdGF0dXNPcHRpb25zIH0gPSBwcm9wczsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGZvcm0ucmVzZXRGaWVsZHMoKTsKKyAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKyAgICAgIGRpY3RDb2RlOiBwcm9wcy52YWx1ZXMuZGljdENvZGUsCisgICAgICBkaWN0U29ydDogcHJvcHMudmFsdWVzLmRpY3RTb3J0LAorICAgICAgZGljdExhYmVsOiBwcm9wcy52YWx1ZXMuZGljdExhYmVsLAorICAgICAgZGljdFZhbHVlOiBwcm9wcy52YWx1ZXMuZGljdFZhbHVlLAorICAgICAgZGljdFR5cGU6IHByb3BzLnZhbHVlcy5kaWN0VHlwZSwKKyAgICAgIGNzc0NsYXNzOiBwcm9wcy52YWx1ZXMuY3NzQ2xhc3MsCisgICAgICBsaXN0Q2xhc3M6IHByb3BzLnZhbHVlcy5saXN0Q2xhc3MsCisgICAgICBpc0RlZmF1bHQ6IHByb3BzLnZhbHVlcy5pc0RlZmF1bHQsCisgICAgICBzdGF0dXM6IHByb3BzLnZhbHVlcy5zdGF0dXMsCisgICAgICBjcmVhdGVCeTogcHJvcHMudmFsdWVzLmNyZWF0ZUJ5LAorICAgICAgY3JlYXRlVGltZTogcHJvcHMudmFsdWVzLmNyZWF0ZVRpbWUsCisgICAgICB1cGRhdGVCeTogcHJvcHMudmFsdWVzLnVwZGF0ZUJ5LAorICAgICAgdXBkYXRlVGltZTogcHJvcHMudmFsdWVzLnVwZGF0ZVRpbWUsCisgICAgICByZW1hcms6IHByb3BzLnZhbHVlcy5yZW1hcmssCisgICAgfSk7CisgIH0sIFtmb3JtLCBwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGZvcm0uc3VibWl0KCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICB9OworICBjb25zdCBoYW5kbGVGaW5pc2ggPSBhc3luYyAodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7CisgICAgcHJvcHMub25TdWJtaXQodmFsdWVzIGFzIERhdGFGb3JtRGF0YSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLnRpdGxlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnvJbovpHlrZflhbjmlbDmja4nLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZm9yY2VSZW5kZXIKKyAgICAgIGRlc3Ryb3lPbkNsb3NlCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorICAgICAgPFByb0Zvcm0KKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgc3VibWl0dGVyPXtmYWxzZX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9ImRpY3RDb2RlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmRpY3RfY29kZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wtl+WFuOe8lueggScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0LCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a2X5YW457yW56CBIgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWtl+WFuOe8luegge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWtl+WFuOe8luegge+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImRpY3RUeXBlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmRpY3RfdHlwZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wtl+WFuOexu+WeiycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a2X5YW457G75Z6LIgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5a2X5YW457G75Z6L77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5a2X5YW457G75Z6L77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0iZGljdExhYmVsIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmRpY3RfbGFiZWwnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflrZflhbjmoIfnrb4nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWtl+WFuOagh+etviIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlrZflhbjmoIfnrb7vvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlrZflhbjmoIfnrb7vvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJkaWN0VmFsdWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kaWN0LmRhdGEuZGljdF92YWx1ZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wtl+WFuOmUruWAvCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a2X5YW46ZSu5YC8IgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWtl+WFuOmUruWAvO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWtl+WFuOmUruWAvO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9ImNzc0NsYXNzIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmNzc19jbGFzcycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+agt+W8j+WxnuaApycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5qC35byP5bGe5oCnIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeagt+W8j+WxnuaAp++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeagt+W8j+WxnuaAp++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtU2VsZWN0CisgICAgICAgICAgbmFtZT0ibGlzdENsYXNzIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmxpc3RfY2xhc3MnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflm57mmL7moLflvI8nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWbnuaYvuagt+W8jyIKKyAgICAgICAgICB2YWx1ZUVudW09e3sKKyAgICAgICAgICAgICdkZWZhdWx0JzogJ+m7mOiupCcsCisgICAgICAgICAgICAncHJpbWFyeSc6ICfkuLvopoEnLAorICAgICAgICAgICAgJ3N1Y2Nlc3MnOiAn5oiQ5YqfJywKKyAgICAgICAgICAgICdpbmZvJzogJ+S/oeaBrycsCisgICAgICAgICAgICAnd2FybmluZyc6ICforablkYonLAorICAgICAgICAgICAgJ2Rhbmdlcic6ICfljbHpmaknLAorICAgICAgICAgIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5Zue5pi+5qC35byP77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5Zue5pi+5qC35byP77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9ImRpY3RTb3J0IgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLmRpY3Rfc29ydCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wtl+WFuOaOkuW6jycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5a2X5YW45o6S5bqPIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWtl+WFuOaOkuW6j++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWtl+WFuOaOkuW6j++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICBuYW1lPSJpc0RlZmF1bHQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5kaWN0LmRhdGEuaXNfZGVmYXVsdCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aYr+WQpum7mOiupCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgdmFsdWVFbnVtPXt7CisgICAgICAgICAgICAnWSc6ICfmmK8nLAorICAgICAgICAgICAgJ04nOiAn5ZCmJywKKyAgICAgICAgICB9fQorICAgICAgICAgIGluaXRpYWxWYWx1ZT17J04nfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeaYr+WQpum7mOiupCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXmmK/lkKbpu5jorqTvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXmmK/lkKbpu5jorqTvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVJhZGlvLkdyb3VwCisgICAgICAgICAgdmFsdWVFbnVtPXtzdGF0dXNPcHRpb25zfQorICAgICAgICAgIG5hbWU9InN0YXR1cyIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmRpY3QuZGF0YS5zdGF0dXMnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnirbmgIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGluaXRpYWxWYWx1ZT17JzAnfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeKtuaAgSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnirbmgIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnirbmgIHvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0icmVtYXJrIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0uZGljdC5kYXRhLnJlbWFyaycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wkh+azqCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDI0LCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5aSH5rOoIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWkh+azqO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWkh+azqO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICA8L1Byb0Zvcm0+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IERpY3REYXRhRm9ybTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdERhdGEvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9EaWN0RGF0YS9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmMTA2OQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vRGljdERhdGEvaW5kZXgudHN4CkBAIC0wLDAgKzEsNDM5IEBACisKK2ltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlLCB1c2VBY2Nlc3MsIGhpc3RvcnksIHVzZVBhcmFtcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldERpY3REYXRhTGlzdCwgcmVtb3ZlRGljdERhdGEsIGFkZERpY3REYXRhLCB1cGRhdGVEaWN0RGF0YSwgZXhwb3J0RGljdERhdGEgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0ZGF0YSc7CitpbXBvcnQgVXBkYXRlRm9ybSBmcm9tICcuL2VkaXQnOworaW1wb3J0IHsgZ2V0RGljdFZhbHVlRW51bSwgZ2V0RGljdFR5cGUsIGdldERpY3RUeXBlT3B0aW9uU2VsZWN0IH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLkRpY3REYXRhKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGREaWN0RGF0YSh7IC4uLmZpZWxkcyB9KTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+a3u+WKoOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a3u+WKoOWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDmm7TmlrDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZVVwZGF0ZSA9IGFzeW5jIChmaWVsZHM6IEFQSS5TeXN0ZW0uRGljdERhdGEpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5pu05pawJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHVwZGF0ZURpY3REYXRhKGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuU3lzdGVtLkRpY3REYXRhW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlRGljdERhdGEoc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cuZGljdENvZGUpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZVJlbW92ZU9uZSA9IGFzeW5jIChzZWxlY3RlZFJvdzogQVBJLlN5c3RlbS5EaWN0RGF0YSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LmRpY3RDb2RlXTsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlRGljdERhdGEocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5a+85Ye65pWw5o2uCisgKgorICoKKyAqLworY29uc3QgaGFuZGxlRXhwb3J0ID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjlr7zlh7onKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCBleHBvcnREaWN0RGF0YSgpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2V4cG9ydCB0eXBlIERpY3RUeXBlQXJncyA9IHsKKyAgaWQ6IHN0cmluZzsKK307CisKKworY29uc3QgRGljdERhdGFUYWJsZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworCisgIGNvbnN0IGZvcm1UYWJsZVJlZiA9IHVzZVJlZjxGb3JtSW5zdGFuY2U+KCk7CisKKyAgY29uc3QgW2RpY3RJZCwgc2V0RGljdElkXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpOworICBjb25zdCBbZGljdFR5cGUsIHNldERpY3RUeXBlXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpOworCisgIGNvbnN0IFttb2RhbFZpc2libGUsIHNldE1vZGFsVmlzaWJsZV0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisKKyAgY29uc3QgYWN0aW9uUmVmID0gdXNlUmVmPEFjdGlvblR5cGU+KCk7CisgIGNvbnN0IFtjdXJyZW50Um93LCBzZXRDdXJyZW50Um93XSA9IHVzZVN0YXRlPEFQSS5TeXN0ZW0uRGljdERhdGE+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLkRpY3REYXRhW10+KFtdKTsKKworICBjb25zdCBbZGljdFR5cGVPcHRpb25zLCBzZXREaWN0VHlwZU9wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisgIGNvbnN0IFtzdGF0dXNPcHRpb25zLCBzZXRTdGF0dXNPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworCisgIGNvbnN0IGFjY2VzcyA9IHVzZUFjY2VzcygpOworCisgIC8qKiDlm73pmYXljJbphY3nva4gKi8KKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKworICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTsKKyAgaWYgKHBhcmFtcy5pZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgaGlzdG9yeS5wdXNoKCcvc3lzdGVtL2RpY3QnKTsKKyAgfQorICBjb25zdCBpZCA9IHBhcmFtcy5pZCB8fCAnMCc7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBpZiAoZGljdElkICE9PSBpZCkgeworICAgICAgc2V0RGljdElkKGlkKTsKKyAgICAgIGdldERpY3RUeXBlT3B0aW9uU2VsZWN0KCkudGhlbigocmVzKSA9PiB7CisgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgY29uc3Qgb3B0czogYW55ID0ge307CisgICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7CisgICAgICAgICAgICBvcHRzW2l0ZW0uZGljdFR5cGVdID0gaXRlbS5kaWN0TmFtZTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBzZXREaWN0VHlwZU9wdGlvbnMob3B0cyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX25vcm1hbF9kaXNhYmxlJykudGhlbigoZGF0YSkgPT4geworICAgICAgICBzZXRTdGF0dXNPcHRpb25zKGRhdGEpOworICAgICAgfSk7CisgICAgICBnZXREaWN0VHlwZShpZCkudGhlbigocmVzKSA9PiB7CisgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgc2V0RGljdFR5cGUocmVzLmRhdGEuZGljdFR5cGUpOworICAgICAgICAgIGZvcm1UYWJsZVJlZi5jdXJyZW50Py5zZXRGaWVsZHNWYWx1ZSh7CisgICAgICAgICAgICBkaWN0VHlwZTogcmVzLmRhdGEuZGljdFR5cGUsCisgICAgICAgICAgfSk7CisgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSwgW2RpY3RJZCwgZGljdFR5cGUsIHBhcmFtc10pOworCisgIGNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5EaWN0RGF0YT5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kaWN0LmRhdGEuZGljdF9jb2RlIiBkZWZhdWx0TWVzc2FnZT0i5a2X5YW457yW56CBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2RpY3RDb2RlJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5kYXRhLmRpY3RfbGFiZWwiIGRlZmF1bHRNZXNzYWdlPSLlrZflhbjmoIfnrb4iIC8+LAorICAgICAgZGF0YUluZGV4OiAnZGljdExhYmVsJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5kYXRhLmRpY3RfdHlwZSIgZGVmYXVsdE1lc3NhZ2U9IuWtl+WFuOexu+WeiyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdkaWN0VHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgaGlkZUluVGFibGU6IHRydWUsCisgICAgICB2YWx1ZUVudW06IGRpY3RUeXBlT3B0aW9ucywKKyAgICAgIHNlYXJjaDogeworICAgICAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4geworICAgICAgICAgIHNldERpY3RUeXBlKHZhbHVlKTsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0sCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5kYXRhLmRpY3RfdmFsdWUiIGRlZmF1bHRNZXNzYWdlPSLlrZflhbjplK7lgLwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnZGljdFZhbHVlJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0uZGljdC5kYXRhLmRpY3Rfc29ydCIgZGVmYXVsdE1lc3NhZ2U9IuWtl+WFuOaOkuW6jyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdkaWN0U29ydCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLmRpY3QuZGF0YS5zdGF0dXMiIGRlZmF1bHRNZXNzYWdlPSLnirbmgIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAnc3RhdHVzJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IHN0YXR1c09wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17c3RhdHVzT3B0aW9uc30gdmFsdWU9e3JlY29yZC5zdGF0dXN9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kaWN0LmRhdGEucmVtYXJrIiBkZWZhdWx0TWVzc2FnZT0i5aSH5rOoIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3JlbWFyaycsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0YXJlYScsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5kaWN0LmRhdGEuY3JlYXRlX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLliJvlu7rml7bpl7QiIC8+LAorICAgICAgZGF0YUluZGV4OiAnY3JlYXRlVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICdkYXRlUmFuZ2UnLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPHNwYW4+e3JlY29yZC5jcmVhdGVUaW1lLnRvU3RyaW5nKCl9IDwvc3Bhbj4pOworICAgICAgfSwKKyAgICAgIHNlYXJjaDogeworICAgICAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4geworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAncGFyYW1zW2JlZ2luVGltZV0nOiB2YWx1ZVswXSwKKyAgICAgICAgICAgICdwYXJhbXNbZW5kVGltZV0nOiB2YWx1ZVsxXSwKKyAgICAgICAgICB9OworICAgICAgICB9LAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnMTIwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImVkaXQiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06ZGF0YTplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDnvJbovpEKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRhdGE6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuU3lzdGVtLkRpY3REYXRhPgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0iZGljdENvZGUiCisgICAgICAgICAga2V5PSJkYXRhTGlzdCIKKyAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgIGxhYmVsV2lkdGg6IDEyMCwKKyAgICAgICAgICB9fQorICAgICAgICAgIHRvb2xCYXJSZW5kZXI9eygpID0+IFsKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJhZGQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRhdGE6YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHsgZGljdFR5cGU6IGRpY3RUeXBlLCBpc0RlZmF1bHQ6ICdOJywgc3RhdHVzOiAnMCcgfSBhcyBBUEkuU3lzdGVtLkRpY3REYXRhKTsKKyAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLm5ldyIgZGVmYXVsdE1lc3NhZ2U9IuaWsOW7uiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgICBoaWRkZW49e3NlbGVjdGVkUm93cz8ubGVuZ3RoID09PSAwIHx8ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpkYXRhOnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOWIoOmZpOaJgOmAieaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCkgeyB9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8RGVsZXRlT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSIgZGVmYXVsdE1lc3NhZ2U9IuWIoOmZpCIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJleHBvcnQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRhdGE6ZXhwb3J0Jyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFeHBvcnQoKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZXhwb3J0IiBkZWZhdWx0TWVzc2FnZT0i5a+85Ye6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgIF19CisgICAgICAgICAgcmVxdWVzdD17KHBhcmFtcykgPT4KKyAgICAgICAgICAgIGdldERpY3REYXRhTGlzdCh7IC4uLnBhcmFtcywgZGljdFR5cGUgfSBhcyBBUEkuU3lzdGVtLkRpY3REYXRhTGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOmRhdGE6ZGVsJyl9CisgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgICBva1RleHQ6ICfnoa7orqQnLAorICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoRGVsZXRpb24iIGRlZmF1bHRNZXNzYWdlPSLmibnph4/liKDpmaQiIC8+CisgICAgICAgICAgPC9CdXR0b24+CisgICAgICAgIDwvRm9vdGVyVG9vbGJhcj4KKyAgICAgICl9CisgICAgICA8VXBkYXRlRm9ybQorICAgICAgICBvblN1Ym1pdD17YXN5bmMgKHZhbHVlcykgPT4geworICAgICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgaWYgKHZhbHVlcy5kaWN0Q29kZSkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVVwZGF0ZSh7IC4uLnZhbHVlcyB9IGFzIEFQSS5TeXN0ZW0uRGljdERhdGEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5EaWN0RGF0YSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17bW9kYWxWaXNpYmxlfQorICAgICAgICB2YWx1ZXM9e2N1cnJlbnRSb3cgfHwge319CisgICAgICAgIHN0YXR1c09wdGlvbnM9e3N0YXR1c09wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IERpY3REYXRhVGFibGVMaXN0OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Mb2dpbmluZm9yL2VkaXQudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Mb2dpbmluZm9yL2VkaXQudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDMxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0xvZ2luaW5mb3IvZWRpdC50c3gKQEAgLTAsMCArMSwyMTYgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeworICBQcm9Gb3JtLAorICBQcm9Gb3JtRGlnaXQsCisgIFByb0Zvcm1UZXh0LAorICBQcm9Gb3JtUmFkaW8sCisgIFByb0Zvcm1UaW1lUGlja2VyLAorICB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIExvZ2luaW5mb3JGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPjsKKworZXhwb3J0IHR5cGUgTG9naW5pbmZvckZvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBMb2dpbmluZm9yRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBMb2dpbmluZm9yRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPjsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IExvZ2luaW5mb3JGb3JtOiBSZWFjdC5GQzxMb2dpbmluZm9yRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgCisgIGNvbnN0IHsgc3RhdHVzT3B0aW9ucywgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworCQkJaW5mb0lkOiBwcm9wcy52YWx1ZXMuaW5mb0lkLAorCQkJdXNlck5hbWU6IHByb3BzLnZhbHVlcy51c2VyTmFtZSwKKwkJCWlwYWRkcjogcHJvcHMudmFsdWVzLmlwYWRkciwKKwkJCWxvZ2luTG9jYXRpb246IHByb3BzLnZhbHVlcy5sb2dpbkxvY2F0aW9uLAorCQkJYnJvd3NlcjogcHJvcHMudmFsdWVzLmJyb3dzZXIsCisJCQlvczogcHJvcHMudmFsdWVzLm9zLAorCQkJc3RhdHVzOiBwcm9wcy52YWx1ZXMuc3RhdHVzLAorCQkJbXNnOiBwcm9wcy52YWx1ZXMubXNnLAorCQkJbG9naW5UaW1lOiBwcm9wcy52YWx1ZXMubG9naW5UaW1lLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBwcm9wcy5vblN1Ym1pdCh2YWx1ZXMgYXMgTG9naW5pbmZvckZvcm1EYXRhKTsKKyAgfTsKKworICByZXR1cm4gKAorICAgIDxNb2RhbAorICAgICAgd2lkdGg9ezY0MH0KKyAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLnRpdGxlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnvJbovpHns7vnu5/orr/pl67orrDlvZUnLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorCQkgIDxQcm9Gb3JtIAorICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICBsYXlvdXQ9Imhvcml6b250YWwiIAorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9ImluZm9JZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IuaW5mb19pZCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iuv+mXrue8luWPtycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6K6/6Zeu57yW5Y+3IgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeiuv+mXrue8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeiuv+mXrue8luWPt++8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InVzZXJOYW1lIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci51c2VyX25hbWUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnlKjmiLfotKblj7cnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+i0puWPtyIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnlKjmiLfotKblj7fvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnlKjmiLfotKblj7fvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJpcGFkZHIiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLmlwYWRkcicsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eZu+W9lUlQ5Zyw5Z2AJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXnmbvlvZVJUOWcsOWdgCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnmbvlvZVJUOWcsOWdgO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeZu+W9lUlQ5Zyw5Z2A77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ibG9naW5Mb2NhdGlvbiIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IubG9naW5fbG9jYXRpb24nLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnmbvlvZXlnLDngrknLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeZu+W9leWcsOeCuSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnmbvlvZXlnLDngrnvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnmbvlvZXlnLDngrnvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJicm93c2VyIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci5icm93c2VyJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5rWP6KeI5Zmo57G75Z6LJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmtY/op4jlmajnsbvlnosiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5rWP6KeI5Zmo57G75Z6L77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5rWP6KeI5Zmo57G75Z6L77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ib3MiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLm9zJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5pON5L2c57O757ufJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmk43kvZzns7vnu58iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5pON5L2c57O757uf77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5pON5L2c57O757uf77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5sb2dpbmluZm9yLnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eZu+W9leeKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl55m75b2V54q25oCBIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeZu+W9leeKtuaAge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeZu+W9leeKtuaAge+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9Im1zZyIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLmxvZ2luaW5mb3IubXNnJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5o+Q56S65raI5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmj5DnpLrmtojmga8iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5o+Q56S65raI5oGv77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5o+Q56S65raI5oGv77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UaW1lUGlja2VyCisgICAgICAgICAgbmFtZT0ibG9naW5UaW1lIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubG9naW5pbmZvci5sb2dpbl90aW1lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6K6/6Zeu5pe26Ze0JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXorr/pl67ml7bpl7QiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6K6/6Zeu5pe26Ze077yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6K6/6Zeu5pe26Ze077yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgTG9naW5pbmZvckZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL0xvZ2luaW5mb3IvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Mb2dpbmluZm9yL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVjMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Mb2dpbmluZm9yL2luZGV4LnRzeApAQCAtMCwwICsxLDMyMSBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgdHlwZSB7IEZvcm1JbnN0YW5jZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQnV0dG9uLCBtZXNzYWdlLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQWN0aW9uVHlwZSwgRm9vdGVyVG9vbGJhciwgUGFnZUNvbnRhaW5lciwgUHJvQ29sdW1ucywgUHJvVGFibGUgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBQbHVzT3V0bGluZWQsIERlbGV0ZU91dGxpbmVkLCBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLCBVbmxvY2tPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldExvZ2luaW5mb3JMaXN0LCByZW1vdmVMb2dpbmluZm9yLCBleHBvcnRMb2dpbmluZm9yLCB1bmxvY2tMb2dpbmluZm9yLCBjbGVhbkxvZ2luaW5mb3IgfSBmcm9tICdAL3NlcnZpY2VzL21vbml0b3IvbG9naW5pbmZvcic7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuTW9uaXRvci5Mb2dpbmluZm9yW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlTG9naW5pbmZvcihzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy5pbmZvSWQpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZUNsZWFuID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfor7fnqI3lgJknKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgY2xlYW5Mb2dpbmluZm9yKCk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmuIXnqbrmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfor7fmsYLlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IGhhbmRsZVVubG9jayA9IGFzeW5jICh1c2VyTmFtZTogc3RyaW5nKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOino+mUgScpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB1bmxvY2tMb2dpbmluZm9yKHVzZXJOYW1lKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+ino+mUgeaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+ino+mUgeWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDlr7zlh7rmlbDmja4KKyAqCisgKiBAcGFyYW0gaWQKKyAqLworY29uc3QgaGFuZGxlRXhwb3J0ID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjlr7zlh7onKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCBleHBvcnRMb2dpbmluZm9yKCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBMb2dpbmluZm9yVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBhY3Rpb25SZWYgPSB1c2VSZWY8QWN0aW9uVHlwZT4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5Nb25pdG9yLkxvZ2luaW5mb3JbXT4oW10pOworICBjb25zdCBbc3RhdHVzT3B0aW9ucywgc2V0U3RhdHVzT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICAvKiog5Zu96ZmF5YyW6YWN572uICovCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfY29tbW9uX3N0YXR1cycsIHRydWUpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldFN0YXR1c09wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgIH0sIFtdKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5Nb25pdG9yLkxvZ2luaW5mb3I+W10gPSBbCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IuaW5mb19pZCIgZGVmYXVsdE1lc3NhZ2U9Iuiuv+mXrue8luWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdpbmZvSWQnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci51c2VyX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfotKblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAndXNlck5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5pcGFkZHIiIGRlZmF1bHRNZXNzYWdlPSLnmbvlvZVJUOWcsOWdgCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdpcGFkZHInLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5sb2dpbl9sb2NhdGlvbiIgZGVmYXVsdE1lc3NhZ2U9IueZu+W9leWcsOeCuSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdsb2dpbkxvY2F0aW9uJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IuYnJvd3NlciIgZGVmYXVsdE1lc3NhZ2U9Iua1j+iniOWZqOexu+WeiyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdicm93c2VyJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3Iub3MiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzns7vnu58iIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3MnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5zdGF0dXMiIGRlZmF1bHRNZXNzYWdlPSLnmbvlvZXnirbmgIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAnc3RhdHVzJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IHN0YXR1c09wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17c3RhdHVzT3B0aW9uc30gdmFsdWU9e3JlY29yZC5zdGF0dXN9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci5tc2ciIGRlZmF1bHRNZXNzYWdlPSLmj5DnpLrmtojmga8iIC8+LAorICAgICAgZGF0YUluZGV4OiAnbXNnJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLmxvZ2luaW5mb3IubG9naW5fdGltZSIgZGVmYXVsdE1lc3NhZ2U9Iuiuv+mXruaXtumXtCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdsb2dpblRpbWUnLAorICAgICAgdmFsdWVUeXBlOiAnZGF0ZVRpbWUnLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuTW9uaXRvci5Mb2dpbmluZm9yPgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0iaW5mb0lkIgorICAgICAgICAgIGtleT0ibG9naW5pbmZvckxpc3QiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImNsZWFuIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5riF56m65omA5pyJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZUNsZWFuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHsgfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jbGVhbkFsbCIgZGVmYXVsdE1lc3NhZ2U9Iua4heepuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJ1bmxvY2siCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpsb2dpbmluZm9yOnVubG9jaycpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOino+mUgeivpeeUqOaIt+eahOaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVbmxvY2soc2VsZWN0ZWRSb3dzWzBdLnVzZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCkgeyB9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8VW5sb2NrT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3IubG9naW5pbmZvci51bmxvY2siIGRlZmF1bHRNZXNzYWdlPSLop6PplIEiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ21vbml0b3I6bG9naW5pbmZvcjpleHBvcnQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGhhbmRsZUV4cG9ydCgpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5leHBvcnQiIGRlZmF1bHRNZXNzYWdlPSLlr7zlh7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgXX0KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0TG9naW5pbmZvckxpc3QoeyAuLi5wYXJhbXMgfSBhcyBBUEkuTW9uaXRvci5Mb2dpbmluZm9yTGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsKKyAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLnRvdGFsLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnbW9uaXRvcjpsb2dpbmluZm9yOnJlbW92ZScpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IExvZ2luaW5mb3JUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL01lbnUvZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL01lbnUvZWRpdC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5NDI1NQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vTWVudS9lZGl0LnRzeApAQCAtMCwwICsxLDM4NiBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeworICBQcm9Gb3JtLAorICBQcm9Gb3JtRGlnaXQsCisgIFByb0Zvcm1UZXh0LAorICBQcm9Gb3JtUmFkaW8sCisgIFByb0Zvcm1UcmVlU2VsZWN0LAorICBQcm9Gb3JtU2VsZWN0LAorfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBGb3JtLCBNb2RhbH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBEYXRhTm9kZSB9IGZyb20gJ2FudGQvZXMvdHJlZSc7CitpbXBvcnQgeyBjcmVhdGVJY29uIH0gZnJvbSAnQC91dGlscy9JY29uVXRpbCc7CitpbXBvcnQgeyBEaWN0VmFsdWVFbnVtT2JqIH0gZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworaW1wb3J0IEljb25TZWxlY3RvciBmcm9tICdAL2NvbXBvbmVudHMvSWNvblNlbGVjdG9yJzsKKworZXhwb3J0IHR5cGUgTWVudUZvcm1EYXRhID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBQYXJ0aWFsPEFQSS5TeXN0ZW0uTWVudT47CisKK2V4cG9ydCB0eXBlIE1lbnVGb3JtUHJvcHMgPSB7CisgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogTWVudUZvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogTWVudUZvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLlN5c3RlbS5NZW51PjsKKyAgdmlzaWJsZU9wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7CisgIG1lbnVUcmVlOiBEYXRhTm9kZVtdOworfTsKKworY29uc3QgTWVudUZvcm06IFJlYWN0LkZDPE1lbnVGb3JtUHJvcHM+ID0gKHByb3BzKSA9PiB7CisKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgY29uc3QgW21lbnVUeXBlSWQsIHNldE1lbnVUeXBlSWRdID0gdXNlU3RhdGU8YW55PignTScpOworICBjb25zdCBbbWVudUljb25OYW1lLCBzZXRNZW51SWNvbk5hbWVdID0gdXNlU3RhdGU8YW55PigpOworICBjb25zdCBbaWNvblNlbGVjdG9yT3Blbiwgc2V0SWNvblNlbGVjdG9yT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisKKyAgY29uc3QgeyBtZW51VHJlZSwgdmlzaWJsZU9wdGlvbnMsIHN0YXR1c09wdGlvbnMgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIHNldE1lbnVJY29uTmFtZShwcm9wcy52YWx1ZXMuaWNvbik7CisgICAgZm9ybS5zZXRGaWVsZHNWYWx1ZSh7CisgICAgICBtZW51SWQ6IHByb3BzLnZhbHVlcy5tZW51SWQsCisgICAgICBtZW51TmFtZTogcHJvcHMudmFsdWVzLm1lbnVOYW1lLAorICAgICAgcGFyZW50SWQ6IHByb3BzLnZhbHVlcy5wYXJlbnRJZCwKKyAgICAgIG9yZGVyTnVtOiBwcm9wcy52YWx1ZXMub3JkZXJOdW0sCisgICAgICBwYXRoOiBwcm9wcy52YWx1ZXMucGF0aCwKKyAgICAgIGNvbXBvbmVudDogcHJvcHMudmFsdWVzLmNvbXBvbmVudCwKKyAgICAgIHF1ZXJ5OiBwcm9wcy52YWx1ZXMucXVlcnksCisgICAgICBpc0ZyYW1lOiBwcm9wcy52YWx1ZXMuaXNGcmFtZSwKKyAgICAgIGlzQ2FjaGU6IHByb3BzLnZhbHVlcy5pc0NhY2hlLAorICAgICAgbWVudVR5cGU6IHByb3BzLnZhbHVlcy5tZW51VHlwZSwKKyAgICAgIHZpc2libGU6IHByb3BzLnZhbHVlcy52aXNpYmxlLAorICAgICAgc3RhdHVzOiBwcm9wcy52YWx1ZXMuc3RhdHVzLAorICAgICAgcGVybXM6IHByb3BzLnZhbHVlcy5wZXJtcywKKyAgICAgIGljb246IHByb3BzLnZhbHVlcy5pY29uLAorICAgICAgY3JlYXRlQnk6IHByb3BzLnZhbHVlcy5jcmVhdGVCeSwKKyAgICAgIGNyZWF0ZVRpbWU6IHByb3BzLnZhbHVlcy5jcmVhdGVUaW1lLAorICAgICAgdXBkYXRlQnk6IHByb3BzLnZhbHVlcy51cGRhdGVCeSwKKyAgICAgIHVwZGF0ZVRpbWU6IHByb3BzLnZhbHVlcy51cGRhdGVUaW1lLAorICAgICAgcmVtYXJrOiBwcm9wcy52YWx1ZXMucmVtYXJrLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgIHByb3BzLm9uU3VibWl0KHZhbHVlcyBhcyBNZW51Rm9ybURhdGEpOworICB9OworCisgIHJldHVybiAoCisgICAgPE1vZGFsCisgICAgICB3aWR0aD17NjQwfQorICAgICAgdGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgIGlkOiAnc3lzdGVtLm1lbnUudGl0bGUnLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e8lui+keiPnOWNleadg+mZkCcsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBmb3JjZVJlbmRlcgorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIG9uT2s9e2hhbmRsZU9rfQorICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH0KKyAgICA+CisgICAgICA8UHJvRm9ybQorICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICBzdWJtaXR0ZXI9e2ZhbHNlfQorICAgICAgICBsYXlvdXQ9Imhvcml6b250YWwiCisgICAgICAgIG9uRmluaXNoPXtoYW5kbGVGaW5pc2h9PgorICAgICAgICA8UHJvRm9ybURpZ2l0CisgICAgICAgICAgbmFtZT0ibWVudUlkIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5tZW51X2lkJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6I+c5Y2V57yW5Y+3JywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6I+c5Y2V57yW5Y+3IgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeiPnOWNlee8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeiPnOWNlee8luWPt++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVHJlZVNlbGVjdAorICAgICAgICAgIG5hbWU9InBhcmVudElkIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5wYXJlbnRfaWQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfkuIrnuqfoj5zljZUnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBhcmFtcz17e21lbnVUcmVlfX0KKyAgICAgICAgICByZXF1ZXN0PXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gbWVudVRyZWU7CisgICAgICAgICAgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl54i26I+c5Y2V57yW5Y+3IgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl54i26I+c5Y2V57yW5Y+377yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl54i26I+c5Y2V57yW5Y+377yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzID0ge3sKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICBuYW1lPSJtZW51VHlwZSIKKyAgICAgICAgICB2YWx1ZUVudW09e3sKKyAgICAgICAgICAgIE06ICfnm67lvZUnLAorICAgICAgICAgICAgQzogJ+iPnOWNlScsCisgICAgICAgICAgICBGOiAn5oyJ6ZKuJywKKyAgICAgICAgICB9fQorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5tZW51X3R5cGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfoj5zljZXnsbvlnosnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXoj5zljZXnsbvlnosiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6I+c5Y2V57G75Z6L77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6I+c5Y2V57G75Z6L77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzPXt7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdNJywKKyAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4geworICAgICAgICAgICAgICBzZXRNZW51VHlwZUlkKGUudGFyZ2V0LnZhbHVlKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1TZWxlY3QKKyAgICAgICAgICBuYW1lPSJpY29uIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5pY29uJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6I+c5Y2V5Zu+5qCHJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICB2YWx1ZUVudW09e3t9fQorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCA9PT0gJ0YnfQorICAgICAgICAgIGFkZG9uQmVmb3JlPXtjcmVhdGVJY29uKG1lbnVJY29uTmFtZSl9CisgICAgICAgICAgZmllbGRQcm9wcz17eworICAgICAgICAgICAgb25DbGljazogKCkgPT4geworICAgICAgICAgICAgICBzZXRJY29uU2VsZWN0b3JPcGVuKHRydWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXoj5zljZXlm77moIciCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6I+c5Y2V5Zu+5qCH77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6I+c5Y2V5Zu+5qCH77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ibWVudU5hbWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5tZW51Lm1lbnVfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iPnOWNleWQjeensCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6I+c5Y2V5ZCN56ewIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6I+c5Y2V5ZCN56ew77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6I+c5Y2V5ZCN56ew77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9Im9yZGVyTnVtIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5vcmRlcl9udW0nLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfmmL7npLrpobrluo8nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHdpZHRoPSJsZyIKKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmmL7npLrpobrluo8iCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5pi+56S66aG65bqP77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5pi+56S66aG65bqP77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzID0ge3sKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMQorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICBuYW1lPSJpc0ZyYW1lIgorICAgICAgICAgIHZhbHVlRW51bT17eworICAgICAgICAgICAgMDogJ+aYrycsCisgICAgICAgICAgICAxOiAn5ZCmJywKKyAgICAgICAgICB9fQorICAgICAgICAgIGluaXRpYWxWYWx1ZT0iMSIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLm1lbnUuaXNfZnJhbWUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfmmK/lkKbkuLrlpJbpk74nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeaYr+WQpuS4uuWklumTviIKKyAgICAgICAgICBoaWRkZW49e21lbnVUeXBlSWQgPT09ICdGJ30KKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXmmK/lkKbkuLrlpJbpk77vvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXmmK/lkKbkuLrlpJbpk77vvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAgIGZpZWxkUHJvcHMgPSB7eworICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnMScKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJwYXRoIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5wYXRoJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6Lev55Sx5Zyw5Z2AJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICB3aWR0aD0ibGciCisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6Lev55Sx5Zyw5Z2AIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCA9PT0gJ0YnfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBtZW51VHlwZUlkICE9PSAnRicsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXot6/nlLHlnLDlnYDvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXot6/nlLHlnLDlnYDvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJjb21wb25lbnQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5tZW51LmNvbXBvbmVudCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e7hOS7tui3r+W+hCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl57uE5Lu26Lev5b6EIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCAhPT0gJ0MnfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpee7hOS7tui3r+W+hO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpee7hOS7tui3r+W+hO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InF1ZXJ5IgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5xdWVyeScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+i3r+eUseWPguaVsCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6Lev55Sx5Y+C5pWwIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCAhPT0gJ0MnfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpei3r+eUseWPguaVsO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpei3r+eUseWPguaVsO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InBlcm1zIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5wZXJtcycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+adg+mZkOagh+ivhicsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5p2D6ZmQ5qCH6K+GIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCA9PT0gJ00nfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeadg+mZkOagh+ivhu+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeadg+mZkOagh+ivhu+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICBuYW1lPSJpc0NhY2hlIgorICAgICAgICAgIHZhbHVlRW51bT17eworICAgICAgICAgICAgMDogJ+e8k+WtmCcsCisgICAgICAgICAgICAxOiAn5LiN57yT5a2YJywKKyAgICAgICAgICB9fQorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS5pc19jYWNoZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aYr+WQpue8k+WtmCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5piv5ZCm57yT5a2YIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCAhPT0gJ0MnfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaYr+WQpue8k+WtmO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaYr+WQpue8k+WtmO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgICAgZmllbGRQcm9wcyA9IHt7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVJhZGlvLkdyb3VwCisgICAgICAgICAgbmFtZT0idmlzaWJsZSIKKyAgICAgICAgICB2YWx1ZUVudW09e3Zpc2libGVPcHRpb25zfQorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubWVudS52aXNpYmxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5pi+56S654q25oCBJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmmL7npLrnirbmgIEiCisgICAgICAgICAgaGlkZGVuPXttZW51VHlwZUlkID09PSAnRid9CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5pi+56S654q25oCB77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5pi+56S654q25oCB77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzID0ge3sKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJzAnCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgIHZhbHVlRW51bT17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzdGF0dXMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5tZW51LnN0YXR1cycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+iPnOWNleeKtuaAgScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6I+c5Y2V54q25oCBIgorICAgICAgICAgIGhpZGRlbj17bWVudVR5cGVJZCA9PT0gJ0YnfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6I+c5Y2V54q25oCB77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6I+c5Y2V54q25oCB77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzID0ge3sKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJzAnCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICAgIDxNb2RhbAorICAgICAgICB3aWR0aD17ODAwfQorICAgICAgICBvcGVuPXtpY29uU2VsZWN0b3JPcGVufQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldEljb25TZWxlY3Rvck9wZW4oZmFsc2UpOworICAgICAgICB9fQorICAgICAgICBmb290ZXI9e251bGx9CisgICAgICA+CisgICAgICAgIDxJY29uU2VsZWN0b3IKKyAgICAgICAgICBvblNlbGVjdD17KG5hbWU6IHN0cmluZykgPT4geworICAgICAgICAgICAgZm9ybS5zZXRGaWVsZHNWYWx1ZSh7IGljb246IG5hbWUgfSk7CisgICAgICAgICAgICBzZXRNZW51SWNvbk5hbWUobmFtZSk7CisgICAgICAgICAgICBzZXRJY29uU2VsZWN0b3JPcGVuKGZhbHNlKTsKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgPC9Nb2RhbD4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgTWVudUZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL01lbnUvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9NZW51L2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNhMmRlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9NZW51L2luZGV4LnRzeApAQCAtMCwwICsxLDMzOSBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBCdXR0b24sIG1lc3NhZ2UsIE1vZGFsIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBBY3Rpb25UeXBlLCBGb290ZXJUb29sYmFyLCBQYWdlQ29udGFpbmVyLCBQcm9Db2x1bW5zLCBQcm9UYWJsZSB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IFBsdXNPdXRsaW5lZCwgRGVsZXRlT3V0bGluZWQsIEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBnZXRNZW51TGlzdCwgcmVtb3ZlTWVudSwgYWRkTWVudSwgdXBkYXRlTWVudSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL21lbnUnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCB7IGJ1aWxkVHJlZURhdGEgfSBmcm9tICdAL3V0aWxzL3RyZWUnOworaW1wb3J0IHsgRGF0YU5vZGUgfSBmcm9tICdhbnRkL2VzL3RyZWUnOworaW1wb3J0IERpY3RUYWcgZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworCisvKioKKyAqIOa3u+WKoOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlQWRkID0gYXN5bmMgKGZpZWxkczogQVBJLlN5c3RlbS5NZW51KSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGF3YWl0IGFkZE1lbnUoeyAuLi5maWVsZHMgfSk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5re75Yqg5oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a3u+WKoOWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDmm7TmlrDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZVVwZGF0ZSA9IGFzeW5jIChmaWVsZHM6IEFQSS5TeXN0ZW0uTWVudSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjphY3nva4nKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCB1cGRhdGVNZW51KGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn6YWN572u5oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+mFjee9ruWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGhhbmRsZVJlbW92ZSA9IGFzeW5jIChzZWxlY3RlZFJvd3M6IEFQSS5TeXN0ZW0uTWVudVtdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgYXdhaXQgcmVtb3ZlTWVudShzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy5tZW51SWQpLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVtb3ZlT25lID0gYXN5bmMgKHNlbGVjdGVkUm93OiBBUEkuU3lzdGVtLk1lbnUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3cpIHJldHVybiB0cnVlOworICB0cnkgeworICAgIGNvbnN0IHBhcmFtcyA9IFtzZWxlY3RlZFJvdy5tZW51SWRdOworICAgIGF3YWl0IHJlbW92ZU1lbnUocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBNZW51VGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLk1lbnU+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLk1lbnVbXT4oW10pOworCisgIGNvbnN0IFttZW51VHJlZSwgc2V0TWVudVRyZWVdID0gdXNlU3RhdGU8RGF0YU5vZGVbXT4oW10pOworICBjb25zdCBbdmlzaWJsZU9wdGlvbnMsIHNldFZpc2libGVPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbc3RhdHVzT3B0aW9ucywgc2V0U3RhdHVzT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICAvKiog5Zu96ZmF5YyW6YWN572uICovCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfc2hvd19oaWRlJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0VmlzaWJsZU9wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX25vcm1hbF9kaXNhYmxlJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0U3RhdHVzT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgfSwgW10pOworCisgIGNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5NZW51PltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLm1lbnUubWVudV9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i6I+c5Y2V5ZCN56ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ21lbnVOYW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ubWVudS5pY29uIiBkZWZhdWx0TWVzc2FnZT0i6I+c5Y2V5Zu+5qCHIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2ljb24nLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5tZW51Lm9yZGVyX251bSIgZGVmYXVsdE1lc3NhZ2U9IuaYvuekuumhuuW6jyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdvcmRlck51bScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLm1lbnUuY29tcG9uZW50IiBkZWZhdWx0TWVzc2FnZT0i57uE5Lu26Lev5b6EIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NvbXBvbmVudCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLm1lbnUucGVybXMiIGRlZmF1bHRNZXNzYWdlPSLmnYPpmZDmoIfor4YiIC8+LAorICAgICAgZGF0YUluZGV4OiAncGVybXMnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5tZW51LnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuiPnOWNleeKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUudGl0bGVPcHRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZwiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3B0aW9uJywKKyAgICAgIHdpZHRoOiAnMjIwcHgnLAorICAgICAgdmFsdWVUeXBlOiAnb3B0aW9uJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImVkaXQiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06bWVudTplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDnvJbovpEKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm1lbnU6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisgICAgICAgIDxQcm9UYWJsZTxBUEkuU3lzdGVtLk1lbnU+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICByb3dLZXk9Im1lbnVJZCIKKyAgICAgICAgICBrZXk9Im1lbnVMaXN0IgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImFkZCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06bWVudTphZGQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLm5ldyIgZGVmYXVsdE1lc3NhZ2U9IuaWsOW7uiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgICBoaWRkZW49e3NlbGVjdGVkUm93cz8ubGVuZ3RoID09PSAwIHx8ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTptZW51OnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOWIoOmZpOaJgOmAieaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCkge30sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgIF19CisgICAgICAgICAgcmVxdWVzdD17KHBhcmFtcykgPT4KKyAgICAgICAgICAgIGdldE1lbnVMaXN0KHsgLi4ucGFyYW1zIH0gYXMgQVBJLlN5c3RlbS5NZW51TGlzdFBhcmFtcykudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHJvb3RNZW51ID0geyBpZDogMCwgbGFiZWw6ICfkuLvnsbvnm64nLCBjaGlsZHJlbjogW10gYXMgRGF0YU5vZGVbXSwgdmFsdWU6IDAgfTsKKyAgICAgICAgICAgICAgY29uc3QgbWVtdURhdGEgPSBidWlsZFRyZWVEYXRhKHJlcy5kYXRhLCAnbWVudUlkJywgJ21lbnVOYW1lJywgJycsICcnLCAnJyk7CisgICAgICAgICAgICAgIHJvb3RNZW51LmNoaWxkcmVuID0gbWVtdURhdGE7CisgICAgICAgICAgICAgIGNvbnN0IHRyZWVEYXRhOiBhbnkgPSBbXTsKKyAgICAgICAgICAgICAgdHJlZURhdGEucHVzaChyb290TWVudSk7CisgICAgICAgICAgICAgIHNldE1lbnVUcmVlKHRyZWVEYXRhKTsKKyAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICBkYXRhOiBtZW11RGF0YSwKKyAgICAgICAgICAgICAgICB0b3RhbDogcmVzLmRhdGEubGVuZ3RoLAorICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KQorICAgICAgICAgIH0KKyAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfQorICAgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgIH19CisgICAgICAgIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm1lbnU6ZGVsJyl9CisgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgICBva1RleHQ6ICfnoa7orqQnLAorICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoRGVsZXRpb24iIGRlZmF1bHRNZXNzYWdlPSLmibnph4/liKDpmaQiIC8+CisgICAgICAgICAgPC9CdXR0b24+CisgICAgICAgIDwvRm9vdGVyVG9vbGJhcj4KKyAgICAgICl9CisgICAgICA8VXBkYXRlRm9ybQorICAgICAgICBvblN1Ym1pdD17YXN5bmMgKHZhbHVlcykgPT4geworICAgICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgaWYgKHZhbHVlcy5tZW51SWQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVcGRhdGUoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLk1lbnUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5NZW51KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICB9fQorICAgICAgICBvcGVuPXttb2RhbFZpc2libGV9CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgICAgdmlzaWJsZU9wdGlvbnM9e3Zpc2libGVPcHRpb25zfQorICAgICAgICBzdGF0dXNPcHRpb25zPXtzdGF0dXNPcHRpb25zfQorICAgICAgICBtZW51VHJlZT17bWVudVRyZWV9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE1lbnVUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL05vdGljZS9lZGl0LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vTm90aWNlL2VkaXQudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTExY2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL05vdGljZS9lZGl0LnRzeApAQCAtMCwwICsxLDE3NCBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7CisgIFByb0Zvcm0sCisgIFByb0Zvcm1EaWdpdCwKKyAgUHJvRm9ybVRleHQsCisgIFByb0Zvcm1TZWxlY3QsCisgIFByb0Zvcm1UZXh0QXJlYSwKKyAgUHJvRm9ybVJhZGlvLAorICB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIE5vdGljZUZvcm1EYXRhID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBQYXJ0aWFsPEFQSS5TeXN0ZW0uTm90aWNlPjsKKworZXhwb3J0IHR5cGUgTm90aWNlRm9ybVByb3BzID0geworICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IE5vdGljZUZvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogTm90aWNlRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuU3lzdGVtLk5vdGljZT47CisgIG5vdGljZVR5cGVPcHRpb25zOiBEaWN0VmFsdWVFbnVtT2JqOworICBzdGF0dXNPcHRpb25zOiBEaWN0VmFsdWVFbnVtT2JqOworfTsKKworY29uc3QgTm90aWNlRm9ybTogUmVhY3QuRkM8Tm90aWNlRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgCisgIGNvbnN0IHsgbm90aWNlVHlwZU9wdGlvbnMsc3RhdHVzT3B0aW9ucywgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworCQkJbm90aWNlSWQ6IHByb3BzLnZhbHVlcy5ub3RpY2VJZCwKKwkJCW5vdGljZVRpdGxlOiBwcm9wcy52YWx1ZXMubm90aWNlVGl0bGUsCisJCQlub3RpY2VUeXBlOiBwcm9wcy52YWx1ZXMubm90aWNlVHlwZSwKKwkJCW5vdGljZUNvbnRlbnQ6IHByb3BzLnZhbHVlcy5ub3RpY2VDb250ZW50LAorCQkJc3RhdHVzOiBwcm9wcy52YWx1ZXMuc3RhdHVzLAorCQkJY3JlYXRlQnk6IHByb3BzLnZhbHVlcy5jcmVhdGVCeSwKKwkJCWNyZWF0ZVRpbWU6IHByb3BzLnZhbHVlcy5jcmVhdGVUaW1lLAorCQkJdXBkYXRlQnk6IHByb3BzLnZhbHVlcy51cGRhdGVCeSwKKwkJCXVwZGF0ZVRpbWU6IHByb3BzLnZhbHVlcy51cGRhdGVUaW1lLAorCQkJcmVtYXJrOiBwcm9wcy52YWx1ZXMucmVtYXJrLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgIHByb3BzLm9uU3VibWl0KHZhbHVlcyBhcyBOb3RpY2VGb3JtRGF0YSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0ubm90aWNlLnRpdGxlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnvJbovpHpgJrnn6XlhazlkYonLAorICAgICAgfSl9CisgICAgICBmb3JjZVJlbmRlcgorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGRlc3Ryb3lPbkNsb3NlCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorCQkgIDxQcm9Gb3JtIAorICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICBzdWJtaXR0ZXI9e2ZhbHNlfQorICAgICAgICBsYXlvdXQ9Imhvcml6b250YWwiIAorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9Im5vdGljZUlkIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubm90aWNlLm5vdGljZV9pZCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WFrOWRiue8luWPtycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5YWs5ZGK57yW5Y+3IgorICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgaGlkZGVuPXt0cnVlfQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWFrOWRiue8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWFrOWRiue8luWPt++8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9Im5vdGljZVRpdGxlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubm90aWNlLm5vdGljZV90aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WFrOWRiuagh+mimCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWFrOWRiuagh+mimCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWFrOWRiuagh+mimO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWFrOWRiuagh+mimO+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtU2VsZWN0CisgICAgICAgICAgdmFsdWVFbnVtPXtub3RpY2VUeXBlT3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJub3RpY2VUeXBlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ubm90aWNlLm5vdGljZV90eXBlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5YWs5ZGK57G75Z6LJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAyNCB9fQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlhazlkYrnsbvlnosiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlhazlkYrnsbvlnovvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlhazlkYrnsbvlnovvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVJhZGlvLkdyb3VwCisgICAgICAgICAgdmFsdWVFbnVtPXtzdGF0dXNPcHRpb25zfQorICAgICAgICAgIG5hbWU9InN0YXR1cyIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLm5vdGljZS5zdGF0dXMnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflhazlkYrnirbmgIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWFrOWRiueKtuaAgSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlhazlkYrnirbmgIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlhazlkYrnirbmgIHvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0ibm90aWNlQ29udGVudCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLm5vdGljZS5ub3RpY2VfY29udGVudCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WFrOWRiuWGheWuuScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMjQgfX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5YWs5ZGK5YaF5a65IgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWFrOWRiuWGheWuue+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWFrOWRiuWGheWuue+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InJlbWFyayIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLm5vdGljZS5yZW1hcmsnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflpIfms6gnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDI0IH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWkh+azqCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlpIfms6jvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlpIfms6jvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgPC9Qcm9Gb3JtPgorICAgIDwvTW9kYWw+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBOb3RpY2VGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Ob3RpY2UvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Ob3RpY2UvaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWIwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL05vdGljZS9pbmRleC50c3gKQEAgLTAsMCArMSwzNjYgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldE5vdGljZUxpc3QsIHJlbW92ZU5vdGljZSwgYWRkTm90aWNlLCB1cGRhdGVOb3RpY2UgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9ub3RpY2UnOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCBEaWN0VGFnIGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworLyoqCisgKiDmt7vliqDoioLngrkKKyAqCisgKiBAcGFyYW0gZmllbGRzCisgKi8KK2NvbnN0IGhhbmRsZUFkZCA9IGFzeW5jIChmaWVsZHM6IEFQSS5TeXN0ZW0uTm90aWNlKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGROb3RpY2UoeyAuLi5maWVsZHMgfSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmt7vliqDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfmt7vliqDlpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5pu05paw6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVVcGRhdGUgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLk5vdGljZSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjmm7TmlrAnKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlTm90aWNlKGZpZWxkcyk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfphY3nva7lpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5Yig6Zmk6IqC54K5CisgKgorICogQHBhcmFtIHNlbGVjdGVkUm93cworICovCitjb25zdCBoYW5kbGVSZW1vdmUgPSBhc3luYyAoc2VsZWN0ZWRSb3dzOiBBUEkuU3lzdGVtLk5vdGljZVtdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZU5vdGljZShzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy5ub3RpY2VJZCkuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WIoOmZpOaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVtb3ZlT25lID0gYXN5bmMgKHNlbGVjdGVkUm93OiBBUEkuU3lzdGVtLk5vdGljZSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93Lm5vdGljZUlkXTsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgcmVtb3ZlTm90aWNlKHBhcmFtcy5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisKKworY29uc3QgTm90aWNlVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLk5vdGljZT4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5TeXN0ZW0uTm90aWNlW10+KFtdKTsKKworICBjb25zdCBbbm90aWNlVHlwZU9wdGlvbnMsIHNldE5vdGljZVR5cGVPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbc3RhdHVzT3B0aW9ucywgc2V0U3RhdHVzT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICAvKiog5Zu96ZmF5YyW6YWN572uICovCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfbm90aWNlX3R5cGUnKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXROb3RpY2VUeXBlT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfbm90aWNlX3N0YXR1cycpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldFN0YXR1c09wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgIH0sIFtdKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5TeXN0ZW0uTm90aWNlPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLm5vdGljZS5ub3RpY2VfaWQiIGRlZmF1bHRNZXNzYWdlPSLlhazlkYrnvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAnbm90aWNlSWQnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5ub3RpY2Uubm90aWNlX3RpdGxlIiBkZWZhdWx0TWVzc2FnZT0i5YWs5ZGK5qCH6aKYIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ25vdGljZVRpdGxlJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ubm90aWNlLm5vdGljZV90eXBlIiBkZWZhdWx0TWVzc2FnZT0i5YWs5ZGK57G75Z6LIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ25vdGljZVR5cGUnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogbm90aWNlVHlwZU9wdGlvbnMsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5ub3RpY2Uubm90aWNlX2NvbnRlbnQiIGRlZmF1bHRNZXNzYWdlPSLlhazlkYrlhoXlrrkiIC8+LAorICAgICAgZGF0YUluZGV4OiAnbm90aWNlQ29udGVudCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblRhYmxlOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ubm90aWNlLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuWFrOWRiueKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLm5vdGljZS5yZW1hcmsiIGRlZmF1bHRNZXNzYWdlPSLlpIfms6giIC8+LAorICAgICAgZGF0YUluZGV4OiAncmVtYXJrJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ubm90aWNlLmNyZWF0ZV90aW1lIiBkZWZhdWx0TWVzc2FnZT0i5Yib5bu65pe26Ze0IiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2NyZWF0ZVRpbWUnLAorICAgICAgdmFsdWVUeXBlOiAnZGF0ZVJhbmdlJywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxzcGFuPntyZWNvcmQuY3JlYXRlVGltZS50b1N0cmluZygpfSA8L3NwYW4+KTsKKyAgICAgIH0sCisgICAgICBzZWFyY2g6IHsKKyAgICAgICAgdHJhbnNmb3JtOiAodmFsdWUpID0+IHsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3BhcmFtc1tiZWdpblRpbWVdJzogdmFsdWVbMF0sCisgICAgICAgICAgICAncGFyYW1zW2VuZFRpbWVdJzogdmFsdWVbMV0sCisgICAgICAgICAgfTsKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzEyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm5vdGljZTplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZWNvcmQpOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDnvJbovpEKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm5vdGljZTpyZW1vdmUnKX0KKyAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlT25lKHJlY29yZCk7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg5Yig6ZmkCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5TeXN0ZW0uTm90aWNlPgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0ibm90aWNlSWQiCisgICAgICAgICAga2V5PSJub3RpY2VMaXN0IgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImFkZCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06bm90aWNlOmFkZCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUubmV3IiBkZWZhdWx0TWVzc2FnZT0i5paw5bu6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm5vdGljZTpyZW1vdmUnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKyAgICAgICAgICAgICAgICAgIGljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICBhc3luYyBvbk9rKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHt9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8RGVsZXRlT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSIgZGVmYXVsdE1lc3NhZ2U9IuWIoOmZpCIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXROb3RpY2VMaXN0KHsgLi4ucGFyYW1zIH0gYXMgQVBJLlN5c3RlbS5Ob3RpY2VMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgIDxGb290ZXJUb29sYmFyCisgICAgICAgICAgZXh0cmE9eworICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmNob3NlbiIgZGVmYXVsdE1lc3NhZ2U9IuW3sumAieaLqSIgLz4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLml0ZW0iIGRlZmF1bHRNZXNzYWdlPSLpobkiIC8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06bm90aWNlOmRlbCcpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgICAgPFVwZGF0ZUZvcm0KKyAgICAgICAgb25TdWJtaXQ9e2FzeW5jICh2YWx1ZXMpID0+IHsKKyAgICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgIGlmICh2YWx1ZXMubm90aWNlSWQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVcGRhdGUoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLk5vdGljZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVBZGQoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLk5vdGljZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17bW9kYWxWaXNpYmxlfQorICAgICAgICB2YWx1ZXM9e2N1cnJlbnRSb3cgfHwge319CisgICAgICAgIG5vdGljZVR5cGVPcHRpb25zPXtub3RpY2VUeXBlT3B0aW9uc30KKyAgICAgICAgc3RhdHVzT3B0aW9ucz17c3RhdHVzT3B0aW9uc30KKyAgICAgIC8+CisgICAgPC9QYWdlQ29udGFpbmVyPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgTm90aWNlVGFibGVMaXN0OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9PcGVybG9nL2RldGFpbC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL09wZXJsb2cvZGV0YWlsLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWI0ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9PcGVybG9nL2RldGFpbC50c3gKQEAgLTAsMCArMSwxMTUgQEAKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBEZXNjcmlwdGlvbnMsIE1vZGFsIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBEaWN0VmFsdWVFbnVtT2JqIH0gZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworaW1wb3J0IHsgZ2V0VmFsdWVFbnVtTGFiZWwgfSBmcm9tICdAL3V0aWxzL29wdGlvbnMnOworCitleHBvcnQgdHlwZSBPcGVybG9nRm9ybURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFBhcnRpYWw8QVBJLk1vbml0b3IuT3BlcmxvZz47CisKK2V4cG9ydCB0eXBlIE9wZXJsb2dGb3JtUHJvcHMgPSB7CisgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogT3BlcmxvZ0Zvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogT3BlcmxvZ0Zvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLk1vbml0b3IuT3BlcmxvZz47CisgIGJ1c2luZXNzVHlwZU9wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7CisgIG9wZXJhdG9yVHlwZU9wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7Cit9OworCitjb25zdCBPcGVybG9nRGV0YWlsRm9ybTogUmVhY3QuRkM8T3BlcmxvZ0Zvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKworICBjb25zdCB7IHZhbHVlcywgYnVzaW5lc3NUeXBlT3B0aW9ucywgb3BlcmF0b3JUeXBlT3B0aW9ucywgc3RhdHVzT3B0aW9ucywgfSA9IHByb3BzOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGNvbnNvbGUubG9nKCJoYW5kbGUgb2siKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uQ2FuY2VsKCk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdtb25pdG9yLm9wZXJsb2cudGl0bGUnLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+e8lui+keaTjeS9nOaXpeW/l+iusOW9lScsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKyAgICAgIDxEZXNjcmlwdGlvbnMgY29sdW1uPXsyNH0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm1vZHVsZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaooeWdlyIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7YCR7dmFsdWVzLnRpdGxlfS8ke2dldFZhbHVlRW51bUxhYmVsKGJ1c2luZXNzVHlwZU9wdGlvbnMsIHZhbHVlcy5idXNpbmVzc1R5cGUpfWB9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLnJlcXVlc3RfbWV0aG9kIiBkZWZhdWx0TWVzc2FnZT0i6K+35rGC5pa55byPIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMucmVxdWVzdE1ldGhvZH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MTJ9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cub3Blcl9uYW1lIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c5Lq65ZGYIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtgJHt2YWx1ZXMub3Blck5hbWV9LyR7dmFsdWVzLm9wZXJJcH1gfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsxMn0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyYXRvcl90eXBlIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c57G75YirIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHtnZXRWYWx1ZUVudW1MYWJlbChvcGVyYXRvclR5cGVPcHRpb25zLCB2YWx1ZXMub3BlcmF0b3JUeXBlKX0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MjR9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cubWV0aG9kIiBkZWZhdWx0TWVzc2FnZT0i5pa55rOV5ZCN56ewIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMubWV0aG9kfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgICA8RGVzY3JpcHRpb25zLkl0ZW0KKyAgICAgICAgICBzcGFuPXsyNH0KKyAgICAgICAgICBsYWJlbD17PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX3VybCIgZGVmYXVsdE1lc3NhZ2U9Iuivt+axglVSTCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLm9wZXJVcmx9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezI0fQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfcGFyYW0iIGRlZmF1bHRNZXNzYWdlPSLor7fmsYLlj4LmlbAiIC8+fQorICAgICAgICA+CisgICAgICAgICAge3ZhbHVlcy5vcGVyUGFyYW19CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezI0fQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLmpzb25fcmVzdWx0IiBkZWZhdWx0TWVzc2FnZT0i6L+U5Zue5Y+C5pWwIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuanNvblJlc3VsdH0KKyAgICAgICAgPC9EZXNjcmlwdGlvbnMuSXRlbT4KKyAgICAgICAgPERlc2NyaXB0aW9ucy5JdGVtCisgICAgICAgICAgc3Bhbj17MjR9CisgICAgICAgICAgbGFiZWw9ezxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cuZXJyb3JfbXNnIiBkZWZhdWx0TWVzc2FnZT0i6ZSZ6K+v5raI5oGvIiAvPn0KKyAgICAgICAgPgorICAgICAgICAgIHt2YWx1ZXMuZXJyb3JNc2d9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOeKtuaAgSIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7Z2V0VmFsdWVFbnVtTGFiZWwoc3RhdHVzT3B0aW9ucywgdmFsdWVzLnN0YXR1cyl9CisgICAgICAgIDwvRGVzY3JpcHRpb25zLkl0ZW0+CisgICAgICAgIDxEZXNjcmlwdGlvbnMuSXRlbQorICAgICAgICAgIHNwYW49ezEyfQorICAgICAgICAgIGxhYmVsPXs8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaXtumXtCIgLz59CisgICAgICAgID4KKyAgICAgICAgICB7dmFsdWVzLm9wZXJUaW1lPy50b1N0cmluZygpfQorICAgICAgICA8L0Rlc2NyaXB0aW9ucy5JdGVtPgorICAgICAgPC9EZXNjcmlwdGlvbnM+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE9wZXJsb2dEZXRhaWxGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9PcGVybG9nL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vT3BlcmxvZy9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NjcwOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vT3BlcmxvZy9pbmRleC50c3gKQEAgLTAsMCArMSw0MTEgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGdldE9wZXJsb2dMaXN0LCByZW1vdmVPcGVybG9nLCBhZGRPcGVybG9nLCB1cGRhdGVPcGVybG9nLCBjbGVhbkFsbE9wZXJsb2csIGV4cG9ydE9wZXJsb2cgfSBmcm9tICdAL3NlcnZpY2VzL21vbml0b3Ivb3BlcmxvZyc7CitpbXBvcnQgVXBkYXRlRm9ybSBmcm9tICcuL2RldGFpbCc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuTW9uaXRvci5PcGVybG9nKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa3u+WKoCcpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhZGRPcGVybG9nKHsgLi4uZmllbGRzIH0pOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5re75Yqg5oiQ5YqfJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5re75Yqg5aSx6LSl6K+36YeN6K+V77yBJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOabtOaWsOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlVXBkYXRlID0gYXN5bmMgKGZpZWxkczogQVBJLk1vbml0b3IuT3BlcmxvZykgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjmm7TmlrAnKTsKKyAgdHJ5IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlT3BlcmxvZyhmaWVsZHMpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5pu05paw5oiQ5YqfJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign6YWN572u5aSx6LSl6K+36YeN6K+V77yBJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOWIoOmZpOiKgueCuQorICoKKyAqIEBwYXJhbSBzZWxlY3RlZFJvd3MKKyAqLworY29uc3QgaGFuZGxlUmVtb3ZlID0gYXN5bmMgKHNlbGVjdGVkUm93czogQVBJLk1vbml0b3IuT3BlcmxvZ1tdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZU9wZXJsb2coc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cub3BlcklkKS5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOa4heepuuaJgOacieiusOW9lQorICoKKyAqLworY29uc3QgaGFuZGxlQ2xlYW5BbGwgPSBhc3luYyAoKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOa4heepuicpOworICB0cnkgeworICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjbGVhbkFsbE9wZXJsb2coKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+a4heepuuaIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+a4heepuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCisvKioKKyAqIOWvvOWHuuaVsOaNrgorICoKKyAqCisgKi8KK2NvbnN0IGhhbmRsZUV4cG9ydCA9IGFzeW5jICgpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5a+85Ye6Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZXhwb3J0T3BlcmxvZygpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKworY29uc3QgT3BlcmxvZ1RhYmxlTGlzdDogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IGZvcm1UYWJsZVJlZiA9IHVzZVJlZjxGb3JtSW5zdGFuY2U+KCk7CisKKyAgY29uc3QgW21vZGFsVmlzaWJsZSwgc2V0TW9kYWxWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsKKworICBjb25zdCBhY3Rpb25SZWYgPSB1c2VSZWY8QWN0aW9uVHlwZT4oKTsKKyAgY29uc3QgW2N1cnJlbnRSb3csIHNldEN1cnJlbnRSb3ddID0gdXNlU3RhdGU8QVBJLk1vbml0b3IuT3BlcmxvZz4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEFQSS5Nb25pdG9yLk9wZXJsb2dbXT4oW10pOworCisgIGNvbnN0IFtidXNpbmVzc1R5cGVPcHRpb25zLCBzZXRCdXNpbmVzc1R5cGVPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbb3BlcmF0b3JUeXBlT3B0aW9ucywgc2V0T3BlcmF0b3JUeXBlT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX29wZXJfdHlwZScsIHRydWUpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldEJ1c2luZXNzVHlwZU9wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX29wZXJfdHlwZScsIHRydWUpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldE9wZXJhdG9yVHlwZU9wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX2NvbW1vbl9zdGF0dXMnLCB0cnVlKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXRTdGF0dXNPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxBUEkuTW9uaXRvci5PcGVybG9nPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfaWQiIGRlZmF1bHRNZXNzYWdlPSLml6Xlv5fkuLvplK4iIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlcklkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cudGl0bGUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzmqKHlnZciIC8+LAorICAgICAgZGF0YUluZGV4OiAndGl0bGUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5idXNpbmVzc190eXBlIiBkZWZhdWx0TWVzc2FnZT0i5Lia5Yqh57G75Z6LIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ2J1c2luZXNzVHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBidXNpbmVzc1R5cGVPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcgZW51bXM9e2J1c2luZXNzVHlwZU9wdGlvbnN9IHZhbHVlPXtyZWNvcmQuYnVzaW5lc3NUeXBlfSAvPik7CisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cucmVxdWVzdF9tZXRob2QiIGRlZmF1bHRNZXNzYWdlPSLor7fmsYLmlrnlvI8iIC8+LAorICAgICAgZGF0YUluZGV4OiAncmVxdWVzdE1ldGhvZCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJhdG9yX3R5cGUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZznsbvliKsiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlcmF0b3JUeXBlJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IG9wZXJhdG9yVHlwZU9wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17b3BlcmF0b3JUeXBlT3B0aW9uc30gdmFsdWU9e3JlY29yZC5vcGVyYXRvclR5cGV9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzkurrlkZgiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3Blck5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Im1vbml0b3Iub3BlcmxvZy5vcGVyX2lwIiBkZWZhdWx0TWVzc2FnZT0i5Li75py65Zyw5Z2AIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wZXJJcCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfbG9jYXRpb24iIGRlZmF1bHRNZXNzYWdlPSLmk43kvZzlnLDngrkiIC8+LAorICAgICAgZGF0YUluZGV4OiAnb3BlckxvY2F0aW9uJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJtb25pdG9yLm9wZXJsb2cuc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2c54q25oCBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3N0YXR1cycsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBzdGF0dXNPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPERpY3RUYWcga2V5PSJzdGF0dXMiIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ibW9uaXRvci5vcGVybG9nLm9wZXJfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nOaXtumXtCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdvcGVyVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICdkYXRlVGltZScsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzEyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm9wZXJsb2c6ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg6K+m57uGCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5Nb25pdG9yLk9wZXJsb2c+CisgICAgICAgICAgaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBhY3Rpb25SZWY9e2FjdGlvblJlZn0KKyAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgcm93S2V5PSJvcGVySWQiCisgICAgICAgICAga2V5PSJvcGVybG9nTGlzdCIKKyAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgIGxhYmVsV2lkdGg6IDEyMCwKKyAgICAgICAgICB9fQorICAgICAgICAgIHRvb2xCYXJSZW5kZXI9eygpID0+IFsKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJhZGQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOm9wZXJsb2c6YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5uZXciIGRlZmF1bHRNZXNzYWdlPSLmlrDlu7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06b3BlcmxvZzpyZW1vdmUnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKyAgICAgICAgICAgICAgICAgIGljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICBhc3luYyBvbk9rKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBvbkNhbmNlbCgpIHsgfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUiIGRlZmF1bHRNZXNzYWdlPSLliKDpmaQiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iY2xlYW4iCisgICAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpvcGVybG9nOnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOa4heepuuaJgOacieaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgaWNvbjogPEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn6K+36LCo5oWO5pON5L2cJywKKyAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVDbGVhbkFsbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuY2xlYW5BbGwiIGRlZmF1bHRNZXNzYWdlPSLmuIXnqboiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpvcGVybG9nOmV4cG9ydCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhwb3J0KCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXRPcGVybG9nTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5Nb25pdG9yLk9wZXJsb2dMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgIDxGb290ZXJUb29sYmFyCisgICAgICAgICAgZXh0cmE9eworICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmNob3NlbiIgZGVmYXVsdE1lc3NhZ2U9IuW3sumAieaLqSIgLz4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLml0ZW0iIGRlZmF1bHRNZXNzYWdlPSLpobkiIC8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06b3BlcmxvZzpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxVcGRhdGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzKSA9PiB7CisgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICBpZiAodmFsdWVzLm9wZXJJZCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVVwZGF0ZSh7IC4uLnZhbHVlcyB9IGFzIEFQSS5Nb25pdG9yLk9wZXJsb2cpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLk1vbml0b3IuT3BlcmxvZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17bW9kYWxWaXNpYmxlfQorICAgICAgICB2YWx1ZXM9e2N1cnJlbnRSb3cgfHwge319CisgICAgICAgIGJ1c2luZXNzVHlwZU9wdGlvbnM9e2J1c2luZXNzVHlwZU9wdGlvbnN9CisgICAgICAgIG9wZXJhdG9yVHlwZU9wdGlvbnM9e29wZXJhdG9yVHlwZU9wdGlvbnN9CisgICAgICAgIHN0YXR1c09wdGlvbnM9e3N0YXR1c09wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IE9wZXJsb2dUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1Bvc3QvZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1Bvc3QvZWRpdC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZmNkZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vUG9zdC9lZGl0LnRzeApAQCAtMCwwICsxLDE2NiBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7CisgIFByb0Zvcm0sCisgIFByb0Zvcm1EaWdpdCwKKyAgUHJvRm9ybVRleHQsCisgIFByb0Zvcm1SYWRpbywKKyAgUHJvRm9ybVRleHRBcmVhLAorICB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKK2V4cG9ydCB0eXBlIFBvc3RGb3JtRGF0YSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgUGFydGlhbDxBUEkuU3lzdGVtLlBvc3Q+OworCitleHBvcnQgdHlwZSBQb3N0Rm9ybVByb3BzID0geworICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IFBvc3RGb3JtRGF0YSkgPT4gdm9pZDsKKyAgb25TdWJtaXQ6ICh2YWx1ZXM6IFBvc3RGb3JtRGF0YSkgPT4gUHJvbWlzZTx2b2lkPjsKKyAgb3BlbjogYm9vbGVhbjsKKyAgdmFsdWVzOiBQYXJ0aWFsPEFQSS5TeXN0ZW0uUG9zdD47CisgIHN0YXR1c09wdGlvbnM6IERpY3RWYWx1ZUVudW1PYmo7Cit9OworCitjb25zdCBQb3N0Rm9ybTogUmVhY3QuRkM8UG9zdEZvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgY29uc3QgeyBzdGF0dXNPcHRpb25zLCB9ID0gcHJvcHM7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgICAgZm9ybS5zZXRGaWVsZHNWYWx1ZSh7CisJCQlwb3N0SWQ6IHByb3BzLnZhbHVlcy5wb3N0SWQsCisJCQlwb3N0Q29kZTogcHJvcHMudmFsdWVzLnBvc3RDb2RlLAorCQkJcG9zdE5hbWU6IHByb3BzLnZhbHVlcy5wb3N0TmFtZSwKKwkJCXBvc3RTb3J0OiBwcm9wcy52YWx1ZXMucG9zdFNvcnQsCisJCQlzdGF0dXM6IHByb3BzLnZhbHVlcy5zdGF0dXMsCisJCQljcmVhdGVCeTogcHJvcHMudmFsdWVzLmNyZWF0ZUJ5LAorCQkJY3JlYXRlVGltZTogcHJvcHMudmFsdWVzLmNyZWF0ZVRpbWUsCisJCQl1cGRhdGVCeTogcHJvcHMudmFsdWVzLnVwZGF0ZUJ5LAorCQkJdXBkYXRlVGltZTogcHJvcHMudmFsdWVzLnVwZGF0ZVRpbWUsCisJCQlyZW1hcms6IHByb3BzLnZhbHVlcy5yZW1hcmssCisgICAgfSk7CisgIH0sIFtmb3JtLCBwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGZvcm0uc3VibWl0KCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICB9OworICBjb25zdCBoYW5kbGVGaW5pc2ggPSBhc3luYyAodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7CisgICAgcHJvcHMub25TdWJtaXQodmFsdWVzIGFzIFBvc3RGb3JtRGF0YSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0ucG9zdC50aXRsZScsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn57yW6L6R5bKX5L2N5L+h5oGvJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGZvcmNlUmVuZGVyCisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKwkJICA8UHJvRm9ybSAKKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgc3VibWl0dGVyPXtmYWxzZX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIiAKKyAgICAgICAgb25GaW5pc2g9e2hhbmRsZUZpbmlzaH0+CisgICAgICAgIDxQcm9Gb3JtRGlnaXQKKyAgICAgICAgICBuYW1lPSJwb3N0SWQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5wb3N0LnBvc3RfaWQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflspfkvY3nvJblj7cnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlspfkvY3nvJblj7ciCisgICAgICAgICAgZGlzYWJsZWQKKyAgICAgICAgICBoaWRkZW49e3RydWV9CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5bKX5L2N57yW5Y+377yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5bKX5L2N57yW5Y+377yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0icG9zdE5hbWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5wb3N0LnBvc3RfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wyl+S9jeWQjeensCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWyl+S9jeWQjeensCIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWyl+S9jeWQjeensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWyl+S9jeWQjeensO+8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgIG5hbWU9InBvc3RDb2RlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucG9zdC5wb3N0X2NvZGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflspfkvY3nvJbnoIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlspfkvY3nvJbnoIEiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlspfkvY3nvJbnoIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlspfkvY3nvJbnoIHvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybURpZ2l0CisgICAgICAgICAgbmFtZT0icG9zdFNvcnQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5wb3N0LnBvc3Rfc29ydCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aYvuekuumhuuW6jycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeaYvuekuumhuuW6jyIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgLz4sICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICB2YWx1ZUVudW09e3N0YXR1c09wdGlvbnN9CisgICAgICAgICAgbmFtZT0ic3RhdHVzIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucG9zdC5zdGF0dXMnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnirbmgIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXnirbmgIEiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnirbmgIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnirbmgIHvvIEiIC8+LCAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0icmVtYXJrIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucG9zdC5yZW1hcmsnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflpIfms6gnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlpIfms6giCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5aSH5rOo77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5aSH5rOo77yBIiAvPiwgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgUG9zdEZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1Bvc3QvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Qb3N0L2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDk4YWFlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Qb3N0L2luZGV4LnRzeApAQCAtMCwwICsxLDM2NiBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgdHlwZSB7IEZvcm1JbnN0YW5jZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQnV0dG9uLCBtZXNzYWdlLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgQWN0aW9uVHlwZSwgRm9vdGVyVG9vbGJhciwgUGFnZUNvbnRhaW5lciwgUHJvQ29sdW1ucywgUHJvVGFibGUgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBQbHVzT3V0bGluZWQsIERlbGV0ZU91dGxpbmVkLCBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIH0gZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IHsgZ2V0UG9zdExpc3QsIHJlbW92ZVBvc3QsIGFkZFBvc3QsIHVwZGF0ZVBvc3QsIGV4cG9ydFBvc3QgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9wb3N0JzsKK2ltcG9ydCBVcGRhdGVGb3JtIGZyb20gJy4vZWRpdCc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLlBvc3QpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5re75YqgJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFkZFBvc3QoeyAuLi5maWVsZHMgfSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmt7vliqDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfmt7vliqDlpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5pu05paw6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVVcGRhdGUgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLlBvc3QpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5pu05pawJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHVwZGF0ZVBvc3QoZmllbGRzKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+abtOaWsOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+mFjee9ruWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGhhbmRsZVJlbW92ZSA9IGFzeW5jIChzZWxlY3RlZFJvd3M6IEFQSS5TeXN0ZW0uUG9zdFtdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZVBvc3Qoc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cucG9zdElkKS5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjb25zdCBoYW5kbGVSZW1vdmVPbmUgPSBhc3luYyAoc2VsZWN0ZWRSb3c6IEFQSS5TeXN0ZW0uUG9zdCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LnBvc3RJZF07CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZVBvc3QocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5a+85Ye65pWw5o2uCisgKgorICoKKyAqLworY29uc3QgaGFuZGxlRXhwb3J0ID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjlr7zlh7onKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCBleHBvcnRQb3N0KCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBQb3N0VGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLlBvc3Q+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLlBvc3RbXT4oW10pOworCisgIGNvbnN0IFtzdGF0dXNPcHRpb25zLCBzZXRTdGF0dXNPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworCisgIGNvbnN0IGFjY2VzcyA9IHVzZUFjY2VzcygpOworCisgIC8qKiDlm73pmYXljJbphY3nva4gKi8KKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGdldERpY3RWYWx1ZUVudW0oJ3N5c19ub3JtYWxfZGlzYWJsZScpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldFN0YXR1c09wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgIH0sIFtdKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5TeXN0ZW0uUG9zdD5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5wb3N0LnBvc3RfaWQiIGRlZmF1bHRNZXNzYWdlPSLlspfkvY3nvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAncG9zdElkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ucG9zdC5wb3N0X2NvZGUiIGRlZmF1bHRNZXNzYWdlPSLlspfkvY3nvJbnoIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAncG9zdENvZGUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5wb3N0LnBvc3RfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IuWyl+S9jeWQjeensCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdwb3N0TmFtZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnBvc3QucG9zdF9zb3J0IiBkZWZhdWx0TWVzc2FnZT0i5pi+56S66aG65bqPIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3Bvc3RTb3J0JywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ucG9zdC5zdGF0dXMiIGRlZmF1bHRNZXNzYWdlPSLnirbmgIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAnc3RhdHVzJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IHN0YXR1c09wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8RGljdFRhZyBlbnVtcz17c3RhdHVzT3B0aW9uc30gdmFsdWU9e3JlY29yZC5zdGF0dXN9IC8+KTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzIyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnBvc3Q6ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg57yW6L6RCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAga2V5PSJiYXRjaFJlbW92ZSIKKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpwb3N0OnJlbW92ZScpfQorICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICBva1RleHQ6ICfnoa7orqQnLAorICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmVPbmUocmVjb3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDliKDpmaQKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgXSwKKyAgICB9LAorICBdOworCisgIHJldHVybiAoCisgICAgPFBhZ2VDb250YWluZXI+CisgICAgICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIGZsb2F0OiAncmlnaHQnIH19PgorICAgICAgICA8UHJvVGFibGU8QVBJLlN5c3RlbS5Qb3N0PgorICAgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+S/oeaBrycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgZm9ybVJlZj17Zm9ybVRhYmxlUmVmfQorICAgICAgICAgIHJvd0tleT0icG9zdElkIgorICAgICAgICAgIGtleT0icG9zdExpc3QiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iYWRkIgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpwb3N0OmFkZCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUubmV3IiBkZWZhdWx0TWVzc2FnZT0i5paw5bu6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnBvc3Q6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7fSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5kZWxldGUiIGRlZmF1bHRNZXNzYWdlPSLliKDpmaQiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZXhwb3J0IgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpwb3N0OmV4cG9ydCcpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXhwb3J0KCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXRQb3N0TGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5TeXN0ZW0uUG9zdExpc3RQYXJhbXMpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7CisgICAgICAgICAgICAgICAgZGF0YTogcmVzLnJvd3MsCisgICAgICAgICAgICAgICAgdG90YWw6IHJlcy50b3RhbCwKKyAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSkKKyAgICAgICAgICB9CisgICAgICAgICAgY29sdW1ucz17Y29sdW1uc30KKyAgICAgICAgICByb3dTZWxlY3Rpb249e3sKKyAgICAgICAgICAgIG9uQ2hhbmdlOiAoXywgc2VsZWN0ZWRSb3dzKSA9PiB7CisgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgPC9kaXY+CisgICAgICB7c2VsZWN0ZWRSb3dzPy5sZW5ndGggPiAwICYmICgKKyAgICAgICAgPEZvb3RlclRvb2xiYXIKKyAgICAgICAgICBleHRyYT17CisgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuY2hvc2VuIiBkZWZhdWx0TWVzc2FnZT0i5bey6YCJ5oupIiAvPgorICAgICAgICAgICAgICA8YSBzdHlsZT17eyBmb250V2VpZ2h0OiA2MDAgfX0+e3NlbGVjdGVkUm93cy5sZW5ndGh9PC9hPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuaXRlbSIgZGVmYXVsdE1lc3NhZ2U9IumhuSIgLz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIH0KKyAgICAgICAgPgorICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGtleT0icmVtb3ZlIgorICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpwb3N0OmRlbCcpfQorICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpCcsCisgICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgICAgb2tUZXh0OiAn56Gu6K6kJywKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlUmVtb3ZlKHNlbGVjdGVkUm93cyk7CisgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkQW5kUmVzdD8uKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5iYXRjaERlbGV0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5om56YeP5Yig6ZmkIiAvPgorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0Zvb3RlclRvb2xiYXI+CisgICAgICApfQorICAgICAgPFVwZGF0ZUZvcm0KKyAgICAgICAgb25TdWJtaXQ9e2FzeW5jICh2YWx1ZXMpID0+IHsKKyAgICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgIGlmICh2YWx1ZXMucG9zdElkKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlVXBkYXRlKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5Qb3N0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZUFkZCh7IC4uLnZhbHVlcyB9IGFzIEFQSS5TeXN0ZW0uUG9zdCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICAgICAgaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50LnJlbG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXRNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17bW9kYWxWaXNpYmxlfQorICAgICAgICB2YWx1ZXM9e2N1cnJlbnRSb3cgfHwge319CisgICAgICAgIHN0YXR1c09wdGlvbnM9e3N0YXR1c09wdGlvbnN9CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFBvc3RUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1JvbGUvYXV0aFVzZXIudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2F1dGhVc2VyLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUzZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2F1dGhVc2VyLnRzeApAQCAtMCwwICsxLDI3NCBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzLCBoaXN0b3J5LCB1c2VQYXJhbXMgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IEJ1dHRvbiwgTW9kYWwsIG1lc3NhZ2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCwgUm9sbGJhY2tPdXRsaW5lZCB9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IGF1dGhVc2VyU2VsZWN0QWxsLCBhdXRoVXNlckNhbmNlbCwgYXV0aFVzZXJDYW5jZWxBbGwsIGFsbG9jYXRlZFVzZXJMaXN0LCB1bmFsbG9jYXRlZFVzZXJMaXN0IH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vcm9sZSc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgRGljdFRhZyBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CitpbXBvcnQgVXNlclNlbGVjdG9yTW9kYWwgZnJvbSAnLi9jb21wb25lbnRzL1VzZXJTZWxlY3Rvck1vZGFsJzsKK2ltcG9ydCB7IEh0dHBSZXN1bHQgfSBmcm9tICdAL2VudW1zL2h0dHBFbnVtJzsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGNhbmNlbEF1dGhVc2VyQWxsID0gYXN5bmMgKHJvbGVJZDogc3RyaW5nLCBzZWxlY3RlZFJvd3M6IEFQSS5TeXN0ZW0uVXNlcltdKSA9PiB7CisJY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Y+W5raI5o6I5p2DJyk7CisJaWYgKCFzZWxlY3RlZFJvd3MpIHJldHVybiB0cnVlOworCXRyeSB7CisJCWNvbnN0IHVzZXJJZHMgPSBzZWxlY3RlZFJvd3MubWFwKChyb3cpID0+IHJvdy51c2VySWQpLmpvaW4oJywnKTsKKwkJY29uc3QgcmVzcCA9IGF3YWl0IGF1dGhVc2VyQ2FuY2VsQWxsKHtyb2xlSWQsIHVzZXJJZHN9KTsKKwkJaGlkZSgpOworCQlpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKwkJCW1lc3NhZ2Uuc3VjY2Vzcygn5Y+W5raI5o6I5p2D5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisJCX0gZWxzZSB7CisJCQltZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9IGNhdGNoIChlcnJvcikgeworCQloaWRlKCk7CisJCW1lc3NhZ2UuZXJyb3IoJ+WPlua2iOaOiOadg+Wksei0pe+8jOivt+mHjeivlScpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfTsKKworY29uc3QgY2FuY2VsQXV0aFVzZXIgPSBhc3luYyAocm9sZUlkOiBzdHJpbmcsIHVzZXJJZDogbnVtYmVyKSA9PiB7CisJY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Y+W5raI5o6I5p2DJyk7CisJdHJ5IHsKKwkJY29uc3QgcmVzcCA9IGF3YWl0IGF1dGhVc2VyQ2FuY2VsKHsgdXNlcklkLCByb2xlSWQgfSk7CisJCWhpZGUoKTsKKwkJaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisJCQltZXNzYWdlLnN1Y2Nlc3MoJ+WPlua2iOaOiOadg+aIkOWKn++8jOWNs+WwhuWIt+aWsCcpOworCQl9IGVsc2UgeworCQkJbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSBjYXRjaCAoZXJyb3IpIHsKKwkJaGlkZSgpOworCQltZXNzYWdlLmVycm9yKCflj5bmtojmjojmnYPlpLHotKXvvIzor7fph43or5UnKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK307CisKKworY29uc3QgQXV0aFVzZXJUYWJsZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworCisJY29uc3QgW21vZGFsVmlzaWJsZSwgc2V0TW9kYWxWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsKKworCWNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworCWNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLlVzZXJbXT4oW10pOworCWNvbnN0IFtzdGF0dXNPcHRpb25zLCBzZXRTdGF0dXNPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworCisJY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKwkvKiog5Zu96ZmF5YyW6YWN572uICovCisJY29uc3QgaW50bCA9IHVzZUludGwoKTsKKworCWNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpOworCWlmIChwYXJhbXMuaWQgPT09IHVuZGVmaW5lZCkgeworCQloaXN0b3J5LmJhY2soKTsKKwl9CisJY29uc3Qgcm9sZUlkID0gcGFyYW1zLmlkIHx8ICcwJzsKKworCXVzZUVmZmVjdCgoKSA9PiB7CisJCWdldERpY3RWYWx1ZUVudW0oJ3N5c19ub3JtYWxfZGlzYWJsZScpLnRoZW4oKGRhdGEpID0+IHsKKwkJCXNldFN0YXR1c09wdGlvbnMoZGF0YSk7CisJCX0pOworCX0sIFtdKTsKKworCWNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5Vc2VyPltdID0gWworCQl7CisJCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnVzZXJfaWQiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfnvJblj7ciIC8+LAorCQkJZGF0YUluZGV4OiAnZGVwdElkJywKKwkJCXZhbHVlVHlwZTogJ3RleHQnLAorCQl9LAorCQl7CisJCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnVzZXJfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IueUqOaIt+i0puWPtyIgLz4sCisJCQlkYXRhSW5kZXg6ICd1c2VyTmFtZScsCisJCQl2YWx1ZVR5cGU6ICd0ZXh0JywKKwkJfSwKKwkJeworCQkJdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0udXNlci5uaWNrX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfmmLXnp7AiIC8+LAorCQkJZGF0YUluZGV4OiAnbmlja05hbWUnLAorCQkJdmFsdWVUeXBlOiAndGV4dCcsCisJCX0sCisJCXsKKwkJCXRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnVzZXIucGhvbmVudW1iZXIiIGRlZmF1bHRNZXNzYWdlPSLmiYvmnLrlj7fnoIEiIC8+LAorCQkJZGF0YUluZGV4OiAncGhvbmVudW1iZXInLAorCQkJdmFsdWVUeXBlOiAndGV4dCcsCisJCX0sCisJCXsKKwkJCXRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnJvbGUuY3JlYXRlX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLliJvlu7rml7bpl7QiIC8+LAorCQkJZGF0YUluZGV4OiAnY3JlYXRlVGltZScsCisJCQl2YWx1ZVR5cGU6ICdkYXRlUmFuZ2UnLAorCQkJcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisJCQkJcmV0dXJuICg8c3Bhbj57cmVjb3JkLmNyZWF0ZVRpbWUudG9TdHJpbmcoKX0gPC9zcGFuPik7CisJCQl9LAorCQkJaGlkZUluU2VhcmNoOiB0cnVlLAorCQl9LAorCQl7CisJCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuW4kOWPt+eKtuaAgSIgLz4sCisJCQlkYXRhSW5kZXg6ICdzdGF0dXMnLAorCQkJdmFsdWVUeXBlOiAnc2VsZWN0JywKKwkJCXZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKwkJCXJlbmRlcjogKF8sIHJlY29yZCkgPT4geworCQkJCXJldHVybiAoPERpY3RUYWcgZW51bXM9e3N0YXR1c09wdGlvbnN9IHZhbHVlPXtyZWNvcmQuc3RhdHVzfSAvPik7CisJCQl9LAorCQl9LAorCQl7CisJCQl0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKwkJCWRhdGFJbmRleDogJ29wdGlvbicsCisJCQl3aWR0aDogJzYwcHgnLAorCQkJdmFsdWVUeXBlOiAnb3B0aW9uJywKKwkJCXJlbmRlcjogKF8sIHJlY29yZCkgPT4gWworCQkJCTxCdXR0b24KKwkJCQkJdHlwZT0ibGluayIKKwkJCQkJc2l6ZT0ic21hbGwiCisJCQkJCWRhbmdlcgorCQkJCQlpY29uPXs8RGVsZXRlT3V0bGluZWQgLz59CisJCQkJCWtleT0icmVtb3ZlIgorCQkJCQloaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpyb2xlOnJlbW92ZScpfQorCQkJCQlvbkNsaWNrPXthc3luYyAoKSA9PiB7CisJCQkJCQlNb2RhbC5jb25maXJtKHsKKwkJCQkJCQl0aXRsZTogJ+WIoOmZpCcsCisJCQkJCQkJY29udGVudDogJ+ehruiupOimgeWPlua2iOivpeeUqOaItycgKyByZWNvcmQudXNlck5hbWUgKyAnIuinkuiJsuaOiOadg+WQl++8nycsCisJCQkJCQkJb2tUZXh0OiAn56Gu6K6kJywKKwkJCQkJCQljYW5jZWxUZXh0OiAn5Y+W5raIJywKKwkJCQkJCQlvbk9rOiBhc3luYyAoKSA9PiB7CisJCQkJCQkJCWNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBjYW5jZWxBdXRoVXNlcihyb2xlSWQsIHJlY29yZC51c2VySWQpOworCQkJCQkJCQlpZiAoc3VjY2VzcykgeworCQkJCQkJCQkJaWYgKGFjdGlvblJlZi5jdXJyZW50KSB7CisJCQkJCQkJCQkJYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9LAorCQkJCQkJfSk7CisJCQkJCX19CisJCQkJPgorCQkJCQnlj5bmtojmjojmnYMKKwkJCQk8L0J1dHRvbj4sCisJCQldLAorCQl9LAorCV07CisKKwlyZXR1cm4gKAorCQk8UGFnZUNvbnRhaW5lcj4KKwkJCTxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgZmxvYXQ6ICdyaWdodCcgfX0+CisJCQkJPFByb1RhYmxlPEFQSS5TeXN0ZW0uVXNlcj4KKwkJCQkJaGVhZGVyVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisJCQkJCQlpZDogJ3BhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlJywKKwkJCQkJCWRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKwkJCQkJfSl9CisJCQkJCWFjdGlvblJlZj17YWN0aW9uUmVmfQorCQkJCQlyb3dLZXk9InVzZXJJZCIKKwkJCQkJa2V5PSJ1c2VyTGlzdCIKKwkJCQkJc2VhcmNoPXt7CisJCQkJCQlsYWJlbFdpZHRoOiAxMjAsCisJCQkJCX19CisJCQkJCXRvb2xCYXJSZW5kZXI9eygpID0+IFsKKwkJCQkJCTxCdXR0b24KKwkJCQkJCQl0eXBlPSJwcmltYXJ5IgorCQkJCQkJCWtleT0iYWRkIgorCQkJCQkJCWhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnJvbGU6YWRkJyl9CisJCQkJCQkJb25DbGljaz17YXN5bmMgKCkgPT4geworCQkJCQkJCQlzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisJCQkJCQkJfX0KKwkJCQkJCT4KKwkJCQkJCQk8UGx1c091dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ucm9sZS5hdXRoLmFkZFVzZXIiIGRlZmF1bHRNZXNzYWdlPSLmt7vliqDnlKjmiLciIC8+CisJCQkJCQk8L0J1dHRvbj4sCisJCQkJCQk8QnV0dG9uCisJCQkJCQkJdHlwZT0icHJpbWFyeSIKKwkJCQkJCQlrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisJCQkJCQkJaGlkZGVuPXtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA9PT0gMCB8fCAhYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06cm9sZTpyZW1vdmUnKX0KKwkJCQkJCQlvbkNsaWNrPXthc3luYyAoKSA9PiB7CisJCQkJCQkJCU1vZGFsLmNvbmZpcm0oeworCQkJCQkJCQkJdGl0bGU6ICfmmK/lkKbnoa7orqTliKDpmaTmiYDpgInmlbDmja7pobk/JywKKwkJCQkJCQkJCWljb246IDxFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIC8+LAorCQkJCQkJCQkJY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisJCQkJCQkJCQlhc3luYyBvbk9rKCkgeworCQkJCQkJCQkJCWNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBjYW5jZWxBdXRoVXNlckFsbChyb2xlSWQsIHNlbGVjdGVkUm93cyk7CisJCQkJCQkJCQkJaWYgKHN1Y2Nlc3MpIHsKKwkJCQkJCQkJCQkJc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKwkJCQkJCQkJCQkJYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0sCisJCQkJCQkJCQlvbkNhbmNlbCgpIHsgfSwKKwkJCQkJCQkJfSk7CisJCQkJCQkJfX0KKwkJCQkJCT4KKwkJCQkJCQk8RGVsZXRlT3V0bGluZWQgLz4KKwkJCQkJCQk8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnJvbGUuYXV0aC5jYW5jZWxBbGwiIGRlZmF1bHRNZXNzYWdlPSLmibnph4/lj5bmtojmjojmnYMiIC8+CisJCQkJCQk8L0J1dHRvbj4sCisJCQkJCQk8QnV0dG9uCisJCQkJCQkJdHlwZT0icHJpbWFyeSIKKwkJCQkJCQlrZXk9ImJhY2siCisJCQkJCQkJb25DbGljaz17YXN5bmMgKCkgPT4geworCQkJCQkJCQloaXN0b3J5LmJhY2soKTsKKwkJCQkJCQl9fQorCQkJCQkJPgorCQkJCQkJCTxSb2xsYmFja091dGxpbmVkIC8+CisJCQkJCQkJPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLmdvYmFjayIgZGVmYXVsdE1lc3NhZ2U9Iui/lOWbniIgLz4KKwkJCQkJCTwvQnV0dG9uPiwKKwkJCQkJXX0KKwkJCQkJcmVxdWVzdD17KHBhcmFtcykgPT4KKwkJCQkJCWFsbG9jYXRlZFVzZXJMaXN0KHsgLi4ucGFyYW1zLCByb2xlSWQgfSBhcyBBUEkuU3lzdGVtLlJvbGVMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKwkJCQkJCQljb25zdCByZXN1bHQgPSB7CisJCQkJCQkJCWRhdGE6IHJlcy5yb3dzLAorCQkJCQkJCQl0b3RhbDogcmVzLnRvdGFsLAorCQkJCQkJCQlzdWNjZXNzOiB0cnVlLAorCQkJCQkJCX07CisJCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJCX0pCisJCQkJCX0KKwkJCQkJY29sdW1ucz17Y29sdW1uc30KKwkJCQkJcm93U2VsZWN0aW9uPXt7CisJCQkJCQlvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworCQkJCQkJCXNldFNlbGVjdGVkUm93cyhzZWxlY3RlZFJvd3MpOworCQkJCQkJfSwKKwkJCQkJfX0KKwkJCQkvPgorCQkJPC9kaXY+CisJCQk8VXNlclNlbGVjdG9yTW9kYWwKKwkJCQlvcGVuPXttb2RhbFZpc2libGV9CisJCQkJb25TdWJtaXQ9eyh2YWx1ZXM6IFJlYWN0LktleVtdKSA9PiB7CisJCQkJCWNvbnN0IHVzZXJJZHMgPSB2YWx1ZXMuam9pbigiLCIpOworCQkJCQlpZiAodXNlcklkcyA9PT0gIiIpIHsKKwkJCQkJCW1lc3NhZ2Uud2FybmluZygi6K+36YCJ5oup6KaB5YiG6YWN55qE55So5oi3Iik7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJYXV0aFVzZXJTZWxlY3RBbGwoeyByb2xlSWQ6IHJvbGVJZCwgdXNlcklkczogdXNlcklkcyB9KS50aGVuKHJlc3AgPT4geworCQkJCQkJaWYgKHJlc3AuY29kZSA9PT0gSHR0cFJlc3VsdC5TVUNDRVNTKSB7CisJCQkJCQkJbWVzc2FnZS5zdWNjZXNzKCfmm7TmlrDmiJDlip/vvIEnKTsKKwkJCQkJCQlpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKwkJCQkJCQkJYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQltZXNzYWdlLndhcm5pbmcocmVzcC5tc2cpOworCQkJCQkJfQorCQkJCQl9KQorCQkJCQlzZXRNb2RhbFZpc2libGUoZmFsc2UpOworCQkJCX19CisJCQkJb25DYW5jZWw9eygpID0+IHsKKwkJCQkJc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKwkJCQl9fQorCQkJCXBhcmFtcz17e3JvbGVJZH19CisJCQkJcmVxdWVzdD17KHBhcmFtcykgPT4KKwkJCQkJdW5hbGxvY2F0ZWRVc2VyTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEFQSS5TeXN0ZW0uUm9sZUxpc3RQYXJhbXMpLnRoZW4oKHJlcykgPT4geworCQkJCQkJY29uc3QgcmVzdWx0ID0geworCQkJCQkJCWRhdGE6IHJlcy5yb3dzLAorCQkJCQkJCXRvdGFsOiByZXMucm93cy5sZW5ndGgsCisJCQkJCQkJc3VjY2VzczogdHJ1ZSwKKwkJCQkJCX07CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9KQorCQkJCX0KKwkJCS8+CisJCTwvUGFnZUNvbnRhaW5lcj4KKwkpOworfTsKKworZXhwb3J0IGRlZmF1bHQgQXV0aFVzZXJUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1JvbGUvY29tcG9uZW50cy9EYXRhU2NvcGUudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2NvbXBvbmVudHMvRGF0YVNjb3BlLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RjY2UwCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2NvbXBvbmVudHMvRGF0YVNjb3BlLnRzeApAQCAtMCwwICsxLDIzMyBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBDaGVja2JveCwgQ29sLCBGb3JtLCBNb2RhbCwgUm93LCBUcmVlIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlLCB1c2VJbnRsIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBLZXksIFByb0Zvcm0sIFByb0Zvcm1EaWdpdCwgUHJvRm9ybVNlbGVjdCwgUHJvRm9ybVRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBEYXRhTm9kZSB9IGZyb20gJ2FudGQvZXMvdHJlZSc7CitpbXBvcnQgeyBDaGVja2JveFZhbHVlVHlwZSB9IGZyb20gJ2FudGQvZXMvY2hlY2tib3gvR3JvdXAnOworCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjMvMDIvMDYKKyAqIAorICogKi8KKworZXhwb3J0IHR5cGUgRm9ybVZhbHVlVHlwZSA9IGFueSAmIFBhcnRpYWw8QVBJLlN5c3RlbS5EZXB0PjsKKworZXhwb3J0IHR5cGUgRGF0YVNjb3BlRm9ybVByb3BzID0geworICAgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogRm9ybVZhbHVlVHlwZSkgPT4gdm9pZDsKKyAgICBvblN1Ym1pdDogKHZhbHVlczogRm9ybVZhbHVlVHlwZSkgPT4gUHJvbWlzZTx2b2lkPjsKKyAgICBvcGVuOiBib29sZWFuOworICAgIHZhbHVlczogUGFydGlhbDxBUEkuU3lzdGVtLlJvbGU+OworICAgIGRlcHRUcmVlOiBEYXRhTm9kZVtdOworICAgIGRlcHRDaGVja2VkS2V5czogc3RyaW5nW107Cit9OworCitjb25zdCBEYXRhU2NvcGVGb3JtOiBSZWFjdC5GQzxEYXRhU2NvcGVGb3JtUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgICAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisKKyAgICBjb25zdCB7IGRlcHRUcmVlLCBkZXB0Q2hlY2tlZEtleXMgfSA9IHByb3BzOworICAgIGNvbnN0IFtkYXRhU2NvcGVUeXBlLCBzZXREYXRhU2NvcGVUeXBlXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oJzEnKTsKKyAgICBjb25zdCBbZGVwdElkcywgc2V0RGVwdElkc10gPSB1c2VTdGF0ZTxzdHJpbmdbXSB8IHtjaGVja2VkOiBzdHJpbmdbXSwgaGFsZkNoZWNrZWQ6IHN0cmluZ1tdfT4oW10pOworICAgIGNvbnN0IFtkZXB0VHJlZUV4cGFuZEtleSwgc2V0RGVwdFRyZWVFeHBhbmRLZXldID0gdXNlU3RhdGU8S2V5W10+KFtdKTsKKyAgICBjb25zdCBbY2hlY2tTdHJpY3RseSwgc2V0Q2hlY2tTdHJpY3RseV0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTsKKworCisgICAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICAgICAgc2V0RGVwdElkcyhkZXB0Q2hlY2tlZEtleXMpOworICAgICAgICBmb3JtLnJlc2V0RmllbGRzKCk7CisgICAgICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworICAgICAgICAgICAgcm9sZUlkOiBwcm9wcy52YWx1ZXMucm9sZUlkLAorICAgICAgICAgICAgcm9sZU5hbWU6IHByb3BzLnZhbHVlcy5yb2xlTmFtZSwKKyAgICAgICAgICAgIHJvbGVLZXk6IHByb3BzLnZhbHVlcy5yb2xlS2V5LAorICAgICAgICAgICAgZGF0YVNjb3BlOiBwcm9wcy52YWx1ZXMuZGF0YVNjb3BlLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0RGF0YVNjb3BlVHlwZShwcm9wcy52YWx1ZXMuZGF0YVNjb3BlKTsKKyAgICB9LCBbcHJvcHMudmFsdWVzXSk7CisKKyAgICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICAgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgICAgICBmb3JtLnN1Ym1pdCgpOworICAgIH07CisgICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgICAgICBwcm9wcy5vbkNhbmNlbCgpOworICAgIH07CisgICAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgICAgICBwcm9wcy5vblN1Ym1pdCh7IC4uLnZhbHVlcywgZGVwdElkcyB9IGFzIEZvcm1WYWx1ZVR5cGUpOworICAgIH07CisKKyAgICBjb25zdCBnZXRBbGxEZXB0Tm9kZSA9IChub2RlOiBEYXRhTm9kZVtdKSA9PiB7CisgICAgICAgIGxldCBrZXlzOiBhbnlbXSA9IFtdOworICAgICAgICBub2RlLmZvckVhY2godmFsdWUgPT4geworICAgICAgICAgICAga2V5cy5wdXNoKHZhbHVlLmtleSk7CisgICAgICAgICAgICBpZih2YWx1ZS5jaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRBbGxEZXB0Tm9kZSh2YWx1ZS5jaGlsZHJlbikpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGtleXM7CisgICAgfQorCisgICAgY29uc3QgZGVwdEFsbE5vZGVzID0gZ2V0QWxsRGVwdE5vZGUoZGVwdFRyZWUpOworCisKKyAgICBjb25zdCBvbkRlcHRPcHRpb25DaGFuZ2UgPSAoY2hlY2tlZFZhbHVlczogQ2hlY2tib3hWYWx1ZVR5cGVbXSkgPT4geworICAgICAgICBpZihjaGVja2VkVmFsdWVzLmluY2x1ZGVzKCdkZXB0RXhwYW5kJykpIHsKKyAgICAgICAgICAgIHNldERlcHRUcmVlRXhwYW5kS2V5KGRlcHRBbGxOb2Rlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXREZXB0VHJlZUV4cGFuZEtleShbXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoY2hlY2tlZFZhbHVlcy5pbmNsdWRlcygnZGVwdE5vZGVBbGwnKSkgeworICAgICAgICAgICAgc2V0RGVwdElkcyhkZXB0QWxsTm9kZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RGVwdElkcyhbXSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKGNoZWNrZWRWYWx1ZXMuaW5jbHVkZXMoJ2RlcHRDaGVja1N0cmljdGx5JykpIHsKKyAgICAgICAgICAgIHNldENoZWNrU3RyaWN0bHkoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0Q2hlY2tTdHJpY3RseSh0cnVlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gKAorICAgICAgICA8TW9kYWwKKyAgICAgICAgICAgIHdpZHRoPXs2NDB9CisgICAgICAgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLmF1dGgucm9sZScsCisgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfliIbphY3op5LoibInLAorICAgICAgICAgICAgfSl9CisgICAgICAgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgICAgICAgIGZvcmNlUmVuZGVyCisgICAgICAgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgICAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgICAgID4KKyAgICAgICAgICAgIDxQcm9Gb3JtCisgICAgICAgICAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgICAgICAgICBncmlkPXt0cnVlfQorICAgICAgICAgICAgICAgIGxheW91dD0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofQorICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZXM9e3sKKyAgICAgICAgICAgICAgICAgICAgbG9naW5fcGFzc3dvcmQ6ICcnLAorICAgICAgICAgICAgICAgICAgICBjb25maXJtX3Bhc3N3b3JkOiAnJywKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorCisgICAgICAgICAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJyb2xlSWQiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucm9sZS5yb2xlX2lkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6Imy57yW5Y+3JywKKyAgICAgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXop5LoibLnvJblj7ciCisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgIGhpZGRlbj17dHJ1ZX0KKyAgICAgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeinkuiJsue8luWPt++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeinkuiJsue8luWPt++8gSIgLz4sCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgICAgIG5hbWU9InJvbGVOYW1lIgorICAgICAgICAgICAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc3lzdGVtLnJvbGUucm9sZV9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6Imy5ZCN56ewJywKKyAgICAgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXop5LoibLlkI3np7AiCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeinkuiJsuWQjeensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeinkuiJsuWQjeensO+8gSIgLz4sCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgICAgIG5hbWU9InJvbGVLZXkiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucm9sZS5yb2xlX2tleScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+adg+mZkOWtl+espuS4sicsCisgICAgICAgICAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6KeS6Imy5p2D6ZmQ5a2X56ym5LiyIgorICAgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXop5LoibLmnYPpmZDlrZfnrKbkuLLvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXop5LoibLmnYPpmZDlrZfnrKbkuLLvvIEiIC8+LAorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxQcm9Gb3JtU2VsZWN0CisgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTY29wZSIKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9J+adg+mZkOiMg+WbtCcKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlPXsnMSd9CisgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXnlKjmiLfmgKfliKsiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlRW51bT17eworICAgICAgICAgICAgICAgICAgICAgICAgIjEiOiAi5YWo6YOo5pWw5o2u5p2D6ZmQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIyIjogIuiHquWumuaVsOaNruadg+mZkCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiMyI6ICLmnKzpg6jpl6jmlbDmja7mnYPpmZAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAi5pys6YOo6Zeo5Y+K5Lul5LiL5pWw5o2u5p2D6ZmQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICI1IjogIuS7heacrOS6uuaVsOaNruadg+mZkCIKKyAgICAgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAgICAgICAgIGZpZWxkUHJvcHM9e3sKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhU2NvcGVUeXBlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8UHJvRm9ybS5JdGVtCisgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlcHRJZHMiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucm9sZS5hdXRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6I+c5Y2V5p2D6ZmQJywKKyAgICAgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPXtkYXRhU2NvcGVUeXBlID09PSAnMSd9CisgICAgICAgICAgICAgICAgICAgIGhpZGRlbj17ZGF0YVNjb3BlVHlwZSAhPT0gJzEnfQorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxDb2wgbWQ9ezI0fT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3guR3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17WworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ+WxleW8gC/mipjlj6AnLCB2YWx1ZTogJ2RlcHRFeHBhbmQnIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAn5YWo6YCJL+WFqOS4jemAiScsIHZhbHVlOiAnZGVwdE5vZGVBbGwnIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7IGxhYmVsOiAn54i25a2Q6IGU5YqoJywgdmFsdWU6ICdkZXB0Q2hlY2tTdHJpY3RseScgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uRGVwdE9wdGlvbkNoYW5nZX0gLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICAgICAgICAgICAgPENvbCBtZD17MjR9PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUcmVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYWJsZT17dHJ1ZX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdHJpY3RseT17Y2hlY2tTdHJpY3RseX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRLZXlzPXtkZXB0VHJlZUV4cGFuZEtleX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZURhdGE9e2RlcHRUcmVlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkS2V5cz17ZGVwdElkc30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWRLZXlzPXtkZXB0Q2hlY2tlZEtleXN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2s9eyhjaGVja2VkS2V5czogYW55LCBjaGVja0luZm86IGFueSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hlY2tlZEtleXMsIGNoZWNrSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjaGVja1N0cmljdGx5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldERlcHRJZHMoY2hlY2tlZEtleXMuY2hlY2tlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXREZXB0SWRzKHtjaGVja2VkOiBjaGVja2VkS2V5cywgaGFsZkNoZWNrZWQ6IGNoZWNrSW5mby5oYWxmQ2hlY2tlZEtleXN9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FeHBhbmQ9eyhleHBhbmRlZEtleXM6IEtleVtdKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXB0VHJlZUV4cGFuZEtleShkZXB0VHJlZUV4cGFuZEtleS5jb25jYXQoZXhwYW5kZWRLZXlzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICAgICAgICA8L1Jvdz4KKyAgICAgICAgICAgICAgICA8L1Byb0Zvcm0uSXRlbT4KKyAgICAgICAgICAgIDwvUHJvRm9ybT4KKyAgICAgICAgPC9Nb2RhbD4KKyAgICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgRGF0YVNjb3BlRm9ybTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vUm9sZS9jb21wb25lbnRzL1VzZXJTZWxlY3Rvck1vZGFsLnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vUm9sZS9jb21wb25lbnRzL1VzZXJTZWxlY3Rvck1vZGFsLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNmYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2NvbXBvbmVudHMvVXNlclNlbGVjdG9yTW9kYWwudHN4CkBAIC0wLDAgKzEsMTI1IEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIFBhcmFtc1R5cGUsIFByb0NvbHVtbnMsIFByb1RhYmxlLCBSZXF1ZXN0RGF0YSB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCBEaWN0VGFnIGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjMvMDIvMTAKKyAqIAorICogKi8KKworZXhwb3J0IHR5cGUgRGF0YVNjb3BlRm9ybVByb3BzID0geworICBvbkNhbmNlbDogKCkgPT4gdm9pZDsKKyAgb25TdWJtaXQ6ICh2YWx1ZXM6IFJlYWN0LktleVtdKSA9PiB2b2lkOworICBvcGVuOiBib29sZWFuOworICBwYXJhbXM6IFBhcmFtc1R5cGU7CisgIHJlcXVlc3Q/OiAocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPFBhcnRpYWw8UmVxdWVzdERhdGE8QVBJLlN5c3RlbS5Vc2VyPj4+OworfTsKKworY29uc3QgVXNlclNlbGVjdG9yTW9kYWw6IFJlYWN0LkZDPERhdGFTY29wZUZvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbc2VsZWN0ZWRSb3dLZXlzLCBzZXRTZWxlY3RlZFJvd0tleXNdID0gdXNlU3RhdGU8UmVhY3QuS2V5W10+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfbm9ybWFsX2Rpc2FibGUnKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXRTdGF0dXNPcHRpb25zKGRhdGEpOworICAgIH0pOworICB9LCBbcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBwcm9wcy5vblN1Ym1pdChzZWxlY3RlZFJvd0tleXMpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgfTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5TeXN0ZW0uVXNlcj5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnVzZXJfaWQiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfnvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAndXNlcklkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0udXNlci51c2VyX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLnlKjmiLfotKblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAndXNlck5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLm5pY2tfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IueUqOaIt+aYteensCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICduaWNrTmFtZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnVzZXIucGhvbmVudW1iZXIiIGRlZmF1bHRNZXNzYWdlPSLmiYvmnLrlj7fnoIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAncGhvbmVudW1iZXInLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnN0YXR1cyIgZGVmYXVsdE1lc3NhZ2U9IuW4kOWPt+eKtuaAgSIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdzdGF0dXMnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICAgIHZhbHVlRW51bTogc3RhdHVzT3B0aW9ucywKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gKDxEaWN0VGFnIGVudW1zPXtzdGF0dXNPcHRpb25zfSB2YWx1ZT17cmVjb3JkLnN0YXR1c30gLz4pOworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnVzZXIuY3JlYXRlX3RpbWUiIGRlZmF1bHRNZXNzYWdlPSLliJvlu7rml7bpl7QiIC8+LAorICAgICAgZGF0YUluZGV4OiAnY3JlYXRlVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICdkYXRlUmFuZ2UnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoPHNwYW4+e3JlY29yZC5jcmVhdGVUaW1lLnRvU3RyaW5nKCl9IDwvc3Bhbj4pOworICAgICAgfSwKKyAgICB9CisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs4MDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0ucm9sZS5hdXRoLnVzZXInLAorICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+mAieaLqeeUqOaItycsCisgICAgICB9KX0KKyAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgb25Paz17aGFuZGxlT2t9CisgICAgICBvbkNhbmNlbD17aGFuZGxlQ2FuY2VsfQorICAgID4KKyAgICAgIDxQcm9UYWJsZTxBUEkuU3lzdGVtLlVzZXI+CisgICAgICAgIGhlYWRlclRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgIGlkOiAncGFnZXMuc2VhcmNoVGFibGUudGl0bGUnLAorICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgfSl9CisgICAgICAgIGFjdGlvblJlZj17YWN0aW9uUmVmfQorICAgICAgICByb3dLZXk9InVzZXJJZCIKKyAgICAgICAga2V5PSJ1c2VyTGlzdCIKKyAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICB9fQorICAgICAgICB0b29sYmFyPXt7fX0KKyAgICAgICAgcGFyYW1zPXtwcm9wcy5wYXJhbXN9CisgICAgICAgIHJlcXVlc3Q9e3Byb3BzLnJlcXVlc3R9CisgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgIHJvd1NlbGVjdGlvbj17eworICAgICAgICAgIG9uQ2hhbmdlOiAoc2VsZWN0ZWRSb3dLZXlzOiBSZWFjdC5LZXlbXSkgPT4geworICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dLZXlzKHNlbGVjdGVkUm93S2V5cyk7CisgICAgICAgICAgfSwKKyAgICAgICAgfX0KKyAgICAgIC8+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFVzZXJTZWxlY3Rvck1vZGFsOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2VkaXQudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2VkaXQudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDQ5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1JvbGUvZWRpdC50c3gKQEAgLTAsMCArMSwxOTkgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsKKyAgUHJvRm9ybSwKKyAgUHJvRm9ybURpZ2l0LAorICBQcm9Gb3JtVGV4dCwKKyAgUHJvRm9ybVJhZGlvLAorICBQcm9Gb3JtVGV4dEFyZWEsCit9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IEZvcm0sIE1vZGFsIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyB1c2VJbnRsLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgVHJlZSwgeyBEYXRhTm9kZSB9IGZyb20gJ2FudGQvZXMvdHJlZSc7CitpbXBvcnQgeyBEaWN0VmFsdWVFbnVtT2JqIH0gZnJvbSAnQC9jb21wb25lbnRzL0RpY3RUYWcnOworCitleHBvcnQgdHlwZSBSb2xlRm9ybURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFBhcnRpYWw8QVBJLlN5c3RlbS5Sb2xlPjsKKworZXhwb3J0IHR5cGUgUm9sZUZvcm1Qcm9wcyA9IHsKKyAgb25DYW5jZWw6IChmbGFnPzogYm9vbGVhbiwgZm9ybVZhbHM/OiBSb2xlRm9ybURhdGEpID0+IHZvaWQ7CisgIG9uU3VibWl0OiAodmFsdWVzOiBSb2xlRm9ybURhdGEpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuU3lzdGVtLlJvbGU+OworICBtZW51VHJlZTogRGF0YU5vZGVbXTsKKyAgbWVudUNoZWNrZWRLZXlzOiBzdHJpbmdbXTsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKK307CisKK2NvbnN0IFJvbGVGb3JtOiBSZWFjdC5GQzxSb2xlRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgY29uc3QgeyBtZW51VHJlZSwgbWVudUNoZWNrZWRLZXlzIH0gPSBwcm9wczsKKyAgY29uc3QgW21lbnVJZHMsIHNldE1lbnVJZHNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTsKKyAgY29uc3QgeyBzdGF0dXNPcHRpb25zIH0gPSBwcm9wczsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGZvcm0ucmVzZXRGaWVsZHMoKTsKKyAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKyAgICAgIHJvbGVJZDogcHJvcHMudmFsdWVzLnJvbGVJZCwKKyAgICAgIHJvbGVOYW1lOiBwcm9wcy52YWx1ZXMucm9sZU5hbWUsCisgICAgICByb2xlS2V5OiBwcm9wcy52YWx1ZXMucm9sZUtleSwKKyAgICAgIHJvbGVTb3J0OiBwcm9wcy52YWx1ZXMucm9sZVNvcnQsCisgICAgICBkYXRhU2NvcGU6IHByb3BzLnZhbHVlcy5kYXRhU2NvcGUsCisgICAgICBtZW51Q2hlY2tTdHJpY3RseTogcHJvcHMudmFsdWVzLm1lbnVDaGVja1N0cmljdGx5LAorICAgICAgZGVwdENoZWNrU3RyaWN0bHk6IHByb3BzLnZhbHVlcy5kZXB0Q2hlY2tTdHJpY3RseSwKKyAgICAgIHN0YXR1czogcHJvcHMudmFsdWVzLnN0YXR1cywKKyAgICAgIGRlbEZsYWc6IHByb3BzLnZhbHVlcy5kZWxGbGFnLAorICAgICAgY3JlYXRlQnk6IHByb3BzLnZhbHVlcy5jcmVhdGVCeSwKKyAgICAgIGNyZWF0ZVRpbWU6IHByb3BzLnZhbHVlcy5jcmVhdGVUaW1lLAorICAgICAgdXBkYXRlQnk6IHByb3BzLnZhbHVlcy51cGRhdGVCeSwKKyAgICAgIHVwZGF0ZVRpbWU6IHByb3BzLnZhbHVlcy51cGRhdGVUaW1lLAorICAgICAgcmVtYXJrOiBwcm9wcy52YWx1ZXMucmVtYXJrLAorICAgIH0pOworICB9LCBbZm9ybSwgcHJvcHNdKTsKKworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICBjb25zdCBoYW5kbGVPayA9ICgpID0+IHsKKyAgICBmb3JtLnN1Ym1pdCgpOworICB9OworICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7CisgICAgcHJvcHMub25DYW5jZWwoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgIHByb3BzLm9uU3VibWl0KHsgLi4udmFsdWVzLCBtZW51SWRzIH0gYXMgUm9sZUZvcm1EYXRhKTsKKyAgfTsKKworICByZXR1cm4gKAorICAgIDxNb2RhbAorICAgICAgd2lkdGg9ezY0MH0KKyAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogJ3N5c3RlbS5yb2xlLnRpdGxlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnvJbovpHop5LoibLkv6Hmga8nLAorICAgICAgfSl9CisgICAgICBmb3JjZVJlbmRlcgorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGRlc3Ryb3lPbkNsb3NlCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorICAgICAgPFByb0Zvcm0KKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICBzdWJtaXR0ZXI9e2ZhbHNlfQorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1EaWdpdAorICAgICAgICAgIG5hbWU9InJvbGVJZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLnJvbGUucm9sZV9pZCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+inkuiJsue8luWPtycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeinkuiJsue8luWPtyIKKyAgICAgICAgICBkaXNhYmxlZAorICAgICAgICAgIGhpZGRlbj17dHJ1ZX0KKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXop5LoibLnvJblj7fvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXop5LoibLnvJblj7fvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICBuYW1lPSJyb2xlTmFtZSIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLnJvbGUucm9sZV9uYW1lJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6Imy5ZCN56ewJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6KeS6Imy5ZCN56ewIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6KeS6Imy5ZCN56ew77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6KeS6Imy5ZCN56ew77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0icm9sZUtleSIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLnJvbGUucm9sZV9rZXknLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfmnYPpmZDlrZfnrKbkuLInLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXop5LoibLmnYPpmZDlrZfnrKbkuLIiCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXop5LoibLmnYPpmZDlrZfnrKbkuLLvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXop5LoibLmnYPpmZDlrZfnrKbkuLLvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybURpZ2l0CisgICAgICAgICAgbmFtZT0icm9sZVNvcnQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5yb2xlLnJvbGVfc29ydCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aYvuekuumhuuW6jycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeaYvuekuumhuuW6jyIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaYvuekuumhuuW6j++8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgICAgZmllbGRQcm9wcyA9IHt7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDEKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVJhZGlvLkdyb3VwCisgICAgICAgICAgdmFsdWVFbnVtPXtzdGF0dXNPcHRpb25zfQorICAgICAgICAgIG5hbWU9InN0YXR1cyIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLnJvbGUuc3RhdHVzJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6Imy54q25oCBJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6KeS6Imy54q25oCBIgorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl6KeS6Imy54q25oCB77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6KeS6Imy54q25oCB77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgICBmaWVsZFByb3BzID0ge3sKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogIjAiCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm0uSXRlbQorICAgICAgICAgIG5hbWU9Im1lbnVJZHMiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS5yb2xlLmF1dGgnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfoj5zljZXmnYPpmZAnLAorICAgICAgICAgIH0pfQorICAgICAgICA+CisgICAgICAgICAgPFRyZWUKKyAgICAgICAgICAgIGNoZWNrYWJsZT17dHJ1ZX0KKyAgICAgICAgICAgIG11bHRpcGxlPXt0cnVlfQorICAgICAgICAgICAgY2hlY2tTdHJpY3RseT17dHJ1ZX0KKyAgICAgICAgICAgIGRlZmF1bHRFeHBhbmRBbGw9e2ZhbHNlfQorICAgICAgICAgICAgdHJlZURhdGE9e21lbnVUcmVlfQorICAgICAgICAgICAgZGVmYXVsdENoZWNrZWRLZXlzPXttZW51Q2hlY2tlZEtleXN9CisgICAgICAgICAgICBvbkNoZWNrPXsoY2hlY2tlZEtleXM6IGFueSkgPT4geyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcmV0dXJuIHNldE1lbnVJZHMoY2hlY2tlZEtleXMuY2hlY2tlZCk7CisgICAgICAgICAgICB9fQorICAgICAgICAgIC8+CisgICAgICAgIDwvUHJvRm9ybS5JdGVtPgorICAgICAgICA8UHJvRm9ybVRleHRBcmVhCisgICAgICAgICAgbmFtZT0icmVtYXJrIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0ucm9sZS5yZW1hcmsnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflpIfms6gnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlpIfms6giCisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5aSH5rOo77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5aSH5rOo77yBIiAvPiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgUm9sZUZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1JvbGUvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTE1YjJlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Sb2xlL2luZGV4LnRzeApAQCAtMCwwICsxLDUxMyBAQAorCitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzLCBoaXN0b3J5IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBEYXRhTm9kZSB9IGZyb20gJ2FudGQvZXMvdHJlZSc7CitpbXBvcnQgeyBCdXR0b24sIG1lc3NhZ2UsIE1vZGFsLCBEcm9wZG93biwgRm9ybUluc3RhbmNlLCBTcGFjZSwgU3dpdGNoIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBBY3Rpb25UeXBlLCBGb290ZXJUb29sYmFyLCBQYWdlQ29udGFpbmVyLCBQcm9Db2x1bW5zLCBQcm9UYWJsZSB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKK2ltcG9ydCB7IFBsdXNPdXRsaW5lZCwgRWRpdE91dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCwgRG93bk91dGxpbmVkIH0gZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IHsgZ2V0Um9sZUxpc3QsIHJlbW92ZVJvbGUsIGFkZFJvbGUsIHVwZGF0ZVJvbGUsIGV4cG9ydFJvbGUsIGdldFJvbGVNZW51TGlzdCwgY2hhbmdlUm9sZVN0YXR1cywgdXBkYXRlUm9sZURhdGFTY29wZSwgZ2V0RGVwdFRyZWVTZWxlY3QsIGdldFJvbGUgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9yb2xlJzsKK2ltcG9ydCBVcGRhdGVGb3JtIGZyb20gJy4vZWRpdCc7CitpbXBvcnQgeyBnZXREaWN0VmFsdWVFbnVtIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgeyBmb3JtYXRUcmVlRGF0YSB9IGZyb20gJ0AvdXRpbHMvdHJlZSc7CitpbXBvcnQgeyBnZXRNZW51VHJlZSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL21lbnUnOworaW1wb3J0IERhdGFTY29wZUZvcm0gZnJvbSAnLi9jb21wb25lbnRzL0RhdGFTY29wZSc7CisKK2NvbnN0IHsgY29uZmlybSB9ID0gTW9kYWw7CisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLlJvbGUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5re75YqgJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFkZFJvbGUoeyAuLi5maWVsZHMgfSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfmt7vliqDmiJDlip8nKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfmt7vliqDlpLHotKXor7fph43or5XvvIEnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5pu05paw6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVVcGRhdGUgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLlJvbGUpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5pu05pawJyk7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHVwZGF0ZVJvbGUoZmllbGRzKTsKKyAgICBoaWRlKCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+abtOaWsOaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLmVycm9yKHJlc3AubXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+mFjee9ruWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGhhbmRsZVJlbW92ZSA9IGFzeW5jIChzZWxlY3RlZFJvd3M6IEFQSS5TeXN0ZW0uUm9sZVtdKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOWIoOmZpCcpOworICBpZiAoIXNlbGVjdGVkUm93cykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZVJvbGUoc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cucm9sZUlkKS5qb2luKCcsJykpOworICAgIGhpZGUoKTsKKyAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZXJyb3IocmVzcC5tc2cpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjb25zdCBoYW5kbGVSZW1vdmVPbmUgPSBhc3luYyAoc2VsZWN0ZWRSb3c6IEFQSS5TeXN0ZW0uUm9sZSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LnJvbGVJZF07CisgICAgY29uc3QgcmVzcCA9IGF3YWl0IHJlbW92ZVJvbGUocGFyYW1zLmpvaW4oJywnKSk7CisgICAgaGlkZSgpOworICAgIGlmIChyZXNwLmNvZGUgPT09IDIwMCkgeworICAgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZS5lcnJvcihyZXNwLm1zZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKgorICog5a+85Ye65pWw5o2uCisgKgorICoKKyAqLworY29uc3QgaGFuZGxlRXhwb3J0ID0gYXN5bmMgKCkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjlr7zlh7onKTsKKyAgdHJ5IHsKKyAgICBhd2FpdCBleHBvcnRSb2xlKCk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WvvOWHuuWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCitjb25zdCBSb2xlVGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKworICBjb25zdCBbbWVzc2FnZUFwaSwgY29udGV4dEhvbGRlcl0gPSBtZXNzYWdlLnVzZU1lc3NhZ2UoKTsKKyAgY29uc3QgZm9ybVRhYmxlUmVmID0gdXNlUmVmPEZvcm1JbnN0YW5jZT4oKTsKKworICBjb25zdCBbbW9kYWxWaXNpYmxlLCBzZXRNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworICBjb25zdCBbZGF0YVNjb3BlTW9kYWxPcGVuLCBzZXREYXRhU2NvcGVNb2RhbE9wZW5dID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLlJvbGU+KCk7CisgIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxBUEkuU3lzdGVtLlJvbGVbXT4oW10pOworCisgIGNvbnN0IFttZW51VHJlZSwgc2V0TWVudVRyZWVdID0gdXNlU3RhdGU8RGF0YU5vZGVbXT4oKTsKKyAgY29uc3QgW21lbnVJZHMsIHNldE1lbnVJZHNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTsKKyAgY29uc3QgW3N0YXR1c09wdGlvbnMsIHNldFN0YXR1c09wdGlvbnNdID0gdXNlU3RhdGU8YW55PihbXSk7CisKKyAgY29uc3QgYWNjZXNzID0gdXNlQWNjZXNzKCk7CisKKyAgLyoqIOWbvemZheWMlumFjee9riAqLworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZ2V0RGljdFZhbHVlRW51bSgnc3lzX25vcm1hbF9kaXNhYmxlJykudGhlbigoZGF0YSkgPT4geworICAgICAgc2V0U3RhdHVzT3B0aW9ucyhkYXRhKTsKKyAgICB9KTsKKyAgfSwgW10pOworCisgIGNvbnN0IHNob3dDaGFuZ2VTdGF0dXNDb25maXJtID0gKHJlY29yZDogQVBJLlN5c3RlbS5Sb2xlKSA9PiB7CisgICAgbGV0IHRleHQgPSByZWNvcmQuc3RhdHVzID09PSAiMSIgPyAi5ZCv55SoIiA6ICLlgZznlKgiOworICAgIGNvbnN0IG5ld1N0YXR1cyA9IHJlY29yZC5zdGF0dXMgPT09ICcwJyA/ICcxJyA6ICcwJzsKKyAgICBjb25maXJtKHsKKyAgICAgIHRpdGxlOiBg56Gu6K6k6KaBJHt0ZXh0fSR7cmVjb3JkLnJvbGVOYW1lfeinkuiJsuWQl++8n2AsCisgICAgICBvbk9rKCkgeworICAgICAgICBjaGFuZ2VSb2xlU3RhdHVzKHJlY29yZC5yb2xlSWQsIG5ld1N0YXR1cykudGhlbihyZXNwID0+IHsKKyAgICAgICAgICBpZiAocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgICAgICAgIG1lc3NhZ2VBcGkub3Blbih7CisgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+abtOaWsOaIkOWKn++8gScsCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZUFwaS5vcGVuKHsKKyAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+abtOaWsOWksei0pe+8gScsCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfSwKKyAgICB9KTsKKyAgfTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEFQSS5TeXN0ZW0uUm9sZT5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5yb2xlLnJvbGVfaWQiIGRlZmF1bHRNZXNzYWdlPSLop5LoibLnvJblj7ciIC8+LAorICAgICAgZGF0YUluZGV4OiAncm9sZUlkJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ucm9sZS5yb2xlX25hbWUiIGRlZmF1bHRNZXNzYWdlPSLop5LoibLlkI3np7AiIC8+LAorICAgICAgZGF0YUluZGV4OiAncm9sZU5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5yb2xlLnJvbGVfa2V5IiBkZWZhdWx0TWVzc2FnZT0i6KeS6Imy5p2D6ZmQ5a2X56ym5LiyIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3JvbGVLZXknLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS5yb2xlLnJvbGVfc29ydCIgZGVmYXVsdE1lc3NhZ2U9IuaYvuekuumhuuW6jyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdyb2xlU29ydCcsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnJvbGUuc3RhdHVzIiBkZWZhdWx0TWVzc2FnZT0i6KeS6Imy54q25oCBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3N0YXR1cycsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiBzdGF0dXNPcHRpb25zLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgPFN3aXRjaAorICAgICAgICAgICAgY2hlY2tlZD17cmVjb3JkLnN0YXR1cyA9PT0gJzAnfQorICAgICAgICAgICAgY2hlY2tlZENoaWxkcmVuPSLmraPluLgiCisgICAgICAgICAgICB1bkNoZWNrZWRDaGlsZHJlbj0i5YGc55SoIgorICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQKKyAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNob3dDaGFuZ2VTdGF0dXNDb25maXJtKHJlY29yZCl9CisgICAgICAgICAgLz4pCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0ucm9sZS5jcmVhdGVfdGltZSIgZGVmYXVsdE1lc3NhZ2U9IuWIm+W7uuaXtumXtCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdjcmVhdGVUaW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ2RhdGVSYW5nZScsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICg8c3Bhbj57cmVjb3JkLmNyZWF0ZVRpbWUudG9TdHJpbmcoKX0gPC9zcGFuPik7CisgICAgICB9LAorICAgICAgc2VhcmNoOiB7CisgICAgICAgIHRyYW5zZm9ybTogKHZhbHVlKSA9PiB7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdwYXJhbXNbYmVnaW5UaW1lXSc6IHZhbHVlWzBdLAorICAgICAgICAgICAgJ3BhcmFtc1tlbmRUaW1lXSc6IHZhbHVlWzFdLAorICAgICAgICAgIH07CisgICAgICAgIH0sCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS50aXRsZU9wdGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaTjeS9nCIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdvcHRpb24nLAorICAgICAgd2lkdGg6ICcyMjBweCcsCisgICAgICB2YWx1ZVR5cGU6ICdvcHRpb24nLAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiBbCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICB0eXBlPSJsaW5rIgorICAgICAgICAgIHNpemU9InNtYWxsIgorICAgICAgICAgIGtleT0iZWRpdCIKKyAgICAgICAgICBpY29uPTxFZGl0T3V0bGluZWQgLz4KKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpyb2xlOmVkaXQnKX0KKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBnZXRSb2xlTWVudUxpc3QocmVjb3JkLnJvbGVJZCkudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdHJlZURhdGEgPSBmb3JtYXRUcmVlRGF0YShyZXMubWVudXMpOworICAgICAgICAgICAgICAgIHNldE1lbnVUcmVlKHRyZWVEYXRhKTsKKyAgICAgICAgICAgICAgICBzZXRNZW51SWRzKHJlcy5jaGVja2VkS2V5cy5tYXAoaXRlbSA9PiB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aXRlbX1gCisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHJlY29yZCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS53YXJuaW5nKHJlcy5tc2cpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg57yW6L6RCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAga2V5PSJiYXRjaFJlbW92ZSIKKyAgICAgICAgICBpY29uPTxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnJvbGU6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxEcm9wZG93bgorICAgICAgICAgIGtleT0ibW9yZSIKKyAgICAgICAgICBtZW51PXt7CisgICAgICAgICAgICBpdGVtczogWworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFiZWw6ICfmlbDmja7mnYPpmZAnLAorICAgICAgICAgICAgICAgIGtleTogJ2RhdGFzY29wZScsCisgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpyb2xlOmVkaXQnKSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxhYmVsOiAn5YiG6YWN55So5oi3JywKKyAgICAgICAgICAgICAgICBrZXk6ICdhdXRoVXNlcicsCisgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTpyb2xlOmVkaXQnKSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBvbkNsaWNrOiAoeyBrZXkgfTogYW55KSA9PiB7CisgICAgICAgICAgICAgIGlmIChrZXkgPT09ICdkYXRhc2NvcGUnKSB7CisgICAgICAgICAgICAgICAgZ2V0Um9sZShyZWNvcmQucm9sZUlkKS50aGVuKHJlc3AgPT4geworICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhyZXNwLmRhdGEpOworICAgICAgICAgICAgICAgICAgICBzZXREYXRhU2NvcGVNb2RhbE9wZW4odHJ1ZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICBnZXREZXB0VHJlZVNlbGVjdChyZWNvcmQucm9sZUlkKS50aGVuKHJlc3AgPT4geworICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE1lbnVUcmVlKGZvcm1hdFRyZWVEYXRhKHJlc3AuZGVwdHMpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0TWVudUlkcyhyZXNwLmNoZWNrZWRLZXlzLm1hcCgoaXRlbTpudW1iZXIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aXRlbX1gCisgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ2F1dGhVc2VyJykgeworICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaChgL3N5c3RlbS9yb2xlLWF1dGgvdXNlci8ke3JlY29yZC5yb2xlSWR9YCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAgPGEgb25DbGljaz17KGUpID0+IGUucHJldmVudERlZmF1bHQoKX0+CisgICAgICAgICAgICA8U3BhY2U+CisgICAgICAgICAgICAgIDxEb3duT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAg5pu05aSaCisgICAgICAgICAgICA8L1NwYWNlPgorICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9Ecm9wZG93bj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIHtjb250ZXh0SG9sZGVyfQorICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBmbG9hdDogJ3JpZ2h0JyB9fT4KKyAgICAgICAgPFByb1RhYmxlPEFQSS5TeXN0ZW0uUm9sZT4KKyAgICAgICAgICBoZWFkZXJUaXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAncGFnZXMuc2VhcmNoVGFibGUudGl0bGUnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfkv6Hmga8nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGFjdGlvblJlZj17YWN0aW9uUmVmfQorICAgICAgICAgIGZvcm1SZWY9e2Zvcm1UYWJsZVJlZn0KKyAgICAgICAgICByb3dLZXk9InJvbGVJZCIKKyAgICAgICAgICBrZXk9InJvbGVMaXN0IgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImFkZCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06cm9sZTphZGQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGdldE1lbnVUcmVlKCkudGhlbigocmVzOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyZWVEYXRhID0gZm9ybWF0VHJlZURhdGEocmVzLmRhdGEpOworICAgICAgICAgICAgICAgICAgICBzZXRNZW51VHJlZSh0cmVlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHNldE1lbnVJZHMoW10pOworICAgICAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2FybmluZyhyZXMubXNnKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUubmV3IiBkZWZhdWx0TWVzc2FnZT0i5paw5bu6IiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgICAgIGhpZGRlbj17c2VsZWN0ZWRSb3dzPy5sZW5ndGggPT09IDAgfHwgIWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnJvbGU6cmVtb3ZlJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBNb2RhbC5jb25maXJtKHsKKyAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ5pWw5o2u6aG5PycsCisgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfor7fosKjmhY7mk43kvZwnLAorICAgICAgICAgICAgICAgICAgYXN5bmMgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lZCAvPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuZGVsZXRlIiBkZWZhdWx0TWVzc2FnZT0i5Yig6ZmkIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9ImV4cG9ydCIKKyAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06cm9sZTpleHBvcnQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgIGhhbmRsZUV4cG9ydCgpOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5leHBvcnQiIGRlZmF1bHRNZXNzYWdlPSLlr7zlh7oiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgXX0KKyAgICAgICAgICByZXF1ZXN0PXsocGFyYW1zKSA9PgorICAgICAgICAgICAgZ2V0Um9sZUxpc3QoeyAuLi5wYXJhbXMgfSBhcyBBUEkuU3lzdGVtLlJvbGVMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgIDwvZGl2PgorICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgIDxGb290ZXJUb29sYmFyCisgICAgICAgICAgZXh0cmE9eworICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmNob3NlbiIgZGVmYXVsdE1lc3NhZ2U9IuW3sumAieaLqSIgLz4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT4KKyAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLml0ZW0iIGRlZmF1bHRNZXNzYWdlPSLpobkiIC8+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB9CisgICAgICAgID4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgIGRhbmdlcgorICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06cm9sZTpkZWwnKX0KKyAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgdGl0bGU6ICfliKDpmaQnLAorICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfnoa7lrprliKDpmaTor6XpobnlkJfvvJ8nLAorICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsCisgICAgICAgICAgICAgICAgb25PazogYXN5bmMgKCkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Gb290ZXJUb29sYmFyPgorICAgICAgKX0KKyAgICAgIDxVcGRhdGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzKSA9PiB7CisgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICBpZiAodmFsdWVzLnJvbGVJZCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVVwZGF0ZSh7IC4uLnZhbHVlcyB9IGFzIEFQSS5TeXN0ZW0uUm9sZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVBZGQoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLlJvbGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudC5yZWxvYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH19CisgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgICAgc2V0TW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgIH19CisgICAgICAgIG9wZW49e21vZGFsVmlzaWJsZX0KKyAgICAgICAgdmFsdWVzPXtjdXJyZW50Um93IHx8IHt9fQorICAgICAgICBtZW51VHJlZT17bWVudVRyZWUgfHwgW119CisgICAgICAgIG1lbnVDaGVja2VkS2V5cz17bWVudUlkcyB8fCBbXX0KKyAgICAgICAgc3RhdHVzT3B0aW9ucz17c3RhdHVzT3B0aW9uc30KKyAgICAgIC8+CisgICAgICA8RGF0YVNjb3BlRm9ybQorICAgICAgICBvblN1Ym1pdD17YXN5bmMgKHZhbHVlczogYW55KSA9PiB7CisgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHVwZGF0ZVJvbGVEYXRhU2NvcGUodmFsdWVzKTsKKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0RGF0YVNjb3BlTW9kYWxPcGVuKGZhbHNlKTsKKyAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+mFjee9ruaIkOWKn+OAgicpOworICAgICAgICAgIH0KKyAgICAgICAgfX0KKyAgICAgICAgb25DYW5jZWw9eygpID0+IHsKKyAgICAgICAgICBzZXREYXRhU2NvcGVNb2RhbE9wZW4oZmFsc2UpOworICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICB9fQorICAgICAgICBvcGVuPXtkYXRhU2NvcGVNb2RhbE9wZW59CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgICAgZGVwdFRyZWU9e21lbnVUcmVlIHx8IFtdfQorICAgICAgICBkZXB0Q2hlY2tlZEtleXM9e21lbnVJZHMgfHwgW119CisgICAgICAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFJvbGVUYWJsZUxpc3Q7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1VzZXIvY29tcG9uZW50cy9BdXRoUm9sZS50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1VzZXIvY29tcG9uZW50cy9BdXRoUm9sZS50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwZDk2NgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9jb21wb25lbnRzL0F1dGhSb2xlLnRzeApAQCAtMCwwICsxLDgxIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgRm9ybSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IFByb0Zvcm0sIFByb0Zvcm1TZWxlY3QgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8wNgorICogCisgKiAqLworCitleHBvcnQgdHlwZSBGb3JtVmFsdWVUeXBlID0gYW55ICYgUGFydGlhbDxBUEkuU3lzdGVtLkRlcHQ+OworCitleHBvcnQgdHlwZSBBdXRoUm9sZUZvcm1Qcm9wcyA9IHsKKyAgICBvbkNhbmNlbDogKGZsYWc/OiBib29sZWFuLCBmb3JtVmFscz86IEZvcm1WYWx1ZVR5cGUpID0+IHZvaWQ7CisgICAgb25TdWJtaXQ6ICh2YWx1ZXM6IEZvcm1WYWx1ZVR5cGUpID0+IFByb21pc2U8dm9pZD47CisgICAgb3BlbjogYm9vbGVhbjsKKyAgICByb2xlSWRzOiBudW1iZXJbXTsKKyAgICByb2xlczogc3RyaW5nW107Cit9OworCitjb25zdCBBdXRoUm9sZUZvcm06IFJlYWN0LkZDPEF1dGhSb2xlRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICAgIGNvbnN0IFtmb3JtXSA9IEZvcm0udXNlRm9ybSgpOworCisgICAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICAgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgICAgICBmb3JtLnNldEZpZWxkVmFsdWUoICdyb2xlSWRzJywgcHJvcHMucm9sZUlkcyk7CisgICAgfSk7CisKKyAgICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworICAgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgICAgICBmb3JtLnN1Ym1pdCgpOworICAgIH07CisgICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgICAgICBwcm9wcy5vbkNhbmNlbCgpOworICAgIH07CisgICAgY29uc3QgaGFuZGxlRmluaXNoID0gYXN5bmMgKHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PikgPT4geworICAgICAgICBwcm9wcy5vblN1Ym1pdCh2YWx1ZXMgYXMgRm9ybVZhbHVlVHlwZSk7CisgICAgfTsKKworICAgIHJldHVybiAoCisgICAgICAgIDxNb2RhbAorICAgICAgICAgICAgd2lkdGg9ezY0MH0KKyAgICAgICAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgIGlkOiAnc3lzdGVtLnVzZXIuYXV0aC5yb2xlJywKKyAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+WIhumFjeinkuiJsicsCisgICAgICAgICAgICB9KX0KKyAgICAgICAgICAgIG9wZW49e3Byb3BzLm9wZW59CisgICAgICAgICAgICBkZXN0cm95T25DbG9zZQorICAgICAgICAgICAgZm9yY2VSZW5kZXIKKyAgICAgICAgICAgIG9uT2s9e2hhbmRsZU9rfQorICAgICAgICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH0KKyAgICAgICAgPgorICAgICAgICAgICAgPFByb0Zvcm0KKyAgICAgICAgICAgICAgICBmb3JtPXtmb3JtfQorICAgICAgICAgICAgICAgIGdyaWQ9e3RydWV9CisgICAgICAgICAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIG9uRmluaXNoPXtoYW5kbGVGaW5pc2h9CisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlcz17eworICAgICAgICAgICAgICAgICAgICBsb2dpbl9wYXNzd29yZDogJycsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1fcGFzc3dvcmQ6ICcnLAorICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1TZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0icm9sZUlkcyIKKyAgICAgICAgICAgICAgICAgICAgbW9kZT0ibXVsdGlwbGUiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5yb2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6ImyJywKKyAgICAgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3Byb3BzLnJvbGVzfQorICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36YCJ5oup6KeS6ImyIgorICAgICAgICAgICAgICAgICAgICBydWxlcz17W3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nop5LoibIhJyB9XX0KKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9Qcm9Gb3JtPgorICAgICAgICA8L01vZGFsPgorICAgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBBdXRoUm9sZUZvcm07CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1VzZXIvY29tcG9uZW50cy9EZXB0VHJlZS50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1VzZXIvY29tcG9uZW50cy9EZXB0VHJlZS50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhMDg1YwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9jb21wb25lbnRzL0RlcHRUcmVlLnRzeApAQCAtMCwwICsxLDY5IEBACitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IFRyZWUsIG1lc3NhZ2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IGdldERlcHRUcmVlIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vdXNlcic7CisKK2NvbnN0IHsgRGlyZWN0b3J5VHJlZSB9ID0gVHJlZTsKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIzLzAyLzA2CisgKiAKKyAqICovCisKKworZXhwb3J0IHR5cGUgVHJlZVByb3BzID0geworICBvblNlbGVjdDogKHZhbHVlczogYW55KSA9PiBQcm9taXNlPHZvaWQ+OworfTsKKworY29uc3QgRGVwdFRyZWU6IFJlYWN0LkZDPFRyZWVQcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW3RyZWVEYXRhLCBzZXRUcmVlRGF0YV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2V4cGFuZGVkS2V5cywgc2V0RXhwYW5kZWRLZXlzXSA9IHVzZVN0YXRlPFJlYWN0LktleVtdPihbXSk7CisgIGNvbnN0IFthdXRvRXhwYW5kUGFyZW50LCBzZXRBdXRvRXhwYW5kUGFyZW50XSA9IHVzZVN0YXRlPGJvb2xlYW4+KHRydWUpOworCisgIGNvbnN0IGZldGNoRGVwdExpc3QgPSBhc3luYyAoKSA9PiB7CisgICAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5p+l6K+iJyk7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IGdldERlcHRUcmVlKHt9KS50aGVuKChyZXM6IGFueSkgPT4geworICAgICAgICBjb25zdCBleEtleXMgPSBbXTsKKyAgICAgICAgZXhLZXlzLnB1c2goJzEnKTsKKyAgICAgICAgc2V0VHJlZURhdGEocmVzKTsKKyAgICAgICAgZXhLZXlzLnB1c2gocmVzWzBdLmNoaWxkcmVuWzBdLmlkKTsKKyAgICAgICAgc2V0RXhwYW5kZWRLZXlzKGV4S2V5cyk7CisgICAgICAgIHByb3BzLm9uU2VsZWN0KHJlc1swXS5jaGlsZHJlblswXSk7CisgICAgICB9KTsKKyAgICAgIGhpZGUoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgICBoaWRlKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9OworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZmV0Y2hEZXB0TGlzdCgpOworICB9LCBbXSk7CisKKyAgY29uc3Qgb25TZWxlY3QgPSAoa2V5czogUmVhY3QuS2V5W10sIGluZm86IGFueSkgPT4geworICAgIHByb3BzLm9uU2VsZWN0KGluZm8ubm9kZSk7CisgIH07CisKKyAgY29uc3Qgb25FeHBhbmQgPSAoZXhwYW5kZWRLZXlzVmFsdWU6IFJlYWN0LktleVtdKSA9PiB7CisgICAgc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5c1ZhbHVlKTsKKyAgICBzZXRBdXRvRXhwYW5kUGFyZW50KGZhbHNlKTsKKyAgfTsKKworICByZXR1cm4gKAorICAgIDxEaXJlY3RvcnlUcmVlCisgICAgICAvLyBtdWx0aXBsZQorICAgICAgZGVmYXVsdEV4cGFuZEFsbAorICAgICAgb25FeHBhbmQ9e29uRXhwYW5kfQorICAgICAgZXhwYW5kZWRLZXlzPXtleHBhbmRlZEtleXN9CisgICAgICBhdXRvRXhwYW5kUGFyZW50PXthdXRvRXhwYW5kUGFyZW50fQorICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fQorICAgICAgdHJlZURhdGE9e3RyZWVEYXRhfQorICAgIC8+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBEZXB0VHJlZTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9jb21wb25lbnRzL1Jlc2V0UHdkLnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9jb21wb25lbnRzL1Jlc2V0UHdkLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTIzY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Vc2VyL2NvbXBvbmVudHMvUmVzZXRQd2QudHN4CkBAIC0wLDAgKzEsOTUgQEAKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBGb3JtLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgdXNlSW50bCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgUHJvRm9ybSwgUHJvRm9ybVRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8wNgorICogCisgKiAqLworCitleHBvcnQgdHlwZSBGb3JtVmFsdWVUeXBlID0gYW55ICYgUGFydGlhbDxBUEkuU3lzdGVtLlVzZXI+OworCitleHBvcnQgdHlwZSBVcGRhdGVGb3JtUHJvcHMgPSB7CisgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogRm9ybVZhbHVlVHlwZSkgPT4gdm9pZDsKKyAgb25TdWJtaXQ6ICh2YWx1ZXM6IEZvcm1WYWx1ZVR5cGUpID0+IFByb21pc2U8dm9pZD47CisgIG9wZW46IGJvb2xlYW47CisgIHZhbHVlczogUGFydGlhbDxBUEkuU3lzdGVtLlVzZXI+OworfTsKKworY29uc3QgVXBkYXRlRm9ybTogUmVhY3QuRkM8VXBkYXRlRm9ybVByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgY29uc3QgbG9naW5QYXNzd29yZCA9IEZvcm0udXNlV2F0Y2goJ3Bhc3N3b3JkJywgZm9ybSk7CisgIGNvbnN0IHVzZXJJZCA9IHByb3BzLnZhbHVlcy51c2VySWQ7CisKKyAgY29uc3QgaW50bCA9IHVzZUludGwoKTsKKyAgY29uc3QgaGFuZGxlT2sgPSAoKSA9PiB7CisgICAgZm9ybS5zdWJtaXQoKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uQ2FuY2VsKCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBwcm9wcy5vblN1Ym1pdCh7IC4uLnZhbHVlcywgdXNlcklkIH0gYXMgRm9ybVZhbHVlVHlwZSk7CisgIH07CisKKyAgY29uc3QgY2hlY2tQYXNzd29yZCA9IChydWxlOiBhbnksIHZhbHVlOiBzdHJpbmcpID0+IHsKKyAgICBpZiAodmFsdWUgPT09IGxvZ2luUGFzc3dvcmQpIHsKKyAgICAgIC8vIOagoemqjOadoeS7tuiHquWumuS5iQorICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOworICAgIH0KKyAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCfkuKTmrKHlr4bnoIHovpPlhaXkuI3kuIDoh7QnKSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5yZXNldC5wYXNzd29yZCcsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5a+G56CB6YeN572uJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGRlc3Ryb3lPbkNsb3NlCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorICAgICAgPFByb0Zvcm0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofQorICAgICAgICBpbml0aWFsVmFsdWVzPXt7CisgICAgICAgICAgcGFzc3dvcmQ6ICcnLAorICAgICAgICAgIGNvbmZpcm1fcGFzc3dvcmQ6ICcnLAorICAgICAgICB9fQorICAgICAgPgorICAgICAgICA8cD7or7fovpPlhaXnlKjmiLd7cHJvcHMudmFsdWVzLnVzZXJOYW1lfeeahOaWsOWvhuegge+8gTwvcD4KKyAgICAgICAgPFByb0Zvcm1UZXh0LlBhc3N3b3JkCisgICAgICAgICAgbmFtZT0icGFzc3dvcmQiCisgICAgICAgICAgbGFiZWw9IueZu+W9leWvhueggSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogJ+eZu+W9leWvhueggeS4jeWPr+S4uuepuuOAgicsCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dC5QYXNzd29yZAorICAgICAgICAgIG5hbWU9ImNvbmZpcm1fcGFzc3dvcmQiCisgICAgICAgICAgbGFiZWw9IuehruiupOWvhueggSIKKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogIuehruiupOWvhueggSIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeyB2YWxpZGF0b3I6IGNoZWNrUGFzc3dvcmQgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgPC9Qcm9Gb3JtPgorICAgIDwvTW9kYWw+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBVcGRhdGVGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Vc2VyL2VkaXQudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Vc2VyL2VkaXQudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDQ0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvU3lzdGVtL1VzZXIvZWRpdC50c3gKQEAgLTAsMCArMSwyNzkgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeworICBQcm9Gb3JtLAorICBQcm9Gb3JtVGV4dCwKKyAgUHJvRm9ybVNlbGVjdCwKKyAgUHJvRm9ybVJhZGlvLAorICBQcm9Gb3JtVGV4dEFyZWEsCisgIFByb0Zvcm1UcmVlU2VsZWN0LAorfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBGb3JtLCBNb2RhbCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgdXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgRGF0YU5vZGUgfSBmcm9tICdhbnRkL2VzL3RyZWUnOworaW1wb3J0IHsgRGljdFZhbHVlRW51bU9iaiB9IGZyb20gJ0AvY29tcG9uZW50cy9EaWN0VGFnJzsKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIzLzAyLzA2CisgKiAKKyAqICovCisKKworZXhwb3J0IHR5cGUgVXNlckZvcm1EYXRhID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBQYXJ0aWFsPEFQSS5TeXN0ZW0uVXNlcj47CisKK2V4cG9ydCB0eXBlIFVzZXJGb3JtUHJvcHMgPSB7CisgIG9uQ2FuY2VsOiAoZmxhZz86IGJvb2xlYW4sIGZvcm1WYWxzPzogVXNlckZvcm1EYXRhKSA9PiB2b2lkOworICBvblN1Ym1pdDogKHZhbHVlczogVXNlckZvcm1EYXRhKSA9PiBQcm9taXNlPHZvaWQ+OworICBvcGVuOiBib29sZWFuOworICB2YWx1ZXM6IFBhcnRpYWw8QVBJLlN5c3RlbS5Vc2VyPjsKKyAgc2V4T3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKKyAgc3RhdHVzT3B0aW9uczogRGljdFZhbHVlRW51bU9iajsKKyAgcG9zdElkczogbnVtYmVyW107CisgIHBvc3RzOiBzdHJpbmdbXTsKKyAgcm9sZUlkczogbnVtYmVyW107CisgIHJvbGVzOiBzdHJpbmdbXTsKKyAgZGVwdHM6IERhdGFOb2RlW107Cit9OworCitjb25zdCBVc2VyRm9ybTogUmVhY3QuRkM8VXNlckZvcm1Qcm9wcz4gPSAocHJvcHMpID0+IHsKKyAgY29uc3QgW2Zvcm1dID0gRm9ybS51c2VGb3JtKCk7CisgIGNvbnN0IHVzZXJJZCA9IEZvcm0udXNlV2F0Y2goJ3VzZXJJZCcsIGZvcm0pOworICBjb25zdCB7IHNleE9wdGlvbnMsIHN0YXR1c09wdGlvbnMsIH0gPSBwcm9wczsKKyAgY29uc3QgeyByb2xlcywgcG9zdHMsIGRlcHRzIH0gPSBwcm9wczsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIGZvcm0ucmVzZXRGaWVsZHMoKTsKKyAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKyAgICAgIHVzZXJJZDogcHJvcHMudmFsdWVzLnVzZXJJZCwKKyAgICAgIGRlcHRJZDogcHJvcHMudmFsdWVzLmRlcHRJZCwKKyAgICAgIHBvc3RJZHM6IHByb3BzLnBvc3RJZHMsCisgICAgICByb2xlSWRzOiBwcm9wcy5yb2xlSWRzLAorICAgICAgdXNlck5hbWU6IHByb3BzLnZhbHVlcy51c2VyTmFtZSwKKyAgICAgIG5pY2tOYW1lOiBwcm9wcy52YWx1ZXMubmlja05hbWUsCisgICAgICBlbWFpbDogcHJvcHMudmFsdWVzLmVtYWlsLAorICAgICAgcGhvbmVudW1iZXI6IHByb3BzLnZhbHVlcy5waG9uZW51bWJlciwKKyAgICAgIHNleDogcHJvcHMudmFsdWVzLnNleCwKKyAgICAgIGF2YXRhcjogcHJvcHMudmFsdWVzLmF2YXRhciwKKyAgICAgIHN0YXR1czogcHJvcHMudmFsdWVzLnN0YXR1cywKKyAgICAgIGRlbEZsYWc6IHByb3BzLnZhbHVlcy5kZWxGbGFnLAorICAgICAgbG9naW5JcDogcHJvcHMudmFsdWVzLmxvZ2luSXAsCisgICAgICBsb2dpbkRhdGU6IHByb3BzLnZhbHVlcy5sb2dpbkRhdGUsCisgICAgICByZW1hcms6IHByb3BzLnZhbHVlcy5yZW1hcmssCisgICAgfSk7CisgIH0sIFtmb3JtLCBwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGZvcm0uc3VibWl0KCk7CisgIH07CisgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsKKyAgICBwcm9wcy5vbkNhbmNlbCgpOworICB9OworICBjb25zdCBoYW5kbGVGaW5pc2ggPSBhc3luYyAodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7CisgICAgcHJvcHMub25TdWJtaXQodmFsdWVzIGFzIFVzZXJGb3JtRGF0YSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs2NDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci50aXRsZScsCisgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn57yW6L6R55So5oi35L+h5oGvJywKKyAgICAgIH0pfQorICAgICAgb3Blbj17cHJvcHMub3Blbn0KKyAgICAgIGRlc3Ryb3lPbkNsb3NlCisgICAgICBvbk9rPXtoYW5kbGVPa30KKyAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9CisgICAgPgorICAgICAgPFByb0Zvcm0KKyAgICAgICAgZ3JpZD17dHJ1ZX0KKyAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgbGF5b3V0PSJob3Jpem9udGFsIgorICAgICAgICBzdWJtaXR0ZXI9e2ZhbHNlfQorICAgICAgICBvbkZpbmlzaD17aGFuZGxlRmluaXNofT4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0ibmlja05hbWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLm5pY2tfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eUqOaIt+aYteensCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+aYteensCIKKyAgICAgICAgICBjb2xQcm9wcz17eyB4czogMjQsIG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl55So5oi35pi156ew77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl55So5oi35pi156ew77yBIiAvPgorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRyZWVTZWxlY3QKKyAgICAgICAgICBuYW1lPSJkZXB0SWQiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLmRlcHRfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+mDqOmXqCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcmVxdWVzdD17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgcmV0dXJuIGRlcHRzOworICAgICAgICAgIH19CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+mDqOmXqCIKKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICBtZXNzYWdlOiAoCisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeUqOaIt+mDqOmXqO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeUqOaIt+mDqOmXqO+8gSIgLz4KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0icGhvbmVudW1iZXIiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnBob25lbnVtYmVyJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5omL5py65Y+356CBJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5omL5py65Y+356CBIgorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiAoCisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaJi+acuuWPt+egge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaJi+acuuWPt+egge+8gSIgLz4KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0iZW1haWwiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLmVtYWlsJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn55So5oi36YKu566xJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl55So5oi36YKu566xIgorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICBtZXNzYWdlOiAoCisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeUqOaIt+mCrueuse+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeUqOaIt+mCrueuse+8gSIgLz4KKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgbmFtZT0idXNlck5hbWUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnVzZXJfbmFtZScsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eUqOaIt+i0puWPtycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgaGlkZGVuPXt1c2VySWR9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+i0puWPtyIKKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVRleHQuUGFzc3dvcmQKKyAgICAgICAgICBuYW1lPSJwYXNzd29yZCIKKyAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnc3lzdGVtLnVzZXIucGFzc3dvcmQnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflr4bnoIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGhpZGRlbj17dXNlcklkfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlr4bnoIEiCisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXlr4bnoIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXlr4bnoIHvvIEiIC8+LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgIHZhbHVlRW51bT17c2V4T3B0aW9uc30KKyAgICAgICAgICBuYW1lPSJzZXgiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnNleCcsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eUqOaIt+aAp+WIqycsCisgICAgICAgICAgfSl9CisgICAgICAgICAgaW5pdGlhbFZhbHVlPXsnMCd9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeeUqOaIt+aAp+WIqyIKKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMTIsIHhsOiAxMiB9fQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogKAorICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnlKjmiLfmgKfliKvvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnlKjmiLfmgKfliKvvvIEiIC8+CisgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtUmFkaW8uR3JvdXAKKyAgICAgICAgICB2YWx1ZUVudW09e3N0YXR1c09wdGlvbnN9CisgICAgICAgICAgbmFtZT0ic3RhdHVzIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5zdGF0dXMnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfluJDlj7fnirbmgIEnLAorICAgICAgICAgIH0pfQorICAgICAgICAgIGluaXRpYWxWYWx1ZT17JzAnfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXluJDlj7fnirbmgIEiCisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCisgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5biQ5Y+354q25oCB77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5biQ5Y+354q25oCB77yBIiAvPgorICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdfQorICAgICAgICAvPgorICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgIG5hbWU9InBvc3RJZHMiCisgICAgICAgICAgbW9kZT0ibXVsdGlwbGUiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnBvc3QnLAorICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICflspfkvY0nLAorICAgICAgICAgIH0pfQorICAgICAgICAgIG9wdGlvbnM9e3Bvc3RzfQorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fpgInmi6nlspfkvY0iCisgICAgICAgICAgY29sUHJvcHM9e3sgbWQ6IDEyLCB4bDogMTIgfX0KKyAgICAgICAgICBydWxlcz17W3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlspfkvY0hJyB9XX0KKyAgICAgICAgLz4KKyAgICAgICAgPFByb0Zvcm1TZWxlY3QKKyAgICAgICAgICBuYW1lPSJyb2xlSWRzIgorICAgICAgICAgIG1vZGU9Im11bHRpcGxlIgorICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5yb2xlJywKKyAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6KeS6ImyJywKKyAgICAgICAgICB9KX0KKyAgICAgICAgICBvcHRpb25zPXtyb2xlc30KKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36YCJ5oup6KeS6ImyIgorICAgICAgICAgIGNvbFByb3BzPXt7IG1kOiAxMiwgeGw6IDEyIH19CisgICAgICAgICAgcnVsZXM9e1t7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup6KeS6ImyIScgfV19CisgICAgICAgIC8+CisgICAgICAgIDxQcm9Gb3JtVGV4dEFyZWEKKyAgICAgICAgICBuYW1lPSJyZW1hcmsiCisgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnJlbWFyaycsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+Wkh+azqCcsCisgICAgICAgICAgfSl9CisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWkh+azqCIKKyAgICAgICAgICBjb2xQcm9wcz17eyBtZDogMjQsIHhsOiAyNCB9fQorICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeWkh+azqO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWkh+azqO+8gSIgLz4sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF19CisgICAgICAgIC8+CisgICAgICA8L1Byb0Zvcm0+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFVzZXJGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1N5c3RlbS9Vc2VyL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNTc4NwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9TeXN0ZW0vVXNlci9pbmRleC50c3gKQEAgLTAsMCArMSw1NjEgQEAKKworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IHVzZUludGwsIEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUFjY2VzcyB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgQ2FyZCwgQ29sLCBEcm9wZG93biwgRm9ybUluc3RhbmNlLCBSb3csIFNwYWNlLCBTd2l0Y2ggfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEJ1dHRvbiwgbWVzc2FnZSwgTW9kYWwgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEFjdGlvblR5cGUsIEZvb3RlclRvb2xiYXIsIFBhZ2VDb250YWluZXIsIFByb0NvbHVtbnMsIFByb1RhYmxlIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgUGx1c091dGxpbmVkLCBEZWxldGVPdXRsaW5lZCwgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCwgRG93bk91dGxpbmVkLCBFZGl0T3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBnZXRVc2VyTGlzdCwgcmVtb3ZlVXNlciwgYWRkVXNlciwgdXBkYXRlVXNlciwgZXhwb3J0VXNlciwgZ2V0VXNlciwgY2hhbmdlVXNlclN0YXR1cywgdXBkYXRlQXV0aFJvbGUsIHJlc2V0VXNlclB3ZCB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL3VzZXInOworaW1wb3J0IFVwZGF0ZUZvcm0gZnJvbSAnLi9lZGl0JzsKK2ltcG9ydCB7IGdldERpY3RWYWx1ZUVudW0gfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9kaWN0JzsKK2ltcG9ydCB7IERhdGFOb2RlIH0gZnJvbSAnYW50ZC9lcy90cmVlJzsKK2ltcG9ydCB7IGdldERlcHRUcmVlIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vdXNlcic7CitpbXBvcnQgRGVwdFRyZWUgZnJvbSAnLi9jb21wb25lbnRzL0RlcHRUcmVlJzsKK2ltcG9ydCBSZXNldFB3ZCBmcm9tICcuL2NvbXBvbmVudHMvUmVzZXRQd2QnOworaW1wb3J0IHsgZ2V0UG9zdExpc3QgfSBmcm9tICdAL3NlcnZpY2VzL3N5c3RlbS9wb3N0JzsKK2ltcG9ydCB7IGdldFJvbGVMaXN0IH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vcm9sZSc7CitpbXBvcnQgQXV0aFJvbGVGb3JtIGZyb20gJy4vY29tcG9uZW50cy9BdXRoUm9sZSc7CisKK2NvbnN0IHsgY29uZmlybSB9ID0gTW9kYWw7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMy8wMi8wNgorICoKKyAqICovCisKKy8qKgorICog5re75Yqg6IqC54K5CisgKgorICogQHBhcmFtIGZpZWxkcworICovCitjb25zdCBoYW5kbGVBZGQgPSBhc3luYyAoZmllbGRzOiBBUEkuU3lzdGVtLlVzZXIpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5re75YqgJyk7CisgIHRyeSB7CisgICAgYXdhaXQgYWRkVXNlcih7IC4uLmZpZWxkcyB9KTsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCfmt7vliqDmiJDlip8nKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5re75Yqg5aSx6LSl6K+36YeN6K+V77yBJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOabtOaWsOiKgueCuQorICoKKyAqIEBwYXJhbSBmaWVsZHMKKyAqLworY29uc3QgaGFuZGxlVXBkYXRlID0gYXN5bmMgKGZpZWxkczogQVBJLlN5c3RlbS5Vc2VyKSA9PiB7CisgIGNvbnN0IGhpZGUgPSBtZXNzYWdlLmxvYWRpbmcoJ+ato+WcqOmFjee9ricpOworICB0cnkgeworICAgIGF3YWl0IHVwZGF0ZVVzZXIoZmllbGRzKTsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCfphY3nva7miJDlip8nKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign6YWN572u5aSx6LSl6K+36YeN6K+V77yBJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOWIoOmZpOiKgueCuQorICoKKyAqIEBwYXJhbSBzZWxlY3RlZFJvd3MKKyAqLworY29uc3QgaGFuZGxlUmVtb3ZlID0gYXN5bmMgKHNlbGVjdGVkUm93czogQVBJLlN5c3RlbS5Vc2VyW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBhd2FpdCByZW1vdmVVc2VyKHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4gcm93LnVzZXJJZCkuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjb25zdCBoYW5kbGVSZW1vdmVPbmUgPSBhc3luYyAoc2VsZWN0ZWRSb3c6IEFQSS5TeXN0ZW0uVXNlcikgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LnVzZXJJZF07CisgICAgYXdhaXQgcmVtb3ZlVXNlcihwYXJhbXMuam9pbignLCcpKTsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip/vvIzljbPlsIbliLfmlrAnKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICBoaWRlKCk7CisgICAgbWVzc2FnZS5lcnJvcign5Yig6Zmk5aSx6LSl77yM6K+36YeN6K+VJyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIOWvvOWHuuaVsOaNrgorICoKKyAqCisgKi8KK2NvbnN0IGhhbmRsZUV4cG9ydCA9IGFzeW5jICgpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5a+85Ye6Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZXhwb3J0VXNlcigpOworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpOworICAgIHJldHVybiB0cnVlOworICB9IGNhdGNoIChlcnJvcikgeworICAgIGhpZGUoKTsKKyAgICBtZXNzYWdlLmVycm9yKCflr7zlh7rlpLHotKXvvIzor7fph43or5UnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NvbnN0IFVzZXJUYWJsZUxpc3Q6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBbbWVzc2FnZUFwaSwgY29udGV4dEhvbGRlcl0gPSBtZXNzYWdlLnVzZU1lc3NhZ2UoKTsKKworICBjb25zdCBmb3JtVGFibGVSZWYgPSB1c2VSZWY8Rm9ybUluc3RhbmNlPigpOworCisgIGNvbnN0IFttb2RhbFZpc2libGUsIHNldE1vZGFsVmlzaWJsZV0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisgIGNvbnN0IFtyZXNldFB3ZE1vZGFsVmlzaWJsZSwgc2V0UmVzZXRQd2RNb2RhbFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworICBjb25zdCBbYXV0aFJvbGVNb2RhbFZpc2libGUsIHNldEF1dGhSb2xlTW9kYWxWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsKKworICBjb25zdCBhY3Rpb25SZWYgPSB1c2VSZWY8QWN0aW9uVHlwZT4oKTsKKyAgY29uc3QgW2N1cnJlbnRSb3csIHNldEN1cnJlbnRSb3ddID0gdXNlU3RhdGU8QVBJLlN5c3RlbS5Vc2VyPigpOworICBjb25zdCBbc2VsZWN0ZWRSb3dzLCBzZXRTZWxlY3RlZFJvd3NdID0gdXNlU3RhdGU8QVBJLlN5c3RlbS5Vc2VyW10+KFtdKTsKKworICBjb25zdCBbc2VsZWN0RGVwdCwgc2V0U2VsZWN0RGVwdF0gPSB1c2VTdGF0ZTxhbnk+KHsgaWQ6IDAgfSk7CisgIGNvbnN0IFtzZXhPcHRpb25zLCBzZXRTZXhPcHRpb25zXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbc3RhdHVzT3B0aW9ucywgc2V0U3RhdHVzT3B0aW9uc10gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKworICBjb25zdCBbcG9zdElkcywgc2V0UG9zdElkc10gPSB1c2VTdGF0ZTxudW1iZXJbXT4oKTsKKyAgY29uc3QgW3Bvc3RMaXN0LCBzZXRQb3N0TGlzdF0gPSB1c2VTdGF0ZTxhbnlbXT4oKTsKKyAgY29uc3QgW3JvbGVJZHMsIHNldFJvbGVJZHNdID0gdXNlU3RhdGU8bnVtYmVyW10+KCk7CisgIGNvbnN0IFtyb2xlTGlzdCwgc2V0Um9sZUxpc3RdID0gdXNlU3RhdGU8YW55W10+KCk7CisgIGNvbnN0IFtkZXB0VHJlZSwgc2V0RGVwdFRyZWVdID0gdXNlU3RhdGU8RGF0YU5vZGVbXT4oKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICAvKiog5Zu96ZmF5YyW6YWN572uICovCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXREaWN0VmFsdWVFbnVtKCdzeXNfdXNlcl9zZXgnKS50aGVuKChkYXRhKSA9PiB7CisgICAgICBzZXRTZXhPcHRpb25zKGRhdGEpOworICAgIH0pOworICAgIGdldERpY3RWYWx1ZUVudW0oJ3N5c19ub3JtYWxfZGlzYWJsZScpLnRoZW4oKGRhdGEpID0+IHsKKyAgICAgIHNldFN0YXR1c09wdGlvbnMoZGF0YSk7CisgICAgfSk7CisgIH0sIFtdKTsKKworICBjb25zdCBzaG93Q2hhbmdlU3RhdHVzQ29uZmlybSA9IChyZWNvcmQ6IEFQSS5TeXN0ZW0uVXNlcikgPT4geworICAgIGxldCB0ZXh0ID0gcmVjb3JkLnN0YXR1cyA9PT0gIjEiID8gIuWQr+eUqCIgOiAi5YGc55SoIjsKKyAgICBjb25zdCBuZXdTdGF0dXMgPSByZWNvcmQuc3RhdHVzID09PSAnMCcgPyAnMScgOiAnMCc7CisgICAgY29uZmlybSh7CisgICAgICB0aXRsZTogYOehruiupOimgSR7dGV4dH0ke3JlY29yZC51c2VyTmFtZX3nlKjmiLflkJfvvJ9gLAorICAgICAgb25PaygpIHsKKyAgICAgICAgY2hhbmdlVXNlclN0YXR1cyhyZWNvcmQudXNlcklkLCBuZXdTdGF0dXMpLnRoZW4ocmVzcCA9PiB7CisgICAgICAgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICBtZXNzYWdlQXBpLm9wZW4oeworICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCisgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmm7TmlrDmiJDlip/vvIEnLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhY3Rpb25SZWYuY3VycmVudD8ucmVsb2FkKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2VBcGkub3Blbih7CisgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCisgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmm7TmlrDlpLHotKXvvIEnLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0sCisgICAgfSk7CisgIH07CisKKyAgY29uc3QgZmV0Y2hVc2VySW5mbyA9IGFzeW5jICh1c2VySWQ6IG51bWJlcikgPT4geworICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdldFVzZXIodXNlcklkKTsKKyAgICBzZXRQb3N0SWRzKHJlcy5wb3N0SWRzKTsKKyAgICBzZXRQb3N0TGlzdCgKKyAgICAgIHJlcy5wb3N0cy5tYXAoKGl0ZW06IGFueSkgPT4geworICAgICAgICByZXR1cm4geworICAgICAgICAgIHZhbHVlOiBpdGVtLnBvc3RJZCwKKyAgICAgICAgICBsYWJlbDogaXRlbS5wb3N0TmFtZSwKKyAgICAgICAgfTsKKyAgICAgIH0pLAorICAgICk7CisgICAgc2V0Um9sZUlkcyhyZXMucm9sZUlkcyk7CisgICAgc2V0Um9sZUxpc3QoCisgICAgICByZXMucm9sZXMubWFwKChpdGVtOiBhbnkpID0+IHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICB2YWx1ZTogaXRlbS5yb2xlSWQsCisgICAgICAgICAgbGFiZWw6IGl0ZW0ucm9sZU5hbWUsCisgICAgICAgIH07CisgICAgICB9KSwKKyAgICApOworICB9OworCisgIGNvbnN0IGNvbHVtbnM6IFByb0NvbHVtbnM8QVBJLlN5c3RlbS5Vc2VyPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnVzZXIudXNlcl9pZCIgZGVmYXVsdE1lc3NhZ2U9IueUqOaIt+e8luWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICdkZXB0SWQnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dCcsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnVzZXJfbmFtZSIgZGVmYXVsdE1lc3NhZ2U9IueUqOaIt+i0puWPtyIgLz4sCisgICAgICBkYXRhSW5kZXg6ICd1c2VyTmFtZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0ic3lzdGVtLnVzZXIubmlja19uYW1lIiBkZWZhdWx0TWVzc2FnZT0i55So5oi35pi156ewIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ25pY2tOYW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0udXNlci5kZXB0X25hbWUiIGRlZmF1bHRNZXNzYWdlPSLpg6jpl6giIC8+LAorICAgICAgZGF0YUluZGV4OiBbJ2RlcHQnLCAnZGVwdE5hbWUnXSwKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InN5c3RlbS51c2VyLnBob25lbnVtYmVyIiBkZWZhdWx0TWVzc2FnZT0i5omL5py65Y+356CBIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ3Bob25lbnVtYmVyJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHQnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0udXNlci5zdGF0dXMiIGRlZmF1bHRNZXNzYWdlPSLluJDlj7fnirbmgIEiIC8+LAorICAgICAgZGF0YUluZGV4OiAnc3RhdHVzJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IHN0YXR1c09wdGlvbnMsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IHsKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICA8U3dpdGNoCisgICAgICAgICAgICBjaGVja2VkPXtyZWNvcmQuc3RhdHVzID09PSAnMCd9CisgICAgICAgICAgICBjaGVja2VkQ2hpbGRyZW49Iuato+W4uCIKKyAgICAgICAgICAgIHVuQ2hlY2tlZENoaWxkcmVuPSLlgZznlKgiCisgICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZAorICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2hvd0NoYW5nZVN0YXR1c0NvbmZpcm0ocmVjb3JkKX0KKyAgICAgICAgICAvPikKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLnRpdGxlT3B0aW9uIiBkZWZhdWx0TWVzc2FnZT0i5pON5L2cIiAvPiwKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzIyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJlZGl0IgorICAgICAgICAgIGljb249PEVkaXRPdXRsaW5lZCAvPgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnVzZXI6ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgIGZldGNoVXNlckluZm8ocmVjb3JkLnVzZXJJZCk7CisgICAgICAgICAgICBjb25zdCB0cmVlRGF0YSA9IGF3YWl0IGdldERlcHRUcmVlKHt9KTsKKyAgICAgICAgICAgIHNldERlcHRUcmVlKHRyZWVEYXRhKTsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAg57yW6L6RCisgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAgZGFuZ2VyCisgICAgICAgICAgaWNvbj08RGVsZXRlT3V0bGluZWQgLz4KKyAgICAgICAgICBrZXk9ImJhdGNoUmVtb3ZlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnVzZXI6cmVtb3ZlJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpemhueWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxEcm9wZG93bgorICAgICAgICAgIGtleT0ibW9yZSIKKyAgICAgICAgICBtZW51PXt7CisgICAgICAgICAgICBpdGVtczogWworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFiZWw6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJzeXN0ZW0udXNlci5yZXNldC5wYXNzd29yZCIgZGVmYXVsdE1lc3NhZ2U9IuWvhueggemHjee9riIgLz4sCisgICAgICAgICAgICAgICAga2V5OiAncmVzZXQnLAorICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06dXNlcjplZGl0JyksCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYWJlbDogJ+WIhumFjeinkuiJsicsCisgICAgICAgICAgICAgICAga2V5OiAnYXV0aFJvbGUnLAorICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06dXNlcjplZGl0JyksCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgb25DbGljazogKHsga2V5IH0pID0+IHsKKyAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3Jlc2V0JykgeworICAgICAgICAgICAgICAgIHNldFJlc2V0UHdkTW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdhdXRoUm9sZScpIHsKKyAgICAgICAgICAgICAgICBmZXRjaFVzZXJJbmZvKHJlY29yZC51c2VySWQpOworICAgICAgICAgICAgICAgIHNldEF1dGhSb2xlTW9kYWxWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRSb3cocmVjb3JkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICA8YSBvbkNsaWNrPXsoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfT4KKyAgICAgICAgICAgIDxTcGFjZT4KKyAgICAgICAgICAgICAgPERvd25PdXRsaW5lZCAvPgorICAgICAgICAgICAgICDmm7TlpJoKKyAgICAgICAgICAgIDwvU3BhY2U+CisgICAgICAgICAgPC9hPgorICAgICAgICA8L0Ryb3Bkb3duPiwKKyAgICAgIF0sCisgICAgfSwKKyAgXTsKKworICByZXR1cm4gKAorICAgIDxQYWdlQ29udGFpbmVyPgorICAgICAge2NvbnRleHRIb2xkZXJ9CisgICAgICA8Um93IGd1dHRlcj17WzE2LCAyNF19PgorICAgICAgICA8Q29sIGxnPXs2fSBtZD17MjR9PgorICAgICAgICAgIDxDYXJkPgorICAgICAgICAgICAgPERlcHRUcmVlCisgICAgICAgICAgICAgIG9uU2VsZWN0PXthc3luYyAodmFsdWU6IGFueSkgPT4geworICAgICAgICAgICAgICAgIHNldFNlbGVjdERlcHQodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChhY3Rpb25SZWYuY3VycmVudCkgeworICAgICAgICAgICAgICAgICAgZm9ybVRhYmxlUmVmPy5jdXJyZW50Py5zdWJtaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAvPgorICAgICAgICAgIDwvQ2FyZD4KKyAgICAgICAgPC9Db2w+CisgICAgICAgIDxDb2wgbGc9ezE4fSBtZD17MjR9PgorICAgICAgICAgIDxQcm9UYWJsZTxBUEkuU3lzdGVtLlVzZXI+CisgICAgICAgICAgICBoZWFkZXJUaXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgaWQ6ICdwYWdlcy5zZWFyY2hUYWJsZS50aXRsZScsCisgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5L+h5oGvJywKKyAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgYWN0aW9uUmVmPXthY3Rpb25SZWZ9CisgICAgICAgICAgICBmb3JtUmVmPXtmb3JtVGFibGVSZWZ9CisgICAgICAgICAgICByb3dLZXk9InVzZXJJZCIKKyAgICAgICAgICAgIGtleT0idXNlckxpc3QiCisgICAgICAgICAgICBzZWFyY2g9e3sKKyAgICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIHRvb2xCYXJSZW5kZXI9eygpID0+IFsKKyAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgICAga2V5PSJhZGQiCisgICAgICAgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCdzeXN0ZW06dXNlcjphZGQnKX0KKyAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgICBjb25zdCB0cmVlRGF0YSA9IGF3YWl0IGdldERlcHRUcmVlKHt9KTsKKyAgICAgICAgICAgICAgICAgIHNldERlcHRUcmVlKHRyZWVEYXRhKTsKKworICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdFJlc3AgPSBhd2FpdCBnZXRQb3N0TGlzdCgpCisgICAgICAgICAgICAgICAgICBpZiAocG9zdFJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFBvc3RMaXN0KAorICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXNwLnJvd3MubWFwKChpdGVtOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLnBvc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ucG9zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBjb25zdCByb2xlUmVzcCA9IGF3YWl0IGdldFJvbGVMaXN0KCkKKyAgICAgICAgICAgICAgICAgIGlmIChyb2xlUmVzcC5jb2RlID09PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Um9sZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgcm9sZVJlc3Aucm93cy5tYXAoKGl0ZW06IGFueSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0ucm9sZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogaXRlbS5yb2xlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgICBzZXRNb2RhbFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLm5ldyIgZGVmYXVsdE1lc3NhZ2U9IuaWsOW7uiIgLz4KKyAgICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAgICBrZXk9InJlbW92ZSIKKyAgICAgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgICAgICBoaWRkZW49e3NlbGVjdGVkUm93cz8ubGVuZ3RoID09PSAwIHx8ICFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTp1c2VyOnJlbW92ZScpfQorICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aYr+WQpuehruiupOWIoOmZpOaJgOmAieaVsOaNrumhuT8nLAorICAgICAgICAgICAgICAgICAgICBpY29uOiA8RXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCAvPiwKKyAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ+ivt+iwqOaFjuaTjeS9nCcsCisgICAgICAgICAgICAgICAgICAgIGFzeW5jIG9uT2soKSB7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgb25DYW5jZWwoKSB7IH0sCisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPERlbGV0ZU91dGxpbmVkIC8+CisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmRlbGV0ZSIgZGVmYXVsdE1lc3NhZ2U9IuWIoOmZpCIgLz4KKyAgICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAgICBrZXk9ImV4cG9ydCIKKyAgICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3N5c3RlbTp1c2VyOmV4cG9ydCcpfQorICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgIGhhbmRsZUV4cG9ydCgpOworICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8UGx1c091dGxpbmVkIC8+CisgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmV4cG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWHuiIgLz4KKyAgICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgICAgXX0KKyAgICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICAgIGdldFVzZXJMaXN0KHsgLi4ucGFyYW1zLCBkZXB0SWQ6IHNlbGVjdERlcHQuaWQgfSBhcyBBUEkuU3lzdGVtLlVzZXJMaXN0UGFyYW1zKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7CisgICAgICAgICAgICAgICAgICBkYXRhOiByZXMucm93cywKKyAgICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgICByb3dTZWxlY3Rpb249e3sKKyAgICAgICAgICAgICAgb25DaGFuZ2U6IChfLCBzZWxlY3RlZFJvd3MpID0+IHsKKyAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH19CisgICAgICAgICAgLz4KKyAgICAgICAgPC9Db2w+CisgICAgICA8L1Jvdz4KKyAgICAgIHtzZWxlY3RlZFJvd3M/Lmxlbmd0aCA+IDAgJiYgKAorICAgICAgICA8Rm9vdGVyVG9vbGJhcgorICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5jaG9zZW4iIGRlZmF1bHRNZXNzYWdlPSLlt7LpgInmi6kiIC8+CisgICAgICAgICAgICAgIDxhIHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDYwMCB9fT57c2VsZWN0ZWRSb3dzLmxlbmd0aH08L2E+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgfQorICAgICAgICA+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAga2V5PSJyZW1vdmUiCisgICAgICAgICAgICBkYW5nZXIKKyAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygnc3lzdGVtOnVzZXI6ZGVsJyl9CisgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgIE1vZGFsLmNvbmZpcm0oeworICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJywKKyAgICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l6aG55ZCX77yfJywKKyAgICAgICAgICAgICAgICBva1RleHQ6ICfnoa7orqQnLAorICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVSZW1vdmUoc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvblJlZi5jdXJyZW50Py5yZWxvYWRBbmRSZXN0Py4oKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9InBhZ2VzLnNlYXJjaFRhYmxlLmJhdGNoRGVsZXRpb24iIGRlZmF1bHRNZXNzYWdlPSLmibnph4/liKDpmaQiIC8+CisgICAgICAgICAgPC9CdXR0b24+CisgICAgICAgIDwvRm9vdGVyVG9vbGJhcj4KKyAgICAgICl9CisgICAgICA8VXBkYXRlRm9ybQorICAgICAgICBvblN1Ym1pdD17YXN5bmMgKHZhbHVlcykgPT4geworICAgICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgaWYgKHZhbHVlcy51c2VySWQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCBoYW5kbGVVcGRhdGUoeyAuLi52YWx1ZXMgfSBhcyBBUEkuU3lzdGVtLlVzZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgaGFuZGxlQWRkKHsgLi4udmFsdWVzIH0gYXMgQVBJLlN5c3RlbS5Vc2VyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldE1vZGFsVmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgc2V0Q3VycmVudFJvdyh1bmRlZmluZWQpOworICAgICAgICB9fQorICAgICAgICBvcGVuPXttb2RhbFZpc2libGV9CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgICAgc2V4T3B0aW9ucz17c2V4T3B0aW9uc30KKyAgICAgICAgc3RhdHVzT3B0aW9ucz17c3RhdHVzT3B0aW9uc30KKyAgICAgICAgcG9zdHM9e3Bvc3RMaXN0IHx8IFtdfQorICAgICAgICBwb3N0SWRzPXtwb3N0SWRzIHx8IFtdfQorICAgICAgICByb2xlcz17cm9sZUxpc3QgfHwgW119CisgICAgICAgIHJvbGVJZHM9e3JvbGVJZHMgfHwgW119CisgICAgICAgIGRlcHRzPXtkZXB0VHJlZSB8fCBbXX0KKyAgICAgIC8+CisgICAgICA8UmVzZXRQd2QKKyAgICAgICAgb25TdWJtaXQ9e2FzeW5jICh2YWx1ZXM6IGFueSkgPT4geworICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCByZXNldFVzZXJQd2QodmFsdWVzLnVzZXJJZCwgdmFsdWVzLnBhc3N3b3JkKTsKKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0UmVzZXRQd2RNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5a+G56CB6YeN572u5oiQ5Yqf44CCJyk7CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldFJlc2V0UHdkTW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17cmVzZXRQd2RNb2RhbFZpc2libGV9CisgICAgICAgIHZhbHVlcz17Y3VycmVudFJvdyB8fCB7fX0KKyAgICAgIC8+CisgICAgICA8QXV0aFJvbGVGb3JtCisgICAgICAgIG9uU3VibWl0PXthc3luYyAodmFsdWVzOiBhbnkpID0+IHsKKyAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdXBkYXRlQXV0aFJvbGUodmFsdWVzKTsKKyAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgc2V0QXV0aFJvbGVNb2RhbFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTsKKyAgICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn6YWN572u5oiQ5Yqf44CCJyk7CisgICAgICAgICAgfQorICAgICAgICB9fQorICAgICAgICBvbkNhbmNlbD17KCkgPT4geworICAgICAgICAgIHNldEF1dGhSb2xlTW9kYWxWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICBzZXRTZWxlY3RlZFJvd3MoW10pOworICAgICAgICAgIHNldEN1cnJlbnRSb3codW5kZWZpbmVkKTsKKyAgICAgICAgfX0KKyAgICAgICAgb3Blbj17YXV0aFJvbGVNb2RhbFZpc2libGV9CisgICAgICAgIHJvbGVzPXtyb2xlTGlzdCB8fCBbXX0KKyAgICAgICAgcm9sZUlkcz17cm9sZUlkcyB8fCBbXX0KKyAgICAgIC8+CisgICAgPC9QYWdlQ29udGFpbmVyPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgVXNlclRhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL0Jhc2VJbmZvLnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL0Jhc2VJbmZvLnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA0NjZmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL2NvbXBvbmVudHMvQmFzZUluZm8udHN4CkBAIC0wLDAgKzEsMTI0IEBACitpbXBvcnQgeyBCdXR0b24sIENvbCwgRm9ybSwgbWVzc2FnZSwgUm93IH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgUmVhY3QsIHsgRnJhZ21lbnQsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKK2ltcG9ydCB7IGhpc3RvcnkgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCBzdHlsZXMgZnJvbSAnLi4vc3R5bGUubGVzcyc7CitpbXBvcnQgeyBQcm9Gb3JtLCBQcm9Gb3JtVGV4dCwgUHJvRm9ybVRleHRBcmVhIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworCitleHBvcnQgdHlwZSBCYXNlSW5mb1Byb3BzID0geworICB2YWx1ZXM/OiBhbnk7CisgIG9uU3RlcFN1Ym1pdD86IGFueTsKK307CisKK2NvbnN0IEJhc2VJbmZvOiBSZWFjdC5GQzxCYXNlSW5mb1Byb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBbZm9ybV0gPSBGb3JtLnVzZUZvcm0oKTsKKyAgY29uc3QgeyBvblN0ZXBTdWJtaXQgfSA9IHByb3BzOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgZm9ybS5yZXNldEZpZWxkcygpOworICAgIGZvcm0uc2V0RmllbGRzVmFsdWUoeworICAgICAgdGFibGVOYW1lOiBwcm9wcy52YWx1ZXMudGFibGVOYW1lLAorICAgIH0pOworICB9KTsKKworICBjb25zdCBvblZhbGlkYXRlRm9ybSA9IGFzeW5jICgpID0+IHsKKyAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBmb3JtLnZhbGlkYXRlRmllbGRzKCk7CisgICAgaWYgKG9uU3RlcFN1Ym1pdCkgeworICAgICAgb25TdGVwU3VibWl0KCdiYXNlJywgdmFsdWVzKTsKKyAgICB9CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8RnJhZ21lbnQ+CisgICAgICA8Um93PgorICAgICAgICA8Q29sIHNwYW49ezI0fT4KKyAgICAgICAgICA8UHJvRm9ybQorICAgICAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgICAgIG9uRmluaXNoPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5o+Q5Lqk5oiQ5YqfJyk7CisgICAgICAgICAgICB9fQorICAgICAgICAgICAgaW5pdGlhbFZhbHVlcz17eworICAgICAgICAgICAgICB0YWJsZU5hbWU6IHByb3BzLnZhbHVlcz8udGFibGVOYW1lLAorICAgICAgICAgICAgICB0YWJsZUNvbW1lbnQ6IHByb3BzLnZhbHVlcz8udGFibGVDb21tZW50LAorICAgICAgICAgICAgICBjbGFzc05hbWU6IHByb3BzLnZhbHVlcz8uY2xhc3NOYW1lLAorICAgICAgICAgICAgICBmdW5jdGlvbkF1dGhvcjogcHJvcHMudmFsdWVzPy5mdW5jdGlvbkF1dGhvciwKKyAgICAgICAgICAgICAgcmVtYXJrOiBwcm9wcy52YWx1ZXM/LnJlbWFyaywKKyAgICAgICAgICAgIH19CisgICAgICAgICAgICBzdWJtaXR0ZXI9e3sKKyAgICAgICAgICAgICAgcmVzZXRCdXR0b25Qcm9wczogeworICAgICAgICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdub25lJyB9LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBzdWJtaXRCdXR0b25Qcm9wczogeworICAgICAgICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdub25lJyB9LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Um93PgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisKKyAgICAgICAgICAgICAgICAgIG5hbWU9InRhYmxlTmFtZSIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSLooajlkI3np7AiCisgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+ihqOWQjeensOS4jeWPr+S4uuepuuOAgicsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17Mn0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgICBuYW1lPSJ0YWJsZUNvbW1lbnQiCisgICAgICAgICAgICAgICAgICBsYWJlbD0i6KGo5o+P6L+wIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgICA8Um93PgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisKKyAgICAgICAgICAgICAgICAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSLlrp7kvZPnsbvlkI3np7AiCisgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+WunuS9k+exu+WQjeensOS4jeWPr+S4uuepuuOAgicsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17Mn0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0IG5hbWU9ImZ1bmN0aW9uQXV0aG9yIiBsYWJlbD0i5L2c6ICFIiAvPgorICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgIDwvUm93PgorICAgICAgICAgICAgPFJvdz4KKyAgICAgICAgICAgICAgPENvbCBzcGFuPXsyNH0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0QXJlYSBuYW1lPSJyZW1hcmsiIGxhYmVsPSLlpIfms6giIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgPC9Qcm9Gb3JtPgorICAgICAgICA8L0NvbD4KKyAgICAgIDwvUm93PgorICAgICAgPFJvdyBqdXN0aWZ5PSJjZW50ZXIiPgorICAgICAgICA8Q29sIHNwYW49ezR9PgorICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5zdGVwX2J1dHRvbnN9CisgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICAgIGhpc3RvcnkuYmFjaygpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICDov5Tlm54KKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Db2w+CisgICAgICAgIDxDb2wgc3Bhbj17NH0+CisgICAgICAgICAgPEJ1dHRvbiB0eXBlPSJwcmltYXJ5IiBvbkNsaWNrPXtvblZhbGlkYXRlRm9ybX0+CisgICAgICAgICAgICDkuIvkuIDmraUKKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Db2w+CisgICAgICA8L1Jvdz4KKyAgICA8L0ZyYWdtZW50PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgQmFzZUluZm87CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vY29tcG9uZW50cy9Db2x1bW5JbmZvLnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL0NvbHVtbkluZm8udHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjVkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vY29tcG9uZW50cy9Db2x1bW5JbmZvLnRzeApAQCAtMCwwICsxLDMwNCBAQAoraW1wb3J0IFJlYWN0LCB7IEZyYWdtZW50LCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgdHlwZSB7IEdlbkNvZGVUeXBlIH0gZnJvbSAnLi4vZGF0YSc7CitpbXBvcnQgeyBCdXR0b24sIENoZWNrYm94LCBDb2wsIFJvdywgVGFnIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgdHlwZSB7IEZvcm1JbnN0YW5jZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgaGlzdG9yeSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHN0eWxlcyBmcm9tICcuLi9zdHlsZS5sZXNzJzsKK2ltcG9ydCB7IEVkaXRhYmxlUHJvVGFibGUsIFByb0NvbHVtbnMgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CisKK2V4cG9ydCB0eXBlIENvbHVtbkluZm9Qcm9wcyA9IHsKKyAgcGFyZW50VHlwZT86IHN0cmluZzsKKyAgZGF0YT86IGFueVtdOworICBkaWN0RGF0YT86IGFueVtdOworICBvblN0ZXBTdWJtaXQ/OiBhbnk7Cit9OworCitjb25zdCBib29sZWFuRW51bSA9IFsKKyAgeworICAgIGxhYmVsOiAndHJ1ZScsCisgICAgdmFsdWU6ICcxJywKKyAgfSwKKyAgeworICAgIGxhYmVsOiAnZmFsc2UnLAorICAgIHZhbHVlOiAnMCcsCisgIH0sCitdOworCitjb25zdCBDb2x1bW5JbmZvOiBSZWFjdC5GQzxDb2x1bW5JbmZvUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWY8Rm9ybUluc3RhbmNlPigpOworCisgIGNvbnN0IFtkYXRhU291cmNlLCBzZXREYXRhU291cmNlXSA9IHVzZVN0YXRlPGFueVtdPigpOworCisgIGNvbnN0IFtlZGl0YWJsZUtleXMsIHNldEVkaXRhYmxlUm93S2V5c10gPSB1c2VTdGF0ZTxSZWFjdC5LZXlbXT4oW10pOworCisgIGNvbnN0IHsgZGF0YSwgZGljdERhdGEsIG9uU3RlcFN1Ym1pdCB9ID0gcHJvcHM7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxHZW5Db2RlVHlwZT5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogJ+e8luWPtycsCisgICAgICBkYXRhSW5kZXg6ICdjb2x1bW5JZCcsCisgICAgICBlZGl0YWJsZTogZmFsc2UsCisgICAgICB3aWR0aDogODAsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+Wtl+auteWQjScsCisgICAgICBkYXRhSW5kZXg6ICdjb2x1bW5OYW1lJywKKyAgICAgIGVkaXRhYmxlOiBmYWxzZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5a2X5q615o+P6L+wJywKKyAgICAgIGRhdGFJbmRleDogJ2NvbHVtbkNvbW1lbnQnLAorICAgICAgaGlkZUluRm9ybTogdHJ1ZSwKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICAgIHdpZHRoOiAyMDAsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+Wtl+auteexu+WeiycsCisgICAgICBkYXRhSW5kZXg6ICdjb2x1bW5UeXBlJywKKyAgICAgIGVkaXRhYmxlOiBmYWxzZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAnSmF2Yeexu+WeiycsCisgICAgICBkYXRhSW5kZXg6ICdqYXZhVHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiB7CisgICAgICAgIExvbmc6IHsKKyAgICAgICAgICB0ZXh0OiAnTG9uZycsCisgICAgICAgIH0sCisgICAgICAgIFN0cmluZzogeworICAgICAgICAgIHRleHQ6ICdTdHJpbmcnLAorICAgICAgICB9LAorICAgICAgICBJbnRlZ2VyOiB7CisgICAgICAgICAgdGV4dDogJ0ludGVnZXInLAorICAgICAgICB9LAorICAgICAgICBEb3VibGU6IHsKKyAgICAgICAgICB0ZXh0OiAnRG91YmxlJywKKyAgICAgICAgfSwKKyAgICAgICAgQmlnRGVjaW1hbDogeworICAgICAgICAgIHRleHQ6ICdCaWdEZWNpbWFsJywKKyAgICAgICAgfSwKKyAgICAgICAgRGF0ZTogeworICAgICAgICAgIHRleHQ6ICdEYXRlJywKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ0phdmHlsZ7mgKcnLAorICAgICAgZGF0YUluZGV4OiAnamF2YUZpZWxkJywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5o+S5YWlJywKKyAgICAgIGRhdGFJbmRleDogJ2lzSW5zZXJ0JywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICBmaWVsZFByb3BzOiB7CisgICAgICAgIG9wdGlvbnM6IGJvb2xlYW5FbnVtLAorICAgICAgfSwKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gPENoZWNrYm94IGNoZWNrZWQ9e3JlY29yZC5pc0luc2VydCA9PT0gJzEnfSAvPjsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+e8lui+kScsCisgICAgICBkYXRhSW5kZXg6ICdpc0VkaXQnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIGZpZWxkUHJvcHM6IHsKKyAgICAgICAgb3B0aW9uczogYm9vbGVhbkVudW0sCisgICAgICB9LAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiA8Q2hlY2tib3ggY2hlY2tlZD17cmVjb3JkLmlzRWRpdCA9PT0gJzEnfSAvPjsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+WIl+ihqCcsCisgICAgICBkYXRhSW5kZXg6ICdpc0xpc3QnLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIGZpZWxkUHJvcHM6IHsKKyAgICAgICAgb3B0aW9uczogYm9vbGVhbkVudW0sCisgICAgICB9LAorICAgICAgcmVuZGVyOiAoXywgcmVjb3JkKSA9PiB7CisgICAgICAgIHJldHVybiA8Q2hlY2tib3ggY2hlY2tlZD17cmVjb3JkLmlzTGlzdCA9PT0gJzEnfSAvPjsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+afpeivoicsCisgICAgICBkYXRhSW5kZXg6ICdpc1F1ZXJ5JywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICBmaWVsZFByb3BzOiB7CisgICAgICAgIG9wdGlvbnM6IGJvb2xlYW5FbnVtLAorICAgICAgfSwKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gPENoZWNrYm94IGNoZWNrZWQ9e3JlY29yZC5pc1F1ZXJ5ID09PSAnMSd9IC8+OworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5p+l6K+i5pa55byPJywKKyAgICAgIGRhdGFJbmRleDogJ3F1ZXJ5VHlwZScsCisgICAgICB2YWx1ZVR5cGU6ICdzZWxlY3QnLAorICAgICAgdmFsdWVFbnVtOiB7CisgICAgICAgIEVROiB7CisgICAgICAgICAgdGV4dDogJz0nLAorICAgICAgICB9LAorICAgICAgICBORTogeworICAgICAgICAgIHRleHQ6ICchPScsCisgICAgICAgIH0sCisgICAgICAgIEdUOiB7CisgICAgICAgICAgdGV4dDogJz4nLAorICAgICAgICB9LAorICAgICAgICBHVEU6IHsKKyAgICAgICAgICB0ZXh0OiAnPj0nLAorICAgICAgICB9LAorICAgICAgICBMVDogeworICAgICAgICAgIHRleHQ6ICc8JywKKyAgICAgICAgfSwKKyAgICAgICAgTFRFOiB7CisgICAgICAgICAgdGV4dDogJzw9JywKKyAgICAgICAgfSwKKyAgICAgICAgTElLRTogeworICAgICAgICAgIHRleHQ6ICdMSUtFJywKKyAgICAgICAgfSwKKyAgICAgICAgQkVUV0VFTjogeworICAgICAgICAgIHRleHQ6ICdCRVRXRUVOJywKKyAgICAgICAgfSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+W/heWhqycsCisgICAgICBkYXRhSW5kZXg6ICdpc1JlcXVpcmVkJywKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICBmaWVsZFByb3BzOiB7CisgICAgICAgIG9wdGlvbnM6IGJvb2xlYW5FbnVtLAorICAgICAgfSwKKyAgICAgIHJlbmRlcjogKF8sIHJlY29yZCkgPT4geworICAgICAgICByZXR1cm4gPENoZWNrYm94IGNoZWNrZWQ9e3JlY29yZC5pc1JlcXVpcmVkID09PSAnMSd9IC8+OworICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5pi+56S657G75Z6LJywKKyAgICAgIGRhdGFJbmRleDogJ2h0bWxUeXBlJywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICAgIHZhbHVlVHlwZTogJ3NlbGVjdCcsCisgICAgICB2YWx1ZUVudW06IHsKKyAgICAgICAgaW5wdXQ6IHsKKyAgICAgICAgICB0ZXh0OiAn5paH5pys5qGGJywKKyAgICAgICAgfSwKKyAgICAgICAgdGV4dGFyZWE6IHsKKyAgICAgICAgICB0ZXh0OiAn5paH5pys5Z+fJywKKyAgICAgICAgfSwKKyAgICAgICAgc2VsZWN0OiB7CisgICAgICAgICAgdGV4dDogJ+S4i+aLieahhicsCisgICAgICAgIH0sCisgICAgICAgIHJhZGlvOiB7CisgICAgICAgICAgdGV4dDogJ+WNlemAieahhicsCisgICAgICAgIH0sCisgICAgICAgIGNoZWNrYm94OiB7CisgICAgICAgICAgdGV4dDogJ+WkjemAieahhicsCisgICAgICAgIH0sCisgICAgICAgIGRhdGV0aW1lOiB7CisgICAgICAgICAgdGV4dDogJ+aXpeacn+aOp+S7ticsCisgICAgICAgIH0sCisgICAgICAgIGltYWdlVXBsb2FkOiB7CisgICAgICAgICAgdGV4dDogJ+WbvueJh+S4iuS8oCcsCisgICAgICAgIH0sCisgICAgICAgIGZpbGVVcGxvYWQ6IHsKKyAgICAgICAgICB0ZXh0OiAn5paH5Lu25LiK5LygJywKKyAgICAgICAgfSwKKyAgICAgICAgZWRpdG9yOiB7CisgICAgICAgICAgdGV4dDogJ+WvjOaWh+acrOaOp+S7ticsCisgICAgICAgIH0sCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6ICflrZflhbjnsbvlnosnLAorICAgICAgZGF0YUluZGV4OiAnZGljdFR5cGUnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgICAgdmFsdWVUeXBlOiAnc2VsZWN0JywKKyAgICAgIGZpZWxkUHJvcHM6IHsKKyAgICAgICAgb3B0aW9uczogZGljdERhdGEsCisgICAgICB9LAorICAgICAgcmVuZGVyOiAodGV4dCkgPT4geworICAgICAgICByZXR1cm4gPFRhZyBjb2xvcj0iIzEwOGVlOSI+e3RleHR9PC9UYWc+OworICAgICAgfSwKKyAgICB9LAorICBdOworCisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgc2V0RGF0YVNvdXJjZShkYXRhKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgc2V0RWRpdGFibGVSb3dLZXlzKGRhdGEubWFwKChpdGVtKSA9PiBpdGVtLmNvbHVtbklkKSk7CisgICAgfQorICB9LCBbZGF0YV0pOworCisgIGNvbnN0IG9uU3VibWl0ID0gKGRpcmVjdGlvbjogc3RyaW5nKSA9PiB7CisgICAgaWYgKG9uU3RlcFN1Ym1pdCkgeworICAgICAgb25TdGVwU3VibWl0KCdjb2x1bW4nLCBkYXRhU291cmNlLCBkaXJlY3Rpb24pOworICAgIH0KKyAgfTsKKworICBjb25zdCBvbkRhdGFDaGFuZ2UgPSAodmFsdWU6IHJlYWRvbmx5IEdlbkNvZGVUeXBlW10pID0+IHsKKyAgICBzZXREYXRhU291cmNlKHsgLi4udmFsdWUgfSBhcyBbXSk7CisgIH07CisKKyAgcmV0dXJuICgKKyAgICA8RnJhZ21lbnQ+CisgICAgICA8Um93PgorICAgICAgICA8Q29sIHNwYW49ezI0fT4KKyAgICAgICAgICA8RWRpdGFibGVQcm9UYWJsZTxHZW5Db2RlVHlwZT4KKyAgICAgICAgICAgIGZvcm1SZWY9e2Zvcm1SZWZ9CisgICAgICAgICAgICByb3dLZXk9ImNvbHVtbklkIgorICAgICAgICAgICAgc2VhcmNoPXtmYWxzZX0KKyAgICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgICB2YWx1ZT17ZGF0YVNvdXJjZX0KKyAgICAgICAgICAgIGVkaXRhYmxlPXt7CisgICAgICAgICAgICAgIHR5cGU6ICdtdWx0aXBsZScsCisgICAgICAgICAgICAgIGVkaXRhYmxlS2V5cywKKyAgICAgICAgICAgICAgb25DaGFuZ2U6IHNldEVkaXRhYmxlUm93S2V5cywKKyAgICAgICAgICAgICAgYWN0aW9uUmVuZGVyOiAocm93LCBjb25maWcsIGRlZmF1bHREb21zKSA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFtkZWZhdWx0RG9tcy5kZWxldGVdOworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBvblZhbHVlc0NoYW5nZTogKHJlY29yZCwgcmVjb3JkTGlzdCkgPT4geworICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UocmVjb3JkTGlzdCk7CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9fQorICAgICAgICAgICAgb25DaGFuZ2U9e29uRGF0YUNoYW5nZX0KKyAgICAgICAgICAgIHJlY29yZENyZWF0b3JQcm9wcz17ZmFsc2V9CisgICAgICAgICAgLz4KKyAgICAgICAgPC9Db2w+CisgICAgICA8L1Jvdz4KKyAgICAgIDxSb3cganVzdGlmeT0iY2VudGVyIj4KKyAgICAgICAgPENvbCBzcGFuPXs0fT4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgICBoaXN0b3J5LmJhY2soKTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAg6L+U5ZueCisgICAgICAgICAgPC9CdXR0b24+CisgICAgICAgIDwvQ29sPgorICAgICAgICA8Q29sIHNwYW49ezR9PgorICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5zdGVwX2J1dHRvbnN9CisgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICAgIG9uU3VibWl0KCdwcmV2Jyk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIOS4iuS4gOatpQorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0NvbD4KKyAgICAgICAgPENvbCBzcGFuPXs0fT4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgICBvblN1Ym1pdCgnbmV4dCcpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICDkuIvkuIDmraUKKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Db2w+CisgICAgICA8L1Jvdz4KKyAgICA8L0ZyYWdtZW50PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgQ29sdW1uSW5mbzsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL0dlbkluZm8udHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL2NvbXBvbmVudHMvR2VuSW5mby50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5MDFlYwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL0dlbkluZm8udHN4CkBAIC0wLDAgKzEsMzMwIEBACitpbXBvcnQgeyBCdXR0b24sIENvbCwgRGl2aWRlciwgRm9ybSwgUm93LCBUcmVlU2VsZWN0IH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgUmVhY3QsIHsgRnJhZ21lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgdHlwZSB7IFRhYmxlSW5mbyB9IGZyb20gJy4uL2RhdGEnOworaW1wb3J0IHN0eWxlcyBmcm9tICcuLi9zdHlsZS5sZXNzJzsKK2ltcG9ydCB7IERhdGFOb2RlIH0gZnJvbSAnYW50ZC9lcy90cmVlJzsKK2ltcG9ydCB7IFByb0Zvcm0sIFByb0Zvcm1SYWRpbywgUHJvRm9ybVNlbGVjdCwgUHJvRm9ybVRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CisKK2V4cG9ydCB0eXBlIEdlbkluZm9Qcm9wcyA9IHsKKyAgdmFsdWVzPzogYW55OworICBtZW51RGF0YT86IERhdGFOb2RlW107CisgIHRhYmxlSW5mbz86IFRhYmxlSW5mb1tdOworICBvblN0ZXBTdWJtaXQ/OiBhbnk7Cit9OworCitjb25zdCBHZW5JbmZvOiBSZWFjdC5GQzxHZW5JbmZvUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgIGNvbnN0IFtmb3JtXSA9IEZvcm0udXNlRm9ybSgpOworCisgIGNvbnN0IFtwYXRoVHlwZSwgc2V0UGF0aFR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPignMCcpOworICBjb25zdCBbdGxwVHlwZSwgc2V0VGxwVHlwZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCdjdXJkJyk7CisKKyAgY29uc3QgW3N1YlRhYmxlc0NvbHVtbk9wdGlvbnMsIHNldFN1YlRhYmxlc0NvbHVtbk9wdGlvbnNdID0gdXNlU3RhdGU8YW55W10+KCk7CisKKyAgY29uc3QgeyBtZW51RGF0YSwgdGFibGVJbmZvLCBvblN0ZXBTdWJtaXQgfSA9IHByb3BzOworCisgIGNvbnN0IHRhYmxlc09wdGlvbnMgPSB0YWJsZUluZm8/Lm1hcCgoaXRlbTogYW55KSA9PiB7CisgICAgcmV0dXJuIHsKKyAgICAgIHZhbHVlOiBpdGVtLnRhYmxlTmFtZSwKKyAgICAgIGxhYmVsOiBgJHtpdGVtLnRhYmxlTmFtZX3vvJoke2l0ZW0udGFibGVDb21tZW50fWAsCisgICAgfTsKKyAgfSk7CisKKyAgaWYgKHRhYmxlSW5mbykgeworICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZUluZm8/Lmxlbmd0aDsgaW5kZXggKz0gMSkgeworICAgICAgY29uc3QgdGJsID0gdGFibGVJbmZvW2luZGV4XTsKKyAgICAgIGlmICh0YmwudGFibGVOYW1lID09PSBwcm9wcy52YWx1ZXMuc3ViVGFibGVOYW1lKSB7CisgICAgICAgIGNvbnN0IG9wdHMgPSBbXTsKKyAgICAgICAgdGJsLmNvbHVtbnMuZm9yRWFjaCgoaXRlbSkgPT4geworICAgICAgICAgIG9wdHMucHVzaCh7CisgICAgICAgICAgICB2YWx1ZTogaXRlbS5jb2x1bW5OYW1lLAorICAgICAgICAgICAgbGFiZWw6IGAke2l0ZW0uY29sdW1uTmFtZX06ICR7aXRlbS5jb2x1bW5Db21tZW50fWAsCisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb25zdCB0cmVlQ29sdW1ucyA9IHByb3BzLnZhbHVlcy5jb2x1bW5zLm1hcCgoaXRlbTogYW55KSA9PiB7CisgICAgcmV0dXJuIHsKKyAgICAgIHZhbHVlOiBpdGVtLmNvbHVtbk5hbWUsCisgICAgICBsYWJlbDogYCR7aXRlbS5jb2x1bW5OYW1lfTogJHtpdGVtLmNvbHVtbkNvbW1lbnR9YCwKKyAgICB9OworICB9KTsKKworICBjb25zdCBvblN1Ym1pdCA9IGFzeW5jIChkaXJlY3Rpb246IHN0cmluZykgPT4geworICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IGZvcm0udmFsaWRhdGVGaWVsZHMoKTsKKyAgICBvblN0ZXBTdWJtaXQoJ2dlbicsIHZhbHVlcywgZGlyZWN0aW9uKTsKKyAgfTsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIHNldFBhdGhUeXBlKHByb3BzLnZhbHVlcy5nZW5UeXBlKTsKKyAgICBzZXRUbHBUeXBlKHByb3BzLnZhbHVlcy50cGxDYXRlZ29yeSk7CisgIH0sIFtwcm9wcy52YWx1ZXMuZ2VuVHlwZSwgcHJvcHMudmFsdWVzLnRwbENhdGVnb3J5XSk7CisKKyAgcmV0dXJuICgKKyAgICA8RnJhZ21lbnQ+CisgICAgICA8Um93PgorICAgICAgICA8Q29sIHNwYW49ezI0fT4KKyAgICAgICAgICA8UHJvRm9ybQorICAgICAgICAgICAgZm9ybT17Zm9ybX0KKyAgICAgICAgICAgIG9uRmluaXNoPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IGZvcm0udmFsaWRhdGVGaWVsZHMoKTsKKyAgICAgICAgICAgICAgb25TdGVwU3VibWl0KCdnZW4nLCB2YWx1ZXMpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIGluaXRpYWxWYWx1ZXM9e3sKKyAgICAgICAgICAgICAgY3VyZDogcHJvcHMudmFsdWVzLmN1cmQsCisgICAgICAgICAgICAgIHRyZWU6IHByb3BzLnZhbHVlcy50cmVlLAorICAgICAgICAgICAgICBzdWI6IHByb3BzLnZhbHVlcy5zdWIsCisgICAgICAgICAgICAgIHRwbENhdGVnb3J5OiBwcm9wcy52YWx1ZXMudHBsQ2F0ZWdvcnksCisgICAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBwcm9wcy52YWx1ZXMucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IHByb3BzLnZhbHVlcy5tb2R1bGVOYW1lLAorICAgICAgICAgICAgICBidXNpbmVzc05hbWU6IHByb3BzLnZhbHVlcy5idXNpbmVzc05hbWUsCisgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMudmFsdWVzLmZ1bmN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgcGFyZW50TWVudUlkOiBwcm9wcy52YWx1ZXMucGFyZW50TWVudUlkLAorICAgICAgICAgICAgICBnZW5UeXBlOiBwcm9wcy52YWx1ZXMuZ2VuVHlwZSwKKyAgICAgICAgICAgICAgZ2VuUGF0aDogcHJvcHMudmFsdWVzLmdlblBhdGgsCisgICAgICAgICAgICAgIHRyZWVDb2RlOiBwcm9wcy52YWx1ZXMudHJlZUNvZGUsCisgICAgICAgICAgICAgIHRyZWVQYXJlbnRDb2RlOiBwcm9wcy52YWx1ZXMudHJlZVBhcmVudENvZGUsCisgICAgICAgICAgICAgIHRyZWVOYW1lOiBwcm9wcy52YWx1ZXMudHJlZU5hbWUsCisgICAgICAgICAgICAgIHN1YlRhYmxlTmFtZTogcHJvcHMudmFsdWVzLnN1YlRhYmxlTmFtZSwKKyAgICAgICAgICAgICAgc3ViVGFibGVGa05hbWU6IHByb3BzLnZhbHVlcy5zdWJUYWJsZUZrTmFtZSwKKyAgICAgICAgICAgIH19CisgICAgICAgICAgICBzdWJtaXR0ZXI9e3sKKyAgICAgICAgICAgICAgcmVzZXRCdXR0b25Qcm9wczogeworICAgICAgICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdub25lJyB9LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBzdWJtaXRCdXR0b25Qcm9wczogeworICAgICAgICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6ICdub25lJyB9LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8Um93IGd1dHRlcj17WzE2LCAxNl19PgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1TZWxlY3QKKyAgICAgICAgICAgICAgICAgIGZpZWxkUHJvcHM9e3sKKyAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U6ICh2YWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRUbHBUeXBlKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICAgdmFsdWVFbnVtPXt7CisgICAgICAgICAgICAgICAgICAgIGNydWQ6ICfljZXooajvvIjlop7liKDmlLnmn6XvvIknLAorICAgICAgICAgICAgICAgICAgICB0cmVlOiAn5qCR6KGo77yI5aKe5Yig5pS55p+l77yJJywKKyAgICAgICAgICAgICAgICAgICAgc3ViOiAn5Li75a2Q6KGo77yI5aKe5Yig5pS55p+l77yJJywKKyAgICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgICBuYW1lPSJ0cGxDYXRlZ29yeSIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSLnlJ/miJDmqKHmnb8iCisgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+mAieaLqeexu+WeiycsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17Mn0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0IG5hbWU9InBhY2thZ2VOYW1lIiBsYWJlbD0i55Sf5oiQ5YyF6Lev5b6EIiAvPgorICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgIDwvUm93PgorICAgICAgICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgICAgICAgPENvbCBzcGFuPXsxMn0gb3JkZXI9ezF9PgorICAgICAgICAgICAgICAgIDxQcm9Gb3JtVGV4dCBuYW1lPSJtb2R1bGVOYW1lIiBsYWJlbD0i55Sf5oiQ5qih5Z2X5ZCNIiAvPgorICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgPENvbCBzcGFuPXsxMn0gb3JkZXI9ezJ9PgorICAgICAgICAgICAgICAgIDxQcm9Gb3JtVGV4dCBuYW1lPSJidXNpbmVzc05hbWUiIGxhYmVsPSLnlJ/miJDkuJrliqHlkI0iIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgICA8Um93IGd1dHRlcj17WzE2LCAxNl19PgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0IG5hbWU9ImZ1bmN0aW9uTmFtZSIgbGFiZWw9IueUn+aIkOWKn+iDveWQjSIgLz4KKyAgICAgICAgICAgICAgPC9Db2w+CisgICAgICAgICAgICAgIDxDb2wgc3Bhbj17MTJ9IG9yZGVyPXsyfT4KKyAgICAgICAgICAgICAgICA8UHJvRm9ybS5JdGVtCisgICAgICAgICAgICAgICAgICBsYWJlbENvbD17eyBzcGFuOiAyMCB9fQorICAgICAgICAgICAgICAgICAgbmFtZT0icGFyZW50TWVudUlkIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IueItuiPnOWNlSIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICA8VHJlZVNlbGVjdAorICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogJzc0JScgfX0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtwcm9wcy52YWx1ZXMucGFyZW50TWVudUlkfQorICAgICAgICAgICAgICAgICAgICB0cmVlRGF0YT17bWVudURhdGF9CisgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fpgInmi6nniLboj5zljZUiCisgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDwvUHJvRm9ybS5JdGVtPgorICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgIDwvUm93PgorICAgICAgICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgICAgICAgPENvbCBzcGFuPXsyNH0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1SYWRpby5Hcm91cAorICAgICAgICAgICAgICAgICAgdmFsdWVFbnVtPXt7CisgICAgICAgICAgICAgICAgICAgICcwJzogJ3ppcOWOi+e8qeWMhScsCisgICAgICAgICAgICAgICAgICAgICcxJzogJ+iHquWumuS5iei3r+W+hCcsCisgICAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICAgbmFtZT0iZ2VuVHlwZSIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSLnlJ/miJDku6PnoIHmlrnlvI8iCisgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+mAieaLqeexu+WeiycsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgICAgZmllbGRQcm9wcz17eworICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICBzZXRQYXRoVHlwZShlLnRhcmdldC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgICA8Um93IGd1dHRlcj17WzE2LCAxNl19PgorICAgICAgICAgICAgICA8Q29sIHNwYW49ezI0fSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgICBoaWRkZW49e3BhdGhUeXBlID09PSAnMCd9CisgICAgICAgICAgICAgICAgICB3aWR0aD0ibWQiCisgICAgICAgICAgICAgICAgICBuYW1lPSJnZW5QYXRoIgorICAgICAgICAgICAgICAgICAgbGFiZWw9IuiHquWumuS5iei3r+W+hCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgIDwvUm93PgorICAgICAgICAgICAgPGRpdiBoaWRkZW49e3RscFR5cGUgIT09ICd0cmVlJ30+CisgICAgICAgICAgICAgIDxEaXZpZGVyIG9yaWVudGF0aW9uPSJsZWZ0Ij7lhbbku5bkv6Hmga88L0RpdmlkZXI+CisgICAgICAgICAgICAgIDxSb3cgZ3V0dGVyPXtbMTYsIDE2XX0+CisgICAgICAgICAgICAgICAgPENvbCBzcGFuPXsxMn0gb3JkZXI9ezF9PgorICAgICAgICAgICAgICAgICAgPFByb0Zvcm1TZWxlY3QKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0idHJlZUNvZGUiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPSLmoJHnvJbnoIHlrZfmrrUiCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3RyZWVDb2x1bW5zfQorICAgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0bHBUeXBlID09PSAndHJlZScsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5qCR57yW56CB5a2X5q61JywKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17Mn0+CisgICAgICAgICAgICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0cmVlUGFyZW50Q29kZSIKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9IuagkeeItue8lueggeWtl+autSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17dHJlZUNvbHVtbnN9CisgICAgICAgICAgICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRscFR5cGUgPT09ICd0cmVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfmoJHniLbnvJbnoIHlrZfmrrUnLAorICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICA8L1Jvdz4KKyAgICAgICAgICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0cmVlTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9IuagkeWQjeensOWtl+autSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17dHJlZUNvbHVtbnN9CisgICAgICAgICAgICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRscFR5cGUgPT09ICd0cmVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfmoJHlkI3np7DlrZfmrrUnLAorICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDwvQ29sPgorICAgICAgICAgICAgICA8L1Jvdz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBoaWRkZW49e3RscFR5cGUgIT09ICdzdWInfT4KKyAgICAgICAgICAgICAgPERpdmlkZXIgb3JpZW50YXRpb249ImxlZnQiPuWFs+iBlOS/oeaBrzwvRGl2aWRlcj4KKyAgICAgICAgICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJzdWJUYWJsZU5hbWUiCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPSLlhbPogZTlrZDooajnmoTooajlkI0iCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3RhYmxlc09wdGlvbnN9CisgICAgICAgICAgICAgICAgICAgIHJ1bGVzPXtbCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRscFR5cGUgPT09ICdzdWInLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+WFs+iBlOWtkOihqOeahOihqOWQjScsCisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgICAgICAgZmllbGRQcm9wcz17eworICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAodmFsKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnNldEZpZWxkc1ZhbHVlKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFibGVGa05hbWU6ICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZUluZm8/Lmxlbmd0aDsgaW5kZXggKz0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRibCA9IHRhYmxlSW5mb1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRibC50YWJsZU5hbWUgPT09IHZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0czogYW55W10gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibC5jb2x1bW5zLmZvckVhY2goKGl0ZW0pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5jb2x1bW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtpdGVtLmNvbHVtbk5hbWV977yaJHtpdGVtLmNvbHVtbkNvbW1lbnR9YCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN1YlRhYmxlc0NvbHVtbk9wdGlvbnMob3B0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17Mn0+CisgICAgICAgICAgICAgICAgICA8UHJvRm9ybVNlbGVjdAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJzdWJUYWJsZUZrTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17c3ViVGFibGVzQ29sdW1uT3B0aW9uc30KKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9IuWtkOihqOWFs+iBlOeahOWklumUruWQjSIKKyAgICAgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdGxwVHlwZSA9PT0gJ3N1YicsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5a2Q6KGo5YWz6IGU55qE5aSW6ZSu5ZCNJywKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L1Byb0Zvcm0+CisgICAgICAgIDwvQ29sPgorICAgICAgPC9Sb3c+CisgICAgICA8Um93IGp1c3RpZnk9ImNlbnRlciI+CisgICAgICAgIDxDb2wgc3Bhbj17NH0+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgICAgaGlzdG9yeS5iYWNrKCk7CisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIOi/lOWbngorICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICA8L0NvbD4KKyAgICAgICAgPENvbCBzcGFuPXs0fT4KKyAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc3RlcF9idXR0b25zfQorICAgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgICBvblN1Ym1pdCgncHJldicpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICDkuIrkuIDmraUKKyAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgPC9Db2w+CisgICAgICAgIDxDb2wgc3Bhbj17NH0+CisgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgICAgb25TdWJtaXQoJ25leHQnKTsKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAg5o+Q5LqkCisgICAgICAgICAgPC9CdXR0b24+CisgICAgICAgIDwvQ29sPgorICAgICAgPC9Sb3c+CisgICAgPC9GcmFnbWVudD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IEdlbkluZm87CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vY29tcG9uZW50cy9QcmV2aWV3Q29kZS50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vY29tcG9uZW50cy9QcmV2aWV3Q29kZS50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2MTFhZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9jb21wb25lbnRzL1ByZXZpZXdDb2RlLnRzeApAQCAtMCwwICsxLDUwIEBACitpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgdXNlSW50bCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgTW9kYWwsIFRhYnMgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB0eXBlIHsgVGFic1Byb3BzIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgSGlnaGxpZ2h0IGZyb20gJ3JlYWN0LWhpZ2hsaWdodCc7CitpbXBvcnQgJ2hpZ2hsaWdodC5qcy9zdHlsZXMvYmFzZTE2L21hdGVyaWFsLmNzcyc7CisKK2ludGVyZmFjZSBQcmV2aWV3VGFibGVQcm9wcyB7CisgIG9wZW46IGJvb2xlYW47CisgIGRhdGE/OiBhbnk7CisgIG9uSGlkZTogKCkgPT4gdm9pZDsKK30KKworY29uc3QgUHJldmlld1RhYmxlQ29kZTogUmVhY3QuRkM8UHJldmlld1RhYmxlUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IHBhbmVzOiBhbnkgPSBbXTsKKyAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzLmRhdGEpOworICBrZXlzLmZvckVhY2goKGtleSkgPT4geworICAgIHBhbmVzLnB1c2goeworICAgICAgICBrZXk6IGtleSArICcxJywKKyAgICAgICAgbGFiZWw6IGtleS5zdWJzdHJpbmcoa2V5Lmxhc3RJbmRleE9mKCcvJykgKyAxLCBrZXkuaW5kZXhPZignLnZtJykpLAorICAgICAgICBjaGlsZHJlbjogPEhpZ2hsaWdodCBjbGFzc05hbWU9ImphdmEiPntwcm9wcy5kYXRhW2tleV19PC9IaWdobGlnaHQ+LAorICAgICAgfSBhcyBUYWJzUHJvcHMpOworICB9KTsKKworICB1c2VFZmZlY3QoKCkgPT4ge30sIFtdKTsKKworICByZXR1cm4gKAorICAgIDxNb2RhbAorICAgICAgd2lkdGg9ezkwMH0KKyAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICBpZDogJ2dlbi5wcmV2aWV3JywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfpooTop4gnLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIGZvb3Rlcj17ZmFsc2V9CisgICAgICBvbk9rPXsoKSA9PiB7CisgICAgICAgIHByb3BzLm9uSGlkZSgpOworICAgICAgfX0KKyAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7CisgICAgICAgIHByb3BzLm9uSGlkZSgpOworICAgICAgfX0KKyAgICA+CisgICAgICA8VGFicyBkZWZhdWx0QWN0aXZlS2V5PSIxIiBpdGVtcz17cGFuZXN9PjwvVGFicz4KKyAgICA8L01vZGFsPgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgUHJldmlld1RhYmxlQ29kZTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9kYXRhLmQudHMgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vZGF0YS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2VhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vZGF0YS5kLnRzCkBAIC0wLDAgKzEsMTA2IEBACitleHBvcnQgdHlwZSBHZW5Db2RlVHlwZSA9IHsKKyAgY29sdW1uSWQ6IHN0cmluZzsKKyAgYnVzaW5lc3NOYW1lOiBzdHJpbmc7CisgIGNsYXNzTmFtZTogc3RyaW5nOworICBjcmVhdGVCeTogc3RyaW5nOworICBjcmVhdGVUaW1lOiBzdHJpbmc7CisgIGNydWQ6IHN0cmluZzsKKyAgZnVuY3Rpb25BdXRob3I6IHN0cmluZzsKKyAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7CisgIGdlblBhdGg6IHN0cmluZzsKKyAgZ2VuVHlwZTogc3RyaW5nOworICBtb2R1bGVOYW1lOiBzdHJpbmc7CisgIG9wdGlvbnM6IHN0cmluZzsKKyAgcGFja2FnZU5hbWU6IHN0cmluZzsKKyAgcGFyYW1zOiBzdHJpbmc7CisgIHBhcmVudE1lbnVJZDogc3RyaW5nOworICBwYXJlbnRNZW51TmFtZTogc3RyaW5nOworICByZW1hcms6IHN0cmluZzsKKyAgc3RhdHVzOiBzdHJpbmc7CisgIGlzTGlzdDogc3RyaW5nOworICBpc0VkaXQ6IHN0cmluZzsKKyAgaXNRdWVyeTogc3RyaW5nOworICBpc0luc2VydDogc3RyaW5nOworICBpc1JlcXVpcmVkOiBzdHJpbmc7CisgIHRhYmxlQ29tbWVudDogc3RyaW5nOworICB0YWJsZUlkOiBzdHJpbmc7CisgIHRhYmxlTmFtZTogc3RyaW5nOworICB0cGxDYXRlZ29yeTogc3RyaW5nOworICB0cmVlOiBzdHJpbmc7CisgIHRyZWVDb2RlOiBudW1iZXI7CisgIHRyZWVOYW1lOiBzdHJpbmc7CisgIHRyZWVQYXJlbnRDb2RlOiBudW1iZXI7CisgIHVwZGF0ZUJ5OiBzdHJpbmc7CisgIHVwZGF0ZVRpbWU6IHN0cmluZzsKKyAgY29sdW1uczogYW55OworfTsKKworZXhwb3J0IHR5cGUgR2VuQ29kZVBhZ2luYXRpb24gPSB7CisgIHRvdGFsOiBudW1iZXI7CisgIHBhZ2VTaXplOiBudW1iZXI7CisgIGN1cnJlbnQ6IG51bWJlcjsKK307CisKK2V4cG9ydCB0eXBlIEdlbkNvZGVMaXN0RGF0YSA9IHsKKyAgbGlzdDogR2VuQ29kZVR5cGVbXTsKKyAgcGFnaW5hdGlvbjogUGFydGlhbDxHZW5Db2RlUGFnaW5hdGlvbj47Cit9OworCitleHBvcnQgdHlwZSBHZW5Db2RlVGFibGVMaXN0UGFyYW1zID0geworICBidXNpbmVzc05hbWU/OiBzdHJpbmc7CisgIGNsYXNzTmFtZT86IHN0cmluZzsKKyAgY3JlYXRlQnk/OiBzdHJpbmc7CisgIGNyZWF0ZVRpbWU/OiBzdHJpbmc7CisgIGNydWQ/OiBzdHJpbmc7CisgIGZ1bmN0aW9uQXV0aG9yPzogc3RyaW5nOworICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7CisgIGdlblBhdGg/OiBzdHJpbmc7CisgIGdlblR5cGU/OiBzdHJpbmc7CisgIG1vZHVsZU5hbWU/OiBzdHJpbmc7CisgIGlzTGlzdD86IHN0cmluZzsKKyAgaXNFZGl0Pzogc3RyaW5nOworICBpc1F1ZXJ5Pzogc3RyaW5nOworICBpc0luc2VydD86IHN0cmluZzsKKyAgaXNSZXF1aXJlZD86IHN0cmluZzsKKyAgb3B0aW9ucz86IHN0cmluZzsKKyAgcGFyYW1zPzogYW55OworICBwYWNrYWdlTmFtZT86IHN0cmluZzsKKyAgcGFyZW50TWVudUlkPzogc3RyaW5nOworICBjb2x1bW5zPzogYW55OworICBwYXJlbnRNZW51TmFtZT86IHN0cmluZzsKKyAgcmVtYXJrPzogc3RyaW5nOworICB0YWJsZUNvbW1lbnQ/OiBzdHJpbmc7CisgIHRhYmxlSWQ/OiBzdHJpbmc7CisgIHRhYmxlTmFtZT86IHN0cmluZzsKKyAgdHBsQ2F0ZWdvcnk/OiBzdHJpbmc7CisgIHRyZWU/OiBzdHJpbmc7CisgIHRyZWVDb2RlPzogc3RyaW5nOworICB0cmVlTmFtZT86IHN0cmluZzsKKyAgdHJlZVBhcmVudENvZGU/OiBzdHJpbmc7CisgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICB1cGRhdGVUaW1lPzogc3RyaW5nOworICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgY3VycmVudFBhZ2U/OiBzdHJpbmc7CisgIGZpbHRlcj86IHN0cmluZzsKKyAgc29ydGVyPzogc3RyaW5nOworfTsKKworZXhwb3J0IHR5cGUgVGFibGVDb2x1bW5JbmZvID0geworICBjb2x1bW5OYW1lOiBzdHJpbmc7CisgIGNvbHVtbkNvbW1lbnQ6IHN0cmluZzsKK307CisKK2V4cG9ydCB0eXBlIFRhYmxlSW5mbyA9IHsKKyAgdGFibGVOYW1lOiBzdHJpbmc7CisgIHRhYmxlQ29tbWVudDogc3RyaW5nOworICBjb2x1bW5zOiBUYWJsZUNvbHVtbkluZm9bXTsKK307CisKK2V4cG9ydCB0eXBlIEltcG9ydFRhYmxlTGlzdEl0ZW0gPSB7CisgIHRhYmxlTmFtZTogc3RyaW5nOworICB0YWJsZUNvbW1lbnQ6IHN0cmluZzsKK307CisKK2V4cG9ydCB0eXBlIEltcG9ydFRhYmxlUGFyYW1zID0geworICB0YWJsZXM6IHN0cmluZzsKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vZWRpdC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vZWRpdC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhMGQxYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9lZGl0LnRzeApAQCAtMCwwICsxLDE4MyBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgQmFzZUluZm8gZnJvbSAnLi9jb21wb25lbnRzL0Jhc2VJbmZvJzsKK2ltcG9ydCB7IENhcmQsIExheW91dCwgbWVzc2FnZSwgU3RlcHMgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBDb2x1bW5JbmZvIGZyb20gJy4vY29tcG9uZW50cy9Db2x1bW5JbmZvJzsKK2ltcG9ydCBHZW5JbmZvIGZyb20gJy4vY29tcG9uZW50cy9HZW5JbmZvJzsKK2ltcG9ydCB7IGdldEdlbkNvZGUsIHVwZGF0ZURhdGEgfSBmcm9tICcuL3NlcnZpY2UnOworaW1wb3J0IHsgZm9ybWF0VHJlZURhdGEgfSBmcm9tICdAL3V0aWxzL3RyZWUnOworaW1wb3J0IHN0eWxlcyBmcm9tICcuL3N0eWxlLmxlc3MnOworaW1wb3J0IHR5cGUgeyBHZW5Db2RlVHlwZSB9IGZyb20gJy4vZGF0YSc7CitpbXBvcnQgeyBnZXRNZW51VHJlZSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL21lbnUnOworaW1wb3J0IHsgZ2V0RGljdFR5cGVMaXN0IH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vZGljdCc7CitpbXBvcnQgcXVlcnlTdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJzsKK2ltcG9ydCB7IHVzZUxvY2F0aW9uIH0gZnJvbSAnQHVtaWpzL21heCc7CisKK2NvbnN0IHsgQ29udGVudCB9ID0gTGF5b3V0OworCitleHBvcnQgdHlwZSBHZW5Db2RlQXJncyA9IHsKKyAgaWQ6IHN0cmluZzsKK307CisKK2NvbnN0IFRhYmxlTGlzdDogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTsKKyAgY29uc3QgcXVlcnkgPSBxdWVyeVN0cmluZy5wYXJzZShsb2NhdGlvbi5zZWFyY2gpOworICBjb25zdCB7IGlkIH0gPSBxdWVyeSBhcyBHZW5Db2RlQXJnczsKKyAgY29uc3QgdGFibGVJZCA9IGlkOworCisgIGNvbnN0IFtjdXJyZW50U3RlcCwgc2V0Q3VycmVudFN0ZXBdID0gdXNlU3RhdGU8bnVtYmVyPigwKTsKKyAgY29uc3QgW2NvbHVtbkRhdGEsIHNldENvbHVtbkRhdGFdID0gdXNlU3RhdGU8YW55PihbXSk7CisgIGNvbnN0IFtiYXNlSW5mb0RhdGEsIHNldEJhc2VJbmZvRGF0YV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2dlbkluZm9EYXRhLCBzZXRHZW5JbmZvRGF0YV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW21lbnVUcmVlLCBzZXRNZW51VHJlZV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW2RpY3REYXRhLCBzZXREaWN0RGF0YV0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3RhYmxlSW5mbywgc2V0VGFibGVJbmZvXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbZm9ybURhdGEsIHNldEZvcm1EYXRhXSA9IHVzZVN0YXRlPGFueT4oW10pOworICBjb25zdCBbc3RlcENvbXBvbmVudCwgc2V0U3RlcENvbXBvbmVudF0gPSB1c2VTdGF0ZTxhbnk+KFtdKTsKKyAgY29uc3QgW3N0ZXBLZXksIHNldFN0ZXBLZXldID0gdXNlU3RhdGU8c3RyaW5nPignJyk7CisKKyAgY29uc3QgZ2V0Q3VycmVudFN0ZXBBbmRDb21wb25lbnQgPSAoa2V5Pzogc3RyaW5nKSA9PiB7CisgICAgaWYgKGtleSA9PT0gJ2Jhc2UnKSB7CisgICAgICByZXR1cm4gKAorICAgICAgICA8QmFzZUluZm8KKyAgICAgICAgICB2YWx1ZXM9e2Jhc2VJbmZvRGF0YX0KKyAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lCisgICAgICAgICAgb25TdGVwU3VibWl0PXtvbk5leHRTdGVwfQorICAgICAgICAvPgorICAgICAgKTsKKyAgICB9CisgICAgaWYgKGtleSA9PT0gJ2NvbHVtbicpIHsKKyAgICAgIHJldHVybiAoCisgICAgICAgIDxDb2x1bW5JbmZvCisgICAgICAgICAgZGF0YT17Y29sdW1uRGF0YX0KKyAgICAgICAgICBkaWN0RGF0YT17ZGljdERhdGF9CisgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZQorICAgICAgICAgIG9uU3RlcFN1Ym1pdD17b25OZXh0U3RlcH0KKyAgICAgICAgLz4KKyAgICAgICk7CisgICAgfQorICAgIGlmIChrZXkgPT09ICdnZW4nKSB7CisgICAgICByZXR1cm4gKAorICAgICAgICA8R2VuSW5mbworICAgICAgICAgIHZhbHVlcz17Z2VuSW5mb0RhdGF9CisgICAgICAgICAgbWVudURhdGE9e21lbnVUcmVlfQorICAgICAgICAgIHRhYmxlSW5mbz17dGFibGVJbmZvfQorICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlLWJlZm9yZS1kZWZpbmUKKyAgICAgICAgICBvblN0ZXBTdWJtaXQ9e29uTmV4dFN0ZXB9CisgICAgICAgIC8+CisgICAgICApOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfTsKKworICBjb25zdCBvbk5leHRTdGVwID0gKHN0ZXA6IHN0cmluZywgdmFsdWVzOiBhbnksIGRpcmVjdGlvbjogc3RyaW5nKSA9PiB7CisgICAgbGV0IHN0ZXBLZXkgPSAnYmFzZSc7CisgICAgaWYgKHN0ZXAgPT09ICdiYXNlJykgeworICAgICAgc2V0U3RlcEtleSgnY29sdW1uJyk7CisgICAgICBzZXRDdXJyZW50U3RlcCgxKTsKKyAgICAgIHNldEZvcm1EYXRhKHZhbHVlcyk7CisgICAgICBzZXRTdGVwQ29tcG9uZW50KGdldEN1cnJlbnRTdGVwQW5kQ29tcG9uZW50KHN0ZXBLZXkpKTsKKyAgICB9IGVsc2UgaWYgKHN0ZXAgPT09ICdjb2x1bW4nKSB7CisgICAgICBpZiAoZGlyZWN0aW9uID09PSAncHJldicpIHsKKyAgICAgICAgc2V0U3RlcEtleSgnYmFzZScpOworICAgICAgICBzZXRDdXJyZW50U3RlcCgwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldFN0ZXBLZXkoJ2dlbicpOworICAgICAgICBjb25zdCB0YWJsZURhdGE6IEdlbkNvZGVUeXBlID0gZm9ybURhdGEgfHwgKHt9IGFzIEdlbkNvZGVUeXBlKTsKKyAgICAgICAgdGFibGVEYXRhLmNvbHVtbnMgPSB2YWx1ZXM7CisgICAgICAgIHNldEN1cnJlbnRTdGVwKDIpOworICAgICAgICBzZXRGb3JtRGF0YSh0YWJsZURhdGEpOworICAgICAgfQorICAgICAgc2V0U3RlcENvbXBvbmVudChnZXRDdXJyZW50U3RlcEFuZENvbXBvbmVudChzdGVwS2V5KSk7CisgICAgfSBlbHNlIGlmIChzdGVwID09PSAnZ2VuJykgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7CisgICAgICAgIHNldFN0ZXBLZXkoJ2NvbHVtbicpOworICAgICAgICBzZXRDdXJyZW50U3RlcCgxKTsKKyAgICAgICAgc2V0U3RlcENvbXBvbmVudChnZXRDdXJyZW50U3RlcEFuZENvbXBvbmVudChzdGVwS2V5KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBwb3N0RGF0YTogR2VuQ29kZVR5cGUgPSB7CisgICAgICAgICAgLi4uZm9ybURhdGEsCisgICAgICAgICAgLi4udmFsdWVzLAorICAgICAgICAgIHBhcmFtczogdmFsdWVzLAorICAgICAgICAgIHRhYmxlSWQ6IHRhYmxlSWQsCisgICAgICAgIH07CisgICAgICAgIHNldEZvcm1EYXRhKHBvc3REYXRhKTsKKyAgICAgICAgdXBkYXRlRGF0YSh7IC4uLnBvc3REYXRhIH0gYXMgR2VuQ29kZVR5cGUpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+aPkOS6pOaIkOWKnycpOworICAgICAgICAgICAgaGlzdG9yeS5iYWNrKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5o+Q5Lqk5aSx6LSlJyk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIHVzZUVmZmVjdCgoKSA9PiB7CisgICAgc2V0U3RlcENvbXBvbmVudChnZXRDdXJyZW50U3RlcEFuZENvbXBvbmVudChzdGVwS2V5KSk7CisgIH0sIFtzdGVwS2V5XSk7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXRHZW5Db2RlKHRhYmxlSWQpLnRoZW4oKHJlcykgPT4geworICAgICAgaWYgKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgICAgc2V0QmFzZUluZm9EYXRhKHJlcy5kYXRhLmluZm8pOworICAgICAgICBzZXRDb2x1bW5EYXRhKHJlcy5kYXRhLnJvd3MpOworICAgICAgICBzZXRHZW5JbmZvRGF0YShyZXMuZGF0YS5pbmZvKTsKKyAgICAgICAgc2V0VGFibGVJbmZvKHJlcy5kYXRhLnRhYmxlcyk7CisgICAgICAgIHNldFN0ZXBLZXkoJ2Jhc2UnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CisgICAgICB9CisgICAgfSk7CisgICAgZ2V0TWVudVRyZWUoKS50aGVuKChyZXMpID0+IHsKKyAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgIGNvbnN0IHRyZWVEYXRhID0gZm9ybWF0VHJlZURhdGEocmVzLmRhdGEpOworICAgICAgICBzZXRNZW51VHJlZSh0cmVlRGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXNzYWdlLmVycm9yKHJlcy5tc2cpOworICAgICAgfQorICAgIH0pOworCisgICAgZ2V0RGljdFR5cGVMaXN0KCkudGhlbigocmVzOiBhbnkpID0+IHsKKyAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7CisgICAgICAgIGNvbnN0IGRpY3RzID0gcmVzLnJvd3MubWFwKChpdGVtOiBhbnkpID0+IHsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgbGFiZWw6IGl0ZW0uZGljdE5hbWUsCisgICAgICAgICAgICB2YWx1ZTogaXRlbS5kaWN0VHlwZSwKKyAgICAgICAgICB9OworICAgICAgICB9KTsKKyAgICAgICAgc2V0RGljdERhdGEoZGljdHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVzc2FnZS5lcnJvcihyZXMubXNnKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwgW10pOworCisgIC8vIGNvbnN0IG9uRmluaXNoID0gKHZhbHVlczogYW55KSA9PiB7CisgIC8vICAgY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgdmFsdWVzKTsKKyAgLy8gfTsKKworICAvLyBjb25zdCBvbkZpbmlzaEZhaWxlZCA9IChlcnJvckluZm86IGFueSkgPT4geworICAvLyAgIGNvbnNvbGUubG9nKCdGYWlsZWQ6JywgZXJyb3JJbmZvKTsKKyAgLy8gfTsKKworICByZXR1cm4gKAorICAgIDxDb250ZW50PgorICAgICAgPENhcmQgY2xhc3NOYW1lPXtzdHlsZXMudGFic0NhcmR9IGJvcmRlcmVkPXtmYWxzZX0+CisgICAgICAgIDxTdGVwcyBjdXJyZW50PXtjdXJyZW50U3RlcH0gY2xhc3NOYW1lPXtzdHlsZXMuc3RlcHN9IGl0ZW1zPXtbCisgICAgICAgICAgeworICAgICAgICAgICAgdGl0bGU6ICfln7rmnKzkv6Hmga8nLAorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgdGl0bGU6ICflrZfmrrXkv6Hmga8nLAorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgdGl0bGU6ICfnlJ/miJDkv6Hmga8nLAorICAgICAgICAgIH0sCisgICAgICAgIF19IC8+CisgICAgICAgIHtzdGVwQ29tcG9uZW50fQorICAgICAgPC9DYXJkPgorICAgIDwvQ29udGVudD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFRhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9pbXBvcnQudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL2ltcG9ydC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyYzhkZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9pbXBvcnQudHN4CkBAIC0wLDAgKzEsMTA3IEBACitpbXBvcnQgeyBCdXR0b24sIENhcmQsIG1lc3NhZ2UsIExheW91dCB9IGZyb20gJ2FudGQnOworaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgaGlzdG9yeSwgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgaW1wb3J0VGFibGVzLCBxdWVyeVRhYmxlTGlzdCB9IGZyb20gJy4vc2VydmljZSc7CitpbXBvcnQgdHlwZSB7IEdlbkNvZGVUeXBlIH0gZnJvbSAnLi9kYXRhLmQnOworaW1wb3J0IHsgUHJvQ29sdW1ucywgUHJvVGFibGUgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBQbHVzT3V0bGluZWQsIFJvbGxiYWNrT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CisKK2NvbnN0IHsgQ29udGVudCB9ID0gTGF5b3V0OworCitjb25zdCBoYW5kbGVJbXBvcnQgPSBhc3luYyAodGFibGVzOiBzdHJpbmcpID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo6YWN572uJyk7CisgIHRyeSB7CisgICAgYXdhaXQgaW1wb3J0VGFibGVzKHRhYmxlcyk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn6YWN572u5oiQ5YqfJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+mFjee9ruWksei0peivt+mHjeivle+8gScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgSW1wb3J0VGFibGVMaXN0OiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgW3NlbGVjdFRhYmxlcywgc2V0U2VsZWN0VGFibGVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7CisKKyAgY29uc3QgY29sdW1uczogUHJvQ29sdW1uczxHZW5Db2RlVHlwZT5bXSA9IFsKKyAgICB7CisgICAgICB0aXRsZTogJ+ihqOWQjeensCcsCisgICAgICBkYXRhSW5kZXg6ICd0YWJsZU5hbWUnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6ICfooajmj4/ov7AnLAorICAgICAgZGF0YUluZGV4OiAndGFibGVDb21tZW50JywKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5Yib5bu65pe26Ze0JywKKyAgICAgIGRhdGFJbmRleDogJ2NyZWF0ZVRpbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dGFyZWEnLAorICAgICAgaGlkZUluU2VhcmNoOiB0cnVlLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8Q29udGVudD4KKyAgICAgIDxDYXJkIGJvcmRlcmVkPXtmYWxzZX0+CisgICAgICAgIDxQcm9UYWJsZTxHZW5Db2RlVHlwZT4KKyAgICAgICAgICBoZWFkZXJUaXRsZT0i5Luj56CB55Sf5oiQ5L+h5oGvIgorICAgICAgICAgIHJvd0tleT0idGFibGVOYW1lIgorICAgICAgICAgIHNlYXJjaD17eworICAgICAgICAgICAgbGFiZWxXaWR0aDogMTIwLAorICAgICAgICAgIH19CisgICAgICAgICAgdG9vbEJhclJlbmRlcj17KCkgPT4gWworICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgICAgICBrZXk9InByaW1hcnkiCisgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0VGFibGVzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeimgeWvvOWFpeeahOihqO+8gScpOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgaGFuZGxlSW1wb3J0KHNlbGVjdFRhYmxlcy5qb2luKCcsJykpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBoaXN0b3J5LmJhY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxQbHVzT3V0bGluZWQgLz4gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Imdlbi5zdWJtaXQiIGRlZmF1bHRNZXNzYWdlPSLmj5DkuqQiIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZ29iYWNrIgorICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICAgICAgaGlzdG9yeS5iYWNrKCk7CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxSb2xsYmFja091dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJnZW4uZ29iYWNrIiBkZWZhdWx0TWVzc2FnZT0i6L+U5ZueIiAvPgorICAgICAgICAgICAgPC9CdXR0b24+LAorICAgICAgICAgIF19CisgICAgICAgICAgcmVxdWVzdD17KHBhcmFtcykgPT4KKyAgICAgICAgICAgIHF1ZXJ5VGFibGVMaXN0KHsgLi4ucGFyYW1zIH0pLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMudG90YWwsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRSb3dzICYmIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdGFibGVzID0gc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gcm93LnRhYmxlTmFtZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBzZXRTZWxlY3RUYWJsZXModGFibGVzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICB9fQorICAgICAgICAvPgorICAgICAgPC9DYXJkPgorICAgIDwvQ29udGVudD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IEltcG9ydFRhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9pbmRleC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjAwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vaW5kZXgudHN4CkBAIC0wLDAgKzEsMzYwIEBACitpbXBvcnQgeyBEb3dubG9hZE91dGxpbmVkLCBQbHVzT3V0bGluZWQgfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeyBCdXR0b24sIG1lc3NhZ2UsIERyYXdlciwgTW9kYWwsIENhcmQsIExheW91dCB9IGZyb20gJ2FudGQnOworaW1wb3J0IHR5cGUgeyBGb3JtSW5zdGFuY2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmIH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgaGlzdG9yeSwgRm9ybWF0dGVkTWVzc2FnZSwgdXNlQWNjZXNzIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgUHJldmlld0Zvcm0gZnJvbSAnLi9jb21wb25lbnRzL1ByZXZpZXdDb2RlJzsKK2ltcG9ydCB0eXBlIHsgR2VuQ29kZVRhYmxlTGlzdFBhcmFtcywgR2VuQ29kZVR5cGUgfSBmcm9tICcuL2RhdGEuZCc7CitpbXBvcnQgeworICBiYXRjaEdlbkNvZGUsCisgIGdlbkNvZGUsCisgIHByZXZpZXdDb2RlLAorICBnZXRHZW5Db2RlTGlzdCwKKyAgcmVtb3ZlRGF0YSwKKyAgc3luY0RiSW5mbywKK30gZnJvbSAnLi9zZXJ2aWNlJzsKK2ltcG9ydCB7CisgIEFjdGlvblR5cGUsCisgIEZvb3RlclRvb2xiYXIsCisgIFByb0NvbHVtbnMsCisgIFByb0Rlc2NyaXB0aW9ucywKKyAgUHJvRGVzY3JpcHRpb25zSXRlbVByb3BzLAorICBQcm9UYWJsZSwKK30gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworCitjb25zdCB7IENvbnRlbnQgfSA9IExheW91dDsKKworLyoqCisgKiDliKDpmaToioLngrkKKyAqCisgKiBAcGFyYW0gc2VsZWN0ZWRSb3dzCisgKi8KK2NvbnN0IGhhbmRsZVJlbW92ZSA9IGFzeW5jIChzZWxlY3RlZFJvd3M6IEdlbkNvZGVUeXBlW10pID0+IHsKKyAgY29uc3QgaGlkZSA9IG1lc3NhZ2UubG9hZGluZygn5q2j5Zyo5Yig6ZmkJyk7CisgIGlmICghc2VsZWN0ZWRSb3dzKSByZXR1cm4gdHJ1ZTsKKyAgdHJ5IHsKKyAgICBhd2FpdCByZW1vdmVEYXRhKHsKKyAgICAgIGlkczogc2VsZWN0ZWRSb3dzLm1hcCgocm93KSA9PiByb3cudGFibGVJZCksCisgICAgfSk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgaGFuZGxlUmVtb3ZlT25lID0gYXN5bmMgKHNlbGVjdGVkUm93OiBHZW5Db2RlVHlwZSkgPT4geworICBjb25zdCBoaWRlID0gbWVzc2FnZS5sb2FkaW5nKCfmraPlnKjliKDpmaQnKTsKKyAgaWYgKCFzZWxlY3RlZFJvdykgcmV0dXJuIHRydWU7CisgIHRyeSB7CisgICAgY29uc3QgcGFyYW1zID0gW3NlbGVjdGVkUm93LnRhYmxlSWRdOworICAgIGF3YWl0IHJlbW92ZURhdGEoeworICAgICAgaWRzOiBwYXJhbXMsCisgICAgfSk7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5Yqf77yM5Y2z5bCG5Yi35pawJyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgaGlkZSgpOworICAgIG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pe+8jOivt+mHjeivlScpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworY29uc3QgR2VuQ29kZVZpZXc6IFJlYWN0LkZDID0gKCkgPT4geworICBjb25zdCBmb3JtVGFibGVSZWYgPSB1c2VSZWY8Rm9ybUluc3RhbmNlPigpOworCisgIGNvbnN0IFtzaG93RGV0YWlsLCBzZXRTaG93RGV0YWlsXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTsKKyAgY29uc3QgW3Nob3dQcmV2aWV3LCBzZXRTaG93UHJldmlld10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisgIGNvbnN0IFtwcmVpdmV3RGF0YSwgc2V0UHJlaXZld0RhdGFdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpOworCisgIGNvbnN0IGFjdGlvblJlZiA9IHVzZVJlZjxBY3Rpb25UeXBlPigpOworICBjb25zdCBbY3VycmVudFJvdywgc2V0Q3VycmVudFJvd10gPSB1c2VTdGF0ZTxHZW5Db2RlVHlwZT4oKTsKKyAgY29uc3QgW3NlbGVjdGVkUm93cywgc2V0U2VsZWN0ZWRSb3dzXSA9IHVzZVN0YXRlPEdlbkNvZGVUeXBlW10+KFtdKTsKKworICBjb25zdCBhY2Nlc3MgPSB1c2VBY2Nlc3MoKTsKKworICBjb25zdCBjb2x1bW5zOiBQcm9Db2x1bW5zPEdlbkNvZGVUeXBlPltdID0gWworICAgIHsKKyAgICAgIHRpdGxlOiAn57yW5Y+3JywKKyAgICAgIGRhdGFJbmRleDogJ3RhYmxlSWQnLAorICAgICAgdGlwOiAn57yW5Y+3JywKKyAgICAgIHJlbmRlcjogKGRvbSwgZW50aXR5KSA9PiB7CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgPGEKKyAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgICAgc2V0Q3VycmVudFJvdyhlbnRpdHkpOworICAgICAgICAgICAgICBzZXRTaG93RGV0YWlsKHRydWUpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICB7ZG9tfQorICAgICAgICAgIDwvYT4KKyAgICAgICAgKTsKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+ihqOWQjScsCisgICAgICBkYXRhSW5kZXg6ICd0YWJsZU5hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dGFyZWEnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6ICfooajmj4/ov7AnLAorICAgICAgZGF0YUluZGV4OiAndGFibGVDb21tZW50JywKKyAgICAgIGhpZGVJbkZvcm06IHRydWUsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+WunuS9kycsCisgICAgICBkYXRhSW5kZXg6ICdjbGFzc05hbWUnLAorICAgICAgdmFsdWVUeXBlOiAndGV4dGFyZWEnLAorICAgIH0sCisgICAgeworICAgICAgdGl0bGU6ICfliJvlu7rml7bpl7QnLAorICAgICAgZGF0YUluZGV4OiAnY3JlYXRlVGltZScsCisgICAgICB2YWx1ZVR5cGU6ICd0ZXh0YXJlYScsCisgICAgICBoaWRlSW5TZWFyY2g6IHRydWUsCisgICAgfSwKKyAgICB7CisgICAgICB0aXRsZTogJ+abtOaWsOaXtumXtCcsCisgICAgICBkYXRhSW5kZXg6ICd1cGRhdGVUaW1lJywKKyAgICAgIHZhbHVlVHlwZTogJ3RleHRhcmVhJywKKyAgICAgIGhpZGVJblNlYXJjaDogdHJ1ZSwKKyAgICB9LAorICAgIHsKKyAgICAgIHRpdGxlOiAn5pON5L2cJywKKyAgICAgIGRhdGFJbmRleDogJ29wdGlvbicsCisgICAgICB3aWR0aDogJzIyMHB4JywKKyAgICAgIHZhbHVlVHlwZTogJ29wdGlvbicsCisgICAgICByZW5kZXI6IChfLCByZWNvcmQpID0+IFsKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgIHR5cGU9ImxpbmsiCisgICAgICAgICAgc2l6ZT0ic21hbGwiCisgICAgICAgICAga2V5PSJwcmV2aWV3IgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygndG9vbDpnZW46ZWRpdCcpfQorICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgIHByZXZpZXdDb2RlKHJlY29yZC50YWJsZUlkKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgICAgICAgICAgICBzZXRQcmVpdmV3RGF0YShyZXMuZGF0YSk7CisgICAgICAgICAgICAgICAgc2V0U2hvd1ByZXZpZXcodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign6I635Y+W5pWw5o2u5aSx6LSlJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDpooTop4gKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImNvbmZpZyIKKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3Rvb2w6Z2VuOmVkaXQnKX0KKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBoaXN0b3J5LnB1c2goYC90b29sL2dlbi9lZGl0P2lkPSR7cmVjb3JkLnRhYmxlSWR9YCk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOe8lui+kQorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICB0eXBlPSJsaW5rIgorICAgICAgICAgIHNpemU9InNtYWxsIgorICAgICAgICAgIGRhbmdlcgorICAgICAgICAgIGtleT0iZGVsZXRlIgorICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygndG9vbDpnZW46ZGVsJyl9CisgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4geworICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6Zmk5Lu75YqhJywKKyAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOivpeS7u+WKoeWQl++8nycsCisgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLAorICAgICAgICAgICAgICBvbk9rOiBhc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZU9uZShyZWNvcmQpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uUmVmLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOWIoOmZpAorICAgICAgICA8L0J1dHRvbj4sCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICB0eXBlPSJsaW5rIgorICAgICAgICAgIHNpemU9InNtYWxsIgorICAgICAgICAgIGtleT0ic3luYyIKKyAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3Rvb2w6Z2VuOmVkaXQnKX0KKyAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7CisgICAgICAgICAgICBzeW5jRGJJbmZvKHJlY29yZC50YWJsZU5hbWUpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn5ZCM5q2l5oiQ5YqfJyk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5ZCM5q2l5aSx6LSlJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICDlkIzmraUKKyAgICAgICAgPC9CdXR0b24+LAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgdHlwZT0ibGluayIKKyAgICAgICAgICBzaXplPSJzbWFsbCIKKyAgICAgICAgICBrZXk9ImdlbmNvZGUiCisgICAgICAgICAgaGlkZGVuPXshYWNjZXNzLmhhc1Blcm1zKCd0b29sOmdlbjplZGl0Jyl9CisgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgaWYgKHJlY29yZC5nZW5UeXBlID09PSAnMScpIHsKKyAgICAgICAgICAgICAgZ2VuQ29kZShyZWNvcmQudGFibGVOYW1lKS50aGVuKChyZXMpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKGDmiJDlip/nlJ/miJDliLDoh6rlrprkuYnot6/lvoTvvJoke3JlY29yZC5nZW5QYXRofWApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKHJlcy5tc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBiYXRjaEdlbkNvZGUocmVjb3JkLnRhYmxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfX0KKyAgICAgICAgPgorICAgICAgICAgIOeUn+aIkOS7o+eggQorICAgICAgICA8L0J1dHRvbj4sCisgICAgICBdLAorICAgIH0sCisgIF07CisKKyAgcmV0dXJuICgKKyAgICA8Q29udGVudD4KKyAgICAgIDxDYXJkIGJvcmRlcmVkPXtmYWxzZX0+CisgICAgICAgIDxQcm9UYWJsZTxHZW5Db2RlVHlwZT4KKyAgICAgICAgICBoZWFkZXJUaXRsZT0i5Luj56CB55Sf5oiQ5L+h5oGvIgorICAgICAgICAgIGFjdGlvblJlZj17YWN0aW9uUmVmfQorICAgICAgICAgIGZvcm1SZWY9e2Zvcm1UYWJsZVJlZn0KKyAgICAgICAgICByb3dLZXk9InRhYmxlSWQiCisgICAgICAgICAgc2VhcmNoPXt7CisgICAgICAgICAgICBsYWJlbFdpZHRoOiAxMjAsCisgICAgICAgICAgfX0KKyAgICAgICAgICB0b29sQmFyUmVuZGVyPXsoKSA9PiBbCisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgICAgIGtleT0iZ2VuIgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3Rvb2w6Z2VuOmVkaXQnKX0KKyAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4geworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFJvd3MubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfor7fpgInmi6nopoHnlJ/miJDnmoTmlbDmja4nKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lcyA9IHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4gcm93LnRhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkUm93c1swXS5nZW5UeXBlID09PSAnMScpIHsKKyAgICAgICAgICAgICAgICAgIGdlbkNvZGUodGFibGVOYW1lcy5qb2luKCcsJykpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcyhg5oiQ5Yqf55Sf5oiQ5Yiw6Ieq5a6a5LmJ6Lev5b6E77yaJHtzZWxlY3RlZFJvd3NbMF0uZ2VuUGF0aH1gKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKHJlcy5tc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgYmF0Y2hHZW5Db2RlKHRhYmxlTmFtZXMuam9pbignLCcpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICA+CisgICAgICAgICAgICAgIDxEb3dubG9hZE91dGxpbmVkIC8+IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJnZW4uZ2VuY29kZSIgZGVmYXVsdE1lc3NhZ2U9IueUn+aIkCIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICAgICAga2V5PSJpbXBvcnQiCisgICAgICAgICAgICAgIGhpZGRlbj17IWFjY2Vzcy5oYXNQZXJtcygndG9vbDpnZW46YWRkJyl9CisgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHsKKyAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2goJy90b29sL2dlbi9pbXBvcnQnKTsKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgPFBsdXNPdXRsaW5lZCAvPiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0iZ2VuLmltcG9ydCIgZGVmYXVsdE1lc3NhZ2U9IuWvvOWFpSIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPiwKKyAgICAgICAgICBdfQorICAgICAgICAgIHJlcXVlc3Q9eyhwYXJhbXMpID0+CisgICAgICAgICAgICBnZXRHZW5Db2RlTGlzdCh7IC4uLnBhcmFtcyB9IGFzIEdlbkNvZGVUYWJsZUxpc3RQYXJhbXMpLnRoZW4oKHJlcykgPT4geworICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIGRhdGE6IHJlcy5yb3dzLAorICAgICAgICAgICAgICAgIHRvdGFsOiByZXMucm93cy5sZW5ndGgsCisgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgfQorICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9CisgICAgICAgICAgcm93U2VsZWN0aW9uPXt7CisgICAgICAgICAgICBvbkNoYW5nZTogKF8sIHNlbGVjdGVkUm93cykgPT4geworICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAge3NlbGVjdGVkUm93cz8ubGVuZ3RoID4gMCAmJiAoCisgICAgICAgICAgPEZvb3RlclRvb2xiYXIKKyAgICAgICAgICAgIGV4dHJhPXsKKyAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuY2hvc2VuIiBkZWZhdWx0TWVzc2FnZT0i5bey6YCJ5oupIiAvPnsnICd9CisgICAgICAgICAgICAgICAgPGEgc3R5bGU9e3sgZm9udFdlaWdodDogNjAwIH19PntzZWxlY3RlZFJvd3MubGVuZ3RofTwvYT57JyAnfQorICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS5pdGVtIiBkZWZhdWx0TWVzc2FnZT0i6aG5IiAvPgorICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICA+CisgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgIGtleT0iZGVsZXRlIgorICAgICAgICAgICAgICBoaWRkZW49eyFhY2Nlc3MuaGFzUGVybXMoJ3Rvb2w6Z2VuOnJlbW92ZScpfQorICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7CisgICAgICAgICAgICAgICAgTW9kYWwuY29uZmlybSh7CisgICAgICAgICAgICAgICAgICB0aXRsZTogJ+WIoOmZpOS7u+WKoScsCisgICAgICAgICAgICAgICAgICBjb250ZW50OiAn56Gu5a6a5Yig6Zmk6K+l5Lu75Yqh5ZCX77yfJywKKyAgICAgICAgICAgICAgICAgIG9rVGV4dDogJ+ehruiupCcsCisgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJywKKyAgICAgICAgICAgICAgICAgIG9uT2s6IGFzeW5jICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGhhbmRsZVJlbW92ZShzZWxlY3RlZFJvd3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm93cyhbXSk7CisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uUmVmLmN1cnJlbnQ/LnJlbG9hZEFuZFJlc3Q/LigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMuc2VhcmNoVGFibGUuYmF0Y2hEZWxldGlvbiIgZGVmYXVsdE1lc3NhZ2U9IuaJuemHj+WIoOmZpCIgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorICAgICAgICAgIDwvRm9vdGVyVG9vbGJhcj4KKyAgICAgICAgKX0KKyAgICAgICAgPFByZXZpZXdGb3JtCisgICAgICAgICAgb3Blbj17c2hvd1ByZXZpZXd9CisgICAgICAgICAgZGF0YT17cHJlaXZld0RhdGF9CisgICAgICAgICAgb25IaWRlPXsoKSA9PiB7CisgICAgICAgICAgICBzZXRTaG93UHJldmlldyhmYWxzZSk7CisgICAgICAgICAgfX0KKyAgICAgICAgLz4KKyAgICAgICAgPERyYXdlcgorICAgICAgICAgIHdpZHRoPXs2MDB9CisgICAgICAgICAgb3Blbj17c2hvd0RldGFpbH0KKyAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB7CisgICAgICAgICAgICBzZXRDdXJyZW50Um93KHVuZGVmaW5lZCk7CisgICAgICAgICAgICBzZXRTaG93RGV0YWlsKGZhbHNlKTsKKyAgICAgICAgICB9fQorICAgICAgICAgIGNsb3NhYmxlPXtmYWxzZX0KKyAgICAgICAgPgorICAgICAgICAgIHtjdXJyZW50Um93Py50YWJsZU5hbWUgJiYgKAorICAgICAgICAgICAgPFByb0Rlc2NyaXB0aW9uczxHZW5Db2RlVHlwZT4KKyAgICAgICAgICAgICAgY29sdW1uPXsyfQorICAgICAgICAgICAgICB0aXRsZT17Y3VycmVudFJvdz8udGFibGVOYW1lfQorICAgICAgICAgICAgICByZXF1ZXN0PXthc3luYyAoKSA9PiAoeworICAgICAgICAgICAgICAgIGRhdGE6IGN1cnJlbnRSb3cgfHwge30sCisgICAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgICBwYXJhbXM9e3sKKyAgICAgICAgICAgICAgICBpZDogY3VycmVudFJvdz8udGFibGVOYW1lLAorICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zIGFzIFByb0Rlc2NyaXB0aW9uc0l0ZW1Qcm9wczxHZW5Db2RlVHlwZT5bXX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgKX0KKyAgICAgICAgPC9EcmF3ZXI+CisgICAgICA8L0NhcmQ+CisgICAgPC9Db250ZW50PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgR2VuQ29kZVZpZXc7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vbG9jYWxlcy96aC1DTi50cyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9sb2NhbGVzL3poLUNOLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljM2E1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vbG9jYWxlcy96aC1DTi50cwpAQCAtMCwwICsxLDggQEAKK2V4cG9ydCBkZWZhdWx0IHsKKyAgJ2dlbi5pbXBvcnQnOiAn5a+85YWlJywKKyAgJ2dlbi50aXRsZSc6ICfooajkv6Hmga8nLAorICAnZ2VuLmdvYmFjayc6ICfov5Tlm54nLAorICAnZ2VuLnN1Ym1pdCc6ICfmj5DkuqQnLAorICAnZ2VuLmdlbmNvZGUnOiAn55Sf5oiQJywKKyAgJ2dlbi5wcmV2aWV3JzogJ+mihOiniCcsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL3NlcnZpY2UudHMgYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9HZW4vc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ3MmVlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL3NlcnZpY2UudHMKQEAgLTAsMCArMSwxMDYgQEAKK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IGRvd25Mb2FkWmlwIH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworaW1wb3J0IHR5cGUgeyBHZW5Db2RlVHlwZSwgR2VuQ29kZVRhYmxlTGlzdFBhcmFtcyB9IGZyb20gJy4vZGF0YS5kJzsKKworLy8g5p+l6K+i5YiG6aG15YiX6KGoCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2VuQ29kZUxpc3QocGFyYW1zPzogR2VuQ29kZVRhYmxlTGlzdFBhcmFtcykgeworICBjb25zdCBxdWVyeVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpOworICByZXR1cm4gcmVxdWVzdChgL2FwaS9jb2RlL2dlbi9saXN0PyR7cXVlcnlTdHJpbmd9YCwgeworICAgIGRhdGE6IHBhcmFtcywKKyAgICBtZXRob2Q6ICdnZXQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICB9KTsKK30KKworLy8g5p+l6K+i6KGo5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2VuQ29kZShpZD86IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdChgL2FwaS9jb2RlL2dlbi8ke2lkfWAsIHsKKyAgICBtZXRob2Q6ICdnZXQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICB9KTsKK30KKworLy8g5p+l6K+i5pWw5o2u6KGo5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVlcnlUYWJsZUxpc3QocGFyYW1zPzogYW55KSB7CisgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL2NvZGUvZ2VuL2RiL2xpc3Q/JHtxdWVyeVN0cmluZ31gLCB7CisgICAgZGF0YTogcGFyYW1zLAorICAgIG1ldGhvZDogJ2dldCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgIH0pOworfQorCisvLyDlr7zlhaXmlbDmja7ooajkv6Hmga8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRUYWJsZXModGFibGVzPzogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL2NvZGUvZ2VuL2ltcG9ydFRhYmxlP3RhYmxlcz0ke3RhYmxlc31gLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgIH0pOworfQorCisvLyDliKDpmaQKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVEYXRhKHBhcmFtczogeyBpZHM6IHN0cmluZ1tdIH0pIHsKKyAgcmV0dXJuIHJlcXVlc3QoYC9hcGkvY29kZS9nZW4vJHtwYXJhbXMuaWRzfWAsIHsKKyAgICBtZXRob2Q6ICdkZWxldGUnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICB9KTsKK30KKworLy8g5re75Yqg5pWw5o2uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkRGF0YShwYXJhbXM6IEdlbkNvZGVUeXBlKSB7CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL2NvZGUvZ2VuJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGRhdGE6IHsKKyAgICAgIC4uLnBhcmFtcywKKyAgICB9LAorICB9KTsKK30KKworLy8g5pu05paw5pWw5o2uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGF0YShwYXJhbXM6IEdlbkNvZGVUeXBlKSB7CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL2NvZGUvZ2VuJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgZGF0YTogeworICAgICAgLi4ucGFyYW1zLAorICAgIH0sCisgIH0pOworfQorCisvLyDmm7TmlrDnirbmgIEKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jRGJJbmZvKHRhYmxlTmFtZTogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL2NvZGUvZ2VuL3N5bmNoRGIvJHt0YWJsZU5hbWV9YCwgeworICAgIG1ldGhvZDogJ0dFVCcsCisgIH0pOworfQorCisvLyDnlJ/miJDku6PnoIHvvIjoh6rlrprkuYnot6/lvoTvvIkKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5Db2RlKHRhYmxlTmFtZTogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL2NvZGUvZ2VuL2dlbkNvZGUvJHt0YWJsZU5hbWV9YCwgeworICAgIG1ldGhvZDogJ0dFVCcsCisgIH0pOworfQorCisvLyDnlJ/miJDku6PnoIHvvIjljovnvKnljIXvvIkKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEdlbkNvZGUodGFibGVOYW1lOiBzdHJpbmcpIHsKKyAgcmV0dXJuIGRvd25Mb2FkWmlwKGAvYXBpL2NvZGUvZ2VuL2JhdGNoR2VuQ29kZT90YWJsZXM9JHt0YWJsZU5hbWV9YCk7Cit9CisKKy8vIOmihOiniAorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXZpZXdDb2RlKGlkOiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3QoYC9hcGkvY29kZS9nZW4vcHJldmlldy8ke2lkfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICB9KTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9zdHlsZS5sZXNzIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvR2VuL3N0eWxlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5OWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Ub29sL0dlbi9zdHlsZS5sZXNzCkBAIC0wLDAgKzEsNCBAQAorLnN0ZXBzOmdsb2JhbCguYW50LXN0ZXBzKSB7CisgIG1heC13aWR0aDogNzUwcHg7CisgIG1hcmdpbjogMTZweCBhdXRvOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvU3dhZ2dlci9pbmRleC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvVG9vbC9Td2FnZ2VyL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1Rvb2wvU3dhZ2dlci9pbmRleC50c3gKQEAgLTAsMCArMSwzMSBAQAoraW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JzsKKworLyoqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKgorICogKi8KKworY29uc3QgQ2FjaGVJbmZvOiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZElmcmFtZScpOworICAgIGlmIChmcmFtZSkgeworICAgICAgY29uc3QgZGV2aWNlV2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgICBjb25zdCBkZXZpY2VIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAgICAgZnJhbWUuc3R5bGUud2lkdGggPSBgJHtOdW1iZXIoZGV2aWNlV2lkdGgpIC0gMjYwfXB4YDsKKyAgICAgIGZyYW1lLnN0eWxlLmhlaWdodCA9IGAke051bWJlcihkZXZpY2VIZWlnaHQpIC0gMTIwfXB4YDsKKyAgICB9CisgIH0pOworCisgIHJldHVybiAoCisgICAgPGRpdiBzdHlsZT17e319PgorICAgICAgPGlmcmFtZQorICAgICAgICBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBib3JkZXI6ICcwcHgnLCBoZWlnaHQ6ICcxMDAlJyB9fQorICAgICAgICBzcmM9e2AvYXBpL3N3YWdnZXItdWkvaW5kZXguaHRtbGB9CisgICAgICAgIGlkPSJiZElmcmFtZSIKKyAgICAgIC8+CisgICAgPC9kaXY+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBDYWNoZUluZm87CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvQ2VudGVyLmxlc3MgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvQ2VudGVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL0NlbnRlci9DZW50ZXIubGVzcwpAQCAtMCwwICsxLDYxIEBACisKKy5hdmF0YXJIb2xkZXIgeworICBtYXJnaW4tYm90dG9tOiAxNnB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBoZWlnaHQ6IDEyMHB4OworICAKKyAgJiA+IGltZyB7CisgICAgd2lkdGg6IDEyMHB4OworICAgIGhlaWdodDogMTIwcHg7CisgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgIH0KKyAgJjpob3ZlcjphZnRlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICByaWdodDogMDsKKyAgICBib3R0b206IDA7CisgICAgbGVmdDogMDsKKyAgICBjb2xvcjogI2VlZTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGxpbmUtaGVpZ2h0OiAxMTBweDsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CisgICAgYm9yZGVyLXJhZGl1czogNTAlOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBjb250ZW50OiAnKyc7CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKKyAgfQorfQorCisudGVhbVRpdGxlIHsKKyAgbWFyZ2luLWJvdHRvbTogMTJweDsKKyAgY29sb3I6IEBoZWFkaW5nLWNvbG9yOworICBmb250LXdlaWdodDogNTAwOworfQorCisudGVhbSB7CisgIDpnbG9iYWwgeworICAgIC5hbnQtYXZhdGFyIHsKKyAgICAgIG1hcmdpbi1yaWdodDogMTJweDsKKyAgICB9CisgIH0KKworICBhIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tYm90dG9tOiAyNHB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgY29sb3I6IEB0ZXh0LWNvbG9yOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgd29yZC1icmVhazogYnJlYWstYWxsOworICAgIHRyYW5zaXRpb246IGNvbG9yIDAuM3M7CisKKyAgICAmOmhvdmVyIHsKKyAgICAgIGNvbG9yOiBAcHJpbWFyeS1jb2xvcjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL0NlbnRlci9jb21wb25lbnRzL0F2YXRhckNyb3BwZXIvY3JvcHBlci5jc3MgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9BdmF0YXJDcm9wcGVyL2Nyb3BwZXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmYzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9BdmF0YXJDcm9wcGVyL2Nyb3BwZXIuY3NzCkBAIC0wLDAgKzEsMzA5IEBACisvKiEKKyAqIENyb3BwZXIuanMgdjEuNS4xMworICogaHR0cHM6Ly9mZW5neXVhbmNoZW4uZ2l0aHViLmlvL2Nyb3BwZXJqcworICoKKyAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQgQ2hlbiBGZW5neXVhbgorICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKgorICogRGF0ZTogMjAyMi0xMS0yMFQwNTozMDo0My40NDRaCisgKi8KKworLmNyb3BwZXItY29udGFpbmVyIHsKKyAgZGlyZWN0aW9uOiBsdHI7CisgIGZvbnQtc2l6ZTogMDsKKyAgbGluZS1oZWlnaHQ6IDA7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgLW1zLXRvdWNoLWFjdGlvbjogbm9uZTsKKyAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKKyAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKK30KKworLmNyb3BwZXItY29udGFpbmVyIGltZyB7CisgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47CisgICAgICAgICAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIGltYWdlLW9yaWVudGF0aW9uOiAwZGVnOworICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDsKKyAgICBtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudDsKKyAgICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7CisgICAgbWluLXdpZHRoOiAwICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDEwMCU7CisgIH0KKworLmNyb3BwZXItd3JhcC1ib3gsCisuY3JvcHBlci1jYW52YXMsCisuY3JvcHBlci1kcmFnLWJveCwKKy5jcm9wcGVyLWNyb3AtYm94LAorLmNyb3BwZXItbW9kYWwgeworICBib3R0b206IDA7CisgIGxlZnQ6IDA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgcmlnaHQ6IDA7CisgIHRvcDogMDsKK30KKworLmNyb3BwZXItd3JhcC1ib3gsCisuY3JvcHBlci1jYW52YXMgeworICBvdmVyZmxvdzogaGlkZGVuOworfQorCisuY3JvcHBlci1kcmFnLWJveCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIG9wYWNpdHk6IDA7Cit9CisKKy5jcm9wcGVyLW1vZGFsIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgb3BhY2l0eTogMC41OworfQorCisuY3JvcHBlci12aWV3LWJveCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDEwMCU7CisgIG91dGxpbmU6IDFweCBzb2xpZCAjMzlmOworICBvdXRsaW5lLWNvbG9yOiByZ2JhKDUxLCAxNTMsIDI1NSwgNzUlKTsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKy5jcm9wcGVyLWRhc2hlZCB7CisgIGJvcmRlcjogMCBkYXNoZWQgI2VlZTsKKyAgZGlzcGxheTogYmxvY2s7CisgIG9wYWNpdHk6IDAuNTsKKyAgcG9zaXRpb246IGFic29sdXRlOworfQorCisuY3JvcHBlci1kYXNoZWQuZGFzaGVkLWggeworICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKKyAgICBib3JkZXItdG9wLXdpZHRoOiAxcHg7CisgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLyAzKTsKKyAgICBsZWZ0OiAwOworICAgIHRvcDogY2FsYygxMDAlIC8gMyk7CisgICAgd2lkdGg6IDEwMCU7CisgIH0KKworLmNyb3BwZXItZGFzaGVkLmRhc2hlZC12IHsKKyAgICBib3JkZXItbGVmdC13aWR0aDogMXB4OworICAgIGJvcmRlci1yaWdodC13aWR0aDogMXB4OworICAgIGhlaWdodDogMTAwJTsKKyAgICBsZWZ0OiBjYWxjKDEwMCUgLyAzKTsKKyAgICB0b3A6IDA7CisgICAgd2lkdGg6IGNhbGMoMTAwJSAvIDMpOworICB9CisKKy5jcm9wcGVyLWNlbnRlciB7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDA7CisgIGxlZnQ6IDUwJTsKKyAgb3BhY2l0eTogMC43NTsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDUwJTsKKyAgd2lkdGg6IDA7Cit9CisKKy5jcm9wcGVyLWNlbnRlcjo6YmVmb3JlLAorICAuY3JvcHBlci1jZW50ZXI6OmFmdGVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworICAgIGNvbnRlbnQ6ICIgIjsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIH0KKworLmNyb3BwZXItY2VudGVyOjpiZWZvcmUgeworICAgIGhlaWdodDogMXB4OworICAgIGxlZnQ6IC0zcHg7CisgICAgdG9wOiAwOworICAgIHdpZHRoOiA3cHg7CisgIH0KKworLmNyb3BwZXItY2VudGVyOjphZnRlciB7CisgICAgaGVpZ2h0OiA3cHg7CisgICAgbGVmdDogMDsKKyAgICB0b3A6IC0zcHg7CisgICAgd2lkdGg6IDFweDsKKyAgfQorCisuY3JvcHBlci1mYWNlLAorLmNyb3BwZXItbGluZSwKKy5jcm9wcGVyLXBvaW50IHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogMTAwJTsKKyAgb3BhY2l0eTogMC4xOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHdpZHRoOiAxMDAlOworfQorCisuY3JvcHBlci1mYWNlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgbGVmdDogMDsKKyAgdG9wOiAwOworfQorCisuY3JvcHBlci1saW5lIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzM5ZjsKK30KKworLmNyb3BwZXItbGluZS5saW5lLWUgeworICAgIGN1cnNvcjogZXctcmVzaXplOworICAgIHJpZ2h0OiAtM3B4OworICAgIHRvcDogMDsKKyAgICB3aWR0aDogNXB4OworICB9CisKKy5jcm9wcGVyLWxpbmUubGluZS1uIHsKKyAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKKyAgICBoZWlnaHQ6IDVweDsKKyAgICBsZWZ0OiAwOworICAgIHRvcDogLTNweDsKKyAgfQorCisuY3JvcHBlci1saW5lLmxpbmUtdyB7CisgICAgY3Vyc29yOiBldy1yZXNpemU7CisgICAgbGVmdDogLTNweDsKKyAgICB0b3A6IDA7CisgICAgd2lkdGg6IDVweDsKKyAgfQorCisuY3JvcHBlci1saW5lLmxpbmUtcyB7CisgICAgYm90dG9tOiAtM3B4OworICAgIGN1cnNvcjogbnMtcmVzaXplOworICAgIGhlaWdodDogNXB4OworICAgIGxlZnQ6IDA7CisgIH0KKworLmNyb3BwZXItcG9pbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzlmOworICBoZWlnaHQ6IDVweDsKKyAgb3BhY2l0eTogMC43NTsKKyAgd2lkdGg6IDVweDsKK30KKworLmNyb3BwZXItcG9pbnQucG9pbnQtZSB7CisgICAgY3Vyc29yOiBldy1yZXNpemU7CisgICAgbWFyZ2luLXRvcDogLTNweDsKKyAgICByaWdodDogLTNweDsKKyAgICB0b3A6IDUwJTsKKyAgfQorCisuY3JvcHBlci1wb2ludC5wb2ludC1uIHsKKyAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKKyAgICBsZWZ0OiA1MCU7CisgICAgbWFyZ2luLWxlZnQ6IC0zcHg7CisgICAgdG9wOiAtM3B4OworICB9CisKKy5jcm9wcGVyLXBvaW50LnBvaW50LXcgeworICAgIGN1cnNvcjogZXctcmVzaXplOworICAgIGxlZnQ6IC0zcHg7CisgICAgbWFyZ2luLXRvcDogLTNweDsKKyAgICB0b3A6IDUwJTsKKyAgfQorCisuY3JvcHBlci1wb2ludC5wb2ludC1zIHsKKyAgICBib3R0b206IC0zcHg7CisgICAgY3Vyc29yOiBzLXJlc2l6ZTsKKyAgICBsZWZ0OiA1MCU7CisgICAgbWFyZ2luLWxlZnQ6IC0zcHg7CisgIH0KKworLmNyb3BwZXItcG9pbnQucG9pbnQtbmUgeworICAgIGN1cnNvcjogbmVzdy1yZXNpemU7CisgICAgcmlnaHQ6IC0zcHg7CisgICAgdG9wOiAtM3B4OworICB9CisKKy5jcm9wcGVyLXBvaW50LnBvaW50LW53IHsKKyAgICBjdXJzb3I6IG53c2UtcmVzaXplOworICAgIGxlZnQ6IC0zcHg7CisgICAgdG9wOiAtM3B4OworICB9CisKKy5jcm9wcGVyLXBvaW50LnBvaW50LXN3IHsKKyAgICBib3R0b206IC0zcHg7CisgICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKKyAgICBsZWZ0OiAtM3B4OworICB9CisKKy5jcm9wcGVyLXBvaW50LnBvaW50LXNlIHsKKyAgICBib3R0b206IC0zcHg7CisgICAgY3Vyc29yOiBud3NlLXJlc2l6ZTsKKyAgICBoZWlnaHQ6IDIwcHg7CisgICAgb3BhY2l0eTogMTsKKyAgICByaWdodDogLTNweDsKKyAgICB3aWR0aDogMjBweDsKKyAgfQorCitAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsKKworLmNyb3BwZXItcG9pbnQucG9pbnQtc2UgeworICAgICAgaGVpZ2h0OiAxNXB4OworICAgICAgd2lkdGg6IDE1cHg7CisgIH0KKyAgICB9CisKK0BtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgeworCisuY3JvcHBlci1wb2ludC5wb2ludC1zZSB7CisgICAgICBoZWlnaHQ6IDEwcHg7CisgICAgICB3aWR0aDogMTBweDsKKyAgfQorICAgIH0KKworQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgeworCisuY3JvcHBlci1wb2ludC5wb2ludC1zZSB7CisgICAgICBoZWlnaHQ6IDVweDsKKyAgICAgIG9wYWNpdHk6IDAuNzU7CisgICAgICB3aWR0aDogNXB4OworICB9CisgICAgfQorCisuY3JvcHBlci1wb2ludC5wb2ludC1zZTo6YmVmb3JlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzlmOworICAgIGJvdHRvbTogLTUwJTsKKyAgICBjb250ZW50OiAiICI7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgaGVpZ2h0OiAyMDAlOworICAgIG9wYWNpdHk6IDA7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAtNTAlOworICAgIHdpZHRoOiAyMDAlOworICB9CisKKy5jcm9wcGVyLWludmlzaWJsZSB7CisgIG9wYWNpdHk6IDA7Cit9CisKKy5jcm9wcGVyLWJnIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFBUU1BQUFBbFBXMGlBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFCbEJNVkVYTXpNei8vLy9UalJWMkFBQUFDWEJJV1hNQUFBcnJBQUFLNndHQ2l3MWFBQUFBSEhSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCR2FYSmxkMjl5YTNNZ1ExTTI2THl5akFBQUFCRkpSRUZVQ0psaitNL0FnQlZoRi8wUEFINi9EL0hrRHhPR0FBQUFBRWxGVGtTdVFtQ0MiKTsKK30KKworLmNyb3BwZXItaGlkZSB7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgd2lkdGg6IDA7Cit9CisKKy5jcm9wcGVyLWhpZGRlbiB7CisgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKK30KKworLmNyb3BwZXItbW92ZSB7CisgIGN1cnNvcjogbW92ZTsKK30KKworLmNyb3BwZXItY3JvcCB7CisgIGN1cnNvcjogY3Jvc3NoYWlyOworfQorCisuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1kcmFnLWJveCwKKy5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLWZhY2UsCisuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1saW5lLAorLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItcG9pbnQgeworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbWFnZXMvYmcucG5nIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbWFnZXMvYmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzA1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9BdmF0YXJDcm9wcGVyL2ltYWdlcy9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbmRleC5sZXNzIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbmRleC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2ZlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9BdmF0YXJDcm9wcGVyL2luZGV4Lmxlc3MKQEAgLTAsMCArMSwxMCBAQAorLmF2YXRhclByZXZpZXcgeworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl0b3A6IDUwJTsKKwl0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1MCUsIC01MCUpOworCXdpZHRoOiAyMDBweDsKKwloZWlnaHQ6IDIwMHB4OworCWJvcmRlci1yYWRpdXM6IDUwJTsKKwlib3gtc2hhZG93OiAwIDAgNHB4ICNjY2M7CisJb3ZlcmZsb3c6IGhpZGRlbjsgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbmRleC50c3ggYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9BdmF0YXJDcm9wcGVyL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2QwYmNmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlci9pbmRleC50c3gKQEAgLTAsMCArMSwxNDQgQEAKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBNb2RhbCwgUm93LCBDb2wsIEJ1dHRvbiwgU3BhY2UsIFVwbG9hZCwgbWVzc2FnZSB9IGZyb20gJ2FudGQnOworaW1wb3J0IHsgdXNlSW50bCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgdXBsb2FkQXZhdGFyIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vdXNlcic7CitpbXBvcnQgeyBDcm9wcGVyIH0gZnJvbSAncmVhY3QtY3JvcHBlcic7CitpbXBvcnQgJy4vY3JvcHBlci5jc3MnOworaW1wb3J0IHN0eWxlcyBmcm9tICcuL2luZGV4Lmxlc3MnOworaW1wb3J0IHsKKyAgTWludXNPdXRsaW5lZCwKKyAgUGx1c091dGxpbmVkLAorICBSZWRvT3V0bGluZWQsCisgIFVuZG9PdXRsaW5lZCwKKyAgVXBsb2FkT3V0bGluZWQsCit9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIyLzAyLzI0CisgKgorICogKi8KKworZXhwb3J0IHR5cGUgQXZhdGFyQ3JvcHBlclByb3BzID0geworICBvbkZpbmlzaGVkOiAoaXNTdWNjZXNzOiBib29sZWFuKSA9PiB2b2lkOworICBvcGVuOiBib29sZWFuOworICBkYXRhOiBhbnk7Cit9OworCitjb25zdCBBdmF0YXJDcm9wcGVyRm9ybTogUmVhY3QuRkM8QXZhdGFyQ3JvcHBlclByb3BzPiA9IChwcm9wcykgPT4geworICBjb25zdCBjcm9wcGVyUmVmID0gdXNlUmVmPEhUTUxJbWFnZUVsZW1lbnQ+KG51bGwpOworICBjb25zdCBbYXZhdGFyRGF0YSwgc2V0QXZhdGFyRGF0YV0gPSB1c2VTdGF0ZTxhbnk+KCk7CisgIGNvbnN0IFtwcmV2aWV3RGF0YSwgc2V0UHJldmlld0RhdGFdID0gdXNlU3RhdGUoKTsKKworICB1c2VFZmZlY3QoKCkgPT4geworICAgIHNldEF2YXRhckRhdGEocHJvcHMuZGF0YSk7CisgIH0sIFtwcm9wc10pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisgIGNvbnN0IGhhbmRsZU9rID0gKCkgPT4geworICAgIGNvbnN0IGltYWdlRWxlbWVudDogYW55ID0gY3JvcHBlclJlZj8uY3VycmVudDsKKyAgICBjb25zdCBjcm9wcGVyOiBhbnkgPSBpbWFnZUVsZW1lbnQ/LmNyb3BwZXI7CisgICAgY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKCkudG9CbG9iKChibG9iOiBCbG9iKSA9PiB7CisgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgZm9ybURhdGEuYXBwZW5kKCdhdmF0YXJmaWxlJywgYmxvYik7CisgICAgICB1cGxvYWRBdmF0YXIoZm9ybURhdGEpLnRoZW4oKHJlcykgPT4geworICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICAgIG1lc3NhZ2Uuc3VjY2VzcyhyZXMubXNnKTsgICAgICAgICAgCisgICAgICAgICAgcHJvcHMub25GaW5pc2hlZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXNzYWdlLndhcm5pbmcocmVzLm1zZyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sICdpbWFnZS9wbmcnKTsKKyAgfTsKKyAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geworICAgIHByb3BzLm9uRmluaXNoZWQoZmFsc2UpOworICB9OworICBjb25zdCBvbkNyb3AgPSAoKSA9PiB7CisgICAgY29uc3QgaW1hZ2VFbGVtZW50OiBhbnkgPSBjcm9wcGVyUmVmPy5jdXJyZW50OworICAgIGNvbnN0IGNyb3BwZXI6IGFueSA9IGltYWdlRWxlbWVudD8uY3JvcHBlcjsKKyAgICBzZXRQcmV2aWV3RGF0YShjcm9wcGVyLmdldENyb3BwZWRDYW52YXMoKS50b0RhdGFVUkwoKSk7CisgIH07CisgIGNvbnN0IG9uUm90YXRlUmlnaHQgPSAoKSA9PiB7CisgICAgY29uc3QgaW1hZ2VFbGVtZW50OiBhbnkgPSBjcm9wcGVyUmVmPy5jdXJyZW50OworICAgIGNvbnN0IGNyb3BwZXI6IGFueSA9IGltYWdlRWxlbWVudD8uY3JvcHBlcjsKKyAgICBjcm9wcGVyLnJvdGF0ZSg5MCk7CisgIH07CisgIGNvbnN0IG9uUm90YXRlTGVmdCA9ICgpID0+IHsKKyAgICBjb25zdCBpbWFnZUVsZW1lbnQ6IGFueSA9IGNyb3BwZXJSZWY/LmN1cnJlbnQ7CisgICAgY29uc3QgY3JvcHBlcjogYW55ID0gaW1hZ2VFbGVtZW50Py5jcm9wcGVyOworICAgIGNyb3BwZXIucm90YXRlKC05MCk7CisgIH07CisgIGNvbnN0IG9uWm9vbUluID0gKCkgPT4geworICAgIGNvbnN0IGltYWdlRWxlbWVudDogYW55ID0gY3JvcHBlclJlZj8uY3VycmVudDsKKyAgICBjb25zdCBjcm9wcGVyOiBhbnkgPSBpbWFnZUVsZW1lbnQ/LmNyb3BwZXI7CisgICAgY3JvcHBlci56b29tKDAuMSk7CisgIH07CisgIGNvbnN0IG9uWm9vbU91dCA9ICgpID0+IHsKKyAgICBjb25zdCBpbWFnZUVsZW1lbnQ6IGFueSA9IGNyb3BwZXJSZWY/LmN1cnJlbnQ7CisgICAgY29uc3QgY3JvcHBlcjogYW55ID0gaW1hZ2VFbGVtZW50Py5jcm9wcGVyOworICAgIGNyb3BwZXIuem9vbSgtMC4xKTsKKyAgfTsKKyAgY29uc3QgYmVmb3JlVXBsb2FkID0gKGZpbGU6IGFueSkgPT4geworICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CisgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CisgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHsKKyAgICAgIHNldEF2YXRhckRhdGEocmVhZGVyLnJlc3VsdCk7CisgICAgfTsKKyAgfTsKKyAgcmV0dXJuICgKKyAgICA8TW9kYWwKKyAgICAgIHdpZHRoPXs4MDB9CisgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5tb2RpZnlfYXZhdGFyJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfkv67mlLnlpLTlg48nLAorICAgICAgfSl9CisgICAgICBvcGVuPXtwcm9wcy5vcGVufQorICAgICAgZGVzdHJveU9uQ2xvc2UKKyAgICAgIG9uT2s9e2hhbmRsZU9rfQorICAgICAgb25DYW5jZWw9e2hhbmRsZUNhbmNlbH0KKyAgICA+CisgICAgICA8Um93IGd1dHRlcj17WzE2LCAxNl19PgorICAgICAgICA8Q29sIHNwYW49ezEyfSBvcmRlcj17MX0+CisgICAgICAgICAgPENyb3BwZXIKKyAgICAgICAgICAgIHJlZj17Y3JvcHBlclJlZn0KKyAgICAgICAgICAgIHNyYz17YXZhdGFyRGF0YX0KKyAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogMzUwLCB3aWR0aDogJzEwMCUnLCBtYXJnaW5Cb3R0b206ICcxNnB4JyB9fQorICAgICAgICAgICAgaW5pdGlhbEFzcGVjdFJhdGlvPXsxfQorICAgICAgICAgICAgZ3VpZGVzPXtmYWxzZX0KKyAgICAgICAgICAgIGNyb3A9e29uQ3JvcH0KKyAgICAgICAgICAgIHpvb21hYmxlPXt0cnVlfQorICAgICAgICAgICAgem9vbU9uV2hlZWw9e3RydWV9CisgICAgICAgICAgICByb3RhdGFibGU9e3RydWV9CisgICAgICAgICAgLz4KKyAgICAgICAgPC9Db2w+CisgICAgICAgIDxDb2wgc3Bhbj17MTJ9IG9yZGVyPXsyfT4KKyAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmF2YXRhclByZXZpZXd9PgorICAgICAgICAgICAgPGltZyBzcmM9e3ByZXZpZXdEYXRhfSBzdHlsZT17eyBoZWlnaHQ6ICcxMDAlJywgd2lkdGg6ICcxMDAlJyB9fSAvPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L0NvbD4KKyAgICAgIDwvUm93PgorICAgICAgPFJvdyBndXR0ZXI9e1sxNiwgMTZdfT4KKyAgICAgICAgPENvbCBzcGFuPXs2fT4KKyAgICAgICAgICA8VXBsb2FkIGJlZm9yZVVwbG9hZD17YmVmb3JlVXBsb2FkfSBtYXhDb3VudD17MX0+CisgICAgICAgICAgICA8QnV0dG9uPgorICAgICAgICAgICAgICA8VXBsb2FkT3V0bGluZWQgLz4KKyAgICAgICAgICAgICAg5LiK5LygCisgICAgICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgICA8L1VwbG9hZD4KKyAgICAgICAgPC9Db2w+CisgICAgICAgIDxDb2w+CisgICAgICAgICAgPFNwYWNlPgorICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8UmVkb091dGxpbmVkIC8+fSBvbkNsaWNrPXtvblJvdGF0ZVJpZ2h0fSAvPgorICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8VW5kb091dGxpbmVkIC8+fSBvbkNsaWNrPXtvblJvdGF0ZUxlZnR9IC8+CisgICAgICAgICAgICA8QnV0dG9uIGljb249ezxQbHVzT3V0bGluZWQgLz59IG9uQ2xpY2s9e29uWm9vbUlufSAvPgorICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8TWludXNPdXRsaW5lZCAvPn0gb25DbGljaz17b25ab29tT3V0fSAvPgorICAgICAgICAgIDwvU3BhY2U+CisgICAgICAgIDwvQ29sPgorICAgICAgPC9Sb3c+CisgICAgPC9Nb2RhbD4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IEF2YXRhckNyb3BwZXJGb3JtOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQmFzZUluZm8vaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvQmFzZUluZm8vaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGNhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvY29tcG9uZW50cy9CYXNlSW5mby9pbmRleC50c3gKQEAgLTAsMCArMSwxMTkgQEAKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBGb3JtLCBtZXNzYWdlLCBSb3cgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UsIHVzZUludGwgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IFByb0Zvcm0sIFByb0Zvcm1SYWRpbywgUHJvRm9ybVRleHQgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyB1cGRhdGVVc2VyUHJvZmlsZSB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL3VzZXInOworCisKK2V4cG9ydCB0eXBlIEJhc2VJbmZvUHJvcHMgPSB7CisgIHZhbHVlczogUGFydGlhbDxBUEkuQ3VycmVudFVzZXI+IHwgdW5kZWZpbmVkOworfTsKKworY29uc3QgQmFzZUluZm86IFJlYWN0LkZDPEJhc2VJbmZvUHJvcHM+ID0gKHByb3BzKSA9PiB7CisgIGNvbnN0IFtmb3JtXSA9IEZvcm0udXNlRm9ybSgpOworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBjb25zdCBkYXRhID0geyAuLi5wcm9wcy52YWx1ZXMsIC4uLnZhbHVlcyB9IGFzIEFQSS5DdXJyZW50VXNlcjsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlVXNlclByb2ZpbGUoZGF0YSk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+S/ruaUueaIkOWKnycpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLndhcm5pbmcocmVzcC5tc2cpOworICAgIH0KKyAgfTsKKworICByZXR1cm4gKAorICAgIDw+CisgICAgICA8UHJvRm9ybSBmb3JtPXtmb3JtfSBvbkZpbmlzaD17aGFuZGxlRmluaXNofSBpbml0aWFsVmFsdWVzPXtwcm9wcy52YWx1ZXN9PgorICAgICAgICA8Um93PgorICAgICAgICAgIDxQcm9Gb3JtVGV4dAorICAgICAgICAgICAgbmFtZT0ibmlja05hbWUiCisgICAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5uaWNrX25hbWUnLAorICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eUqOaIt+aYteensCcsCisgICAgICAgICAgICB9KX0KKyAgICAgICAgICAgIHdpZHRoPSJ4bCIKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXnlKjmiLfmmLXnp7AiCisgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogKAorICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeeUqOaIt+aYteensO+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeUqOaIt+aYteensO+8gSIgLz4KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXX0KKyAgICAgICAgICAvPgorICAgICAgICA8L1Jvdz4KKyAgICAgICAgPFJvdz4KKyAgICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICAgIG5hbWU9InBob25lbnVtYmVyIgorICAgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICAgIGlkOiAnc3lzdGVtLnVzZXIucGhvbmVudW1iZXInLAorICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aJi+acuuWPt+eggScsCisgICAgICAgICAgICB9KX0KKyAgICAgICAgICAgIHdpZHRoPSJ4bCIKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmiYvmnLrlj7fnoIEiCisgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXmiYvmnLrlj7fnoIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXmiYvmnLrlj7fnoIHvvIEiIC8+CisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF19CisgICAgICAgICAgLz4KKyAgICAgICAgPC9Sb3c+CisgICAgICAgIDxSb3c+CisgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICBuYW1lPSJlbWFpbCIKKyAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLmVtYWlsJywKKyAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfpgq7nrrEnLAorICAgICAgICAgICAgfSl9CisgICAgICAgICAgICB3aWR0aD0ieGwiCisgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl6YKu566xIgorICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGU6ICdlbWFpbCcsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+aXoOaViOeahOmCrueuseWcsOWdgCEnLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXpgq7nrrHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXpgq7nrrHvvIEiIC8+LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXX0KKyAgICAgICAgICAvPgorICAgICAgICA8L1Jvdz4KKyAgICAgICAgPFJvdz4KKyAgICAgICAgICA8UHJvRm9ybVJhZGlvLkdyb3VwCisgICAgICAgICAgICBvcHRpb25zPXtbCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYWJlbDogJ+eUtycsCisgICAgICAgICAgICAgICAgdmFsdWU6ICcwJywKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxhYmVsOiAn5aWzJywKKyAgICAgICAgICAgICAgICB2YWx1ZTogJzEnLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXX0KKyAgICAgICAgICAgIG5hbWU9InNleCIKKyAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICBpZDogJ3N5c3RlbS51c2VyLnNleCcsCisgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnc2V4JywKKyAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgd2lkdGg9InhsIgorICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0i6K+36L6T5YWl5oCn5Yir77yBIiBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl5oCn5Yir77yBIiAvPiwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF19CisgICAgICAgICAgLz4KKyAgICAgICAgPC9Sb3c+CisgICAgICA8L1Byb0Zvcm0+CisgICAgPC8+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBCYXNlSW5mbzsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL0NlbnRlci9jb21wb25lbnRzL1Jlc2V0UGFzc3dvcmQvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2NvbXBvbmVudHMvUmVzZXRQYXNzd29yZC9pbmRleC50c3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MjVkNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL0NlbnRlci9jb21wb25lbnRzL1Jlc2V0UGFzc3dvcmQvaW5kZXgudHN4CkBAIC0wLDAgKzEsODQgQEAKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CitpbXBvcnQgeyBGb3JtLCBtZXNzYWdlIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlLCB1c2VJbnRsIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyB1cGRhdGVVc2VyUHdkIH0gZnJvbSAnQC9zZXJ2aWNlcy9zeXN0ZW0vdXNlcic7CitpbXBvcnQgeyBQcm9Gb3JtLCBQcm9Gb3JtVGV4dCB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKKworY29uc3QgUmVzZXRQYXNzd29yZDogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IFtmb3JtXSA9IEZvcm0udXNlRm9ybSgpOworICBjb25zdCBpbnRsID0gdXNlSW50bCgpOworCisgIGNvbnN0IGhhbmRsZUZpbmlzaCA9IGFzeW5jICh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHsKKyAgICBjb25zdCByZXNwID0gYXdhaXQgdXBkYXRlVXNlclB3ZCh2YWx1ZXMub2xkUGFzc3dvcmQsIHZhbHVlcy5uZXdQYXNzd29yZCk7CisgICAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+WvhueggemHjee9ruaIkOWKn+OAgicpOworICAgIH0gZWxzZSB7CisgICAgICBtZXNzYWdlLndhcm5pbmcocmVzcC5tc2cpOworICAgIH0KKyAgfTsKKworICBjb25zdCBjaGVja1Bhc3N3b3JkID0gKHJ1bGU6IGFueSwgdmFsdWU6IHN0cmluZykgPT4geworICAgIGNvbnN0IGxvZ2luX3Bhc3N3b3JkID0gZm9ybS5nZXRGaWVsZFZhbHVlKCduZXdQYXNzd29yZCcpOworICAgIGlmICh2YWx1ZSA9PT0gbG9naW5fcGFzc3dvcmQpIHsKKyAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKKyAgICB9CisgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcign5Lik5qyh5a+G56CB6L6T5YWl5LiN5LiA6Ie0JykpOworICB9OworCisgIHJldHVybiAoCisgICAgPD4KKyAgICAgIDxQcm9Gb3JtIGZvcm09e2Zvcm19IG9uRmluaXNoPXtoYW5kbGVGaW5pc2h9PiAgICAgICAKKyAgICAgICAgICA8UHJvRm9ybVRleHQuUGFzc3dvcmQKKyAgICAgICAgICAgIG5hbWU9Im9sZFBhc3N3b3JkIgorICAgICAgICAgICAgbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICAgIGlkOiAnc3lzdGVtLnVzZXIub2xkX3Bhc3N3b3JkJywKKyAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfml6flr4bnoIEnLAorICAgICAgICAgICAgfSl9CisgICAgICAgICAgICB3aWR0aD0ieGwiCisgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5pen5a+G56CBIgorICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXml6flr4bnoIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXml6flr4bnoIHvvIEiIC8+LAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXX0KKyAgICAgICAgICAvPgorICAgICAgICAgIDxQcm9Gb3JtVGV4dC5QYXNzd29yZAorICAgICAgICAgICAgbmFtZT0ibmV3UGFzc3dvcmQiCisgICAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5uZXdfcGFzc3dvcmQnLAorICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aWsOWvhueggScsCisgICAgICAgICAgICB9KX0KKyAgICAgICAgICAgIHdpZHRoPSJ4bCIKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaXmlrDlr4bnoIEiCisgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9Iuivt+i+k+WFpeaWsOWvhuegge+8gSIgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaWsOWvhuegge+8gSIgLz4sCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdfQorICAgICAgICAgIC8+CisgICAgICAgICAgPFByb0Zvcm1UZXh0LlBhc3N3b3JkCisgICAgICAgICAgICBuYW1lPSJjb25maXJtUGFzc3dvcmQiCisgICAgICAgICAgICBsYWJlbD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgaWQ6ICdzeXN0ZW0udXNlci5jb25maXJtX3Bhc3N3b3JkJywKKyAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnoa7orqTlr4bnoIEnLAorICAgICAgICAgICAgfSl9CisgICAgICAgICAgICB3aWR0aD0ieGwiCisgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36L6T5YWl56Gu6K6k5a+G56CBIgorICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSLor7fovpPlhaXnoa7orqTlr4bnoIHvvIEiIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXnoa7orqTlr4bnoIHvvIEiIC8+CisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgeyB2YWxpZGF0b3I6IGNoZWNrUGFzc3dvcmQgfSwKKyAgICAgICAgICAgIF19CisgICAgICAgICAgLz4KKyAgICAgIDwvUHJvRm9ybT4KKyAgICA8Lz4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFJlc2V0UGFzc3dvcmQ7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9DZW50ZXIvaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2UzMDhjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvQ2VudGVyL2luZGV4LnRzeApAQCAtMCwwICsxLDIwMCBAQAoraW1wb3J0IHsKKyAgQ2x1c3Rlck91dGxpbmVkLAorICBNYWlsT3V0bGluZWQsCisgIFRlYW1PdXRsaW5lZCwKKyAgVXNlck91dGxpbmVkLAorICBNb2JpbGVPdXRsaW5lZCwKKyAgTWFuT3V0bGluZWQsCit9IGZyb20gJ0BhbnQtZGVzaWduL2ljb25zJzsKK2ltcG9ydCB7IENhcmQsIENvbCwgRGl2aWRlciwgTGlzdCwgUm93IH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7CitpbXBvcnQgc3R5bGVzIGZyb20gJy4vQ2VudGVyLmxlc3MnOworaW1wb3J0IEJhc2VJbmZvIGZyb20gJy4vY29tcG9uZW50cy9CYXNlSW5mbyc7CitpbXBvcnQgUmVzZXRQYXNzd29yZCBmcm9tICcuL2NvbXBvbmVudHMvUmVzZXRQYXNzd29yZCc7CitpbXBvcnQgQXZhdGFyQ3JvcHBlciBmcm9tICcuL2NvbXBvbmVudHMvQXZhdGFyQ3JvcHBlcic7CitpbXBvcnQgeyB1c2VSZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBnZXRVc2VySW5mbyB9IGZyb20gJ0Avc2VydmljZXMvc2Vzc2lvbic7CitpbXBvcnQgeyBQYWdlTG9hZGluZyB9IGZyb20gJ0BhbnQtZGVzaWduL3Byby1jb21wb25lbnRzJzsKKworY29uc3Qgb3BlcmF0aW9uVGFiTGlzdCA9IFsKKyAgeworICAgIGtleTogJ2Jhc2UnLAorICAgIHRhYjogKAorICAgICAgPHNwYW4+CisgICAgICAgIOWfuuacrOi1hOaWmQorICAgICAgPC9zcGFuPgorICAgICksCisgIH0sCisgIHsKKyAgICBrZXk6ICdwYXNzd29yZCcsCisgICAgdGFiOiAoCisgICAgICA8c3Bhbj4KKyAgICAgICAg6YeN572u5a+G56CBCisgICAgICA8L3NwYW4+CisgICAgKSwKKyAgfSwKK107CisKK2V4cG9ydCB0eXBlIHRhYktleVR5cGUgPSAnYmFzZScgfCAncGFzc3dvcmQnOworCitjb25zdCBDZW50ZXI6IFJlYWN0LkZDID0gKCkgPT4geworICAKKyAgY29uc3QgW3RhYktleSwgc2V0VGFiS2V5XSA9IHVzZVN0YXRlPHRhYktleVR5cGU+KCdiYXNlJyk7CisgIAorICBjb25zdCBbY3JvcHBlck1vZGFsT3Blbiwgc2V0Q3JvcHBlck1vZGFsT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7CisgIAorICAvLyAg6I635Y+W55So5oi35L+h5oGvCisgIGNvbnN0IHsgZGF0YTogdXNlckluZm8sIGxvYWRpbmcgfSA9IHVzZVJlcXVlc3QoYXN5bmMgKCkgPT4geworICAgIHJldHVybiB7IGRhdGE6IGF3YWl0IGdldFVzZXJJbmZvKCl9OworICB9KTsKKyAgaWYgKGxvYWRpbmcpIHsKKyAgICByZXR1cm4gPGRpdj5sb2FkaW5nLi4uPC9kaXY+OworICB9CisKKyAgY29uc3QgY3VycmVudFVzZXIgPSB1c2VySW5mbz8udXNlcjsKKworICAvLyAg5riy5p+T55So5oi35L+h5oGvCisgIGNvbnN0IHJlbmRlclVzZXJJbmZvID0gKHsKKyAgICB1c2VyTmFtZSwKKyAgICBwaG9uZW51bWJlciwKKyAgICBlbWFpbCwKKyAgICBzZXgsCisgICAgZGVwdCwKKyAgfTogUGFydGlhbDxBUEkuQ3VycmVudFVzZXI+KSA9PiB7CisgICAgcmV0dXJuICgKKyAgICAgIDxMaXN0PgorICAgICAgICA8TGlzdC5JdGVtPgorICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICA8VXNlck91dGxpbmVkCisgICAgICAgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6IDgsCisgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAvPgorICAgICAgICAgICAg55So5oi35ZCNCisgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPGRpdj57dXNlck5hbWV9PC9kaXY+CisgICAgICAgIDwvTGlzdC5JdGVtPgorICAgICAgICA8TGlzdC5JdGVtPgorICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICA8TWFuT3V0bGluZWQKKyAgICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogOCwKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgICDmgKfliKsKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2PntzZXggPT09ICcxJyA/ICflpbMnIDogJ+eUtyd9PC9kaXY+CisgICAgICAgIDwvTGlzdC5JdGVtPgorICAgICAgICA8TGlzdC5JdGVtPgorICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICA8TW9iaWxlT3V0bGluZWQKKyAgICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogOCwKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgICDnlLXor50KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2PntwaG9uZW51bWJlcn08L2Rpdj4KKyAgICAgICAgPC9MaXN0Lkl0ZW0+CisgICAgICAgIDxMaXN0Lkl0ZW0+CisgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgIDxNYWlsT3V0bGluZWQKKyAgICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogOCwKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgICDpgq7nrrEKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2PntlbWFpbH08L2Rpdj4KKyAgICAgICAgPC9MaXN0Lkl0ZW0+CisgICAgICAgIDxMaXN0Lkl0ZW0+CisgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgIDxDbHVzdGVyT3V0bGluZWQKKyAgICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogOCwKKyAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgIC8+CisgICAgICAgICAgICDpg6jpl6gKKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2PntkZXB0Py5kZXB0TmFtZX08L2Rpdj4KKyAgICAgICAgPC9MaXN0Lkl0ZW0+CisgICAgICA8L0xpc3Q+CisgICAgKTsKKyAgfTsKKworICAvLyDmuLLmn5N0YWLliIfmjaIKKyAgY29uc3QgcmVuZGVyQ2hpbGRyZW5CeVRhYktleSA9ICh0YWJWYWx1ZTogdGFiS2V5VHlwZSkgPT4geworICAgIGlmICh0YWJWYWx1ZSA9PT0gJ2Jhc2UnKSB7CisgICAgICByZXR1cm4gPEJhc2VJbmZvIHZhbHVlcz17Y3VycmVudFVzZXJ9IC8+OworICAgIH0KKyAgICBpZiAodGFiVmFsdWUgPT09ICdwYXNzd29yZCcpIHsKKyAgICAgIHJldHVybiA8UmVzZXRQYXNzd29yZCAvPjsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH07CisKKyAgaWYgKCFjdXJyZW50VXNlcikgeworICAgIHJldHVybiA8UGFnZUxvYWRpbmcgLz47CisgIH0KKworICByZXR1cm4gKAorICAgIDxkaXY+CisgICAgICA8Um93IGd1dHRlcj17WzE2LCAyNF19PgorICAgICAgICA8Q29sIGxnPXs4fSBtZD17MjR9PgorICAgICAgICAgIDxDYXJkCisgICAgICAgICAgICB0aXRsZT0i5Liq5Lq65L+h5oGvIgorICAgICAgICAgICAgYm9yZGVyZWQ9e2ZhbHNlfQorICAgICAgICAgICAgbG9hZGluZz17bG9hZGluZ30KKyAgICAgICAgICA+CisgICAgICAgICAgICB7IWxvYWRpbmcgJiYgKAorICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHRleHRBbGlnbjogImNlbnRlciJ9fT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmF2YXRhckhvbGRlcn0gb25DbGljaz17KCk9PntzZXRDcm9wcGVyTW9kYWxPcGVuKHRydWUpfX0+CisgICAgICAgICAgICAgICAgICA8aW1nIGFsdD0iIiBzcmM9e2N1cnJlbnRVc2VyLmF2YXRhcn0gLz4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICB7cmVuZGVyVXNlckluZm8oY3VycmVudFVzZXIpfQorICAgICAgICAgICAgICAgIDxEaXZpZGVyIGRhc2hlZCAvPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMudGVhbX0+CisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnRlYW1UaXRsZX0+6KeS6ImyPC9kaXY+CisgICAgICAgICAgICAgICAgICA8Um93IGd1dHRlcj17MzZ9PgorICAgICAgICAgICAgICAgICAgICB7Y3VycmVudFVzZXIucm9sZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VXNlci5yb2xlcy5tYXAoKGl0ZW06IGFueSkgPT4gKAorICAgICAgICAgICAgICAgICAgICAgICAgPENvbCBrZXk9e2l0ZW0ucm9sZUlkfSBsZz17MjR9IHhsPXsxMn0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZWFtT3V0bGluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6IDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAge2l0ZW0ucm9sZU5hbWV9CisgICAgICAgICAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgICAgICAgICApKX0KKyAgICAgICAgICAgICAgICAgIDwvUm93PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICl9CisgICAgICAgICAgPC9DYXJkPgorICAgICAgICA8L0NvbD4KKyAgICAgICAgPENvbCBsZz17MTZ9IG1kPXsyNH0+CisgICAgICAgICAgPENhcmQKKyAgICAgICAgICAgIGJvcmRlcmVkPXtmYWxzZX0KKyAgICAgICAgICAgIHRhYkxpc3Q9e29wZXJhdGlvblRhYkxpc3R9CisgICAgICAgICAgICBhY3RpdmVUYWJLZXk9e3RhYktleX0KKyAgICAgICAgICAgIG9uVGFiQ2hhbmdlPXsoX3RhYktleTogc3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgIHNldFRhYktleShfdGFiS2V5IGFzIHRhYktleVR5cGUpOworICAgICAgICAgICAgfX0KKyAgICAgICAgICA+CisgICAgICAgICAgICB7cmVuZGVyQ2hpbGRyZW5CeVRhYktleSh0YWJLZXkpfQorICAgICAgICAgIDwvQ2FyZD4KKyAgICAgICAgPC9Db2w+CisgICAgICA8L1Jvdz4KKyAgICAgIDxBdmF0YXJDcm9wcGVyCisgICAgICAgIG9uRmluaXNoZWQ9eygpID0+IHsKKyAgICAgICAgICBzZXRDcm9wcGVyTW9kYWxPcGVuKGZhbHNlKTsgICAgIAorICAgICAgICB9fQorICAgICAgICBvcGVuPXtjcm9wcGVyTW9kYWxPcGVufQorICAgICAgICBkYXRhPXtjdXJyZW50VXNlci5hdmF0YXJ9CisgICAgICAvPgorICAgIDwvZGl2PgorICApOworfTsKKworZXhwb3J0IGRlZmF1bHQgQ2VudGVyOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvTG9naW4vaW5kZXgudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvTG9naW4vaW5kZXgudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGY3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvVXNlci9Mb2dpbi9pbmRleC50c3gKQEAgLTAsMCArMSw0MzYgQEAKK2ltcG9ydCBGb290ZXIgZnJvbSAnQC9jb21wb25lbnRzL0Zvb3Rlcic7CitpbXBvcnQgeyBnZXRDYXB0Y2hhSW1nLCBsb2dpbiB9IGZyb20gJ0Avc2VydmljZXMvc3lzdGVtL2F1dGgnOworaW1wb3J0IHsgZ2V0RmFrZUNhcHRjaGEgfSBmcm9tICdAL3NlcnZpY2VzL2FudC1kZXNpZ24tcHJvL2xvZ2luJzsKK2ltcG9ydCB7CisgIEFsaXBheUNpcmNsZU91dGxpbmVkLAorICBMb2NrT3V0bGluZWQsCisgIE1vYmlsZU91dGxpbmVkLAorICBUYW9iYW9DaXJjbGVPdXRsaW5lZCwKKyAgVXNlck91dGxpbmVkLAorICBXZWlib0NpcmNsZU91dGxpbmVkLAorfSBmcm9tICdAYW50LWRlc2lnbi9pY29ucyc7CitpbXBvcnQgeworICBMb2dpbkZvcm0sCisgIFByb0Zvcm1DYXB0Y2hhLAorICBQcm9Gb3JtQ2hlY2tib3gsCisgIFByb0Zvcm1UZXh0LAorfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyB1c2VFbW90aW9uQ3NzIH0gZnJvbSAnQGFudC1kZXNpZ24vdXNlLWVtb3Rpb24tY3NzJzsKK2ltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UsIGhpc3RvcnksIFNlbGVjdExhbmcsIHVzZUludGwsIHVzZU1vZGVsLCBIZWxtZXQgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IEFsZXJ0LCBDb2wsIG1lc3NhZ2UsIFJvdywgVGFicywgSW1hZ2UgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBTZXR0aW5ncyBmcm9tICcuLi8uLi8uLi8uLi9jb25maWcvZGVmYXVsdFNldHRpbmdzJzsKK2ltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnOworaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJzsKK2ltcG9ydCB7IGNsZWFyU2Vzc2lvblRva2VuLCBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tICdAL2FjY2Vzcyc7CisKK2NvbnN0IEFjdGlvbkljb25zID0gKCkgPT4geworICBjb25zdCBsYW5nQ2xhc3NOYW1lID0gdXNlRW1vdGlvbkNzcygoeyB0b2tlbiB9KSA9PiB7CisgICAgcmV0dXJuIHsKKyAgICAgIG1hcmdpbkxlZnQ6ICc4cHgnLAorICAgICAgY29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLAorICAgICAgZm9udFNpemU6ICcyNHB4JywKKyAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLAorICAgICAgY3Vyc29yOiAncG9pbnRlcicsCisgICAgICB0cmFuc2l0aW9uOiAnY29sb3IgMC4zcycsCisgICAgICAnJjpob3Zlcic6IHsKKyAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yUHJpbWFyeUFjdGl2ZSwKKyAgICAgIH0sCisgICAgfTsKKyAgfSk7CisKKyAgcmV0dXJuICgKKyAgICA8PgorICAgICAgPEFsaXBheUNpcmNsZU91dGxpbmVkIGtleT0iQWxpcGF5Q2lyY2xlT3V0bGluZWQiIGNsYXNzTmFtZT17bGFuZ0NsYXNzTmFtZX0gLz4KKyAgICAgIDxUYW9iYW9DaXJjbGVPdXRsaW5lZCBrZXk9IlRhb2Jhb0NpcmNsZU91dGxpbmVkIiBjbGFzc05hbWU9e2xhbmdDbGFzc05hbWV9IC8+CisgICAgICA8V2VpYm9DaXJjbGVPdXRsaW5lZCBrZXk9IldlaWJvQ2lyY2xlT3V0bGluZWQiIGNsYXNzTmFtZT17bGFuZ0NsYXNzTmFtZX0gLz4KKyAgICA8Lz4KKyAgKTsKK307CisKK2NvbnN0IExhbmcgPSAoKSA9PiB7CisgIGNvbnN0IGxhbmdDbGFzc05hbWUgPSB1c2VFbW90aW9uQ3NzKCh7IHRva2VuIH0pID0+IHsKKyAgICByZXR1cm4geworICAgICAgd2lkdGg6IDQyLAorICAgICAgaGVpZ2h0OiA0MiwKKyAgICAgIGxpbmVIZWlnaHQ6ICc0MnB4JywKKyAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLAorICAgICAgcmlnaHQ6IDE2LAorICAgICAgYm9yZGVyUmFkaXVzOiB0b2tlbi5ib3JkZXJSYWRpdXMsCisgICAgICAnOmhvdmVyJzogeworICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuLmNvbG9yQmdUZXh0SG92ZXIsCisgICAgICB9LAorICAgIH07CisgIH0pOworCisgIHJldHVybiAoCisgICAgPGRpdiBjbGFzc05hbWU9e2xhbmdDbGFzc05hbWV9IGRhdGEtbGFuZz4KKyAgICAgIHtTZWxlY3RMYW5nICYmIDxTZWxlY3RMYW5nIC8+fQorICAgIDwvZGl2PgorICApOworfTsKKworY29uc3QgTG9naW5NZXNzYWdlOiBSZWFjdC5GQzx7CisgIGNvbnRlbnQ6IHN0cmluZzsKK30+ID0gKHsgY29udGVudCB9KSA9PiB7CisgIHJldHVybiAoCisgICAgPEFsZXJ0CisgICAgICBzdHlsZT17eworICAgICAgICBtYXJnaW5Cb3R0b206IDI0LAorICAgICAgfX0KKyAgICAgIG1lc3NhZ2U9e2NvbnRlbnR9CisgICAgICB0eXBlPSJlcnJvciIKKyAgICAgIHNob3dJY29uCisgICAgLz4KKyAgKTsKK307CisKK2NvbnN0IExvZ2luOiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgY29uc3QgW3VzZXJMb2dpblN0YXRlLCBzZXRVc2VyTG9naW5TdGF0ZV0gPSB1c2VTdGF0ZTxBUEkuTG9naW5SZXN1bHQ+KHtjb2RlOiAyMDB9KTsKKyAgY29uc3QgW3R5cGUsIHNldFR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPignYWNjb3VudCcpOworICBjb25zdCB7IGluaXRpYWxTdGF0ZSwgc2V0SW5pdGlhbFN0YXRlIH0gPSB1c2VNb2RlbCgnQEBpbml0aWFsU3RhdGUnKTsKKyAgY29uc3QgW2NhcHRjaGFDb2RlLCBzZXRDYXB0Y2hhQ29kZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTsKKyAgY29uc3QgW3V1aWQsIHNldFV1aWRdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7CisKKyAgY29uc3QgY29udGFpbmVyQ2xhc3NOYW1lID0gdXNlRW1vdGlvbkNzcygoKSA9PiB7CisgICAgcmV0dXJuIHsKKyAgICAgIGRpc3BsYXk6ICdmbGV4JywKKyAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLAorICAgICAgaGVpZ2h0OiAnMTAwdmgnLAorICAgICAgb3ZlcmZsb3c6ICdhdXRvJywKKyAgICAgIGJhY2tncm91bmRJbWFnZToKKyAgICAgICAgInVybCgnaHR0cHM6Ly9tZG4uYWxpcGF5b2JqZWN0cy5jb20veXV5YW5fcWswb3hoL2FmdHMvaW1nL1YtX29TNnItaTd3QUFBQUFBQUFBQUFBQUZsOTRBUUJyJykiLAorICAgICAgYmFja2dyb3VuZFNpemU6ICcxMDAlIDEwMCUnLAorICAgIH07CisgIH0pOworCisgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7CisKKyAgY29uc3QgZ2V0Q2FwdGNoYUNvZGUgPSBhc3luYyAoKSA9PiB7CisgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRDYXB0Y2hhSW1nKCk7CisgICAgY29uc3QgaW1nZGF0YSA9IGBkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtyZXNwb25zZS5pbWd9YDsKKyAgICBzZXRDYXB0Y2hhQ29kZShpbWdkYXRhKTsKKyAgICBzZXRVdWlkKHJlc3BvbnNlLnV1aWQpOworICB9OworCisgIGNvbnN0IGZldGNoVXNlckluZm8gPSBhc3luYyAoKSA9PiB7CisgICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCBpbml0aWFsU3RhdGU/LmZldGNoVXNlckluZm8/LigpOworICAgIGlmICh1c2VySW5mbykgeworICAgICAgZmx1c2hTeW5jKCgpID0+IHsKKyAgICAgICAgc2V0SW5pdGlhbFN0YXRlKChzKSA9PiAoeworICAgICAgICAgIC4uLnMsCisgICAgICAgICAgY3VycmVudFVzZXI6IHVzZXJJbmZvLAorICAgICAgICB9KSk7CisgICAgICB9KTsKKyAgICB9CisgIH07CisKKyAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKHZhbHVlczogQVBJLkxvZ2luUGFyYW1zKSA9PiB7CisgICAgdHJ5IHsKKyAgICAgIC8vIOeZu+W9lQorICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBsb2dpbih7IC4uLnZhbHVlcywgdXVpZCB9KTsKKyAgICAgIGlmIChyZXNwb25zZS5jb2RlID09PSAyMDApIHsKKyAgICAgICAgY29uc3QgZGVmYXVsdExvZ2luU3VjY2Vzc01lc3NhZ2UgPSBpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgIGlkOiAncGFnZXMubG9naW4uc3VjY2VzcycsCisgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnmbvlvZXmiJDlip/vvIEnLAorICAgICAgICB9KTsKKyAgICAgICAgY29uc3QgY3VycmVudCA9IG5ldyBEYXRlKCk7CisgICAgICAgIGNvbnN0IGV4cGlyZVRpbWUgPSBjdXJyZW50LnNldFRpbWUoY3VycmVudC5nZXRUaW1lKCkgKyAxMDAwICogMTIgKiA2MCAqIDYwKTsKKyAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIHJlc3BvbnNlOiAnLCByZXNwb25zZSk7CisgICAgICAgIHNldFNlc3Npb25Ub2tlbihyZXNwb25zZT8udG9rZW4sIHJlc3BvbnNlPy50b2tlbiwgZXhwaXJlVGltZSk7CisgICAgICAgIG1lc3NhZ2Uuc3VjY2VzcyhkZWZhdWx0TG9naW5TdWNjZXNzTWVzc2FnZSk7CisgICAgICAgIGF3YWl0IGZldGNoVXNlckluZm8oKTsKKyAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIG9rJyk7CisgICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtczsKKyAgICAgICAgaGlzdG9yeS5wdXNoKHVybFBhcmFtcy5nZXQoJ3JlZGlyZWN0JykgfHwgJy8nKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UubXNnKTsKKyAgICAgICAgY2xlYXJTZXNzaW9uVG9rZW4oKTsKKyAgICAgICAgLy8g5aaC5p6c5aSx6LSl5Y676K6+572u55So5oi36ZSZ6K+v5L+h5oGvCisgICAgICAgIHNldFVzZXJMb2dpblN0YXRlKHsgLi4ucmVzcG9uc2UsIHR5cGUgfSk7CisgICAgICAgIGdldENhcHRjaGFDb2RlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIGNvbnN0IGRlZmF1bHRMb2dpbkZhaWx1cmVNZXNzYWdlID0gaW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgaWQ6ICdwYWdlcy5sb2dpbi5mYWlsdXJlJywKKyAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICfnmbvlvZXlpLHotKXvvIzor7fph43or5XvvIEnLAorICAgICAgfSk7CisgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CisgICAgICBtZXNzYWdlLmVycm9yKGRlZmF1bHRMb2dpbkZhaWx1cmVNZXNzYWdlKTsKKyAgICB9CisgIH07CisgIGNvbnN0IHsgY29kZSB9ID0gdXNlckxvZ2luU3RhdGU7CisgIGNvbnN0IGxvZ2luVHlwZSA9IHR5cGU7CisKKyAgdXNlRWZmZWN0KCgpID0+IHsKKyAgICBnZXRDYXB0Y2hhQ29kZSgpOworICB9LCBbXSk7CisKKyAgcmV0dXJuICgKKyAgICA8ZGl2IGNsYXNzTmFtZT17Y29udGFpbmVyQ2xhc3NOYW1lfT4KKyAgICAgIDxIZWxtZXQ+CisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgIGlkOiAnbWVudS5sb2dpbicsCisgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+eZu+W9lemhtScsCisgICAgICAgICAgfSl9CisgICAgICAgICAgLSB7U2V0dGluZ3MudGl0bGV9CisgICAgICAgIDwvdGl0bGU+CisgICAgICA8L0hlbG1ldD4KKyAgICAgIDxMYW5nIC8+CisgICAgICA8ZGl2CisgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgZmxleDogJzEnLAorICAgICAgICAgIHBhZGRpbmc6ICczMnB4IDAnLAorICAgICAgICB9fQorICAgICAgPgorICAgICAgICA8TG9naW5Gb3JtCisgICAgICAgICAgY29udGVudFN0eWxlPXt7CisgICAgICAgICAgICBtaW5XaWR0aDogMjgwLAorICAgICAgICAgICAgbWF4V2lkdGg6ICc3NXZ3JywKKyAgICAgICAgICB9fQorICAgICAgICAgIGxvZ289ezxpbWcgYWx0PSJsb2dvIiBzcmM9Ii9sb2dvLnN2ZyIgLz59CisgICAgICAgICAgdGl0bGU9IkFudCBEZXNpZ24iCisgICAgICAgICAgc3ViVGl0bGU9e2ludGwuZm9ybWF0TWVzc2FnZSh7IGlkOiAncGFnZXMubGF5b3V0cy51c2VyTGF5b3V0LnRpdGxlJyB9KX0KKyAgICAgICAgICBpbml0aWFsVmFsdWVzPXt7CisgICAgICAgICAgICBhdXRvTG9naW46IHRydWUsCisgICAgICAgICAgfX0KKyAgICAgICAgICBhY3Rpb25zPXtbCisgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICBrZXk9ImxvZ2luV2l0aCIKKyAgICAgICAgICAgICAgaWQ9InBhZ2VzLmxvZ2luLmxvZ2luV2l0aCIKKyAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9IuWFtuS7lueZu+W9leaWueW8jyIKKyAgICAgICAgICAgIC8+LAorICAgICAgICAgICAgPEFjdGlvbkljb25zIGtleT0iaWNvbnMiIC8+LAorICAgICAgICAgIF19CisgICAgICAgICAgb25GaW5pc2g9e2FzeW5jICh2YWx1ZXMpID0+IHsKKyAgICAgICAgICAgIGF3YWl0IGhhbmRsZVN1Ym1pdCh2YWx1ZXMgYXMgQVBJLkxvZ2luUGFyYW1zKTsKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAgPFRhYnMKKyAgICAgICAgICAgIGFjdGl2ZUtleT17dHlwZX0KKyAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRUeXBlfQorICAgICAgICAgICAgY2VudGVyZWQKKyAgICAgICAgICAgIGl0ZW1zPXtbCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXk6ICdhY2NvdW50JywKKyAgICAgICAgICAgICAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgICAgIGlkOiAncGFnZXMubG9naW4uYWNjb3VudExvZ2luLnRhYicsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+i0puaIt+WvhueggeeZu+W9lScsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXk6ICdtb2JpbGUnLAorICAgICAgICAgICAgICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgaWQ6ICdwYWdlcy5sb2dpbi5waG9uZUxvZ2luLnRhYicsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aJi+acuuWPt+eZu+W9lScsCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdfQorICAgICAgICAgIC8+CisKKyAgICAgICAgICB7Y29kZSAhPT0gMjAwICYmIGxvZ2luVHlwZSA9PT0gJ2FjY291bnQnICYmICgKKyAgICAgICAgICAgIDxMb2dpbk1lc3NhZ2UKKyAgICAgICAgICAgICAgY29udGVudD17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgICBpZDogJ3BhZ2VzLmxvZ2luLmFjY291bnRMb2dpbi5lcnJvck1lc3NhZ2UnLAorICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6LSm5oi35oiW5a+G56CB6ZSZ6K+vKGFkbWluL2FkbWluMTIzKScsCisgICAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgLz4KKyAgICAgICAgICApfQorICAgICAgICAgIHt0eXBlID09PSAnYWNjb3VudCcgJiYgKAorICAgICAgICAgICAgPD4KKyAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlPSJhZG1pbiIKKyAgICAgICAgICAgICAgICBmaWVsZFByb3BzPXt7CisgICAgICAgICAgICAgICAgICBzaXplOiAnbGFyZ2UnLAorICAgICAgICAgICAgICAgICAgcHJlZml4OiA8VXNlck91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICAgICAgICBpZDogJ3BhZ2VzLmxvZ2luLnVzZXJuYW1lLnBsYWNlaG9sZGVyJywKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn55So5oi35ZCNOiBhZG1pbicsCisgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InBhZ2VzLmxvZ2luLnVzZXJuYW1lLnJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeeUqOaIt+WQjSEiCisgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0LlBhc3N3b3JkCisgICAgICAgICAgICAgICAgbmFtZT0icGFzc3dvcmQiCisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlPSJhZG1pbjEyMyIKKyAgICAgICAgICAgICAgICBmaWVsZFByb3BzPXt7CisgICAgICAgICAgICAgICAgICBzaXplOiAnbGFyZ2UnLAorICAgICAgICAgICAgICAgICAgcHJlZml4OiA8TG9ja091dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICAgICAgICBpZDogJ3BhZ2VzLmxvZ2luLnBhc3N3b3JkLnBsYWNlaG9sZGVyJywKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn5a+G56CBOiBhZG1pbjEyMycsCisgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InBhZ2VzLmxvZ2luLnBhc3N3b3JkLnJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeWvhuegge+8gSIKKyAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICA8Um93PgorICAgICAgICAgICAgICAgIDxDb2wgZmxleD17M30+CisgICAgICAgICAgICAgICAgICA8UHJvRm9ybVRleHQKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDogJ3JpZ2h0JywKKyAgICAgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29kZSIKKyAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2ludGwuZm9ybWF0TWVzc2FnZSh7CisgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwYWdlcy5sb2dpbi5jYXB0Y2hhLnBsYWNlaG9sZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+ivt+i+k+WFpemqjOivgScsCisgICAgICAgICAgICAgICAgICAgIH0pfQorICAgICAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogKAorICAgICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJwYWdlcy5zZWFyY2hUYWJsZS51cGRhdGVGb3JtLnJ1bGVOYW1lLm5hbWVSdWxlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT0i6K+36L6T5YWl6aqM6K+B5ZWKIgorICAgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgICA8Q29sIGZsZXg9ezJ9PgorICAgICAgICAgICAgICAgICAgPEltYWdlCisgICAgICAgICAgICAgICAgICAgIHNyYz17Y2FwdGNoYUNvZGV9CisgICAgICAgICAgICAgICAgICAgIGFsdD0i6aqM6K+B56CBIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLAorICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLAorICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMTBweCcsCisgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxMDBweCcsCisgICAgICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXc9e2ZhbHNlfQorICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBnZXRDYXB0Y2hhQ29kZSgpfQorICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L0NvbD4KKyAgICAgICAgICAgICAgPC9Sb3c+CisgICAgICAgICAgICA8Lz4KKyAgICAgICAgICApfQorCisgICAgICAgICAge2NvZGUgIT09IDIwMCAmJiBsb2dpblR5cGUgPT09ICdtb2JpbGUnICYmIDxMb2dpbk1lc3NhZ2UgY29udGVudD0i6aqM6K+B56CB6ZSZ6K+vIiAvPn0KKyAgICAgICAgICB7dHlwZSA9PT0gJ21vYmlsZScgJiYgKAorICAgICAgICAgICAgPD4KKyAgICAgICAgICAgICAgPFByb0Zvcm1UZXh0CisgICAgICAgICAgICAgICAgZmllbGRQcm9wcz17eworICAgICAgICAgICAgICAgICAgc2l6ZTogJ2xhcmdlJywKKyAgICAgICAgICAgICAgICAgIHByZWZpeDogPE1vYmlsZU91dGxpbmVkIC8+LAorICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgbmFtZT0ibW9iaWxlIgorICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgaWQ6ICdwYWdlcy5sb2dpbi5waG9uZU51bWJlci5wbGFjZWhvbGRlcicsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+aJi+acuuWPtycsCisgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgcnVsZXM9e1sKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InBhZ2VzLmxvZ2luLnBob25lTnVtYmVyLnJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9Iuivt+i+k+WFpeaJi+acuuWPt++8gSIKKyAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogL14xXGR7MTB9JC8sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICgKKyAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InBhZ2VzLmxvZ2luLnBob25lTnVtYmVyLmludmFsaWQiCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT0i5omL5py65Y+35qC85byP6ZSZ6K+v77yBIgorICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgIDxQcm9Gb3JtQ2FwdGNoYQorICAgICAgICAgICAgICAgIGZpZWxkUHJvcHM9e3sKKyAgICAgICAgICAgICAgICAgIHNpemU6ICdsYXJnZScsCisgICAgICAgICAgICAgICAgICBwcmVmaXg6IDxMb2NrT3V0bGluZWQgLz4sCisgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICBjYXB0Y2hhUHJvcHM9e3sKKyAgICAgICAgICAgICAgICAgIHNpemU6ICdsYXJnZScsCisgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aW50bC5mb3JtYXRNZXNzYWdlKHsKKyAgICAgICAgICAgICAgICAgIGlkOiAncGFnZXMubG9naW4uY2FwdGNoYS5wbGFjZWhvbGRlcicsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ+ivt+i+k+WFpemqjOivgeeggScsCisgICAgICAgICAgICAgICAgfSl9CisgICAgICAgICAgICAgICAgY2FwdGNoYVRleHRSZW5kZXI9eyh0aW1pbmcsIGNvdW50KSA9PiB7CisgICAgICAgICAgICAgICAgICBpZiAodGltaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtjb3VudH0gJHtpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGFnZXMuZ2V0Q2FwdGNoYVNlY29uZFRleHQnLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6I635Y+W6aqM6K+B56CBJywKKyAgICAgICAgICAgICAgICAgICAgfSl9YDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRsLmZvcm1hdE1lc3NhZ2UoeworICAgICAgICAgICAgICAgICAgICBpZDogJ3BhZ2VzLmxvZ2luLnBob25lTG9naW4uZ2V0VmVyaWZpY2F0aW9uQ29kZScsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAn6I635Y+W6aqM6K+B56CBJywKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH19CisgICAgICAgICAgICAgICAgbmFtZT0iY2FwdGNoYSIKKyAgICAgICAgICAgICAgICBydWxlcz17WworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogKAorICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBpZD0icGFnZXMubG9naW4uY2FwdGNoYS5yZXF1aXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPSLor7fovpPlhaXpqozor4HnoIHvvIEiCisgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgICBvbkdldENhcHRjaGE9e2FzeW5jIChwaG9uZSkgPT4geworICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0RmFrZUNhcHRjaGEoeworICAgICAgICAgICAgICAgICAgICBwaG9uZSwKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKCfojrflj5bpqozor4HnoIHmiJDlip/vvIHpqozor4HnoIHkuLrvvJoxMjM0Jyk7CisgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvPgorICAgICAgICAgICl9CisgICAgICAgICAgPGRpdgorICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAyNCwKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPFByb0Zvcm1DaGVja2JveCBub1N0eWxlIG5hbWU9ImF1dG9Mb2dpbiI+CisgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPSJwYWdlcy5sb2dpbi5yZW1lbWJlck1lIiBkZWZhdWx0TWVzc2FnZT0i6Ieq5Yqo55m75b2VIiAvPgorICAgICAgICAgICAgPC9Qcm9Gb3JtQ2hlY2tib3g+CisgICAgICAgICAgICA8YQorICAgICAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgICAgIGZsb2F0OiAncmlnaHQnLAorICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgPgorICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD0icGFnZXMubG9naW4uZm9yZ290UGFzc3dvcmQiIGRlZmF1bHRNZXNzYWdlPSLlv5jorrDlr4bnoIEiIC8+CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvTG9naW5Gb3JtPgorICAgICAgPC9kaXY+CisgICAgICA8Rm9vdGVyIC8+CisgICAgPC9kaXY+CisgICk7Cit9OworCitleHBvcnQgZGVmYXVsdCBMb2dpbjsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL1NldHRpbmdzL2luZGV4LnRzeCBiL3JlYWN0LXVpL3NyYy9wYWdlcy9Vc2VyL1NldHRpbmdzL2luZGV4LnRzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjlkMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1VzZXIvU2V0dGluZ3MvaW5kZXgudHN4CkBAIC0wLDAgKzEsMjAgQEAKK2ltcG9ydCB7IFBhZ2VDb250YWluZXIgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyBDYXJkIH0gZnJvbSAnYW50ZCc7CitpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOworCisvKioKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqCisgKiAqLworCisKK2NvbnN0IFNldHRpbmdzOiBSZWFjdC5GQyA9ICgpID0+IHsKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxDYXJkIHRpdGxlPSJEZXZlbG9waW5nIiAvPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFNldHRpbmdzOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3BhZ2VzL1dlbGNvbWUudHN4IGIvcmVhY3QtdWkvc3JjL3BhZ2VzL1dlbGNvbWUudHN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzQ5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvcGFnZXMvV2VsY29tZS50c3gKQEAgLTAsMCArMSwxNjQgQEAKK2ltcG9ydCB7IFBhZ2VDb250YWluZXIgfSBmcm9tICdAYW50LWRlc2lnbi9wcm8tY29tcG9uZW50cyc7CitpbXBvcnQgeyB1c2VNb2RlbCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgQ2FyZCwgdGhlbWUgfSBmcm9tICdhbnRkJzsKK2ltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7CisKKy8qKgorICog5q+P5Liq5Y2V54us55qE5Y2h54mH77yM5Li65LqG5aSN55So5qC35byP5oq95oiQ5LqG57uE5Lu2CisgKiBAcGFyYW0gcGFyYW0wCisgKiBAcmV0dXJucworICovCitjb25zdCBJbmZvQ2FyZDogUmVhY3QuRkM8eworICB0aXRsZTogc3RyaW5nOworICBpbmRleDogbnVtYmVyOworICBkZXNjOiBzdHJpbmc7CisgIGhyZWY6IHN0cmluZzsKK30+ID0gKHsgdGl0bGUsIGhyZWYsIGluZGV4LCBkZXNjIH0pID0+IHsKKyAgY29uc3QgeyB1c2VUb2tlbiB9ID0gdGhlbWU7CisKKyAgY29uc3QgeyB0b2tlbiB9ID0gdXNlVG9rZW4oKTsKKworICByZXR1cm4gKAorICAgIDxkaXYKKyAgICAgIHN0eWxlPXt7CisgICAgICAgIGJhY2tncm91bmRDb2xvcjogdG9rZW4uY29sb3JCZ0NvbnRhaW5lciwKKyAgICAgICAgYm94U2hhZG93OiB0b2tlbi5ib3hTaGFkb3csCisgICAgICAgIGJvcmRlclJhZGl1czogJzhweCcsCisgICAgICAgIGZvbnRTaXplOiAnMTRweCcsCisgICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHRTZWNvbmRhcnksCisgICAgICAgIGxpbmVIZWlnaHQ6ICcyMnB4JywKKyAgICAgICAgcGFkZGluZzogJzE2cHggMTlweCcsCisgICAgICAgIG1pbldpZHRoOiAnMjIwcHgnLAorICAgICAgICBmbGV4OiAxLAorICAgICAgfX0KKyAgICA+CisgICAgICA8ZGl2CisgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLAorICAgICAgICAgIGdhcDogJzRweCcsCisgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsCisgICAgICAgIH19CisgICAgICA+CisgICAgICAgIDxkaXYKKyAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgd2lkdGg6IDQ4LAorICAgICAgICAgICAgaGVpZ2h0OiA0OCwKKyAgICAgICAgICAgIGxpbmVIZWlnaHQ6ICcyMnB4JywKKyAgICAgICAgICAgIGJhY2tncm91bmRTaXplOiAnMTAwJScsCisgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLAorICAgICAgICAgICAgcGFkZGluZzogJzhweCAxNnB4IDE2cHggMTJweCcsCisgICAgICAgICAgICBjb2xvcjogJyNGRkYnLAorICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLAorICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOgorICAgICAgICAgICAgICAidXJsKCdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ibXctcHJvZC9kYWFmOGQ1MC04ZTZkLTQyNTEtOTA1ZC02NzZhMjRkZGZhMTIuc3ZnJykiLAorICAgICAgICAgIH19CisgICAgICAgID4KKyAgICAgICAgICB7aW5kZXh9CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2CisgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgIGZvbnRTaXplOiAnMTZweCcsCisgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0LAorICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogOCwKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAge3RpdGxlfQorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdgorICAgICAgICBzdHlsZT17eworICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsCisgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dFNlY29uZGFyeSwKKyAgICAgICAgICB0ZXh0QWxpZ246ICdqdXN0aWZ5JywKKyAgICAgICAgICBsaW5lSGVpZ2h0OiAnMjJweCcsCisgICAgICAgICAgbWFyZ2luQm90dG9tOiA4LAorICAgICAgICB9fQorICAgICAgPgorICAgICAgICB7ZGVzY30KKyAgICAgIDwvZGl2PgorICAgICAgPGEgaHJlZj17aHJlZn0gdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9yZWZlcnJlciI+CisgICAgICAgIOS6huino+abtOWkmiB7Jz4nfQorICAgICAgPC9hPgorICAgIDwvZGl2PgorICApOworfTsKKworY29uc3QgV2VsY29tZTogUmVhY3QuRkMgPSAoKSA9PiB7CisgIGNvbnN0IHsgdG9rZW4gfSA9IHRoZW1lLnVzZVRva2VuKCk7CisgIGNvbnN0IHsgaW5pdGlhbFN0YXRlIH0gPSB1c2VNb2RlbCgnQEBpbml0aWFsU3RhdGUnKTsKKyAgcmV0dXJuICgKKyAgICA8UGFnZUNvbnRhaW5lcj4KKyAgICAgIDxDYXJkCisgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgYm9yZGVyUmFkaXVzOiA4LAorICAgICAgICB9fQorICAgICAgICBib2R5U3R5bGU9e3sKKyAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6CisgICAgICAgICAgICBpbml0aWFsU3RhdGU/LnNldHRpbmdzPy5uYXZUaGVtZSA9PT0gJ3JlYWxEYXJrJworICAgICAgICAgICAgICA/ICdiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNzVkZWcsICMxQTFCMUYgMCUsICMxOTFDMUYgMTAwJSknCisgICAgICAgICAgICAgIDogJ2JhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg3NWRlZywgI0ZCRkRGRiAwJSwgI0Y1RjdGRiAxMDAlKScsCisgICAgICAgIH19CisgICAgICA+CisgICAgICAgIDxkaXYKKyAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnMTAwJSAtMzAlJywKKyAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLAorICAgICAgICAgICAgYmFja2dyb3VuZFNpemU6ICcyNzRweCBhdXRvJywKKyAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZToKKyAgICAgICAgICAgICAgInVybCgnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS9tZG4vcm1zX2E5NzQ1Yi9hZnRzL2ltZy9BKkJ1Rm1RcXNCMmlBQUFBQUFBQUFBQUFBQUFSUW5BUScpIiwKKyAgICAgICAgICB9fQorICAgICAgICA+CisgICAgICAgICAgPGRpdgorICAgICAgICAgICAgc3R5bGU9e3sKKyAgICAgICAgICAgICAgZm9udFNpemU6ICcyMHB4JywKKyAgICAgICAgICAgICAgY29sb3I6IHRva2VuLmNvbG9yVGV4dEhlYWRpbmcsCisgICAgICAgICAgICB9fQorICAgICAgICAgID4KKyAgICAgICAgICAgIOasoui/juS9v+eUqCBBbnQgRGVzaWduIFBybworICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxwCisgICAgICAgICAgICBzdHlsZT17eworICAgICAgICAgICAgICBmb250U2l6ZTogJzE0cHgnLAorICAgICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JUZXh0U2Vjb25kYXJ5LAorICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiAnMjJweCcsCisgICAgICAgICAgICAgIG1hcmdpblRvcDogMTYsCisgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogMzIsCisgICAgICAgICAgICAgIHdpZHRoOiAnNjUlJywKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgQW50IERlc2lnbiBQcm8g5piv5LiA5Liq5pW05ZCI5LqGIHVtae+8jEFudCBEZXNpZ24g5ZKMIFByb0NvbXBvbmVudHMKKyAgICAgICAgICAgIOeahOiEmuaJi+aetuaWueahiOOAguiHtOWKm+S6juWcqOiuvuiuoeinhOiMg+WSjOWfuuehgOe7hOS7tueahOWfuuehgOS4iu+8jOe7p+e7reWQkeS4iuaehOW7uu+8jOaPkOeCvOWHuuWFuOWei+aooeadvy/kuJrliqHnu4Tku7Yv6YWN5aWX6K6+6K6h6LWE5rqQ77yM6L+b5LiA5q2l5o+Q5Y2H5LyB5Lia57qn5Lit5ZCO5Y+w5Lqn5ZOB6K6+6K6h56CU5Y+R6L+H56iL5Lit55qE44CO55So5oi344CP5ZKM44CO6K6+6K6h6ICF44CP55qE5L2T6aqM44CCCisgICAgICAgICAgPC9wPgorICAgICAgICAgIDxkaXYKKyAgICAgICAgICAgIHN0eWxlPXt7CisgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JywKKyAgICAgICAgICAgICAgZmxleFdyYXA6ICd3cmFwJywKKyAgICAgICAgICAgICAgZ2FwOiAxNiwKKyAgICAgICAgICAgIH19CisgICAgICAgICAgPgorICAgICAgICAgICAgPEluZm9DYXJkCisgICAgICAgICAgICAgIGluZGV4PXsxfQorICAgICAgICAgICAgICBocmVmPSJodHRwczovL3VtaWpzLm9yZy9kb2NzL2ludHJvZHVjZS9pbnRyb2R1Y2UiCisgICAgICAgICAgICAgIHRpdGxlPSLkuobop6MgdW1pIgorICAgICAgICAgICAgICBkZXNjPSJ1bWkg5piv5LiA5Liq5Y+v5omp5bGV55qE5LyB5Lia57qn5YmN56uv5bqU55So5qGG5p62LHVtaSDku6Xot6/nlLHkuLrln7rnoYDnmoTvvIzlkIzml7bmlK/mjIHphY3nva7lvI/ot6/nlLHlkoznuqblrprlvI/ot6/nlLHvvIzkv53or4Hot6/nlLHnmoTlip/og73lrozlpIfvvIzlubbku6XmraTov5vooYzlip/og73mianlsZXjgIIiCisgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEluZm9DYXJkCisgICAgICAgICAgICAgIGluZGV4PXsyfQorICAgICAgICAgICAgICB0aXRsZT0i5LqG6KejIGFudCBkZXNpZ24iCisgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vYW50LmRlc2lnbiIKKyAgICAgICAgICAgICAgZGVzYz0iYW50ZCDmmK/ln7rkuo4gQW50IERlc2lnbiDorr7orqHkvZPns7vnmoQgUmVhY3QgVUkg57uE5Lu25bqT77yM5Li76KaB55So5LqO56CU5Y+R5LyB5Lia57qn5Lit5ZCO5Y+w5Lqn5ZOB44CCIgorICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxJbmZvQ2FyZAorICAgICAgICAgICAgICBpbmRleD17M30KKyAgICAgICAgICAgICAgdGl0bGU9IuS6huinoyBQcm8gQ29tcG9uZW50cyIKKyAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9wcm9jb21wb25lbnRzLmFudC5kZXNpZ24iCisgICAgICAgICAgICAgIGRlc2M9IlByb0NvbXBvbmVudHMg5piv5LiA5Liq5Z+65LqOIEFudCBEZXNpZ24g5YGa5LqG5pu06auY5oq96LGh55qE5qih5p2/57uE5Lu277yM5LulIOS4gOS4que7hOS7tuWwseaYr+S4gOS4qumhtemdouS4uuW8gOWPkeeQhuW/te+8jOS4uuS4reWQjuWPsOW8gOWPkeW4puadpeabtOWlveeahOS9k+mqjOOAgiIKKyAgICAgICAgICAgIC8+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9DYXJkPgorICAgIDwvUGFnZUNvbnRhaW5lcj4KKyAgKTsKK307CisKK2V4cG9ydCBkZWZhdWx0IFdlbGNvbWU7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvcmVxdWVzdEVycm9yQ29uZmlnLnRzIGIvcmVhY3QtdWkvc3JjL3JlcXVlc3RFcnJvckNvbmZpZy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM0YTZhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3JlcXVlc3RFcnJvckNvbmZpZy50cwpAQCAtMCwwICsxLDEwOSBAQAor77u/aW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ0BAL3BsdWdpbi1yZXF1ZXN0L3JlcXVlc3QnOworaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBtZXNzYWdlLCBub3RpZmljYXRpb24gfSBmcm9tICdhbnRkJzsKKworLy8g6ZSZ6K+v5aSE55CG5pa55qGI77yaIOmUmeivr+exu+WeiworZW51bSBFcnJvclNob3dUeXBlIHsKKyAgU0lMRU5UID0gMCwKKyAgV0FSTl9NRVNTQUdFID0gMSwKKyAgRVJST1JfTUVTU0FHRSA9IDIsCisgIE5PVElGSUNBVElPTiA9IDMsCisgIFJFRElSRUNUID0gOSwKK30KKy8vIOS4juWQjuerr+e6puWumueahOWTjeW6lOaVsOaNruagvOW8jworaW50ZXJmYWNlIFJlc3BvbnNlU3RydWN0dXJlIHsKKyAgc3VjY2VzczogYm9vbGVhbjsKKyAgZGF0YTogYW55OworICBlcnJvckNvZGU/OiBudW1iZXI7CisgIGVycm9yTWVzc2FnZT86IHN0cmluZzsKKyAgc2hvd1R5cGU/OiBFcnJvclNob3dUeXBlOworfQorCisvKioKKyAqIEBuYW1lIOmUmeivr+WkhOeQhgorICogcHJvIOiHquW4pueahOmUmeivr+WkhOeQhu+8jCDlj6/ku6XlnKjov5nph4zlgZroh6rlt7HnmoTmlLnliqgKKyAqIEBkb2MgaHR0cHM6Ly91bWlqcy5vcmcvZG9jcy9tYXgvcmVxdWVzdCPphY3nva4KKyAqLworZXhwb3J0IGNvbnN0IGVycm9yQ29uZmlnOiBSZXF1ZXN0Q29uZmlnID0geworICAvLyDplJnor6/lpITnkIbvvJogdW1pQDMg55qE6ZSZ6K+v5aSE55CG5pa55qGI44CCCisgIGVycm9yQ29uZmlnOiB7CisgICAgLy8g6ZSZ6K+v5oqb5Ye6CisgICAgZXJyb3JUaHJvd2VyOiAocmVzKSA9PiB7CisgICAgICBjb25zdCB7IHN1Y2Nlc3MsIGRhdGEsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlLCBzaG93VHlwZSB9ID0KKyAgICAgICAgcmVzIGFzIHVua25vd24gYXMgUmVzcG9uc2VTdHJ1Y3R1cmU7CisgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpOworICAgICAgICBlcnJvci5uYW1lID0gJ0JpekVycm9yJzsKKyAgICAgICAgZXJyb3IuaW5mbyA9IHsgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UsIHNob3dUeXBlLCBkYXRhIH07CisgICAgICAgIHRocm93IGVycm9yOyAvLyDmipvlh7roh6rliLbnmoTplJnor68KKyAgICAgIH0KKyAgICB9LAorICAgIC8vIOmUmeivr+aOpeaUtuWPiuWkhOeQhgorICAgIGVycm9ySGFuZGxlcjogKGVycm9yOiBhbnksIG9wdHM6IGFueSkgPT4geworICAgICAgaWYgKG9wdHM/LnNraXBFcnJvckhhbmRsZXIpIHRocm93IGVycm9yOworICAgICAgLy8g5oiR5Lus55qEIGVycm9yVGhyb3dlciDmipvlh7rnmoTplJnor6/jgIIKKyAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQml6RXJyb3InKSB7CisgICAgICAgIGNvbnN0IGVycm9ySW5mbzogUmVzcG9uc2VTdHJ1Y3R1cmUgfCB1bmRlZmluZWQgPSBlcnJvci5pbmZvOworICAgICAgICBpZiAoZXJyb3JJbmZvKSB7CisgICAgICAgICAgY29uc3QgeyBlcnJvck1lc3NhZ2UsIGVycm9yQ29kZSB9ID0gZXJyb3JJbmZvOworICAgICAgICAgIHN3aXRjaCAoZXJyb3JJbmZvLnNob3dUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEVycm9yU2hvd1R5cGUuU0lMRU5UOgorICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFcnJvclNob3dUeXBlLldBUk5fTUVTU0FHRToKKyAgICAgICAgICAgICAgbWVzc2FnZS53YXJuaW5nKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFcnJvclNob3dUeXBlLkVSUk9SX01FU1NBR0U6CisgICAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3IoZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVycm9yU2hvd1R5cGUuTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgICBub3RpZmljYXRpb24ub3Blbih7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGVycm9yTWVzc2FnZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvckNvZGUsCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXJyb3JTaG93VHlwZS5SRURJUkVDVDoKKyAgICAgICAgICAgICAgLy8gVE9ETzogcmVkaXJlY3QKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGVycm9yLnJlc3BvbnNlKSB7CisgICAgICAgIC8vIEF4aW9zIOeahOmUmeivrworICAgICAgICAvLyDor7fmsYLmiJDlip/lj5Hlh7rkuJTmnI3liqHlmajkuZ/lk43lupTkuobnirbmgIHnoIHvvIzkvYbnirbmgIHku6PnoIHotoXlh7rkuoYgMnh4IOeahOiMg+WbtAorICAgICAgICBtZXNzYWdlLmVycm9yKGBSZXNwb25zZSBzdGF0dXM6JHtlcnJvci5yZXNwb25zZS5zdGF0dXN9YCk7CisgICAgICB9IGVsc2UgaWYgKGVycm9yLnJlcXVlc3QpIHsKKyAgICAgICAgLy8g6K+35rGC5bey57uP5oiQ5Yqf5Y+R6LW377yM5L2G5rKh5pyJ5pS25Yiw5ZON5bqUCisgICAgICAgIC8vIFxgZXJyb3IucmVxdWVzdFxgIOWcqOa1j+iniOWZqOS4reaYryBYTUxIdHRwUmVxdWVzdCDnmoTlrp7kvovvvIwKKyAgICAgICAgLy8g6ICM5Zyobm9kZS5qc+S4reaYryBodHRwLkNsaWVudFJlcXVlc3Qg55qE5a6e5L6LCisgICAgICAgIG1lc3NhZ2UuZXJyb3IoJ05vbmUgcmVzcG9uc2UhIFBsZWFzZSByZXRyeS4nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIOWPkemAgeivt+axguaXtuWHuuS6hueCuemXrumimAorICAgICAgICBtZXNzYWdlLmVycm9yKCdSZXF1ZXN0IGVycm9yLCBwbGVhc2UgcmV0cnkuJyk7CisgICAgICB9CisgICAgfSwKKyAgfSwKKworICAvLyDor7fmsYLmi6bmiKrlmagKKyAgcmVxdWVzdEludGVyY2VwdG9yczogWworICAgIChjb25maWc6IFJlcXVlc3RPcHRpb25zKSA9PiB7CisgICAgICAvLyDmi6bmiKror7fmsYLphY3nva7vvIzov5vooYzkuKrmgKfljJblpITnkIbjgIIKKyAgICAgIGNvbnN0IHVybCA9IGNvbmZpZz8udXJsPy5jb25jYXQoJz90b2tlbiA9IDEyMycpOworICAgICAgcmV0dXJuIHsgLi4uY29uZmlnLCB1cmwgfTsKKyAgICB9LAorICBdLAorCisgIC8vIOWTjeW6lOaLpuaIquWZqAorICByZXNwb25zZUludGVyY2VwdG9yczogWworICAgIChyZXNwb25zZSkgPT4geworICAgICAgLy8g5oum5oiq5ZON5bqU5pWw5o2u77yM6L+b6KGM5Liq5oCn5YyW5aSE55CGCisgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlIGFzIHVua25vd24gYXMgUmVzcG9uc2VTdHJ1Y3R1cmU7CisKKyAgICAgIGlmIChkYXRhPy5zdWNjZXNzID09PSBmYWxzZSkgeworICAgICAgICBtZXNzYWdlLmVycm9yKCfor7fmsYLlpLHotKXvvIEnKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9LAorICBdLAorfTsKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlLXdvcmtlci5qcyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlLXdvcmtlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY3MjZjCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2Utd29ya2VyLmpzCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqLworLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi8KKy8qIGdsb2JhbHMgd29ya2JveCAqLword29ya2JveC5jb3JlLnNldENhY2hlTmFtZURldGFpbHMoeworICBwcmVmaXg6ICdhbnRkLXBybycsCisgIHN1ZmZpeDogJ3Y1JywKK30pOworLy8gQ29udHJvbCBhbGwgb3BlbmVkIHRhYnMgQVNBUAord29ya2JveC5jbGllbnRzQ2xhaW0oKTsKKworLyoqCisgKiBVc2UgcHJlY2FjaGluZyBsaXN0IGdlbmVyYXRlZCBieSB3b3JrYm94IGluIGJ1aWxkIHByb2Nlc3MuCisgKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvd29ya2JveC9yZWZlcmVuY2UtZG9jcy9sYXRlc3Qvd29ya2JveC5wcmVjYWNoaW5nCisgKi8KK3dvcmtib3gucHJlY2FjaGluZy5wcmVjYWNoZUFuZFJvdXRlKHNlbGYuX19wcmVjYWNoZU1hbmlmZXN0IHx8IFtdKTsKKworLyoqCisgKiBSZWdpc3RlciBhIG5hdmlnYXRpb24gcm91dGUuCisgKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvd29ya2JveC9tb2R1bGVzL3dvcmtib3gtcm91dGluZyNob3dfdG9fcmVnaXN0ZXJfYV9uYXZpZ2F0aW9uX3JvdXRlCisgKi8KK3dvcmtib3gucm91dGluZy5yZWdpc3Rlck5hdmlnYXRpb25Sb3V0ZSgnL2luZGV4Lmh0bWwnKTsKKworLyoqCisgKiBVc2UgcnVudGltZSBjYWNoZToKKyAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy93b3JrYm94L3JlZmVyZW5jZS1kb2NzL2xhdGVzdC93b3JrYm94LnJvdXRpbmcjLnJlZ2lzdGVyUm91dGUKKyAqCisgKiBXb3JrYm94IHByb3ZpZGVzIGFsbCBjb21tb24gY2FjaGluZyBzdHJhdGVnaWVzIGluY2x1ZGluZyBDYWNoZUZpcnN0LCBOZXR3b3JrRmlyc3QgZXRjLgorICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL3dvcmtib3gvcmVmZXJlbmNlLWRvY3MvbGF0ZXN0L3dvcmtib3guc3RyYXRlZ2llcworICovCisKKy8qKiBIYW5kbGUgQVBJIHJlcXVlc3RzICovCit3b3JrYm94LnJvdXRpbmcucmVnaXN0ZXJSb3V0ZSgvXC9hcGlcLy8sIHdvcmtib3guc3RyYXRlZ2llcy5uZXR3b3JrRmlyc3QoKSk7CisKKy8qKiBIYW5kbGUgdGhpcmQgcGFydHkgcmVxdWVzdHMgKi8KK3dvcmtib3gucm91dGluZy5yZWdpc3RlclJvdXRlKAorICAvXmh0dHBzOlwvXC9nd1wuYWxpcGF5b2JqZWN0c1wuY29tXC8vLAorICB3b3JrYm94LnN0cmF0ZWdpZXMubmV0d29ya0ZpcnN0KCksCispOword29ya2JveC5yb3V0aW5nLnJlZ2lzdGVyUm91dGUoCisgIC9eaHR0cHM6XC9cL2NkbmpzXC5jbG91ZGZsYXJlXC5jb21cLy8sCisgIHdvcmtib3guc3RyYXRlZ2llcy5uZXR3b3JrRmlyc3QoKSwKKyk7Cit3b3JrYm94LnJvdXRpbmcucmVnaXN0ZXJSb3V0ZSgvXC9jb2xvci5sZXNzLywgd29ya2JveC5zdHJhdGVnaWVzLm5ldHdvcmtGaXJzdCgpKTsKKworLyoqIFJlc3BvbnNlIHRvIGNsaWVudCBhZnRlciBza2lwcGluZyB3YWl0aW5nIHdpdGggTWVzc2FnZUNoYW5uZWwgKi8KK2FkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHsKKyAgY29uc3QgcmVwbHlQb3J0ID0gZXZlbnQucG9ydHNbMF07CisgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhOworICBpZiAocmVwbHlQb3J0ICYmIG1lc3NhZ2UgJiYgbWVzc2FnZS50eXBlID09PSAnc2tpcC13YWl0aW5nJykgeworICAgIGV2ZW50LndhaXRVbnRpbCgKKyAgICAgIHNlbGYuc2tpcFdhaXRpbmcoKS50aGVuKAorICAgICAgICAoKSA9PiB7CisgICAgICAgICAgcmVwbHlQb3J0LnBvc3RNZXNzYWdlKHsKKyAgICAgICAgICAgIGVycm9yOiBudWxsLAorICAgICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICAoZXJyb3IpID0+IHsKKyAgICAgICAgICByZXBseVBvcnQucG9zdE1lc3NhZ2UoeworICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgfSk7CisgICAgICAgIH0sCisgICAgICApLAorICAgICk7CisgIH0KK30pOwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL2FudC1kZXNpZ24tcHJvL2FwaS50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby9hcGkudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhOTUwYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby9hcGkudHMKQEAgLTAsMCArMSwxMSBAQAorLy8gQHRzLWlnbm9yZQorLyogZXNsaW50LWRpc2FibGUgKi8KK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKKworLyoqIOatpOWkhOWQjuerr+ayoeacieaPkOS+m+azqOmHiiBHRVQgL2FwaS9ub3RpY2VzICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Tm90aWNlcyhvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTm90aWNlSWNvbkxpc3Q+KCcvYXBpL25vdGljZXMnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL2FudC1kZXNpZ24tcHJvL2luZGV4LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL2FudC1kZXNpZ24tcHJvL2luZGV4LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTU4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvYW50LWRlc2lnbi1wcm8vaW5kZXgudHMKQEAgLTAsMCArMSwxMiBAQAorLy8gQHRzLWlnbm9yZQorLyogZXNsaW50LWRpc2FibGUgKi8KKy8vIEFQSSDmm7TmlrDml7bpl7TvvJoKKy8vIEFQSSDllK/kuIDmoIfor4bvvJoKK2ltcG9ydCAqIGFzIGFwaSBmcm9tICcuL2FwaSc7CitpbXBvcnQgKiBhcyBsb2dpbiBmcm9tICcuL2xvZ2luJzsKK2ltcG9ydCAqIGFzIHJ1bGUgZnJvbSAnLi9ydWxlJzsKK2V4cG9ydCBkZWZhdWx0IHsKKyAgYXBpLAorICBsb2dpbiwKKyAgcnVsZSwKK307CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvYW50LWRlc2lnbi1wcm8vbG9naW4udHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvYW50LWRlc2lnbi1wcm8vbG9naW4udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMGI0MwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby9sb2dpbi50cwpAQCAtMCwwICsxLDM4IEBACisvLyBAdHMtaWdub3JlCisvKiBlc2xpbnQtZGlzYWJsZSAqLworaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworCisvKiog55m75b2V5o6l5Y+jIFBPU1QgL2FwaS9sb2dpbi9hY2NvdW50ICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9naW4oYm9keTogQVBJLkxvZ2luUGFyYW1zLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTG9naW5SZXN1bHQ+KCcvYXBpL2xvZ2luL2FjY291bnQnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKKyAgICB9LAorICAgIGRhdGE6IGJvZHksCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIOWPkemAgemqjOivgeeggSBQT1NUIC9hcGkvbG9naW4vY2FwdGNoYSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZha2VDYXB0Y2hhKAorICAvLyDlj6DliqDnlJ/miJDnmoRQYXJhbeexu+WeiyAo6Z2eYm9keeWPguaVsHN3YWdnZXLpu5jorqTmsqHmnInnlJ/miJDlr7nosaEpCisgIHBhcmFtczogQVBJLmdldEZha2VDYXB0Y2hhUGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuRmFrZUNhcHRjaGE+KCcvYXBpL2xvZ2luL2NhcHRjaGEnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgcGFyYW1zOiB7CisgICAgICAuLi5wYXJhbXMsCisgICAgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiog55m75b2V5o6l5Y+jIFBPU1QgL2FwaS9sb2dpbi9vdXRMb2dpbiAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG91dExvZ2luKG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PFJlY29yZDxzdHJpbmcsIGFueT4+KCcvYXBpL2xvZ2luL291dExvZ2luJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvYW50LWRlc2lnbi1wcm8vcnVsZS50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby9ydWxlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGViYzUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvYW50LWRlc2lnbi1wcm8vcnVsZS50cwpAQCAtMCwwICsxLDQyIEBACisvLyBAdHMtaWdub3JlCisvKiBlc2xpbnQtZGlzYWJsZSAqLworaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworCisvKiog6I635Y+W6KeE5YiZ5YiX6KGoIEdFVCAvYXBpL3J1bGUgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBydWxlKAorICAvLyDlj6DliqDnlJ/miJDnmoRQYXJhbeexu+WeiyAo6Z2eYm9keeWPguaVsHN3YWdnZXLpu5jorqTmsqHmnInnlJ/miJDlr7nosaEpCisgIHBhcmFtczogQVBJLnJ1bGVQYXJhbXMsCisgIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LAorKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SdWxlTGlzdD4oJy9hcGkvcnVsZScsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtczogeworICAgICAgLi4ucGFyYW1zLAorICAgIH0sCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIOaWsOW7uuinhOWImSBQVVQgL2FwaS9ydWxlICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUnVsZShvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUnVsZUxpc3RJdGVtPignL2FwaS9ydWxlJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIOaWsOW7uuinhOWImSBQT1NUIC9hcGkvcnVsZSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFJ1bGUob3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJ1bGVMaXN0SXRlbT4oJy9hcGkvcnVsZScsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiog5Yig6Zmk6KeE5YiZIERFTEVURSAvYXBpL3J1bGUgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVSdWxlKG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PFJlY29yZDxzdHJpbmcsIGFueT4+KCcvYXBpL3J1bGUnLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL2FudC1kZXNpZ24tcHJvL3R5cGluZ3MuZC50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby90eXBpbmdzLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlMTI2NAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9hbnQtZGVzaWduLXByby90eXBpbmdzLmQudHMKQEAgLTAsMCArMSwxMDggQEAKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSSB7CisgIHR5cGUgQ3VycmVudFVzZXIgPSBVc2VySW5mbyAmIHsKKyAgICBzaWduYXR1cmU/OiBzdHJpbmc7CisgICAgdGl0bGU/OiBzdHJpbmc7CisgICAgZ3JvdXA/OiBzdHJpbmc7CisgICAgdGFncz86IHsga2V5Pzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9W107CisgICAgbm90aWZ5Q291bnQ/OiBudW1iZXI7CisgICAgdW5yZWFkQ291bnQ/OiBudW1iZXI7CisgICAgY291bnRyeT86IHN0cmluZzsKKyAgICBhY2Nlc3M/OiBzdHJpbmc7CisgICAgZ2VvZ3JhcGhpYz86IHsKKyAgICAgIHByb3ZpbmNlPzogeyBsYWJlbD86IHN0cmluZzsga2V5Pzogc3RyaW5nIH07CisgICAgICBjaXR5PzogeyBsYWJlbD86IHN0cmluZzsga2V5Pzogc3RyaW5nIH07CisgICAgfTsKKyAgICBhZGRyZXNzPzogc3RyaW5nOworICAgIHBob25lPzogc3RyaW5nOworICB9OworCisgIHR5cGUgRXJyb3JSZXNwb25zZSA9IHsKKyAgICAvKiog5Lia5Yqh57qm5a6a55qE6ZSZ6K+v56CBICovCisgICAgZXJyb3JDb2RlOiBzdHJpbmc7CisgICAgLyoqIOS4muWKoeS4iueahOmUmeivr+S/oeaBryAqLworICAgIGVycm9yTWVzc2FnZT86IHN0cmluZzsKKyAgICAvKiog5Lia5Yqh5LiK55qE6K+35rGC5piv5ZCm5oiQ5YqfICovCisgICAgc3VjY2Vzcz86IGJvb2xlYW47CisgIH07CisKKyAgdHlwZSBGYWtlQ2FwdGNoYSA9IHsKKyAgICBjb2RlPzogbnVtYmVyOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgfTsKKworICB0eXBlIGdldEZha2VDYXB0Y2hhUGFyYW1zID0geworICAgIC8qKiDmiYvmnLrlj7cgKi8KKyAgICBwaG9uZT86IHN0cmluZzsKKyAgfTsKKworICB0eXBlIExvZ2luUGFyYW1zID0geworICAgIHVzZXJuYW1lPzogc3RyaW5nOworICAgIHBhc3N3b3JkPzogc3RyaW5nOworICAgIHV1aWQ/OiBzdHJpbmc7CisgICAgYXV0b0xvZ2luPzogYm9vbGVhbjsKKyAgICB0eXBlPzogc3RyaW5nOworICB9OworCisgIHR5cGUgTG9naW5SZXN1bHQgPSB7CisgICAgY29kZTogbnVtYmVyOworICAgIG1zZz86IHN0cmluZzsKKyAgICB0eXBlPzogc3RyaW5nOworICAgIHRva2VuPzogc3RyaW5nOworICB9OworCisgIHR5cGUgTm90aWNlSWNvbkl0ZW0gPSB7CisgICAgaWQ/OiBzdHJpbmc7CisgICAgZXh0cmE/OiBzdHJpbmc7CisgICAga2V5Pzogc3RyaW5nOworICAgIHJlYWQ/OiBib29sZWFuOworICAgIGF2YXRhcj86IHN0cmluZzsKKyAgICB0aXRsZT86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgZGF0ZXRpbWU/OiBzdHJpbmc7CisgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7CisgICAgdHlwZT86IE5vdGljZUljb25JdGVtVHlwZTsKKyAgfTsKKworICB0eXBlIE5vdGljZUljb25JdGVtVHlwZSA9ICdub3RpZmljYXRpb24nIHwgJ21lc3NhZ2UnIHwgJ2V2ZW50JzsKKworICB0eXBlIE5vdGljZUljb25MaXN0ID0geworICAgIGRhdGE/OiBOb3RpY2VJY29uSXRlbVtdOworICAgIC8qKiDliJfooajnmoTlhoXlrrnmgLvmlbAgKi8KKyAgICB0b3RhbD86IG51bWJlcjsKKyAgICBzdWNjZXNzPzogYm9vbGVhbjsKKyAgfTsKKworICB0eXBlIFBhZ2VQYXJhbXMgPSB7CisgICAgY3VycmVudD86IG51bWJlcjsKKyAgICBwYWdlU2l6ZT86IG51bWJlcjsKKyAgfTsKKworICB0eXBlIFJ1bGVMaXN0ID0geworICAgIGRhdGE/OiBSdWxlTGlzdEl0ZW1bXTsKKyAgICAvKiog5YiX6KGo55qE5YaF5a655oC75pWwICovCisgICAgdG90YWw/OiBudW1iZXI7CisgICAgc3VjY2Vzcz86IGJvb2xlYW47CisgIH07CisKKyAgdHlwZSBSdWxlTGlzdEl0ZW0gPSB7CisgICAga2V5PzogbnVtYmVyOworICAgIGRpc2FibGVkPzogYm9vbGVhbjsKKyAgICBocmVmPzogc3RyaW5nOworICAgIGF2YXRhcj86IHN0cmluZzsKKyAgICBuYW1lPzogc3RyaW5nOworICAgIG93bmVyPzogc3RyaW5nOworICAgIGRlc2M/OiBzdHJpbmc7CisgICAgY2FsbE5vPzogbnVtYmVyOworICAgIHN0YXR1cz86IG51bWJlcjsKKyAgICB1cGRhdGVkQXQ/OiBzdHJpbmc7CisgICAgY3JlYXRlZEF0Pzogc3RyaW5nOworICAgIHByb2dyZXNzPzogbnVtYmVyOworICB9OworCisgIHR5cGUgcnVsZVBhcmFtcyA9IHsKKyAgICAvKiog5b2T5YmN55qE6aG156CBICovCisgICAgY3VycmVudD86IG51bWJlcjsKKyAgICAvKiog6aG16Z2i55qE5a656YePICovCisgICAgcGFnZVNpemU/OiBudW1iZXI7CisgIH07Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9jYWNoZS50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2NhY2hlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDM2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9jYWNoZS50cwpAQCAtMCwwICsxLDE3IEBACitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7IAorCisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMS8wOS8xNgorICogCisgKiAqLworCisKKy8vIOiOt+WPluacjeWKoeWZqOS/oeaBrworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENhY2hlSW5mbygpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk1vbml0b3IuQ2FjaGVJbmZvUmVzdWx0PignL2FwaS9tb25pdG9yL2NhY2hlJywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3IvY2FjaGVsaXN0LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3IvY2FjaGVsaXN0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDhkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9jYWNoZWxpc3QudHMKQEAgLTAsMCArMSw1MSBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOyAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIyLzA2LzI3CisgKiAKKyAqICovCisgCisKKy8vIOafpeivoue8k+WtmOWQjeensOWIl+ihqAorZXhwb3J0IGZ1bmN0aW9uIGxpc3RDYWNoZU5hbWUoKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5Nb25pdG9yLkNhY2hlTmFtZXNSZXNwb25zZT4oJy9hcGkvbW9uaXRvci9jYWNoZS9nZXROYW1lcycsIHsKKyAgICBtZXRob2Q6ICdnZXQnCisgIH0pCit9CisKKy8vIOafpeivoue8k+WtmOmUruWQjeWIl+ihqAorZXhwb3J0IGZ1bmN0aW9uIGxpc3RDYWNoZUtleShjYWNoZU5hbWU6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTW9uaXRvci5DYWNoZUtleXNSZXNwb25zZT4oJy9hcGkvbW9uaXRvci9jYWNoZS9nZXRLZXlzLycgKyBjYWNoZU5hbWUsIHsKKyAgICBtZXRob2Q6ICdnZXQnCisgIH0pCit9CisKKy8vIOafpeivoue8k+WtmOWGheWuuQorZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlVmFsdWUoY2FjaGVOYW1lOiBzdHJpbmcsIGNhY2hlS2V5OiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk1vbml0b3IuQ2FjaGVWYWx1ZVJlc3BvbnNlPignL2FwaS9tb25pdG9yL2NhY2hlL2dldFZhbHVlLycgKyBjYWNoZU5hbWUgKyAnLycgKyBjYWNoZUtleSwgeworICAgIG1ldGhvZDogJ2dldCcKKyAgfSkKK30KKworLy8g5riF55CG5oyH5a6a5ZCN56ew57yT5a2YCitleHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZU5hbWUoY2FjaGVOYW1lOiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9jYWNoZS9jbGVhckNhY2hlTmFtZS8nICsgY2FjaGVOYW1lLCB7CisgICAgbWV0aG9kOiAnZGVsZXRlJworICB9KQorfQorCisvLyDmuIXnkIbmjIflrprplK7lkI3nvJPlrZgKK2V4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlS2V5KGNhY2hlS2V5OiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9jYWNoZS9jbGVhckNhY2hlS2V5LycgKyBjYWNoZUtleSwgeworICAgIG1ldGhvZDogJ2RlbGV0ZScKKyAgfSkKK30KKworLy8g5riF55CG5YWo6YOo57yT5a2YCitleHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZUFsbCgpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9jYWNoZS9jbGVhckNhY2hlQWxsJywgeworICAgIG1ldGhvZDogJ2RlbGV0ZScKKyAgfSkKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2pvYi50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2pvYi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJmODE5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivam9iLnRzCkBAIC0wLDAgKzEsNzMgQEAKK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IGRvd25Mb2FkWGxzeCB9IGZyb20gJ0AvdXRpbHMvZG93bmxvYWRmaWxlJzsKKworLyoqCisgKiDlrprml7bku7vliqHosIPluqYgQVBJCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZSAyMDIzLTAyLTA3CisgKi8KKworLy8g5p+l6K+i5a6a5pe25Lu75Yqh6LCD5bqm5YiX6KGoCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Sm9iTGlzdChwYXJhbXM/OiBBUEkuTW9uaXRvci5Kb2JMaXN0UGFyYW1zKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5Nb25pdG9yLkpvYlBhZ2VSZXN1bHQ+KCcvYXBpL21vbml0b3Ivam9iL2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOafpeivouWumuaXtuS7u+WKoeiwg+W6puivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldEpvYihqb2JJZDogbnVtYmVyKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5Nb25pdG9yLkpvYkluZm9SZXN1bHQ+KGAvYXBpL21vbml0b3Ivam9iLyR7am9iSWR9YCwgeworICAgIG1ldGhvZDogJ0dFVCcKKyAgfSk7Cit9CisKKy8vIOaWsOWinuWumuaXtuS7u+WKoeiwg+W6pgorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEpvYihwYXJhbXM6IEFQSS5Nb25pdG9yLkpvYikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9tb25pdG9yL2pvYicsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOS/ruaUueWumuaXtuS7u+WKoeiwg+W6pgorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUpvYihwYXJhbXM6IEFQSS5Nb25pdG9yLkpvYikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9tb25pdG9yL2pvYicsIHsKKyAgICBtZXRob2Q6ICdQVVQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5Yig6Zmk5a6a5pe25Lu75Yqh6LCD5bqmCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlSm9iKGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL21vbml0b3Ivam9iLyR7aWRzfWAsIHsKKyAgICBtZXRob2Q6ICdERUxFVEUnCisgIH0pOworfQorCisvLyDlr7zlh7rlrprml7bku7vliqHosIPluqYKK2V4cG9ydCBmdW5jdGlvbiBleHBvcnRKb2IocGFyYW1zPzogQVBJLk1vbml0b3IuSm9iTGlzdFBhcmFtcykgeworICByZXR1cm4gZG93bkxvYWRYbHN4KGAvYXBpL21vbml0b3Ivam9iL2V4cG9ydGAsIHsgcGFyYW1zIH0sIGBqb2JfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQorCisvLyDlrprml7bku7vliqHnq4vljbPmiafooYzkuIDmrKEKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Kb2Ioam9iSWQ6IG51bWJlciwgam9iR3JvdXA6IHN0cmluZykgeworICBjb25zdCBqb2IgPSB7CisgICAgam9iSWQsCisgICAgam9iR3JvdXAsCisgIH07CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL21vbml0b3Ivam9iL3J1bicsIHsKKyAgICBtZXRob2Q6ICdQVVQnLAorICAgIGRhdGE6IGpvYiwKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9qb2JMb2cudHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9qb2JMb2cudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4NWFhNwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2pvYkxvZy50cwpAQCAtMCwwICsxLDQwIEBACitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBkb3duTG9hZFhsc3ggfSBmcm9tICdAL3V0aWxzL2Rvd25sb2FkZmlsZSc7CisKKy8qKgorICog5a6a5pe25Lu75Yqh6LCD5bqm5pel5b+XIEFQSQorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXIKKyAqIEBkYXRlIDIwMjMtMDItMDcKKyAqLworCisvLyDmn6Xor6Llrprml7bku7vliqHosIPluqbml6Xlv5fliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRKb2JMb2dMaXN0KHBhcmFtcz86IEFQSS5Nb25pdG9yLkpvYkxvZ0xpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk1vbml0b3IuSm9iTG9nUGFnZVJlc3VsdD4oJy9hcGkvc2NoZWR1bGUvam9iL2xvZy9saXN0JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgcGFyYW1zCisgIH0pOworfQorCisKKy8vIOWIoOmZpOWumuaXtuS7u+WKoeiwg+W6puaXpeW/lworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUpvYkxvZyhqb2JMb2dJZDogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL3NjaGVkdWxlL2pvYi9sb2cvJHtqb2JMb2dJZH1gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJworICB9KTsKK30KKworLy8g5riF56m66LCD5bqm5pel5b+XCitleHBvcnQgZnVuY3Rpb24gY2xlYW5Kb2JMb2coKSB7CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL3NjaGVkdWxlL2pvYi9sb2cvY2xlYW4nLCB7CisgICAgbWV0aG9kOiAnZGVsZXRlJworICB9KQorfQorCisvLyDlr7zlh7rlrprml7bku7vliqHosIPluqbml6Xlv5cKK2V4cG9ydCBmdW5jdGlvbiBleHBvcnRKb2JMb2cocGFyYW1zPzogQVBJLk1vbml0b3IuSm9iTG9nTGlzdFBhcmFtcykgeworICByZXR1cm4gZG93bkxvYWRYbHN4KGAvYXBpL21vbml0b3Ivam9iTG9nL2V4cG9ydGAsIHsgcGFyYW1zIH0sIGBqb2Jsb2dfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3IvbG9naW5pbmZvci50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2xvZ2luaW5mb3IudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExODY0YQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL2xvZ2luaW5mb3IudHMKQEAgLTAsMCArMSw2OCBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6Lns7vnu5/orr/pl67orrDlvZXliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMb2dpbmluZm9yTGlzdChwYXJhbXM/OiBBUEkuTW9uaXRvci5Mb2dpbmluZm9yTGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTW9uaXRvci5Mb2dpbmluZm9yUGFnZVJlc3VsdD4oJy9hcGkvbW9uaXRvci9sb2dpbmluZm9yL2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOafpeivouezu+e7n+iuv+mXruiusOW9leivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2luaW5mb3IoaW5mb0lkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk1vbml0b3IuTG9naW5pbmZvckluZm9SZXN1bHQ+KGAvYXBpL21vbml0b3IvbG9naW5pbmZvci8ke2luZm9JZH1gLCB7CisgICAgbWV0aG9kOiAnR0VUJworICB9KTsKK30KKworLy8g5paw5aKe57O757uf6K6/6Zeu6K6w5b2VCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTG9naW5pbmZvcihwYXJhbXM6IEFQSS5Nb25pdG9yLkxvZ2luaW5mb3IpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9sb2dpbmluZm9yJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5L+u5pS557O757uf6K6/6Zeu6K6w5b2VCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTG9naW5pbmZvcihwYXJhbXM6IEFQSS5Nb25pdG9yLkxvZ2luaW5mb3IpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9sb2dpbmluZm9yJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDliKDpmaTns7vnu5/orr/pl67orrDlvZUKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVMb2dpbmluZm9yKGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL21vbml0b3IvbG9naW5pbmZvci8ke2lkc31gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJworICB9KTsKK30KKworLy8g5a+85Ye657O757uf6K6/6Zeu6K6w5b2VCitleHBvcnQgZnVuY3Rpb24gZXhwb3J0TG9naW5pbmZvcihwYXJhbXM/OiBBUEkuTW9uaXRvci5Mb2dpbmluZm9yTGlzdFBhcmFtcykgeworICByZXR1cm4gZG93bkxvYWRYbHN4KGAvYXBpL21vbml0b3IvbG9naW5pbmZvci9leHBvcnRgLCB7IHBhcmFtcyB9LCBgbG9naW5pbmZvcl8ke25ldyBEYXRlKCkuZ2V0VGltZSgpfS54bHN4YCk7Cit9CisKKy8vIOino+mUgeeUqOaIt+eZu+W9leeKtuaAgQorZXhwb3J0IGZ1bmN0aW9uIHVubG9ja0xvZ2luaW5mb3IodXNlck5hbWU6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9tb25pdG9yL2xvZ2luaW5mb3IvdW5sb2NrLycgKyB1c2VyTmFtZSwgeworICAgIG1ldGhvZDogJ2dldCcKKyAgfSkKK30KKworLy8g5riF56m655m75b2V5pel5b+XCitleHBvcnQgZnVuY3Rpb24gY2xlYW5Mb2dpbmluZm9yKCkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9tb25pdG9yL2xvZ2luaW5mb3IvY2xlYW4nLCB7CisgICAgbWV0aG9kOiAnZGVsZXRlJworICB9KQorfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivb25saW5lLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivb25saW5lLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMmE2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9vbmxpbmUudHMKQEAgLTAsMCArMSwyMyBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjEvMDkvMTYKKyAqCisgKiAqLworCisvLyDmn6Xor6LlnKjnur/nlKjmiLfliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPbmxpbmVVc2VyTGlzdChwYXJhbXM/OiBBUEkuTW9uaXRvci5PbmxpbmVVc2VyTGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTW9uaXRvci5PbmxpbmVVc2VyUGFnZVJlc3VsdD4oJy9hcGkvbW9uaXRvci9vbmxpbmUvbGlzdCcsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtcywKKyAgfSk7Cit9CisKKy8vIOW8uumAgOeUqOaItworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZvcmNlTG9nb3V0KHRva2VuSWQ6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdChgL2FwaS9tb25pdG9yL29ubGluZS8ke3Rva2VuSWR9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScsCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivb3BlcmxvZy50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL29wZXJsb2cudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0ODYzYQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9tb25pdG9yL29wZXJsb2cudHMKQEAgLTAsMCArMSw2MCBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6Lmk43kvZzml6Xlv5forrDlvZXliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPcGVybG9nTGlzdChwYXJhbXM/OiBBUEkuTW9uaXRvci5PcGVybG9nTGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTW9uaXRvci5PcGVybG9nUGFnZVJlc3VsdD4oJy9hcGkvbW9uaXRvci9vcGVybG9nL2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOafpeivouaTjeS9nOaXpeW/l+iusOW9leivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJsb2cob3BlcklkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk1vbml0b3IuT3BlcmxvZ0luZm9SZXN1bHQ+KGAvYXBpL21vbml0b3Ivb3BlcmxvZy8ke29wZXJJZH1gLCB7CisgICAgbWV0aG9kOiAnR0VUJworICB9KTsKK30KKworLy8g5paw5aKe5pON5L2c5pel5b+X6K6w5b2VCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkT3BlcmxvZyhwYXJhbXM6IEFQSS5Nb25pdG9yLk9wZXJsb2cpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9vcGVybG9nJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5L+u5pS55pON5L2c5pel5b+X6K6w5b2VCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlT3BlcmxvZyhwYXJhbXM6IEFQSS5Nb25pdG9yLk9wZXJsb2cpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvbW9uaXRvci9vcGVybG9nJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDliKDpmaTmk43kvZzml6Xlv5forrDlvZUKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVPcGVybG9nKGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL21vbml0b3Ivb3BlcmxvZy8ke2lkc31gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJworICB9KTsKK30KKworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFuQWxsT3BlcmxvZygpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oYC9hcGkvbW9uaXRvci9vcGVybG9nL2NsZWFuYCwgeworICAgIG1ldGhvZDogJ0RFTEVURScKKyAgfSk7Cit9CisKKy8vIOWvvOWHuuaTjeS9nOaXpeW/l+iusOW9lQorZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE9wZXJsb2cocGFyYW1zPzogQVBJLk1vbml0b3IuT3BlcmxvZ0xpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIGRvd25Mb2FkWGxzeChgL2FwaS9tb25pdG9yL29wZXJsb2cvZXhwb3J0YCwgeyBwYXJhbXMgfSwgYG9wZXJsb2dfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivc2VydmVyLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL21vbml0b3Ivc2VydmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTg0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvbW9uaXRvci9zZXJ2ZXIudHMKQEAgLTAsMCArMSwxNiBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOyAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIzLzAyLzA3CisgKiAKKyAqICovCisKKworLy8g6I635Y+W5pyN5Yqh5Zmo5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVySW5mbygpIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9hcGkvbW9uaXRvci9zZXJ2ZXInLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvc2Vzc2lvbi50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zZXNzaW9uLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGUwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc2Vzc2lvbi50cwpAQCAtMCwwICsxLDE1OSBAQAoraW1wb3J0IHsgY3JlYXRlSWNvbiB9IGZyb20gJ0AvdXRpbHMvSWNvblV0aWwnOworaW1wb3J0IHsgTWVudURhdGFJdGVtIH0gZnJvbSAnQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMnOworaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IFJlYWN0LCB7IGxhenkgfSBmcm9tICdyZWFjdCc7CisKKworbGV0IHJlbW90ZU1lbnU6IGFueSA9IG51bGw7CisKK2V4cG9ydCBmdW5jdGlvbiBnZXRSZW1vdGVNZW51KCkgeworICByZXR1cm4gcmVtb3RlTWVudTsKK30KKworZXhwb3J0IGZ1bmN0aW9uIHNldFJlbW90ZU1lbnUoZGF0YTogYW55KSB7CisgIHJlbW90ZU1lbnUgPSBkYXRhOworfQorCisKK2Z1bmN0aW9uIHBhdGNoUm91dGVJdGVtcyhyb3V0ZTogYW55LCBtZW51OiBhbnksIHBhcmVudFBhdGg6IHN0cmluZykgeworICBmb3IgKGNvbnN0IG1lbnVJdGVtIG9mIG1lbnUpIHsKKyAgICBpZiAobWVudUl0ZW0uY29tcG9uZW50ID09PSAnTGF5b3V0JyB8fCBtZW51SXRlbS5jb21wb25lbnQgPT09ICdQYXJlbnRWaWV3JykgeworICAgICAgaWYgKG1lbnVJdGVtLnJvdXRlcykgeworICAgICAgICBsZXQgaGFzSXRlbSA9IGZhbHNlOworICAgICAgICBsZXQgbmV3SXRlbSA9IG51bGw7CisgICAgICAgIGZvciAoY29uc3Qgcm91dGVDaGlsZCBvZiByb3V0ZS5yb3V0ZXMpIHsKKyAgICAgICAgICBpZiAocm91dGVDaGlsZC5wYXRoID09PSBtZW51SXRlbS5wYXRoKSB7CisgICAgICAgICAgICBoYXNJdGVtID0gdHJ1ZTsKKyAgICAgICAgICAgIG5ld0l0ZW0gPSByb3V0ZUNoaWxkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgICBuZXdJdGVtID0geworICAgICAgICAgICAgcGF0aDogbWVudUl0ZW0ucGF0aCwKKyAgICAgICAgICAgIHJvdXRlczogW10sCisgICAgICAgICAgICBjaGlsZHJlbjogW10KKyAgICAgICAgICB9CisgICAgICAgICAgcm91dGUucm91dGVzLnB1c2gobmV3SXRlbSkKKyAgICAgICAgfQorICAgICAgICBwYXRjaFJvdXRlSXRlbXMobmV3SXRlbSwgbWVudUl0ZW0ucm91dGVzLCBwYXJlbnRQYXRoICsgbWVudUl0ZW0ucGF0aCArICcvJyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IG1lbnVJdGVtLmNvbXBvbmVudC5zcGxpdCgnLycpOworICAgICAgbGV0IHBhdGggPSAnJzsKKyAgICAgIG5hbWVzLmZvckVhY2gobmFtZSA9PiB7CisgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBwYXRoICs9ICcvJzsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPT0gJ2luZGV4JykgeworICAgICAgICAgIHBhdGggKz0gbmFtZS5hdCgwKT8udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhdGggKz0gbmFtZTsKKyAgICAgICAgfQorICAgICAgfSkKKyAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgnLnRzeCcpKSB7CisgICAgICAgIHBhdGggKz0gJy50c3gnCisgICAgICB9CisgICAgICBpZiAocm91dGUucm91dGVzID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgcm91dGUucm91dGVzID0gW107CisgICAgICB9CisgICAgICBpZiAocm91dGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IFtdOworICAgICAgfQorICAgICAgY29uc3QgbmV3Um91dGUgPSB7CisgICAgICAgIGVsZW1lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQobGF6eSgoKSA9PiBpbXBvcnQoJ0AvcGFnZXMvJyArIHBhdGgpKSksCisgICAgICAgIHBhdGg6IHBhcmVudFBhdGggKyBtZW51SXRlbS5wYXRoLAorICAgICAgfQorICAgICAgcm91dGUuY2hpbGRyZW4ucHVzaChuZXdSb3V0ZSk7CisgICAgICByb3V0ZS5yb3V0ZXMucHVzaChuZXdSb3V0ZSk7CisgICAgfQorICB9Cit9CisKK2V4cG9ydCBmdW5jdGlvbiBwYXRjaFJvdXRlV2l0aFJlbW90ZU1lbnVzKHJvdXRlczogYW55KSB7CisgIGlmIChyZW1vdGVNZW51ID09PSBudWxsKSB7IHJldHVybjsgfQorICBsZXQgcHJvTGF5b3V0ID0gbnVsbDsKKyAgZm9yIChjb25zdCByb3V0ZUl0ZW0gb2Ygcm91dGVzKSB7CisgICAgaWYgKHJvdXRlSXRlbS5pZCA9PT0gJ2FudC1kZXNpZ24tcHJvLWxheW91dCcpIHsKKyAgICAgIHByb0xheW91dCA9IHJvdXRlSXRlbTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwYXRjaFJvdXRlSXRlbXMocHJvTGF5b3V0LCByZW1vdGVNZW51LCAnJyk7Cit9CisKKy8qKiDojrflj5blvZPliY3nmoTnlKjmiLcgR0VUIC9hcGkvZ2V0VXNlckluZm8gKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVc2VySW5mbyhvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuVXNlckluZm9SZXN1bHQ+KCcvYXBpL2dldEluZm8nLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvLyDliLfmlrDmlrnms5UKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoVG9rZW4oKSB7CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL2F1dGgvcmVmcmVzaCcsIHsKKyAgICBtZXRob2Q6ICdwb3N0JworICB9KQorfQorCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Um91dGVycygpOiBQcm9taXNlPGFueT4geworICByZXR1cm4gcmVxdWVzdCgnL2FwaS9nZXRSb3V0ZXJzJyk7Cit9CisKK2V4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q29tcGF0Um91dGVycyhjaGlsZHJlbnM6IEFQSS5Sb3V0ZXJzTWVudUl0ZW1bXSk6IGFueVtdIHsKKyAgcmV0dXJuIGNoaWxkcmVucy5tYXAoKGl0ZW06IEFQSS5Sb3V0ZXJzTWVudUl0ZW0pID0+IHsKKyAgICByZXR1cm4geworICAgICAgcGF0aDogaXRlbS5wYXRoLAorICAgICAgaWNvbjogY3JlYXRlSWNvbihpdGVtLm1ldGEuaWNvbiksCisgICAgICAvLyAgaWNvbjogaXRlbS5tZXRhLmljb24sCisgICAgICBuYW1lOiBpdGVtLm1ldGEudGl0bGUsCisgICAgICByb3V0ZXM6IGl0ZW0uY2hpbGRyZW4gPyBjb252ZXJ0Q29tcGF0Um91dGVycyhpdGVtLmNoaWxkcmVuKSA6IHVuZGVmaW5lZCwKKyAgICAgIGhpZGVDaGlsZHJlbkluTWVudTogaXRlbS5oaWRkZW4sCisgICAgICBoaWRlSW5NZW51OiBpdGVtLmhpZGRlbiwKKyAgICAgIGNvbXBvbmVudDogaXRlbS5jb21wb25lbnQsCisgICAgICBhdXRob3JpdHk6IGl0ZW0ucGVybXMsCisgICAgfTsKKyAgfSk7Cit9CisKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0ZXJzSW5mbygpOiBQcm9taXNlPE1lbnVEYXRhSXRlbVtdPiB7CisgIHJldHVybiBnZXRSb3V0ZXJzKCkudGhlbigocmVzKSA9PiB7CisgICAgaWYgKHJlcy5jb2RlID09PSAyMDApIHsKKyAgICAgIHJldHVybiBjb252ZXJ0Q29tcGF0Um91dGVycyhyZXMuZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBbXTsKKyAgICB9CisgIH0pOworfQorCitleHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hNZW51SXRlbSgKKyAgcGF0aDogc3RyaW5nLAorICBtZW51RGF0YTogTWVudURhdGFJdGVtW10gfCB1bmRlZmluZWQsCispOiBNZW51RGF0YUl0ZW1bXSB7CisgIGlmICghbWVudURhdGEpIHJldHVybiBbXTsKKyAgbGV0IGl0ZW1zOiBNZW51RGF0YUl0ZW1bXSA9IFtdOworICBtZW51RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CisgICAgaWYgKGl0ZW0ucGF0aCkgeworICAgICAgaWYgKGl0ZW0ucGF0aCA9PT0gcGF0aCkgeworICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAocGF0aC5sZW5ndGggPj0gaXRlbS5wYXRoPy5sZW5ndGgpIHsKKyAgICAgICAgY29uc3QgZXhwID0gYCR7aXRlbS5wYXRofS8qYDsKKyAgICAgICAgaWYgKHBhdGgubWF0Y2goZXhwKSkgeworICAgICAgICAgIGlmIChpdGVtLnJvdXRlcykgeworICAgICAgICAgICAgY29uc3Qgc3VicGF0aCA9IHBhdGguc3Vic3RyKGl0ZW0ucGF0aC5sZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGNvbnN0IHN1Ykl0ZW06IE1lbnVEYXRhSXRlbVtdID0gZ2V0TWF0Y2hNZW51SXRlbShzdWJwYXRoLCBpdGVtLnJvdXRlcyk7CisgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdChzdWJJdGVtKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBwYXRoLnNwbGl0KCcvJyk7CisgICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID49IDIgJiYgcGF0aHNbMF0gPT09IGl0ZW0ucGF0aCAmJiBwYXRoc1sxXSA9PT0gJ2luZGV4JykgeworICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisgIHJldHVybiBpdGVtczsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zd2FnZ2VyL2luZGV4LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvaW5kZXgudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjZjk3YwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zd2FnZ2VyL2luZGV4LnRzCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEB0cy1pZ25vcmUKKy8qIGVzbGludC1kaXNhYmxlICovCisvLyBBUEkg5pu05paw5pe26Ze077yaCisvLyBBUEkg5ZSv5LiA5qCH6K+G77yaCitpbXBvcnQgKiBhcyBwZXQgZnJvbSAnLi9wZXQnOworaW1wb3J0ICogYXMgc3RvcmUgZnJvbSAnLi9zdG9yZSc7CitpbXBvcnQgKiBhcyB1c2VyIGZyb20gJy4vdXNlcic7CitleHBvcnQgZGVmYXVsdCB7CisgIHBldCwKKyAgc3RvcmUsCisgIHVzZXIsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvcGV0LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvcGV0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODc0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3dhZ2dlci9wZXQudHMKQEAgLTAsMCArMSwxNTMgQEAKKy8vIEB0cy1pZ25vcmUKKy8qIGVzbGludC1kaXNhYmxlICovCitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CisKKy8qKiBVcGRhdGUgYW4gZXhpc3RpbmcgcGV0IFBVVCAvcGV0ICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGV0KGJvZHk6IEFQSS5QZXQsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PGFueT4oJy9wZXQnLCB7CisgICAgbWV0aG9kOiAnUFVUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAorICAgIH0sCisgICAgZGF0YTogYm9keSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogQWRkIGEgbmV3IHBldCB0byB0aGUgc3RvcmUgUE9TVCAvcGV0ICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkUGV0KGJvZHk6IEFQSS5QZXQsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PGFueT4oJy9wZXQnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKKyAgICB9LAorICAgIGRhdGE6IGJvZHksCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIEZpbmQgcGV0IGJ5IElEIFJldHVybnMgYSBzaW5nbGUgcGV0IEdFVCAvcGV0LyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBldEJ5SWQoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkuZ2V0UGV0QnlJZFBhcmFtcywKKyAgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sCispIHsKKyAgY29uc3QgeyBwZXRJZDogcGFyYW0wLCAuLi5xdWVyeVBhcmFtcyB9ID0gcGFyYW1zOworICByZXR1cm4gcmVxdWVzdDxBUEkuUGV0PihgL3BldC8ke3BhcmFtMH1gLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBwYXJhbXM6IHsgLi4ucXVlcnlQYXJhbXMgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogVXBkYXRlcyBhIHBldCBpbiB0aGUgc3RvcmUgd2l0aCBmb3JtIGRhdGEgUE9TVCAvcGV0LyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBldFdpdGhGb3JtKAorICAvLyDlj6DliqDnlJ/miJDnmoRQYXJhbeexu+WeiyAo6Z2eYm9keeWPguaVsHN3YWdnZXLpu5jorqTmsqHmnInnlJ/miJDlr7nosaEpCisgIHBhcmFtczogQVBJLnVwZGF0ZVBldFdpdGhGb3JtUGFyYW1zLAorICBib2R5OiB7IG5hbWU/OiBzdHJpbmc7IHN0YXR1cz86IHN0cmluZyB9LAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICBjb25zdCB7IHBldElkOiBwYXJhbTAsIC4uLnF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXM7CisgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisKKyAgT2JqZWN0LmtleXMoYm9keSkuZm9yRWFjaCgoZWxlKSA9PiB7CisgICAgY29uc3QgaXRlbSA9IChib2R5IGFzIGFueSlbZWxlXTsKKworICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbCkgeworICAgICAgZm9ybURhdGEuYXBwZW5kKAorICAgICAgICBlbGUsCisgICAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhKGl0ZW0gaW5zdGFuY2VvZiBGaWxlKSA/IEpTT04uc3RyaW5naWZ5KGl0ZW0pIDogaXRlbSwKKyAgICAgICk7CisgICAgfQorICB9KTsKKworICByZXR1cm4gcmVxdWVzdDxhbnk+KGAvcGV0LyR7cGFyYW0wfWAsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICBwYXJhbXM6IHsgLi4ucXVlcnlQYXJhbXMgfSwKKyAgICBkYXRhOiBmb3JtRGF0YSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogRGVsZXRlcyBhIHBldCBERUxFVEUgL3BldC8ke3BhcmFtMH0gKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVQZXQoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkuZGVsZXRlUGV0UGFyYW1zICYgeworICAgIC8vIGhlYWRlcgorICAgIGFwaV9rZXk/OiBzdHJpbmc7CisgIH0sCisgIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LAorKSB7CisgIGNvbnN0IHsgcGV0SWQ6IHBhcmFtMCwgLi4ucXVlcnlQYXJhbXMgfSA9IHBhcmFtczsKKyAgcmV0dXJuIHJlcXVlc3Q8YW55PihgL3BldC8ke3BhcmFtMH1gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJywKKyAgICBoZWFkZXJzOiB7fSwKKyAgICBwYXJhbXM6IHsgLi4ucXVlcnlQYXJhbXMgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogdXBsb2FkcyBhbiBpbWFnZSBQT1NUIC9wZXQvJHtwYXJhbTB9L3VwbG9hZEltYWdlICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkRmlsZSgKKyAgLy8g5Y+g5Yqg55Sf5oiQ55qEUGFyYW3nsbvlnosgKOmdnmJvZHnlj4LmlbBzd2FnZ2Vy6buY6K6k5rKh5pyJ55Sf5oiQ5a+56LGhKQorICBwYXJhbXM6IEFQSS51cGxvYWRGaWxlUGFyYW1zLAorICBib2R5OiB7IGFkZGl0aW9uYWxNZXRhZGF0YT86IHN0cmluZzsgZmlsZT86IHN0cmluZyB9LAorICBmaWxlPzogRmlsZSwKKyAgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sCispIHsKKyAgY29uc3QgeyBwZXRJZDogcGFyYW0wLCAuLi5xdWVyeVBhcmFtcyB9ID0gcGFyYW1zOworICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOworCisgIGlmIChmaWxlKSB7CisgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7CisgIH0KKworICBPYmplY3Qua2V5cyhib2R5KS5mb3JFYWNoKChlbGUpID0+IHsKKyAgICBjb25zdCBpdGVtID0gKGJvZHkgYXMgYW55KVtlbGVdOworCisgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsKSB7CisgICAgICBmb3JtRGF0YS5hcHBlbmQoCisgICAgICAgIGVsZSwKKyAgICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICEoaXRlbSBpbnN0YW5jZW9mIEZpbGUpID8gSlNPTi5zdHJpbmdpZnkoaXRlbSkgOiBpdGVtLAorICAgICAgKTsKKyAgICB9CisgIH0pOworCisgIHJldHVybiByZXF1ZXN0PEFQSS5BcGlSZXNwb25zZT4oYC9wZXQvJHtwYXJhbTB9L3VwbG9hZEltYWdlYCwgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIHBhcmFtczogeyAuLi5xdWVyeVBhcmFtcyB9LAorICAgIGRhdGE6IGZvcm1EYXRhLAorICAgIHJlcXVlc3RUeXBlOiAnZm9ybScsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIEZpbmRzIFBldHMgYnkgc3RhdHVzIE11bHRpcGxlIHN0YXR1cyB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkIHdpdGggY29tbWEgc2VwYXJhdGVkIHN0cmluZ3MgR0VUIC9wZXQvZmluZEJ5U3RhdHVzICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZFBldHNCeVN0YXR1cygKKyAgLy8g5Y+g5Yqg55Sf5oiQ55qEUGFyYW3nsbvlnosgKOmdnmJvZHnlj4LmlbBzd2FnZ2Vy6buY6K6k5rKh5pyJ55Sf5oiQ5a+56LGhKQorICBwYXJhbXM6IEFQSS5maW5kUGV0c0J5U3RhdHVzUGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUGV0W10+KCcvcGV0L2ZpbmRCeVN0YXR1cycsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtczogeworICAgICAgLi4ucGFyYW1zLAorICAgIH0sCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIEZpbmRzIFBldHMgYnkgdGFncyBNdWxpcGxlIHRhZ3MgY2FuIGJlIHByb3ZpZGVkIHdpdGggY29tbWEgc2VwYXJhdGVkIHN0cmluZ3MuIFVzZSAgICAgICAgIHRhZzEsIHRhZzIsIHRhZzMgZm9yIHRlc3RpbmcuIEdFVCAvcGV0L2ZpbmRCeVRhZ3MgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kUGV0c0J5VGFncygKKyAgLy8g5Y+g5Yqg55Sf5oiQ55qEUGFyYW3nsbvlnosgKOmdnmJvZHnlj4LmlbBzd2FnZ2Vy6buY6K6k5rKh5pyJ55Sf5oiQ5a+56LGhKQorICBwYXJhbXM6IEFQSS5maW5kUGV0c0J5VGFnc1BhcmFtcywKKyAgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sCispIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlBldFtdPignL3BldC9maW5kQnlUYWdzJywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgcGFyYW1zOiB7CisgICAgICAuLi5wYXJhbXMsCisgICAgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvc3RvcmUudHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3dhZ2dlci9zdG9yZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM2ODlhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvc3RvcmUudHMKQEAgLTAsMCArMSw0OCBAQAorLy8gQHRzLWlnbm9yZQorLyogZXNsaW50LWRpc2FibGUgKi8KK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKKworLyoqIFJldHVybnMgcGV0IGludmVudG9yaWVzIGJ5IHN0YXR1cyBSZXR1cm5zIGEgbWFwIG9mIHN0YXR1cyBjb2RlcyB0byBxdWFudGl0aWVzIEdFVCAvc3RvcmUvaW52ZW50b3J5ICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW52ZW50b3J5KG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PFJlY29yZDxzdHJpbmcsIGFueT4+KCcvc3RvcmUvaW52ZW50b3J5JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIFBsYWNlIGFuIG9yZGVyIGZvciBhIHBldCBQT1NUIC9zdG9yZS9vcmRlciAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYWNlT3JkZXIoYm9keTogQVBJLk9yZGVyLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuT3JkZXI+KCcvc3RvcmUvb3JkZXInLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgZGF0YTogYm9keSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogRmluZCBwdXJjaGFzZSBvcmRlciBieSBJRCBGb3IgdmFsaWQgcmVzcG9uc2UgdHJ5IGludGVnZXIgSURzIHdpdGggdmFsdWUgPj0gMSBhbmQgPD0gMTAuICAgICAgICAgT3RoZXIgdmFsdWVzIHdpbGwgZ2VuZXJhdGVkIGV4Y2VwdGlvbnMgR0VUIC9zdG9yZS9vcmRlci8ke3BhcmFtMH0gKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPcmRlckJ5SWQoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkuZ2V0T3JkZXJCeUlkUGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICBjb25zdCB7IG9yZGVySWQ6IHBhcmFtMCwgLi4ucXVlcnlQYXJhbXMgfSA9IHBhcmFtczsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLk9yZGVyPihgL3N0b3JlL29yZGVyLyR7cGFyYW0wfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtczogeyAuLi5xdWVyeVBhcmFtcyB9LAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8qKiBEZWxldGUgcHVyY2hhc2Ugb3JkZXIgYnkgSUQgRm9yIHZhbGlkIHJlc3BvbnNlIHRyeSBpbnRlZ2VyIElEcyB3aXRoIHBvc2l0aXZlIGludGVnZXIgdmFsdWUuICAgICAgICAgTmVnYXRpdmUgb3Igbm9uLWludGVnZXIgdmFsdWVzIHdpbGwgZ2VuZXJhdGUgQVBJIGVycm9ycyBERUxFVEUgL3N0b3JlL29yZGVyLyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9yZGVyKAorICAvLyDlj6DliqDnlJ/miJDnmoRQYXJhbeexu+WeiyAo6Z2eYm9keeWPguaVsHN3YWdnZXLpu5jorqTmsqHmnInnlJ/miJDlr7nosaEpCisgIHBhcmFtczogQVBJLmRlbGV0ZU9yZGVyUGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICBjb25zdCB7IG9yZGVySWQ6IHBhcmFtMCwgLi4ucXVlcnlQYXJhbXMgfSA9IHBhcmFtczsKKyAgcmV0dXJuIHJlcXVlc3Q8YW55PihgL3N0b3JlL29yZGVyLyR7cGFyYW0wfWAsIHsKKyAgICBtZXRob2Q6ICdERUxFVEUnLAorICAgIHBhcmFtczogeyAuLi5xdWVyeVBhcmFtcyB9LAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvc3dhZ2dlci90eXBpbmdzLmQudHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3dhZ2dlci90eXBpbmdzLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YmNmYwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zd2FnZ2VyL3R5cGluZ3MuZC50cwpAQCAtMCwwICsxLDExMiBAQAorZGVjbGFyZSBuYW1lc3BhY2UgQVBJIHsKKyAgdHlwZSBBcGlSZXNwb25zZSA9IHsKKyAgICBjb2RlPzogbnVtYmVyOworICAgIHR5cGU/OiBzdHJpbmc7CisgICAgbWVzc2FnZT86IHN0cmluZzsKKyAgfTsKKworICB0eXBlIENhdGVnb3J5ID0geworICAgIGlkPzogbnVtYmVyOworICAgIG5hbWU/OiBzdHJpbmc7CisgIH07CisKKyAgdHlwZSBkZWxldGVPcmRlclBhcmFtcyA9IHsKKyAgICAvKiogSUQgb2YgdGhlIG9yZGVyIHRoYXQgbmVlZHMgdG8gYmUgZGVsZXRlZCAqLworICAgIG9yZGVySWQ6IG51bWJlcjsKKyAgfTsKKworICB0eXBlIGRlbGV0ZVBldFBhcmFtcyA9IHsKKyAgICBhcGlfa2V5Pzogc3RyaW5nOworICAgIC8qKiBQZXQgaWQgdG8gZGVsZXRlICovCisgICAgcGV0SWQ6IG51bWJlcjsKKyAgfTsKKworICB0eXBlIGRlbGV0ZVVzZXJQYXJhbXMgPSB7CisgICAgLyoqIFRoZSBuYW1lIHRoYXQgbmVlZHMgdG8gYmUgZGVsZXRlZCAqLworICAgIHVzZXJuYW1lOiBzdHJpbmc7CisgIH07CisKKyAgdHlwZSBmaW5kUGV0c0J5U3RhdHVzUGFyYW1zID0geworICAgIC8qKiBTdGF0dXMgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBjb25zaWRlcmVkIGZvciBmaWx0ZXIgKi8KKyAgICBzdGF0dXM6ICgnYXZhaWxhYmxlJyB8ICdwZW5kaW5nJyB8ICdzb2xkJylbXTsKKyAgfTsKKworICB0eXBlIGZpbmRQZXRzQnlUYWdzUGFyYW1zID0geworICAgIC8qKiBUYWdzIHRvIGZpbHRlciBieSAqLworICAgIHRhZ3M6IHN0cmluZ1tdOworICB9OworCisgIHR5cGUgZ2V0T3JkZXJCeUlkUGFyYW1zID0geworICAgIC8qKiBJRCBvZiBwZXQgdGhhdCBuZWVkcyB0byBiZSBmZXRjaGVkICovCisgICAgb3JkZXJJZDogbnVtYmVyOworICB9OworCisgIHR5cGUgZ2V0UGV0QnlJZFBhcmFtcyA9IHsKKyAgICAvKiogSUQgb2YgcGV0IHRvIHJldHVybiAqLworICAgIHBldElkOiBudW1iZXI7CisgIH07CisKKyAgdHlwZSBnZXRVc2VyQnlOYW1lUGFyYW1zID0geworICAgIC8qKiBUaGUgbmFtZSB0aGF0IG5lZWRzIHRvIGJlIGZldGNoZWQuIFVzZSB1c2VyMSBmb3IgdGVzdGluZy4gICovCisgICAgdXNlcm5hbWU6IHN0cmluZzsKKyAgfTsKKworICB0eXBlIGxvZ2luVXNlclBhcmFtcyA9IHsKKyAgICAvKiogVGhlIHVzZXIgbmFtZSBmb3IgbG9naW4gKi8KKyAgICB1c2VybmFtZTogc3RyaW5nOworICAgIC8qKiBUaGUgcGFzc3dvcmQgZm9yIGxvZ2luIGluIGNsZWFyIHRleHQgKi8KKyAgICBwYXNzd29yZDogc3RyaW5nOworICB9OworCisgIHR5cGUgT3JkZXIgPSB7CisgICAgaWQ/OiBudW1iZXI7CisgICAgcGV0SWQ/OiBudW1iZXI7CisgICAgcXVhbnRpdHk/OiBudW1iZXI7CisgICAgc2hpcERhdGU/OiBzdHJpbmc7CisgICAgLyoqIE9yZGVyIFN0YXR1cyAqLworICAgIHN0YXR1cz86ICdwbGFjZWQnIHwgJ2FwcHJvdmVkJyB8ICdkZWxpdmVyZWQnOworICAgIGNvbXBsZXRlPzogYm9vbGVhbjsKKyAgfTsKKworICB0eXBlIFBldCA9IHsKKyAgICBpZD86IG51bWJlcjsKKyAgICBjYXRlZ29yeT86IENhdGVnb3J5OworICAgIG5hbWU6IHN0cmluZzsKKyAgICBwaG90b1VybHM6IHN0cmluZ1tdOworICAgIHRhZ3M/OiBUYWdbXTsKKyAgICAvKiogcGV0IHN0YXR1cyBpbiB0aGUgc3RvcmUgKi8KKyAgICBzdGF0dXM/OiAnYXZhaWxhYmxlJyB8ICdwZW5kaW5nJyB8ICdzb2xkJzsKKyAgfTsKKworICB0eXBlIFRhZyA9IHsKKyAgICBpZD86IG51bWJlcjsKKyAgICBuYW1lPzogc3RyaW5nOworICB9OworCisgIHR5cGUgdXBkYXRlUGV0V2l0aEZvcm1QYXJhbXMgPSB7CisgICAgLyoqIElEIG9mIHBldCB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgKi8KKyAgICBwZXRJZDogbnVtYmVyOworICB9OworCisgIHR5cGUgdXBkYXRlVXNlclBhcmFtcyA9IHsKKyAgICAvKiogbmFtZSB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCAqLworICAgIHVzZXJuYW1lOiBzdHJpbmc7CisgIH07CisKKyAgdHlwZSB1cGxvYWRGaWxlUGFyYW1zID0geworICAgIC8qKiBJRCBvZiBwZXQgdG8gdXBkYXRlICovCisgICAgcGV0SWQ6IG51bWJlcjsKKyAgfTsKKworICB0eXBlIFVzZXIgPSB7CisgICAgaWQ/OiBudW1iZXI7CisgICAgdXNlcm5hbWU/OiBzdHJpbmc7CisgICAgZmlyc3ROYW1lPzogc3RyaW5nOworICAgIGxhc3ROYW1lPzogc3RyaW5nOworICAgIGVtYWlsPzogc3RyaW5nOworICAgIHBhc3N3b3JkPzogc3RyaW5nOworICAgIHBob25lPzogc3RyaW5nOworICAgIC8qKiBVc2VyIFN0YXR1cyAqLworICAgIHVzZXJTdGF0dXM/OiBudW1iZXI7CisgIH07Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvc3dhZ2dlci91c2VyLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvdXNlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ2ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N3YWdnZXIvdXNlci50cwpAQCAtMCwwICsxLDEwMCBAQAorLy8gQHRzLWlnbm9yZQorLyogZXNsaW50LWRpc2FibGUgKi8KK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKKworLyoqIENyZWF0ZSB1c2VyIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSB0aGUgbG9nZ2VkIGluIHVzZXIuIFBPU1QgL3VzZXIgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVVc2VyKGJvZHk6IEFQSS5Vc2VyLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxhbnk+KCcvdXNlcicsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICBkYXRhOiBib2R5LAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8qKiBHZXQgdXNlciBieSB1c2VyIG5hbWUgR0VUIC91c2VyLyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVzZXJCeU5hbWUoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkuZ2V0VXNlckJ5TmFtZVBhcmFtcywKKyAgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sCispIHsKKyAgY29uc3QgeyB1c2VybmFtZTogcGFyYW0wLCAuLi5xdWVyeVBhcmFtcyB9ID0gcGFyYW1zOworICByZXR1cm4gcmVxdWVzdDxBUEkuVXNlcj4oYC91c2VyLyR7cGFyYW0wfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtczogeyAuLi5xdWVyeVBhcmFtcyB9LAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8qKiBVcGRhdGVkIHVzZXIgVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4gUFVUIC91c2VyLyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVVzZXIoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkudXBkYXRlVXNlclBhcmFtcywKKyAgYm9keTogQVBJLlVzZXIsCisgIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LAorKSB7CisgIGNvbnN0IHsgdXNlcm5hbWU6IHBhcmFtMCwgLi4ucXVlcnlQYXJhbXMgfSA9IHBhcmFtczsKKyAgcmV0dXJuIHJlcXVlc3Q8YW55PihgL3VzZXIvJHtwYXJhbTB9YCwgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgcGFyYW1zOiB7IC4uLnF1ZXJ5UGFyYW1zIH0sCisgICAgZGF0YTogYm9keSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogRGVsZXRlIHVzZXIgVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4gREVMRVRFIC91c2VyLyR7cGFyYW0wfSAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVVzZXIoCisgIC8vIOWPoOWKoOeUn+aIkOeahFBhcmFt57G75Z6LICjpnZ5ib2R55Y+C5pWwc3dhZ2dlcum7mOiupOayoeacieeUn+aIkOWvueixoSkKKyAgcGFyYW1zOiBBUEkuZGVsZXRlVXNlclBhcmFtcywKKyAgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0sCispIHsKKyAgY29uc3QgeyB1c2VybmFtZTogcGFyYW0wLCAuLi5xdWVyeVBhcmFtcyB9ID0gcGFyYW1zOworICByZXR1cm4gcmVxdWVzdDxhbnk+KGAvdXNlci8ke3BhcmFtMH1gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJywKKyAgICBwYXJhbXM6IHsgLi4ucXVlcnlQYXJhbXMgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogQ3JlYXRlcyBsaXN0IG9mIHVzZXJzIHdpdGggZ2l2ZW4gaW5wdXQgYXJyYXkgUE9TVCAvdXNlci9jcmVhdGVXaXRoQXJyYXkgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVVc2Vyc1dpdGhBcnJheUlucHV0KAorICBib2R5OiBBUEkuVXNlcltdLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICByZXR1cm4gcmVxdWVzdDxhbnk+KCcvdXNlci9jcmVhdGVXaXRoQXJyYXknLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgZGF0YTogYm9keSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogQ3JlYXRlcyBsaXN0IG9mIHVzZXJzIHdpdGggZ2l2ZW4gaW5wdXQgYXJyYXkgUE9TVCAvdXNlci9jcmVhdGVXaXRoTGlzdCAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVzZXJzV2l0aExpc3RJbnB1dChib2R5OiBBUEkuVXNlcltdLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxhbnk+KCcvdXNlci9jcmVhdGVXaXRoTGlzdCcsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICBkYXRhOiBib2R5LAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8qKiBMb2dzIHVzZXIgaW50byB0aGUgc3lzdGVtIEdFVCAvdXNlci9sb2dpbiAqLworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ2luVXNlcigKKyAgLy8g5Y+g5Yqg55Sf5oiQ55qEUGFyYW3nsbvlnosgKOmdnmJvZHnlj4LmlbBzd2FnZ2Vy6buY6K6k5rKh5pyJ55Sf5oiQ5a+56LGhKQorICBwYXJhbXM6IEFQSS5sb2dpblVzZXJQYXJhbXMsCisgIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LAorKSB7CisgIHJldHVybiByZXF1ZXN0PHN0cmluZz4oJy91c2VyL2xvZ2luJywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgcGFyYW1zOiB7CisgICAgICAuLi5wYXJhbXMsCisgICAgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiogTG9ncyBvdXQgY3VycmVudCBsb2dnZWQgaW4gdXNlciBzZXNzaW9uIEdFVCAvdXNlci9sb2dvdXQgKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXRVc2VyKG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PGFueT4oJy91c2VyL2xvZ291dCcsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL2F1dGgudHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL2F1dGgudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1NzYxOAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vYXV0aC50cwpAQCAtMCwwICsxLDM5IEBACitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CisKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYXB0Y2hhSW1nKHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7CisgIHJldHVybiByZXF1ZXN0KCcvYXBpL2NhcHRjaGFJbWFnZScsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIHBhcmFtczogeworICAgICAgLi4ucGFyYW1zLAorICAgIH0sCisgICAgaGVhZGVyczogeworICAgICAgaXNUb2tlbjogZmFsc2UsCisgICAgfSwKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvKiog55m75b2V5o6l5Y+jIFBPU1QgL2FwaS9sb2dpbi9hY2NvdW50ICovCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9naW4oYm9keTogQVBJLkxvZ2luUGFyYW1zLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuTG9naW5SZXN1bHQ+KCcvYXBpL2xvZ2luJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgIGlzVG9rZW46IGZhbHNlLAorICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKKyAgICB9LAorICAgIGRhdGE6IGJvZHksCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLyoqIOmAgOWHuueZu+W9leaOpeWPoyBQT1NUIC9hcGkvbG9naW4vb3V0TG9naW4gKi8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXQoKSB7CisgIHJldHVybiByZXF1ZXN0PFJlY29yZDxzdHJpbmcsIGFueT4+KCcvYXBpL2xvZ291dCcsIHsKKyAgICBtZXRob2Q6ICdkZWxldGUnLAorICB9KTsKK30KKworLy8g6I635Y+W5omL5py66aqM6K+B56CBCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TW9iaWxlQ2FwdGNoYShtb2JpbGU6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdChgL2FwaS9sb2dpbi9jYXB0Y2hhP21vYmlsZT0ke21vYmlsZX1gKTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vY29uZmlnLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9jb25maWcudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0M2RhZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vY29uZmlnLnRzCkBAIC0wLDAgKzEsNjIgQEAKK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IGRvd25Mb2FkWGxzeCB9IGZyb20gJ0AvdXRpbHMvZG93bmxvYWRmaWxlJzsKKworLy8g5p+l6K+i5Y+C5pWw6YWN572u5YiX6KGoCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29uZmlnTGlzdChwYXJhbXM/OiBBUEkuU3lzdGVtLkNvbmZpZ0xpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlN5c3RlbS5Db25maWdQYWdlUmVzdWx0PignL2FwaS9zeXN0ZW0vY29uZmlnL2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOafpeivouWPguaVsOmFjee9ruivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZyhjb25maWdJZDogbnVtYmVyKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uQ29uZmlnSW5mb1Jlc3VsdD4oYC9hcGkvc3lzdGVtL2NvbmZpZy8ke2NvbmZpZ0lkfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnCisgIH0pOworfQorCisvLyDmlrDlop7lj4LmlbDphY3nva4KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRDb25maWcocGFyYW1zOiBBUEkuU3lzdGVtLkNvbmZpZykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vY29uZmlnJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5L+u5pS55Y+C5pWw6YWN572uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ29uZmlnKHBhcmFtczogQVBJLlN5c3RlbS5Db25maWcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL2NvbmZpZycsIHsKKyAgICBtZXRob2Q6ICdQVVQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5Yig6Zmk5Y+C5pWw6YWN572uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnKGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL3N5c3RlbS9jb25maWcvJHtpZHN9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScKKyAgfSk7Cit9CisKKy8vIOWvvOWHuuWPguaVsOmFjee9rgorZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENvbmZpZyhwYXJhbXM/OiBBUEkuU3lzdGVtLkNvbmZpZ0xpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIGRvd25Mb2FkWGxzeChgL2FwaS9zeXN0ZW0vY29uZmlnL2V4cG9ydGAsIHsgcGFyYW1zIH0sIGBjb25maWdfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQorCisKKy8vIOWIt+aWsOWPguaVsOe8k+WtmAorZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hDb25maWdDYWNoZSgpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL2NvbmZpZy9yZWZyZXNoQ2FjaGUnLCB7CisgICAgbWV0aG9kOiAnZGVsZXRlJworICB9KQorfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9kZXB0LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9kZXB0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTg4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL2RlcHQudHMKQEAgLTAsMCArMSw1NiBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6Lpg6jpl6jliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZXB0TGlzdChwYXJhbXM/OiBBUEkuU3lzdGVtLkRlcHRMaXN0UGFyYW1zKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uRGVwdFBhZ2VSZXN1bHQ+KCcvYXBpL3N5c3RlbS9kZXB0L2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOafpeivoumDqOmXqOWIl+ihqO+8iOaOkumZpOiKgueCue+8iQorZXhwb3J0IGZ1bmN0aW9uIGdldERlcHRMaXN0RXhjbHVkZUNoaWxkKGRlcHRJZDogbnVtYmVyKSB7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL3N5c3RlbS9kZXB0L2xpc3QvZXhjbHVkZS8ke2RlcHRJZH1gLCB7CisgICAgbWV0aG9kOiAnZ2V0JywKKyAgfSk7Cit9CisKKy8vIOafpeivoumDqOmXqOivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldERlcHQoZGVwdElkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlN5c3RlbS5EZXB0SW5mb1Jlc3VsdD4oYC9hcGkvc3lzdGVtL2RlcHQvJHtkZXB0SWR9YCwgeworICAgIG1ldGhvZDogJ0dFVCcKKyAgfSk7Cit9CisKKy8vIOaWsOWinumDqOmXqAorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZERlcHQocGFyYW1zOiBBUEkuU3lzdGVtLkRlcHQpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL2RlcHQnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDkv67mlLnpg6jpl6gKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZXB0KHBhcmFtczogQVBJLlN5c3RlbS5EZXB0KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS9kZXB0JywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDliKDpmaTpg6jpl6gKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVEZXB0KGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL3N5c3RlbS9kZXB0LyR7aWRzfWAsIHsKKyAgICBtZXRob2Q6ICdERUxFVEUnCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9kaWN0LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9kaWN0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzExMjQKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL2RpY3QudHMKQEAgLTAsMCArMSwxMjAgQEAKK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IERpY3RWYWx1ZUVudW1PYmogfSBmcm9tICdAL2NvbXBvbmVudHMvRGljdFRhZyc7CitpbXBvcnQgeyBIdHRwUmVzdWx0IH0gZnJvbSAnQC9lbnVtcy9odHRwRW51bSc7CitpbXBvcnQgeyBkb3duTG9hZFhsc3ggfSBmcm9tICdAL3V0aWxzL2Rvd25sb2FkZmlsZSc7CisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMS8wOS8xNgorICoKKyAqICovCisKKy8vIOafpeivouWtl+WFuOexu+Wei+WIl+ihqAorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERpY3RUeXBlTGlzdChwYXJhbXM/OiBBUEkuRGljdFR5cGVMaXN0UGFyYW1zKSB7CisgIHJldHVybiByZXF1ZXN0KGAvYXBpL3N5c3RlbS9kaWN0L3R5cGUvbGlzdGAsIHsKKyAgICBwYXJhbXM6IHsKKyAgICAgIC4uLnBhcmFtcywKKyAgICB9LAorICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgIH0pOworfQorCisvLyDmn6Xor6LlrZflhbjnsbvlnovor6bnu4YKK2V4cG9ydCBmdW5jdGlvbiBnZXREaWN0VHlwZShkaWN0SWQ6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdChgL2FwaS9zeXN0ZW0vZGljdC90eXBlLyR7ZGljdElkfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICB9KTsKK30KKworLy8g5p+l6K+i5a2X5YW45pWw5o2u6K+m57uGCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGljdFZhbHVlRW51bShkaWN0VHlwZTogc3RyaW5nLCBpc0RpZ2l0YWw/OiBib29sZWFuKTogUHJvbWlzZTxEaWN0VmFsdWVFbnVtT2JqPiB7CisgIGNvbnN0IHJlc3AgPSBhd2FpdCByZXF1ZXN0PEFQSS5TeXN0ZW0uRGljdFR5cGVSZXN1bHQ+KGAvYXBpL3N5c3RlbS9kaWN0L2RhdGEvdHlwZS8ke2RpY3RUeXBlfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICB9KTsKKyAgaWYocmVzcC5jb2RlID09PSBIdHRwUmVzdWx0LlNVQ0NFU1MpIHsKKyAgICBjb25zdCBvcHRzOiBEaWN0VmFsdWVFbnVtT2JqID0ge307CisgICAgcmVzcC5kYXRhLmZvckVhY2goKGl0ZW06IGFueSkgPT4geworICAgICAgb3B0c1tpdGVtLmRpY3RWYWx1ZV0gPSB7CisgICAgICAgIHRleHQ6IGl0ZW0uZGljdExhYmVsLAorICAgICAgICBsYWJlbDogaXRlbS5kaWN0TGFiZWwsCisgICAgICAgIHZhbHVlOiBpc0RpZ2l0YWwgPyBOdW1iZXIoaXRlbS5kaWN0VmFsdWUpIDogaXRlbS5kaWN0VmFsdWUsCisgICAgICAgIGtleTogaXRlbS5kaWN0Q29kZSwKKyAgICAgICAgbGlzdENsYXNzOiBpdGVtLmxpc3RDbGFzcywKKyAgICAgICAgc3RhdHVzOiBpdGVtLmxpc3RDbGFzcyB9OworICAgIH0pOworICAgIHJldHVybiBvcHRzOworICB9IGVsc2UgeworICAgIHJldHVybiB7fTsKKyAgfQorfQorCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGljdFNlbGVjdE9wdGlvbihkaWN0VHlwZTogc3RyaW5nLCBpc0RpZ2l0YWw/OiBib29sZWFuKSB7CisgIGNvbnN0IHJlc3AgPSBhd2FpdCByZXF1ZXN0PEFQSS5TeXN0ZW0uRGljdFR5cGVSZXN1bHQ+KGAvYXBpL3N5c3RlbS9kaWN0L2RhdGEvdHlwZS8ke2RpY3RUeXBlfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICB9KTsKKyAgaWYgKHJlc3AuY29kZSA9PT0gMjAwKSB7CisgICAgY29uc3Qgb3B0aW9uczogRGljdFZhbHVlRW51bU9ialtdID0gcmVzcC5kYXRhLm1hcCgoaXRlbSkgPT4geworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdGV4dDogaXRlbS5kaWN0TGFiZWwsCisgICAgICAgIGxhYmVsOiBpdGVtLmRpY3RMYWJlbCwKKyAgICAgICAgdmFsdWU6IGlzRGlnaXRhbCA/IE51bWJlcihpdGVtLmRpY3RWYWx1ZSkgOiBpdGVtLmRpY3RWYWx1ZSwKKyAgICAgICAga2V5OiBpdGVtLmRpY3RDb2RlLAorICAgICAgICBsaXN0Q2xhc3M6IGl0ZW0ubGlzdENsYXNzLAorICAgICAgICBzdGF0dXM6IGl0ZW0ubGlzdENsYXNzCisgICAgICB9OworICAgIH0pOworICAgIHJldHVybiBvcHRpb25zOworICB9CisgIHJldHVybiBbXTsKK307CisKKy8vIOaWsOWinuWtl+WFuOexu+WeiworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZERpY3RUeXBlKHBhcmFtczogQVBJLlN5c3RlbS5EaWN0VHlwZSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vZGljdC90eXBlJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5L+u5pS55a2X5YW457G75Z6LCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGljdFR5cGUocGFyYW1zOiBBUEkuU3lzdGVtLkRpY3RUeXBlKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS9kaWN0L3R5cGUnLCB7CisgICAgbWV0aG9kOiAnUFVUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOWIoOmZpOWtl+WFuOexu+WeiworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZURpY3RUeXBlKGlkczogc3RyaW5nKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL3N5c3RlbS9kaWN0L3R5cGUvJHtpZHN9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScKKyAgfSk7Cit9CisKKy8vIOWvvOWHuuWtl+WFuOexu+WeiworZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydERpY3RUeXBlKHBhcmFtcz86IEFQSS5TeXN0ZW0uRGljdFR5cGVMaXN0UGFyYW1zKSB7CisgIHJldHVybiBkb3duTG9hZFhsc3goYC9hcGkvc3lzdGVtL2RpY3QvdHlwZS9leHBvcnRgLCB7IHBhcmFtcyB9LCBgZGljdF90eXBlXyR7bmV3IERhdGUoKS5nZXRUaW1lKCl9Lnhsc3hgKTsKK30KKworLy8g6I635Y+W5a2X5YW46YCJ5oup5qGG5YiX6KGoCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGljdFR5cGVPcHRpb25TZWxlY3QocGFyYW1zPzogQVBJLkRpY3RUeXBlTGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdCgnL2FwaS9zeXN0ZW0vZGljdC90eXBlL29wdGlvbnNlbGVjdCcsIHsKKyAgICBwYXJhbXM6IHsKKyAgICAgIC4uLnBhcmFtcywKKyAgICB9LAorICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9kaWN0ZGF0YS50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vZGljdGRhdGEudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4NTZlOAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vZGljdGRhdGEudHMKQEAgLTAsMCArMSw2NSBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6LlrZflhbjmlbDmja7liJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREaWN0RGF0YUxpc3QoCisgIHBhcmFtcz86IEFQSS5TeXN0ZW0uRGljdERhdGFMaXN0UGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLkRpY3REYXRhUGFnZVJlc3VsdD4oJy9hcGkvc3lzdGVtL2RpY3QvZGF0YS9saXN0JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgcGFyYW1zLAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8vIOafpeivouWtl+WFuOaVsOaNruivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldERpY3REYXRhKGRpY3RDb2RlOiBudW1iZXIsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uRGljdERhdGFJbmZvUmVzdWx0PihgL2FwaS9zeXN0ZW0vZGljdC9kYXRhLyR7ZGljdENvZGV9YCwgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLy8g5paw5aKe5a2X5YW45pWw5o2uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkRGljdERhdGEocGFyYW1zOiBBUEkuU3lzdGVtLkRpY3REYXRhLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vZGljdC9kYXRhJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSksCisgIH0pOworfQorCisvLyDkv67mlLnlrZflhbjmlbDmja4KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEaWN0RGF0YShwYXJhbXM6IEFQSS5TeXN0ZW0uRGljdERhdGEsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS9kaWN0L2RhdGEnLCB7CisgICAgbWV0aG9kOiAnUFVUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLy8g5Yig6Zmk5a2X5YW45pWw5o2uCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGljdERhdGEoaWRzOiBzdHJpbmcsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KGAvYXBpL3N5c3RlbS9kaWN0L2RhdGEvJHtpZHN9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScsCisgICAgLi4uKG9wdGlvbnMgfHwge30pLAorICB9KTsKK30KKworLy8g5a+85Ye65a2X5YW45pWw5o2uCitleHBvcnQgZnVuY3Rpb24gZXhwb3J0RGljdERhdGEoCisgIHBhcmFtcz86IEFQSS5TeXN0ZW0uRGljdERhdGFMaXN0UGFyYW1zLAorICBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwKKykgeworICByZXR1cm4gZG93bkxvYWRYbHN4KGAvYXBpL3N5c3RlbS9kaWN0L2RhdGEvZXhwb3J0YCwgeyBwYXJhbXMgfSwgYGRpY3RfZGF0YV8ke25ldyBEYXRlKCkuZ2V0VGltZSgpfS54bHN4YCk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL2luZGV4LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9pbmRleC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNlNjJkCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9pbmRleC50cwpAQCAtMCwwICsxLDE0IEBACisvKiBlc2xpbnQtZGlzYWJsZSAqLworLy8g6K+l5paH5Lu255SxIE9uZUFQSSDoh6rliqjnlJ/miJDvvIzor7fli7/miYvliqjkv67mlLnvvIEKKworaW1wb3J0ICogYXMgQXV0aCBmcm9tICcuL2F1dGgnOworaW1wb3J0ICogYXMgVXNlciBmcm9tICcuL1VzZXInOworaW1wb3J0ICogYXMgRGljdCBmcm9tICcuL2RpY3QnOworaW1wb3J0ICogYXMgTWVudSBmcm9tICcuL21lbnUnOworCitleHBvcnQgZGVmYXVsdCB7CisgIEF1dGgsCisgIFVzZXIsCisgIERpY3QsCisgIE1lbnUsCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9tZW51LnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9tZW51LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjQxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL21lbnUudHMKQEAgLTAsMCArMSw2MSBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6Loj5zljZXmnYPpmZDliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZW51TGlzdChwYXJhbXM/OiBBUEkuU3lzdGVtLk1lbnVMaXN0UGFyYW1zLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLk1lbnVQYWdlUmVzdWx0PignL2FwaS9zeXN0ZW0vbWVudS9saXN0JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgcGFyYW1zLAorICAgIC4uLihvcHRpb25zIHx8IHt9KSwKKyAgfSk7Cit9CisKKy8vIOafpeivouiPnOWNleadg+mZkOivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldE1lbnUobWVudUlkOiBudW1iZXIsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uTWVudUluZm9SZXN1bHQ+KGAvYXBpL3N5c3RlbS9tZW51LyR7bWVudUlkfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIC4uLihvcHRpb25zIHx8IHt9KQorICB9KTsKK30KKworLy8g5paw5aKe6I+c5Y2V5p2D6ZmQCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTWVudShwYXJhbXM6IEFQSS5TeXN0ZW0uTWVudSwgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL21lbnUnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zLAorICAgIC4uLihvcHRpb25zIHx8IHt9KQorICB9KTsKK30KKworLy8g5L+u5pS56I+c5Y2V5p2D6ZmQCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWVudShwYXJhbXM6IEFQSS5TeXN0ZW0uTWVudSwgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL21lbnUnLCB7CisgICAgbWV0aG9kOiAnUFVUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMsCisgICAgLi4uKG9wdGlvbnMgfHwge30pCisgIH0pOworfQorCisvLyDliKDpmaToj5zljZXmnYPpmZAKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVNZW51KGlkczogc3RyaW5nLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PihgL2FwaS9zeXN0ZW0vbWVudS8ke2lkc31gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSkKKyAgfSk7Cit9CisKKy8vIOafpeivouiPnOWNleadg+mZkOivpue7hgorZXhwb3J0IGZ1bmN0aW9uIGdldE1lbnVUcmVlKCkgeworICByZXR1cm4gcmVxdWVzdCgnL2FwaS9zeXN0ZW0vbWVudS90cmVlc2VsZWN0JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9ub3RpY2UudHMgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL25vdGljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg2YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9ub3RpY2UudHMKQEAgLTAsMCArMSw0OSBAQAoraW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJ0B1bWlqcy9tYXgnOworaW1wb3J0IHsgZG93bkxvYWRYbHN4IH0gZnJvbSAnQC91dGlscy9kb3dubG9hZGZpbGUnOworCisvLyDmn6Xor6LpgJrnn6XlhazlkYrliJfooagKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROb3RpY2VMaXN0KHBhcmFtcz86IEFQSS5TeXN0ZW0uTm90aWNlTGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLk5vdGljZVBhZ2VSZXN1bHQ+KCcvYXBpL3N5c3RlbS9ub3RpY2UvbGlzdCcsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIHBhcmFtcworICB9KTsKK30KKworLy8g5p+l6K+i6YCa55+l5YWs5ZGK6K+m57uGCitleHBvcnQgZnVuY3Rpb24gZ2V0Tm90aWNlKG5vdGljZUlkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlN5c3RlbS5Ob3RpY2VJbmZvUmVzdWx0PihgL2FwaS9zeXN0ZW0vbm90aWNlLyR7bm90aWNlSWR9YCwgeworICAgIG1ldGhvZDogJ0dFVCcKKyAgfSk7Cit9CisKKy8vIOaWsOWinumAmuefpeWFrOWRigorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZE5vdGljZShwYXJhbXM6IEFQSS5TeXN0ZW0uTm90aWNlKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS9ub3RpY2UnLCB7CisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDkv67mlLnpgJrnn6XlhazlkYoKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVOb3RpY2UocGFyYW1zOiBBUEkuU3lzdGVtLk5vdGljZSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vbm90aWNlJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zCisgIH0pOworfQorCisvLyDliKDpmaTpgJrnn6XlhazlkYoKK2V4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVOb3RpY2UoaWRzOiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oYC9hcGkvc3lzdGVtL25vdGljZS8ke2lkc31gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJworICB9KTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vcG9zdC50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vcG9zdC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTcwYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9wb3N0LnRzCkBAIC0wLDAgKzEsNTQgQEAKK2ltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdAdW1panMvbWF4JzsKK2ltcG9ydCB7IGRvd25Mb2FkWGxzeCB9IGZyb20gJ0AvdXRpbHMvZG93bmxvYWRmaWxlJzsKKworLy8g5p+l6K+i5bKX5L2N5L+h5oGv5YiX6KGoCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UG9zdExpc3QocGFyYW1zPzogQVBJLlN5c3RlbS5Qb3N0TGlzdFBhcmFtcykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLlBvc3RQYWdlUmVzdWx0PignL2FwaS9zeXN0ZW0vcG9zdC9saXN0JywgeworICAgIG1ldGhvZDogJ0dFVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgcGFyYW1zCisgIH0pOworfQorCisvLyDmn6Xor6LlspfkvY3kv6Hmga/or6bnu4YKK2V4cG9ydCBmdW5jdGlvbiBnZXRQb3N0KHBvc3RJZDogbnVtYmVyKSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uUG9zdEluZm9SZXN1bHQ+KGAvYXBpL3N5c3RlbS9wb3N0LyR7cG9zdElkfWAsIHsKKyAgICBtZXRob2Q6ICdHRVQnCisgIH0pOworfQorCisvLyDmlrDlop7lspfkvY3kv6Hmga8KK2V4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQb3N0KHBhcmFtczogQVBJLlN5c3RlbS5Qb3N0KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS9wb3N0JywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5L+u5pS55bKX5L2N5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUG9zdChwYXJhbXM6IEFQSS5TeXN0ZW0uUG9zdCkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcG9zdCcsIHsKKyAgICBtZXRob2Q6ICdQVVQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcworICB9KTsKK30KKworLy8g5Yig6Zmk5bKX5L2N5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9zdChpZHM6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PihgL2FwaS9zeXN0ZW0vcG9zdC8ke2lkc31gLCB7CisgICAgbWV0aG9kOiAnREVMRVRFJworICB9KTsKK30KKworLy8g5a+85Ye65bKX5L2N5L+h5oGvCitleHBvcnQgZnVuY3Rpb24gZXhwb3J0UG9zdChwYXJhbXM/OiBBUEkuU3lzdGVtLlBvc3RMaXN0UGFyYW1zKSB7CisgIHJldHVybiBkb3duTG9hZFhsc3goYC9hcGkvc3lzdGVtL3Bvc3QvZXhwb3J0YCwgeyBwYXJhbXMgfSwgYHBvc3RfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9yb2xlLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS9yb2xlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzYyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvc2VydmljZXMvc3lzdGVtL3JvbGUudHMKQEAgLTAsMCArMSwxMjggQEAKK2ltcG9ydCB7IENvbnRlbnRUeXBlIH0gZnJvbSAnQC9lbnVtcy9odHRwRW51bSc7CitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBkb3duTG9hZFhsc3ggfSBmcm9tICdAL3V0aWxzL2Rvd25sb2FkZmlsZSc7CisKKy8vIOafpeivouinkuiJsuS/oeaBr+WIl+ihqAorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvbGVMaXN0KHBhcmFtcz86IEFQSS5TeXN0ZW0uUm9sZUxpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlN5c3RlbS5Sb2xlUGFnZVJlc3VsdD4oJy9hcGkvc3lzdGVtL3JvbGUvbGlzdCcsIHsKKyAgICBtZXRob2Q6ICdHRVQnLAorICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IENvbnRlbnRUeXBlLkZPUk1fVVJMRU5DT0RFRCB9LAorICAgIHBhcmFtcworICB9KTsKK30KKworLy8g5p+l6K+i6KeS6Imy5L+h5oGv6K+m57uGCitleHBvcnQgZnVuY3Rpb24gZ2V0Um9sZShyb2xlSWQ6IG51bWJlcikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLlJvbGVJbmZvUmVzdWx0PihgL2FwaS9zeXN0ZW0vcm9sZS8ke3JvbGVJZH1gLCB7CisgICAgbWV0aG9kOiAnR0VUJworICB9KTsKK30KKworLy8g5paw5aKe6KeS6Imy5L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkUm9sZShwYXJhbXM6IEFQSS5TeXN0ZW0uUm9sZSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcm9sZScsIHsKKyAgICBtZXRob2Q6ICdQT1NUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOS/ruaUueinkuiJsuS/oeaBrworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJvbGUocGFyYW1zOiBBUEkuU3lzdGVtLlJvbGUpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL3JvbGUnLCB7CisgICAgbWV0aG9kOiAnUFVUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBkYXRhOiBwYXJhbXMKKyAgfSk7Cit9CisKKy8vIOWIoOmZpOinkuiJsuS/oeaBrworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVJvbGUoaWRzOiBzdHJpbmcpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oYC9hcGkvc3lzdGVtL3JvbGUvJHtpZHN9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScKKyAgfSk7Cit9CisKKy8vIOWvvOWHuuinkuiJsuS/oeaBrworZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFJvbGUocGFyYW1zPzogQVBJLlN5c3RlbS5Sb2xlTGlzdFBhcmFtcykgeworICByZXR1cm4gZG93bkxvYWRYbHN4KGAvYXBpL3N5c3RlbS9yb2xlL2V4cG9ydGAsIHsgcGFyYW1zIH0sIGByb2xlXyR7bmV3IERhdGUoKS5nZXRUaW1lKCl9Lnhsc3hgKTsKK30KKworLy8g6I635Y+W6KeS6Imy6I+c5Y2V5YiX6KGoCitleHBvcnQgZnVuY3Rpb24gZ2V0Um9sZU1lbnVMaXN0KGlkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlN5c3RlbS5Sb2xlTWVudVJlc3VsdD4oYC9hcGkvc3lzdGVtL21lbnUvcm9sZU1lbnVUcmVlc2VsZWN0LyR7aWR9YCwgeworICAgIG1ldGhvZDogJ2dldCcsCisgIH0pOworfQorCisvLyDop5LoibLmlbDmja7mnYPpmZAKK2V4cG9ydCBmdW5jdGlvbiB1cGRhdGVSb2xlRGF0YVNjb3BlKGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9hcGkvc3lzdGVtL3JvbGUvZGF0YVNjb3BlJywgeworICAgIG1ldGhvZDogJ3B1dCcsCisgICAgZGF0YQorICB9KQorfQorCisvLyDop5LoibLnirbmgIHkv67mlLkKK2V4cG9ydCBmdW5jdGlvbiBjaGFuZ2VSb2xlU3RhdHVzKHJvbGVJZDogbnVtYmVyLCBzdGF0dXM6IHN0cmluZykgeworICBjb25zdCBkYXRhID0geworICAgIHJvbGVJZCwKKyAgICBzdGF0dXMKKyAgfQorICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcm9sZS9jaGFuZ2VTdGF0dXMnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBkYXRhOiBkYXRhCisgIH0pCit9CisKKy8vIOafpeivouinkuiJsuW3suaOiOadg+eUqOaIt+WIl+ihqAorZXhwb3J0IGZ1bmN0aW9uIGFsbG9jYXRlZFVzZXJMaXN0KHBhcmFtcz86IEFQSS5TeXN0ZW0uUm9sZUxpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9hcGkvc3lzdGVtL3JvbGUvYXV0aFVzZXIvYWxsb2NhdGVkTGlzdCcsIHsKKyAgICBtZXRob2Q6ICdnZXQnLAorICAgIHBhcmFtcworICB9KQorfQorCisvLyDmn6Xor6Lop5LoibLmnKrmjojmnYPnlKjmiLfliJfooagKK2V4cG9ydCBmdW5jdGlvbiB1bmFsbG9jYXRlZFVzZXJMaXN0KHBhcmFtcz86IEFQSS5TeXN0ZW0uUm9sZUxpc3RQYXJhbXMpIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9hcGkvc3lzdGVtL3JvbGUvYXV0aFVzZXIvdW5hbGxvY2F0ZWRMaXN0JywgeworICAgIG1ldGhvZDogJ2dldCcsCisgICAgcGFyYW1zCisgIH0pCit9CisKKy8vIOWPlua2iOeUqOaIt+aOiOadg+inkuiJsgorZXhwb3J0IGZ1bmN0aW9uIGF1dGhVc2VyQ2FuY2VsKGRhdGE6IGFueSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcm9sZS9hdXRoVXNlci9jYW5jZWwnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBkYXRhOiBkYXRhCisgIH0pCit9CisKKy8vIOaJuemHj+WPlua2iOeUqOaIt+aOiOadg+inkuiJsgorZXhwb3J0IGZ1bmN0aW9uIGF1dGhVc2VyQ2FuY2VsQWxsKGRhdGE6IGFueSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcm9sZS9hdXRoVXNlci9jYW5jZWxBbGwnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBwYXJhbXM6IGRhdGEKKyAgfSkKK30KKworLy8g5o6I5p2D55So5oi36YCJ5oupCitleHBvcnQgZnVuY3Rpb24gYXV0aFVzZXJTZWxlY3RBbGwoZGF0YTogUmVjb3JkPHN0cmluZywgYW55PikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vcm9sZS9hdXRoVXNlci9zZWxlY3RBbGwnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBwYXJhbXM6IGRhdGEsCisgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogQ29udGVudFR5cGUuRk9STV9VUkxFTkNPREVEIH0sCisgIH0pCit9CisKKy8vIOagueaNruinkuiJsklE5p+l6K+i6YOo6Zeo5qCR57uT5p6ECitleHBvcnQgZnVuY3Rpb24gZ2V0RGVwdFRyZWVTZWxlY3Qocm9sZUlkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9hcGkvc3lzdGVtL3JvbGUvZGVwdFRyZWUvJyArIHJvbGVJZCwgeworICAgIG1ldGhvZDogJ2dldCcKKyAgfSkKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vdXNlci50cyBiL3JlYWN0LXVpL3NyYy9zZXJ2aWNlcy9zeXN0ZW0vdXNlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk5N2JmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3N5c3RlbS91c2VyLnRzCkBAIC0wLDAgKzEsMTUyIEBACitpbXBvcnQgeyBmb3JtYXRUcmVlRGF0YSB9IGZyb20gJ0AvdXRpbHMvdHJlZSc7CitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CitpbXBvcnQgeyBEYXRhTm9kZSB9IGZyb20gJ2FudGQvZXMvdHJlZSc7CitpbXBvcnQgeyBkb3duTG9hZFhsc3ggfSBmcm9tICdAL3V0aWxzL2Rvd25sb2FkZmlsZSc7CisKKy8vIOafpeivoueUqOaIt+S/oeaBr+WIl+ihqAorZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVzZXJMaXN0KHBhcmFtcz86IEFQSS5TeXN0ZW0uVXNlckxpc3RQYXJhbXMsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5TeXN0ZW0uVXNlclBhZ2VSZXN1bHQ+KCcvYXBpL3N5c3RlbS91c2VyL2xpc3QnLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICBoZWFkZXJzOiB7CisgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsCisgICAgfSwKKyAgICBwYXJhbXMsCisgICAgLi4uKG9wdGlvbnMgfHwge30pCisgIH0pOworfQorCisvLyDmn6Xor6LnlKjmiLfkv6Hmga/or6bnu4YKK2V4cG9ydCBmdW5jdGlvbiBnZXRVc2VyKHVzZXJJZDogbnVtYmVyLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgeworICByZXR1cm4gcmVxdWVzdDxBUEkuU3lzdGVtLlVzZXJJbmZvUmVzdWx0PihgL2FwaS9zeXN0ZW0vdXNlci8ke3VzZXJJZH1gLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSkKKyAgfSk7Cit9CisKKy8vIOaWsOWinueUqOaIt+S/oeaBrworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFVzZXIocGFyYW1zOiBBUEkuU3lzdGVtLlVzZXIsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS91c2VyJywgeworICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JywKKyAgICB9LAorICAgIGRhdGE6IHBhcmFtcywKKyAgICAuLi4ob3B0aW9ucyB8fCB7fSkKKyAgfSk7Cit9CisKKy8vIOS/ruaUueeUqOaIt+S/oeaBrworZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVVzZXIocGFyYW1zOiBBUEkuU3lzdGVtLlVzZXIsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiByZXF1ZXN0PEFQSS5SZXN1bHQ+KCcvYXBpL3N5c3RlbS91c2VyJywgeworICAgIG1ldGhvZDogJ1BVVCcsCisgICAgaGVhZGVyczogeworICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLAorICAgIH0sCisgICAgZGF0YTogcGFyYW1zLAorICAgIC4uLihvcHRpb25zIHx8IHt9KQorICB9KTsKK30KKworLy8g5Yig6Zmk55So5oi35L+h5oGvCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVXNlcihpZHM6IHN0cmluZywgb3B0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHsKKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oYC9hcGkvc3lzdGVtL3VzZXIvJHtpZHN9YCwgeworICAgIG1ldGhvZDogJ0RFTEVURScsCisgICAgLi4uKG9wdGlvbnMgfHwge30pCisgIH0pOworfQorCisvLyDlr7zlh7rnlKjmiLfkv6Hmga8KK2V4cG9ydCBmdW5jdGlvbiBleHBvcnRVc2VyKHBhcmFtcz86IEFQSS5TeXN0ZW0uVXNlckxpc3RQYXJhbXMsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7CisgIHJldHVybiBkb3duTG9hZFhsc3goYC9hcGkvc3lzdGVtL3VzZXIvZXhwb3J0YCwgeyBwYXJhbXMgfSwgYHVzZXJfJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0ueGxzeGApOworfQorCisvLyDnlKjmiLfnirbmgIHkv67mlLkKK2V4cG9ydCBmdW5jdGlvbiBjaGFuZ2VVc2VyU3RhdHVzKHVzZXJJZDogbnVtYmVyLCBzdGF0dXM6IHN0cmluZykgeworICBjb25zdCBkYXRhID0geworICAgIHVzZXJJZCwKKyAgICBzdGF0dXMKKyAgfQorICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vdXNlci9jaGFuZ2VTdGF0dXMnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBkYXRhOiBkYXRhCisgIH0pCit9CisKKy8vIOafpeivoueUqOaIt+S4quS6uuS/oeaBrworZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJQcm9maWxlKCkgeworICByZXR1cm4gcmVxdWVzdCgnL2FwaS9zeXN0ZW0vdXNlci9wcm9maWxlJywgeworICAgIG1ldGhvZDogJ2dldCcKKyAgfSkKK30KKworZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJQcm9maWxlKGRhdGE6IEFQSS5DdXJyZW50VXNlcikgeworICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vdXNlci9wcm9maWxlJywgeworICAgIG1ldGhvZDogJ3B1dCcsCisgICAgZGF0YTogZGF0YQorICB9KQorfQorCisvLyDnlKjmiLflr4bnoIHph43nva4KK2V4cG9ydCBmdW5jdGlvbiByZXNldFVzZXJQd2QodXNlcklkOiBudW1iZXIsIHBhc3N3b3JkOiBzdHJpbmcpIHsKKyAgY29uc3QgZGF0YSA9IHsKKyAgICB1c2VySWQsCisgICAgcGFzc3dvcmQKKyAgfQorICByZXR1cm4gcmVxdWVzdDxBUEkuUmVzdWx0PignL2FwaS9zeXN0ZW0vdXNlci9yZXNldFB3ZCcsIHsKKyAgICBtZXRob2Q6ICdwdXQnLAorICAgIGRhdGE6IGRhdGEKKyAgfSkKK30KKworLy8g55So5oi3dOS4quS6uuWvhueggemHjee9rgorZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJQd2Qob2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZykgeworICBjb25zdCBkYXRhID0geworICAgIG9sZFBhc3N3b3JkLAorICAgIG5ld1Bhc3N3b3JkCisgIH0KKyAgcmV0dXJuIHJlcXVlc3Q8QVBJLlJlc3VsdD4oJy9hcGkvc3lzdGVtL3VzZXIvcHJvZmlsZS91cGRhdGVQd2QnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBwYXJhbXM6IGRhdGEKKyAgfSkKK30KKworLy8g55So5oi35aS05YOP5LiK5LygCitleHBvcnQgZnVuY3Rpb24gdXBsb2FkQXZhdGFyKGRhdGE6IGFueSkgeworICByZXR1cm4gcmVxdWVzdCgnL2FwaS9zeXN0ZW0vdXNlci9wcm9maWxlL2F2YXRhcicsIHsKKyAgICBtZXRob2Q6ICdwb3N0JywKKyAgICBkYXRhOiBkYXRhCisgIH0pCit9CisKKworLy8g5p+l6K+i5o6I5p2D6KeS6ImyCitleHBvcnQgZnVuY3Rpb24gZ2V0QXV0aFJvbGUodXNlcklkOiBudW1iZXIpIHsKKyAgcmV0dXJuIHJlcXVlc3QoJy9zeXN0ZW0vdXNlci9hdXRoUm9sZS8nICsgdXNlcklkLCB7CisgICAgbWV0aG9kOiAnZ2V0JworICB9KQorfQorCisvLyDkv53lrZjmjojmnYPop5LoibIKK2V4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdXRoUm9sZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7CisgIHJldHVybiByZXF1ZXN0KCcvc3lzdGVtL3VzZXIvYXV0aFJvbGUnLCB7CisgICAgbWV0aG9kOiAncHV0JywKKyAgICBwYXJhbXM6IGRhdGEKKyAgfSkKK30KKworLy8g6I635Y+W5pWw5o2u5YiX6KGoCitleHBvcnQgZnVuY3Rpb24gZ2V0RGVwdFRyZWUocGFyYW1zOiBhbnkpOiBQcm9taXNlPERhdGFOb2RlW10+IHsKKyAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CisgICAgcmVxdWVzdChgL2FwaS9zeXN0ZW0vdXNlci9kZXB0VHJlZWAsIHsKKyAgICAgIG1ldGhvZDogJ2dldCcsCisgICAgICBwYXJhbXMsCisgICAgfSkudGhlbigocmVzOiBhbnkpID0+IHsKKyAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkgeworICAgICAgICBjb25zdCB0cmVlRGF0YSA9IGZvcm1hdFRyZWVEYXRhKHJlcy5kYXRhKTsKKyAgICAgICAgcmVzb2x2ZSh0cmVlRGF0YSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXNvbHZlKFtdKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvc2VydmljZXMvdHlwaW5ncy5kLnRzIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3R5cGluZ3MuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBiOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3NlcnZpY2VzL3R5cGluZ3MuZC50cwpAQCAtMCwwICsxLDE5MSBAQAorLyogZXNsaW50LWRpc2FibGUgKi8KKy8vIOivpeaWh+S7tueUsSBPbmVBUEkg6Ieq5Yqo55Sf5oiQ77yM6K+35Yu/5omL5Yqo5L+u5pS577yBCisKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSSB7CisgIGludGVyZmFjZSBQYWdlSW5mbyB7CisgICAgY3VycmVudD86IG51bWJlcjsKKyAgICBwYWdlU2l6ZT86IG51bWJlcjsKKyAgICB0b3RhbD86IG51bWJlcjsKKyAgICBsaXN0PzogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj47CisgIH0KKworICBpbnRlcmZhY2UgUGFnZUluZm9fVXNlckluZm9fIHsKKyAgICBjdXJyZW50PzogbnVtYmVyOworICAgIHBhZ2VTaXplPzogbnVtYmVyOworICAgIHRvdGFsPzogbnVtYmVyOworICAgIGxpc3Q/OiBBcnJheTxVc2VySW5mbz47CisgIH0KKworICBpbnRlcmZhY2UgUmVzdWx0IHsKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47CisgIH0KKworICBpbnRlcmZhY2UgUmVzdWx0X1BhZ2VJbmZvX1VzZXJJbmZvX18geworICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICBkYXRhPzogUGFnZUluZm9fVXNlckluZm9fOworICB9CisgIGludGVyZmFjZSBVc2VySW5mb1Jlc3VsdCB7CisgICAgY29kZT86IG51bWJlcjsKKyAgICBtc2c/OiBzdHJpbmc7CisgICAgdXNlcjogVXNlckluZm87CisgICAgcGVybWlzc2lvbnM6IGFueTsKKyAgICByb2xlczogYW55OworICB9CisKKyAgaW50ZXJmYWNlIFJlc3VsdF9zdHJpbmdfIHsKKyAgICBzdWNjZXNzPzogYm9vbGVhbjsKKyAgICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7CisgICAgZGF0YT86IHN0cmluZzsKKyAgfQorCisgIHR5cGUgVXNlckdlbmRlckVudW0gPSAnTUFMRScgfCAnRkVNQUxFJzsKKworICBpbnRlcmZhY2UgVXNlckluZm8geworICAgIHVzZXJJZD86IHN0cmluZzsKKyAgICB1c2VyTmFtZT86IHN0cmluZzsKKyAgICBuaWNrTmFtZT86IHN0cmluZzsKKyAgICBhdmF0YXI/OiBzdHJpbmc7CisgICAgc2V4Pzogc3RyaW5nOworICAgIGVtYWlsPzogc3RyaW5nOworICAgIGdlbmRlcj86IFVzZXJHZW5kZXJFbnVtOworICAgIHVucmVhZENvdW50OiBudW1iZXI7CisgICAgYWRkcmVzcz86IHN0cmluZzsKKyAgICBwaG9uZW51bWJlcj86IHN0cmluZzsKKyAgICBkZXB0PzogRGVwdDsKKyAgICByb2xlcz86IFJvbGVbXTsKKyAgICBwZXJtaXNzaW9uczogc3RyaW5nW107CisgIH0KKworICBpbnRlcmZhY2UgVXNlckluZm9WTyB7CisgICAgbmFtZT86IHN0cmluZzsKKyAgICAvKiogbmljayAqLworICAgIG5pY2tOYW1lPzogc3RyaW5nOworICAgIC8qKiBlbWFpbCAqLworICAgIGVtYWlsPzogc3RyaW5nOworICB9CisKKyAgdHlwZSBkZWZpbml0aW9uc18wID0gbnVsbDsKKworICB0eXBlIE1lbnVJdGVtTWV0YSA9IHsKKyAgICB0aXRsZTogc3RyaW5nOworICAgIGljb246IHN0cmluZzsKKyAgICBub0NhY2hlOiBib29sZWFuOworICAgIGxpbms6IHN0cmluZzsKKyAgfTsKKworICB0eXBlIFJvdXRlcnNNZW51SXRlbSA9IHsKKyAgICBhbHdheXNTaG93PzogYm9vbGVhbjsKKyAgICBjaGlsZHJlbj86IFJvdXRlcnNNZW51SXRlbVtdOworICAgIGNvbXBvbmVudD86IHN0cmluZzsKKyAgICBoaWRkZW4/OiBib29sZWFuOworICAgIG1ldGE6IE1lbnVJdGVtTWV0YTsKKyAgICBuYW1lOiBzdHJpbmc7CisgICAgcGF0aDogc3RyaW5nOworICAgIHJlZGlyZWN0Pzogc3RyaW5nOworICAgIFtrZXk6IHN0cmluZ106IGFueTsKKyAgfTsKKyAgaW50ZXJmYWNlIEdldFJvdXRlcnNSZXN1bHQgeworICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICBkYXRhOiBSb3V0ZXJzTWVudUl0ZW1bXTsKKyAgfQorCisgIHR5cGUgTm90aWNlSWNvbkxpc3QgPSB7CisgICAgZGF0YT86IE5vdGljZUljb25JdGVtW107CisgICAgLyoqIOWIl+ihqOeahOWGheWuueaAu+aVsCAqLworICAgIHRvdGFsPzogbnVtYmVyOworICAgIHN1Y2Nlc3M/OiBib29sZWFuOworICB9OworCisgIHR5cGUgTm90aWNlSWNvbkl0ZW1UeXBlID0gJ25vdGlmaWNhdGlvbicgfCAnbWVzc2FnZScgfCAnZXZlbnQnOworCisgIHR5cGUgTm90aWNlSWNvbkl0ZW0gPSB7CisgICAgaWQ/OiBzdHJpbmc7CisgICAgZXh0cmE/OiBzdHJpbmc7CisgICAga2V5Pzogc3RyaW5nOworICAgIHJlYWQ/OiBib29sZWFuOworICAgIGF2YXRhcj86IHN0cmluZzsKKyAgICB0aXRsZT86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgZGF0ZXRpbWU/OiBzdHJpbmc7CisgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7CisgICAgdHlwZT86IE5vdGljZUljb25JdGVtVHlwZTsKKyAgfTsKKworICBleHBvcnQgdHlwZSBNZW51VHlwZSA9IHsKKyAgICBtZW51SWQ6IG51bWJlcjsKKyAgICBtZW51TmFtZTogc3RyaW5nOworICAgIHBhcmVudElkOiBzdHJpbmc7CisgICAgb3JkZXJOdW06IG51bWJlcjsKKyAgICBwYXRoOiBzdHJpbmc7CisgICAgY29tcG9uZW50OiBzdHJpbmc7CisgICAgaXNGcmFtZTogbnVtYmVyOworICAgIGlzQ2FjaGU6IG51bWJlcjsKKyAgICBtZW51VHlwZTogc3RyaW5nOworICAgIHZpc2libGU6IHN0cmluZzsKKyAgICBzdGF0dXM6IHN0cmluZzsKKyAgICBwZXJtczogc3RyaW5nOworICAgIGljb246IHN0cmluZzsKKyAgICBjcmVhdGVCeTogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU6IERhdGU7CisgICAgdXBkYXRlQnk6IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lOiBEYXRlOworICAgIHJlbWFyazogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIE1lbnVMaXN0UGFyYW1zID0geworICAgIG1lbnVJZD86IHN0cmluZzsKKyAgICBtZW51TmFtZT86IHN0cmluZzsKKyAgICBwYXJlbnRJZD86IHN0cmluZzsKKyAgICBvcmRlck51bT86IHN0cmluZzsKKyAgICBwYXRoPzogc3RyaW5nOworICAgIGNvbXBvbmVudD86IHN0cmluZzsKKyAgICBpc0ZyYW1lPzogc3RyaW5nOworICAgIGlzQ2FjaGU/OiBzdHJpbmc7CisgICAgbWVudVR5cGU/OiBzdHJpbmc7CisgICAgdmlzaWJsZT86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgcGVybXM/OiBzdHJpbmc7CisgICAgaWNvbj86IHN0cmluZzsKKyAgICBjcmVhdGVCeT86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU/OiBzdHJpbmc7CisgICAgcmVtYXJrPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnRQYWdlPzogc3RyaW5nOworICAgIGZpbHRlcj86IHN0cmluZzsKKyAgICBzb3J0ZXI/OiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgRGljdFR5cGVUeXBlID0geworICAgIGRpY3RJZDogbnVtYmVyOworICAgIGRpY3ROYW1lOiBzdHJpbmc7CisgICAgZGljdFR5cGU6IHN0cmluZzsKKyAgICBzdGF0dXM6IHN0cmluZzsKKyAgICBjcmVhdGVCeTogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU6IERhdGU7CisgICAgdXBkYXRlQnk6IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lOiBEYXRlOworICAgIHJlbWFyazogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIERpY3RUeXBlTGlzdFBhcmFtcyA9IHsKKyAgICBkaWN0SWQ/OiBzdHJpbmc7CisgICAgZGljdE5hbWU/OiBzdHJpbmc7CisgICAgZGljdFR5cGU/OiBzdHJpbmc7CisgICAgc3RhdHVzPzogc3RyaW5nOworICAgIGNyZWF0ZUJ5Pzogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU/OiBzdHJpbmc7CisgICAgdXBkYXRlQnk/OiBzdHJpbmc7CisgICAgdXBkYXRlVGltZT86IHN0cmluZzsKKyAgICByZW1hcms/OiBzdHJpbmc7CisgICAgcGFnZVNpemU/OiBzdHJpbmc7CisgICAgY3VycmVudFBhZ2U/OiBzdHJpbmc7CisgICAgZmlsdGVyPzogc3RyaW5nOworICAgIHNvcnRlcj86IHN0cmluZzsKKyAgfTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL2NhY2hlLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9jYWNoZS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmFiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9jYWNoZS5kLnRzCkBAIC0wLDAgKzEsMTUzIEBACisKKy8qICoKKyAqCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyQDE2My5jb20KKyAqIEBkYXRldGltZSAgMjAyMS8wOS8xNgorICogCisgKiAqLworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLk1vbml0b3IgeworCisgIGV4cG9ydCB0eXBlIENvbW1hbmRJbmZvID0geworICAgIG5hbWU6IHN0cmluZzsKKyAgICB2YWx1ZTogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIENhY2hlUnVudGltZUluZm8gPSB7CisgICAgYWN0aXZlX2RlZnJhZ19oaXRzOiBzdHJpbmc7CisgICAgYWN0aXZlX2RlZnJhZ19rZXlfaGl0czogc3RyaW5nOworICAgIGFjdGl2ZV9kZWZyYWdfa2V5X21pc3Nlczogc3RyaW5nOworICAgIGFjdGl2ZV9kZWZyYWdfbWlzc2VzOiBzdHJpbmc7CisgICAgYWN0aXZlX2RlZnJhZ19ydW5uaW5nOiBzdHJpbmc7CisgICAgYWxsb2NhdG9yX2FjdGl2ZTogc3RyaW5nOworICAgIGFsbG9jYXRvcl9hbGxvY2F0ZWQ6IHN0cmluZzsKKyAgICBhbGxvY2F0b3JfZnJhZ19ieXRlczogc3RyaW5nOworICAgIGFsbG9jYXRvcl9mcmFnX3JhdGlvOiBzdHJpbmc7CisgICAgYWxsb2NhdG9yX3Jlc2lkZW50OiBzdHJpbmc7CisgICAgYWxsb2NhdG9yX3Jzc19ieXRlczogc3RyaW5nOworICAgIGFsbG9jYXRvcl9yc3NfcmF0aW86IHN0cmluZzsKKyAgICBhb2ZfY3VycmVudF9yZXdyaXRlX3RpbWVfc2VjOiBzdHJpbmc7CisgICAgYW9mX2VuYWJsZWQ6IHN0cmluZzsKKyAgICBhb2ZfbGFzdF9iZ3Jld3JpdGVfc3RhdHVzOiBzdHJpbmc7CisgICAgYW9mX2xhc3RfY293X3NpemU6IHN0cmluZzsKKyAgICBhb2ZfbGFzdF9yZXdyaXRlX3RpbWVfc2VjOiBzdHJpbmc7CisgICAgYW9mX2xhc3Rfd3JpdGVfc3RhdHVzOiBzdHJpbmc7CisgICAgYW9mX3Jld3JpdGVfaW5fcHJvZ3Jlc3M6IHN0cmluZzsKKyAgICBhb2ZfcmV3cml0ZV9zY2hlZHVsZWQ6IHN0cmluZzsKKyAgICBhcmNoX2JpdHM6IHN0cmluZzsKKyAgICBhdG9taWN2YXJfYXBpOiBzdHJpbmc7CisgICAgYmxvY2tlZF9jbGllbnRzOiBzdHJpbmc7CisgICAgY2xpZW50X3JlY2VudF9tYXhfaW5wdXRfYnVmZmVyOiBzdHJpbmc7CisgICAgY2xpZW50X3JlY2VudF9tYXhfb3V0cHV0X2J1ZmZlcjogc3RyaW5nOworICAgIGNsdXN0ZXJfZW5hYmxlZDogc3RyaW5nOworICAgIGNvbmZpZ19maWxlOiBzdHJpbmc7CisgICAgY29uZmlndXJlZF9oejogc3RyaW5nOworICAgIGNvbm5lY3RlZF9jbGllbnRzOiBzdHJpbmc7CisgICAgY29ubmVjdGVkX3NsYXZlczogc3RyaW5nOworICAgIGRiMDogc3RyaW5nOworICAgIGRiMTogc3RyaW5nOworICAgIGV2aWN0ZWRfa2V5czogc3RyaW5nOworICAgIGV4ZWN1dGFibGU6IHN0cmluZzsKKyAgICBleHBpcmVkX2tleXM6IHN0cmluZzsKKyAgICBleHBpcmVkX3N0YWxlX3BlcmM6IHN0cmluZzsKKyAgICBleHBpcmVkX3RpbWVfY2FwX3JlYWNoZWRfY291bnQ6IHN0cmluZzsKKyAgICBnY2NfdmVyc2lvbjogc3RyaW5nOworICAgIGh6OiBzdHJpbmc7CisgICAgaW5zdGFudGFuZW91c19pbnB1dF9rYnBzOiBudW1iZXI7CisgICAgaW5zdGFudGFuZW91c19vcHNfcGVyX3NlYzogc3RyaW5nOworICAgIGluc3RhbnRhbmVvdXNfb3V0cHV0X2ticHM6IG51bWJlcjsKKyAgICBrZXlzcGFjZV9oaXRzOiBzdHJpbmc7CisgICAga2V5c3BhY2VfbWlzc2VzOiBzdHJpbmc7CisgICAgbGF0ZXN0X2ZvcmtfdXNlYzogc3RyaW5nOworICAgIGxhenlmcmVlX3BlbmRpbmdfb2JqZWN0czogc3RyaW5nOworICAgIGxvYWRpbmc6IHN0cmluZzsKKyAgICBscnVfY2xvY2s6IHN0cmluZzsKKyAgICBtYXN0ZXJfcmVwbF9vZmZzZXQ6IHN0cmluZzsKKyAgICBtYXN0ZXJfcmVwbGlkOiBzdHJpbmc7CisgICAgbWFzdGVyX3JlcGxpZDI6IHN0cmluZzsKKyAgICBtYXhtZW1vcnk6IHN0cmluZzsKKyAgICBtYXhtZW1vcnlfaHVtYW46IHN0cmluZzsKKyAgICBtYXhtZW1vcnlfcG9saWN5OiBzdHJpbmc7CisgICAgbWVtX2FsbG9jYXRvcjogc3RyaW5nOworICAgIG1lbV9hb2ZfYnVmZmVyOiBzdHJpbmc7CisgICAgbWVtX2NsaWVudHNfbm9ybWFsOiBzdHJpbmc7CisgICAgbWVtX2NsaWVudHNfc2xhdmVzOiBzdHJpbmc7CisgICAgbWVtX2ZyYWdtZW50YXRpb25fYnl0ZXM6IHN0cmluZzsKKyAgICBtZW1fZnJhZ21lbnRhdGlvbl9yYXRpbzogc3RyaW5nOworICAgIG1lbV9ub3RfY291bnRlZF9mb3JfZXZpY3Q6IHN0cmluZzsKKyAgICBtZW1fcmVwbGljYXRpb25fYmFja2xvZzogc3RyaW5nOworICAgIG1pZ3JhdGVfY2FjaGVkX3NvY2tldHM6IHN0cmluZzsKKyAgICBtdWx0aXBsZXhpbmdfYXBpOiBzdHJpbmc7CisgICAgbnVtYmVyX29mX2NhY2hlZF9zY3JpcHRzOiBzdHJpbmc7CisgICAgb3M6IHN0cmluZzsKKyAgICBwcm9jZXNzX2lkOiBzdHJpbmc7CisgICAgcHVic3ViX2NoYW5uZWxzOiBzdHJpbmc7CisgICAgcHVic3ViX3BhdHRlcm5zOiBzdHJpbmc7CisgICAgcmRiX2Jnc2F2ZV9pbl9wcm9ncmVzczogc3RyaW5nOworICAgIHJkYl9jaGFuZ2VzX3NpbmNlX2xhc3Rfc2F2ZTogc3RyaW5nOworICAgIHJkYl9jdXJyZW50X2Jnc2F2ZV90aW1lX3NlYzogc3RyaW5nOworICAgIHJkYl9sYXN0X2Jnc2F2ZV9zdGF0dXM6IHN0cmluZzsKKyAgICByZGJfbGFzdF9iZ3NhdmVfdGltZV9zZWM6IHN0cmluZzsKKyAgICByZGJfbGFzdF9jb3dfc2l6ZTogc3RyaW5nOworICAgIHJkYl9sYXN0X3NhdmVfdGltZTogc3RyaW5nOworICAgIHJlZGlzX2J1aWxkX2lkOiBzdHJpbmc7CisgICAgcmVkaXNfZ2l0X2RpcnR5OiBzdHJpbmc7CisgICAgcmVkaXNfZ2l0X3NoYTE6IHN0cmluZzsKKyAgICByZWRpc19tb2RlOiBzdHJpbmc7CisgICAgcmVkaXNfdmVyc2lvbjogc3RyaW5nOworICAgIHJlamVjdGVkX2Nvbm5lY3Rpb25zOiBzdHJpbmc7CisgICAgcmVwbF9iYWNrbG9nX2FjdGl2ZTogc3RyaW5nOworICAgIHJlcGxfYmFja2xvZ19maXJzdF9ieXRlX29mZnNldDogc3RyaW5nOworICAgIHJlcGxfYmFja2xvZ19oaXN0bGVuOiBzdHJpbmc7CisgICAgcmVwbF9iYWNrbG9nX3NpemU6IHN0cmluZzsKKyAgICByb2xlOiBzdHJpbmc7CisgICAgcnNzX292ZXJoZWFkX2J5dGVzOiBzdHJpbmc7CisgICAgcnNzX292ZXJoZWFkX3JhdGlvOiBzdHJpbmc7CisgICAgcnVuX2lkOiBzdHJpbmc7CisgICAgc2Vjb25kX3JlcGxfb2Zmc2V0OiBzdHJpbmc7CisgICAgc2xhdmVfZXhwaXJlc190cmFja2VkX2tleXM6IHN0cmluZzsKKyAgICBzeW5jX2Z1bGw6IHN0cmluZzsKKyAgICBzeW5jX3BhcnRpYWxfZXJyOiBzdHJpbmc7CisgICAgc3luY19wYXJ0aWFsX29rOiBzdHJpbmc7CisgICAgdGNwX3BvcnQ6IHN0cmluZzsKKyAgICB0b3RhbF9jb21tYW5kc19wcm9jZXNzZWQ6IHN0cmluZzsKKyAgICB0b3RhbF9jb25uZWN0aW9uc19yZWNlaXZlZDogc3RyaW5nOworICAgIHRvdGFsX25ldF9pbnB1dF9ieXRlczogc3RyaW5nOworICAgIHRvdGFsX25ldF9vdXRwdXRfYnl0ZXM6IHN0cmluZzsKKyAgICB0b3RhbF9zeXN0ZW1fbWVtb3J5OiBudW1iZXI7CisgICAgdG90YWxfc3lzdGVtX21lbW9yeV9odW1hbjogc3RyaW5nOworICAgIHVwdGltZV9pbl9kYXlzOiBzdHJpbmc7CisgICAgdXB0aW1lX2luX3NlY29uZHM6IHN0cmluZzsKKyAgICB1c2VkX2NwdV9zeXM6IHN0cmluZzsKKyAgICB1c2VkX2NwdV9zeXNfY2hpbGRyZW46IHN0cmluZzsKKyAgICB1c2VkX2NwdV91c2VyOiBzdHJpbmc7CisgICAgdXNlZF9jcHVfdXNlcl9jaGlsZHJlbjogbnVtYmVyOworICAgIHVzZWRfbWVtb3J5OiBudW1iZXI7CisgICAgdXNlZF9tZW1vcnlfZGF0YXNldDogbnVtYmVyOworICAgIHVzZWRfbWVtb3J5X2RhdGFzZXRfcGVyYzogc3RyaW5nOworICAgIHVzZWRfbWVtb3J5X2h1bWFuOiBzdHJpbmc7CisgICAgdXNlZF9tZW1vcnlfbHVhOiBzdHJpbmc7CisgICAgdXNlZF9tZW1vcnlfbHVhX2h1bWFuOiBzdHJpbmc7CisgICAgdXNlZF9tZW1vcnlfb3ZlcmhlYWQ6IHN0cmluZzsKKyAgICB1c2VkX21lbW9yeV9wZWFrOiBzdHJpbmc7CisgICAgdXNlZF9tZW1vcnlfcGVha19odW1hbjogc3RyaW5nOworICAgIHVzZWRfbWVtb3J5X3BlYWtfcGVyYzogc3RyaW5nOworICAgIHVzZWRfbWVtb3J5X3Jzczogc3RyaW5nOworICAgIHVzZWRfbWVtb3J5X3Jzc19odW1hbjogc3RyaW5nOworICAgIHVzZWRfbWVtb3J5X3NjcmlwdHM6IHN0cmluZzsKKyAgICB1c2VkX21lbW9yeV9zY3JpcHRzX2h1bWFuOiBzdHJpbmc7CisgICAgdXNlZF9tZW1vcnlfc3RhcnR1cDogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIENhY2hlSW5mbyA9IHsKKyAgICBjb21tYW5kU3RhdHM6IENvbW1hbmRJbmZvW107CisgICAgZGJTaXplOiBudW1iZXI7CisgICAgaW5mbzogQ2FjaGVSdW50aW1lSW5mbzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBDYWNoZUluZm9SZXN1bHQgPSB7CisgICAgZGF0YTogQ2FjaGVJbmZvOworICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgfTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL2NhY2hlTGlzdC5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3IvY2FjaGVMaXN0LmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkZThjZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL2NhY2hlTGlzdC5kLnRzCkBAIC0wLDAgKzEsMzYgQEAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIyLzA2LzI3CisgKiAKKyAqICovCisKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSS5Nb25pdG9yIHsKKworICBleHBvcnQgdHlwZSBDYWNoZUNvbnRlbnQgPSB7CisgICAgY2FjaGVLZXk6IHN0cmluZzsKKyAgICBjYWNoZU5hbWU6IHN0cmluZzsKKyAgICBjYWNoZVZhbHVlOiBzdHJpbmc7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgQ2FjaGVOYW1lc1Jlc3BvbnNlID0geworICAgIGRhdGE6IENhY2hlQ29udGVudFtdOworICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBDYWNoZUtleXNSZXNwb25zZSA9IHsKKyAgICBkYXRhOiBzdHJpbmdbXTsKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgQ2FjaGVWYWx1ZVJlc3BvbnNlID0geworICAgIGRhdGE6IENhY2hlQ29udGVudDsKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgIH07CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9qb2IuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL2pvYi5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9qb2IuZC50cwpAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIOWumuaXtuS7u+WKoeiwg+W6piBNb2RlbCBEZWNsYXJlCisgKiAKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGUgMjAyMy0wMi0wNworICovCisKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSS5Nb25pdG9yIHsKKworICBleHBvcnQgaW50ZXJmYWNlIEpvYiB7CisgICAgam9iSWQ6IG51bWJlcjsKKyAgICBqb2JOYW1lOiBzdHJpbmc7CisgICAgam9iR3JvdXA6IHN0cmluZzsKKyAgICBpbnZva2VUYXJnZXQ6IHN0cmluZzsKKyAgICBjcm9uRXhwcmVzc2lvbjogc3RyaW5nOworICAgIG1pc2ZpcmVQb2xpY3k6IHN0cmluZzsKKyAgICBjb25jdXJyZW50OiBzdHJpbmc7CisgICAgbmV4dFZhbGlkVGltZTogc3RyaW5nOworICAgIHN0YXR1czogc3RyaW5nOworICAgIGNyZWF0ZUJ5OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgICB1cGRhdGVCeTogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU6IERhdGU7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIEpvYkxpc3RQYXJhbXMgeworICAgIGpvYklkPzogc3RyaW5nOworICAgIGpvYk5hbWU/OiBzdHJpbmc7CisgICAgam9iR3JvdXA/OiBzdHJpbmc7CisgICAgaW52b2tlVGFyZ2V0Pzogc3RyaW5nOworICAgIGNyb25FeHByZXNzaW9uPzogc3RyaW5nOworICAgIG1pc2ZpcmVQb2xpY3k/OiBzdHJpbmc7CisgICAgY29uY3VycmVudD86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHJlbWFyaz86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50Pzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBKb2JJbmZvUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IEpvYjsKKyAgfSAKKworICAgZXhwb3J0IGludGVyZmFjZSBKb2JQYWdlUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8Sm9iPjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivam9iTG9nLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9qb2JMb2cuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJjYjlmCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivam9iTG9nLmQudHMKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiDlrprml7bku7vliqHosIPluqbml6Xlv5cgTW9kZWwgRGVjbGFyZQorICogCisgKiBAYXV0aG9yIHdoaXRlc2hhZGVyCisgKiBAZGF0ZSAyMDIzLTAyLTA3CisgKi8KKworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLk1vbml0b3IgeworCisgIGV4cG9ydCBpbnRlcmZhY2UgSm9iTG9nIHsKKyAgICBqb2JMb2dJZDogbnVtYmVyOworICAgIGpvYk5hbWU6IHN0cmluZzsKKyAgICBqb2JHcm91cDogc3RyaW5nOworICAgIGludm9rZVRhcmdldDogc3RyaW5nOworICAgIGpvYk1lc3NhZ2U6IHN0cmluZzsKKyAgICBzdGF0dXM6IHN0cmluZzsKKyAgICBleGNlcHRpb25JbmZvOiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgfQorCisgIGV4cG9ydCBpbnRlcmZhY2UgSm9iTG9nTGlzdFBhcmFtcyB7CisgICAgam9iTG9nSWQ/OiBzdHJpbmc7CisgICAgam9iTmFtZT86IHN0cmluZzsKKyAgICBqb2JHcm91cD86IHN0cmluZzsKKyAgICBpbnZva2VUYXJnZXQ/OiBzdHJpbmc7CisgICAgam9iTWVzc2FnZT86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgZXhjZXB0aW9uSW5mbz86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnQ/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIEpvYkxvZ0luZm9SZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgZGF0YTogSm9iTG9nOworICB9IAorCisgICBleHBvcnQgaW50ZXJmYWNlIEpvYkxvZ1BhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICByb3dzOiBBcnJheTxKb2JMb2c+OworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9sb2dpbmluZm9yLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9sb2dpbmluZm9yLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5MjA4YQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL2xvZ2luaW5mb3IuZC50cwpAQCAtMCwwICsxLDQzIEBACisKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSS5Nb25pdG9yIHsKKworICBleHBvcnQgaW50ZXJmYWNlIExvZ2luaW5mb3IgeworICAgIGluZm9JZDogbnVtYmVyOworICAgIHVzZXJOYW1lOiBzdHJpbmc7CisgICAgaXBhZGRyOiBzdHJpbmc7CisgICAgbG9naW5Mb2NhdGlvbjogc3RyaW5nOworICAgIGJyb3dzZXI6IHN0cmluZzsKKyAgICBvczogc3RyaW5nOworICAgIHN0YXR1czogc3RyaW5nOworICAgIG1zZzogc3RyaW5nOworICAgIGxvZ2luVGltZTogRGF0ZTsKKyAgfQorCisgIGV4cG9ydCBpbnRlcmZhY2UgTG9naW5pbmZvckxpc3RQYXJhbXMgeworICAgIGluZm9JZD86IHN0cmluZzsKKyAgICB1c2VyTmFtZT86IHN0cmluZzsKKyAgICBpcGFkZHI/OiBzdHJpbmc7CisgICAgbG9naW5Mb2NhdGlvbj86IHN0cmluZzsKKyAgICBicm93c2VyPzogc3RyaW5nOworICAgIG9zPzogc3RyaW5nOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgICBtc2c/OiBzdHJpbmc7CisgICAgbG9naW5UaW1lPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnQ/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIExvZ2luaW5mb3JJbmZvUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IExvZ2luaW5mb3I7CisgIH0gCisKKyAgIGV4cG9ydCBpbnRlcmZhY2UgTG9naW5pbmZvclBhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICByb3dzOiBBcnJheTxMb2dpbmluZm9yPjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivb25saW5lLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9vbmxpbmUuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhlMGRkCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivb25saW5lLmQudHMKQEAgLTAsMCArMSw1NSBAQAorCisvKiAqCisgKgorICogQGF1dGhvciB3aGl0ZXNoYWRlckAxNjMuY29tCisgKiBAZGF0ZXRpbWUgIDIwMjMvMDIvMDcKKyAqIAorICogKi8KK2RlY2xhcmUgbmFtZXNwYWNlIEFQSS5Nb25pdG9yIHsKKworICBleHBvcnQgdHlwZSBPbmxpbmVVc2VyVHlwZSA9IHsKKyAgICB0b2tlbklkOiBzdHJpbmc7CisgICAgdXNlck5hbWU6IHN0cmluZzsKKyAgICBpcGFkZHI6IHN0cmluZzsKKyAgICBsb2dpbkxvY2F0aW9uOiBzdHJpbmc7CisgICAgYnJvd3Nlcjogc3RyaW5nOworICAgIG9zOiBzdHJpbmc7CisgICAgZGVwdE5hbWU6IHN0cmluZzsKKyAgICBsb2dpblRpbWU6IHN0cmluZzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBPbmxpbmVVc2VyTGlzdFBhZ2luYXRpb24gPSB7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICBwYWdlU2l6ZTogbnVtYmVyOworICAgIGN1cnJlbnQ6IG51bWJlcjsKKyAgfTsKKworICBleHBvcnQgdHlwZSBPbmxpbmVVc2VyTGlzdERhdGEgPSB7CisgICAgbGlzdDogT25saW5lVXNlclR5cGVbXTsKKyAgICBwYWdpbmF0aW9uOiBQYXJ0aWFsPE9ubGluZVVzZXJMaXN0UGFnaW5hdGlvbj47CisgIH07CisKKyAgZXhwb3J0IHR5cGUgT25saW5lVXNlckxpc3RQYXJhbXMgPSB7CisgICAgdG9rZW5JZD86IHN0cmluZzsKKyAgICB1c2VyTmFtZT86IHN0cmluZzsKKyAgICBpcGFkZHI/OiBzdHJpbmc7CisgICAgbG9naW5Mb2NhdGlvbj86IHN0cmluZzsKKyAgICBicm93c2VyPzogc3RyaW5nOworICAgIG9zPzogc3RyaW5nOworICAgIGRlcHROYW1lPzogc3RyaW5nOworICAgIGxvZ2luVGltZT86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50Pzogc3RyaW5nOworICAgIHBhZ2VOdW0/OiBzdHJpbmc7CisgICAgZmlsdGVyPzogc3RyaW5nOworICAgIHNvcnRlcj86IHN0cmluZzsKKyAgfTsgIAorCisgIGV4cG9ydCBpbnRlcmZhY2UgT25saW5lVXNlclBhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICByb3dzOiBBcnJheTxPbmxpbmVVc2VyPjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivb3BlcmxvZy5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivb3BlcmxvZy5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWUyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvbW9uaXRvci9vcGVybG9nLmQudHMKQEAgLTAsMCArMSw1NyBAQAorCitkZWNsYXJlIG5hbWVzcGFjZSBBUEkuTW9uaXRvciB7CisKKyAgZXhwb3J0IGludGVyZmFjZSBPcGVybG9nIHsKKyAgICBvcGVySWQ6IG51bWJlcjsKKyAgICB0aXRsZTogc3RyaW5nOworICAgIGJ1c2luZXNzVHlwZTogbnVtYmVyOworICAgIG1ldGhvZDogc3RyaW5nOworICAgIHJlcXVlc3RNZXRob2Q6IHN0cmluZzsKKyAgICBvcGVyYXRvclR5cGU6IG51bWJlcjsKKyAgICBvcGVyTmFtZTogc3RyaW5nOworICAgIGRlcHROYW1lOiBzdHJpbmc7CisgICAgb3BlclVybDogc3RyaW5nOworICAgIG9wZXJJcDogc3RyaW5nOworICAgIG9wZXJMb2NhdGlvbjogc3RyaW5nOworICAgIG9wZXJQYXJhbTogc3RyaW5nOworICAgIGpzb25SZXN1bHQ6IHN0cmluZzsKKyAgICBzdGF0dXM6IG51bWJlcjsKKyAgICBlcnJvck1zZzogc3RyaW5nOworICAgIG9wZXJUaW1lOiBEYXRlOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBPcGVybG9nTGlzdFBhcmFtcyB7CisgICAgb3BlcklkPzogc3RyaW5nOworICAgIHRpdGxlPzogc3RyaW5nOworICAgIGJ1c2luZXNzVHlwZT86IHN0cmluZzsKKyAgICBtZXRob2Q/OiBzdHJpbmc7CisgICAgcmVxdWVzdE1ldGhvZD86IHN0cmluZzsKKyAgICBvcGVyYXRvclR5cGU/OiBzdHJpbmc7CisgICAgb3Blck5hbWU/OiBzdHJpbmc7CisgICAgZGVwdE5hbWU/OiBzdHJpbmc7CisgICAgb3BlclVybD86IHN0cmluZzsKKyAgICBvcGVySXA/OiBzdHJpbmc7CisgICAgb3BlckxvY2F0aW9uPzogc3RyaW5nOworICAgIG9wZXJQYXJhbT86IHN0cmluZzsKKyAgICBqc29uUmVzdWx0Pzogc3RyaW5nOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgICBlcnJvck1zZz86IHN0cmluZzsKKyAgICBvcGVyVGltZT86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50Pzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBPcGVybG9nSW5mb1Jlc3VsdCB7IAorICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICBkYXRhOiBPcGVybG9nOworICB9IAorCisgICBleHBvcnQgaW50ZXJmYWNlIE9wZXJsb2dQYWdlUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8T3BlcmxvZz47CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL3NlcnZlci5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL21vbml0b3Ivc2VydmVyLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMmQxNgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9tb25pdG9yL3NlcnZlci5kLnRzCkBAIC0wLDAgKzEsODQgQEAKKworLyogKgorICoKKyAqIEBhdXRob3Igd2hpdGVzaGFkZXJAMTYzLmNvbQorICogQGRhdGV0aW1lICAyMDIzLzAyLzA3CisgKiAKKyAqICovCisKKworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLk1vbml0b3IgeworCisgIGV4cG9ydCB0eXBlIENwdUluZm9UeXBlID0geworICAgIGNwdU51bTogc3RyaW5nOworICAgIHRvdGFsOiBzdHJpbmc7CisgICAgc3lzOiBzdHJpbmc7CisgICAgdXNlZDogc3RyaW5nOworICAgIHdhaXQ6IHN0cmluZzsKKyAgICBmcmVlOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgTWVtSW5mb1R5cGUgPSB7CisgICAgdG90YWw6IHN0cmluZzsKKyAgICB1c2VkOiBzdHJpbmc7CisgICAgdXNhZ2U6IHN0cmluZzsKKyAgICBmcmVlOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgU3lzSW5mb1R5cGUgPSB7CisgICAgY29tcHV0ZXJJcDogc3RyaW5nOworICAgIGNvbXB1dGVyTmFtZTogc3RyaW5nOworICAgIG9zQXJjaDogc3RyaW5nOworICAgIG9zTmFtZTogc3RyaW5nOworICAgIHVzZXJEaXI6IHN0cmluZzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBKdm1JbmZvVHlwZSA9IHsKKyAgICBmcmVlOiBzdHJpbmc7CisgICAgaG9tZTogc3RyaW5nOworICAgIG1heDogc3RyaW5nOworICAgIG5hbWU6IHN0cmluZzsKKyAgICBydW5UaW1lOiBzdHJpbmc7CisgICAgc3RhcnRUaW1lOiBzdHJpbmc7CisgICAgdG90YWw6IHN0cmluZzsKKyAgICB1c2FnZTogc3RyaW5nOworICAgIHVzZWQ6IHN0cmluZzsKKyAgICB2ZXJzaW9uOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgRGlza0luZm9UeXBlID0geworICAgIGRpck5hbWU6IHN0cmluZzsKKyAgICBmcmVlOiBzdHJpbmc7CisgICAgc3lzVHlwZU5hbWU6IHN0cmluZzsKKyAgICB0b3RhbDogc3RyaW5nOworICAgIHR5cGVOYW1lOiBzdHJpbmc7CisgICAgdXNhZ2U6IHN0cmluZzsKKyAgICB1c2VkOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgU2VydmVySW5mb1R5cGUgPSB7CisgICAgY3B1OiBDcHVJbmZvVHlwZTsKKyAgICBtZW06IE1lbUluZm9UeXBlOworICAgIGp2bTogSnZtSW5mb1R5cGU7CisgICAgc3lzOiBTeXNJbmZvVHlwZTsKKyAgICBzeXNGaWxlczogRGlza0luZm9UeXBlW107CisgIH07CisKKyAgZXhwb3J0IHR5cGUgU2VydmVySW5mb1Jlc3BvbnNlVHlwZSA9IHsKKyAgICBkYXRhOiBTZXJ2ZXJJbmZvVHlwZTsKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgQ3B1Um93VHlwZSA9IHsKKyAgICBuYW1lOiBzdHJpbmc7CisgICAgdmFsdWU6IHN0cmluZzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBNZW1Sb3dUeXBlID0geworICAgIG5hbWU6IHN0cmluZzsKKyAgICBtZW06IHN0cmluZzsKKyAgICBqdm06IHN0cmluZzsKKyAgfTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vY29uZmlnLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL2NvbmZpZy5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2U0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL2NvbmZpZy5kLnRzCkBAIC0wLDAgKzEsNDUgQEAKKworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLlN5c3RlbSB7CisKKyAgZXhwb3J0IGludGVyZmFjZSBDb25maWcgeworICAgIGNvbmZpZ0lkOiBudW1iZXI7CisgICAgY29uZmlnTmFtZTogc3RyaW5nOworICAgIGNvbmZpZ0tleTogc3RyaW5nOworICAgIGNvbmZpZ1ZhbHVlOiBzdHJpbmc7CisgICAgY29uZmlnVHlwZTogc3RyaW5nOworICAgIGNyZWF0ZUJ5OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgICB1cGRhdGVCeTogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU6IERhdGU7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIENvbmZpZ0xpc3RQYXJhbXMgeworICAgIGNvbmZpZ0lkPzogc3RyaW5nOworICAgIGNvbmZpZ05hbWU/OiBzdHJpbmc7CisgICAgY29uZmlnS2V5Pzogc3RyaW5nOworICAgIGNvbmZpZ1ZhbHVlPzogc3RyaW5nOworICAgIGNvbmZpZ1R5cGU/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHJlbWFyaz86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50Pzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBDb25maWdJbmZvUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IENvbmZpZzsKKyAgfSAKKworICAgZXhwb3J0IGludGVyZmFjZSBDb25maWdQYWdlUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8Q29uZmlnPjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9kZXB0LmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL2RlcHQuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFkMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9kZXB0LmQudHMKQEAgLTAsMCArMSw1MyBAQAorCitkZWNsYXJlIG5hbWVzcGFjZSBBUEkuU3lzdGVtIHsKKworICBpbnRlcmZhY2UgRGVwdCB7CisgICAgZGVwdElkOiBudW1iZXI7CisgICAgcGFyZW50SWQ6IG51bWJlcjsKKyAgICBhbmNlc3RvcnM6IHN0cmluZzsKKyAgICBkZXB0TmFtZTogc3RyaW5nOworICAgIG9yZGVyTnVtOiBudW1iZXI7CisgICAgbGVhZGVyOiBzdHJpbmc7CisgICAgcGhvbmU6IHN0cmluZzsKKyAgICBlbWFpbDogc3RyaW5nOworICAgIHN0YXR1czogc3RyaW5nOworICAgIGRlbEZsYWc6IHN0cmluZzsKKyAgICBjcmVhdGVCeTogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU6IERhdGU7CisgICAgdXBkYXRlQnk6IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lOiBEYXRlOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBEZXB0TGlzdFBhcmFtcyB7CisgICAgZGVwdElkPzogc3RyaW5nOworICAgIHBhcmVudElkPzogc3RyaW5nOworICAgIGFuY2VzdG9ycz86IHN0cmluZzsKKyAgICBkZXB0TmFtZT86IHN0cmluZzsKKyAgICBvcmRlck51bT86IHN0cmluZzsKKyAgICBsZWFkZXI/OiBzdHJpbmc7CisgICAgcGhvbmU/OiBzdHJpbmc7CisgICAgZW1haWw/OiBzdHJpbmc7CisgICAgc3RhdHVzPzogc3RyaW5nOworICAgIGRlbEZsYWc/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnQ/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERlcHRJbmZvUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IERlcHQ7CisgIH0gCisKKyAgIGV4cG9ydCBpbnRlcmZhY2UgRGVwdFBhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICBkYXRhOiBBcnJheTxEZXB0PjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9kaWN0LWRhdGEuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vZGljdC1kYXRhLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNzNmNQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vZGljdC1kYXRhLmQudHMKQEAgLTAsMCArMSw1MyBAQAorZGVjbGFyZSBuYW1lc3BhY2UgQVBJLlN5c3RlbSB7CisgIGludGVyZmFjZSBEaWN0RGF0YSB7CisgICAgZGljdENvZGU6IG51bWJlcjsKKyAgICBkaWN0U29ydDogbnVtYmVyOworICAgIGRpY3RMYWJlbDogc3RyaW5nOworICAgIGRpY3RWYWx1ZTogc3RyaW5nOworICAgIGRpY3RUeXBlOiBzdHJpbmc7CisgICAgY3NzQ2xhc3M6IHN0cmluZzsKKyAgICBsaXN0Q2xhc3M6IHN0cmluZzsKKyAgICBpc0RlZmF1bHQ6IHN0cmluZzsKKyAgICBzdGF0dXM6IHN0cmluZzsKKyAgICBjcmVhdGVCeTogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU6IERhdGU7CisgICAgdXBkYXRlQnk6IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lOiBEYXRlOworICAgIHJlbWFyazogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBEaWN0RGF0YUxpc3RQYXJhbXMgeworICAgIGRpY3RDb2RlPzogc3RyaW5nOworICAgIGRpY3RTb3J0Pzogc3RyaW5nOworICAgIGRpY3RMYWJlbD86IHN0cmluZzsKKyAgICBkaWN0VmFsdWU/OiBzdHJpbmc7CisgICAgZGljdFR5cGU/OiBzdHJpbmc7CisgICAgY3NzQ2xhc3M/OiBzdHJpbmc7CisgICAgbGlzdENsYXNzPzogc3RyaW5nOworICAgIGlzRGVmYXVsdD86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHJlbWFyaz86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50UGFnZT86IHN0cmluZzsKKyAgICBmaWx0ZXI/OiBzdHJpbmc7CisgICAgc29ydGVyPzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBEaWN0RGF0YUluZm9SZXN1bHQgeworICAgIGN1cnJlbnQ6IG51bWJlcjsKKyAgICBwYWdlU2l6ZTogbnVtYmVyOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgZGF0YTogRGljdERhdGE7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERpY3REYXRhUGFnZVJlc3VsdCB7CisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8RGljdERhdGE+OworICB9Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL2RpY3QuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vZGljdC5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjM1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL2RpY3QuZC50cwpAQCAtMCwwICsxLDQ4IEBACitkZWNsYXJlIG5hbWVzcGFjZSBBUEkuU3lzdGVtIHsKKyAgZXhwb3J0IGludGVyZmFjZSBEaWN0VHlwZSB7CisgICAgZGljdElkOiBudW1iZXI7CisgICAgZGljdE5hbWU6IHN0cmluZzsKKyAgICBkaWN0VHlwZTogc3RyaW5nOworICAgIHN0YXR1czogc3RyaW5nOworICAgIGNyZWF0ZUJ5OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgICB1cGRhdGVCeTogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU6IERhdGU7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERpY3RUeXBlTGlzdFBhcmFtcyB7CisgICAgZGljdElkPzogc3RyaW5nOworICAgIGRpY3ROYW1lPzogc3RyaW5nOworICAgIGRpY3RUeXBlPzogc3RyaW5nOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgICBjcmVhdGVCeT86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU/OiBzdHJpbmc7CisgICAgcmVtYXJrPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnRQYWdlPzogc3RyaW5nOworICAgIGZpbHRlcj86IHN0cmluZzsKKyAgICBzb3J0ZXI/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERpY3RUeXBlSW5mb1Jlc3VsdCB7CisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IERpY3Q7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERpY3RUeXBlUGFnZVJlc3VsdCB7CisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8RGljdD47CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIERpY3RUeXBlUmVzdWx0IHsKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgZGF0YTogQXJyYXk8RGljdD47CisgIH0KK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vbWVudS5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9tZW51LmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNjhjZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vbWVudS5kLnRzCkBAIC0wLDAgKzEsNjYgQEAKKworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLlN5c3RlbSB7CisKKyAgaW50ZXJmYWNlIE1lbnUgeworICAgIG1lbnVJZDogbnVtYmVyOworICAgIG1lbnVOYW1lOiBzdHJpbmc7CisgICAgcGFyZW50SWQ6IG51bWJlcjsKKyAgICBvcmRlck51bTogbnVtYmVyOworICAgIHBhdGg6IHN0cmluZzsKKyAgICBjb21wb25lbnQ6IHN0cmluZzsKKyAgICBxdWVyeTogc3RyaW5nOworICAgIGlzRnJhbWU6IG51bWJlcjsKKyAgICBpc0NhY2hlOiBudW1iZXI7CisgICAgbWVudVR5cGU6IHN0cmluZzsKKyAgICB2aXNpYmxlOiBzdHJpbmc7CisgICAgc3RhdHVzOiBzdHJpbmc7CisgICAgcGVybXM6IHN0cmluZzsKKyAgICBpY29uOiBzdHJpbmc7CisgICAgY3JlYXRlQnk6IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lOiBEYXRlOworICAgIHVwZGF0ZUJ5OiBzdHJpbmc7CisgICAgdXBkYXRlVGltZTogRGF0ZTsKKyAgICByZW1hcms6IHN0cmluZzsKKyAgfQorCisgIGV4cG9ydCBpbnRlcmZhY2UgTWVudUxpc3RQYXJhbXMgeworICAgIG1lbnVJZD86IHN0cmluZzsKKyAgICBtZW51TmFtZT86IHN0cmluZzsKKyAgICBwYXJlbnRJZD86IHN0cmluZzsKKyAgICBvcmRlck51bT86IHN0cmluZzsKKyAgICBwYXRoPzogc3RyaW5nOworICAgIGNvbXBvbmVudD86IHN0cmluZzsKKyAgICBxdWVyeT86IHN0cmluZzsKKyAgICBpc0ZyYW1lPzogc3RyaW5nOworICAgIGlzQ2FjaGU/OiBzdHJpbmc7CisgICAgbWVudVR5cGU/OiBzdHJpbmc7CisgICAgdmlzaWJsZT86IHN0cmluZzsKKyAgICBzdGF0dXM/OiBzdHJpbmc7CisgICAgcGVybXM/OiBzdHJpbmc7CisgICAgaWNvbj86IHN0cmluZzsKKyAgICBjcmVhdGVCeT86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU/OiBzdHJpbmc7CisgICAgcmVtYXJrPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnRQYWdlPzogc3RyaW5nOworICAgIGZpbHRlcj86IHN0cmluZzsKKyAgICBzb3J0ZXI/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIE1lbnVJbmZvUmVzdWx0IHsgCisgICAgY3VycmVudDogbnVtYmVyOworICAgIHBhZ2VTaXplOiBudW1iZXI7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICBkYXRhOiBNZW51OworICB9IAorCisgICBleHBvcnQgaW50ZXJmYWNlIE1lbnVQYWdlUmVzdWx0IHsgCisgICAgY3VycmVudDogbnVtYmVyOworICAgIHBhZ2VTaXplOiBudW1iZXI7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICBkYXRhOiBBcnJheTxNZW51PjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9ub3RpY2UuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vbm90aWNlLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhNzdlZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vbm90aWNlLmQudHMKQEAgLTAsMCArMSw0NSBAQAorCitkZWNsYXJlIG5hbWVzcGFjZSBBUEkuU3lzdGVtIHsKKworICBleHBvcnQgaW50ZXJmYWNlIE5vdGljZSB7CisgICAgbm90aWNlSWQ6IG51bWJlcjsKKyAgICBub3RpY2VUaXRsZTogc3RyaW5nOworICAgIG5vdGljZVR5cGU6IHN0cmluZzsKKyAgICBub3RpY2VDb250ZW50OiBzdHJpbmc7CisgICAgc3RhdHVzOiBzdHJpbmc7CisgICAgY3JlYXRlQnk6IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lOiBEYXRlOworICAgIHVwZGF0ZUJ5OiBzdHJpbmc7CisgICAgdXBkYXRlVGltZTogRGF0ZTsKKyAgICByZW1hcms6IHN0cmluZzsKKyAgfQorCisgIGV4cG9ydCBpbnRlcmZhY2UgTm90aWNlTGlzdFBhcmFtcyB7CisgICAgbm90aWNlSWQ/OiBzdHJpbmc7CisgICAgbm90aWNlVGl0bGU/OiBzdHJpbmc7CisgICAgbm90aWNlVHlwZT86IHN0cmluZzsKKyAgICBub3RpY2VDb250ZW50Pzogc3RyaW5nOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgICBjcmVhdGVCeT86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU/OiBzdHJpbmc7CisgICAgcmVtYXJrPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnQ/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIE5vdGljZUluZm9SZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgZGF0YTogTm90aWNlOworICB9IAorCisgICBleHBvcnQgaW50ZXJmYWNlIE5vdGljZVBhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICByb3dzOiBBcnJheTxOb3RpY2U+OworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL3Bvc3QuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vcG9zdC5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjE0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL3Bvc3QuZC50cwpAQCAtMCwwICsxLDQ1IEBACisKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSS5TeXN0ZW0geworCisgIGludGVyZmFjZSBQb3N0IHsKKyAgICBwb3N0SWQ6IG51bWJlcjsKKyAgICBwb3N0Q29kZTogc3RyaW5nOworICAgIHBvc3ROYW1lOiBzdHJpbmc7CisgICAgcG9zdFNvcnQ6IG51bWJlcjsKKyAgICBzdGF0dXM6IHN0cmluZzsKKyAgICBjcmVhdGVCeTogc3RyaW5nOworICAgIGNyZWF0ZVRpbWU6IERhdGU7CisgICAgdXBkYXRlQnk6IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lOiBEYXRlOworICAgIHJlbWFyazogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBQb3N0TGlzdFBhcmFtcyB7CisgICAgcG9zdElkPzogc3RyaW5nOworICAgIHBvc3RDb2RlPzogc3RyaW5nOworICAgIHBvc3ROYW1lPzogc3RyaW5nOworICAgIHBvc3RTb3J0Pzogc3RyaW5nOworICAgIHN0YXR1cz86IHN0cmluZzsKKyAgICBjcmVhdGVCeT86IHN0cmluZzsKKyAgICBjcmVhdGVUaW1lPzogc3RyaW5nOworICAgIHVwZGF0ZUJ5Pzogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU/OiBzdHJpbmc7CisgICAgcmVtYXJrPzogc3RyaW5nOworICAgIHBhZ2VTaXplPzogc3RyaW5nOworICAgIGN1cnJlbnQ/OiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIFBvc3RJbmZvUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IFBvc3Q7CisgIH0gCisKKyAgIGV4cG9ydCBpbnRlcmZhY2UgUG9zdFBhZ2VSZXN1bHQgeyAKKyAgICBjb2RlOiBudW1iZXI7CisgICAgbXNnOiBzdHJpbmc7CisgICAgdG90YWw6IG51bWJlcjsKKyAgICByb3dzOiBBcnJheTxQb3N0PjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9yb2xlLmQudHMgYi9yZWFjdC11aS9zcmMvdHlwZXMvc3lzdGVtL3JvbGUuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE5MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS9yb2xlLmQudHMKQEAgLTAsMCArMSw2NSBAQAorCitkZWNsYXJlIG5hbWVzcGFjZSBBUEkuU3lzdGVtIHsKKworICBpbnRlcmZhY2UgUm9sZSB7CisgICAgcm9sZUlkOiBudW1iZXI7CisgICAgcm9sZU5hbWU6IHN0cmluZzsKKyAgICByb2xlS2V5OiBzdHJpbmc7CisgICAgcm9sZVNvcnQ6IG51bWJlcjsKKyAgICBkYXRhU2NvcGU6IHN0cmluZzsKKyAgICBtZW51Q2hlY2tTdHJpY3RseTogbnVtYmVyOworICAgIGRlcHRDaGVja1N0cmljdGx5OiBudW1iZXI7CisgICAgc3RhdHVzOiBzdHJpbmc7CisgICAgZGVsRmxhZzogc3RyaW5nOworICAgIGNyZWF0ZUJ5OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgICB1cGRhdGVCeTogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU6IERhdGU7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIFJvbGVMaXN0UGFyYW1zIHsKKyAgICByb2xlSWQ/OiBzdHJpbmc7CisgICAgcm9sZU5hbWU/OiBzdHJpbmc7CisgICAgcm9sZUtleT86IHN0cmluZzsKKyAgICByb2xlU29ydD86IHN0cmluZzsKKyAgICBkYXRhU2NvcGU/OiBzdHJpbmc7CisgICAgbWVudUNoZWNrU3RyaWN0bHk/OiBzdHJpbmc7CisgICAgZGVwdENoZWNrU3RyaWN0bHk/OiBzdHJpbmc7CisgICAgc3RhdHVzPzogc3RyaW5nOworICAgIGRlbEZsYWc/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHJlbWFyaz86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50Pzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBSb2xlSW5mb1Jlc3VsdCB7IAorICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICBkYXRhOiBSb2xlOworICB9IAorCisgICBleHBvcnQgaW50ZXJmYWNlIFJvbGVQYWdlUmVzdWx0IHsgCisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgcm93czogQXJyYXk8Um9sZT47CisgIH0KKworICBleHBvcnQgdHlwZSBSb2xlTWVudU5vZGUgPSB7CisgICAgaWQ6IG51bWJlcnxzdHJpbmc7CisgICAgbGFiZWw6IHN0cmluZzsKKyAgICBjaGlsZHJlbj86IEFycmF5PFJvbGVNZW51Tm9kZT47CisgIH0KKyAgZXhwb3J0IGludGVyZmFjZSBSb2xlTWVudVJlc3VsdCB7IAorICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICBjaGVja2VkS2V5czogbnVtYmVyW107CisgICAgbWVudXM6IEFycmF5PFJvbGVNZW51Tm9kZT47CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vdXNlci5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3N5c3RlbS91c2VyLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MTk1NgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBlcy9zeXN0ZW0vdXNlci5kLnRzCkBAIC0wLDAgKzEsNzEgQEAKKworZGVjbGFyZSBuYW1lc3BhY2UgQVBJLlN5c3RlbSB7CisKKyAgaW50ZXJmYWNlIFVzZXIgeworICAgIHVzZXJJZDogbnVtYmVyOworICAgIGRlcHRJZDogbnVtYmVyOworICAgIHVzZXJOYW1lOiBzdHJpbmc7CisgICAgbmlja05hbWU6IHN0cmluZzsKKyAgICB1c2VyVHlwZTogc3RyaW5nOworICAgIGVtYWlsOiBzdHJpbmc7CisgICAgcGhvbmVudW1iZXI6IHN0cmluZzsKKyAgICBzZXg6IHN0cmluZzsKKyAgICBhdmF0YXI6IHN0cmluZzsKKyAgICBwYXNzd29yZDogc3RyaW5nOworICAgIHN0YXR1czogc3RyaW5nOworICAgIGRlbEZsYWc6IHN0cmluZzsKKyAgICBsb2dpbklwOiBzdHJpbmc7CisgICAgbG9naW5EYXRlOiBEYXRlOworICAgIGNyZWF0ZUJ5OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZTogRGF0ZTsKKyAgICB1cGRhdGVCeTogc3RyaW5nOworICAgIHVwZGF0ZVRpbWU6IERhdGU7CisgICAgcmVtYXJrOiBzdHJpbmc7CisgIH0KKworICBleHBvcnQgaW50ZXJmYWNlIFVzZXJMaXN0UGFyYW1zIHsKKyAgICB1c2VySWQ/OiBzdHJpbmc7CisgICAgZGVwdElkPzogc3RyaW5nOworICAgIHVzZXJOYW1lPzogc3RyaW5nOworICAgIG5pY2tOYW1lPzogc3RyaW5nOworICAgIHVzZXJUeXBlPzogc3RyaW5nOworICAgIGVtYWlsPzogc3RyaW5nOworICAgIHBob25lbnVtYmVyPzogc3RyaW5nOworICAgIHNleD86IHN0cmluZzsKKyAgICBhdmF0YXI/OiBzdHJpbmc7CisgICAgcGFzc3dvcmQ/OiBzdHJpbmc7CisgICAgc3RhdHVzPzogc3RyaW5nOworICAgIGRlbEZsYWc/OiBzdHJpbmc7CisgICAgbG9naW5JcD86IHN0cmluZzsKKyAgICBsb2dpbkRhdGU/OiBzdHJpbmc7CisgICAgY3JlYXRlQnk/OiBzdHJpbmc7CisgICAgY3JlYXRlVGltZT86IHN0cmluZzsKKyAgICB1cGRhdGVCeT86IHN0cmluZzsKKyAgICB1cGRhdGVUaW1lPzogc3RyaW5nOworICAgIHJlbWFyaz86IHN0cmluZzsKKyAgICBwYWdlU2l6ZT86IHN0cmluZzsKKyAgICBjdXJyZW50UGFnZT86IHN0cmluZzsKKyAgICBmaWx0ZXI/OiBzdHJpbmc7CisgICAgc29ydGVyPzogc3RyaW5nOworICB9CisKKyAgZXhwb3J0IGludGVyZmFjZSBVc2VySW5mb1Jlc3VsdCB7IAorICAgIGN1cnJlbnQ6IG51bWJlcjsKKyAgICBwYWdlU2l6ZTogbnVtYmVyOworICAgIHRvdGFsOiBudW1iZXI7CisgICAgZGF0YTogVXNlcjsKKyAgICBwb3N0czogW107CisgICAgcG9zdElkczogYW55OworICAgIHJvbGVJZDogbnVtYmVyOworICAgIHJvbGVJZHM6IFtdOworICAgIHJvbGVzOiBbXTsKKyAgfSAKKworICAgZXhwb3J0IGludGVyZmFjZSBVc2VyUGFnZVJlc3VsdCB7IAorICAgIGNvZGU6IG51bWJlcjsKKyAgICBtc2c6IHN0cmluZzsKKyAgICB0b3RhbDogbnVtYmVyOworICAgIHJvd3M6IEFycmF5PFVzZXI+OworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdHlwZXMvdHlwaW5ncy5kLnRzIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3R5cGluZ3MuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3R5cGVzL3R5cGluZ3MuZC50cwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3R5cGluZ3MuZC50cyBiL3JlYWN0LXVpL3NyYy90eXBpbmdzLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyZjcwYwotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy90eXBpbmdzLmQudHMKQEAgLTAsMCArMSwyMCBAQAorZGVjbGFyZSBtb2R1bGUgJ3NsYXNoMic7CitkZWNsYXJlIG1vZHVsZSAnKi5jc3MnOworZGVjbGFyZSBtb2R1bGUgJyoubGVzcyc7CitkZWNsYXJlIG1vZHVsZSAnKi5zY3NzJzsKK2RlY2xhcmUgbW9kdWxlICcqLnNhc3MnOworZGVjbGFyZSBtb2R1bGUgJyouc3ZnJzsKK2RlY2xhcmUgbW9kdWxlICcqLnBuZyc7CitkZWNsYXJlIG1vZHVsZSAnKi5qcGcnOworZGVjbGFyZSBtb2R1bGUgJyouanBlZyc7CitkZWNsYXJlIG1vZHVsZSAnKi5naWYnOworZGVjbGFyZSBtb2R1bGUgJyouYm1wJzsKK2RlY2xhcmUgbW9kdWxlICcqLnRpZmYnOworZGVjbGFyZSBtb2R1bGUgJ29taXQuanMnOworZGVjbGFyZSBtb2R1bGUgJ251bWVyYWwnOworZGVjbGFyZSBtb2R1bGUgJ0BhbnR2L2RhdGEtc2V0JzsKK2RlY2xhcmUgbW9kdWxlICdtb2NranMnOworZGVjbGFyZSBtb2R1bGUgJ3JlYWN0LWZpdHRleHQnOworZGVjbGFyZSBtb2R1bGUgJ2JpemNoYXJ0cy1wbHVnaW4tc2xpZGVyJzsKKworZGVjbGFyZSBjb25zdCBSRUFDVF9BUFBfRU5WOiAndGVzdCcgfCAnZGV2JyB8ICdwcmUnIHwgZmFsc2U7CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdXRpbHMvSWNvblV0aWwudHMgYi9yZWFjdC11aS9zcmMvdXRpbHMvSWNvblV0aWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExMDJlZQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3NyYy91dGlscy9JY29uVXRpbC50cwpAQCAtMCwwICsxLDIwIEBACitpbXBvcnQgKiBhcyBBbnRkSWNvbnMgZnJvbSAnQGFudC1kZXNpZ24vaWNvbnMnOworaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsKKworY29uc3QgYWxsSWNvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBBbnRkSWNvbnM7CisKK2V4cG9ydCBmdW5jdGlvbiBnZXRJY29uKG5hbWU6IHN0cmluZyk6IFJlYWN0LlJlYWN0Tm9kZSB8IHN0cmluZyB7CisgIGNvbnN0IGljb24gPSBhbGxJY29uc1tuYW1lXTsKKyAgcmV0dXJuIGljb24gfHwgJyc7Cit9CisKK2V4cG9ydCBmdW5jdGlvbiBjcmVhdGVJY29uKGljb246IHN0cmluZyB8IGFueSk6IFJlYWN0LlJlYWN0Tm9kZSB8IHN0cmluZyB7CisgIGlmICh0eXBlb2YgaWNvbiA9PT0gJ29iamVjdCcpIHsKKyAgICByZXR1cm4gaWNvbjsKKyAgfQorICBjb25zdCBlbGUgPSBhbGxJY29uc1tpY29uXTsKKyAgaWYgKGVsZSkgeworICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGFsbEljb25zW2ljb25dKTsKKyAgfQorICByZXR1cm4gJyc7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdXRpbHMvZG93bmxvYWRmaWxlLnRzIGIvcmVhY3QtdWkvc3JjL3V0aWxzL2Rvd25sb2FkZmlsZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU2Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3V0aWxzL2Rvd25sb2FkZmlsZS50cwpAQCAtMCwwICsxLDYzIEBACitpbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnQHVtaWpzL21heCc7CisKK2NvbnN0IG1pbWVNYXAgPSB7CisgIHhsc3g6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsCisgIHppcDogJ2FwcGxpY2F0aW9uL3ppcCcsCit9OworCisvKioKKyAqIOino+aekGJsb2Llk43lupTlhoXlrrnlubbkuIvovb0KKyAqIEBwYXJhbSB7Kn0gcmVzIGJsb2Llk43lupTlhoXlrrkKKyAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSBNSU1F57G75Z6LCisgKi8KK2V4cG9ydCBmdW5jdGlvbiByZXNvbHZlQmxvYihyZXM6IGFueSwgbWltZVR5cGU6IHN0cmluZykgeworICBjb25zdCBhTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXMuZGF0YV0sIHsgdHlwZTogbWltZVR5cGUgfSk7CisgIC8vIC8v5LuOcmVzcG9uc2XnmoRoZWFkZXJz5Lit6I635Y+WZmlsZW5hbWUsIOWQjuerr3Jlc3BvbnNlLnNldEhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyBmaWxlbmFtZT14eHh4LmRvY3giKSDorr7nva7nmoTmlofku7blkI07CisgIGNvbnN0IHBhdHQgPSBuZXcgUmVnRXhwKCdmaWxlbmFtZT0oW147XStcXC5bXlxcLjtdKyk7KicpOworICAvLyBjb25zb2xlLmxvZyhyZXMpOworICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSBkZWNvZGVVUkkocmVzLmhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSk7CisgIGNvbnN0IHJlc3VsdCA9IHBhdHQuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pOworICBsZXQgZmlsZU5hbWUgPSByZXN1bHQgPyByZXN1bHRbMV0gOiAnZmlsZSc7CisgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgvIi9nLCAnJyk7CisgIGFMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgIGFMaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOworICBhTGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZU5hbWUpOyAvLyDorr7nva7kuIvovb3mlofku7blkI3np7AKKyAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhTGluayk7CisgIGFMaW5rLmNsaWNrKCk7CisgIFVSTC5yZXZva2VPYmplY3RVUkwoYUxpbmsuaHJlZik7IC8vIOa4hemZpOW8leeUqAorICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGFMaW5rKTsKK30KKworZXhwb3J0IGZ1bmN0aW9uIGRvd25Mb2FkWmlwKHVybDogc3RyaW5nKSB7CisgIHJlcXVlc3QodXJsLCB7CisgICAgbWV0aG9kOiAnR0VUJywKKyAgICByZXNwb25zZVR5cGU6ICdibG9iJywKKyAgICBnZXRSZXNwb25zZTogdHJ1ZSwKKyAgfSkudGhlbigocmVzKSA9PiB7CisgICAgcmVzb2x2ZUJsb2IocmVzLCBtaW1lTWFwLnppcCk7CisgIH0pOworfQorCitleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bkxvYWRYbHN4KHVybDogc3RyaW5nLCBwYXJhbXM6IGFueSwgZmlsZU5hbWU6IHN0cmluZykgeworICByZXR1cm4gcmVxdWVzdCh1cmwsIHsKKyAgICAuLi5wYXJhbXMsCisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsCisgIH0pLnRoZW4oKGRhdGEpID0+IHsKKyAgICBjb25zdCBhTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgICBjb25zdCBibG9iID0gZGF0YSBhcyBhbnk7IC8vIG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pOworICAgIGFMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgYUxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CisgICAgYUxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTsgLy8g6K6+572u5LiL6L295paH5Lu25ZCN56ewCisgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhTGluayk7CisgICAgYUxpbmsuY2xpY2soKTsKKyAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGFMaW5rLmhyZWYpOyAvLyDmuIXpmaTlvJXnlKgKKyAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGFMaW5rKTsKKyAgfSk7Cit9CisKKworZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkKGZpbGVOYW1lOiBzdHJpbmcpIHsKKyAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL2FwaS9jb21tb24vZG93bmxvYWQ/ZmlsZU5hbWU9JHtlbmNvZGVVUkkoZmlsZU5hbWUpfSZkZWxldGU9JHt0cnVlfWA7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdXRpbHMvb3B0aW9ucy50cyBiL3JlYWN0LXVpL3NyYy91dGlscy9vcHRpb25zLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWU4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdXRpbHMvb3B0aW9ucy50cwpAQCAtMCwwICsxLDEyIEBACitpbXBvcnQgeyBEaWN0VmFsdWVFbnVtT2JqIH0gZnJvbSAiQC9jb21wb25lbnRzL0RpY3RUYWciOworaW1wb3J0IHsgUHJvU2NoZW1hVmFsdWVFbnVtT2JqLCBQcm9TY2hlbWFWYWx1ZUVudW1UeXBlIH0gZnJvbSAiQGFudC1kZXNpZ24vcHJvLWNvbXBvbmVudHMiOworCitleHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVFbnVtTGFiZWwob3B0aW9uczogRGljdFZhbHVlRW51bU9iaiB8IFByb1NjaGVtYVZhbHVlRW51bU9iaiwgdmFsOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZT86IHN0cmluZykgeworICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgeworICAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zW3ZhbF0gYXMgUHJvU2NoZW1hVmFsdWVFbnVtVHlwZTsKKyAgICAgICBpZihkYXRhKSB7CisgICAgICAgIHJldHVybiBkYXRhLnRleHQ7CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlP2RlZmF1bHRWYWx1ZTp2YWw7Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS9zcmMvdXRpbHMvcGVybWlzc2lvbi50cyBiL3JlYWN0LXVpL3NyYy91dGlscy9wZXJtaXNzaW9uLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YzhhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS9zcmMvdXRpbHMvcGVybWlzc2lvbi50cwpAQCAtMCwwICsxLDY0IEBACisvLyAvKioKKy8vICAqIOWtl+espuadg+mZkOagoemqjAorLy8gICogQHBhcmFtIHtBcnJheX0gdmFsdWUg5qCh6aqM5YC8CisvLyAgKiBAcmV0dXJucyB7Qm9vbGVhbn0KKy8vICAqLworZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGVybXMocGVybWlzc2lvbnM6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nW10pIHsKKyAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsdWUubGVuZ3RoID4gMCkgeworICAgIGNvbnN0IHBlcm1pc3Npb25EYXRhcyA9IHZhbHVlOworICAgIGNvbnN0IGFsbF9wZXJtaXNzaW9uID0gJyo6KjoqJzsKKyAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gcGVybWlzc2lvbnMuc29tZSgocGVybWlzc2lvbikgPT4geworICAgICAgcmV0dXJuIGFsbF9wZXJtaXNzaW9uID09PSBwZXJtaXNzaW9uIHx8IHBlcm1pc3Npb25EYXRhcy5pbmNsdWRlcyhwZXJtaXNzaW9uKTsKKyAgICB9KTsKKyAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY29uc29sZS5lcnJvcihgbmVlZCByb2xlcyEgTGlrZSBjaGVja1Blcm1pPSJbJ3N5c3RlbTp1c2VyOmFkZCcsJ3N5c3RlbTp1c2VyOmVkaXQnXSJgKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitleHBvcnQgZnVuY3Rpb24gbWF0Y2hQZXJtKHBlcm1pc3Npb25zOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZykgeworICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkgeworICAgIGNvbnN0IHBlcm1pc3Npb25EYXRhcyA9IHZhbHVlOworICAgIGNvbnN0IGFsbF9wZXJtaXNzaW9uID0gJyo6KjoqJzsKKyAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gcGVybWlzc2lvbnMuc29tZSgocGVybWlzc2lvbikgPT4geworICAgICAgcmV0dXJuIGFsbF9wZXJtaXNzaW9uID09PSBwZXJtaXNzaW9uIHx8IHBlcm1pc3Npb25EYXRhcyA9PT0gcGVybWlzc2lvbjsKKyAgICB9KTsKKyAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY29uc29sZS5lcnJvcihgbmVlZCByb2xlcyEgTGlrZSBjaGVja1Blcm1pPSJbJ3N5c3RlbTp1c2VyOmFkZCcsJ3N5c3RlbTp1c2VyOmVkaXQnXSJgKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitleHBvcnQgZnVuY3Rpb24gbWF0Y2hQZXJtaXNzaW9uKHBlcm1pc3Npb25zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgdmFsdWU6IGFueSk6IGJvb2xlYW4geworICBpZiAocGVybWlzc2lvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlOworICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlOworICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICByZXR1cm4gbWF0Y2hQZXJtKHBlcm1pc3Npb25zLCB2YWx1ZSk7CisgIH0KKyAgcmV0dXJuIG1hdGNoUGVybXMocGVybWlzc2lvbnMsIHZhbHVlKTsKK30KKworLyoqCisgKiDop5LoibLmnYPpmZDmoKHpqowKKyAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIOagoemqjOWAvAorICogQHJldHVybnMge0Jvb2xlYW59CisgKi8KK2V4cG9ydCBmdW5jdGlvbiBjaGVja1JvbGUocm9sZXM6IEFQSS5TeXN0ZW0uUm9sZVtdIHwgdW5kZWZpbmVkLCB2YWx1ZTogc3RyaW5nW10pIHsKKyAgaWYgKHJvbGVzICYmIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzPy5sZW5ndGg7IGkrKykgeworICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZT8ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgaWYgKHZhbHVlW2pdID09PSByb2xlc1tpXS5yb2xlS2V5KSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgY29uc29sZS5lcnJvcihgbmVlZCByb2xlcyEgTGlrZSBjaGVja1JvbGU9IlsnYWRtaW4nLCdlZGl0b3InXSJgKTsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvc3JjL3V0aWxzL3RyZWUudHMgYi9yZWFjdC11aS9zcmMvdXRpbHMvdHJlZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUzOTVlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvc3JjL3V0aWxzL3RyZWUudHMKQEAgLTAsMCArMSw5MyBAQAoraW1wb3J0IHsgRGF0YU5vZGUgfSBmcm9tICdhbnRkL2VzL3RyZWUnOworaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdxdWVyeXN0cmluZyc7CisKKy8qKgorICog5p6E6YCg5qCR5Z6L57uT5p6E5pWw5o2uCisgKiBAcGFyYW0geyp9IGRhdGEg5pWw5o2u5rqQCisgKiBAcGFyYW0geyp9IGlkIGlk5a2X5q61IOm7mOiupCAnaWQnCisgKiBAcGFyYW0geyp9IHBhcmVudElkIOeItuiKgueCueWtl+autSDpu5jorqQgJ3BhcmVudElkJworICogQHBhcmFtIHsqfSBjaGlsZHJlbiDlranlrZDoioLngrnlrZfmrrUg6buY6K6kICdjaGlsZHJlbicKKyAqLworZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVHJlZURhdGEoCisgIGRhdGE6IGFueVtdLAorICBpZDogc3RyaW5nLAorICBuYW1lOiBzdHJpbmcsCisgIHBhcmVudElkOiBzdHJpbmcsCisgIHBhcmVudE5hbWU6IHN0cmluZywKKyAgY2hpbGRyZW46IHN0cmluZywKKykgeworICBjb25zdCBjb25maWcgPSB7CisgICAgaWQ6IGlkIHx8ICdpZCcsCisgICAgbmFtZTogbmFtZSB8fCAnbmFtZScsCisgICAgcGFyZW50SWQ6IHBhcmVudElkIHx8ICdwYXJlbnRJZCcsCisgICAgcGFyZW50TmFtZTogcGFyZW50TmFtZSB8fCAncGFyZW50TmFtZScsCisgICAgY2hpbGRyZW5MaXN0OiBjaGlsZHJlbiB8fCAnY2hpbGRyZW4nLAorICB9OworCisgIGNvbnN0IGNoaWxkcmVuTGlzdE1hcDogYW55W10gPSBbXTsKKyAgY29uc3Qgbm9kZUlkczogYW55W10gPSBbXTsKKyAgY29uc3QgdHJlZTogYW55W10gPSBbXTsKKyAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CisgICAgY29uc3QgZCA9IGl0ZW07CisgICAgY29uc3QgcElkID0gZFtjb25maWcucGFyZW50SWRdOworICAgIGlmICghY2hpbGRyZW5MaXN0TWFwW3BJZF0pIHsKKyAgICAgIGNoaWxkcmVuTGlzdE1hcFtwSWRdID0gW107CisgICAgfQorICAgIGQua2V5ID0gZFtjb25maWcuaWRdOworICAgIGQudGl0bGUgPSBkW2NvbmZpZy5uYW1lXTsKKyAgICBkLnZhbHVlID0gZFtjb25maWcuaWRdOworICAgIGRbY29uZmlnLmNoaWxkcmVuTGlzdF0gPSBudWxsOworICAgIG5vZGVJZHNbZFtjb25maWcuaWRdXSA9IGQ7CisgICAgY2hpbGRyZW5MaXN0TWFwW3BJZF0ucHVzaChkKTsKKyAgfSk7CisKKyAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHsKKyAgICBjb25zdCBkID0gaXRlbTsKKyAgICBjb25zdCBwSWQgPSBkW2NvbmZpZy5wYXJlbnRJZF07CisgICAgaWYgKCFub2RlSWRzW3BJZF0pIHsKKyAgICAgIGRbY29uZmlnLnBhcmVudE5hbWVdID0gJyc7CisgICAgICB0cmVlLnB1c2goZCk7CisgICAgfQorICB9KTsKKworICBmdW5jdGlvbiBhZGFwdFRvQ2hpbGRyZW5MaXN0KGl0ZW06IGFueSkgeworICAgIGNvbnN0IG8gPSBpdGVtOworICAgIGlmIChjaGlsZHJlbkxpc3RNYXBbb1tjb25maWcuaWRdXSkgeworICAgICAgaWYgKCFvW2NvbmZpZy5jaGlsZHJlbkxpc3RdKSB7CisgICAgICAgIG9bY29uZmlnLmNoaWxkcmVuTGlzdF0gPSBbXTsKKyAgICAgIH0KKyAgICAgIG9bY29uZmlnLmNoaWxkcmVuTGlzdF0gPSBjaGlsZHJlbkxpc3RNYXBbb1tjb25maWcuaWRdXTsKKyAgICB9CisgICAgaWYgKG9bY29uZmlnLmNoaWxkcmVuTGlzdF0pIHsKKyAgICAgIG9bY29uZmlnLmNoaWxkcmVuTGlzdF0uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4geworICAgICAgICBjb25zdCBjID0gY2hpbGQ7CisgICAgICAgIGNbY29uZmlnLnBhcmVudE5hbWVdID0gb1tjb25maWcubmFtZV07CisgICAgICAgIGFkYXB0VG9DaGlsZHJlbkxpc3QoYyk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICB0cmVlLmZvckVhY2goKHQ6IGFueSkgPT4geworICAgIGFkYXB0VG9DaGlsZHJlbkxpc3QodCk7CisgIH0pOworCisgIHJldHVybiB0cmVlOworfQorCitleHBvcnQgY29uc3QgZ2V0UGFnZVF1ZXJ5ID0gKCkgPT4gcGFyc2Uod2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVsxXSk7CisKK2V4cG9ydCBmdW5jdGlvbiBmb3JtYXRUcmVlRGF0YShhcnJheUxpc3Q6IGFueSk6IERhdGFOb2RlW10geworICBjb25zdCB0cmVlU2VsZWN0RGF0YTogRGF0YU5vZGVbXSA9IGFycmF5TGlzdC5tYXAoKGl0ZW06IGFueSkgPT4geworICAgIGNvbnN0IG5vZGU6IERhdGFOb2RlID0geworICAgICAgaWQ6IGl0ZW0uaWQsCisgICAgICB0aXRsZTogaXRlbS5sYWJlbCwKKyAgICAgIGtleTogYCR7aXRlbS5pZH1gLAorICAgICAgdmFsdWU6IGl0ZW0uaWQsCisgICAgfSBhcyBEYXRhTm9kZTsKKyAgICBpZiAoaXRlbS5jaGlsZHJlbikgeworICAgICAgbm9kZS5jaGlsZHJlbiA9IGZvcm1hdFRyZWVEYXRhKGl0ZW0uY2hpbGRyZW4pOworICAgIH0KKyAgICByZXR1cm4gbm9kZTsKKyAgfSk7CisgIHJldHVybiB0cmVlU2VsZWN0RGF0YTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3Rlc3RzL3NldHVwVGVzdHMuanN4IGIvcmVhY3QtdWkvdGVzdHMvc2V0dXBUZXN0cy5qc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyNTYxZAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3Rlc3RzL3NldHVwVGVzdHMuanN4CkBAIC0wLDAgKzEsNjQgQEAKK++7v2NvbnN0IGxvY2FsU3RvcmFnZU1vY2sgPSB7CisgIGdldEl0ZW06IGplc3QuZm4oKSwKKyAgc2V0SXRlbTogamVzdC5mbigpLAorICByZW1vdmVJdGVtOiBqZXN0LmZuKCksCisgIGNsZWFyOiBqZXN0LmZuKCksCit9OworCitnbG9iYWwubG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9jazsKKworT2JqZWN0LmRlZmluZVByb3BlcnR5KFVSTCwgJ2NyZWF0ZU9iamVjdFVSTCcsIHsKKyAgd3JpdGFibGU6IHRydWUsCisgIHZhbHVlOiBqZXN0LmZuKCksCit9KTsKKworY2xhc3MgV29ya2VyIHsKKyAgY29uc3RydWN0b3Ioc3RyaW5nVXJsKSB7CisgICAgdGhpcy51cmwgPSBzdHJpbmdVcmw7CisgICAgdGhpcy5vbm1lc3NhZ2UgPSAoKSA9PiB7fTsKKyAgfQorCisgIHBvc3RNZXNzYWdlKG1zZykgeworICAgIHRoaXMub25tZXNzYWdlKG1zZyk7CisgIH0KK30KK3dpbmRvdy5Xb3JrZXIgPSBXb3JrZXI7CisKKy8qIGVzbGludC1kaXNhYmxlIGdsb2JhbC1yZXF1aXJlICovCitpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xODc3NAorICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKSB7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbC53aW5kb3csICdtYXRjaE1lZGlhJywgeworICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICB2YWx1ZTogamVzdC5mbigoKSA9PiAoeworICAgICAgICBtYXRjaGVzOiBmYWxzZSwKKyAgICAgICAgYWRkTGlzdGVuZXI6IGplc3QuZm4oKSwKKyAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IGplc3QuZm4oKSwKKyAgICAgIH0pKSwKKyAgICB9KTsKKyAgfQorICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKSB7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbC53aW5kb3csICdtYXRjaE1lZGlhJywgeworICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICB2YWx1ZTogamVzdC5mbigocXVlcnkpID0+ICh7CisgICAgICAgIG1hdGNoZXM6IHF1ZXJ5LmluY2x1ZGVzKCdtYXgtd2lkdGgnKSwKKyAgICAgICAgYWRkTGlzdGVuZXI6IGplc3QuZm4oKSwKKyAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IGplc3QuZm4oKSwKKyAgICAgIH0pKSwKKyAgICB9KTsKKyAgfQorfQorY29uc3QgZXJyb3JMb2cgPSBjb25zb2xlLmVycm9yOworT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbC53aW5kb3cuY29uc29sZSwgJ2Vycm9yJywgeworICB3cml0YWJsZTogdHJ1ZSwKKyAgY29uZmlndXJhYmxlOiB0cnVlLAorICB2YWx1ZTogKC4uLnJlc3QpID0+IHsKKyAgICBjb25zdCBsb2dTdHIgPSByZXN0LmpvaW4oJycpOworICAgIGlmIChsb2dTdHIuaW5jbHVkZXMoJ1dhcm5pbmc6IEFuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKScpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVycm9yTG9nKC4uLnJlc3QpOworICB9LAorfSk7CmRpZmYgLS1naXQgYS9yZWFjdC11aS90c2NvbmZpZy5qc29uIGIvcmVhY3QtdWkvdHNjb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTczM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvdHNjb25maWcuanNvbgpAQCAtMCwwICsxLDIzIEBACit7CisgICJjb21waWxlck9wdGlvbnMiOiB7CisgICAgInRhcmdldCI6ICJlc25leHQiLAorICAgICJtb2R1bGUiOiAiZXNuZXh0IiwKKyAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJub2RlIiwKKyAgICAiaW1wb3J0SGVscGVycyI6IHRydWUsCisgICAgImpzeCI6ICJwcmVzZXJ2ZSIsCisgICAgImVzTW9kdWxlSW50ZXJvcCI6IHRydWUsCisgICAgInNvdXJjZU1hcCI6IHRydWUsCisgICAgImJhc2VVcmwiOiAiLi8iLAorICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAorICAgICJleHBlcmltZW50YWxEZWNvcmF0b3JzIjogdHJ1ZSwKKyAgICAic3RyaWN0IjogdHJ1ZSwKKyAgICAicmVzb2x2ZUpzb25Nb2R1bGUiOiB0cnVlLAorICAgICJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIjogdHJ1ZSwKKyAgICAicGF0aHMiOiB7CisgICAgICAiQC8qIjogWyIuL3NyYy8qIl0sCisgICAgICAiQEAvKiI6IFsiLi9zcmMvLnVtaS8qIl0sCisgICAgICAiQEB0ZXN0LyoiOiBbIi4vc3JjLy51bWktdGVzdC8qIl0KKyAgICB9CisgIH0sCisgICJpbmNsdWRlIjogWyIuLyoqLyouZC50cyIsICIuLyoqLyoudHMiLCAiLi8qKi8qLnRzeCJdCit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS90eXBlcy9jYWNoZS9jYWNoZS5qc29uIGIvcmVhY3QtdWkvdHlwZXMvY2FjaGUvY2FjaGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY3ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVhY3QtdWkvdHlwZXMvY2FjaGUvY2FjaGUuanNvbgpAQCAtMCwwICsxIEBACit7fQpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvdHlwZXMvY2FjaGUvbG9naW4uY2FjaGUuanNvbiBiL3JlYWN0LXVpL3R5cGVzL2NhY2hlL2xvZ2luLmNhY2hlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExMDliNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3R5cGVzL2NhY2hlL2xvZ2luLmNhY2hlLmpzb24KQEAgLTAsMCArMSwzODYgQEAKK3sKKyAgIkdFVCAvYXBpL2N1cnJlbnRVc2VyIjogeworICAgICJyZXMiOiB7CisgICAgICAiZGF0YSI6IHsKKyAgICAgICAgIm5hbWUiOiAiU2VyYXRpIE1hIiwKKyAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvQmlhemZhbnhtYW1OUm94eFZ4a2EucG5nIiwKKyAgICAgICAgInVzZXJpZCI6ICIwMDAwMDAwMSIsCisgICAgICAgICJlbWFpbCI6ICJhbnRkZXNpZ25AYWxpcGF5LmNvbSIsCisgICAgICAgICJzaWduYXR1cmUiOiAi5rW357qz55m+5bed77yM5pyJ5a655LmD5aSnIiwKKyAgICAgICAgInRpdGxlIjogIuS6pOS6kuS4k+WutiIsCisgICAgICAgICJncm91cCI6ICLomoLomoHph5HmnI3vvI3mn5Dmn5Dmn5DkuovkuJrnvqTvvI3mn5Dmn5DlubPlj7Dpg6jvvI3mn5Dmn5DmioDmnK/pg6jvvI1VRUQiLAorICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICAia2V5IjogIjAiLAorICAgICAgICAgICAgImxhYmVsIjogIuW+iOacieaDs+azleeahCIKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJrZXkiOiAiMSIsCisgICAgICAgICAgICAibGFiZWwiOiAi5LiT5rOo6K6+6K6hIgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgImtleSI6ICIyIiwKKyAgICAgICAgICAgICJsYWJlbCI6ICLovqN+IgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgImtleSI6ICIzIiwKKyAgICAgICAgICAgICJsYWJlbCI6ICLlpKfplb/ohb8iCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICAia2V5IjogIjQiLAorICAgICAgICAgICAgImxhYmVsIjogIuW3neWmueWtkCIKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJrZXkiOiAiNSIsCisgICAgICAgICAgICAibGFiZWwiOiAi5rW357qz55m+5bedIgorICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgIm5vdGlmeUNvdW50IjogMTIsCisgICAgICAgICJ1bnJlYWRDb3VudCI6IDExLAorICAgICAgICAiY291bnRyeSI6ICJDaGluYSIsCisgICAgICAgICJnZW9ncmFwaGljIjogeworICAgICAgICAgICJwcm92aW5jZSI6IHsKKyAgICAgICAgICAgICJsYWJlbCI6ICLmtZnmsZ/nnIEiLAorICAgICAgICAgICAgImtleSI6ICIzMzAwMDAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiY2l0eSI6IHsKKyAgICAgICAgICAgICJsYWJlbCI6ICLmna3lt57luIIiLAorICAgICAgICAgICAgImtleSI6ICIzMzAxMDAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiYWRkcmVzcyI6ICLopb/muZbljLrlt6XkuJPot68gNzcg5Y+3IiwKKyAgICAgICAgInBob25lIjogIjA3NTItMjY4ODg4ODg4IgorICAgICAgfQorICAgIH0sCisgICAgInF1ZXJ5IjogeworICAgICAgInRva2VuICI6ICIgMTIzIgorICAgIH0sCisgICAgInBheWxvYWQiOiB7fSwKKyAgICAidHlwZXMiOiAiLyoqIEdFVCAvYXBpL2N1cnJlbnRVc2VyICovXG5leHBvcnQgdHlwZSBHRVRfQVBJX0NVUlJFTlRfVVNFUl9RVUVSWSA9IHtcbiAgLyoqIGV4YW1wbGU6ICAxMjMgKi9cbiAgICAgICAgdG9rZW4gOiBzdHJpbmdcbn1cbiAgXG5cbmV4cG9ydCB0eXBlIEdFVF9BUElfQ1VSUkVOVF9VU0VSX1BBWUxPQUQgPSB7XG4gIFxufVxuICBcblxuZXhwb3J0IHR5cGUgR0VUX0FQSV9DVVJSRU5UX1VTRVJfUkVTID0ge1xuICAvKiogZXhhbXBsZToge1wibmFtZVwiOiBcIlNlcmF0aSBNYVwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvQmlhemZhbnhtYW1OUm94eFZ4a2EucG5nXCIsIFwidXNlcmlkXCI6IFwiMDAwMDAwMDFcIiwgXCJlbWFpbFwiOiBcImFudGRlc2lnbkBhbGlwYXkuY29tXCIsIFwic2lnbmF0dXJlXCI6IFwi5rW357qz55m+5bed77yM5pyJ5a655LmD5aSnXCIsIFwidGl0bGVcIjogXCLkuqTkupLkuJPlrrZcIiwgXCJncm91cFwiOiBcIuiaguiagemHkeacje+8jeafkOafkOafkOS6i+S4mue+pO+8jeafkOafkOW5s+WPsOmDqO+8jeafkOafkOaKgOacr+mDqO+8jVVFRFwiLCBcInRhZ3NcIjogW3tcImtleVwiOiBcIjBcIiwgXCJsYWJlbFwiOiBcIuW+iOacieaDs+azleeahFwifSwge1wia2V5XCI6IFwiMVwiLCBcImxhYmVsXCI6IFwi5LiT5rOo6K6+6K6hXCJ9LCB7XCJrZXlcIjogXCIyXCIsIFwibGFiZWxcIjogXCLovqN+XCJ9LCB7XCJrZXlcIjogXCIzXCIsIFwibGFiZWxcIjogXCLlpKfplb/ohb9cIn0sIHtcImtleVwiOiBcIjRcIiwgXCJsYWJlbFwiOiBcIuW3neWmueWtkFwifSwge1wia2V5XCI6IFwiNVwiLCBcImxhYmVsXCI6IFwi5rW357qz55m+5bedXCJ9XSwgXCJub3RpZnlDb3VudFwiOiAxMiwgXCJ1bnJlYWRDb3VudFwiOiAxMSwgXCJjb3VudHJ5XCI6IFwiQ2hpbmFcIiwgXCJnZW9ncmFwaGljXCI6IHtcInByb3ZpbmNlXCI6IHtcImxhYmVsXCI6IFwi5rWZ5rGf55yBXCIsIFwia2V5XCI6IFwiMzMwMDAwXCJ9LCBcImNpdHlcIjoge1wibGFiZWxcIjogXCLmna3lt57luIJcIiwgXCJrZXlcIjogXCIzMzAxMDBcIn19LCBcImFkZHJlc3NcIjogXCLopb/muZbljLrlt6XkuJPot68gNzcg5Y+3XCIsIFwicGhvbmVcIjogXCIwNzUyLTI2ODg4ODg4OFwifSAqL1xuICAgICAgICBkYXRhOiB7XG4gICAgICBuYW1lOiBzdHJpbmcsXG5hdmF0YXI6IHN0cmluZyxcbnVzZXJpZDogc3RyaW5nLFxuZW1haWw6IHN0cmluZyxcbnNpZ25hdHVyZTogc3RyaW5nLFxudGl0bGU6IHN0cmluZyxcbmdyb3VwOiBzdHJpbmcsXG50YWdzOiB7XG4gICAgICBrZXk6IHN0cmluZyxcbmxhYmVsOiBzdHJpbmdcbiAgICAgIH1bXSxcbm5vdGlmeUNvdW50OiBudW1iZXIsXG51bnJlYWRDb3VudDogbnVtYmVyLFxuY291bnRyeTogc3RyaW5nLFxuZ2VvZ3JhcGhpYzoge1xuICAgICAgcHJvdmluY2U6IHtcbiAgICAgIGxhYmVsOiBzdHJpbmcsXG5rZXk6IHN0cmluZ1xuICAgICAgfSxcbmNpdHk6IHtcbiAgICAgIGxhYmVsOiBzdHJpbmcsXG5rZXk6IHN0cmluZ1xuICAgICAgfVxuICAgICAgfSxcbmFkZHJlc3M6IHN0cmluZyxcbnBob25lOiBzdHJpbmdcbiAgICAgIH1cbn1cbiAgIgorICB9LAorICAiR0VUIC9hcGkvcnVsZSI6IHsKKyAgICAicmVzIjogeworICAgICAgImRhdGEiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogOTksCisgICAgICAgICAgImRpc2FibGVkIjogZmFsc2UsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA5OSIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogNTAzLAorICAgICAgICAgICJzdGF0dXMiOiAiMCIsCisgICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAicHJvZ3Jlc3MiOiA4MQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDk4LAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgOTgiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDE2NCwKKyAgICAgICAgICAic3RhdHVzIjogIjAiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogMTIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA5NywKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDk3IiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiAxNzQsCisgICAgICAgICAgInN0YXR1cyI6ICIxIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDgxCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogOTYsCisgICAgICAgICAgImRpc2FibGVkIjogdHJ1ZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDk2IiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiA5MTQsCisgICAgICAgICAgInN0YXR1cyI6ICIwIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDcKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA5NSwKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDk1IiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiA2OTgsCisgICAgICAgICAgInN0YXR1cyI6ICIyIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDgyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogOTQsCisgICAgICAgICAgImRpc2FibGVkIjogZmFsc2UsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA5NCIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogNDg4LAorICAgICAgICAgICJzdGF0dXMiOiAiMSIsCisgICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAicHJvZ3Jlc3MiOiAxNAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDkzLAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgOTMiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDU4MCwKKyAgICAgICAgICAic3RhdHVzIjogIjIiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogNzcKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA5MiwKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDkyIiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiAyNDQsCisgICAgICAgICAgInN0YXR1cyI6ICIzIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDU4CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogOTEsCisgICAgICAgICAgImRpc2FibGVkIjogZmFsc2UsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA5MSIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogOTU5LAorICAgICAgICAgICJzdGF0dXMiOiAiMCIsCisgICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAicHJvZ3Jlc3MiOiA2NgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDkwLAorICAgICAgICAgICJkaXNhYmxlZCI6IHRydWUsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA5MCIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogOTU4LAorICAgICAgICAgICJzdGF0dXMiOiAiMCIsCisgICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAicHJvZ3Jlc3MiOiA3MgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDg5LAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgODkiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDMwMSwKKyAgICAgICAgICAic3RhdHVzIjogIjIiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDg4LAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgODgiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDI3NywKKyAgICAgICAgICAic3RhdHVzIjogIjEiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogMTIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA4NywKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDg3IiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiA4MTAsCisgICAgICAgICAgInN0YXR1cyI6ICIxIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDgyCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogODYsCisgICAgICAgICAgImRpc2FibGVkIjogZmFsc2UsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA4NiIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogNzgwLAorICAgICAgICAgICJzdGF0dXMiOiAiMyIsCisgICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAicHJvZ3Jlc3MiOiAyMgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDg1LAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgODUiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDcwNSwKKyAgICAgICAgICAic3RhdHVzIjogIjMiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogMTIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA4NCwKKyAgICAgICAgICAiZGlzYWJsZWQiOiB0cnVlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgODQiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDIwMywKKyAgICAgICAgICAic3RhdHVzIjogIjAiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogNzkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA4MywKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDgzIiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiA0OTEsCisgICAgICAgICAgInN0YXR1cyI6ICIyIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDU5CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAia2V5IjogODIsCisgICAgICAgICAgImRpc2FibGVkIjogZmFsc2UsCisgICAgICAgICAgImhyZWYiOiAiaHR0cHM6Ly9hbnQuZGVzaWduIiwKKyAgICAgICAgICAiYXZhdGFyIjogImh0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLAorICAgICAgICAgICJuYW1lIjogIlRyYWRlQ29kZSA4MiIsCisgICAgICAgICAgIm93bmVyIjogIuabsuS4veS4vSIsCisgICAgICAgICAgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwKKyAgICAgICAgICAiY2FsbE5vIjogNzMsCisgICAgICAgICAgInN0YXR1cyI6ICIwIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDEwMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImtleSI6IDgxLAorICAgICAgICAgICJkaXNhYmxlZCI6IGZhbHNlLAorICAgICAgICAgICJocmVmIjogImh0dHBzOi8vYW50LmRlc2lnbiIsCisgICAgICAgICAgImF2YXRhciI6ICJodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwKKyAgICAgICAgICAibmFtZSI6ICJUcmFkZUNvZGUgODEiLAorICAgICAgICAgICJvd25lciI6ICLmm7LkuL3kuL0iLAorICAgICAgICAgICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsCisgICAgICAgICAgImNhbGxObyI6IDQwNiwKKyAgICAgICAgICAic3RhdHVzIjogIjMiLAorICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaIiwKKyAgICAgICAgICAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgInByb2dyZXNzIjogNjEKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJrZXkiOiA4MCwKKyAgICAgICAgICAiZGlzYWJsZWQiOiBmYWxzZSwKKyAgICAgICAgICAiaHJlZiI6ICJodHRwczovL2FudC5kZXNpZ24iLAorICAgICAgICAgICJhdmF0YXIiOiAiaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZyIsCisgICAgICAgICAgIm5hbWUiOiAiVHJhZGVDb2RlIDgwIiwKKyAgICAgICAgICAib3duZXIiOiAi5puy5Li95Li9IiwKKyAgICAgICAgICAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLAorICAgICAgICAgICJjYWxsTm8iOiAxMTIsCisgICAgICAgICAgInN0YXR1cyI6ICIyIiwKKyAgICAgICAgICAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6MDA6NTcuMDQwWiIsCisgICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFoiLAorICAgICAgICAgICJwcm9ncmVzcyI6IDIwCisgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAidG90YWwiOiAxMDAsCisgICAgICAic3VjY2VzcyI6IHRydWUsCisgICAgICAicGFnZVNpemUiOiAyMCwKKyAgICAgICJjdXJyZW50IjogMQorICAgIH0sCisgICAgInF1ZXJ5IjogeworICAgICAgInRva2VuICI6ICIgMTIzIiwKKyAgICAgICJjdXJyZW50IjogIjEiLAorICAgICAgInBhZ2VTaXplIjogIjIwIgorICAgIH0sCisgICAgInBheWxvYWQiOiB7fSwKKyAgICAidHlwZXMiOiAiLyoqIEdFVCAvYXBpL3J1bGUgKi9cbmV4cG9ydCB0eXBlIEdFVF9BUElfUlVMRV9RVUVSWSA9IHtcbiAgLyoqIGV4YW1wbGU6ICAxMjMgKi9cbiAgICAgICAgdG9rZW4gOiBzdHJpbmc7XG4gIC8qKiBleGFtcGxlOiAxICovXG4gICAgICAgIGN1cnJlbnQ6IHN0cmluZztcbiAgLyoqIGV4YW1wbGU6IDIwICovXG4gICAgICAgIHBhZ2VTaXplOiBzdHJpbmdcbn1cbiAgXG5cbmV4cG9ydCB0eXBlIEdFVF9BUElfUlVMRV9QQVlMT0FEID0ge1xuICBcbn1cbiAgXG5cbmV4cG9ydCB0eXBlIEdFVF9BUElfUlVMRV9SRVMgPSB7XG4gIC8qKiBleGFtcGxlOiBbe1wia2V5XCI6IDk5LCBcImRpc2FibGVkXCI6IGZhbHNlLCBcImhyZWZcIjogXCJodHRwczogLy9hbnQuZGVzaWduXCIsIFwiYXZhdGFyXCI6IFwiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmdcIiwgXCJuYW1lXCI6IFwiVHJhZGVDb2RlIDk5XCIsIFwib3duZXJcIjogXCLmm7LkuL3kuL1cIiwgXCJkZXNjXCI6IFwi6L+Z5piv5LiA5q615o+P6L+wXCIsIFwiY2FsbE5vXCI6IDUwMywgXCJzdGF0dXNcIjogXCIwXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDgxfSwge1wia2V5XCI6IDk4LCBcImRpc2FibGVkXCI6IGZhbHNlLCBcImhyZWZcIjogXCJodHRwczogLy9hbnQuZGVzaWduXCIsIFwiYXZhdGFyXCI6IFwiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmdcIiwgXCJuYW1lXCI6IFwiVHJhZGVDb2RlIDk4XCIsIFwib3duZXJcIjogXCLmm7LkuL3kuL1cIiwgXCJkZXNjXCI6IFwi6L+Z5piv5LiA5q615o+P6L+wXCIsIFwiY2FsbE5vXCI6IDE2NCwgXCJzdGF0dXNcIjogXCIwXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDEyfSwge1wia2V5XCI6IDk3LCBcImRpc2FibGVkXCI6IGZhbHNlLCBcImhyZWZcIjogXCJodHRwczogLy9hbnQuZGVzaWduXCIsIFwiYXZhdGFyXCI6IFwiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmdcIiwgXCJuYW1lXCI6IFwiVHJhZGVDb2RlIDk3XCIsIFwib3duZXJcIjogXCLmm7LkuL3kuL1cIiwgXCJkZXNjXCI6IFwi6L+Z5piv5LiA5q615o+P6L+wXCIsIFwiY2FsbE5vXCI6IDE3NCwgXCJzdGF0dXNcIjogXCIxXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDgxfSwge1wia2V5XCI6IDk2LCBcImRpc2FibGVkXCI6IHRydWUsIFwiaHJlZlwiOiBcImh0dHBzOiAvL2FudC5kZXNpZ25cIiwgXCJhdmF0YXJcIjogXCJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZ1wiLCBcIm5hbWVcIjogXCJUcmFkZUNvZGUgOTZcIiwgXCJvd25lclwiOiBcIuabsuS4veS4vVwiLCBcImRlc2NcIjogXCLov5nmmK/kuIDmrrXmj4/ov7BcIiwgXCJjYWxsTm9cIjogOTE0LCBcInN0YXR1c1wiOiBcIjBcIiwgXCJ1cGRhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcImNyZWF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwicHJvZ3Jlc3NcIjogN30sIHtcImtleVwiOiA5NSwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA5NVwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA2OTgsIFwic3RhdHVzXCI6IFwiMlwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA4Mn0sIHtcImtleVwiOiA5NCwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA5NFwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA0ODgsIFwic3RhdHVzXCI6IFwiMVwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiAxNH0sIHtcImtleVwiOiA5MywgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA5M1wiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA1ODAsIFwic3RhdHVzXCI6IFwiMlwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA3N30sIHtcImtleVwiOiA5MiwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA5MlwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiAyNDQsIFwic3RhdHVzXCI6IFwiM1wiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA1OH0sIHtcImtleVwiOiA5MSwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA5MVwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA5NTksIFwic3RhdHVzXCI6IFwiMFwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA2Nn0sIHtcImtleVwiOiA5MCwgXCJkaXNhYmxlZFwiOiB0cnVlLCBcImhyZWZcIjogXCJodHRwczogLy9hbnQuZGVzaWduXCIsIFwiYXZhdGFyXCI6IFwiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmdcIiwgXCJuYW1lXCI6IFwiVHJhZGVDb2RlIDkwXCIsIFwib3duZXJcIjogXCLmm7LkuL3kuL1cIiwgXCJkZXNjXCI6IFwi6L+Z5piv5LiA5q615o+P6L+wXCIsIFwiY2FsbE5vXCI6IDk1OCwgXCJzdGF0dXNcIjogXCIwXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDcyfSwge1wia2V5XCI6IDg5LCBcImRpc2FibGVkXCI6IGZhbHNlLCBcImhyZWZcIjogXCJodHRwczogLy9hbnQuZGVzaWduXCIsIFwiYXZhdGFyXCI6IFwiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmdcIiwgXCJuYW1lXCI6IFwiVHJhZGVDb2RlIDg5XCIsIFwib3duZXJcIjogXCLmm7LkuL3kuL1cIiwgXCJkZXNjXCI6IFwi6L+Z5piv5LiA5q615o+P6L+wXCIsIFwiY2FsbE5vXCI6IDMwMSwgXCJzdGF0dXNcIjogXCIyXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDJ9LCB7XCJrZXlcIjogODgsIFwiZGlzYWJsZWRcIjogZmFsc2UsIFwiaHJlZlwiOiBcImh0dHBzOiAvL2FudC5kZXNpZ25cIiwgXCJhdmF0YXJcIjogXCJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZ1wiLCBcIm5hbWVcIjogXCJUcmFkZUNvZGUgODhcIiwgXCJvd25lclwiOiBcIuabsuS4veS4vVwiLCBcImRlc2NcIjogXCLov5nmmK/kuIDmrrXmj4/ov7BcIiwgXCJjYWxsTm9cIjogMjc3LCBcInN0YXR1c1wiOiBcIjFcIiwgXCJ1cGRhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcImNyZWF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwicHJvZ3Jlc3NcIjogMTJ9LCB7XCJrZXlcIjogODcsIFwiZGlzYWJsZWRcIjogZmFsc2UsIFwiaHJlZlwiOiBcImh0dHBzOiAvL2FudC5kZXNpZ25cIiwgXCJhdmF0YXJcIjogXCJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZ1wiLCBcIm5hbWVcIjogXCJUcmFkZUNvZGUgODdcIiwgXCJvd25lclwiOiBcIuabsuS4veS4vVwiLCBcImRlc2NcIjogXCLov5nmmK/kuIDmrrXmj4/ov7BcIiwgXCJjYWxsTm9cIjogODEwLCBcInN0YXR1c1wiOiBcIjFcIiwgXCJ1cGRhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcImNyZWF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwicHJvZ3Jlc3NcIjogODJ9LCB7XCJrZXlcIjogODYsIFwiZGlzYWJsZWRcIjogZmFsc2UsIFwiaHJlZlwiOiBcImh0dHBzOiAvL2FudC5kZXNpZ25cIiwgXCJhdmF0YXJcIjogXCJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZ1wiLCBcIm5hbWVcIjogXCJUcmFkZUNvZGUgODZcIiwgXCJvd25lclwiOiBcIuabsuS4veS4vVwiLCBcImRlc2NcIjogXCLov5nmmK/kuIDmrrXmj4/ov7BcIiwgXCJjYWxsTm9cIjogNzgwLCBcInN0YXR1c1wiOiBcIjNcIiwgXCJ1cGRhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcImNyZWF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwicHJvZ3Jlc3NcIjogMjJ9LCB7XCJrZXlcIjogODUsIFwiZGlzYWJsZWRcIjogZmFsc2UsIFwiaHJlZlwiOiBcImh0dHBzOiAvL2FudC5kZXNpZ25cIiwgXCJhdmF0YXJcIjogXCJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZ1wiLCBcIm5hbWVcIjogXCJUcmFkZUNvZGUgODVcIiwgXCJvd25lclwiOiBcIuabsuS4veS4vVwiLCBcImRlc2NcIjogXCLov5nmmK/kuIDmrrXmj4/ov7BcIiwgXCJjYWxsTm9cIjogNzA1LCBcInN0YXR1c1wiOiBcIjNcIiwgXCJ1cGRhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcImNyZWF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwicHJvZ3Jlc3NcIjogMTJ9LCB7XCJrZXlcIjogODQsIFwiZGlzYWJsZWRcIjogdHJ1ZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA4NFwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiAyMDMsIFwic3RhdHVzXCI6IFwiMFwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA3OX0sIHtcImtleVwiOiA4MywgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA4M1wiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA0OTEsIFwic3RhdHVzXCI6IFwiMlwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA1OX0sIHtcImtleVwiOiA4MiwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA4MlwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA3MywgXCJzdGF0dXNcIjogXCIwXCIsIFwidXBkYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJjcmVhdGVkQXRcIjogXCIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWlwiLCBcInByb2dyZXNzXCI6IDEwMH0sIHtcImtleVwiOiA4MSwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA4MVwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiA0MDYsIFwic3RhdHVzXCI6IFwiM1wiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiA2MX0sIHtcImtleVwiOiA4MCwgXCJkaXNhYmxlZFwiOiBmYWxzZSwgXCJocmVmXCI6IFwiaHR0cHM6IC8vYW50LmRlc2lnblwiLCBcImF2YXRhclwiOiBcImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nXCIsIFwibmFtZVwiOiBcIlRyYWRlQ29kZSA4MFwiLCBcIm93bmVyXCI6IFwi5puy5Li95Li9XCIsIFwiZGVzY1wiOiBcIui/meaYr+S4gOauteaPj+i/sFwiLCBcImNhbGxOb1wiOiAxMTIsIFwic3RhdHVzXCI6IFwiMlwiLCBcInVwZGF0ZWRBdFwiOiBcIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaXCIsIFwiY3JlYXRlZEF0XCI6IFwiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFpcIiwgXCJwcm9ncmVzc1wiOiAyMH1dICovXG4gICAgICAgIGRhdGE6IHtcbiAgICAgIGtleTogbnVtYmVyLFxuZGlzYWJsZWQ6IGJvb2xlYW4sXG5ocmVmOiBzdHJpbmcsXG5hdmF0YXI6IHN0cmluZyxcbm5hbWU6IHN0cmluZyxcbm93bmVyOiBzdHJpbmcsXG5kZXNjOiBzdHJpbmcsXG5jYWxsTm86IG51bWJlcixcbnN0YXR1czogc3RyaW5nLFxudXBkYXRlZEF0OiBzdHJpbmcsXG5jcmVhdGVkQXQ6IHN0cmluZyxcbnByb2dyZXNzOiBudW1iZXJcbiAgICAgIH1bXTtcbiAgLyoqIGV4YW1wbGU6IDEwMCAqL1xuICAgICAgICB0b3RhbDogbnVtYmVyO1xuICAvKiogZXhhbXBsZTogdHJ1ZSAqL1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAvKiogZXhhbXBsZTogMjAgKi9cbiAgICAgICAgcGFnZVNpemU6IG51bWJlcjtcbiAgLyoqIGV4YW1wbGU6IDEgKi9cbiAgICAgICAgY3VycmVudDogbnVtYmVyXG59XG4gICIKKyAgfSwKKyAgIlBPU1QgL2FwaS9sb2dpbi9vdXRMb2dpbiI6IHsKKyAgICAicmVzIjogeworICAgICAgImRhdGEiOiB7fSwKKyAgICAgICJzdWNjZXNzIjogdHJ1ZQorICAgIH0sCisgICAgInF1ZXJ5IjogeworICAgICAgInRva2VuICI6ICIgMTIzIgorICAgIH0sCisgICAgInBheWxvYWQiOiB7fSwKKyAgICAidHlwZXMiOiAiLyoqIFBPU1QgL2FwaS9sb2dpbi9vdXRMb2dpbiAqL1xuZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fT1VUX0xPR0lOX1FVRVJZID0ge1xuICAvKiogZXhhbXBsZTogIDEyMyAqL1xuICAgICAgICB0b2tlbiA6IHN0cmluZ1xufVxuICBcblxuZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fT1VUX0xPR0lOX1BBWUxPQUQgPSB7XG4gIFxufVxuICBcblxuZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fT1VUX0xPR0lOX1JFUyA9IHtcbiAgLyoqIGV4YW1wbGU6IHt9ICovXG4gICAgICAgIGRhdGE6IHtcbiAgICAgIFxuICAgICAgfTtcbiAgLyoqIGV4YW1wbGU6IHRydWUgKi9cbiAgICAgICAgc3VjY2VzczogYm9vbGVhblxufVxuICAiCisgIH0sCisgICJQT1NUIC9hcGkvbG9naW4vYWNjb3VudCI6IHsKKyAgICAicmVzIjogeworICAgICAgInN0YXR1cyI6ICJvayIsCisgICAgICAidHlwZSI6ICJhY2NvdW50IiwKKyAgICAgICJjdXJyZW50QXV0aG9yaXR5IjogImFkbWluIgorICAgIH0sCisgICAgInF1ZXJ5IjogeworICAgICAgInRva2VuICI6ICIgMTIzIgorICAgIH0sCisgICAgInBheWxvYWQiOiB7CisgICAgICAidXNlcm5hbWUiOiAiYWRtaW4iLAorICAgICAgInBhc3N3b3JkIjogImFudC5kZXNpZ24iLAorICAgICAgImF1dG9Mb2dpbiI6IHRydWUsCisgICAgICAidHlwZSI6ICJhY2NvdW50IgorICAgIH0sCisgICAgInR5cGVzIjogIi8qKiBQT1NUIC9hcGkvbG9naW4vYWNjb3VudCAqL1xuZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fQUNDT1VOVF9RVUVSWSA9IHtcbiAgLyoqIGV4YW1wbGU6ICAxMjMgKi9cbiAgICAgICAgdG9rZW4gOiBzdHJpbmdcbn1cbiAgXG5cbmV4cG9ydCB0eXBlIFBPU1RfQVBJX0xPR0lOX0FDQ09VTlRfUEFZTE9BRCA9IHtcbiAgLyoqIGV4YW1wbGU6IGFkbWluICovXG4gICAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKiBleGFtcGxlOiBhbnQuZGVzaWduICovXG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gIC8qKiBleGFtcGxlOiB0cnVlICovXG4gICAgICAgIGF1dG9Mb2dpbjogYm9vbGVhbjtcbiAgLyoqIGV4YW1wbGU6IGFjY291bnQgKi9cbiAgICAgICAgdHlwZTogc3RyaW5nXG59XG4gIFxuXG5leHBvcnQgdHlwZSBQT1NUX0FQSV9MT0dJTl9BQ0NPVU5UX1JFUyA9IHtcbiAgLyoqIGV4YW1wbGU6IG9rICovXG4gICAgICAgIHN0YXR1czogc3RyaW5nO1xuICAvKiogZXhhbXBsZTogYWNjb3VudCAqL1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBleGFtcGxlOiBhZG1pbiAqL1xuICAgICAgICBjdXJyZW50QXV0aG9yaXR5OiBzdHJpbmdcbn1cbiAgIgorICB9Cit9CmRpZmYgLS1naXQgYS9yZWFjdC11aS90eXBlcy9jYWNoZS9tb2NrL2xvZ2luLm1vY2suY2FjaGUuanMgYi9yZWFjdC11aS90eXBlcy9jYWNoZS9tb2NrL2xvZ2luLm1vY2suY2FjaGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OWUxOQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWN0LXVpL3R5cGVzL2NhY2hlL21vY2svbG9naW4ubW9jay5jYWNoZS5qcwpAQCAtMCwwICsxLDMyNCBAQAorbW9kdWxlLmV4cG9ydHMgPSB7CisgICdHRVQgL2FwaS9jdXJyZW50VXNlcic6IHsKKyAgICBkYXRhOiB7CisgICAgICBuYW1lOiAnU2VyYXRpIE1hJywKKyAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9CaWF6ZmFueG1hbU5Sb3h4VnhrYS5wbmcnLAorICAgICAgdXNlcmlkOiAnMDAwMDAwMDEnLAorICAgICAgZW1haWw6ICdhbnRkZXNpZ25AYWxpcGF5LmNvbScsCisgICAgICBzaWduYXR1cmU6ICfmtbfnurPnmb7lt53vvIzmnInlrrnkuYPlpKcnLAorICAgICAgdGl0bGU6ICfkuqTkupLkuJPlrrYnLAorICAgICAgZ3JvdXA6ICfomoLomoHph5HmnI3vvI3mn5Dmn5Dmn5DkuovkuJrnvqTvvI3mn5Dmn5DlubPlj7Dpg6jvvI3mn5Dmn5DmioDmnK/pg6jvvI1VRUQnLAorICAgICAgdGFnczogWworICAgICAgICB7IGtleTogJzAnLCBsYWJlbDogJ+W+iOacieaDs+azleeahCcgfSwKKyAgICAgICAgeyBrZXk6ICcxJywgbGFiZWw6ICfkuJPms6jorr7orqEnIH0sCisgICAgICAgIHsga2V5OiAnMicsIGxhYmVsOiAn6L6jficgfSwKKyAgICAgICAgeyBrZXk6ICczJywgbGFiZWw6ICflpKfplb/ohb8nIH0sCisgICAgICAgIHsga2V5OiAnNCcsIGxhYmVsOiAn5bed5aa55a2QJyB9LAorICAgICAgICB7IGtleTogJzUnLCBsYWJlbDogJ+a1t+e6s+eZvuW3nScgfSwKKyAgICAgIF0sCisgICAgICBub3RpZnlDb3VudDogMTIsCisgICAgICB1bnJlYWRDb3VudDogMTEsCisgICAgICBjb3VudHJ5OiAnQ2hpbmEnLAorICAgICAgZ2VvZ3JhcGhpYzogeworICAgICAgICBwcm92aW5jZTogeyBsYWJlbDogJ+a1meaxn+ecgScsIGtleTogJzMzMDAwMCcgfSwKKyAgICAgICAgY2l0eTogeyBsYWJlbDogJ+adreW3nuW4gicsIGtleTogJzMzMDEwMCcgfSwKKyAgICAgIH0sCisgICAgICBhZGRyZXNzOiAn6KW/5rmW5Yy65bel5LiT6LevIDc3IOWPtycsCisgICAgICBwaG9uZTogJzA3NTItMjY4ODg4ODg4JywKKyAgICB9LAorICB9LAorICAnR0VUIC9hcGkvcnVsZSc6IHsKKyAgICBkYXRhOiBbCisgICAgICB7CisgICAgICAgIGtleTogOTksCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDk5JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA1MDMsCisgICAgICAgIHN0YXR1czogJzAnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogODEsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDk4LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5OCcsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMTY0LAorICAgICAgICBzdGF0dXM6ICcwJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDEyLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5NywKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTcnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDE3NCwKKyAgICAgICAgc3RhdHVzOiAnMScsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA4MSwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTYsCisgICAgICAgIGRpc2FibGVkOiB0cnVlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTYnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDkxNCwKKyAgICAgICAgc3RhdHVzOiAnMCcsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA3LAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5NSwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTUnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDY5OCwKKyAgICAgICAgc3RhdHVzOiAnMicsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA4MiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTQsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDk0JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA0ODgsCisgICAgICAgIHN0YXR1czogJzEnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMTQsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDkzLAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA5MycsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogNTgwLAorICAgICAgICBzdGF0dXM6ICcyJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDc3LAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA5MiwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgOTInLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDI0NCwKKyAgICAgICAgc3RhdHVzOiAnMycsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA1OCwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogOTEsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDkxJywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA5NTksCisgICAgICAgIHN0YXR1czogJzAnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogNjYsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDkwLAorICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDkwJywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA5NTgsCisgICAgICAgIHN0YXR1czogJzAnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogNzIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDg5LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4OScsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMzAxLAorICAgICAgICBzdGF0dXM6ICcyJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDg4LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4OCcsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMjc3LAorICAgICAgICBzdGF0dXM6ICcxJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDEyLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4NywKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgODcnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDgxMCwKKyAgICAgICAgc3RhdHVzOiAnMScsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA4MiwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODYsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDg2JywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA3ODAsCisgICAgICAgIHN0YXR1czogJzMnLAorICAgICAgICB1cGRhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBjcmVhdGVkQXQ6ICcyMDIyLTEyLTA2VDA1OjAwOjU3LjA0MFonLAorICAgICAgICBwcm9ncmVzczogMjIsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDg1LAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4NScsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogNzA1LAorICAgICAgICBzdGF0dXM6ICczJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDEyLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4NCwKKyAgICAgICAgZGlzYWJsZWQ6IHRydWUsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4NCcsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogMjAzLAorICAgICAgICBzdGF0dXM6ICcwJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDc5LAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4MywKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgODMnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDQ5MSwKKyAgICAgICAgc3RhdHVzOiAnMicsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiA1OSwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgIGtleTogODIsCisgICAgICAgIGRpc2FibGVkOiBmYWxzZSwKKyAgICAgICAgaHJlZjogJ2h0dHBzOi8vYW50LmRlc2lnbicsCisgICAgICAgIGF2YXRhcjogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmcnLAorICAgICAgICBuYW1lOiAnVHJhZGVDb2RlIDgyJywKKyAgICAgICAgb3duZXI6ICfmm7LkuL3kuL0nLAorICAgICAgICBkZXNjOiAn6L+Z5piv5LiA5q615o+P6L+wJywKKyAgICAgICAgY2FsbE5vOiA3MywKKyAgICAgICAgc3RhdHVzOiAnMCcsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiAxMDAsCisgICAgICB9LAorICAgICAgeworICAgICAgICBrZXk6IDgxLAorICAgICAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgICAgIGhyZWY6ICdodHRwczovL2FudC5kZXNpZ24nLAorICAgICAgICBhdmF0YXI6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nJywKKyAgICAgICAgbmFtZTogJ1RyYWRlQ29kZSA4MScsCisgICAgICAgIG93bmVyOiAn5puy5Li95Li9JywKKyAgICAgICAgZGVzYzogJ+i/meaYr+S4gOauteaPj+i/sCcsCisgICAgICAgIGNhbGxObzogNDA2LAorICAgICAgICBzdGF0dXM6ICczJywKKyAgICAgICAgdXBkYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgY3JlYXRlZEF0OiAnMjAyMi0xMi0wNlQwNTowMDo1Ny4wNDBaJywKKyAgICAgICAgcHJvZ3Jlc3M6IDYxLAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAga2V5OiA4MCwKKyAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAgICAgICBocmVmOiAnaHR0cHM6Ly9hbnQuZGVzaWduJywKKyAgICAgICAgYXZhdGFyOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZycsCisgICAgICAgIG5hbWU6ICdUcmFkZUNvZGUgODAnLAorICAgICAgICBvd25lcjogJ+absuS4veS4vScsCisgICAgICAgIGRlc2M6ICfov5nmmK/kuIDmrrXmj4/ov7AnLAorICAgICAgICBjYWxsTm86IDExMiwKKyAgICAgICAgc3RhdHVzOiAnMicsCisgICAgICAgIHVwZGF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIGNyZWF0ZWRBdDogJzIwMjItMTItMDZUMDU6MDA6NTcuMDQwWicsCisgICAgICAgIHByb2dyZXNzOiAyMCwKKyAgICAgIH0sCisgICAgXSwKKyAgICB0b3RhbDogMTAwLAorICAgIHN1Y2Nlc3M6IHRydWUsCisgICAgcGFnZVNpemU6IDIwLAorICAgIGN1cnJlbnQ6IDEsCisgIH0sCisgICdQT1NUIC9hcGkvbG9naW4vb3V0TG9naW4nOiB7IGRhdGE6IHt9LCBzdWNjZXNzOiB0cnVlIH0sCisgICdQT1NUIC9hcGkvbG9naW4vYWNjb3VudCc6IHsKKyAgICBzdGF0dXM6ICdvaycsCisgICAgdHlwZTogJ2FjY291bnQnLAorICAgIGN1cnJlbnRBdXRob3JpdHk6ICdhZG1pbicsCisgIH0sCit9OwpkaWZmIC0tZ2l0IGEvcmVhY3QtdWkvdHlwZXMvY2FjaGUvbW9jay9tb2NrLmNhY2hlLmpzIGIvcmVhY3QtdWkvdHlwZXMvY2FjaGUvbW9jay9tb2NrLmNhY2hlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS90eXBlcy9jYWNoZS9tb2NrL21vY2suY2FjaGUuanMKZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3R5cGVzL2luZGV4LmQudHMgYi9yZWFjdC11aS90eXBlcy9pbmRleC5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjgwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS90eXBlcy9pbmRleC5kLnRzCkBAIC0wLDAgKzEsMTIwIEBACitleHBvcnQgbmFtZXNwYWNlIEFQSSB7CisgIC8qKiBHRVQgL2FwaS9jdXJyZW50VXNlciAqLworICBleHBvcnQgdHlwZSBHRVRfQVBJX0NVUlJFTlRfVVNFUl9RVUVSWSA9IHsKKyAgICAvKiogZXhhbXBsZTogIDEyMyAqLworICAgIHRva2VuOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgR0VUX0FQSV9DVVJSRU5UX1VTRVJfUEFZTE9BRCA9IFJlY29yZDxzdHJpbmcsIGFueT47CisKKyAgZXhwb3J0IHR5cGUgR0VUX0FQSV9DVVJSRU5UX1VTRVJfUkVTID0geworICAgIC8qKiBleGFtcGxlOiB7Im5hbWUiOiAiU2VyYXRpIE1hIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL0JpYXpmYW54bWFtTlJveHhWeGthLnBuZyIsICJ1c2VyaWQiOiAiMDAwMDAwMDEiLCAiZW1haWwiOiAiYW50ZGVzaWduQGFsaXBheS5jb20iLCAic2lnbmF0dXJlIjogIua1t+e6s+eZvuW3ne+8jOacieWuueS5g+WkpyIsICJ0aXRsZSI6ICLkuqTkupLkuJPlrrYiLCAiZ3JvdXAiOiAi6JqC6JqB6YeR5pyN77yN5p+Q5p+Q5p+Q5LqL5Lia576k77yN5p+Q5p+Q5bmz5Y+w6YOo77yN5p+Q5p+Q5oqA5pyv6YOo77yNVUVEIiwgInRhZ3MiOiBbeyJrZXkiOiAiMCIsICJsYWJlbCI6ICLlvojmnInmg7Pms5XnmoQifSwgeyJrZXkiOiAiMSIsICJsYWJlbCI6ICLkuJPms6jorr7orqEifSwgeyJrZXkiOiAiMiIsICJsYWJlbCI6ICLovqN+In0sIHsia2V5IjogIjMiLCAibGFiZWwiOiAi5aSn6ZW/6IW/In0sIHsia2V5IjogIjQiLCAibGFiZWwiOiAi5bed5aa55a2QIn0sIHsia2V5IjogIjUiLCAibGFiZWwiOiAi5rW357qz55m+5bedIn1dLCAibm90aWZ5Q291bnQiOiAxMiwgInVucmVhZENvdW50IjogMTEsICJjb3VudHJ5IjogIkNoaW5hIiwgImdlb2dyYXBoaWMiOiB7InByb3ZpbmNlIjogeyJsYWJlbCI6ICLmtZnmsZ/nnIEiLCAia2V5IjogIjMzMDAwMCJ9LCAiY2l0eSI6IHsibGFiZWwiOiAi5p2t5bee5biCIiwgImtleSI6ICIzMzAxMDAifX0sICJhZGRyZXNzIjogIuilv+a5luWMuuW3peS4k+i3ryA3NyDlj7ciLCAicGhvbmUiOiAiMDc1Mi0yNjg4ODg4ODgifSAqLworICAgIGRhdGE6IHsKKyAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgIGF2YXRhcjogc3RyaW5nOworICAgICAgdXNlcmlkOiBzdHJpbmc7CisgICAgICBlbWFpbDogc3RyaW5nOworICAgICAgc2lnbmF0dXJlOiBzdHJpbmc7CisgICAgICB0aXRsZTogc3RyaW5nOworICAgICAgZ3JvdXA6IHN0cmluZzsKKyAgICAgIHRhZ3M6IHsKKyAgICAgICAga2V5OiBzdHJpbmc7CisgICAgICAgIGxhYmVsOiBzdHJpbmc7CisgICAgICB9W107CisgICAgICBub3RpZnlDb3VudDogbnVtYmVyOworICAgICAgdW5yZWFkQ291bnQ6IG51bWJlcjsKKyAgICAgIGNvdW50cnk6IHN0cmluZzsKKyAgICAgIGdlb2dyYXBoaWM6IHsKKyAgICAgICAgcHJvdmluY2U6IHsKKyAgICAgICAgICBsYWJlbDogc3RyaW5nOworICAgICAgICAgIGtleTogc3RyaW5nOworICAgICAgICB9OworICAgICAgICBjaXR5OiB7CisgICAgICAgICAgbGFiZWw6IHN0cmluZzsKKyAgICAgICAgICBrZXk6IHN0cmluZzsKKyAgICAgICAgfTsKKyAgICAgIH07CisgICAgICBhZGRyZXNzOiBzdHJpbmc7CisgICAgICBwaG9uZTogc3RyaW5nOworICAgIH07CisgIH07CisKKyAgLyoqIEdFVCAvYXBpL3J1bGUgKi8KKyAgZXhwb3J0IHR5cGUgR0VUX0FQSV9SVUxFX1FVRVJZID0geworICAgIC8qKiBleGFtcGxlOiAgMTIzICovCisgICAgdG9rZW46IHN0cmluZzsKKyAgICAvKiogZXhhbXBsZTogMSAqLworICAgIGN1cnJlbnQ6IHN0cmluZzsKKyAgICAvKiogZXhhbXBsZTogMjAgKi8KKyAgICBwYWdlU2l6ZTogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIEdFVF9BUElfUlVMRV9QQVlMT0FEID0gUmVjb3JkPHN0cmluZywgYW55PjsKKworICBleHBvcnQgdHlwZSBHRVRfQVBJX1JVTEVfUkVTID0geworICAgIC8qKiBleGFtcGxlOiBbeyJrZXkiOiA5OSwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDk5IiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiA1MDMsICJzdGF0dXMiOiAiMCIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogODF9LCB7ImtleSI6IDk4LCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgOTgiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDE2NCwgInN0YXR1cyI6ICIwIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiAxMn0sIHsia2V5IjogOTcsICJkaXNhYmxlZCI6IGZhbHNlLCAiaHJlZiI6ICJodHRwczogLy9hbnQuZGVzaWduIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsICJuYW1lIjogIlRyYWRlQ29kZSA5NyIsICJvd25lciI6ICLmm7LkuL3kuL0iLCAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLCAiY2FsbE5vIjogMTc0LCAic3RhdHVzIjogIjEiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDgxfSwgeyJrZXkiOiA5NiwgImRpc2FibGVkIjogdHJ1ZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgOTYiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDkxNCwgInN0YXR1cyI6ICIwIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiA3fSwgeyJrZXkiOiA5NSwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDk1IiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiA2OTgsICJzdGF0dXMiOiAiMiIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogODJ9LCB7ImtleSI6IDk0LCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgOTQiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDQ4OCwgInN0YXR1cyI6ICIxIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiAxNH0sIHsia2V5IjogOTMsICJkaXNhYmxlZCI6IGZhbHNlLCAiaHJlZiI6ICJodHRwczogLy9hbnQuZGVzaWduIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsICJuYW1lIjogIlRyYWRlQ29kZSA5MyIsICJvd25lciI6ICLmm7LkuL3kuL0iLCAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLCAiY2FsbE5vIjogNTgwLCAic3RhdHVzIjogIjIiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDc3fSwgeyJrZXkiOiA5MiwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDkyIiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiAyNDQsICJzdGF0dXMiOiAiMyIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogNTh9LCB7ImtleSI6IDkxLCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgOTEiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDk1OSwgInN0YXR1cyI6ICIwIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiA2Nn0sIHsia2V5IjogOTAsICJkaXNhYmxlZCI6IHRydWUsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDkwIiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiA5NTgsICJzdGF0dXMiOiAiMCIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogNzJ9LCB7ImtleSI6IDg5LCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgODkiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDMwMSwgInN0YXR1cyI6ICIyIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiAyfSwgeyJrZXkiOiA4OCwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDg4IiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiAyNzcsICJzdGF0dXMiOiAiMSIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogMTJ9LCB7ImtleSI6IDg3LCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC91ZHhBYk1FaHB3dGhWVmNqTFhpay5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgODciLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDgxMCwgInN0YXR1cyI6ICIxIiwgInVwZGF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJjcmVhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAicHJvZ3Jlc3MiOiA4Mn0sIHsia2V5IjogODYsICJkaXNhYmxlZCI6IGZhbHNlLCAiaHJlZiI6ICJodHRwczogLy9hbnQuZGVzaWduIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZyIsICJuYW1lIjogIlRyYWRlQ29kZSA4NiIsICJvd25lciI6ICLmm7LkuL3kuL0iLCAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLCAiY2FsbE5vIjogNzgwLCAic3RhdHVzIjogIjMiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDIyfSwgeyJrZXkiOiA4NSwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDg1IiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiA3MDUsICJzdGF0dXMiOiAiMyIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogMTJ9LCB7ImtleSI6IDg0LCAiZGlzYWJsZWQiOiB0cnVlLCAiaHJlZiI6ICJodHRwczogLy9hbnQuZGVzaWduIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL2VlSE1hWkJ3bVR2TGRJd01mQnBnLnBuZyIsICJuYW1lIjogIlRyYWRlQ29kZSA4NCIsICJvd25lciI6ICLmm7LkuL3kuL0iLCAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLCAiY2FsbE5vIjogMjAzLCAic3RhdHVzIjogIjAiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDc5fSwgeyJrZXkiOiA4MywgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvdWR4QWJNRWhwd3RoVlZjakxYaWsucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDgzIiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiA0OTEsICJzdGF0dXMiOiAiMiIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogNTl9LCB7ImtleSI6IDgyLCAiZGlzYWJsZWQiOiBmYWxzZSwgImhyZWYiOiAiaHR0cHM6IC8vYW50LmRlc2lnbiIsICJhdmF0YXIiOiAiaHR0cHM6IC8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL3Jtc3BvcnRhbC9lZUhNYVpCd21UdkxkSXdNZkJwZy5wbmciLCAibmFtZSI6ICJUcmFkZUNvZGUgODIiLCAib3duZXIiOiAi5puy5Li95Li9IiwgImRlc2MiOiAi6L+Z5piv5LiA5q615o+P6L+wIiwgImNhbGxObyI6IDczLCAic3RhdHVzIjogIjAiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDEwMH0sIHsia2V5IjogODEsICJkaXNhYmxlZCI6IGZhbHNlLCAiaHJlZiI6ICJodHRwczogLy9hbnQuZGVzaWduIiwgImF2YXRhciI6ICJodHRwczogLy9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3Mvcm1zcG9ydGFsL3VkeEFiTUVocHd0aFZWY2pMWGlrLnBuZyIsICJuYW1lIjogIlRyYWRlQ29kZSA4MSIsICJvd25lciI6ICLmm7LkuL3kuL0iLCAiZGVzYyI6ICLov5nmmK/kuIDmrrXmj4/ov7AiLCAiY2FsbE5vIjogNDA2LCAic3RhdHVzIjogIjMiLCAidXBkYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgImNyZWF0ZWRBdCI6ICIyMDIyLTEyLTA2VDA1OiAwMDogNTcuMDQwWiIsICJwcm9ncmVzcyI6IDYxfSwgeyJrZXkiOiA4MCwgImRpc2FibGVkIjogZmFsc2UsICJocmVmIjogImh0dHBzOiAvL2FudC5kZXNpZ24iLCAiYXZhdGFyIjogImh0dHBzOiAvL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ybXNwb3J0YWwvZWVITWFaQndtVHZMZEl3TWZCcGcucG5nIiwgIm5hbWUiOiAiVHJhZGVDb2RlIDgwIiwgIm93bmVyIjogIuabsuS4veS4vSIsICJkZXNjIjogIui/meaYr+S4gOauteaPj+i/sCIsICJjYWxsTm8iOiAxMTIsICJzdGF0dXMiOiAiMiIsICJ1cGRhdGVkQXQiOiAiMjAyMi0xMi0wNlQwNTogMDA6IDU3LjA0MFoiLCAiY3JlYXRlZEF0IjogIjIwMjItMTItMDZUMDU6IDAwOiA1Ny4wNDBaIiwgInByb2dyZXNzIjogMjB9XSAqLworICAgIGRhdGE6IHsKKyAgICAgIGtleTogbnVtYmVyOworICAgICAgZGlzYWJsZWQ6IGJvb2xlYW47CisgICAgICBocmVmOiBzdHJpbmc7CisgICAgICBhdmF0YXI6IHN0cmluZzsKKyAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgIG93bmVyOiBzdHJpbmc7CisgICAgICBkZXNjOiBzdHJpbmc7CisgICAgICBjYWxsTm86IG51bWJlcjsKKyAgICAgIHN0YXR1czogc3RyaW5nOworICAgICAgdXBkYXRlZEF0OiBzdHJpbmc7CisgICAgICBjcmVhdGVkQXQ6IHN0cmluZzsKKyAgICAgIHByb2dyZXNzOiBudW1iZXI7CisgICAgfVtdOworICAgIC8qKiBleGFtcGxlOiAxMDAgKi8KKyAgICB0b3RhbDogbnVtYmVyOworICAgIC8qKiBleGFtcGxlOiB0cnVlICovCisgICAgc3VjY2VzczogYm9vbGVhbjsKKyAgICAvKiogZXhhbXBsZTogMjAgKi8KKyAgICBwYWdlU2l6ZTogbnVtYmVyOworICAgIC8qKiBleGFtcGxlOiAxICovCisgICAgY3VycmVudDogbnVtYmVyOworICB9OworCisgIC8qKiBQT1NUIC9hcGkvbG9naW4vb3V0TG9naW4gKi8KKyAgZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fT1VUX0xPR0lOX1FVRVJZID0geworICAgIC8qKiBleGFtcGxlOiAgMTIzICovCisgICAgdG9rZW46IHN0cmluZzsKKyAgfTsKKworICBleHBvcnQgdHlwZSBQT1NUX0FQSV9MT0dJTl9PVVRfTE9HSU5fUEFZTE9BRCA9IFJlY29yZDxzdHJpbmcsIGFueT47CisKKyAgZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fT1VUX0xPR0lOX1JFUyA9IHsKKyAgICAvKiogZXhhbXBsZToge30gKi8KKyAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OworICAgIC8qKiBleGFtcGxlOiB0cnVlICovCisgICAgc3VjY2VzczogYm9vbGVhbjsKKyAgfTsKKworICAvKiogUE9TVCAvYXBpL2xvZ2luL2FjY291bnQgKi8KKyAgZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fQUNDT1VOVF9RVUVSWSA9IHsKKyAgICAvKiogZXhhbXBsZTogIDEyMyAqLworICAgIHRva2VuOiBzdHJpbmc7CisgIH07CisKKyAgZXhwb3J0IHR5cGUgUE9TVF9BUElfTE9HSU5fQUNDT1VOVF9QQVlMT0FEID0geworICAgIC8qKiBleGFtcGxlOiBhZG1pbiAqLworICAgIHVzZXJuYW1lOiBzdHJpbmc7CisgICAgLyoqIGV4YW1wbGU6IGFudC5kZXNpZ24gKi8KKyAgICBwYXNzd29yZDogc3RyaW5nOworICAgIC8qKiBleGFtcGxlOiB0cnVlICovCisgICAgYXV0b0xvZ2luOiBib29sZWFuOworICAgIC8qKiBleGFtcGxlOiBhY2NvdW50ICovCisgICAgdHlwZTogc3RyaW5nOworICB9OworCisgIGV4cG9ydCB0eXBlIFBPU1RfQVBJX0xPR0lOX0FDQ09VTlRfUkVTID0geworICAgIC8qKiBleGFtcGxlOiBvayAqLworICAgIHN0YXR1czogc3RyaW5nOworICAgIC8qKiBleGFtcGxlOiBhY2NvdW50ICovCisgICAgdHlwZTogc3RyaW5nOworICAgIC8qKiBleGFtcGxlOiBhZG1pbiAqLworICAgIGN1cnJlbnRBdXRob3JpdHk6IHN0cmluZzsKKyAgfTsKK30KZGlmZiAtLWdpdCBhL3JlYWN0LXVpL3R5cGVzL3JvdXRlLmQudHMgYi9yZWFjdC11aS90eXBlcy9yb3V0ZS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzUxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFjdC11aS90eXBlcy9yb3V0ZS5kLnRzCkBAIC0wLDAgKzEsMTggQEAKK2RlY2xhcmUgbmFtZXNwYWNlIEFQSSB7CisgIHR5cGUgUm91dGVyc01lbnVJdGVtID0geworICAgIGFsd2F5c1Nob3c/OiBib29sZWFuOworICAgIGNoaWxkcmVuPzogUm91dGVyc01lbnVJdGVtW107CisgICAgY29tcG9uZW50Pzogc3RyaW5nOworICAgIGhpZGRlbj86IGJvb2xlYW47CisgICAgbWV0YTogTWVudUl0ZW1NZXRhOworICAgIG5hbWU6IHN0cmluZzsKKyAgICBwYXRoOiBzdHJpbmc7CisgICAgcmVkaXJlY3Q/OiBzdHJpbmc7CisgICAgW2tleTogc3RyaW5nXTogYW55OworICB9OworICBpbnRlcmZhY2UgR2V0Um91dGVyc1Jlc3VsdCB7CisgICAgY29kZTogbnVtYmVyOworICAgIG1zZzogc3RyaW5nOworICAgIGRhdGE6IFJvdXRlcnNNZW51SXRlbVtdOworICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9wb20ueG1sIGIvcnVveWktYWRtaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTU1MzJkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vcG9tLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4zLjguODwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8YXJ0aWZhY3RJZD5ydW95aS1hZG1pbjwvYXJ0aWZhY3RJZD4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgd2Vi5pyN5Yqh5YWl5Y+jCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPCEtLSBzcHJpbmctYm9vdC1kZXZ0b29scyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1kZXZ0b29sczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4gPCEtLSDooajnpLrkvp3otZbkuI3kvJrkvKDpgJIgLS0+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHNwcmluZy1kb2MgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2RvYzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZ2RvYy1vcGVuYXBpLXN0YXJ0ZXItd2VibXZjLXVpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgIDwhLS0gTXlzcWzpqbHliqjljIUgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLm15c3FsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlzcWwtY29ubmVjdG9yLWo8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIOaguOW/g+aooeWdly0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5ydW95aTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJ1b3lpLWZyYW1ld29yazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0g5a6a5pe25Lu75YqhLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktcXVhcnR6PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSDku6PnoIHnlJ/miJAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aS1nZW5lcmF0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjUuMTU8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrPnRydWU8L2Zvcms+IDwhLS0g5aaC5p6c5rKh5pyJ6K+l6YWN572u77yMZGV2dG9vbHPkuI3kvJrnlJ/mlYggLS0+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlcGFja2FnZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4gICAKKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+ICAgCisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4gICAKKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4gICAKKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgICAgIDx3YXJOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvd2FyTmFtZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgCisgICAgICAgICAgIDwvcGx1Z2luPiAgIAorICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL1J1b1lpQXBwbGljYXRpb24uamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL1J1b1lpQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmViNmYxCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvUnVvWWlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LlNwcmluZ0FwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5hdXRvY29uZmlndXJlLlNwcmluZ0Jvb3RBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5qZGJjLkRhdGFTb3VyY2VBdXRvQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiDlkK/liqjnqIvluo8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU3ByaW5nQm9vdEFwcGxpY2F0aW9uKGV4Y2x1ZGUgPSB7IERhdGFTb3VyY2VBdXRvQ29uZmlndXJhdGlvbi5jbGFzcyB9KQorcHVibGljIGNsYXNzIFJ1b1lpQXBwbGljYXRpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgLy8gU3lzdGVtLnNldFByb3BlcnR5KCJzcHJpbmcuZGV2dG9vbHMucmVzdGFydC5lbmFibGVkIiwgImZhbHNlIik7CisgICAgICAgIFNwcmluZ0FwcGxpY2F0aW9uLnJ1bihSdW9ZaUFwcGxpY2F0aW9uLmNsYXNzLCBhcmdzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIo4pml4peg4oC/4pegKe++ie++niAg6Iul5L6d5ZCv5Yqo5oiQ5YqfICAg4YOaKMK02qFg4YOaKe++niAgXG4iICsKKyAgICAgICAgICAgICAgICAiIC4tLS0tLS0tLiAgICAgICBfX19fICAgICBfXyAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgIF8gXyAgIFxcICAgICAgXFwgICBcXCAgIC8gIC8gICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgKCAnICkgIHwgICAgICAgXFwgIF8uIC8gICcgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwoXyBvIF8pIC8gICAgICAgIF8oIClfIC4nICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgKF8sXykuJyBfXyAgX19fKF8gbyBfKScgICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgIHxcXCBcXCAgfCAgfHwgICB8KF8sXyknICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgIHwgXFwgYCcgICAvfCAgIGAtJyAgLyAgICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiIHwgIHwgIFxcICAgIC8gIFxcICAgICAgLyAgICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiICcnLScgICBgJy0nICAgIGAtLi4tJyAgICAgICAgICAgICAgIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvUnVvWWlTZXJ2bGV0SW5pdGlhbGl6ZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL1J1b1lpU2VydmxldEluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlNjdkYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL1J1b1lpU2VydmxldEluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20ucnVveWk7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYnVpbGRlci5TcHJpbmdBcHBsaWNhdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LndlYi5zZXJ2bGV0LnN1cHBvcnQuU3ByaW5nQm9vdFNlcnZsZXRJbml0aWFsaXplcjsKKworLyoqCisgKiB3ZWLlrrnlmajkuK3ov5vooYzpg6jnvbIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgUnVvWWlTZXJ2bGV0SW5pdGlhbGl6ZXIgZXh0ZW5kcyBTcHJpbmdCb290U2VydmxldEluaXRpYWxpemVyCit7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNwcmluZ0FwcGxpY2F0aW9uQnVpbGRlciBjb25maWd1cmUoU3ByaW5nQXBwbGljYXRpb25CdWlsZGVyIGFwcGxpY2F0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uLnNvdXJjZXMoUnVvWWlBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJQcm9qZWN0Q29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJQcm9qZWN0Q29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Y2VhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2NvbnRyb2xsZXIvVHJhY2tlclByb2plY3RDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuY29udHJvbGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUHV0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uRGVsZXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUGF0aFZhcmlhYmxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLmRvbWFpbi5UcmFja2VyUHJvamVjdDsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlLklUcmFja2VyUHJvamVjdFNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CisKKy8qKgorICog6aG555uuQ29udHJvbGxlcgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvdHJhY2tlci9wcm9qZWN0IikKK3B1YmxpYyBjbGFzcyBUcmFja2VyUHJvamVjdENvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElUcmFja2VyUHJvamVjdFNlcnZpY2UgdHJhY2tlclByb2plY3RTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog5p+l6K+i6aG555uu5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cHJvamVjdDpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChUcmFja2VyUHJvamVjdCB0cmFja2VyUHJvamVjdCkKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFRyYWNrZXJQcm9qZWN0PiBsaXN0ID0gdHJhY2tlclByb2plY3RTZXJ2aWNlLnNlbGVjdFRyYWNrZXJQcm9qZWN0TGlzdCh0cmFja2VyUHJvamVjdCk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+85Ye66aG555uu5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cHJvamVjdDpleHBvcnQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLpobnnm64iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQb3N0TWFwcGluZygiL2V4cG9ydCIpCisgICAgcHVibGljIHZvaWQgZXhwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFRyYWNrZXJQcm9qZWN0IHRyYWNrZXJQcm9qZWN0KQorICAgIHsKKyAgICAgICAgTGlzdDxUcmFja2VyUHJvamVjdD4gbGlzdCA9IHRyYWNrZXJQcm9qZWN0U2VydmljZS5zZWxlY3RUcmFja2VyUHJvamVjdExpc3QodHJhY2tlclByb2plY3QpOworICAgICAgICBFeGNlbFV0aWw8VHJhY2tlclByb2plY3Q+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFRyYWNrZXJQcm9qZWN0PihUcmFja2VyUHJvamVjdC5jbGFzcyk7CisgICAgICAgIHV0aWwuZXhwb3J0RXhjZWwocmVzcG9uc2UsIGxpc3QsICLpobnnm67mlbDmja4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpobnnm67or6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpwcm9qZWN0OnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97cHJvamVjdElkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlKCJwcm9qZWN0SWQiKSBMb25nIHByb2plY3RJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKHRyYWNrZXJQcm9qZWN0U2VydmljZS5zZWxlY3RUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkKHByb2plY3RJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinumhueebrgorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnByb2plY3Q6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi6aG555uuIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFJlcXVlc3RCb2R5IFRyYWNrZXJQcm9qZWN0IHRyYWNrZXJQcm9qZWN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyUHJvamVjdFNlcnZpY2UuaW5zZXJ0VHJhY2tlclByb2plY3QodHJhY2tlclByb2plY3QpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnpobnnm64KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpwcm9qZWN0OmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLpobnnm64iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAUmVxdWVzdEJvZHkgVHJhY2tlclByb2plY3QgdHJhY2tlclByb2plY3QpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJQcm9qZWN0U2VydmljZS51cGRhdGVUcmFja2VyUHJvamVjdCh0cmFja2VyUHJvamVjdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOmhueebrgorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnByb2plY3Q6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi6aG555uuIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKwlARGVsZXRlTWFwcGluZygiL3twcm9qZWN0SWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIHByb2plY3RJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJQcm9qZWN0U2VydmljZS5kZWxldGVUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkcyhwcm9qZWN0SWRzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJQcm9qZWN0VXNlckNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvY29udHJvbGxlci9UcmFja2VyUHJvamVjdFVzZXJDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhNGFjNQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvY29udHJvbGxlci9UcmFja2VyUHJvamVjdFVzZXJDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuY29udHJvbGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuc2VydmljZS5JVHJhY2tlclByb2plY3RVc2VyU2VydmljZTsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYWNjZXNzLnByZXBvc3QuUHJlQXV0aG9yaXplOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdEJvZHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uTG9nOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5kb21haW4uVHJhY2tlclByb2plY3RVc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZS5UYWJsZURhdGFJbmZvOworCisvKioKKyAqIOmhueebruS4jueUqOaIt+WFs+iBlENvbnRyb2xsZXIKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3RyYWNrZXIvdXNlciIpCitwdWJsaWMgY2xhc3MgVHJhY2tlclByb2plY3RVc2VyQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2UgdHJhY2tlclByb2plY3RVc2VyU2VydmljZTsKKworICAgIC8qKgorICAgICAqIOafpeivoumhueebruS4jueUqOaIt+WFs+iBlOWIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoVHJhY2tlclByb2plY3RVc2VyIHRyYWNrZXJQcm9qZWN0VXNlcikKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFRyYWNrZXJQcm9qZWN0VXNlcj4gbGlzdCA9IHRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2Uuc2VsZWN0VHJhY2tlclByb2plY3RVc2VyTGlzdCh0cmFja2VyUHJvamVjdFVzZXIpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvvOWHuumhueebruS4jueUqOaIt+WFs+iBlOWIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6ZXhwb3J0JykiKQorICAgIEBMb2codGl0bGUgPSAi6aG555uu5LiO55So5oi35YWz6IGUIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBUcmFja2VyUHJvamVjdFVzZXIgdHJhY2tlclByb2plY3RVc2VyKQorICAgIHsKKyAgICAgICAgTGlzdDxUcmFja2VyUHJvamVjdFVzZXI+IGxpc3QgPSB0cmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLnNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlckxpc3QodHJhY2tlclByb2plY3RVc2VyKTsKKyAgICAgICAgRXhjZWxVdGlsPFRyYWNrZXJQcm9qZWN0VXNlcj4gdXRpbCA9IG5ldyBFeGNlbFV0aWw8VHJhY2tlclByb2plY3RVc2VyPihUcmFja2VyUHJvamVjdFVzZXIuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi6aG555uu5LiO55So5oi35YWz6IGU5pWw5o2uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6aG555uu5LiO55So5oi35YWz6IGU6K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06dXNlcjpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve3Byb2plY3RJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldEluZm8oQFBhdGhWYXJpYWJsZSgicHJvamVjdElkIikgTG9uZyBwcm9qZWN0SWQpCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2Vzcyh0cmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLnNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkKHByb2plY3RJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinumhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi6aG555uu5LiO55So5oi35YWz6IGUIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFJlcXVlc3RCb2R5IFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2UuaW5zZXJ0VHJhY2tlclByb2plY3RVc2VyKHRyYWNrZXJQcm9qZWN0VXNlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUuemhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIumhueebruS4jueUqOaIt+WFs+iBlCIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBlZGl0KEBSZXF1ZXN0Qm9keSBUcmFja2VyUHJvamVjdFVzZXIgdHJhY2tlclByb2plY3RVc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLnVwZGF0ZVRyYWNrZXJQcm9qZWN0VXNlcih0cmFja2VyUHJvamVjdFVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIumhueebruS4jueUqOaIt+WFs+iBlCIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisJQERlbGV0ZU1hcHBpbmcoIi97cHJvamVjdElkc30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlIExvbmdbXSBwcm9qZWN0SWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLmRlbGV0ZVRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkcyhwcm9qZWN0SWRzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJUYXNrQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJUYXNrQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWFiODQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2NvbnRyb2xsZXIvVHJhY2tlclRhc2tDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuY29udHJvbGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUHV0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uRGVsZXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUGF0aFZhcmlhYmxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLmRvbWFpbi5UcmFja2VyVGFzazsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlLklUcmFja2VyVGFza1NlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CisKKy8qKgorICog5Lu75YqhQ29udHJvbGxlcgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvdHJhY2tlci90YXNrIikKK3B1YmxpYyBjbGFzcyBUcmFja2VyVGFza0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElUcmFja2VyVGFza1NlcnZpY2UgdHJhY2tlclRhc2tTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog5p+l6K+i5Lu75Yqh5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06dGFzazpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChUcmFja2VyVGFzayB0cmFja2VyVGFzaykKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFRyYWNrZXJUYXNrPiBsaXN0ID0gdHJhY2tlclRhc2tTZXJ2aWNlLnNlbGVjdFRyYWNrZXJUYXNrTGlzdCh0cmFja2VyVGFzayk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+85Ye65Lu75Yqh5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06dGFzazpleHBvcnQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku7vliqEiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQb3N0TWFwcGluZygiL2V4cG9ydCIpCisgICAgcHVibGljIHZvaWQgZXhwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFRyYWNrZXJUYXNrIHRyYWNrZXJUYXNrKQorICAgIHsKKyAgICAgICAgTGlzdDxUcmFja2VyVGFzaz4gbGlzdCA9IHRyYWNrZXJUYXNrU2VydmljZS5zZWxlY3RUcmFja2VyVGFza0xpc3QodHJhY2tlclRhc2spOworICAgICAgICBFeGNlbFV0aWw8VHJhY2tlclRhc2s+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFRyYWNrZXJUYXNrPihUcmFja2VyVGFzay5jbGFzcyk7CisgICAgICAgIHV0aWwuZXhwb3J0RXhjZWwocmVzcG9uc2UsIGxpc3QsICLku7vliqHmlbDmja4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bku7vliqHor6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp0YXNrOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97dGFza0lkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlKCJ0YXNrSWQiKSBMb25nIHRhc2tJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKHRyYWNrZXJUYXNrU2VydmljZS5zZWxlY3RUcmFja2VyVGFza0J5VGFza0lkKHRhc2tJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnRhc2s6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi5Lu75YqhIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFJlcXVlc3RCb2R5IFRyYWNrZXJUYXNrIHRyYWNrZXJUYXNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyVGFza1NlcnZpY2UuaW5zZXJ0VHJhY2tlclRhc2sodHJhY2tlclRhc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnku7vliqEKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp0YXNrOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku7vliqEiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAUmVxdWVzdEJvZHkgVHJhY2tlclRhc2sgdHJhY2tlclRhc2spCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJUYXNrU2VydmljZS51cGRhdGVUcmFja2VyVGFzayh0cmFja2VyVGFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnRhc2s6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi5Lu75YqhIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKwlARGVsZXRlTWFwcGluZygiL3t0YXNrSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIHRhc2tJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJUYXNrU2VydmljZS5kZWxldGVUcmFja2VyVGFza0J5VGFza0lkcyh0YXNrSWRzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJUYXNrTG9nQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9jb250cm9sbGVyL1RyYWNrZXJUYXNrTG9nQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzc0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2NvbnRyb2xsZXIvVHJhY2tlclRhc2tMb2dDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuY29udHJvbGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUHV0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uRGVsZXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUGF0aFZhcmlhYmxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLmRvbWFpbi5UcmFja2VyVGFza0xvZzsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlLklUcmFja2VyVGFza0xvZ1NlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CisKKy8qKgorICog5Lu75Yqh5pel5b+XQ29udHJvbGxlcgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvdHJhY2tlci9sb2ciKQorcHVibGljIGNsYXNzIFRyYWNrZXJUYXNrTG9nQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVRyYWNrZXJUYXNrTG9nU2VydmljZSB0cmFja2VyVGFza0xvZ1NlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lku7vliqHml6Xlv5fliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpsb2c6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoVHJhY2tlclRhc2tMb2cgdHJhY2tlclRhc2tMb2cpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxUcmFja2VyVGFza0xvZz4gbGlzdCA9IHRyYWNrZXJUYXNrTG9nU2VydmljZS5zZWxlY3RUcmFja2VyVGFza0xvZ0xpc3QodHJhY2tlclRhc2tMb2cpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvvOWHuuS7u+WKoeaXpeW/l+WIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmxvZzpleHBvcnQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku7vliqHml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQb3N0TWFwcGluZygiL2V4cG9ydCIpCisgICAgcHVibGljIHZvaWQgZXhwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKQorICAgIHsKKyAgICAgICAgTGlzdDxUcmFja2VyVGFza0xvZz4gbGlzdCA9IHRyYWNrZXJUYXNrTG9nU2VydmljZS5zZWxlY3RUcmFja2VyVGFza0xvZ0xpc3QodHJhY2tlclRhc2tMb2cpOworICAgICAgICBFeGNlbFV0aWw8VHJhY2tlclRhc2tMb2c+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFRyYWNrZXJUYXNrTG9nPihUcmFja2VyVGFza0xvZy5jbGFzcyk7CisgICAgICAgIHV0aWwuZXhwb3J0RXhjZWwocmVzcG9uc2UsIGxpc3QsICLku7vliqHml6Xlv5fmlbDmja4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bku7vliqHml6Xlv5for6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpsb2c6cXVlcnknKSIpCisgICAgQEdldE1hcHBpbmcodmFsdWUgPSAiL3tsb2dJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldEluZm8oQFBhdGhWYXJpYWJsZSgibG9nSWQiKSBMb25nIGxvZ0lkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3ModHJhY2tlclRhc2tMb2dTZXJ2aWNlLnNlbGVjdFRyYWNrZXJUYXNrTG9nQnlMb2dJZChsb2dJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoeaXpeW/lworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmxvZzphZGQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku7vliqHml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU5TRVJUKQorICAgIEBQb3N0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGFkZChAUmVxdWVzdEJvZHkgVHJhY2tlclRhc2tMb2cgdHJhY2tlclRhc2tMb2cpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHRyYWNrZXJUYXNrTG9nU2VydmljZS5pbnNlcnRUcmFja2VyVGFza0xvZyh0cmFja2VyVGFza0xvZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS7u+WKoeaXpeW/lworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmxvZzplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi5Lu75Yqh5pel5b+XIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUHV0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVkaXQoQFJlcXVlc3RCb2R5IFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyVGFza0xvZ1NlcnZpY2UudXBkYXRlVHJhY2tlclRhc2tMb2codHJhY2tlclRhc2tMb2cpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqHml6Xlv5cKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpsb2c6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi5Lu75Yqh5pel5b+XIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKwlARGVsZXRlTWFwcGluZygiL3tsb2dJZHN9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCByZW1vdmUoQFBhdGhWYXJpYWJsZSBMb25nW10gbG9nSWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh0cmFja2VyVGFza0xvZ1NlcnZpY2UuZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkcyhsb2dJZHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2RvbWFpbi9UcmFja2VyUHJvamVjdC5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9kb21haW4vVHJhY2tlclByb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9kb21haW4vVHJhY2tlclByb2plY3QuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLmRvbWFpbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkJhc2VFbnRpdHk7CisKKy8qKgorICog6aG555uu5a+56LGhIHRyYWNrZXJfcHJvamVjdAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFja2VyUHJvamVjdCBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDpobnnm65JRCAqLworICAgIHByaXZhdGUgTG9uZyBwcm9qZWN0SWQ7CisKKyAgICAvKiog6aG555uu5ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6aG555uu5ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKKworICAgIC8qKiDpobnnm67mj4/ov7AgKi8KKyAgICBARXhjZWwobmFtZSA9ICLpobnnm67mj4/ov7AiKQorICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgLyoqIOmhueebrueKtuaAge+8iGFjdGl2ZTog5r+A5rS7LCBpbmFjdGl2ZTog5LiN5rS76LeD77yJICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6aG555uu54q25oCBIiwgcmVhZENvbnZlcnRlckV4cCA9ICJhPWN0aXZlOizmv4A95rS7LCxpPW5hY3RpdmU6LOS4jT3mtLvot4MiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RJZChMb25nIHByb2plY3RJZCkgCisgICAgeworICAgICAgICB0aGlzLnByb2plY3RJZCA9IHByb2plY3RJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQcm9qZWN0SWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9qZWN0SWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgCisgICAgeworICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3ROYW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIAorICAgIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSAKKyAgICB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIAorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJwcm9qZWN0SWQiLCBnZXRQcm9qZWN0SWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInByb2plY3ROYW1lIiwgZ2V0UHJvamVjdE5hbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRlc2NyaXB0aW9uIiwgZ2V0RGVzY3JpcHRpb24oKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXR1cyIsIGdldFN0YXR1cygpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2RvbWFpbi9UcmFja2VyUHJvamVjdFVzZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvZG9tYWluL1RyYWNrZXJQcm9qZWN0VXNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmNlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL2RvbWFpbi9UcmFja2VyUHJvamVjdFVzZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLmRvbWFpbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkJhc2VFbnRpdHk7CisKKy8qKgorICog6aG555uu5LiO55So5oi35YWz6IGU5a+56LGhIHRyYWNrZXJfcHJvamVjdF91c2VyCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworcHVibGljIGNsYXNzIFRyYWNrZXJQcm9qZWN0VXNlciBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDpobnnm65JRCAqLworICAgIHByaXZhdGUgTG9uZyBwcm9qZWN0SWQ7CisKKyAgICAvKiog55So5oi3SUQgKi8KKyAgICBwcml2YXRlIExvbmcgdXNlcklkOworCisgICAgLyoqIOinkuiJsu+8iOeuoeeQhuWRmOOAgeaIkOWRmOetie+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuinkuiJsiIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAi566hPeeQhuWRmOOAgeaIkOWRmOetiSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZTsKKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RJZChMb25nIHByb2plY3RJZCkgCisgICAgeworICAgICAgICB0aGlzLnByb2plY3RJZCA9IHByb2plY3RJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQcm9qZWN0SWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9qZWN0SWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVzZXJJZChMb25nIHVzZXJJZCkgCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRVc2VySWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpIAorICAgIHsKKyAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSAKKyAgICB7CisgICAgICAgIHJldHVybiByb2xlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgicHJvamVjdElkIiwgZ2V0UHJvamVjdElkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1c2VySWQiLCBnZXRVc2VySWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInJvbGUiLCBnZXRSb2xlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjcmVhdGVUaW1lIiwgZ2V0Q3JlYXRlVGltZSgpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9kb21haW4vVHJhY2tlclRhc2suamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvZG9tYWluL1RyYWNrZXJUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExMmNlOQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvZG9tYWluL1RyYWNrZXJUYXNrLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDku7vliqHlr7nosaEgdHJhY2tlcl90YXNrCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworcHVibGljIGNsYXNzIFRyYWNrZXJUYXNrIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOS7u+WKoUlEICovCisgICAgcHJpdmF0ZSBMb25nIHRhc2tJZDsKKworICAgIC8qKiDmiYDlsZ7pobnnm65JRCAqLworICAgIEBFeGNlbChuYW1lID0gIuaJgOWxnumhueebrklEIikKKyAgICBwcml2YXRlIExvbmcgcHJvamVjdElkOworCisgICAgLyoqIOS7u+WKoeWQjeensCAqLworICAgIEBFeGNlbChuYW1lID0gIuS7u+WKoeWQjeensCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFza05hbWU7CisKKyAgICAvKiog5Lu75Yqh5o+P6L+wICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lu75Yqh5o+P6L+wIikKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIC8qKiDliIbphY3nu5nnmoTnlKjmiLdJRCAqLworICAgIEBFeGNlbChuYW1lID0gIuWIhumFjee7meeahOeUqOaIt0lEIikKKyAgICBwcml2YXRlIExvbmcgYXNzaWduZWRUbzsKKworICAgIC8qKiDku7vliqHnirbmgIHvvIhvcGVuOiDlvoXlip4sIGluX3Byb2dyZXNzOiDov5vooYzkuK0sIGNsb3NlZDog5a6M5oiQ77yJICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lu75Yqh54q25oCBIiwgcmVhZENvbnZlcnRlckV4cCA9ICJvPXBlbjos5b6FPeWKniwsaT1uX3Byb2dyZXNzOizov5s96KGM5LitLCxjPWxvc2VkOizlrow95oiQIikKKyAgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgICAvKiog5Lu75Yqh5LyY5YWI57qn77yIbG93LCBtZWRpdW0sIGhpZ2jvvIkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLku7vliqHkvJjlhYjnuqciLCByZWFkQ29udmVydGVyRXhwID0gImw9b3csLG09ZWRpdW0sLGg9aWdoIikKKyAgICBwcml2YXRlIFN0cmluZyBwcmlvcml0eTsKKworICAgIHB1YmxpYyB2b2lkIHNldFRhc2tJZChMb25nIHRhc2tJZCkgCisgICAgeworICAgICAgICB0aGlzLnRhc2tJZCA9IHRhc2tJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRUYXNrSWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiB0YXNrSWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RJZChMb25nIHByb2plY3RJZCkgCisgICAgeworICAgICAgICB0aGlzLnByb2plY3RJZCA9IHByb2plY3RJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQcm9qZWN0SWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBwcm9qZWN0SWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyB0YXNrTmFtZSkgCisgICAgeworICAgICAgICB0aGlzLnRhc2tOYW1lID0gdGFza05hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYXNrTmFtZSgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRhc2tOYW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIAorICAgIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSAKKyAgICB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QXNzaWduZWRUbyhMb25nIGFzc2lnbmVkVG8pIAorICAgIHsKKyAgICAgICAgdGhpcy5hc3NpZ25lZFRvID0gYXNzaWduZWRUbzsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRBc3NpZ25lZFRvKCkgCisgICAgeworICAgICAgICByZXR1cm4gYXNzaWduZWRUbzsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIAorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFByaW9yaXR5KFN0cmluZyBwcmlvcml0eSkgCisgICAgeworICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmlvcml0eSgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHByaW9yaXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgidGFza0lkIiwgZ2V0VGFza0lkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJwcm9qZWN0SWQiLCBnZXRQcm9qZWN0SWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInRhc2tOYW1lIiwgZ2V0VGFza05hbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRlc2NyaXB0aW9uIiwgZ2V0RGVzY3JpcHRpb24oKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImFzc2lnbmVkVG8iLCBnZXRBc3NpZ25lZFRvKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJzdGF0dXMiLCBnZXRTdGF0dXMoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInByaW9yaXR5IiwgZ2V0UHJpb3JpdHkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyZWF0ZVRpbWUiLCBnZXRDcmVhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1cGRhdGVUaW1lIiwgZ2V0VXBkYXRlVGltZSgpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9kb21haW4vVHJhY2tlclRhc2tMb2cuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvZG9tYWluL1RyYWNrZXJUYXNrTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1ODM1OQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvZG9tYWluL1RyYWNrZXJUYXNrTG9nLmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBjb20ucnVveWkudHJhY2tlci5kb21haW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWw7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworCisvKioKKyAqIOS7u+WKoeaXpeW/l+WvueixoSB0cmFja2VyX3Rhc2tfbG9nCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworcHVibGljIGNsYXNzIFRyYWNrZXJUYXNrTG9nIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOaXpeW/l0lEICovCisgICAgcHJpdmF0ZSBMb25nIGxvZ0lkOworCisgICAgLyoqIOS7u+WKoUlEICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lu75YqhSUQiKQorICAgIHByaXZhdGUgTG9uZyB0YXNrSWQ7CisKKyAgICAvKiog5pON5L2c55So5oi3SUQgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZznlKjmiLdJRCIpCisgICAgcHJpdmF0ZSBMb25nIHVzZXJJZDsKKworICAgIC8qKiDmk43kvZznsbvlnovvvIjliJvlu7rjgIHmm7TmlrDjgIHliKDpmaTvvIkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZznsbvlnosiLCByZWFkQ29udmVydGVyRXhwID0gIuWImz3lu7rjgIHmm7TmlrDjgIHliKDpmaQiKQorICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbjsKKworICAgIC8qKiDmk43kvZzmj4/ov7AgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZzmj4/ov7AiKQorICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgcHVibGljIHZvaWQgc2V0TG9nSWQoTG9uZyBsb2dJZCkgCisgICAgeworICAgICAgICB0aGlzLmxvZ0lkID0gbG9nSWQ7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0TG9nSWQoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dJZDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VGFza0lkKExvbmcgdGFza0lkKSAKKyAgICB7CisgICAgICAgIHRoaXMudGFza0lkID0gdGFza0lkOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldFRhc2tJZCgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRhc2tJZDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VXNlcklkKExvbmcgdXNlcklkKSAKKyAgICB7CisgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldFVzZXJJZCgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIAorICAgIHsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSAKKyAgICB7CisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgCisgICAgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgibG9nSWQiLCBnZXRMb2dJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgidGFza0lkIiwgZ2V0VGFza0lkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1c2VySWQiLCBnZXRVc2VySWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImFjdGlvbiIsIGdldEFjdGlvbigpKQorICAgICAgICAgICAgLmFwcGVuZCgiZGVzY3JpcHRpb24iLCBnZXREZXNjcmlwdGlvbigpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvbWFwcGVyL1RyYWNrZXJQcm9qZWN0TWFwcGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL21hcHBlci9UcmFja2VyUHJvamVjdE1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YmZmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL21hcHBlci9UcmFja2VyUHJvamVjdE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJQcm9qZWN0OworCisvKioKKyAqIOmhueebrk1hcHBlcuaOpeWPoworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHJhY2tlclByb2plY3RNYXBwZXIgCit7CisgICAgLyoqCisgICAgICog5p+l6K+i6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZCDpobnnm67kuLvplK4KKyAgICAgKiBAcmV0dXJuIOmhueebrgorICAgICAqLworICAgIHB1YmxpYyBUcmFja2VyUHJvamVjdCBzZWxlY3RUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkKExvbmcgcHJvamVjdElkKTsKKworICAgIC8qKgorICAgICAqIOafpeivoumhueebruWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyUHJvamVjdCDpobnnm64KKyAgICAgKiBAcmV0dXJuIOmhueebrumbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFRyYWNrZXJQcm9qZWN0PiBzZWxlY3RUcmFja2VyUHJvamVjdExpc3QoVHJhY2tlclByb2plY3QgdHJhY2tlclByb2plY3QpOworCisgICAgLyoqCisgICAgICog5paw5aKe6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0IOmhueebrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRUcmFja2VyUHJvamVjdChUcmFja2VyUHJvamVjdCB0cmFja2VyUHJvamVjdCk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnpobnnm64KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclByb2plY3Qg6aG555uuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZVRyYWNrZXJQcm9qZWN0KFRyYWNrZXJQcm9qZWN0IHRyYWNrZXJQcm9qZWN0KTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOmhueebrgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9qZWN0SWQg6aG555uu5Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWQoTG9uZyBwcm9qZWN0SWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2u5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWRzKExvbmdbXSBwcm9qZWN0SWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvbWFwcGVyL1RyYWNrZXJQcm9qZWN0VXNlck1hcHBlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9tYXBwZXIvVHJhY2tlclByb2plY3RVc2VyTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkMTkwNAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvbWFwcGVyL1RyYWNrZXJQcm9qZWN0VXNlck1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJQcm9qZWN0VXNlcjsKKworLyoqCisgKiDpobnnm67kuI7nlKjmiLflhbPogZRNYXBwZXLmjqXlj6MKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYWNrZXJQcm9qZWN0VXNlck1hcHBlciAKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvamVjdElkIOmhueebruS4jueUqOaIt+WFs+iBlOS4u+mUrgorICAgICAqIEByZXR1cm4g6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICovCisgICAgcHVibGljIFRyYWNrZXJQcm9qZWN0VXNlciBzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZChMb25nIHByb2plY3RJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm67kuI7nlKjmiLflhbPogZTliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclByb2plY3RVc2VyIOmhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqIEByZXR1cm4g6aG555uu5LiO55So5oi35YWz6IGU6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhY2tlclByb2plY3RVc2VyPiBzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJMaXN0KFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5paw5aKe6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0VXNlciDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0VHJhY2tlclByb2plY3RVc2VyKFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5L+u5pS56aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0VXNlciDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclByb2plY3RVc2VyKFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZCDpobnnm67kuI7nlKjmiLflhbPogZTkuLvplK4KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVHJhY2tlclByb2plY3RVc2VyQnlQcm9qZWN0SWQoTG9uZyBwcm9qZWN0SWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2u5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkcyhMb25nW10gcHJvamVjdElkcyk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL21hcHBlci9UcmFja2VyVGFza0xvZ01hcHBlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9tYXBwZXIvVHJhY2tlclRhc2tMb2dNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFhOWRmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9tYXBwZXIvVHJhY2tlclRhc2tMb2dNYXBwZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLm1hcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLmRvbWFpbi5UcmFja2VyVGFza0xvZzsKKworLyoqCisgKiDku7vliqHml6Xlv5dNYXBwZXLmjqXlj6MKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYWNrZXJUYXNrTG9nTWFwcGVyIAoreworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZCDku7vliqHml6Xlv5fkuLvplK4KKyAgICAgKiBAcmV0dXJuIOS7u+WKoeaXpeW/lworICAgICAqLworICAgIHB1YmxpYyBUcmFja2VyVGFza0xvZyBzZWxlY3RUcmFja2VyVGFza0xvZ0J5TG9nSWQoTG9uZyBsb2dJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lku7vliqHml6Xlv5fliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2tMb2cg5Lu75Yqh5pel5b+XCisgICAgICogQHJldHVybiDku7vliqHml6Xlv5fpm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUcmFja2VyVGFza0xvZz4gc2VsZWN0VHJhY2tlclRhc2tMb2dMaXN0KFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFza0xvZyDku7vliqHml6Xlv5cKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0VHJhY2tlclRhc2tMb2coVHJhY2tlclRhc2tMb2cgdHJhY2tlclRhc2tMb2cpOworCisgICAgLyoqCisgICAgICog5L+u5pS55Lu75Yqh5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJUYXNrTG9nIOS7u+WKoeaXpeW/lworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVUcmFja2VyVGFza0xvZyhUcmFja2VyVGFza0xvZyB0cmFja2VyVGFza0xvZyk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9nSWQg5Lu75Yqh5pel5b+X5Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJUYXNrTG9nQnlMb2dJZChMb25nIGxvZ0lkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2u5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJUYXNrTG9nQnlMb2dJZHMoTG9uZ1tdIGxvZ0lkcyk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL21hcHBlci9UcmFja2VyVGFza01hcHBlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9tYXBwZXIvVHJhY2tlclRhc2tNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZkNGRjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9tYXBwZXIvVHJhY2tlclRhc2tNYXBwZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLm1hcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLmRvbWFpbi5UcmFja2VyVGFzazsKKworLyoqCisgKiDku7vliqFNYXBwZXLmjqXlj6MKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRyYWNrZXJUYXNrTWFwcGVyIAoreworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXNrSWQg5Lu75Yqh5Li76ZSuCisgICAgICogQHJldHVybiDku7vliqEKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhY2tlclRhc2sgc2VsZWN0VHJhY2tlclRhc2tCeVRhc2tJZChMb25nIHRhc2tJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lku7vliqHliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2sg5Lu75YqhCisgICAgICogQHJldHVybiDku7vliqHpm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUcmFja2VyVGFzaz4gc2VsZWN0VHJhY2tlclRhc2tMaXN0KFRyYWNrZXJUYXNrIHRyYWNrZXJUYXNrKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFzayDku7vliqEKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0VHJhY2tlclRhc2soVHJhY2tlclRhc2sgdHJhY2tlclRhc2spOworCisgICAgLyoqCisgICAgICog5L+u5pS55Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJUYXNrIOS7u+WKoQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVUcmFja2VyVGFzayhUcmFja2VyVGFzayB0cmFja2VyVGFzayk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFza0lkIOS7u+WKoeS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkKExvbmcgdGFza0lkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXNrSWRzIOmcgOimgeWIoOmZpOeahOaVsOaNruS4u+mUrumbhuWQiAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkcyhMb25nW10gdGFza0lkcyk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvSVRyYWNrZXJQcm9qZWN0U2VydmljZS5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyUHJvamVjdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWE3Yjk0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyUHJvamVjdFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5kb21haW4uVHJhY2tlclByb2plY3Q7CisKKy8qKgorICog6aG555uuU2VydmljZeaOpeWPoworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRyYWNrZXJQcm9qZWN0U2VydmljZSAKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm64KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvamVjdElkIOmhueebruS4u+mUrgorICAgICAqIEByZXR1cm4g6aG555uuCisgICAgICovCisgICAgcHVibGljIFRyYWNrZXJQcm9qZWN0IHNlbGVjdFRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWQoTG9uZyBwcm9qZWN0SWQpOworCisgICAgLyoqCisgICAgICog5p+l6K+i6aG555uu5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0IOmhueebrgorICAgICAqIEByZXR1cm4g6aG555uu6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhY2tlclByb2plY3Q+IHNlbGVjdFRyYWNrZXJQcm9qZWN0TGlzdChUcmFja2VyUHJvamVjdCB0cmFja2VyUHJvamVjdCk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7pobnnm64KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclByb2plY3Qg6aG555uuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFRyYWNrZXJQcm9qZWN0KFRyYWNrZXJQcm9qZWN0IHRyYWNrZXJQcm9qZWN0KTsKKworICAgIC8qKgorICAgICAqIOS/ruaUuemhueebrgorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyUHJvamVjdCDpobnnm64KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclByb2plY3QoVHJhY2tlclByb2plY3QgdHJhY2tlclByb2plY3QpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZHMg6ZyA6KaB5Yig6Zmk55qE6aG555uu5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWRzKExvbmdbXSBwcm9qZWN0SWRzKTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOmhueebruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9qZWN0SWQg6aG555uu5Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWQoTG9uZyBwcm9qZWN0SWQpOworfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvSVRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmEwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJQcm9qZWN0VXNlcjsKKworLyoqCisgKiDpobnnm67kuI7nlKjmiLflhbPogZRTZXJ2aWNl5o6l5Y+jCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworcHVibGljIGludGVyZmFjZSBJVHJhY2tlclByb2plY3RVc2VyU2VydmljZSAKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvamVjdElkIOmhueebruS4jueUqOaIt+WFs+iBlOS4u+mUrgorICAgICAqIEByZXR1cm4g6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICovCisgICAgcHVibGljIFRyYWNrZXJQcm9qZWN0VXNlciBzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZChMb25nIHByb2plY3RJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm67kuI7nlKjmiLflhbPogZTliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclByb2plY3RVc2VyIOmhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqIEByZXR1cm4g6aG555uu5LiO55So5oi35YWz6IGU6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhY2tlclByb2plY3RVc2VyPiBzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJMaXN0KFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5paw5aKe6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0VXNlciDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0VHJhY2tlclByb2plY3RVc2VyKFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5L+u5pS56aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0VXNlciDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclByb2plY3RVc2VyKFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZHMg6ZyA6KaB5Yig6Zmk55qE6aG555uu5LiO55So5oi35YWz6IGU5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkcyhMb25nW10gcHJvamVjdElkcyk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTpobnnm67kuI7nlKjmiLflhbPogZTkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvamVjdElkIOmhueebruS4jueUqOaIt+WFs+iBlOS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZChMb25nIHByb2plY3RJZCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvSVRyYWNrZXJUYXNrTG9nU2VydmljZS5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyVGFza0xvZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThhNTVjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyVGFza0xvZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5kb21haW4uVHJhY2tlclRhc2tMb2c7CisKKy8qKgorICog5Lu75Yqh5pel5b+XU2VydmljZeaOpeWPoworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKiBAZGF0ZSAyMDI1LTA0LTIwCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRyYWNrZXJUYXNrTG9nU2VydmljZSAKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9nSWQg5Lu75Yqh5pel5b+X5Li76ZSuCisgICAgICogQHJldHVybiDku7vliqHml6Xlv5cKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhY2tlclRhc2tMb2cgc2VsZWN0VHJhY2tlclRhc2tMb2dCeUxvZ0lkKExvbmcgbG9nSWQpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5Lu75Yqh5pel5b+X5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJUYXNrTG9nIOS7u+WKoeaXpeW/lworICAgICAqIEByZXR1cm4g5Lu75Yqh5pel5b+X6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhY2tlclRhc2tMb2c+IHNlbGVjdFRyYWNrZXJUYXNrTG9nTGlzdChUcmFja2VyVGFza0xvZyB0cmFja2VyVGFza0xvZyk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7ku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2tMb2cg5Lu75Yqh5pel5b+XCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFRyYWNrZXJUYXNrTG9nKFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFza0xvZyDku7vliqHml6Xlv5cKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclRhc2tMb2coVHJhY2tlclRhc2tMb2cgdHJhY2tlclRhc2tMb2cpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk5Lu75Yqh5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIGxvZ0lkcyDpnIDopoHliKDpmaTnmoTku7vliqHml6Xlv5fkuLvplK7pm4blkIgKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkcyhMb25nW10gbG9nSWRzKTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoeaXpeW/l+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZCDku7vliqHml6Xlv5fkuLvplK4KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkKExvbmcgbG9nSWQpOworfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL0lUcmFja2VyVGFza1NlcnZpY2UuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9JVHJhY2tlclRhc2tTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmODY2NAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9JVHJhY2tlclRhc2tTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJUYXNrOworCisvKioKKyAqIOS7u+WKoVNlcnZpY2XmjqXlj6MKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElUcmFja2VyVGFza1NlcnZpY2UgCit7CisgICAgLyoqCisgICAgICog5p+l6K+i5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIHRhc2tJZCDku7vliqHkuLvplK4KKyAgICAgKiBAcmV0dXJuIOS7u+WKoQorICAgICAqLworICAgIHB1YmxpYyBUcmFja2VyVGFzayBzZWxlY3RUcmFja2VyVGFza0J5VGFza0lkKExvbmcgdGFza0lkKTsKKworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoeWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFzayDku7vliqEKKyAgICAgKiBAcmV0dXJuIOS7u+WKoembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFRyYWNrZXJUYXNrPiBzZWxlY3RUcmFja2VyVGFza0xpc3QoVHJhY2tlclRhc2sgdHJhY2tlclRhc2spOworCisgICAgLyoqCisgICAgICog5paw5aKe5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJUYXNrIOS7u+WKoQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRUcmFja2VyVGFzayhUcmFja2VyVGFzayB0cmFja2VyVGFzayk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2sg5Lu75YqhCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZVRyYWNrZXJUYXNrKFRyYWNrZXJUYXNrIHRyYWNrZXJUYXNrKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXNrSWRzIOmcgOimgeWIoOmZpOeahOS7u+WKoeS4u+mUrumbhuWQiAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkcyhMb25nW10gdGFza0lkcyk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFza0lkIOS7u+WKoeS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkKExvbmcgdGFza0lkKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9pbXBsL1RyYWNrZXJQcm9qZWN0U2VydmljZUltcGwuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9pbXBsL1RyYWNrZXJQcm9qZWN0U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2YyNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvdHJhY2tlci9zZXJ2aWNlL2ltcGwvVHJhY2tlclByb2plY3RTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuc2VydmljZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLm1hcHBlci5UcmFja2VyUHJvamVjdE1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5kb21haW4uVHJhY2tlclByb2plY3Q7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuc2VydmljZS5JVHJhY2tlclByb2plY3RTZXJ2aWNlOworCisvKioKKyAqIOmhueebrlNlcnZpY2XkuJrliqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFRyYWNrZXJQcm9qZWN0U2VydmljZUltcGwgaW1wbGVtZW50cyBJVHJhY2tlclByb2plY3RTZXJ2aWNlIAoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFRyYWNrZXJQcm9qZWN0TWFwcGVyIHRyYWNrZXJQcm9qZWN0TWFwcGVyOworCisgICAgLyoqCisgICAgICog5p+l6K+i6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZCDpobnnm67kuLvplK4KKyAgICAgKiBAcmV0dXJuIOmhueebrgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmFja2VyUHJvamVjdCBzZWxlY3RUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkKExvbmcgcHJvamVjdElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJQcm9qZWN0TWFwcGVyLnNlbGVjdFRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWQocHJvamVjdElkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpobnnm67liJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclByb2plY3Qg6aG555uuCisgICAgICogQHJldHVybiDpobnnm64KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUcmFja2VyUHJvamVjdD4gc2VsZWN0VHJhY2tlclByb2plY3RMaXN0KFRyYWNrZXJQcm9qZWN0IHRyYWNrZXJQcm9qZWN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJQcm9qZWN0TWFwcGVyLnNlbGVjdFRyYWNrZXJQcm9qZWN0TGlzdCh0cmFja2VyUHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0IOmhueebrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBpbnNlcnRUcmFja2VyUHJvamVjdChUcmFja2VyUHJvamVjdCB0cmFja2VyUHJvamVjdCkKKyAgICB7CisgICAgICAgIHRyYWNrZXJQcm9qZWN0LnNldENyZWF0ZVRpbWUoRGF0ZVV0aWxzLmdldE5vd0RhdGUoKSk7CisgICAgICAgIHJldHVybiB0cmFja2VyUHJvamVjdE1hcHBlci5pbnNlcnRUcmFja2VyUHJvamVjdCh0cmFja2VyUHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS56aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0IOmhueebrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGVUcmFja2VyUHJvamVjdChUcmFja2VyUHJvamVjdCB0cmFja2VyUHJvamVjdCkKKyAgICB7CisgICAgICAgIHRyYWNrZXJQcm9qZWN0LnNldFVwZGF0ZVRpbWUoRGF0ZVV0aWxzLmdldE5vd0RhdGUoKSk7CisgICAgICAgIHJldHVybiB0cmFja2VyUHJvamVjdE1hcHBlci51cGRhdGVUcmFja2VyUHJvamVjdCh0cmFja2VyUHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6aG555uuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2plY3RJZHMg6ZyA6KaB5Yig6Zmk55qE6aG555uu5Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWRzKExvbmdbXSBwcm9qZWN0SWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJQcm9qZWN0TWFwcGVyLmRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWRzKHByb2plY3RJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOmhueebruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9qZWN0SWQg6aG555uu5Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZVRyYWNrZXJQcm9qZWN0QnlQcm9qZWN0SWQoTG9uZyBwcm9qZWN0SWQpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclByb2plY3RNYXBwZXIuZGVsZXRlVHJhY2tlclByb2plY3RCeVByb2plY3RJZChwcm9qZWN0SWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9pbXBsL1RyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjMxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnRyYWNrZXIuc2VydmljZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLm1hcHBlci5UcmFja2VyUHJvamVjdFVzZXJNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJQcm9qZWN0VXNlcjsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5zZXJ2aWNlLklUcmFja2VyUHJvamVjdFVzZXJTZXJ2aWNlOworCisvKioKKyAqIOmhueebruS4jueUqOaIt+WFs+iBlFNlcnZpY2XkuJrliqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICogQGRhdGUgMjAyNS0wNC0yMAorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2VJbXBsIGltcGxlbWVudHMgSVRyYWNrZXJQcm9qZWN0VXNlclNlcnZpY2UgCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVHJhY2tlclByb2plY3RVc2VyTWFwcGVyIHRyYWNrZXJQcm9qZWN0VXNlck1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOafpeivoumhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9qZWN0SWQg6aG555uu5LiO55So5oi35YWz6IGU5Li76ZSuCisgICAgICogQHJldHVybiDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHJhY2tlclByb2plY3RVc2VyIHNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkKExvbmcgcHJvamVjdElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJQcm9qZWN0VXNlck1hcHBlci5zZWxlY3RUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZChwcm9qZWN0SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivoumhueebruS4jueUqOaIt+WFs+iBlOWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyUHJvamVjdFVzZXIg6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogQHJldHVybiDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUcmFja2VyUHJvamVjdFVzZXI+IHNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlckxpc3QoVHJhY2tlclByb2plY3RVc2VyIHRyYWNrZXJQcm9qZWN0VXNlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyUHJvamVjdFVzZXJNYXBwZXIuc2VsZWN0VHJhY2tlclByb2plY3RVc2VyTGlzdCh0cmFja2VyUHJvamVjdFVzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinumhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyUHJvamVjdFVzZXIg6aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluc2VydFRyYWNrZXJQcm9qZWN0VXNlcihUcmFja2VyUHJvamVjdFVzZXIgdHJhY2tlclByb2plY3RVc2VyKQorICAgIHsKKyAgICAgICAgdHJhY2tlclByb2plY3RVc2VyLnNldENyZWF0ZVRpbWUoRGF0ZVV0aWxzLmdldE5vd0RhdGUoKSk7CisgICAgICAgIHJldHVybiB0cmFja2VyUHJvamVjdFVzZXJNYXBwZXIuaW5zZXJ0VHJhY2tlclByb2plY3RVc2VyKHRyYWNrZXJQcm9qZWN0VXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS56aG555uu5LiO55So5oi35YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJQcm9qZWN0VXNlciDpobnnm67kuI7nlKjmiLflhbPogZQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclByb2plY3RVc2VyKFRyYWNrZXJQcm9qZWN0VXNlciB0cmFja2VyUHJvamVjdFVzZXIpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclByb2plY3RVc2VyTWFwcGVyLnVwZGF0ZVRyYWNrZXJQcm9qZWN0VXNlcih0cmFja2VyUHJvamVjdFVzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOmhueebruS4jueUqOaIt+WFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9qZWN0SWRzIOmcgOimgeWIoOmZpOeahOmhueebruS4jueUqOaIt+WFs+iBlOS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZHMoTG9uZ1tdIHByb2plY3RJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclByb2plY3RVc2VyTWFwcGVyLmRlbGV0ZVRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkcyhwcm9qZWN0SWRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTpobnnm67kuI7nlKjmiLflhbPogZTkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvamVjdElkIOmhueebruS4jueUqOaIt+WFs+iBlOS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZChMb25nIHByb2plY3RJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyUHJvamVjdFVzZXJNYXBwZXIuZGVsZXRlVHJhY2tlclByb2plY3RVc2VyQnlQcm9qZWN0SWQocHJvamVjdElkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyVGFza0xvZ1NlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyVGFza0xvZ1NlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9pbXBsL1RyYWNrZXJUYXNrTG9nU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuRGF0ZVV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5tYXBwZXIuVHJhY2tlclRhc2tMb2dNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJUYXNrTG9nOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2UuSVRyYWNrZXJUYXNrTG9nU2VydmljZTsKKworLyoqCisgKiDku7vliqHml6Xlv5dTZXJ2aWNl5Lia5Yqh5bGC5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBUcmFja2VyVGFza0xvZ1NlcnZpY2VJbXBsIGltcGxlbWVudHMgSVRyYWNrZXJUYXNrTG9nU2VydmljZSAKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUcmFja2VyVGFza0xvZ01hcHBlciB0cmFja2VyVGFza0xvZ01hcHBlcjsKKworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZCDku7vliqHml6Xlv5fkuLvplK4KKyAgICAgKiBAcmV0dXJuIOS7u+WKoeaXpeW/lworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmFja2VyVGFza0xvZyBzZWxlY3RUcmFja2VyVGFza0xvZ0J5TG9nSWQoTG9uZyBsb2dJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyVGFza0xvZ01hcHBlci5zZWxlY3RUcmFja2VyVGFza0xvZ0J5TG9nSWQobG9nSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoeaXpeW/l+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFza0xvZyDku7vliqHml6Xlv5cKKyAgICAgKiBAcmV0dXJuIOS7u+WKoeaXpeW/lworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFRyYWNrZXJUYXNrTG9nPiBzZWxlY3RUcmFja2VyVGFza0xvZ0xpc3QoVHJhY2tlclRhc2tMb2cgdHJhY2tlclRhc2tMb2cpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclRhc2tMb2dNYXBwZXIuc2VsZWN0VHJhY2tlclRhc2tMb2dMaXN0KHRyYWNrZXJUYXNrTG9nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7ku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2tMb2cg5Lu75Yqh5pel5b+XCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluc2VydFRyYWNrZXJUYXNrTG9nKFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKQorICAgIHsKKyAgICAgICAgdHJhY2tlclRhc2tMb2cuc2V0Q3JlYXRlVGltZShEYXRlVXRpbHMuZ2V0Tm93RGF0ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJUYXNrTG9nTWFwcGVyLmluc2VydFRyYWNrZXJUYXNrTG9nKHRyYWNrZXJUYXNrTG9nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHJhY2tlclRhc2tMb2cg5Lu75Yqh5pel5b+XCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZVRyYWNrZXJUYXNrTG9nKFRyYWNrZXJUYXNrTG9nIHRyYWNrZXJUYXNrTG9nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJUYXNrTG9nTWFwcGVyLnVwZGF0ZVRyYWNrZXJUYXNrTG9nKHRyYWNrZXJUYXNrTG9nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9nSWRzIOmcgOimgeWIoOmZpOeahOS7u+WKoeaXpeW/l+S4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0xvZ0J5TG9nSWRzKExvbmdbXSBsb2dJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclRhc2tMb2dNYXBwZXIuZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkcyhsb2dJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoeaXpeW/l+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZCDku7vliqHml6Xlv5fkuLvplK4KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkKExvbmcgbG9nSWQpCisgICAgeworICAgICAgICByZXR1cm4gdHJhY2tlclRhc2tMb2dNYXBwZXIuZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkKGxvZ0lkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyVGFza1NlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS90cmFja2VyL3NlcnZpY2UvaW1wbC9UcmFja2VyVGFza1NlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkYWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3RyYWNrZXIvc2VydmljZS9pbXBsL1RyYWNrZXJUYXNrU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDk2IEBACitwYWNrYWdlIGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuRGF0ZVV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkudHJhY2tlci5tYXBwZXIuVHJhY2tlclRhc2tNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnRyYWNrZXIuZG9tYWluLlRyYWNrZXJUYXNrOworaW1wb3J0IGNvbS5ydW95aS50cmFja2VyLnNlcnZpY2UuSVRyYWNrZXJUYXNrU2VydmljZTsKKworLyoqCisgKiDku7vliqFTZXJ2aWNl5Lia5Yqh5bGC5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqIEBkYXRlIDIwMjUtMDQtMjAKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBUcmFja2VyVGFza1NlcnZpY2VJbXBsIGltcGxlbWVudHMgSVRyYWNrZXJUYXNrU2VydmljZSAKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUcmFja2VyVGFza01hcHBlciB0cmFja2VyVGFza01hcHBlcjsKKworICAgIC8qKgorICAgICAqIOafpeivouS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXNrSWQg5Lu75Yqh5Li76ZSuCisgICAgICogQHJldHVybiDku7vliqEKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHJhY2tlclRhc2sgc2VsZWN0VHJhY2tlclRhc2tCeVRhc2tJZChMb25nIHRhc2tJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyVGFza01hcHBlci5zZWxlY3RUcmFja2VyVGFza0J5VGFza0lkKHRhc2tJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5Lu75Yqh5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHRyYWNrZXJUYXNrIOS7u+WKoQorICAgICAqIEByZXR1cm4g5Lu75YqhCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHJhY2tlclRhc2s+IHNlbGVjdFRyYWNrZXJUYXNrTGlzdChUcmFja2VyVGFzayB0cmFja2VyVGFzaykKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyVGFza01hcHBlci5zZWxlY3RUcmFja2VyVGFza0xpc3QodHJhY2tlclRhc2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFzayDku7vliqEKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0VHJhY2tlclRhc2soVHJhY2tlclRhc2sgdHJhY2tlclRhc2spCisgICAgeworICAgICAgICB0cmFja2VyVGFzay5zZXRDcmVhdGVUaW1lKERhdGVVdGlscy5nZXROb3dEYXRlKCkpOworICAgICAgICByZXR1cm4gdHJhY2tlclRhc2tNYXBwZXIuaW5zZXJ0VHJhY2tlclRhc2sodHJhY2tlclRhc2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0cmFja2VyVGFzayDku7vliqEKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlVHJhY2tlclRhc2soVHJhY2tlclRhc2sgdHJhY2tlclRhc2spCisgICAgeworICAgICAgICB0cmFja2VyVGFzay5zZXRVcGRhdGVUaW1lKERhdGVVdGlscy5nZXROb3dEYXRlKCkpOworICAgICAgICByZXR1cm4gdHJhY2tlclRhc2tNYXBwZXIudXBkYXRlVHJhY2tlclRhc2sodHJhY2tlclRhc2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXNrSWRzIOmcgOimgeWIoOmZpOeahOS7u+WKoeS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkcyhMb25nW10gdGFza0lkcykKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFja2VyVGFza01hcHBlci5kZWxldGVUcmFja2VyVGFza0J5VGFza0lkcyh0YXNrSWRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFza0lkIOS7u+WKoeS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVUcmFja2VyVGFza0J5VGFza0lkKExvbmcgdGFza0lkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXJUYXNrTWFwcGVyLmRlbGV0ZVRyYWNrZXJUYXNrQnlUYXNrSWQodGFza0lkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9jb21tb24vQ2FwdGNoYUNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL2NvbW1vbi9DYXB0Y2hhQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGNmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9jb21tb24vQ2FwdGNoYUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5jb21tb247CisKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamFrYXJ0YS5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb2RlLmthcHRjaGEuUHJvZHVjZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25maWcuUnVvWWlDb25maWc7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5DYWNoZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnJlZGlzLlJlZGlzQ2FjaGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zaWduLkJhc2U2NDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnV1aWQuSWRVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0NvbmZpZ1NlcnZpY2U7CisKKy8qKgorICog6aqM6K+B56CB5pON5L2c5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitwdWJsaWMgY2xhc3MgQ2FwdGNoYUNvbnRyb2xsZXIKK3sKKyAgICBAUmVzb3VyY2UobmFtZSA9ICJjYXB0Y2hhUHJvZHVjZXIiKQorICAgIHByaXZhdGUgUHJvZHVjZXIgY2FwdGNoYVByb2R1Y2VyOworCisgICAgQFJlc291cmNlKG5hbWUgPSAiY2FwdGNoYVByb2R1Y2VyTWF0aCIpCisgICAgcHJpdmF0ZSBQcm9kdWNlciBjYXB0Y2hhUHJvZHVjZXJNYXRoOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUmVkaXNDYWNoZSByZWRpc0NhY2hlOworICAgIAorICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNDb25maWdTZXJ2aWNlIGNvbmZpZ1NlcnZpY2U7CisgICAgLyoqCisgICAgICog55Sf5oiQ6aqM6K+B56CBCisgICAgICovCisgICAgQEdldE1hcHBpbmcoIi9jYXB0Y2hhSW1hZ2UiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldENvZGUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBBamF4UmVzdWx0IGFqYXggPSBBamF4UmVzdWx0LnN1Y2Nlc3MoKTsKKyAgICAgICAgYm9vbGVhbiBjYXB0Y2hhRW5hYmxlZCA9IGNvbmZpZ1NlcnZpY2Uuc2VsZWN0Q2FwdGNoYUVuYWJsZWQoKTsKKyAgICAgICAgYWpheC5wdXQoImNhcHRjaGFFbmFibGVkIiwgY2FwdGNoYUVuYWJsZWQpOworICAgICAgICBpZiAoIWNhcHRjaGFFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWpheDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOS/neWtmOmqjOivgeeggeS/oeaBrworICAgICAgICBTdHJpbmcgdXVpZCA9IElkVXRpbHMuc2ltcGxlVVVJRCgpOworICAgICAgICBTdHJpbmcgdmVyaWZ5S2V5ID0gQ2FjaGVDb25zdGFudHMuQ0FQVENIQV9DT0RFX0tFWSArIHV1aWQ7CisKKyAgICAgICAgU3RyaW5nIGNhcFN0ciA9IG51bGwsIGNvZGUgPSBudWxsOworICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlID0gbnVsbDsKKworICAgICAgICAvLyDnlJ/miJDpqozor4HnoIEKKyAgICAgICAgU3RyaW5nIGNhcHRjaGFUeXBlID0gUnVvWWlDb25maWcuZ2V0Q2FwdGNoYVR5cGUoKTsKKyAgICAgICAgaWYgKCJtYXRoIi5lcXVhbHMoY2FwdGNoYVR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgY2FwVGV4dCA9IGNhcHRjaGFQcm9kdWNlck1hdGguY3JlYXRlVGV4dCgpOworICAgICAgICAgICAgY2FwU3RyID0gY2FwVGV4dC5zdWJzdHJpbmcoMCwgY2FwVGV4dC5sYXN0SW5kZXhPZigiQCIpKTsKKyAgICAgICAgICAgIGNvZGUgPSBjYXBUZXh0LnN1YnN0cmluZyhjYXBUZXh0Lmxhc3RJbmRleE9mKCJAIikgKyAxKTsKKyAgICAgICAgICAgIGltYWdlID0gY2FwdGNoYVByb2R1Y2VyTWF0aC5jcmVhdGVJbWFnZShjYXBTdHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2FwdGNoYVR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXBTdHIgPSBjb2RlID0gY2FwdGNoYVByb2R1Y2VyLmNyZWF0ZVRleHQoKTsKKyAgICAgICAgICAgIGltYWdlID0gY2FwdGNoYVByb2R1Y2VyLmNyZWF0ZUltYWdlKGNhcFN0cik7CisgICAgICAgIH0KKworICAgICAgICByZWRpc0NhY2hlLnNldENhY2hlT2JqZWN0KHZlcmlmeUtleSwgY29kZSwgQ29uc3RhbnRzLkNBUFRDSEFfRVhQSVJBVElPTiwgVGltZVVuaXQuTUlOVVRFUyk7CisgICAgICAgIC8vIOi9rOaNoua1geS/oeaBr+WGmeWHugorICAgICAgICBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEZhc3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEltYWdlSU8ud3JpdGUoaW1hZ2UsICJqcGciLCBvcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFqYXgucHV0KCJ1dWlkIiwgdXVpZCk7CisgICAgICAgIGFqYXgucHV0KCJpbWciLCBCYXNlNjQuZW5jb2RlKG9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgcmV0dXJuIGFqYXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvY29tbW9uL0NvbW1vbkNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL2NvbW1vbi9Db21tb25Db250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmYWQwYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL2NvbW1vbi9Db21tb25Db250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLk1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tdWx0aXBhcnQuTXVsdGlwYXJ0RmlsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbmZpZy5SdW9ZaUNvbmZpZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmZpbGUuRmlsZVVwbG9hZFV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZS5GaWxlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWcuU2VydmVyQ29uZmlnOworCisvKioKKyAqIOmAmueUqOivt+axguWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvY29tbW9uIikKK3B1YmxpYyBjbGFzcyBDb21tb25Db250cm9sbGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbW1vbkNvbnRyb2xsZXIuY2xhc3MpOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU2VydmVyQ29uZmlnIHNlcnZlckNvbmZpZzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0RFTElNRVRFUiA9ICIsIjsKKworICAgIC8qKgorICAgICAqIOmAmueUqOS4i+i9veivt+axggorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSDmlofku7blkI3np7AKKyAgICAgKiBAcGFyYW0gZGVsZXRlIOaYr+WQpuWIoOmZpAorICAgICAqLworICAgIEBHZXRNYXBwaW5nKCIvZG93bmxvYWQiKQorICAgIHB1YmxpYyB2b2lkIGZpbGVEb3dubG9hZChTdHJpbmcgZmlsZU5hbWUsIEJvb2xlYW4gZGVsZXRlLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUZpbGVVdGlscy5jaGVja0FsbG93RG93bmxvYWQoZmlsZU5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oU3RyaW5nVXRpbHMuZm9ybWF0KCLmlofku7blkI3np7Aoe30p6Z2e5rOV77yM5LiN5YWB6K645LiL6L2944CCICIsIGZpbGVOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcmVhbEZpbGVOYW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUuaW5kZXhPZigiXyIpICsgMSk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBSdW9ZaUNvbmZpZy5nZXREb3dubG9hZFBhdGgoKSArIGZpbGVOYW1lOworCisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1ZBTFVFKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5zZXRBdHRhY2htZW50UmVzcG9uc2VIZWFkZXIocmVzcG9uc2UsIHJlYWxGaWxlTmFtZSk7CisgICAgICAgICAgICBGaWxlVXRpbHMud3JpdGVCeXRlcyhmaWxlUGF0aCwgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgaWYgKGRlbGV0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlRmlsZShmaWxlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuS4i+i9veaWh+S7tuWksei0pSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa55So5LiK5Lyg6K+35rGC77yI5Y2V5Liq77yJCisgICAgICovCisgICAgQFBvc3RNYXBwaW5nKCIvdXBsb2FkIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCB1cGxvYWRGaWxlKE11bHRpcGFydEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOS4iuS8oOaWh+S7tui3r+W+hAorICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gUnVvWWlDb25maWcuZ2V0VXBsb2FkUGF0aCgpOworICAgICAgICAgICAgLy8g5LiK5Lyg5bm26L+U5Zue5paw5paH5Lu25ZCN56ewCisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXBsb2FkVXRpbHMudXBsb2FkKGZpbGVQYXRoLCBmaWxlKTsKKyAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzZXJ2ZXJDb25maWcuZ2V0VXJsKCkgKyBmaWxlTmFtZTsKKyAgICAgICAgICAgIEFqYXhSZXN1bHQgYWpheCA9IEFqYXhSZXN1bHQuc3VjY2VzcygpOworICAgICAgICAgICAgYWpheC5wdXQoInVybCIsIHVybCk7CisgICAgICAgICAgICBhamF4LnB1dCgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7CisgICAgICAgICAgICBhamF4LnB1dCgibmV3RmlsZU5hbWUiLCBGaWxlVXRpbHMuZ2V0TmFtZShmaWxlTmFtZSkpOworICAgICAgICAgICAgYWpheC5wdXQoIm9yaWdpbmFsRmlsZW5hbWUiLCBmaWxlLmdldE9yaWdpbmFsRmlsZW5hbWUoKSk7CisgICAgICAgICAgICByZXR1cm4gYWpheDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmueUqOS4iuS8oOivt+axgu+8iOWkmuS4qu+8iQorICAgICAqLworICAgIEBQb3N0TWFwcGluZygiL3VwbG9hZHMiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHVwbG9hZEZpbGVzKExpc3Q8TXVsdGlwYXJ0RmlsZT4gZmlsZXMpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyDkuIrkvKDmlofku7bot6/lvoQKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IFJ1b1lpQ29uZmlnLmdldFVwbG9hZFBhdGgoKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1cmxzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gbmV3RmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gb3JpZ2luYWxGaWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvciAoTXVsdGlwYXJ0RmlsZSBmaWxlIDogZmlsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g5LiK5Lyg5bm26L+U5Zue5paw5paH5Lu25ZCN56ewCisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gRmlsZVVwbG9hZFV0aWxzLnVwbG9hZChmaWxlUGF0aCwgZmlsZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IHNlcnZlckNvbmZpZy5nZXRVcmwoKSArIGZpbGVOYW1lOworICAgICAgICAgICAgICAgIHVybHMuYWRkKHVybCk7CisgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmFkZChmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgbmV3RmlsZU5hbWVzLmFkZChGaWxlVXRpbHMuZ2V0TmFtZShmaWxlTmFtZSkpOworICAgICAgICAgICAgICAgIG9yaWdpbmFsRmlsZW5hbWVzLmFkZChmaWxlLmdldE9yaWdpbmFsRmlsZW5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBamF4UmVzdWx0IGFqYXggPSBBamF4UmVzdWx0LnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGFqYXgucHV0KCJ1cmxzIiwgU3RyaW5nVXRpbHMuam9pbih1cmxzLCBGSUxFX0RFTElNRVRFUikpOworICAgICAgICAgICAgYWpheC5wdXQoImZpbGVOYW1lcyIsIFN0cmluZ1V0aWxzLmpvaW4oZmlsZU5hbWVzLCBGSUxFX0RFTElNRVRFUikpOworICAgICAgICAgICAgYWpheC5wdXQoIm5ld0ZpbGVOYW1lcyIsIFN0cmluZ1V0aWxzLmpvaW4obmV3RmlsZU5hbWVzLCBGSUxFX0RFTElNRVRFUikpOworICAgICAgICAgICAgYWpheC5wdXQoIm9yaWdpbmFsRmlsZW5hbWVzIiwgU3RyaW5nVXRpbHMuam9pbihvcmlnaW5hbEZpbGVuYW1lcywgRklMRV9ERUxJTUVURVIpKTsKKyAgICAgICAgICAgIHJldHVybiBhamF4OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5pys5Zyw6LWE5rqQ6YCa55So5LiL6L29CisgICAgICovCisgICAgQEdldE1hcHBpbmcoIi9kb3dubG9hZC9yZXNvdXJjZSIpCisgICAgcHVibGljIHZvaWQgcmVzb3VyY2VEb3dubG9hZChTdHJpbmcgcmVzb3VyY2UsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghRmlsZVV0aWxzLmNoZWNrQWxsb3dEb3dubG9hZChyZXNvdXJjZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihTdHJpbmdVdGlscy5mb3JtYXQoIui1hOa6kOaWh+S7tih7fSnpnZ7ms5XvvIzkuI3lhYHorrjkuIvovb3jgIIgIiwgcmVzb3VyY2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIOacrOWcsOi1hOa6kOi3r+W+hAorICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGF0aCA9IFJ1b1lpQ29uZmlnLmdldFByb2ZpbGUoKTsKKyAgICAgICAgICAgIC8vIOaVsOaNruW6k+i1hOa6kOWcsOWdgAorICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkUGF0aCA9IGxvY2FsUGF0aCArIFN0cmluZ1V0aWxzLnN1YnN0cmluZ0FmdGVyKHJlc291cmNlLCBDb25zdGFudHMuUkVTT1VSQ0VfUFJFRklYKTsKKyAgICAgICAgICAgIC8vIOS4i+i9veWQjeensAorICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkTmFtZSA9IFN0cmluZ1V0aWxzLnN1YnN0cmluZ0FmdGVyTGFzdChkb3dubG9hZFBhdGgsICIvIik7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1ZBTFVFKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5zZXRBdHRhY2htZW50UmVzcG9uc2VIZWFkZXIocmVzcG9uc2UsIGRvd25sb2FkTmFtZSk7CisgICAgICAgICAgICBGaWxlVXRpbHMud3JpdGVCeXRlcyhkb3dubG9hZFBhdGgsIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi5LiL6L295paH5Lu25aSx6LSlIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9tb25pdG9yL0NhY2hlQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9DYWNoZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdiZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9DYWNoZUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIubW9uaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVkaXMuY29yZS5SZWRpc0NhbGxiYWNrOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5jb3JlLlJlZGlzVGVtcGxhdGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ2FjaGVDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzQ2FjaGU7CisKKy8qKgorICog57yT5a2Y55uR5o6nCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9tb25pdG9yL2NhY2hlIikKK3B1YmxpYyBjbGFzcyBDYWNoZUNvbnRyb2xsZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSZWRpc1RlbXBsYXRlPFN0cmluZywgU3RyaW5nPiByZWRpc1RlbXBsYXRlOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTeXNDYWNoZT4gY2FjaGVzID0gbmV3IEFycmF5TGlzdDxTeXNDYWNoZT4oKTsKKyAgICB7CisgICAgICAgIGNhY2hlcy5hZGQobmV3IFN5c0NhY2hlKENhY2hlQ29uc3RhbnRzLkxPR0lOX1RPS0VOX0tFWSwgIueUqOaIt+S/oeaBryIpKTsKKyAgICAgICAgY2FjaGVzLmFkZChuZXcgU3lzQ2FjaGUoQ2FjaGVDb25zdGFudHMuU1lTX0NPTkZJR19LRVksICLphY3nva7kv6Hmga8iKSk7CisgICAgICAgIGNhY2hlcy5hZGQobmV3IFN5c0NhY2hlKENhY2hlQ29uc3RhbnRzLlNZU19ESUNUX0tFWSwgIuaVsOaNruWtl+WFuCIpKTsKKyAgICAgICAgY2FjaGVzLmFkZChuZXcgU3lzQ2FjaGUoQ2FjaGVDb25zdGFudHMuQ0FQVENIQV9DT0RFX0tFWSwgIumqjOivgeeggSIpKTsKKyAgICAgICAgY2FjaGVzLmFkZChuZXcgU3lzQ2FjaGUoQ2FjaGVDb25zdGFudHMuUkVQRUFUX1NVQk1JVF9LRVksICLpmLLph43mj5DkuqQiKSk7CisgICAgICAgIGNhY2hlcy5hZGQobmV3IFN5c0NhY2hlKENhY2hlQ29uc3RhbnRzLlJBVEVfTElNSVRfS0VZLCAi6ZmQ5rWB5aSE55CGIikpOworICAgICAgICBjYWNoZXMuYWRkKG5ldyBTeXNDYWNoZShDYWNoZUNvbnN0YW50cy5QV0RfRVJSX0NOVF9LRVksICLlr4bnoIHplJnor6/mrKHmlbAiKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6Y2FjaGU6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgaW5mbyA9IChQcm9wZXJ0aWVzKSByZWRpc1RlbXBsYXRlLmV4ZWN1dGUoKFJlZGlzQ2FsbGJhY2s8T2JqZWN0PikgY29ubmVjdGlvbiAtPiBjb25uZWN0aW9uLmluZm8oKSk7CisgICAgICAgIFByb3BlcnRpZXMgY29tbWFuZFN0YXRzID0gKFByb3BlcnRpZXMpIHJlZGlzVGVtcGxhdGUuZXhlY3V0ZSgoUmVkaXNDYWxsYmFjazxPYmplY3Q+KSBjb25uZWN0aW9uIC0+IGNvbm5lY3Rpb24uaW5mbygiY29tbWFuZHN0YXRzIikpOworICAgICAgICBPYmplY3QgZGJTaXplID0gcmVkaXNUZW1wbGF0ZS5leGVjdXRlKChSZWRpc0NhbGxiYWNrPE9iamVjdD4pIGNvbm5lY3Rpb24gLT4gY29ubmVjdGlvbi5kYlNpemUoKSk7CisKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KDMpOworICAgICAgICByZXN1bHQucHV0KCJpbmZvIiwgaW5mbyk7CisgICAgICAgIHJlc3VsdC5wdXQoImRiU2l6ZSIsIGRiU2l6ZSk7CisKKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiBwaWVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGNvbW1hbmRTdGF0cy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkuZm9yRWFjaChrZXkgLT4geworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBkYXRhID0gbmV3IEhhc2hNYXA8PigyKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGNvbW1hbmRTdGF0cy5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgZGF0YS5wdXQoIm5hbWUiLCBTdHJpbmdVdGlscy5yZW1vdmVTdGFydChrZXksICJjbWRzdGF0XyIpKTsKKyAgICAgICAgICAgIGRhdGEucHV0KCJ2YWx1ZSIsIFN0cmluZ1V0aWxzLnN1YnN0cmluZ0JldHdlZW4ocHJvcGVydHksICJjYWxscz0iLCAiLHVzZWMiKSk7CisgICAgICAgICAgICBwaWVMaXN0LmFkZChkYXRhKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJlc3VsdC5wdXQoImNvbW1hbmRTdGF0cyIsIHBpZUxpc3QpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKHJlc3VsdCk7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmNhY2hlOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9nZXROYW1lcyIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgY2FjaGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuc3VjY2VzcyhjYWNoZXMpOworICAgIH0KKworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpjYWNoZTpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvZ2V0S2V5cy97Y2FjaGVOYW1lfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0Q2FjaGVLZXlzKEBQYXRoVmFyaWFibGUgU3RyaW5nIGNhY2hlTmFtZSkKKyAgICB7CisgICAgICAgIFNldDxTdHJpbmc+IGNhY2hlS2V5cyA9IHJlZGlzVGVtcGxhdGUua2V5cyhjYWNoZU5hbWUgKyAiKiIpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKG5ldyBUcmVlU2V0PD4oY2FjaGVLZXlzKSk7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmNhY2hlOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9nZXRWYWx1ZS97Y2FjaGVOYW1lfS97Y2FjaGVLZXl9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBnZXRDYWNoZVZhbHVlKEBQYXRoVmFyaWFibGUgU3RyaW5nIGNhY2hlTmFtZSwgQFBhdGhWYXJpYWJsZSBTdHJpbmcgY2FjaGVLZXkpCisgICAgeworICAgICAgICBTdHJpbmcgY2FjaGVWYWx1ZSA9IHJlZGlzVGVtcGxhdGUub3BzRm9yVmFsdWUoKS5nZXQoY2FjaGVLZXkpOworICAgICAgICBTeXNDYWNoZSBzeXNDYWNoZSA9IG5ldyBTeXNDYWNoZShjYWNoZU5hbWUsIGNhY2hlS2V5LCBjYWNoZVZhbHVlKTsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuc3VjY2VzcyhzeXNDYWNoZSk7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmNhY2hlOmxpc3QnKSIpCisgICAgQERlbGV0ZU1hcHBpbmcoIi9jbGVhckNhY2hlTmFtZS97Y2FjaGVOYW1lfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgY2xlYXJDYWNoZU5hbWUoQFBhdGhWYXJpYWJsZSBTdHJpbmcgY2FjaGVOYW1lKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGNhY2hlS2V5cyA9IHJlZGlzVGVtcGxhdGUua2V5cyhjYWNoZU5hbWUgKyAiKiIpOworICAgICAgICByZWRpc1RlbXBsYXRlLmRlbGV0ZShjYWNoZUtleXMpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmNhY2hlOmxpc3QnKSIpCisgICAgQERlbGV0ZU1hcHBpbmcoIi9jbGVhckNhY2hlS2V5L3tjYWNoZUtleX0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGNsZWFyQ2FjaGVLZXkoQFBhdGhWYXJpYWJsZSBTdHJpbmcgY2FjaGVLZXkpCisgICAgeworICAgICAgICByZWRpc1RlbXBsYXRlLmRlbGV0ZShjYWNoZUtleSk7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6Y2FjaGU6bGlzdCcpIikKKyAgICBARGVsZXRlTWFwcGluZygiL2NsZWFyQ2FjaGVBbGwiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGNsZWFyQ2FjaGVBbGwoKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGNhY2hlS2V5cyA9IHJlZGlzVGVtcGxhdGUua2V5cygiKiIpOworICAgICAgICByZWRpc1RlbXBsYXRlLmRlbGV0ZShjYWNoZUtleXMpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9TZXJ2ZXJDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9tb25pdG9yL1NlcnZlckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzgwNWFkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9TZXJ2ZXJDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIubW9uaXRvcjsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYWNjZXNzLnByZXBvc3QuUHJlQXV0aG9yaXplOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5TZXJ2ZXI7CisKKy8qKgorICog5pyN5Yqh5Zmo55uR5o6nCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9tb25pdG9yL3NlcnZlciIpCitwdWJsaWMgY2xhc3MgU2VydmVyQ29udHJvbGxlcgoreworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpzZXJ2ZXI6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBuZXcgU2VydmVyKCk7CisgICAgICAgIHNlcnZlci5jb3B5VG8oKTsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuc3VjY2VzcyhzZXJ2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL21vbml0b3IvU3lzTG9naW5pbmZvckNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL21vbml0b3IvU3lzTG9naW5pbmZvckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmZhYzcxCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9TeXNMb2dpbmluZm9yQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLm1vbml0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uRGVsZXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUGF0aFZhcmlhYmxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLnNlcnZpY2UuU3lzUGFzc3dvcmRTZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c0xvZ2luaW5mb3I7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNMb2dpbmluZm9yU2VydmljZTsKKworLyoqCisgKiDns7vnu5/orr/pl67orrDlvZUKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL21vbml0b3IvbG9naW5pbmZvciIpCitwdWJsaWMgY2xhc3MgU3lzTG9naW5pbmZvckNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNMb2dpbmluZm9yU2VydmljZSBsb2dpbmluZm9yU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1Bhc3N3b3JkU2VydmljZSBwYXNzd29yZFNlcnZpY2U7CisKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6bG9naW5pbmZvcjpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTeXNMb2dpbmluZm9yIGxvZ2luaW5mb3IpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNMb2dpbmluZm9yPiBsaXN0ID0gbG9naW5pbmZvclNlcnZpY2Uuc2VsZWN0TG9naW5pbmZvckxpc3QobG9naW5pbmZvcik7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLnmbvlvZXml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpsb2dpbmluZm9yOmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNMb2dpbmluZm9yIGxvZ2luaW5mb3IpCisgICAgeworICAgICAgICBMaXN0PFN5c0xvZ2luaW5mb3I+IGxpc3QgPSBsb2dpbmluZm9yU2VydmljZS5zZWxlY3RMb2dpbmluZm9yTGlzdChsb2dpbmluZm9yKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c0xvZ2luaW5mb3I+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c0xvZ2luaW5mb3I+KFN5c0xvZ2luaW5mb3IuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi55m75b2V5pel5b+XIik7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi55m75b2V5pel5b+XIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKyAgICBARGVsZXRlTWFwcGluZygiL3tpbmZvSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIGluZm9JZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KGxvZ2luaW5mb3JTZXJ2aWNlLmRlbGV0ZUxvZ2luaW5mb3JCeUlkcyhpbmZvSWRzKSk7CisgICAgfQorCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmxvZ2luaW5mb3I6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi55m75b2V5pel5b+XIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkNMRUFOKQorICAgIEBEZWxldGVNYXBwaW5nKCIvY2xlYW4iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGNsZWFuKCkKKyAgICB7CisgICAgICAgIGxvZ2luaW5mb3JTZXJ2aWNlLmNsZWFuTG9naW5pbmZvcigpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KKworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpsb2dpbmluZm9yOnVubG9jaycpIikKKyAgICBATG9nKHRpdGxlID0gIui0puaIt+ino+mUgSIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5PVEhFUikKKyAgICBAR2V0TWFwcGluZygiL3VubG9jay97dXNlck5hbWV9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCB1bmxvY2soQFBhdGhWYXJpYWJsZSgidXNlck5hbWUiKSBTdHJpbmcgdXNlck5hbWUpCisgICAgeworICAgICAgICBwYXNzd29yZFNlcnZpY2UuY2xlYXJMb2dpblJlY29yZENhY2hlKHVzZXJOYW1lKTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9tb25pdG9yL1N5c09wZXJsb2dDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9tb25pdG9yL1N5c09wZXJsb2dDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL21vbml0b3IvU3lzT3BlcmxvZ0NvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5tb25pdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uTG9nOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZS5UYWJsZURhdGFJbmZvOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNPcGVyTG9nOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzT3BlckxvZ1NlcnZpY2U7CisKKy8qKgorICog5pON5L2c5pel5b+X6K6w5b2VCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9tb25pdG9yL29wZXJsb2ciKQorcHVibGljIGNsYXNzIFN5c09wZXJsb2dDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzT3BlckxvZ1NlcnZpY2Ugb3BlckxvZ1NlcnZpY2U7CisKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6b3BlcmxvZzpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTeXNPcGVyTG9nIG9wZXJMb2cpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNPcGVyTG9nPiBsaXN0ID0gb3BlckxvZ1NlcnZpY2Uuc2VsZWN0T3BlckxvZ0xpc3Qob3BlckxvZyk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLmk43kvZzml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpvcGVybG9nOmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNPcGVyTG9nIG9wZXJMb2cpCisgICAgeworICAgICAgICBMaXN0PFN5c09wZXJMb2c+IGxpc3QgPSBvcGVyTG9nU2VydmljZS5zZWxlY3RPcGVyTG9nTGlzdChvcGVyTG9nKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c09wZXJMb2c+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c09wZXJMb2c+KFN5c09wZXJMb2cuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi5pON5L2c5pel5b+XIik7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLmk43kvZzml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuREVMRVRFKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpvcGVybG9nOnJlbW92ZScpIikKKyAgICBARGVsZXRlTWFwcGluZygiL3tvcGVySWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIG9wZXJJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KG9wZXJMb2dTZXJ2aWNlLmRlbGV0ZU9wZXJMb2dCeUlkcyhvcGVySWRzKSk7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLmk43kvZzml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuQ0xFQU4pCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOm9wZXJsb2c6cmVtb3ZlJykiKQorICAgIEBEZWxldGVNYXBwaW5nKCIvY2xlYW4iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGNsZWFuKCkKKyAgICB7CisgICAgICAgIG9wZXJMb2dTZXJ2aWNlLmNsZWFuT3BlckxvZygpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL21vbml0b3IvU3lzVXNlck9ubGluZUNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL21vbml0b3IvU3lzVXNlck9ubGluZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQyODYzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvbW9uaXRvci9TeXNVc2VyT25saW5lQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLm1vbml0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5DYWNoZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucmVkaXMuUmVkaXNDYWNoZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1VzZXJPbmxpbmU7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNVc2VyT25saW5lU2VydmljZTsKKworLyoqCisgKiDlnKjnur/nlKjmiLfnm5HmjqcKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL21vbml0b3Ivb25saW5lIikKK3B1YmxpYyBjbGFzcyBTeXNVc2VyT25saW5lQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1VzZXJPbmxpbmVTZXJ2aWNlIHVzZXJPbmxpbmVTZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUmVkaXNDYWNoZSByZWRpc0NhY2hlOworCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOm9ubGluZTpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTdHJpbmcgaXBhZGRyLCBTdHJpbmcgdXNlck5hbWUpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4ga2V5cyA9IHJlZGlzQ2FjaGUua2V5cyhDYWNoZUNvbnN0YW50cy5MT0dJTl9UT0tFTl9LRVkgKyAiKiIpOworICAgICAgICBMaXN0PFN5c1VzZXJPbmxpbmU+IHVzZXJPbmxpbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTeXNVc2VyT25saW5lPigpOworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlzKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dpblVzZXIgdXNlciA9IHJlZGlzQ2FjaGUuZ2V0Q2FjaGVPYmplY3Qoa2V5KTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGlwYWRkcikgJiYgU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh1c2VyTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlck9ubGluZUxpc3QuYWRkKHVzZXJPbmxpbmVTZXJ2aWNlLnNlbGVjdE9ubGluZUJ5SW5mbyhpcGFkZHIsIHVzZXJOYW1lLCB1c2VyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGlwYWRkcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlck9ubGluZUxpc3QuYWRkKHVzZXJPbmxpbmVTZXJ2aWNlLnNlbGVjdE9ubGluZUJ5SXBhZGRyKGlwYWRkciwgdXNlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh1c2VyTmFtZSkgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHVzZXIuZ2V0VXNlcigpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VyT25saW5lTGlzdC5hZGQodXNlck9ubGluZVNlcnZpY2Uuc2VsZWN0T25saW5lQnlVc2VyTmFtZSh1c2VyTmFtZSwgdXNlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZXJPbmxpbmVMaXN0LmFkZCh1c2VyT25saW5lU2VydmljZS5sb2dpblVzZXJUb1VzZXJPbmxpbmUodXNlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UodXNlck9ubGluZUxpc3QpOworICAgICAgICB1c2VyT25saW5lTGlzdC5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG51bGwpKTsKKyAgICAgICAgcmV0dXJuIGdldERhdGFUYWJsZSh1c2VyT25saW5lTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5by66YCA55So5oi3CisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOm9ubGluZTpmb3JjZUxvZ291dCcpIikKKyAgICBATG9nKHRpdGxlID0gIuWcqOe6v+eUqOaItyIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5GT1JDRSkKKyAgICBARGVsZXRlTWFwcGluZygiL3t0b2tlbklkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZm9yY2VMb2dvdXQoQFBhdGhWYXJpYWJsZSBTdHJpbmcgdG9rZW5JZCkKKyAgICB7CisgICAgICAgIHJlZGlzQ2FjaGUuZGVsZXRlT2JqZWN0KENhY2hlQ29uc3RhbnRzLkxPR0lOX1RPS0VOX0tFWSArIHRva2VuSWQpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNDb25maWdDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzQ29uZmlnQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTg1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzQ29uZmlnQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5zeXN0ZW07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaS5FeGNlbFV0aWw7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzQ29uZmlnOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzQ29uZmlnU2VydmljZTsKKworLyoqCisgKiDlj4LmlbDphY3nva4g5L+h5oGv5pON5L2c5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9zeXN0ZW0vY29uZmlnIikKK3B1YmxpYyBjbGFzcyBTeXNDb25maWdDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzQ29uZmlnU2VydmljZSBjb25maWdTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog6I635Y+W5Y+C5pWw6YWN572u5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06Y29uZmlnOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9saXN0IikKKyAgICBwdWJsaWMgVGFibGVEYXRhSW5mbyBsaXN0KFN5c0NvbmZpZyBjb25maWcpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNDb25maWc+IGxpc3QgPSBjb25maWdTZXJ2aWNlLnNlbGVjdENvbmZpZ0xpc3QoY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIGdldERhdGFUYWJsZShsaXN0KTsKKyAgICB9CisKKyAgICBATG9nKHRpdGxlID0gIuWPguaVsOeuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5FWFBPUlQpCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06Y29uZmlnOmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNDb25maWc+IGxpc3QgPSBjb25maWdTZXJ2aWNlLnNlbGVjdENvbmZpZ0xpc3QoY29uZmlnKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c0NvbmZpZz4gdXRpbCA9IG5ldyBFeGNlbFV0aWw8U3lzQ29uZmlnPihTeXNDb25maWcuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi5Y+C5pWw5pWw5o2uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5Y+C5pWw57yW5Y+36I635Y+W6K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06Y29uZmlnOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97Y29uZmlnSWR9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBnZXRJbmZvKEBQYXRoVmFyaWFibGUgTG9uZyBjb25maWdJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKGNvbmZpZ1NlcnZpY2Uuc2VsZWN0Q29uZmlnQnlJZChjb25maWdJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWPguaVsOmUruWQjeafpeivouWPguaVsOWAvAorICAgICAqLworICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi9jb25maWdLZXkve2NvbmZpZ0tleX0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldENvbmZpZ0tleShAUGF0aFZhcmlhYmxlIFN0cmluZyBjb25maWdLZXkpCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2Vzcyhjb25maWdTZXJ2aWNlLnNlbGVjdENvbmZpZ0J5S2V5KGNvbmZpZ0tleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuWPguaVsOmFjee9rgorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmNvbmZpZzphZGQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlj4LmlbDnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU5TRVJUKQorICAgIEBQb3N0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGFkZChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKCFjb25maWdTZXJ2aWNlLmNoZWNrQ29uZmlnS2V5VW5pcXVlKGNvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe5Y+C5pWwJyIgKyBjb25maWcuZ2V0Q29uZmlnTmFtZSgpICsgIiflpLHotKXvvIzlj4LmlbDplK7lkI3lt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBjb25maWcuc2V0Q3JlYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgoY29uZmlnU2VydmljZS5pbnNlcnRDb25maWcoY29uZmlnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55Y+C5pWw6YWN572uCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06Y29uZmlnOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlj4LmlbDnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKCFjb25maWdTZXJ2aWNlLmNoZWNrQ29uZmlnS2V5VW5pcXVlKGNvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55Y+C5pWwJyIgKyBjb25maWcuZ2V0Q29uZmlnTmFtZSgpICsgIiflpLHotKXvvIzlj4LmlbDplK7lkI3lt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBjb25maWcuc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgoY29uZmlnU2VydmljZS51cGRhdGVDb25maWcoY29uZmlnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk5Y+C5pWw6YWN572uCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06Y29uZmlnOnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIuWPguaVsOeuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97Y29uZmlnSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIGNvbmZpZ0lkcykKKyAgICB7CisgICAgICAgIGNvbmZpZ1NlcnZpY2UuZGVsZXRlQ29uZmlnQnlJZHMoY29uZmlnSWRzKTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliLfmlrDlj4LmlbDnvJPlrZgKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpjb25maWc6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi5Y+C5pWw566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkNMRUFOKQorICAgIEBEZWxldGVNYXBwaW5nKCIvcmVmcmVzaENhY2hlIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCByZWZyZXNoQ2FjaGUoKQorICAgIHsKKyAgICAgICAgY29uZmlnU2VydmljZS5yZXNldENvbmZpZ0NhY2hlKCk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0RlcHRDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzRGVwdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU3NTg4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0RlcHRDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLnN5c3RlbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RlcHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0RlcHRTZXJ2aWNlOworCisvKioKKyAqIOmDqOmXqOS/oeaBrworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvc3lzdGVtL2RlcHQiKQorcHVibGljIGNsYXNzIFN5c0RlcHRDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzRGVwdFNlcnZpY2UgZGVwdFNlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpg6jpl6jliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkZXB0Omxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9saXN0IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBsaXN0KFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzRGVwdD4gZGVwdHMgPSBkZXB0U2VydmljZS5zZWxlY3REZXB0TGlzdChkZXB0KTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZGVwdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOWIl+ihqO+8iOaOkumZpOiKgueCue+8iQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRlcHQ6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QvZXhjbHVkZS97ZGVwdElkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZXhjbHVkZUNoaWxkKEBQYXRoVmFyaWFibGUodmFsdWUgPSAiZGVwdElkIiwgcmVxdWlyZWQgPSBmYWxzZSkgTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICBMaXN0PFN5c0RlcHQ+IGRlcHRzID0gZGVwdFNlcnZpY2Uuc2VsZWN0RGVwdExpc3QobmV3IFN5c0RlcHQoKSk7CisgICAgICAgIGRlcHRzLnJlbW92ZUlmKGQgLT4gZC5nZXREZXB0SWQoKS5pbnRWYWx1ZSgpID09IGRlcHRJZCB8fCBBcnJheVV0aWxzLmNvbnRhaW5zKFN0cmluZ1V0aWxzLnNwbGl0KGQuZ2V0QW5jZXN0b3JzKCksICIsIiksIGRlcHRJZCArICIiKSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKGRlcHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7pg6jpl6jnvJblj7fojrflj5bor6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkZXB0OnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97ZGVwdElkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgZGVwdElkKQorICAgIHsKKyAgICAgICAgZGVwdFNlcnZpY2UuY2hlY2tEZXB0RGF0YVNjb3BlKGRlcHRJZCk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKGRlcHRTZXJ2aWNlLnNlbGVjdERlcHRCeUlkKGRlcHRJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinumDqOmXqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRlcHQ6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi6YOo6Zeo566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzRGVwdCBkZXB0KQorICAgIHsKKyAgICAgICAgaWYgKCFkZXB0U2VydmljZS5jaGVja0RlcHROYW1lVW5pcXVlKGRlcHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinumDqOmXqCciICsgZGVwdC5nZXREZXB0TmFtZSgpICsgIiflpLHotKXvvIzpg6jpl6jlkI3np7Dlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBkZXB0LnNldENyZWF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KGRlcHRTZXJ2aWNlLmluc2VydERlcHQoZGVwdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUuemDqOmXqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRlcHQ6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIumDqOmXqOeuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBlZGl0KEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIExvbmcgZGVwdElkID0gZGVwdC5nZXREZXB0SWQoKTsKKyAgICAgICAgZGVwdFNlcnZpY2UuY2hlY2tEZXB0RGF0YVNjb3BlKGRlcHRJZCk7CisgICAgICAgIGlmICghZGVwdFNlcnZpY2UuY2hlY2tEZXB0TmFtZVVuaXF1ZShkZXB0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnpg6jpl6gnIiArIGRlcHQuZ2V0RGVwdE5hbWUoKSArICIn5aSx6LSl77yM6YOo6Zeo5ZCN56ew5bey5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVwdC5nZXRQYXJlbnRJZCgpLmVxdWFscyhkZXB0SWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUuemDqOmXqCciICsgZGVwdC5nZXREZXB0TmFtZSgpICsgIiflpLHotKXvvIzkuIrnuqfpg6jpl6jkuI3og73mmK/oh6rlt7EiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5lcXVhbHMoVXNlckNvbnN0YW50cy5ERVBUX0RJU0FCTEUsIGRlcHQuZ2V0U3RhdHVzKCkpICYmIGRlcHRTZXJ2aWNlLnNlbGVjdE5vcm1hbENoaWxkcmVuRGVwdEJ5SWQoZGVwdElkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi6K+l6YOo6Zeo5YyF5ZCr5pyq5YGc55So55qE5a2Q6YOo6Zeo77yBIik7CisgICAgICAgIH0KKyAgICAgICAgZGVwdC5zZXRVcGRhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChkZXB0U2VydmljZS51cGRhdGVEZXB0KGRlcHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTpg6jpl6gKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkZXB0OnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIumDqOmXqOeuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97ZGVwdElkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICBpZiAoZGVwdFNlcnZpY2UuaGFzQ2hpbGRCeURlcHRJZChkZXB0SWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2Fybigi5a2Y5Zyo5LiL57qn6YOo6ZeoLOS4jeWFgeiuuOWIoOmZpCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXB0U2VydmljZS5jaGVja0RlcHRFeGlzdFVzZXIoZGVwdElkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHdhcm4oIumDqOmXqOWtmOWcqOeUqOaItyzkuI3lhYHorrjliKDpmaQiKTsKKyAgICAgICAgfQorICAgICAgICBkZXB0U2VydmljZS5jaGVja0RlcHREYXRhU2NvcGUoZGVwdElkKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChkZXB0U2VydmljZS5kZWxldGVEZXB0QnlJZChkZXB0SWQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzRGljdERhdGFDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzRGljdERhdGFDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1NDkyYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNEaWN0RGF0YUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIuc3lzdGVtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdERhdGE7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0RpY3REYXRhU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0RpY3RUeXBlU2VydmljZTsKKworLyoqCisgKiDmlbDmja7lrZflhbjkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3N5c3RlbS9kaWN0L2RhdGEiKQorcHVibGljIGNsYXNzIFN5c0RpY3REYXRhQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c0RpY3REYXRhU2VydmljZSBkaWN0RGF0YVNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzRGljdFR5cGVTZXJ2aWNlIGRpY3RUeXBlU2VydmljZTsKKworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRpY3Q6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoU3lzRGljdERhdGEgZGljdERhdGEpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNEaWN0RGF0YT4gbGlzdCA9IGRpY3REYXRhU2VydmljZS5zZWxlY3REaWN0RGF0YUxpc3QoZGljdERhdGEpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIEBMb2codGl0bGUgPSAi5a2X5YW45pWw5o2uIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkaWN0OmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNEaWN0RGF0YSBkaWN0RGF0YSkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzRGljdERhdGE+IGxpc3QgPSBkaWN0RGF0YVNlcnZpY2Uuc2VsZWN0RGljdERhdGFMaXN0KGRpY3REYXRhKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c0RpY3REYXRhPiB1dGlsID0gbmV3IEV4Y2VsVXRpbDxTeXNEaWN0RGF0YT4oU3lzRGljdERhdGEuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi5a2X5YW45pWw5o2uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5a2X5YW45pWw5o2u6K+m57uGCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve2RpY3RDb2RlfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgZGljdENvZGUpCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2VzcyhkaWN0RGF0YVNlcnZpY2Uuc2VsZWN0RGljdERhdGFCeUlkKGRpY3RDb2RlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5p+l6K+i5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICovCisgICAgQEdldE1hcHBpbmcodmFsdWUgPSAiL3R5cGUve2RpY3RUeXBlfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZGljdFR5cGUoQFBhdGhWYXJpYWJsZSBTdHJpbmcgZGljdFR5cGUpCisgICAgeworICAgICAgICBMaXN0PFN5c0RpY3REYXRhPiBkYXRhID0gZGljdFR5cGVTZXJ2aWNlLnNlbGVjdERpY3REYXRhQnlUeXBlKGRpY3RUeXBlKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbChkYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YSA9IG5ldyBBcnJheUxpc3Q8U3lzRGljdERhdGE+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe5a2X5YW457G75Z6LCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDphZGQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrZflhbjmlbDmja4iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU5TRVJUKQorICAgIEBQb3N0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGFkZChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNEaWN0RGF0YSBkaWN0KQorICAgIHsKKyAgICAgICAgZGljdC5zZXRDcmVhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChkaWN0RGF0YVNlcnZpY2UuaW5zZXJ0RGljdERhdGEoZGljdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOWtl+WFuOexu+WeiworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRpY3Q6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuWtl+WFuOaVsOaNriIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBlZGl0KEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c0RpY3REYXRhIGRpY3QpCisgICAgeworICAgICAgICBkaWN0LnNldFVwZGF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KGRpY3REYXRhU2VydmljZS51cGRhdGVEaWN0RGF0YShkaWN0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk5a2X5YW457G75Z6LCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrZflhbjnsbvlnosiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuREVMRVRFKQorICAgIEBEZWxldGVNYXBwaW5nKCIve2RpY3RDb2Rlc30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlIExvbmdbXSBkaWN0Q29kZXMpCisgICAgeworICAgICAgICBkaWN0RGF0YVNlcnZpY2UuZGVsZXRlRGljdERhdGFCeUlkcyhkaWN0Q29kZXMpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNEaWN0VHlwZUNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNEaWN0VHlwZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmYzMTRjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0RpY3RUeXBlQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5zeXN0ZW07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdFR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaS5FeGNlbFV0aWw7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNEaWN0VHlwZVNlcnZpY2U7CisKKy8qKgorICog5pWw5o2u5a2X5YW45L+h5oGvCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9zeXN0ZW0vZGljdC90eXBlIikKK3B1YmxpYyBjbGFzcyBTeXNEaWN0VHlwZUNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNEaWN0VHlwZVNlcnZpY2UgZGljdFR5cGVTZXJ2aWNlOworCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTeXNEaWN0VHlwZSBkaWN0VHlwZSkKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFN5c0RpY3RUeXBlPiBsaXN0ID0gZGljdFR5cGVTZXJ2aWNlLnNlbGVjdERpY3RUeXBlTGlzdChkaWN0VHlwZSk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLlrZflhbjnsbvlnosiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOmRpY3Q6ZXhwb3J0JykiKQorICAgIEBQb3N0TWFwcGluZygiL2V4cG9ydCIpCisgICAgcHVibGljIHZvaWQgZXhwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN5c0RpY3RUeXBlIGRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNEaWN0VHlwZT4gbGlzdCA9IGRpY3RUeXBlU2VydmljZS5zZWxlY3REaWN0VHlwZUxpc3QoZGljdFR5cGUpOworICAgICAgICBFeGNlbFV0aWw8U3lzRGljdFR5cGU+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c0RpY3RUeXBlPihTeXNEaWN0VHlwZS5jbGFzcyk7CisgICAgICAgIHV0aWwuZXhwb3J0RXhjZWwocmVzcG9uc2UsIGxpc3QsICLlrZflhbjnsbvlnosiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LlrZflhbjnsbvlnovor6bnu4YKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkaWN0OnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97ZGljdElkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgZGljdElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZGljdFR5cGVTZXJ2aWNlLnNlbGVjdERpY3RUeXBlQnlJZChkaWN0SWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7lrZflhbjnsbvlnosKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkaWN0OmFkZCcpIikKKyAgICBATG9nKHRpdGxlID0gIuWtl+WFuOexu+WeiyIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5JTlNFUlQpCisgICAgQFBvc3RNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgYWRkKEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c0RpY3RUeXBlIGRpY3QpCisgICAgeworICAgICAgICBpZiAoIWRpY3RUeXBlU2VydmljZS5jaGVja0RpY3RUeXBlVW5pcXVlKGRpY3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinuWtl+WFuCciICsgZGljdC5nZXREaWN0TmFtZSgpICsgIiflpLHotKXvvIzlrZflhbjnsbvlnovlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBkaWN0LnNldENyZWF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KGRpY3RUeXBlU2VydmljZS5pbnNlcnREaWN0VHlwZShkaWN0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55a2X5YW457G75Z6LCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi5a2X5YW457G75Z6LIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUHV0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVkaXQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzRGljdFR5cGUgZGljdCkKKyAgICB7CisgICAgICAgIGlmICghZGljdFR5cGVTZXJ2aWNlLmNoZWNrRGljdFR5cGVVbmlxdWUoZGljdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55a2X5YW4JyIgKyBkaWN0LmdldERpY3ROYW1lKCkgKyAiJ+Wksei0pe+8jOWtl+WFuOexu+Wei+W3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGRpY3Quc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgoZGljdFR5cGVTZXJ2aWNlLnVwZGF0ZURpY3RUeXBlKGRpY3QpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTlrZflhbjnsbvlnosKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpkaWN0OnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIuWtl+WFuOexu+WeiyIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97ZGljdElkc30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlIExvbmdbXSBkaWN0SWRzKQorICAgIHsKKyAgICAgICAgZGljdFR5cGVTZXJ2aWNlLmRlbGV0ZURpY3RUeXBlQnlJZHMoZGljdElkcyk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yi35paw5a2X5YW457yT5a2YCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06ZGljdDpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrZflhbjnsbvlnosiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuQ0xFQU4pCisgICAgQERlbGV0ZU1hcHBpbmcoIi9yZWZyZXNoQ2FjaGUiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlZnJlc2hDYWNoZSgpCisgICAgeworICAgICAgICBkaWN0VHlwZVNlcnZpY2UucmVzZXREaWN0Q2FjaGUoKTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blrZflhbjpgInmi6nmoYbliJfooagKKyAgICAgKi8KKyAgICBAR2V0TWFwcGluZygiL29wdGlvbnNlbGVjdCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgb3B0aW9uc2VsZWN0KCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzRGljdFR5cGU+IGRpY3RUeXBlcyA9IGRpY3RUeXBlU2VydmljZS5zZWxlY3REaWN0VHlwZUFsbCgpOworICAgICAgICByZXR1cm4gc3VjY2VzcyhkaWN0VHlwZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNJbmRleENvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNJbmRleENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAwN2ViCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0luZGV4Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLnN5c3RlbTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uZmlnLlJ1b1lpQ29uZmlnOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog6aaW6aG1CisgKgorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK3B1YmxpYyBjbGFzcyBTeXNJbmRleENvbnRyb2xsZXIKK3sKKyAgICAvKiog57O757uf5Z+656GA6YWN572uICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUnVvWWlDb25maWcgcnVveWlDb25maWc7CisKKyAgICAvKioKKyAgICAgKiDorr/pl67pppbpobXvvIzmj5DnpLror60KKyAgICAgKi8KKyAgICBAUmVxdWVzdE1hcHBpbmcoIi8iKQorICAgIHB1YmxpYyBTdHJpbmcgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmZvcm1hdCgi5qyi6L+O5L2/55Soe33lkI7lj7DnrqHnkIbmoYbmnrbvvIzlvZPliY3niYjmnKzvvJp2e33vvIzor7fpgJrov4fliY3nq6/lnLDlnYDorr/pl67jgIIiLCBydW95aUNvbmZpZy5nZXROYW1lKCksIHJ1b3lpQ29uZmlnLmdldFZlcnNpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0xvZ2luQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c0xvZ2luQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTlhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzTG9naW5Db250cm9sbGVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIuc3lzdGVtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c01lbnU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luQm9keTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZS5TeXNMb2dpblNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZS5TeXNQZXJtaXNzaW9uU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c01lbnVTZXJ2aWNlOworCisvKioKKyAqIOeZu+W9lemqjOivgQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BSZXN0Q29udHJvbGxlcgorcHVibGljIGNsYXNzIFN5c0xvZ2luQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c0xvZ2luU2VydmljZSBsb2dpblNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzTWVudVNlcnZpY2UgbWVudVNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNQZXJtaXNzaW9uU2VydmljZSBwZXJtaXNzaW9uU2VydmljZTsKKworICAgIC8qKgorICAgICAqIOeZu+W9leaWueazlQorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dpbkJvZHkg55m75b2V5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAUG9zdE1hcHBpbmcoIi9sb2dpbiIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgbG9naW4oQFJlcXVlc3RCb2R5IExvZ2luQm9keSBsb2dpbkJvZHkpCisgICAgeworICAgICAgICBBamF4UmVzdWx0IGFqYXggPSBBamF4UmVzdWx0LnN1Y2Nlc3MoKTsKKyAgICAgICAgLy8g55Sf5oiQ5Luk54mMCisgICAgICAgIFN0cmluZyB0b2tlbiA9IGxvZ2luU2VydmljZS5sb2dpbihsb2dpbkJvZHkuZ2V0VXNlcm5hbWUoKSwgbG9naW5Cb2R5LmdldFBhc3N3b3JkKCksIGxvZ2luQm9keS5nZXRDb2RlKCksCisgICAgICAgICAgICAgICAgbG9naW5Cb2R5LmdldFV1aWQoKSk7CisgICAgICAgIGFqYXgucHV0KENvbnN0YW50cy5UT0tFTiwgdG9rZW4pOworICAgICAgICByZXR1cm4gYWpheDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnlKjmiLfkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+S/oeaBrworICAgICAqLworICAgIEBHZXRNYXBwaW5nKCJnZXRJbmZvIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBnZXRJbmZvKCkKKyAgICB7CisgICAgICAgIFN5c1VzZXIgdXNlciA9IFNlY3VyaXR5VXRpbHMuZ2V0TG9naW5Vc2VyKCkuZ2V0VXNlcigpOworICAgICAgICAvLyDop5LoibLpm4blkIgKKyAgICAgICAgU2V0PFN0cmluZz4gcm9sZXMgPSBwZXJtaXNzaW9uU2VydmljZS5nZXRSb2xlUGVybWlzc2lvbih1c2VyKTsKKyAgICAgICAgLy8g5p2D6ZmQ6ZuG5ZCICisgICAgICAgIFNldDxTdHJpbmc+IHBlcm1pc3Npb25zID0gcGVybWlzc2lvblNlcnZpY2UuZ2V0TWVudVBlcm1pc3Npb24odXNlcik7CisgICAgICAgIEFqYXhSZXN1bHQgYWpheCA9IEFqYXhSZXN1bHQuc3VjY2VzcygpOworICAgICAgICBhamF4LnB1dCgidXNlciIsIHVzZXIpOworICAgICAgICBhamF4LnB1dCgicm9sZXMiLCByb2xlcyk7CisgICAgICAgIGFqYXgucHV0KCJwZXJtaXNzaW9ucyIsIHBlcm1pc3Npb25zKTsKKyAgICAgICAgcmV0dXJuIGFqYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6Lev55Sx5L+h5oGvCisgICAgICogCisgICAgICogQHJldHVybiDot6/nlLHkv6Hmga8KKyAgICAgKi8KKyAgICBAR2V0TWFwcGluZygiZ2V0Um91dGVycyIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0Um91dGVycygpCisgICAgeworICAgICAgICBMb25nIHVzZXJJZCA9IFNlY3VyaXR5VXRpbHMuZ2V0VXNlcklkKCk7CisgICAgICAgIExpc3Q8U3lzTWVudT4gbWVudXMgPSBtZW51U2VydmljZS5zZWxlY3RNZW51VHJlZUJ5VXNlcklkKHVzZXJJZCk7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MobWVudVNlcnZpY2UuYnVpbGRNZW51cyhtZW51cykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNNZW51Q29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c01lbnVDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiNmI2NQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNNZW51Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5zeXN0ZW07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Vc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNNZW51OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNNZW51U2VydmljZTsKKworLyoqCisgKiDoj5zljZXkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3N5c3RlbS9tZW51IikKK3B1YmxpYyBjbGFzcyBTeXNNZW51Q29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c01lbnVTZXJ2aWNlIG1lbnVTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog6I635Y+W6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06bWVudTpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgbGlzdChTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICBMaXN0PFN5c01lbnU+IG1lbnVzID0gbWVudVNlcnZpY2Uuc2VsZWN0TWVudUxpc3QobWVudSwgZ2V0VXNlcklkKCkpOworICAgICAgICByZXR1cm4gc3VjY2VzcyhtZW51cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u6I+c5Y2V57yW5Y+36I635Y+W6K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06bWVudTpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve21lbnVJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldEluZm8oQFBhdGhWYXJpYWJsZSBMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKG1lbnVTZXJ2aWNlLnNlbGVjdE1lbnVCeUlkKG1lbnVJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluiPnOWNleS4i+aLieagkeWIl+ihqAorICAgICAqLworICAgIEBHZXRNYXBwaW5nKCIvdHJlZXNlbGVjdCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgdHJlZXNlbGVjdChTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICBMaXN0PFN5c01lbnU+IG1lbnVzID0gbWVudVNlcnZpY2Uuc2VsZWN0TWVudUxpc3QobWVudSwgZ2V0VXNlcklkKCkpOworICAgICAgICByZXR1cm4gc3VjY2VzcyhtZW51U2VydmljZS5idWlsZE1lbnVUcmVlU2VsZWN0KG1lbnVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yqg6L295a+55bqU6KeS6Imy6I+c5Y2V5YiX6KGo5qCRCisgICAgICovCisgICAgQEdldE1hcHBpbmcodmFsdWUgPSAiL3JvbGVNZW51VHJlZXNlbGVjdC97cm9sZUlkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcm9sZU1lbnVUcmVlc2VsZWN0KEBQYXRoVmFyaWFibGUoInJvbGVJZCIpIExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNNZW51PiBtZW51cyA9IG1lbnVTZXJ2aWNlLnNlbGVjdE1lbnVMaXN0KGdldFVzZXJJZCgpKTsKKyAgICAgICAgQWpheFJlc3VsdCBhamF4ID0gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgICAgIGFqYXgucHV0KCJjaGVja2VkS2V5cyIsIG1lbnVTZXJ2aWNlLnNlbGVjdE1lbnVMaXN0QnlSb2xlSWQocm9sZUlkKSk7CisgICAgICAgIGFqYXgucHV0KCJtZW51cyIsIG1lbnVTZXJ2aWNlLmJ1aWxkTWVudVRyZWVTZWxlY3QobWVudXMpKTsKKyAgICAgICAgcmV0dXJuIGFqYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe6I+c5Y2VCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06bWVudTphZGQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLoj5zljZXnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU5TRVJUKQorICAgIEBQb3N0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGFkZChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICBpZiAoIW1lbnVTZXJ2aWNlLmNoZWNrTWVudU5hbWVVbmlxdWUobWVudSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe6I+c5Y2VJyIgKyBtZW51LmdldE1lbnVOYW1lKCkgKyAiJ+Wksei0pe+8jOiPnOWNleWQjeensOW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFVzZXJDb25zdGFudHMuWUVTX0ZSQU1FLmVxdWFscyhtZW51LmdldElzRnJhbWUoKSkgJiYgIVN0cmluZ1V0aWxzLmlzaHR0cChtZW51LmdldFBhdGgoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe6I+c5Y2VJyIgKyBtZW51LmdldE1lbnVOYW1lKCkgKyAiJ+Wksei0pe+8jOWcsOWdgOW/hemhu+S7pWh0dHAocyk6Ly/lvIDlpLQiKTsKKyAgICAgICAgfQorICAgICAgICBtZW51LnNldENyZWF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KG1lbnVTZXJ2aWNlLmluc2VydE1lbnUobWVudSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueiPnOWNlQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOm1lbnU6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuiPnOWNleeuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBlZGl0KEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c01lbnUgbWVudSkKKyAgICB7CisgICAgICAgIGlmICghbWVudVNlcnZpY2UuY2hlY2tNZW51TmFtZVVuaXF1ZShtZW51KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnoj5zljZUnIiArIG1lbnUuZ2V0TWVudU5hbWUoKSArICIn5aSx6LSl77yM6I+c5Y2V5ZCN56ew5bey5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVXNlckNvbnN0YW50cy5ZRVNfRlJBTUUuZXF1YWxzKG1lbnUuZ2V0SXNGcmFtZSgpKSAmJiAhU3RyaW5nVXRpbHMuaXNodHRwKG1lbnUuZ2V0UGF0aCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnoj5zljZUnIiArIG1lbnUuZ2V0TWVudU5hbWUoKSArICIn5aSx6LSl77yM5Zyw5Z2A5b+F6aG75LulaHR0cChzKTovL+W8gOWktCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1lbnUuZ2V0TWVudUlkKCkuZXF1YWxzKG1lbnUuZ2V0UGFyZW50SWQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS56I+c5Y2VJyIgKyBtZW51LmdldE1lbnVOYW1lKCkgKyAiJ+Wksei0pe+8jOS4iue6p+iPnOWNleS4jeiDvemAieaLqeiHquW3sSIpOworICAgICAgICB9CisgICAgICAgIG1lbnUuc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgobWVudVNlcnZpY2UudXBkYXRlTWVudShtZW51KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk6I+c5Y2VCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06bWVudTpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLoj5zljZXnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuREVMRVRFKQorICAgIEBEZWxldGVNYXBwaW5nKCIve21lbnVJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlKCJtZW51SWQiKSBMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIGlmIChtZW51U2VydmljZS5oYXNDaGlsZEJ5TWVudUlkKG1lbnVJZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3YXJuKCLlrZjlnKjlrZDoj5zljZUs5LiN5YWB6K645Yig6ZmkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbnVTZXJ2aWNlLmNoZWNrTWVudUV4aXN0Um9sZShtZW51SWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2Fybigi6I+c5Y2V5bey5YiG6YWNLOS4jeWFgeiuuOWIoOmZpCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b0FqYXgobWVudVNlcnZpY2UuZGVsZXRlTWVudUJ5SWQobWVudUlkKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNOb3RpY2VDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzTm90aWNlQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzTm90aWNlQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLnN5c3RlbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNOb3RpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNOb3RpY2VTZXJ2aWNlOworCisvKioKKyAqIOWFrOWRiiDkv6Hmga/mk43kvZzlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3N5c3RlbS9ub3RpY2UiKQorcHVibGljIGNsYXNzIFN5c05vdGljZUNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNOb3RpY2VTZXJ2aWNlIG5vdGljZVNlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpgJrnn6XlhazlkYrliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpub3RpY2U6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoU3lzTm90aWNlIG5vdGljZSkKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFN5c05vdGljZT4gbGlzdCA9IG5vdGljZVNlcnZpY2Uuc2VsZWN0Tm90aWNlTGlzdChub3RpY2UpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrumAmuefpeWFrOWRiue8luWPt+iOt+WPluivpue7huS/oeaBrworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOm5vdGljZTpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve25vdGljZUlkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgbm90aWNlSWQpCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2Vzcyhub3RpY2VTZXJ2aWNlLnNlbGVjdE5vdGljZUJ5SWQobm90aWNlSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7pgJrnn6XlhazlkYoKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpub3RpY2U6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi6YCa55+l5YWs5ZGKIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzTm90aWNlIG5vdGljZSkKKyAgICB7CisgICAgICAgIG5vdGljZS5zZXRDcmVhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChub3RpY2VTZXJ2aWNlLmluc2VydE5vdGljZShub3RpY2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnpgJrnn6XlhazlkYoKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpub3RpY2U6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIumAmuefpeWFrOWRiiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBlZGl0KEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c05vdGljZSBub3RpY2UpCisgICAgeworICAgICAgICBub3RpY2Uuc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgobm90aWNlU2VydmljZS51cGRhdGVOb3RpY2Uobm90aWNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk6YCa55+l5YWs5ZGKCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06bm90aWNlOnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIumAmuefpeWFrOWRiiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97bm90aWNlSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIG5vdGljZUlkcykKKyAgICB7CisgICAgICAgIHJldHVybiB0b0FqYXgobm90aWNlU2VydmljZS5kZWxldGVOb3RpY2VCeUlkcyhub3RpY2VJZHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUG9zdENvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNQb3N0Q29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjA0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUG9zdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIuc3lzdGVtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1Bvc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNQb3N0U2VydmljZTsKKworLyoqCisgKiDlspfkvY3kv6Hmga/mk43kvZzlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3N5c3RlbS9wb3N0IikKK3B1YmxpYyBjbGFzcyBTeXNQb3N0Q29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1Bvc3RTZXJ2aWNlIHBvc3RTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog6I635Y+W5bKX5L2N5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cG9zdDpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNQb3N0PiBsaXN0ID0gcG9zdFNlcnZpY2Uuc2VsZWN0UG9zdExpc3QocG9zdCk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorICAgIAorICAgIEBMb2codGl0bGUgPSAi5bKX5L2N566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpwb3N0OmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICBMaXN0PFN5c1Bvc3Q+IGxpc3QgPSBwb3N0U2VydmljZS5zZWxlY3RQb3N0TGlzdChwb3N0KTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c1Bvc3Q+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c1Bvc3Q+KFN5c1Bvc3QuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi5bKX5L2N5pWw5o2uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5bKX5L2N57yW5Y+36I635Y+W6K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cG9zdDpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve3Bvc3RJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdldEluZm8oQFBhdGhWYXJpYWJsZSBMb25nIHBvc3RJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKHBvc3RTZXJ2aWNlLnNlbGVjdFBvc3RCeUlkKHBvc3RJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuWyl+S9jQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnBvc3Q6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi5bKX5L2N566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzUG9zdCBwb3N0KQorICAgIHsKKyAgICAgICAgaWYgKCFwb3N0U2VydmljZS5jaGVja1Bvc3ROYW1lVW5pcXVlKHBvc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinuWyl+S9jSciICsgcG9zdC5nZXRQb3N0TmFtZSgpICsgIiflpLHotKXvvIzlspfkvY3lkI3np7Dlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghcG9zdFNlcnZpY2UuY2hlY2tQb3N0Q29kZVVuaXF1ZShwb3N0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLmlrDlop7lspfkvY0nIiArIHBvc3QuZ2V0UG9zdE5hbWUoKSArICIn5aSx6LSl77yM5bKX5L2N57yW56CB5bey5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgcG9zdC5zZXRDcmVhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChwb3N0U2VydmljZS5pbnNlcnRQb3N0KHBvc3QpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlspfkvY0KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpwb3N0OmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlspfkvY3nrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICBpZiAoIXBvc3RTZXJ2aWNlLmNoZWNrUG9zdE5hbWVVbmlxdWUocG9zdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55bKX5L2NJyIgKyBwb3N0LmdldFBvc3ROYW1lKCkgKyAiJ+Wksei0pe+8jOWyl+S9jeWQjeensOW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFwb3N0U2VydmljZS5jaGVja1Bvc3RDb2RlVW5pcXVlKHBvc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueWyl+S9jSciICsgcG9zdC5nZXRQb3N0TmFtZSgpICsgIiflpLHotKXvvIzlspfkvY3nvJbnoIHlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBwb3N0LnNldFVwZGF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KHBvc3RTZXJ2aWNlLnVwZGF0ZVBvc3QocG9zdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOWyl+S9jQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnBvc3Q6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi5bKX5L2N566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKyAgICBARGVsZXRlTWFwcGluZygiL3twb3N0SWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIHBvc3RJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHBvc3RTZXJ2aWNlLmRlbGV0ZVBvc3RCeUlkcyhwb3N0SWRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5bKX5L2N6YCJ5oup5qGG5YiX6KGoCisgICAgICovCisgICAgQEdldE1hcHBpbmcoIi9vcHRpb25zZWxlY3QiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IG9wdGlvbnNlbGVjdCgpCisgICAgeworICAgICAgICBMaXN0PFN5c1Bvc3Q+IHBvc3RzID0gcG9zdFNlcnZpY2Uuc2VsZWN0UG9zdEFsbCgpOworICAgICAgICByZXR1cm4gc3VjY2Vzcyhwb3N0cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c1Byb2ZpbGVDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUHJvZmlsZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWZhZWRkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c1Byb2ZpbGVDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLndlYi5jb250cm9sbGVyLnN5c3RlbTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdFBhcmFtOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tdWx0aXBhcnQuTXVsdGlwYXJ0RmlsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uTG9nOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uZmlnLlJ1b1lpQ29uZmlnOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNVc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4ubW9kZWwuTG9naW5Vc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZS5GaWxlVXBsb2FkVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5maWxlLk1pbWVUeXBlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZS5Ub2tlblNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNVc2VyU2VydmljZTsKKworLyoqCisgKiDkuKrkurrkv6Hmga8g5Lia5Yqh5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9zeXN0ZW0vdXNlci9wcm9maWxlIikKK3B1YmxpYyBjbGFzcyBTeXNQcm9maWxlQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1VzZXJTZXJ2aWNlIHVzZXJTZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVG9rZW5TZXJ2aWNlIHRva2VuU2VydmljZTsKKworICAgIC8qKgorICAgICAqIOS4quS6uuS/oeaBrworICAgICAqLworICAgIEBHZXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgcHJvZmlsZSgpCisgICAgeworICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gZ2V0TG9naW5Vc2VyKCk7CisgICAgICAgIFN5c1VzZXIgdXNlciA9IGxvZ2luVXNlci5nZXRVc2VyKCk7CisgICAgICAgIEFqYXhSZXN1bHQgYWpheCA9IEFqYXhSZXN1bHQuc3VjY2Vzcyh1c2VyKTsKKyAgICAgICAgYWpheC5wdXQoInJvbGVHcm91cCIsIHVzZXJTZXJ2aWNlLnNlbGVjdFVzZXJSb2xlR3JvdXAobG9naW5Vc2VyLmdldFVzZXJuYW1lKCkpKTsKKyAgICAgICAgYWpheC5wdXQoInBvc3RHcm91cCIsIHVzZXJTZXJ2aWNlLnNlbGVjdFVzZXJQb3N0R3JvdXAobG9naW5Vc2VyLmdldFVzZXJuYW1lKCkpKTsKKyAgICAgICAgcmV0dXJuIGFqYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS555So5oi3CisgICAgICovCisgICAgQExvZyh0aXRsZSA9ICLkuKrkurrkv6Hmga8iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgdXBkYXRlUHJvZmlsZShAUmVxdWVzdEJvZHkgU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgTG9naW5Vc2VyIGxvZ2luVXNlciA9IGdldExvZ2luVXNlcigpOworICAgICAgICBTeXNVc2VyIGN1cnJlbnRVc2VyID0gbG9naW5Vc2VyLmdldFVzZXIoKTsKKyAgICAgICAgY3VycmVudFVzZXIuc2V0Tmlja05hbWUodXNlci5nZXROaWNrTmFtZSgpKTsKKyAgICAgICAgY3VycmVudFVzZXIuc2V0RW1haWwodXNlci5nZXRFbWFpbCgpKTsKKyAgICAgICAgY3VycmVudFVzZXIuc2V0UGhvbmVudW1iZXIodXNlci5nZXRQaG9uZW51bWJlcigpKTsKKyAgICAgICAgY3VycmVudFVzZXIuc2V0U2V4KHVzZXIuZ2V0U2V4KCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh1c2VyLmdldFBob25lbnVtYmVyKCkpICYmICF1c2VyU2VydmljZS5jaGVja1Bob25lVW5pcXVlKGN1cnJlbnRVc2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnnlKjmiLcnIiArIGxvZ2luVXNlci5nZXRVc2VybmFtZSgpICsgIiflpLHotKXvvIzmiYvmnLrlj7fnoIHlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh1c2VyLmdldEVtYWlsKCkpICYmICF1c2VyU2VydmljZS5jaGVja0VtYWlsVW5pcXVlKGN1cnJlbnRVc2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnnlKjmiLcnIiArIGxvZ2luVXNlci5nZXRVc2VybmFtZSgpICsgIiflpLHotKXvvIzpgq7nrrHotKblj7flt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNlclNlcnZpY2UudXBkYXRlVXNlclByb2ZpbGUoY3VycmVudFVzZXIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5pu05paw57yT5a2Y55So5oi35L+h5oGvCisgICAgICAgICAgICB0b2tlblNlcnZpY2Uuc2V0TG9naW5Vc2VyKGxvZ2luVXNlcik7CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55Liq5Lq65L+h5oGv5byC5bi477yM6K+36IGU57O7566h55CG5ZGYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YeN572u5a+G56CBCisgICAgICovCisgICAgQExvZyh0aXRsZSA9ICLkuKrkurrkv6Hmga8iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nKCIvdXBkYXRlUHdkIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCB1cGRhdGVQd2QoU3RyaW5nIG9sZFBhc3N3b3JkLCBTdHJpbmcgbmV3UGFzc3dvcmQpCisgICAgeworICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gZ2V0TG9naW5Vc2VyKCk7CisgICAgICAgIFN0cmluZyB1c2VyTmFtZSA9IGxvZ2luVXNlci5nZXRVc2VybmFtZSgpOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBsb2dpblVzZXIuZ2V0UGFzc3dvcmQoKTsKKyAgICAgICAgaWYgKCFTZWN1cml0eVV0aWxzLm1hdGNoZXNQYXNzd29yZChvbGRQYXNzd29yZCwgcGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueWvhueggeWksei0pe+8jOaXp+WvhueggemUmeivryIpOworICAgICAgICB9CisgICAgICAgIGlmIChTZWN1cml0eVV0aWxzLm1hdGNoZXNQYXNzd29yZChuZXdQYXNzd29yZCwgcGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWvhueggeS4jeiDveS4juaXp+WvhueggeebuOWQjCIpOworICAgICAgICB9CisgICAgICAgIG5ld1Bhc3N3b3JkID0gU2VjdXJpdHlVdGlscy5lbmNyeXB0UGFzc3dvcmQobmV3UGFzc3dvcmQpOworICAgICAgICBpZiAodXNlclNlcnZpY2UucmVzZXRVc2VyUHdkKHVzZXJOYW1lLCBuZXdQYXNzd29yZCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDmm7TmlrDnvJPlrZjnlKjmiLflr4bnoIEKKyAgICAgICAgICAgIGxvZ2luVXNlci5nZXRVc2VyKCkuc2V0UGFzc3dvcmQobmV3UGFzc3dvcmQpOworICAgICAgICAgICAgdG9rZW5TZXJ2aWNlLnNldExvZ2luVXNlcihsb2dpblVzZXIpOworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueWvhueggeW8guW4uO+8jOivt+iBlOezu+euoeeQhuWRmCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWktOWDj+S4iuS8oAorICAgICAqLworICAgIEBMb2codGl0bGUgPSAi55So5oi35aS05YOPIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUG9zdE1hcHBpbmcoIi9hdmF0YXIiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGF2YXRhcihAUmVxdWVzdFBhcmFtKCJhdmF0YXJmaWxlIikgTXVsdGlwYXJ0RmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoIWZpbGUuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gZ2V0TG9naW5Vc2VyKCk7CisgICAgICAgICAgICBTdHJpbmcgYXZhdGFyID0gRmlsZVVwbG9hZFV0aWxzLnVwbG9hZChSdW9ZaUNvbmZpZy5nZXRBdmF0YXJQYXRoKCksIGZpbGUsIE1pbWVUeXBlVXRpbHMuSU1BR0VfRVhURU5TSU9OKTsKKyAgICAgICAgICAgIGlmICh1c2VyU2VydmljZS51cGRhdGVVc2VyQXZhdGFyKGxvZ2luVXNlci5nZXRVc2VybmFtZSgpLCBhdmF0YXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFqYXhSZXN1bHQgYWpheCA9IEFqYXhSZXN1bHQuc3VjY2VzcygpOworICAgICAgICAgICAgICAgIGFqYXgucHV0KCJpbWdVcmwiLCBhdmF0YXIpOworICAgICAgICAgICAgICAgIC8vIOabtOaWsOe8k+WtmOeUqOaIt+WktOWDjworICAgICAgICAgICAgICAgIGxvZ2luVXNlci5nZXRVc2VyKCkuc2V0QXZhdGFyKGF2YXRhcik7CisgICAgICAgICAgICAgICAgdG9rZW5TZXJ2aWNlLnNldExvZ2luVXNlcihsb2dpblVzZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBhamF4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnJvcigi5LiK5Lyg5Zu+54mH5byC5bi477yM6K+36IGU57O7566h55CG5ZGYIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c1JlZ2lzdGVyQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c1JlZ2lzdGVyQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTkyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUmVnaXN0ZXJDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIuc3lzdGVtOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdEJvZHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLlJlZ2lzdGVyQm9keTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLnNlcnZpY2UuU3lzUmVnaXN0ZXJTZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzQ29uZmlnU2VydmljZTsKKworLyoqCisgKiDms6jlhozpqozor4EKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK3B1YmxpYyBjbGFzcyBTeXNSZWdpc3RlckNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1JlZ2lzdGVyU2VydmljZSByZWdpc3RlclNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzQ29uZmlnU2VydmljZSBjb25maWdTZXJ2aWNlOworCisgICAgQFBvc3RNYXBwaW5nKCIvcmVnaXN0ZXIiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlZ2lzdGVyKEBSZXF1ZXN0Qm9keSBSZWdpc3RlckJvZHkgdXNlcikKKyAgICB7CisgICAgICAgIGlmICghKCJ0cnVlIi5lcXVhbHMoY29uZmlnU2VydmljZS5zZWxlY3RDb25maWdCeUtleSgic3lzLmFjY291bnQucmVnaXN0ZXJVc2VyIikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLlvZPliY3ns7vnu5/msqHmnInlvIDlkK/ms6jlhozlip/og73vvIEiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbXNnID0gcmVnaXN0ZXJTZXJ2aWNlLnJlZ2lzdGVyKHVzZXIpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eShtc2cpID8gc3VjY2VzcygpIDogZXJyb3IobXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUm9sZUNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNSb2xlQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTdhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci9zeXN0ZW0vU3lzUm9sZUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIuc3lzdGVtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RlcHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzUm9sZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNVc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4ubW9kZWwuTG9naW5Vc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaS5FeGNlbFV0aWw7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZS5TeXNQZXJtaXNzaW9uU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlLlRva2VuU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNVc2VyUm9sZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0RlcHRTZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzUm9sZVNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNVc2VyU2VydmljZTsKKworLyoqCisgKiDop5LoibLkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3N5c3RlbS9yb2xlIikKK3B1YmxpYyBjbGFzcyBTeXNSb2xlQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1JvbGVTZXJ2aWNlIHJvbGVTZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVG9rZW5TZXJ2aWNlIHRva2VuU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1Blcm1pc3Npb25TZXJ2aWNlIHBlcm1pc3Npb25TZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1VzZXJTZXJ2aWNlIHVzZXJTZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c0RlcHRTZXJ2aWNlIGRlcHRTZXJ2aWNlOworCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdChTeXNSb2xlIHJvbGUpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNSb2xlPiBsaXN0ID0gcm9sZVNlcnZpY2Uuc2VsZWN0Um9sZUxpc3Qocm9sZSk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLop5LoibLnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuRVhQT1JUKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6ZXhwb3J0JykiKQorICAgIEBQb3N0TWFwcGluZygiL2V4cG9ydCIpCisgICAgcHVibGljIHZvaWQgZXhwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gbGlzdCA9IHJvbGVTZXJ2aWNlLnNlbGVjdFJvbGVMaXN0KHJvbGUpOworICAgICAgICBFeGNlbFV0aWw8U3lzUm9sZT4gdXRpbCA9IG5ldyBFeGNlbFV0aWw8U3lzUm9sZT4oU3lzUm9sZS5jbGFzcyk7CisgICAgICAgIHV0aWwuZXhwb3J0RXhjZWwocmVzcG9uc2UsIGxpc3QsICLop5LoibLmlbDmja4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7op5LoibLnvJblj7fojrflj5bor6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpyb2xlOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97cm9sZUlkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHJvbGVJZCk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKHJvbGVTZXJ2aWNlLnNlbGVjdFJvbGVCeUlkKHJvbGVJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuinkuiJsgorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6YWRkJykiKQorICAgIEBMb2codGl0bGUgPSAi6KeS6Imy566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLklOU0VSVCkKKyAgICBAUG9zdE1hcHBpbmcKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBhZGQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgaWYgKCFyb2xlU2VydmljZS5jaGVja1JvbGVOYW1lVW5pcXVlKHJvbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinuinkuiJsiciICsgcm9sZS5nZXRSb2xlTmFtZSgpICsgIiflpLHotKXvvIzop5LoibLlkI3np7Dlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghcm9sZVNlcnZpY2UuY2hlY2tSb2xlS2V5VW5pcXVlKHJvbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinuinkuiJsiciICsgcm9sZS5nZXRSb2xlTmFtZSgpICsgIiflpLHotKXvvIzop5LoibLmnYPpmZDlt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICByb2xlLnNldENyZWF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KHJvbGVTZXJ2aWNlLmluc2VydFJvbGUocm9sZSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55L+d5a2Y6KeS6ImyCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi6KeS6Imy566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUHV0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVkaXQoQFZhbGlkYXRlZCBAUmVxdWVzdEJvZHkgU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlQWxsb3dlZChyb2xlKTsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICBpZiAoIXJvbGVTZXJ2aWNlLmNoZWNrUm9sZU5hbWVVbmlxdWUocm9sZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS56KeS6ImyJyIgKyByb2xlLmdldFJvbGVOYW1lKCkgKyAiJ+Wksei0pe+8jOinkuiJsuWQjeensOW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFyb2xlU2VydmljZS5jaGVja1JvbGVLZXlVbmlxdWUocm9sZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS56KeS6ImyJyIgKyByb2xlLmdldFJvbGVOYW1lKCkgKyAiJ+Wksei0pe+8jOinkuiJsuadg+mZkOW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIHJvbGUuc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIAorICAgICAgICBpZiAocm9sZVNlcnZpY2UudXBkYXRlUm9sZShyb2xlKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOabtOaWsOe8k+WtmOeUqOaIt+adg+mZkAorICAgICAgICAgICAgTG9naW5Vc2VyIGxvZ2luVXNlciA9IGdldExvZ2luVXNlcigpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChsb2dpblVzZXIuZ2V0VXNlcigpKSAmJiAhbG9naW5Vc2VyLmdldFVzZXIoKS5pc0FkbWluKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9naW5Vc2VyLnNldFVzZXIodXNlclNlcnZpY2Uuc2VsZWN0VXNlckJ5VXNlck5hbWUobG9naW5Vc2VyLmdldFVzZXIoKS5nZXRVc2VyTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgbG9naW5Vc2VyLnNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25TZXJ2aWNlLmdldE1lbnVQZXJtaXNzaW9uKGxvZ2luVXNlci5nZXRVc2VyKCkpKTsKKyAgICAgICAgICAgICAgICB0b2tlblNlcnZpY2Uuc2V0TG9naW5Vc2VyKGxvZ2luVXNlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS56KeS6ImyJyIgKyByb2xlLmdldFJvbGVOYW1lKCkgKyAiJ+Wksei0pe+8jOivt+iBlOezu+euoeeQhuWRmCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOaVsOaNruadg+mZkAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuinkuiJsueuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcoIi9kYXRhU2NvcGUiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGRhdGFTY29wZShAUmVxdWVzdEJvZHkgU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlQWxsb3dlZChyb2xlKTsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KHJvbGVTZXJ2aWNlLmF1dGhEYXRhU2NvcGUocm9sZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOeKtuaAgeS/ruaUuQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuinkuiJsueuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5VUERBVEUpCisgICAgQFB1dE1hcHBpbmcoIi9jaGFuZ2VTdGF0dXMiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGNoYW5nZVN0YXR1cyhAUmVxdWVzdEJvZHkgU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlQWxsb3dlZChyb2xlKTsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICByb2xlLnNldFVwZGF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KHJvbGVTZXJ2aWNlLnVwZGF0ZVJvbGVTdGF0dXMocm9sZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOinkuiJsgorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6cmVtb3ZlJykiKQorICAgIEBMb2codGl0bGUgPSAi6KeS6Imy566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkRFTEVURSkKKyAgICBARGVsZXRlTWFwcGluZygiL3tyb2xlSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIHJvbGVJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KHJvbGVTZXJ2aWNlLmRlbGV0ZVJvbGVCeUlkcyhyb2xlSWRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6KeS6Imy6YCJ5oup5qGG5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZygiL29wdGlvbnNlbGVjdCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgb3B0aW9uc2VsZWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKHJvbGVTZXJ2aWNlLnNlbGVjdFJvbGVBbGwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5bey5YiG6YWN55So5oi36KeS6Imy5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvYXV0aFVzZXIvYWxsb2NhdGVkTGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gYWxsb2NhdGVkTGlzdChTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNVc2VyPiBsaXN0ID0gdXNlclNlcnZpY2Uuc2VsZWN0QWxsb2NhdGVkTGlzdCh1c2VyKTsKKyAgICAgICAgcmV0dXJuIGdldERhdGFUYWJsZShsaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LmnKrliIbphY3nlKjmiLfop5LoibLliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTpyb2xlOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9hdXRoVXNlci91bmFsbG9jYXRlZExpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIHVuYWxsb2NhdGVkTGlzdChTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNVc2VyPiBsaXN0ID0gdXNlclNlcnZpY2Uuc2VsZWN0VW5hbGxvY2F0ZWRMaXN0KHVzZXIpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWPlua2iOaOiOadg+eUqOaItworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuinkuiJsueuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5HUkFOVCkKKyAgICBAUHV0TWFwcGluZygiL2F1dGhVc2VyL2NhbmNlbCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgY2FuY2VsQXV0aFVzZXIoQFJlcXVlc3RCb2R5IFN5c1VzZXJSb2xlIHVzZXJSb2xlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheChyb2xlU2VydmljZS5kZWxldGVBdXRoVXNlcih1c2VyUm9sZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WPlua2iOaOiOadg+eUqOaItworICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnJvbGU6ZWRpdCcpIikKKyAgICBATG9nKHRpdGxlID0gIuinkuiJsueuoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5HUkFOVCkKKyAgICBAUHV0TWFwcGluZygiL2F1dGhVc2VyL2NhbmNlbEFsbCIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgY2FuY2VsQXV0aFVzZXJBbGwoTG9uZyByb2xlSWQsIExvbmdbXSB1c2VySWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQWpheChyb2xlU2VydmljZS5kZWxldGVBdXRoVXNlcnMocm9sZUlkLCB1c2VySWRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP6YCJ5oup55So5oi35o6I5p2DCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi6KeS6Imy566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkdSQU5UKQorICAgIEBQdXRNYXBwaW5nKCIvYXV0aFVzZXIvc2VsZWN0QWxsIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBzZWxlY3RBdXRoVXNlckFsbChMb25nIHJvbGVJZCwgTG9uZ1tdIHVzZXJJZHMpCisgICAgeworICAgICAgICByb2xlU2VydmljZS5jaGVja1JvbGVEYXRhU2NvcGUocm9sZUlkKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChyb2xlU2VydmljZS5pbnNlcnRBdXRoVXNlcnMocm9sZUlkLCB1c2VySWRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a+55bqU6KeS6Imy6YOo6Zeo5qCR5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdzeXN0ZW06cm9sZTpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIvZGVwdFRyZWUve3JvbGVJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGRlcHRUcmVlKEBQYXRoVmFyaWFibGUoInJvbGVJZCIpIExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgQWpheFJlc3VsdCBhamF4ID0gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgICAgIGFqYXgucHV0KCJjaGVja2VkS2V5cyIsIGRlcHRTZXJ2aWNlLnNlbGVjdERlcHRMaXN0QnlSb2xlSWQocm9sZUlkKSk7CisgICAgICAgIGFqYXgucHV0KCJkZXB0cyIsIGRlcHRTZXJ2aWNlLnNlbGVjdERlcHRUcmVlTGlzdChuZXcgU3lzRGVwdCgpKSk7CisgICAgICAgIHJldHVybiBhamF4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNVc2VyQ29udHJvbGxlci5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvbnRyb2xsZXIvc3lzdGVtL1N5c1VzZXJDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiZDU1OQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3N5c3RlbS9TeXNVc2VyQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29udHJvbGxlci5zeXN0ZW07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RlcHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzUm9sZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNVc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZWN1cml0eVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5wb2kuRXhjZWxVdGlsOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzRGVwdFNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNQb3N0U2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c1JvbGVTZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzVXNlclNlcnZpY2U7CisKKy8qKgorICog55So5oi35L+h5oGvCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9zeXN0ZW0vdXNlciIpCitwdWJsaWMgY2xhc3MgU3lzVXNlckNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNVc2VyU2VydmljZSB1c2VyU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNSb2xlU2VydmljZSByb2xlU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNEZXB0U2VydmljZSBkZXB0U2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNQb3N0U2VydmljZSBwb3N0U2VydmljZTsKKworICAgIC8qKgorICAgICAqIOiOt+WPlueUqOaIt+WIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgc3RhcnRQYWdlKCk7CisgICAgICAgIExpc3Q8U3lzVXNlcj4gbGlzdCA9IHVzZXJTZXJ2aWNlLnNlbGVjdFVzZXJMaXN0KHVzZXIpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIEBMb2codGl0bGUgPSAi55So5oi3566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmV4cG9ydCcpIikKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBMaXN0PFN5c1VzZXI+IGxpc3QgPSB1c2VyU2VydmljZS5zZWxlY3RVc2VyTGlzdCh1c2VyKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c1VzZXI+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c1VzZXI+KFN5c1VzZXIuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi55So5oi35pWw5o2uIik7CisgICAgfQorCisgICAgQExvZyh0aXRsZSA9ICLnlKjmiLfnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU1QT1JUKQorICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnc3lzdGVtOnVzZXI6aW1wb3J0JykiKQorICAgIEBQb3N0TWFwcGluZygiL2ltcG9ydERhdGEiKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGltcG9ydERhdGEoTXVsdGlwYXJ0RmlsZSBmaWxlLCBib29sZWFuIHVwZGF0ZVN1cHBvcnQpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEV4Y2VsVXRpbDxTeXNVc2VyPiB1dGlsID0gbmV3IEV4Y2VsVXRpbDxTeXNVc2VyPihTeXNVc2VyLmNsYXNzKTsKKyAgICAgICAgTGlzdDxTeXNVc2VyPiB1c2VyTGlzdCA9IHV0aWwuaW1wb3J0RXhjZWwoZmlsZS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgU3RyaW5nIG9wZXJOYW1lID0gZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB1c2VyU2VydmljZS5pbXBvcnRVc2VyKHVzZXJMaXN0LCB1cGRhdGVTdXBwb3J0LCBvcGVyTmFtZSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKG1lc3NhZ2UpOworICAgIH0KKworICAgIEBQb3N0TWFwcGluZygiL2ltcG9ydFRlbXBsYXRlIikKKyAgICBwdWJsaWMgdm9pZCBpbXBvcnRUZW1wbGF0ZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHsKKyAgICAgICAgRXhjZWxVdGlsPFN5c1VzZXI+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c1VzZXI+KFN5c1VzZXIuY2xhc3MpOworICAgICAgICB1dGlsLmltcG9ydFRlbXBsYXRlRXhjZWwocmVzcG9uc2UsICLnlKjmiLfmlbDmja4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLfnvJblj7fojrflj5bor6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0geyAiLyIsICIve3VzZXJJZH0iIH0pCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlKHZhbHVlID0gInVzZXJJZCIsIHJlcXVpcmVkID0gZmFsc2UpIExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgdXNlclNlcnZpY2UuY2hlY2tVc2VyRGF0YVNjb3BlKHVzZXJJZCk7CisgICAgICAgIEFqYXhSZXN1bHQgYWpheCA9IEFqYXhSZXN1bHQuc3VjY2VzcygpOworICAgICAgICBMaXN0PFN5c1JvbGU+IHJvbGVzID0gcm9sZVNlcnZpY2Uuc2VsZWN0Um9sZUFsbCgpOworICAgICAgICBhamF4LnB1dCgicm9sZXMiLCBTeXNVc2VyLmlzQWRtaW4odXNlcklkKSA/IHJvbGVzIDogcm9sZXMuc3RyZWFtKCkuZmlsdGVyKHIgLT4gIXIuaXNBZG1pbigpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgYWpheC5wdXQoInBvc3RzIiwgcG9zdFNlcnZpY2Uuc2VsZWN0UG9zdEFsbCgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbCh1c2VySWQpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXNVc2VyIHN5c1VzZXIgPSB1c2VyU2VydmljZS5zZWxlY3RVc2VyQnlJZCh1c2VySWQpOworICAgICAgICAgICAgYWpheC5wdXQoQWpheFJlc3VsdC5EQVRBX1RBRywgc3lzVXNlcik7CisgICAgICAgICAgICBhamF4LnB1dCgicG9zdElkcyIsIHBvc3RTZXJ2aWNlLnNlbGVjdFBvc3RMaXN0QnlVc2VySWQodXNlcklkKSk7CisgICAgICAgICAgICBhamF4LnB1dCgicm9sZUlkcyIsIHN5c1VzZXIuZ2V0Um9sZXMoKS5zdHJlYW0oKS5tYXAoU3lzUm9sZTo6Z2V0Um9sZUlkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWpheDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7nlKjmiLcKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmFkZCcpIikKKyAgICBATG9nKHRpdGxlID0gIueUqOaIt+euoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5JTlNFUlQpCisgICAgQFBvc3RNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgYWRkKEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIGRlcHRTZXJ2aWNlLmNoZWNrRGVwdERhdGFTY29wZSh1c2VyLmdldERlcHRJZCgpKTsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHVzZXIuZ2V0Um9sZUlkcygpKTsKKyAgICAgICAgaWYgKCF1c2VyU2VydmljZS5jaGVja1VzZXJOYW1lVW5pcXVlKHVzZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuaWsOWinueUqOaItyciICsgdXNlci5nZXRVc2VyTmFtZSgpICsgIiflpLHotKXvvIznmbvlvZXotKblj7flt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHVzZXIuZ2V0UGhvbmVudW1iZXIoKSkgJiYgIXVzZXJTZXJ2aWNlLmNoZWNrUGhvbmVVbmlxdWUodXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe55So5oi3JyIgKyB1c2VyLmdldFVzZXJOYW1lKCkgKyAiJ+Wksei0pe+8jOaJi+acuuWPt+eggeW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodXNlci5nZXRFbWFpbCgpKSAmJiAhdXNlclNlcnZpY2UuY2hlY2tFbWFpbFVuaXF1ZSh1c2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLmlrDlop7nlKjmiLcnIiArIHVzZXIuZ2V0VXNlck5hbWUoKSArICIn5aSx6LSl77yM6YKu566x6LSm5Y+35bey5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgdXNlci5zZXRDcmVhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgdXNlci5zZXRQYXNzd29yZChTZWN1cml0eVV0aWxzLmVuY3J5cHRQYXNzd29yZCh1c2VyLmdldFBhc3N3b3JkKCkpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh1c2VyU2VydmljZS5pbnNlcnRVc2VyKHVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnnlKjmiLcKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLnlKjmiLfnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICB1c2VyU2VydmljZS5jaGVja1VzZXJBbGxvd2VkKHVzZXIpOworICAgICAgICB1c2VyU2VydmljZS5jaGVja1VzZXJEYXRhU2NvcGUodXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgIGRlcHRTZXJ2aWNlLmNoZWNrRGVwdERhdGFTY29wZSh1c2VyLmdldERlcHRJZCgpKTsKKyAgICAgICAgcm9sZVNlcnZpY2UuY2hlY2tSb2xlRGF0YVNjb3BlKHVzZXIuZ2V0Um9sZUlkcygpKTsKKyAgICAgICAgaWYgKCF1c2VyU2VydmljZS5jaGVja1VzZXJOYW1lVW5pcXVlKHVzZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueeUqOaItyciICsgdXNlci5nZXRVc2VyTmFtZSgpICsgIiflpLHotKXvvIznmbvlvZXotKblj7flt7LlrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHVzZXIuZ2V0UGhvbmVudW1iZXIoKSkgJiYgIXVzZXJTZXJ2aWNlLmNoZWNrUGhvbmVVbmlxdWUodXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS555So5oi3JyIgKyB1c2VyLmdldFVzZXJOYW1lKCkgKyAiJ+Wksei0pe+8jOaJi+acuuWPt+eggeW3suWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodXNlci5nZXRFbWFpbCgpKSAmJiAhdXNlclNlcnZpY2UuY2hlY2tFbWFpbFVuaXF1ZSh1c2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLkv67mlLnnlKjmiLcnIiArIHVzZXIuZ2V0VXNlck5hbWUoKSArICIn5aSx6LSl77yM6YKu566x6LSm5Y+35bey5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgdXNlci5zZXRVcGRhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh1c2VyU2VydmljZS51cGRhdGVVc2VyKHVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTnlKjmiLcKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIueUqOaIt+euoeeQhiIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97dXNlcklkc30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlIExvbmdbXSB1c2VySWRzKQorICAgIHsKKyAgICAgICAgaWYgKEFycmF5VXRpbHMuY29udGFpbnModXNlcklkcywgZ2V0VXNlcklkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuW9k+WJjeeUqOaIt+S4jeiDveWIoOmZpCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b0FqYXgodXNlclNlcnZpY2UuZGVsZXRlVXNlckJ5SWRzKHVzZXJJZHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDph43nva7lr4bnoIEKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOnJlc2V0UHdkJykiKQorICAgIEBMb2codGl0bGUgPSAi55So5oi3566h55CGIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUHV0TWFwcGluZygiL3Jlc2V0UHdkIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCByZXNldFB3ZChAUmVxdWVzdEJvZHkgU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgdXNlclNlcnZpY2UuY2hlY2tVc2VyQWxsb3dlZCh1c2VyKTsKKyAgICAgICAgdXNlclNlcnZpY2UuY2hlY2tVc2VyRGF0YVNjb3BlKHVzZXIuZ2V0VXNlcklkKCkpOworICAgICAgICB1c2VyLnNldFBhc3N3b3JkKFNlY3VyaXR5VXRpbHMuZW5jcnlwdFBhc3N3b3JkKHVzZXIuZ2V0UGFzc3dvcmQoKSkpOworICAgICAgICB1c2VyLnNldFVwZGF0ZUJ5KGdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gdG9BamF4KHVzZXJTZXJ2aWNlLnJlc2V0UHdkKHVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnirbmgIHkv67mlLkKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLnlKjmiLfnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nKCIvY2hhbmdlU3RhdHVzIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBjaGFuZ2VTdGF0dXMoQFJlcXVlc3RCb2R5IFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHVzZXJTZXJ2aWNlLmNoZWNrVXNlckFsbG93ZWQodXNlcik7CisgICAgICAgIHVzZXJTZXJ2aWNlLmNoZWNrVXNlckRhdGFTY29wZSh1c2VyLmdldFVzZXJJZCgpKTsKKyAgICAgICAgdXNlci5zZXRVcGRhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheCh1c2VyU2VydmljZS51cGRhdGVVc2VyU3RhdHVzKHVzZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLfnvJblj7fojrflj5bmjojmnYPop5LoibIKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKCIvYXV0aFJvbGUve3VzZXJJZH0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGF1dGhSb2xlKEBQYXRoVmFyaWFibGUoInVzZXJJZCIpIExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgQWpheFJlc3VsdCBhamF4ID0gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgICAgIFN5c1VzZXIgdXNlciA9IHVzZXJTZXJ2aWNlLnNlbGVjdFVzZXJCeUlkKHVzZXJJZCk7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gcm9sZXMgPSByb2xlU2VydmljZS5zZWxlY3RSb2xlc0J5VXNlcklkKHVzZXJJZCk7CisgICAgICAgIGFqYXgucHV0KCJ1c2VyIiwgdXNlcik7CisgICAgICAgIGFqYXgucHV0KCJyb2xlcyIsIFN5c1VzZXIuaXNBZG1pbih1c2VySWQpID8gcm9sZXMgOiByb2xlcy5zdHJlYW0oKS5maWx0ZXIociAtPiAhci5pc0FkbWluKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgICAgICByZXR1cm4gYWpheDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLfmjojmnYPop5LoibIKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLnlKjmiLfnrqHnkIYiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuR1JBTlQpCisgICAgQFB1dE1hcHBpbmcoIi9hdXRoUm9sZSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgaW5zZXJ0QXV0aFJvbGUoTG9uZyB1c2VySWQsIExvbmdbXSByb2xlSWRzKQorICAgIHsKKyAgICAgICAgdXNlclNlcnZpY2UuY2hlY2tVc2VyRGF0YVNjb3BlKHVzZXJJZCk7CisgICAgICAgIHJvbGVTZXJ2aWNlLmNoZWNrUm9sZURhdGFTY29wZShyb2xlSWRzKTsKKyAgICAgICAgdXNlclNlcnZpY2UuaW5zZXJ0VXNlckF1dGgodXNlcklkLCByb2xlSWRzKTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpg6jpl6jmoJHliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3N5c3RlbTp1c2VyOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9kZXB0VHJlZSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZGVwdFRyZWUoU3lzRGVwdCBkZXB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoZGVwdFNlcnZpY2Uuc2VsZWN0RGVwdFRyZWVMaXN0KGRlcHQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci90b29sL1Rlc3RDb250cm9sbGVyLmphdmEgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29udHJvbGxlci90b29sL1Rlc3RDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2ZTFiOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3dlYi9jb250cm9sbGVyL3Rvb2wvVGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorcGFja2FnZSBjb20ucnVveWkud2ViLmNvbnRyb2xsZXIudG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uRGVsZXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uR2V0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUGF0aFZhcmlhYmxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5Qb3N0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUHV0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdEJvZHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLlI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5hbm5vdGF0aW9ucy5PcGVyYXRpb247CitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuU2NoZW1hOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLmFubm90YXRpb25zLnRhZ3MuVGFnOworCisvKioKKyAqIHN3YWdnZXIg55So5oi35rWL6K+V5pa55rOVCisgKgorICogQGF1dGhvciBydW95aQorICovCitAVGFnKG5hbWUgPSAi55So5oi35L+h5oGv566h55CGIikKK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvdGVzdC91c2VyIikKK3B1YmxpYyBjbGFzcyBUZXN0Q29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPEludGVnZXIsIFVzZXJFbnRpdHk+IHVzZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8SW50ZWdlciwgVXNlckVudGl0eT4oKTsKKyAgICB7CisgICAgICAgIHVzZXJzLnB1dCgxLCBuZXcgVXNlckVudGl0eSgxLCAiYWRtaW4iLCAiYWRtaW4xMjMiLCAiMTU4ODg4ODg4ODgiKSk7CisgICAgICAgIHVzZXJzLnB1dCgyLCBuZXcgVXNlckVudGl0eSgyLCAicnkiLCAiYWRtaW4xMjMiLCAiMTU2NjY2NjY2NjYiKSk7CisgICAgfQorICAgIAorICAgIEBPcGVyYXRpb24oc3VtbWFyeSA9ICLojrflj5bnlKjmiLfliJfooagiKQorICAgIEBHZXRNYXBwaW5nKCIvbGlzdCIpCisgICAgcHVibGljIFI8TGlzdDxVc2VyRW50aXR5Pj4gdXNlckxpc3QoKQorICAgIHsKKyAgICAgICAgTGlzdDxVc2VyRW50aXR5PiB1c2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8VXNlckVudGl0eT4odXNlcnMudmFsdWVzKCkpOworICAgICAgICByZXR1cm4gUi5vayh1c2VyTGlzdCk7CisgICAgfQorICAgIAorICAgIEBPcGVyYXRpb24oc3VtbWFyeSA9ICLojrflj5bnlKjmiLfor6bnu4YiKQorICAgIEBHZXRNYXBwaW5nKCIve3VzZXJJZH0iKQorICAgIHB1YmxpYyBSPFVzZXJFbnRpdHk+IGdldFVzZXIoQFBhdGhWYXJpYWJsZShuYW1lID0gInVzZXJJZCIpCisgICAgSW50ZWdlciB1c2VySWQpCisgICAgeworICAgICAgICBpZiAoIXVzZXJzLmlzRW1wdHkoKSAmJiB1c2Vycy5jb250YWluc0tleSh1c2VySWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUi5vayh1c2Vycy5nZXQodXNlcklkKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUi5mYWlsKCLnlKjmiLfkuI3lrZjlnKgiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi5paw5aKe55So5oi3IikKKyAgICBAUG9zdE1hcHBpbmcoIi9zYXZlIikKKyAgICBwdWJsaWMgUjxTdHJpbmc+IHNhdmUoVXNlckVudGl0eSB1c2VyKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyKSB8fCBTdHJpbmdVdGlscy5pc051bGwodXNlci5nZXRVc2VySWQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSLmZhaWwoIueUqOaIt0lE5LiN6IO95Li656m6Iik7CisgICAgICAgIH0KKyAgICAgICAgdXNlcnMucHV0KHVzZXIuZ2V0VXNlcklkKCksIHVzZXIpOworICAgICAgICByZXR1cm4gUi5vaygpOworICAgIH0KKyAgICAKKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi5pu05paw55So5oi3IikKKyAgICBAUHV0TWFwcGluZygiL3VwZGF0ZSIpCisgICAgcHVibGljIFI8U3RyaW5nPiB1cGRhdGUoQFJlcXVlc3RCb2R5CisgICAgVXNlckVudGl0eSB1c2VyKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyKSB8fCBTdHJpbmdVdGlscy5pc051bGwodXNlci5nZXRVc2VySWQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSLmZhaWwoIueUqOaIt0lE5LiN6IO95Li656m6Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZXJzLmlzRW1wdHkoKSB8fCAhdXNlcnMuY29udGFpbnNLZXkodXNlci5nZXRVc2VySWQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSLmZhaWwoIueUqOaIt+S4jeWtmOWcqCIpOworICAgICAgICB9CisgICAgICAgIHVzZXJzLnJlbW92ZSh1c2VyLmdldFVzZXJJZCgpKTsKKyAgICAgICAgdXNlcnMucHV0KHVzZXIuZ2V0VXNlcklkKCksIHVzZXIpOworICAgICAgICByZXR1cm4gUi5vaygpOworICAgIH0KKyAgICAKKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi5Yig6Zmk55So5oi35L+h5oGvIikKKyAgICBARGVsZXRlTWFwcGluZygiL3t1c2VySWR9IikKKyAgICBwdWJsaWMgUjxTdHJpbmc+IGRlbGV0ZShAUGF0aFZhcmlhYmxlKG5hbWUgPSAidXNlcklkIikKKyAgICBJbnRlZ2VyIHVzZXJJZCkKKyAgICB7CisgICAgICAgIGlmICghdXNlcnMuaXNFbXB0eSgpICYmIHVzZXJzLmNvbnRhaW5zS2V5KHVzZXJJZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZXJzLnJlbW92ZSh1c2VySWQpOworICAgICAgICAgICAgcmV0dXJuIFIub2soKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSLmZhaWwoIueUqOaIt+S4jeWtmOWcqCIpOworICAgICAgICB9CisgICAgfQorfQorCitAU2NoZW1hKGRlc2NyaXB0aW9uID0gIueUqOaIt+WunuS9kyIpCitjbGFzcyBVc2VyRW50aXR5Cit7CisgICAgQFNjaGVtYSh0aXRsZSA9ICLnlKjmiLdJRCIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIHVzZXJJZDsKKyAgICAKKyAgICBAU2NoZW1hKHRpdGxlID0gIueUqOaIt+WQjeensCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7CisgICAgCisgICAgQFNjaGVtYSh0aXRsZSA9ICLnlKjmiLflr4bnoIEiKQorICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworICAgIAorICAgIEBTY2hlbWEodGl0bGUgPSAi55So5oi35omL5py6IikKKyAgICBwcml2YXRlIFN0cmluZyBtb2JpbGU7CisgICAgCisgICAgcHVibGljIFVzZXJFbnRpdHkoKQorICAgIHsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBVc2VyRW50aXR5KEludGVnZXIgdXNlcklkLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIG1vYmlsZSkKKyAgICB7CisgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy5tb2JpbGUgPSBtb2JpbGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJbnRlZ2VyIGdldFVzZXJJZCgpCisgICAgeworICAgICAgICByZXR1cm4gdXNlcklkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQoSW50ZWdlciB1c2VySWQpCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXNlcm5hbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkKKyAgICB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNb2JpbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1vYmlsZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TW9iaWxlKFN0cmluZyBtb2JpbGUpCisgICAgeworICAgICAgICB0aGlzLm1vYmlsZSA9IG1vYmlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS93ZWIvY29yZS9jb25maWcvU3dhZ2dlckNvbmZpZy5qYXZhIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvcmUvY29uZmlnL1N3YWdnZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI3YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vamF2YS9jb20vcnVveWkvd2ViL2NvcmUvY29uZmlnL1N3YWdnZXJDb25maWcuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIGNvbS5ydW95aS53ZWIuY29yZS5jb25maWc7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uZmlnLlJ1b1lpQ29uZmlnOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLm1vZGVscy5Db21wb25lbnRzOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLm1vZGVscy5PcGVuQVBJOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLm1vZGVscy5pbmZvLkNvbnRhY3Q7CitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMubW9kZWxzLmluZm8uSW5mbzsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5tb2RlbHMuc2VjdXJpdHkuU2VjdXJpdHlSZXF1aXJlbWVudDsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5tb2RlbHMuc2VjdXJpdHkuU2VjdXJpdHlTY2hlbWU7CisKKy8qKgorICogU3dhZ2dlcjLnmoTmjqXlj6PphY3nva4KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29uZmlndXJhdGlvbgorcHVibGljIGNsYXNzIFN3YWdnZXJDb25maWcKK3sKKyAgICAvKiog57O757uf5Z+656GA6YWN572uICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUnVvWWlDb25maWcgcnVveWlDb25maWc7CisgICAgCisgICAgLyoqCisgICAgICog6Ieq5a6a5LmJ55qEIE9wZW5BUEkg5a+56LGhCisgICAgICovCisgICAgQEJlYW4KKyAgICBwdWJsaWMgT3BlbkFQSSBjdXN0b21PcGVuQXBpKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgT3BlbkFQSSgpLmNvbXBvbmVudHMobmV3IENvbXBvbmVudHMoKQorICAgICAgICAgICAgLy8g6K6+572u6K6k6K+B55qE6K+35rGC5aS0CisgICAgICAgICAgICAuYWRkU2VjdXJpdHlTY2hlbWVzKCJhcGlrZXkiLCBzZWN1cml0eVNjaGVtZSgpKSkKKyAgICAgICAgICAgIC5hZGRTZWN1cml0eUl0ZW0obmV3IFNlY3VyaXR5UmVxdWlyZW1lbnQoKS5hZGRMaXN0KCJhcGlrZXkiKSkKKyAgICAgICAgICAgIC5pbmZvKGdldEFwaUluZm8oKSk7CisgICAgfQorICAgIAorICAgIEBCZWFuCisgICAgcHVibGljIFNlY3VyaXR5U2NoZW1lIHNlY3VyaXR5U2NoZW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2VjdXJpdHlTY2hlbWUoKQorICAgICAgICAgICAgLnR5cGUoU2VjdXJpdHlTY2hlbWUuVHlwZS5BUElLRVkpCisgICAgICAgICAgICAubmFtZSgiQXV0aG9yaXphdGlvbiIpCisgICAgICAgICAgICAuaW4oU2VjdXJpdHlTY2hlbWUuSW4uSEVBREVSKQorICAgICAgICAgICAgLnNjaGVtZSgiQmVhcmVyIik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIOa3u+WKoOaRmOimgeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBJbmZvIGdldEFwaUluZm8oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmZvKCkKKyAgICAgICAgICAgIC8vIOiuvue9ruagh+mimAorICAgICAgICAgICAgLnRpdGxlKCLmoIfpopjvvJroi6Xkvp3nrqHnkIbns7vnu59f5o6l5Y+j5paH5qGjIikKKyAgICAgICAgICAgIC8vIOaPj+i/sAorICAgICAgICAgICAgLmRlc2NyaXB0aW9uKCLmj4/ov7DvvJrnlKjkuo7nrqHnkIbpm4blm6Lml5fkuIvlhazlj7jnmoTkurrlkZjkv6Hmga8s5YW35L2T5YyF5ousWFhYLFhYWOaooeWdly4uLiIpCisgICAgICAgICAgICAvLyDkvZzogIXkv6Hmga8KKyAgICAgICAgICAgIC5jb250YWN0KG5ldyBDb250YWN0KCkubmFtZShydW95aUNvbmZpZy5nZXROYW1lKCkpKQorICAgICAgICAgICAgLy8g54mI5pysCisgICAgICAgICAgICAudmVyc2lvbigi54mI5pys5Y+3OiIgKyBydW95aUNvbmZpZy5nZXRWZXJzaW9uKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zcHJpbmctZGV2dG9vbHMucHJvcGVydGllcyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zcHJpbmctZGV2dG9vbHMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U3YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NwcmluZy1kZXZ0b29scy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK3Jlc3RhcnQuaW5jbHVkZS5qc29uPS9jb20uYWxpYmFiYS5mYXN0anNvbjIuKi5qYXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tZHJ1aWQueW1sIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWRydWlkLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVkNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWRydWlkLnltbApAQCAtMCwwICsxLDYxIEBACisjIOaVsOaNrua6kOmFjee9rgorc3ByaW5nOgorICAgIGRhdGFzb3VyY2U6CisgICAgICAgIHR5cGU6IGNvbS5hbGliYWJhLmRydWlkLnBvb2wuRHJ1aWREYXRhU291cmNlCisgICAgICAgIGRyaXZlckNsYXNzTmFtZTogY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCisgICAgICAgIGRydWlkOgorICAgICAgICAgICAgIyDkuLvlupPmlbDmja7mupAKKyAgICAgICAgICAgIG1hc3RlcjoKKyAgICAgICAgICAgICAgICB1cmw6IGpkYmM6bXlzcWw6Ly80OS4yMzMuMjE1LjE0NDozMzA2L3B0X3N0YXRpb24/dXNlVW5pY29kZT10cnVlJmNoYXJhY3RlckVuY29kaW5nPXV0ZjgmemVyb0RhdGVUaW1lQmVoYXZpb3I9Y29udmVydFRvTnVsbCZ1c2VTU0w9dHJ1ZSZzZXJ2ZXJUaW1lem9uZT1HTVQlMkI4CisgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHN5CisgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHN5X3Bhc3N3b3JkCisgICAgICAgICAgICAjIOS7juW6k+aVsOaNrua6kAorICAgICAgICAgICAgc2xhdmU6CisgICAgICAgICAgICAgICAgIyDku47mlbDmja7mupDlvIDlhbMv6buY6K6k5YWz6ZetCisgICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UKKyAgICAgICAgICAgICAgICB1cmw6IAorICAgICAgICAgICAgICAgIHVzZXJuYW1lOiAKKyAgICAgICAgICAgICAgICBwYXNzd29yZDogCisgICAgICAgICAgICAjIOWIneWni+i/nuaOpeaVsAorICAgICAgICAgICAgaW5pdGlhbFNpemU6IDUKKyAgICAgICAgICAgICMg5pyA5bCP6L+e5o6l5rGg5pWw6YePCisgICAgICAgICAgICBtaW5JZGxlOiAxMAorICAgICAgICAgICAgIyDmnIDlpKfov57mjqXmsaDmlbDph48KKyAgICAgICAgICAgIG1heEFjdGl2ZTogMjAKKyAgICAgICAgICAgICMg6YWN572u6I635Y+W6L+e5o6l562J5b6F6LaF5pe255qE5pe26Ze0CisgICAgICAgICAgICBtYXhXYWl0OiA2MDAwMAorICAgICAgICAgICAgIyDphY3nva7ov57mjqXotoXml7bml7bpl7QKKyAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0OiAzMDAwMAorICAgICAgICAgICAgIyDphY3nva7nvZHnu5zotoXml7bml7bpl7QKKyAgICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IDYwMDAwCisgICAgICAgICAgICAjIOmFjee9rumXtOmalOWkmuS5heaJjei/m+ihjOS4gOasoeajgOa1i++8jOajgOa1i+mcgOimgeWFs+mXreeahOepuumXsui/nuaOpe+8jOWNleS9jeaYr+avq+enkgorICAgICAgICAgICAgdGltZUJldHdlZW5FdmljdGlvblJ1bnNNaWxsaXM6IDYwMDAwCisgICAgICAgICAgICAjIOmFjee9ruS4gOS4qui/nuaOpeWcqOaxoOS4reacgOWwj+eUn+WtmOeahOaXtumXtO+8jOWNleS9jeaYr+avq+enkgorICAgICAgICAgICAgbWluRXZpY3RhYmxlSWRsZVRpbWVNaWxsaXM6IDMwMDAwMAorICAgICAgICAgICAgIyDphY3nva7kuIDkuKrov57mjqXlnKjmsaDkuK3mnIDlpKfnlJ/lrZjnmoTml7bpl7TvvIzljZXkvY3mmK/mr6vnp5IKKyAgICAgICAgICAgIG1heEV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzOiA5MDAwMDAKKyAgICAgICAgICAgICMg6YWN572u5qOA5rWL6L+e5o6l5piv5ZCm5pyJ5pWICisgICAgICAgICAgICB2YWxpZGF0aW9uUXVlcnk6IFNFTEVDVCAxIEZST00gRFVBTAorICAgICAgICAgICAgdGVzdFdoaWxlSWRsZTogdHJ1ZQorICAgICAgICAgICAgdGVzdE9uQm9ycm93OiBmYWxzZQorICAgICAgICAgICAgdGVzdE9uUmV0dXJuOiBmYWxzZQorICAgICAgICAgICAgd2ViU3RhdEZpbHRlcjogCisgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZQorICAgICAgICAgICAgc3RhdFZpZXdTZXJ2bGV0OgorICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgICAgICAgICAjIOiuvue9rueZveWQjeWNle+8jOS4jeWhq+WImeWFgeiuuOaJgOacieiuv+mXrgorICAgICAgICAgICAgICAgIGFsbG93OgorICAgICAgICAgICAgICAgIHVybC1wYXR0ZXJuOiAvZHJ1aWQvKgorICAgICAgICAgICAgICAgICMg5o6n5Yi25Y+w566h55CG55So5oi35ZCN5ZKM5a+G56CBCisgICAgICAgICAgICAgICAgbG9naW4tdXNlcm5hbWU6IHJ1b3lpCisgICAgICAgICAgICAgICAgbG9naW4tcGFzc3dvcmQ6IDEyMzQ1NgorICAgICAgICAgICAgZmlsdGVyOgorICAgICAgICAgICAgICAgIHN0YXQ6CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgICAgICAgICAgICAgIyDmhaJTUUzorrDlvZUKKyAgICAgICAgICAgICAgICAgICAgbG9nLXNsb3ctc3FsOiB0cnVlCisgICAgICAgICAgICAgICAgICAgIHNsb3ctc3FsLW1pbGxpczogMTAwMAorICAgICAgICAgICAgICAgICAgICBtZXJnZS1zcWw6IHRydWUKKyAgICAgICAgICAgICAgICB3YWxsOgorICAgICAgICAgICAgICAgICAgICBjb25maWc6CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aS1zdGF0ZW1lbnQtYWxsb3c6IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFhODdjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbApAQCAtMCwwICsxLDEzNyBAQAorIyDpobnnm67nm7jlhbPphY3nva4KK3J1b3lpOgorICAjIOWQjeensAorICBuYW1lOiBSdW9ZaQorICAjIOeJiOacrAorICB2ZXJzaW9uOiAzLjguOAorICAjIOeJiOadg+W5tOS7vQorICBjb3B5cmlnaHRZZWFyOiAyMDI0CisgICMg5paH5Lu26Lev5b6EIOekuuS+i++8iCBXaW5kb3dz6YWN572uRDovcnVveWkvdXBsb2FkUGF0aO+8jExpbnV46YWN572uIC9ob21lL3J1b3lpL3VwbG9hZFBhdGjvvIkKKyAgcHJvZmlsZTogRDovcnVveWkvdXBsb2FkUGF0aAorICAjIOiOt+WPlmlw5Zyw5Z2A5byA5YWzCisgIGFkZHJlc3NFbmFibGVkOiBmYWxzZQorICAjIOmqjOivgeeggeexu+WeiyBtYXRoIOaVsOWtl+iuoeeulyBjaGFyIOWtl+espumqjOivgQorICBjYXB0Y2hhVHlwZTogbWF0aAorCisjIOW8gOWPkeeOr+Wig+mFjee9rgorc2VydmVyOgorICAjIOacjeWKoeWZqOeahEhUVFDnq6/lj6PvvIzpu5jorqTkuLo4MDgwCisgIHBvcnQ6IDgwODAKKyAgc2VydmxldDoKKyAgICAjIOW6lOeUqOeahOiuv+mXrui3r+W+hAorICAgIGNvbnRleHQtcGF0aDogLworICB0b21jYXQ6CisgICAgIyB0b21jYXTnmoRVUknnvJbnoIEKKyAgICB1cmktZW5jb2Rpbmc6IFVURi04CisgICAgIyDov57mjqXmlbDmu6HlkI7nmoTmjpLpmJ/mlbDvvIzpu5jorqTkuLoxMDAKKyAgICBhY2NlcHQtY291bnQ6IDEwMDAKKyAgICB0aHJlYWRzOgorICAgICAgIyB0b21jYXTmnIDlpKfnur/nqIvmlbDvvIzpu5jorqTkuLoyMDAKKyAgICAgIG1heDogODAwCisgICAgICAjIFRvbWNhdOWQr+WKqOWIneWni+WMlueahOe6v+eoi+aVsO+8jOm7mOiupOWAvDEwCisgICAgICBtaW4tc3BhcmU6IDEwMAorCisjIOaXpeW/l+mFjee9rgorbG9nZ2luZzoKKyAgbGV2ZWw6CisgICAgY29tLnJ1b3lpOiBkZWJ1ZworICAgIG9yZy5zcHJpbmdmcmFtZXdvcms6IHdhcm4KKworIyDnlKjmiLfphY3nva4KK3VzZXI6CisgIHBhc3N3b3JkOgorICAgICMg5a+G56CB5pyA5aSn6ZSZ6K+v5qyh5pWwCisgICAgbWF4UmV0cnlDb3VudDogNQorICAgICMg5a+G56CB6ZSB5a6a5pe26Ze077yI6buY6K6kMTDliIbpkp/vvIkKKyAgICBsb2NrVGltZTogMTAKKworIyBTcHJpbmfphY3nva4KK3NwcmluZzoKKyAgIyDotYTmupDkv6Hmga8KKyAgbWVzc2FnZXM6CisgICAgIyDlm73pmYXljJbotYTmupDmlofku7bot6/lvoQKKyAgICBiYXNlbmFtZTogaTE4bi9tZXNzYWdlcworICBwcm9maWxlczoKKyAgICBhY3RpdmU6IGRydWlkCisgICMg5paH5Lu25LiK5LygCisgIHNlcnZsZXQ6CisgICAgbXVsdGlwYXJ0OgorICAgICAgIyDljZXkuKrmlofku7blpKflsI8KKyAgICAgIG1heC1maWxlLXNpemU6IDEwTUIKKyAgICAgICMg6K6+572u5oC75LiK5Lyg55qE5paH5Lu25aSn5bCPCisgICAgICBtYXgtcmVxdWVzdC1zaXplOiAyME1CCisgICMg5pyN5Yqh5qih5Z2XCisgIGRldnRvb2xzOgorICAgIHJlc3RhcnQ6CisgICAgICAjIOeDremDqOe9suW8gOWFsworICAgICAgZW5hYmxlZDogdHJ1ZQorICBkYXRhOgorICAgICMgcmVkaXMg6YWN572uCisgICAgcmVkaXM6CisgICAgICAjIOWcsOWdgAorICAgICAgaG9zdDogbG9jYWxob3N0CisgICAgICAjIOerr+WPo++8jOm7mOiupOS4ujYzNzkKKyAgICAgIHBvcnQ6IDYzNzkKKyAgICAgICMg5pWw5o2u5bqT57Si5byVCisgICAgICBkYXRhYmFzZTogMAorICAgICAgIyDlr4bnoIEKKyAgICAgIHBhc3N3b3JkOgorICAgICAgIyDov57mjqXotoXml7bml7bpl7QKKyAgICAgIHRpbWVvdXQ6IDEwcworICAgICAgbGV0dHVjZToKKyAgICAgICAgcG9vbDoKKyAgICAgICAgICAjIOi/nuaOpeaxoOS4reeahOacgOWwj+epuumXsui/nuaOpQorICAgICAgICAgIG1pbi1pZGxlOiAwCisgICAgICAgICAgIyDov57mjqXmsaDkuK3nmoTmnIDlpKfnqbrpl7Lov57mjqUKKyAgICAgICAgICBtYXgtaWRsZTogOAorICAgICAgICAgICMg6L+e5o6l5rGg55qE5pyA5aSn5pWw5o2u5bqT6L+e5o6l5pWwCisgICAgICAgICAgbWF4LWFjdGl2ZTogOAorICAgICAgICAgICMgI+i/nuaOpeaxoOacgOWkp+mYu+WhnuetieW+heaXtumXtO+8iOS9v+eUqOi0n+WAvOihqOekuuayoeaciemZkOWItu+8iQorICAgICAgICAgIG1heC13YWl0OiAtMW1zCisKKyMgdG9rZW7phY3nva4KK3Rva2VuOgorICAjIOS7pOeJjOiHquWumuS5ieagh+ivhgorICBoZWFkZXI6IEF1dGhvcml6YXRpb24KKyAgIyDku6TniYzlr4bpkqUKKyAgc2VjcmV0OiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorICAjIOS7pOeJjOacieaViOacn++8iOm7mOiupDMw5YiG6ZKf77yJCisgIGV4cGlyZVRpbWU6IDMwCisKKyMgTXlCYXRpc+mFjee9rgorbXliYXRpczoKKyAgIyDmkJzntKLmjIflrprljIXliKvlkI0KKyAgdHlwZUFsaWFzZXNQYWNrYWdlOiBjb20ucnVveWkuKiouZG9tYWluCisgICMg6YWN572ubWFwcGVy55qE5omr5o+P77yM5om+5Yiw5omA5pyJ55qEbWFwcGVyLnhtbOaYoOWwhOaWh+S7tgorICBtYXBwZXJMb2NhdGlvbnM6IGNsYXNzcGF0aCo6bWFwcGVyLyoqLypNYXBwZXIueG1sCisgICMg5Yqg6L295YWo5bGA55qE6YWN572u5paH5Lu2CisgIGNvbmZpZ0xvY2F0aW9uOiBjbGFzc3BhdGg6bXliYXRpcy9teWJhdGlzLWNvbmZpZy54bWwKKworIyBQYWdlSGVscGVy5YiG6aG15o+S5Lu2CitwYWdlaGVscGVyOgorICBoZWxwZXJEaWFsZWN0OiBteXNxbAorICBzdXBwb3J0TWV0aG9kc0FyZ3VtZW50czogdHJ1ZQorICBwYXJhbXM6IGNvdW50PWNvdW50U3FsCisKKyMgU3ByaW5nZG9j6YWN572uCitzcHJpbmdkb2M6CisgIGFwaS1kb2NzOgorICAgIHBhdGg6IC92My9hcGktZG9jcworICBzd2FnZ2VyLXVpOgorICAgIGVuYWJsZWQ6IHRydWUKKyAgICBwYXRoOiAvc3dhZ2dlci11aS5odG1sCisgICAgdGFncy1zb3J0ZXI6IGFscGhhCisgIGdyb3VwLWNvbmZpZ3M6CisgICAgLSBncm91cDogJ2RlZmF1bHQnCisgICAgICBkaXNwbGF5LW5hbWU6ICfmtYvor5XmqKHlnZcnCisgICAgICBwYXRocy10by1tYXRjaDogJy8qKicKKyAgICAgIHBhY2thZ2VzLXRvLXNjYW46IGNvbS5ydW95aS53ZWIuY29udHJvbGxlci50b29sCisKKyMg6Ziy5q2iWFNT5pS75Ye7Cit4c3M6CisgICMg6L+H5ruk5byA5YWzCisgIGVuYWJsZWQ6IHRydWUKKyAgIyDmjpLpmaTpk77mjqXvvIjlpJrkuKrnlKjpgJflj7fliIbpmpTvvIkKKyAgZXhjbHVkZXM6IC9zeXN0ZW0vbm90aWNlCisgICMg5Yy56YWN6ZO+5o6lCisgIHVybFBhdHRlcm5zOiAvc3lzdGVtLyosL21vbml0b3IvKiwvdG9vbC8qCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmFubmVyLnR4dCBiL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9iYW5uZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzFjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmFubmVyLnR4dApAQCAtMCwwICsxLDI0IEBACitBcHBsaWNhdGlvbiBWZXJzaW9uOiAke3J1b3lpLnZlcnNpb259CitTcHJpbmcgQm9vdCBWZXJzaW9uOiAke3NwcmluZy1ib290LnZlcnNpb259CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF9vb09vb18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIG84ODg4ODg4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICA4OCIgLiAiODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgKHwgXl9eIHwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIE9cICA9ICAvTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICBfX19fL2AtLS0nXF9fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgIC4nICBcXHwgICAgIHwvLyAgYC4gICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgIC8gIFxcfHx8ICA6ICB8fHwvLyAgXCAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgIC8gIF98fHx8fCAtOi0gfHx8fHwtICBcICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICB8ICAgfCBcXFwgIC0gIC8vLyB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgfCBcX3wgICcnXC0tLS8nJyAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgIFwgIC4tXF9fICBgLWAgIF9fXy8tLiAvICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgX19fYC4gLicgIC8tLS4tLVwgIGAuIC4gX19fICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAuIiIgJzwgIGAuX19fXF88fD5fL19fXy4nICA+JyIiLiAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgIHwgfCA6ICBgLSBcYC47YFwgXyAvYDsuYC8gLSBgIDogfCB8ICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICBcICBcIGAtLiAgIFxfIF9fXCAvX18gXy8gICAuLWAgLyAgLyAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgPT09PT09PT1gLS5fX19fYC0uX19fXF9fX19fL19fXy4tYF9fX18uLSc9PT09PT09PSAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGA9LS0tPScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiAgICAgICAgLy8KKy8vICAgICAgICAgICAgIOS9m+elluS/neS9kSAgICAgICDmsLjkuI3lrpXmnLogICAgICDmsLjml6BCVUcgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RlMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDM4IEBACisj6ZSZ6K+v5raI5oGvCitub3QubnVsbD0qIOW/hemhu+Whq+WGmQordXNlci5qY2FwdGNoYS5lcnJvcj3pqozor4HnoIHplJnor68KK3VzZXIuamNhcHRjaGEuZXhwaXJlPemqjOivgeeggeW3suWkseaViAordXNlci5ub3QuZXhpc3RzPeeUqOaIt+S4jeWtmOWcqC/lr4bnoIHplJnor68KK3VzZXIucGFzc3dvcmQubm90Lm1hdGNoPeeUqOaIt+S4jeWtmOWcqC/lr4bnoIHplJnor68KK3VzZXIucGFzc3dvcmQucmV0cnkubGltaXQuY291bnQ95a+G56CB6L6T5YWl6ZSZ6K+vezB95qyhCit1c2VyLnBhc3N3b3JkLnJldHJ5LmxpbWl0LmV4Y2VlZD3lr4bnoIHovpPlhaXplJnor697MH3mrKHvvIzluJDmiLfplIHlrpp7MX3liIbpkp8KK3VzZXIucGFzc3dvcmQuZGVsZXRlPeWvueS4jei1t++8jOaCqOeahOi0puWPt+W3suiiq+WIoOmZpAordXNlci5ibG9ja2VkPeeUqOaIt+W3suWwgeemge+8jOivt+iBlOezu+euoeeQhuWRmAorcm9sZS5ibG9ja2VkPeinkuiJsuW3suWwgeemge+8jOivt+iBlOezu+euoeeQhuWRmAorbG9naW4uYmxvY2tlZD3lvojpgZfmhr7vvIzorr/pl65JUOW3suiiq+WIl+WFpeezu+e7n+m7keWQjeWNlQordXNlci5sb2dvdXQuc3VjY2Vzcz3pgIDlh7rmiJDlip8KKworbGVuZ3RoLm5vdC52YWxpZD3plb/luqblv4XpobvlnKh7bWlufeWIsHttYXh95Liq5a2X56ym5LmL6Ze0CisKK3VzZXIudXNlcm5hbWUubm90LnZhbGlkPSogMuWIsDIw5Liq5rGJ5a2X44CB5a2X5q+N44CB5pWw5a2X5oiW5LiL5YiS57q/57uE5oiQ77yM5LiU5b+F6aG75Lul6Z2e5pWw5a2X5byA5aS0Cit1c2VyLnBhc3N3b3JkLm5vdC52YWxpZD0qIDUtNTDkuKrlrZfnrKYKKyAKK3VzZXIuZW1haWwubm90LnZhbGlkPemCrueuseagvOW8j+mUmeivrwordXNlci5tb2JpbGUucGhvbmUubnVtYmVyLm5vdC52YWxpZD3miYvmnLrlj7fmoLzlvI/plJnor68KK3VzZXIubG9naW4uc3VjY2Vzcz3nmbvlvZXmiJDlip8KK3VzZXIucmVnaXN0ZXIuc3VjY2Vzcz3ms6jlhozmiJDlip8KK3VzZXIubm90Zm91bmQ96K+36YeN5paw55m75b2VCit1c2VyLmZvcmNlbG9nb3V0PeeuoeeQhuWRmOW8uuWItumAgOWHuu+8jOivt+mHjeaWsOeZu+W9lQordXNlci51bmtub3duLmVycm9yPeacquefpemUmeivr++8jOivt+mHjeaWsOeZu+W9lQorCisjI+aWh+S7tuS4iuS8oOa2iOaBrwordXBsb2FkLmV4Y2VlZC5tYXhTaXplPeS4iuS8oOeahOaWh+S7tuWkp+Wwj+i2heWHuumZkOWItueahOaWh+S7tuWkp+Wwj++8gTxici8+5YWB6K6455qE5paH5Lu25pyA5aSn5aSn5bCP5piv77yaezB9TULvvIEKK3VwbG9hZC5maWxlbmFtZS5leGNlZWQubGVuZ3RoPeS4iuS8oOeahOaWh+S7tuWQjeacgOmVv3swfeS4quWtl+espgorCisjI+adg+mZkAorbm8ucGVybWlzc2lvbj3mgqjmsqHmnInmlbDmja7nmoTmnYPpmZDvvIzor7fogZTns7vnrqHnkIblkZjmt7vliqDmnYPpmZAgW3swfV0KK25vLmNyZWF0ZS5wZXJtaXNzaW9uPeaCqOayoeacieWIm+W7uuaVsOaNrueahOadg+mZkO+8jOivt+iBlOezu+euoeeQhuWRmOa3u+WKoOadg+mZkCBbezB9XQorbm8udXBkYXRlLnBlcm1pc3Npb2495oKo5rKh5pyJ5L+u5pS55pWw5o2u55qE5p2D6ZmQ77yM6K+36IGU57O7566h55CG5ZGY5re75Yqg5p2D6ZmQIFt7MH1dCituby5kZWxldGUucGVybWlzc2lvbj3mgqjmsqHmnInliKDpmaTmlbDmja7nmoTmnYPpmZDvvIzor7fogZTns7vnrqHnkIblkZjmt7vliqDmnYPpmZAgW3swfV0KK25vLmV4cG9ydC5wZXJtaXNzaW9uPeaCqOayoeacieWvvOWHuuaVsOaNrueahOadg+mZkO+8jOivt+iBlOezu+euoeeQhuWRmOa3u+WKoOadg+mZkCBbezB9XQorbm8udmlldy5wZXJtaXNzaW9uPeaCqOayoeacieafpeeci+aVsOaNrueahOadg+mZkO+8jOivt+iBlOezu+euoeeQhuWRmOa3u+WKoOadg+mZkCBbezB9XQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2xvZ2JhY2sueG1sIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL2xvZ2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjA1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nYmFjay54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjb25maWd1cmF0aW9uPgorICAgIDwhLS0g5pel5b+X5a2Y5pS+6Lev5b6EIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJsb2cucGF0aCIgdmFsdWU9Ii9ob21lL3J1b3lpL2xvZ3MiIC8+CisgICAgPCEtLSDml6Xlv5fovpPlh7rmoLzlvI8gLS0+CisJPHByb3BlcnR5IG5hbWU9ImxvZy5wYXR0ZXJuIiB2YWx1ZT0iJWR7SEg6bW06c3MuU1NTfSBbJXRocmVhZF0gJS01bGV2ZWwgJWxvZ2dlcnsyMH0gLSBbJW1ldGhvZCwlbGluZV0gLSAlbXNnJW4iIC8+CisKKwk8IS0tIOaOp+WItuWPsOi+k+WHuiAtLT4KKwk8YXBwZW5kZXIgbmFtZT0iY29uc29sZSIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKwkJPGVuY29kZXI+CisJCQk8cGF0dGVybj4ke2xvZy5wYXR0ZXJufTwvcGF0dGVybj4KKwkJPC9lbmNvZGVyPgorCTwvYXBwZW5kZXI+CisJCisJPCEtLSDns7vnu5/ml6Xlv5fovpPlh7ogLS0+CisJPGFwcGVuZGVyIG5hbWU9ImZpbGVfaW5mbyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkgICAgPGZpbGU+JHtsb2cucGF0aH0vc3lzLWluZm8ubG9nPC9maWxlPgorICAgICAgICA8IS0tIOW+queOr+aUv+etlu+8muWfuuS6juaXtumXtOWIm+W7uuaXpeW/l+aWh+S7tiAtLT4KKwkJPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5UaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KKyAgICAgICAgICAgIDwhLS0g5pel5b+X5paH5Lu25ZCN5qC85byPIC0tPgorCQkJPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5wYXRofS9zeXMtaW5mby4lZHt5eXl5LU1NLWRkfS5sb2c8L2ZpbGVOYW1lUGF0dGVybj4KKwkJCTwhLS0g5pel5b+X5pyA5aSn55qE5Y6G5Y+yIDYw5aSpIC0tPgorCQkJPG1heEhpc3Rvcnk+NjA8L21heEhpc3Rvcnk+CisJCTwvcm9sbGluZ1BvbGljeT4KKwkJPGVuY29kZXI+CisJCQk8cGF0dGVybj4ke2xvZy5wYXR0ZXJufTwvcGF0dGVybj4KKwkJPC9lbmNvZGVyPgorCQk8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5MZXZlbEZpbHRlciI+CisgICAgICAgICAgICA8IS0tIOi/h+a7pOeahOe6p+WIqyAtLT4KKyAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgICAgIDwhLS0g5Yy56YWN5pe255qE5pON5L2c77ya5o6l5pS277yI6K6w5b2V77yJIC0tPgorICAgICAgICAgICAgPG9uTWF0Y2g+QUNDRVBUPC9vbk1hdGNoPgorICAgICAgICAgICAgPCEtLSDkuI3ljLnphY3ml7bnmoTmk43kvZzvvJrmi5Lnu53vvIjkuI3orrDlvZXvvIkgLS0+CisgICAgICAgICAgICA8b25NaXNtYXRjaD5ERU5ZPC9vbk1pc21hdGNoPgorICAgICAgICA8L2ZpbHRlcj4KKwk8L2FwcGVuZGVyPgorCQorCTxhcHBlbmRlciBuYW1lPSJmaWxlX2Vycm9yIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorCSAgICA8ZmlsZT4ke2xvZy5wYXRofS9zeXMtZXJyb3IubG9nPC9maWxlPgorICAgICAgICA8IS0tIOW+queOr+aUv+etlu+8muWfuuS6juaXtumXtOWIm+W7uuaXpeW/l+aWh+S7tiAtLT4KKyAgICAgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5UaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KKyAgICAgICAgICAgIDwhLS0g5pel5b+X5paH5Lu25ZCN5qC85byPIC0tPgorICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5wYXRofS9zeXMtZXJyb3IuJWR7eXl5eS1NTS1kZH0ubG9nPC9maWxlTmFtZVBhdHRlcm4+CisJCQk8IS0tIOaXpeW/l+acgOWkp+eahOWOhuWPsiA2MOWkqSAtLT4KKwkJCTxtYXhIaXN0b3J5PjYwPC9tYXhIaXN0b3J5PgorICAgICAgICA8L3JvbGxpbmdQb2xpY3k+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPHBhdHRlcm4+JHtsb2cucGF0dGVybn08L3BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuTGV2ZWxGaWx0ZXIiPgorICAgICAgICAgICAgPCEtLSDov4fmu6TnmoTnuqfliKsgLS0+CisgICAgICAgICAgICA8bGV2ZWw+RVJST1I8L2xldmVsPgorCQkJPCEtLSDljLnphY3ml7bnmoTmk43kvZzvvJrmjqXmlLbvvIjorrDlvZXvvIkgLS0+CisgICAgICAgICAgICA8b25NYXRjaD5BQ0NFUFQ8L29uTWF0Y2g+CisJCQk8IS0tIOS4jeWMuemFjeaXtueahOaTjeS9nO+8muaLkue7ne+8iOS4jeiusOW9le+8iSAtLT4KKyAgICAgICAgICAgIDxvbk1pc21hdGNoPkRFTlk8L29uTWlzbWF0Y2g+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvYXBwZW5kZXI+CisJCisJPCEtLSDnlKjmiLforr/pl67ml6Xlv5fovpPlh7ogIC0tPgorICAgIDxhcHBlbmRlciBuYW1lPSJzeXMtdXNlciIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkJPGZpbGU+JHtsb2cucGF0aH0vc3lzLXVzZXIubG9nPC9maWxlPgorICAgICAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlRpbWVCYXNlZFJvbGxpbmdQb2xpY3kiPgorICAgICAgICAgICAgPCEtLSDmjInlpKnlm57mu5ogZGFpbHkgLS0+CisgICAgICAgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLnBhdGh9L3N5cy11c2VyLiVke3l5eXktTU0tZGR9LmxvZzwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgICAgICAgPCEtLSDml6Xlv5fmnIDlpKfnmoTljoblj7IgNjDlpKkgLS0+CisgICAgICAgICAgICA8bWF4SGlzdG9yeT42MDwvbWF4SGlzdG9yeT4KKyAgICAgICAgPC9yb2xsaW5nUG9saWN5PgorICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiR7bG9nLnBhdHRlcm59PC9wYXR0ZXJuPgorICAgICAgICA8L2VuY29kZXI+CisgICAgPC9hcHBlbmRlcj4KKwkKKwk8IS0tIOezu+e7n+aooeWdl+aXpeW/l+e6p+WIq+aOp+WItiAgLS0+CisJPGxvZ2dlciBuYW1lPSJjb20ucnVveWkiIGxldmVsPSJpbmZvIiAvPgorCTwhLS0gU3ByaW5n5pel5b+X57qn5Yir5o6n5Yi2ICAtLT4KKwk8bG9nZ2VyIG5hbWU9Im9yZy5zcHJpbmdmcmFtZXdvcmsiIGxldmVsPSJ3YXJuIiAvPgorCisJPHJvb3QgbGV2ZWw9ImluZm8iPgorCQk8YXBwZW5kZXItcmVmIHJlZj0iY29uc29sZSIgLz4KKwk8L3Jvb3Q+CisJCisJPCEtLeezu+e7n+aTjeS9nOaXpeW/ly0tPgorICAgIDxyb290IGxldmVsPSJpbmZvIj4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9ImZpbGVfaW5mbyIgLz4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9ImZpbGVfZXJyb3IiIC8+CisgICAgPC9yb290PgorCQorCTwhLS3ns7vnu5/nlKjmiLfmk43kvZzml6Xlv5ctLT4KKyAgICA8bG9nZ2VyIG5hbWU9InN5cy11c2VyIiBsZXZlbD0iaW5mbyI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJzeXMtdXNlciIvPgorICAgIDwvbG9nZ2VyPgorPC9jb25maWd1cmF0aW9uPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyUHJvamVjdE1hcHBlci54bWwgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyUHJvamVjdE1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMjIyMwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1RyYWNrZXJQcm9qZWN0TWFwcGVyLnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkudHJhY2tlci5tYXBwZXIuVHJhY2tlclByb2plY3RNYXBwZXIiPgorICAgIAorICAgIDxyZXN1bHRNYXAgdHlwZT0iVHJhY2tlclByb2plY3QiIGlkPSJUcmFja2VyUHJvamVjdFJlc3VsdCI+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InByb2plY3RJZCIgICAgY29sdW1uPSJwcm9qZWN0X2lkIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJwcm9qZWN0TmFtZSIgICAgY29sdW1uPSJwcm9qZWN0X25hbWUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImRlc2NyaXB0aW9uIiAgICBjb2x1bW49ImRlc2NyaXB0aW9uIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgIGNvbHVtbj0ic3RhdHVzIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVCeSIgICAgY29sdW1uPSJjcmVhdGVfYnkiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZUJ5IiAgICBjb2x1bW49InVwZGF0ZV9ieSIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlVGltZSIgICAgY29sdW1uPSJ1cGRhdGVfdGltZSIgICAgLz4KKyAgICA8L3Jlc3VsdE1hcD4KKworICAgIDxzcWwgaWQ9InNlbGVjdFRyYWNrZXJQcm9qZWN0Vm8iPgorICAgICAgICBzZWxlY3QgcHJvamVjdF9pZCwgcHJvamVjdF9uYW1lLCBkZXNjcmlwdGlvbiwgc3RhdHVzLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lIGZyb20gdHJhY2tlcl9wcm9qZWN0CisgICAgPC9zcWw+CisKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RUcmFja2VyUHJvamVjdExpc3QiIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJQcm9qZWN0IiByZXN1bHRNYXA9IlRyYWNrZXJQcm9qZWN0UmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFRyYWNrZXJQcm9qZWN0Vm8iLz4KKyAgICAgICAgPHdoZXJlPiAgCisgICAgICAgICAgICA8aWYgdGVzdD0icHJvamVjdE5hbWUgIT0gbnVsbCAgYW5kIHByb2plY3ROYW1lICE9ICcnIj4gYW5kIHByb2plY3RfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7cHJvamVjdE5hbWV9LCAnJScpPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsICBhbmQgZGVzY3JpcHRpb24gIT0gJyciPiBhbmQgZGVzY3JpcHRpb24gPSAje2Rlc2NyaXB0aW9ufTwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgIGFuZCBzdGF0dXMgIT0gJyciPiBhbmQgc3RhdHVzID0gI3tzdGF0dXN9PC9pZj4KKyAgICAgICAgPC93aGVyZT4KKyAgICA8L3NlbGVjdD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IlRyYWNrZXJQcm9qZWN0UmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFRyYWNrZXJQcm9qZWN0Vm8iLz4KKyAgICAgICAgd2hlcmUgcHJvamVjdF9pZCA9ICN7cHJvamVjdElkfQorICAgIDwvc2VsZWN0PgorCisgICAgPGluc2VydCBpZD0iaW5zZXJ0VHJhY2tlclByb2plY3QiIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJQcm9qZWN0IiB1c2VHZW5lcmF0ZWRLZXlzPSJ0cnVlIiBrZXlQcm9wZXJ0eT0icHJvamVjdElkIj4KKyAgICAgICAgaW5zZXJ0IGludG8gdHJhY2tlcl9wcm9qZWN0CisgICAgICAgIDx0cmltIHByZWZpeD0iKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InByb2plY3ROYW1lICE9IG51bGwgYW5kIHByb2plY3ROYW1lICE9ICcnIj5wcm9qZWN0X25hbWUsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsIj5kZXNjcmlwdGlvbiw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIj5jcmVhdGVfYnksPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjcmVhdGVUaW1lICE9IG51bGwiPmNyZWF0ZV90aW1lLDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCI+dXBkYXRlX2J5LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXBkYXRlVGltZSAhPSBudWxsIj51cGRhdGVfdGltZSw8L2lmPgorICAgICAgICAgPC90cmltPgorICAgICAgICA8dHJpbSBwcmVmaXg9InZhbHVlcyAoIiBzdWZmaXg9IikiIHN1ZmZpeE92ZXJyaWRlcz0iLCI+CisgICAgICAgICAgICA8aWYgdGVzdD0icHJvamVjdE5hbWUgIT0gbnVsbCBhbmQgcHJvamVjdE5hbWUgIT0gJyciPiN7cHJvamVjdE5hbWV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZGVzY3JpcHRpb24gIT0gbnVsbCI+I3tkZXNjcmlwdGlvbn0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCI+I3tzdGF0dXN9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCI+I3tjcmVhdGVCeX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjcmVhdGVUaW1lICE9IG51bGwiPiN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIj4je3VwZGF0ZUJ5fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InVwZGF0ZVRpbWUgIT0gbnVsbCI+I3t1cGRhdGVUaW1lfSw8L2lmPgorICAgICAgICAgPC90cmltPgorICAgIDwvaW5zZXJ0PgorCisgICAgPHVwZGF0ZSBpZD0idXBkYXRlVHJhY2tlclByb2plY3QiIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJQcm9qZWN0Ij4KKyAgICAgICAgdXBkYXRlIHRyYWNrZXJfcHJvamVjdAorICAgICAgICA8dHJpbSBwcmVmaXg9IlNFVCIgc3VmZml4T3ZlcnJpZGVzPSIsIj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcm9qZWN0TmFtZSAhPSBudWxsIGFuZCBwcm9qZWN0TmFtZSAhPSAnJyI+cHJvamVjdF9uYW1lID0gI3twcm9qZWN0TmFtZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsIj5kZXNjcmlwdGlvbiA9ICN7ZGVzY3JpcHRpb259LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwiPnN0YXR1cyA9ICN7c3RhdHVzfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwiPmNyZWF0ZV9ieSA9ICN7Y3JlYXRlQnl9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlVGltZSAhPSBudWxsIj5jcmVhdGVfdGltZSA9ICN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIj51cGRhdGVfYnkgPSAje3VwZGF0ZUJ5fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InVwZGF0ZVRpbWUgIT0gbnVsbCI+dXBkYXRlX3RpbWUgPSAje3VwZGF0ZVRpbWV9LDwvaWY+CisgICAgICAgIDwvdHJpbT4KKyAgICAgICAgd2hlcmUgcHJvamVjdF9pZCA9ICN7cHJvamVjdElkfQorICAgIDwvdXBkYXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlVHJhY2tlclByb2plY3RCeVByb2plY3RJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIHRyYWNrZXJfcHJvamVjdCB3aGVyZSBwcm9qZWN0X2lkID0gI3twcm9qZWN0SWR9CisgICAgPC9kZWxldGU+CisKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGVUcmFja2VyUHJvamVjdEJ5UHJvamVjdElkcyIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gdHJhY2tlcl9wcm9qZWN0IHdoZXJlIHByb2plY3RfaWQgaW4gCisgICAgICAgIDxmb3JlYWNoIGl0ZW09InByb2plY3RJZCIgY29sbGVjdGlvbj0iYXJyYXkiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorICAgICAgICAgICAgI3twcm9qZWN0SWR9CisgICAgICAgIDwvZm9yZWFjaD4KKyAgICA8L2RlbGV0ZT4KKzwvbWFwcGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1RyYWNrZXJQcm9qZWN0VXNlck1hcHBlci54bWwgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyUHJvamVjdFVzZXJNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTQzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyUHJvamVjdFVzZXJNYXBwZXIueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS50cmFja2VyLm1hcHBlci5UcmFja2VyUHJvamVjdFVzZXJNYXBwZXIiPgorICAgIAorICAgIDxyZXN1bHRNYXAgdHlwZT0iVHJhY2tlclByb2plY3RVc2VyIiBpZD0iVHJhY2tlclByb2plY3RVc2VyUmVzdWx0Ij4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icHJvamVjdElkIiAgICBjb2x1bW49InByb2plY3RfaWQiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InVzZXJJZCIgICAgY29sdW1uPSJ1c2VyX2lkIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJyb2xlIiAgICBjb2x1bW49InJvbGUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgIC8+CisgICAgPC9yZXN1bHRNYXA+CisKKyAgICA8c3FsIGlkPSJzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJWbyI+CisgICAgICAgIHNlbGVjdCBwcm9qZWN0X2lkLCB1c2VyX2lkLCByb2xlLCBjcmVhdGVfdGltZSBmcm9tIHRyYWNrZXJfcHJvamVjdF91c2VyCisgICAgPC9zcWw+CisKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJMaXN0IiBwYXJhbWV0ZXJUeXBlPSJUcmFja2VyUHJvamVjdFVzZXIiIHJlc3VsdE1hcD0iVHJhY2tlclByb2plY3RVc2VyUmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlclZvIi8+CisgICAgICAgIDx3aGVyZT4gIAorICAgICAgICAgICAgPGlmIHRlc3Q9InJvbGUgIT0gbnVsbCAgYW5kIHJvbGUgIT0gJyciPiBhbmQgcm9sZSA9ICN7cm9sZX08L2lmPgorICAgICAgICA8L3doZXJlPgorICAgIDwvc2VsZWN0PgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdFRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IlRyYWNrZXJQcm9qZWN0VXNlclJlc3VsdCI+CisgICAgICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3RUcmFja2VyUHJvamVjdFVzZXJWbyIvPgorICAgICAgICB3aGVyZSBwcm9qZWN0X2lkID0gI3twcm9qZWN0SWR9CisgICAgPC9zZWxlY3Q+CisKKyAgICA8aW5zZXJ0IGlkPSJpbnNlcnRUcmFja2VyUHJvamVjdFVzZXIiIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJQcm9qZWN0VXNlciI+CisgICAgICAgIGluc2VydCBpbnRvIHRyYWNrZXJfcHJvamVjdF91c2VyCisgICAgICAgIDx0cmltIHByZWZpeD0iKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InByb2plY3RJZCAhPSBudWxsIj5wcm9qZWN0X2lkLDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXNlcklkICE9IG51bGwiPnVzZXJfaWQsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJyb2xlICE9IG51bGwgYW5kIHJvbGUgIT0gJyciPnJvbGUsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjcmVhdGVUaW1lICE9IG51bGwiPmNyZWF0ZV90aW1lLDwvaWY+CisgICAgICAgICA8L3RyaW0+CisgICAgICAgIDx0cmltIHByZWZpeD0idmFsdWVzICgiIHN1ZmZpeD0iKSIgc3VmZml4T3ZlcnJpZGVzPSIsIj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcm9qZWN0SWQgIT0gbnVsbCI+I3twcm9qZWN0SWR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXNlcklkICE9IG51bGwiPiN7dXNlcklkfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InJvbGUgIT0gbnVsbCBhbmQgcm9sZSAhPSAnJyI+I3tyb2xlfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImNyZWF0ZVRpbWUgIT0gbnVsbCI+I3tjcmVhdGVUaW1lfSw8L2lmPgorICAgICAgICAgPC90cmltPgorICAgIDwvaW5zZXJ0PgorCisgICAgPHVwZGF0ZSBpZD0idXBkYXRlVHJhY2tlclByb2plY3RVc2VyIiBwYXJhbWV0ZXJUeXBlPSJUcmFja2VyUHJvamVjdFVzZXIiPgorICAgICAgICB1cGRhdGUgdHJhY2tlcl9wcm9qZWN0X3VzZXIKKyAgICAgICAgPHRyaW0gcHJlZml4PSJTRVQiIHN1ZmZpeE92ZXJyaWRlcz0iLCI+CisgICAgICAgICAgICA8aWYgdGVzdD0idXNlcklkICE9IG51bGwiPnVzZXJfaWQgPSAje3VzZXJJZH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJyb2xlICE9IG51bGwgYW5kIHJvbGUgIT0gJyciPnJvbGUgPSAje3JvbGV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlVGltZSAhPSBudWxsIj5jcmVhdGVfdGltZSA9ICN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgPC90cmltPgorICAgICAgICB3aGVyZSBwcm9qZWN0X2lkID0gI3twcm9qZWN0SWR9CisgICAgPC91cGRhdGU+CisKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGVUcmFja2VyUHJvamVjdFVzZXJCeVByb2plY3RJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIHRyYWNrZXJfcHJvamVjdF91c2VyIHdoZXJlIHByb2plY3RfaWQgPSAje3Byb2plY3RJZH0KKyAgICA8L2RlbGV0ZT4KKworICAgIDxkZWxldGUgaWQ9ImRlbGV0ZVRyYWNrZXJQcm9qZWN0VXNlckJ5UHJvamVjdElkcyIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gdHJhY2tlcl9wcm9qZWN0X3VzZXIgd2hlcmUgcHJvamVjdF9pZCBpbiAKKyAgICAgICAgPGZvcmVhY2ggaXRlbT0icHJvamVjdElkIiBjb2xsZWN0aW9uPSJhcnJheSIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisgICAgICAgICAgICAje3Byb2plY3RJZH0KKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvZGVsZXRlPgorPC9tYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vVHJhY2tlclRhc2tMb2dNYXBwZXIueG1sIGIvcnVveWktYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vVHJhY2tlclRhc2tMb2dNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExN2QwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyVGFza0xvZ01hcHBlci54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLnRyYWNrZXIubWFwcGVyLlRyYWNrZXJUYXNrTG9nTWFwcGVyIj4KKyAgICAKKyAgICA8cmVzdWx0TWFwIHR5cGU9IlRyYWNrZXJUYXNrTG9nIiBpZD0iVHJhY2tlclRhc2tMb2dSZXN1bHQiPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJsb2dJZCIgICAgY29sdW1uPSJsb2dfaWQiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InRhc2tJZCIgICAgY29sdW1uPSJ0YXNrX2lkIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1c2VySWQiICAgIGNvbHVtbj0idXNlcl9pZCIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iYWN0aW9uIiAgICBjb2x1bW49ImFjdGlvbiIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iZGVzY3JpcHRpb24iICAgIGNvbHVtbj0iZGVzY3JpcHRpb24iICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgIC8+CisgICAgPC9yZXN1bHRNYXA+CisKKyAgICA8c3FsIGlkPSJzZWxlY3RUcmFja2VyVGFza0xvZ1ZvIj4KKyAgICAgICAgc2VsZWN0IGxvZ19pZCwgdGFza19pZCwgdXNlcl9pZCwgYWN0aW9uLCBkZXNjcmlwdGlvbiwgY3JlYXRlX3RpbWUgZnJvbSB0cmFja2VyX3Rhc2tfbG9nCisgICAgPC9zcWw+CisKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RUcmFja2VyVGFza0xvZ0xpc3QiIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJUYXNrTG9nIiByZXN1bHRNYXA9IlRyYWNrZXJUYXNrTG9nUmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFRyYWNrZXJUYXNrTG9nVm8iLz4KKyAgICAgICAgPHdoZXJlPiAgCisgICAgICAgICAgICA8aWYgdGVzdD0idGFza0lkICE9IG51bGwgIj4gYW5kIHRhc2tfaWQgPSAje3Rhc2tJZH08L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InVzZXJJZCAhPSBudWxsICI+IGFuZCB1c2VyX2lkID0gI3t1c2VySWR9PC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJhY3Rpb24gIT0gbnVsbCAgYW5kIGFjdGlvbiAhPSAnJyI+IGFuZCBhY3Rpb24gPSAje2FjdGlvbn08L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImRlc2NyaXB0aW9uICE9IG51bGwgIGFuZCBkZXNjcmlwdGlvbiAhPSAnJyI+IGFuZCBkZXNjcmlwdGlvbiA9ICN7ZGVzY3JpcHRpb259PC9pZj4KKyAgICAgICAgPC93aGVyZT4KKyAgICA8L3NlbGVjdD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RUcmFja2VyVGFza0xvZ0J5TG9nSWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iVHJhY2tlclRhc2tMb2dSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0VHJhY2tlclRhc2tMb2dWbyIvPgorICAgICAgICB3aGVyZSBsb2dfaWQgPSAje2xvZ0lkfQorICAgIDwvc2VsZWN0PgorCisgICAgPGluc2VydCBpZD0iaW5zZXJ0VHJhY2tlclRhc2tMb2ciIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJUYXNrTG9nIiB1c2VHZW5lcmF0ZWRLZXlzPSJ0cnVlIiBrZXlQcm9wZXJ0eT0ibG9nSWQiPgorICAgICAgICBpbnNlcnQgaW50byB0cmFja2VyX3Rhc2tfbG9nCisgICAgICAgIDx0cmltIHByZWZpeD0iKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRhc2tJZCAhPSBudWxsIj50YXNrX2lkLDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXNlcklkICE9IG51bGwiPnVzZXJfaWQsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJhY3Rpb24gIT0gbnVsbCBhbmQgYWN0aW9uICE9ICcnIj5hY3Rpb24sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsIj5kZXNjcmlwdGlvbiw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImNyZWF0ZVRpbWUgIT0gbnVsbCI+Y3JlYXRlX3RpbWUsPC9pZj4KKyAgICAgICAgIDwvdHJpbT4KKyAgICAgICAgPHRyaW0gcHJlZml4PSJ2YWx1ZXMgKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRhc2tJZCAhPSBudWxsIj4je3Rhc2tJZH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1c2VySWQgIT0gbnVsbCI+I3t1c2VySWR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iYWN0aW9uICE9IG51bGwgYW5kIGFjdGlvbiAhPSAnJyI+I3thY3Rpb259LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZGVzY3JpcHRpb24gIT0gbnVsbCI+I3tkZXNjcmlwdGlvbn0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjcmVhdGVUaW1lICE9IG51bGwiPiN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgIDwvdHJpbT4KKyAgICA8L2luc2VydD4KKworICAgIDx1cGRhdGUgaWQ9InVwZGF0ZVRyYWNrZXJUYXNrTG9nIiBwYXJhbWV0ZXJUeXBlPSJUcmFja2VyVGFza0xvZyI+CisgICAgICAgIHVwZGF0ZSB0cmFja2VyX3Rhc2tfbG9nCisgICAgICAgIDx0cmltIHByZWZpeD0iU0VUIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRhc2tJZCAhPSBudWxsIj50YXNrX2lkID0gI3t0YXNrSWR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXNlcklkICE9IG51bGwiPnVzZXJfaWQgPSAje3VzZXJJZH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJhY3Rpb24gIT0gbnVsbCBhbmQgYWN0aW9uICE9ICcnIj5hY3Rpb24gPSAje2FjdGlvbn0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsIj5kZXNjcmlwdGlvbiA9ICN7ZGVzY3JpcHRpb259LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlVGltZSAhPSBudWxsIj5jcmVhdGVfdGltZSA9ICN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgPC90cmltPgorICAgICAgICB3aGVyZSBsb2dfaWQgPSAje2xvZ0lkfQorICAgIDwvdXBkYXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gdHJhY2tlcl90YXNrX2xvZyB3aGVyZSBsb2dfaWQgPSAje2xvZ0lkfQorICAgIDwvZGVsZXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlVHJhY2tlclRhc2tMb2dCeUxvZ0lkcyIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gdHJhY2tlcl90YXNrX2xvZyB3aGVyZSBsb2dfaWQgaW4gCisgICAgICAgIDxmb3JlYWNoIGl0ZW09ImxvZ0lkIiBjb2xsZWN0aW9uPSJhcnJheSIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisgICAgICAgICAgICAje2xvZ0lkfQorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC9kZWxldGU+Cis8L21hcHBlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyVGFza01hcHBlci54bWwgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9UcmFja2VyVGFza01hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MmVkMAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1RyYWNrZXJUYXNrTWFwcGVyLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkudHJhY2tlci5tYXBwZXIuVHJhY2tlclRhc2tNYXBwZXIiPgorICAgIAorICAgIDxyZXN1bHRNYXAgdHlwZT0iVHJhY2tlclRhc2siIGlkPSJUcmFja2VyVGFza1Jlc3VsdCI+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InRhc2tJZCIgICAgY29sdW1uPSJ0YXNrX2lkIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJwcm9qZWN0SWQiICAgIGNvbHVtbj0icHJvamVjdF9pZCIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0idGFza05hbWUiICAgIGNvbHVtbj0idGFza19uYW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkZXNjcmlwdGlvbiIgICAgY29sdW1uPSJkZXNjcmlwdGlvbiIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iYXNzaWduZWRUbyIgICAgY29sdW1uPSJhc3NpZ25lZF90byIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0ic3RhdHVzIiAgICBjb2x1bW49InN0YXR1cyIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icHJpb3JpdHkiICAgIGNvbHVtbj0icHJpb3JpdHkiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiICAgIGNvbHVtbj0idXBkYXRlX3RpbWUiICAgIC8+CisgICAgPC9yZXN1bHRNYXA+CisKKyAgICA8c3FsIGlkPSJzZWxlY3RUcmFja2VyVGFza1ZvIj4KKyAgICAgICAgc2VsZWN0IHRhc2tfaWQsIHByb2plY3RfaWQsIHRhc2tfbmFtZSwgZGVzY3JpcHRpb24sIGFzc2lnbmVkX3RvLCBzdGF0dXMsIHByaW9yaXR5LCBjcmVhdGVfdGltZSwgdXBkYXRlX3RpbWUgZnJvbSB0cmFja2VyX3Rhc2sKKyAgICA8L3NxbD4KKworICAgIDxzZWxlY3QgaWQ9InNlbGVjdFRyYWNrZXJUYXNrTGlzdCIgcGFyYW1ldGVyVHlwZT0iVHJhY2tlclRhc2siIHJlc3VsdE1hcD0iVHJhY2tlclRhc2tSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0VHJhY2tlclRhc2tWbyIvPgorICAgICAgICA8d2hlcmU+ICAKKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcm9qZWN0SWQgIT0gbnVsbCAiPiBhbmQgcHJvamVjdF9pZCA9ICN7cHJvamVjdElkfTwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idGFza05hbWUgIT0gbnVsbCAgYW5kIHRhc2tOYW1lICE9ICcnIj4gYW5kIHRhc2tfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7dGFza05hbWV9LCAnJScpPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsICBhbmQgZGVzY3JpcHRpb24gIT0gJyciPiBhbmQgZGVzY3JpcHRpb24gPSAje2Rlc2NyaXB0aW9ufTwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iYXNzaWduZWRUbyAhPSBudWxsICI+IGFuZCBhc3NpZ25lZF90byA9ICN7YXNzaWduZWRUb308L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsICBhbmQgc3RhdHVzICE9ICcnIj4gYW5kIHN0YXR1cyA9ICN7c3RhdHVzfTwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0icHJpb3JpdHkgIT0gbnVsbCAgYW5kIHByaW9yaXR5ICE9ICcnIj4gYW5kIHByaW9yaXR5ID0gI3twcmlvcml0eX08L2lmPgorICAgICAgICA8L3doZXJlPgorICAgIDwvc2VsZWN0PgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdFRyYWNrZXJUYXNrQnlUYXNrSWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iVHJhY2tlclRhc2tSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0VHJhY2tlclRhc2tWbyIvPgorICAgICAgICB3aGVyZSB0YXNrX2lkID0gI3t0YXNrSWR9CisgICAgPC9zZWxlY3Q+CisKKyAgICA8aW5zZXJ0IGlkPSJpbnNlcnRUcmFja2VyVGFzayIgcGFyYW1ldGVyVHlwZT0iVHJhY2tlclRhc2siIHVzZUdlbmVyYXRlZEtleXM9InRydWUiIGtleVByb3BlcnR5PSJ0YXNrSWQiPgorICAgICAgICBpbnNlcnQgaW50byB0cmFja2VyX3Rhc2sKKyAgICAgICAgPHRyaW0gcHJlZml4PSIoIiBzdWZmaXg9IikiIHN1ZmZpeE92ZXJyaWRlcz0iLCI+CisgICAgICAgICAgICA8aWYgdGVzdD0icHJvamVjdElkICE9IG51bGwiPnByb2plY3RfaWQsPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ0YXNrTmFtZSAhPSBudWxsIGFuZCB0YXNrTmFtZSAhPSAnJyI+dGFza19uYW1lLDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZGVzY3JpcHRpb24gIT0gbnVsbCI+ZGVzY3JpcHRpb24sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJhc3NpZ25lZFRvICE9IG51bGwiPmFzc2lnbmVkX3RvLDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwiPnN0YXR1cyw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InByaW9yaXR5ICE9IG51bGwiPnByaW9yaXR5LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlVGltZSAhPSBudWxsIj5jcmVhdGVfdGltZSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InVwZGF0ZVRpbWUgIT0gbnVsbCI+dXBkYXRlX3RpbWUsPC9pZj4KKyAgICAgICAgIDwvdHJpbT4KKyAgICAgICAgPHRyaW0gcHJlZml4PSJ2YWx1ZXMgKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorICAgICAgICAgICAgPGlmIHRlc3Q9InByb2plY3RJZCAhPSBudWxsIj4je3Byb2plY3RJZH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ0YXNrTmFtZSAhPSBudWxsIGFuZCB0YXNrTmFtZSAhPSAnJyI+I3t0YXNrTmFtZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJkZXNjcmlwdGlvbiAhPSBudWxsIj4je2Rlc2NyaXB0aW9ufSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImFzc2lnbmVkVG8gIT0gbnVsbCI+I3thc3NpZ25lZFRvfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj4je3N0YXR1c30sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcmlvcml0eSAhPSBudWxsIj4je3ByaW9yaXR5fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImNyZWF0ZVRpbWUgIT0gbnVsbCI+I3tjcmVhdGVUaW1lfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InVwZGF0ZVRpbWUgIT0gbnVsbCI+I3t1cGRhdGVUaW1lfSw8L2lmPgorICAgICAgICAgPC90cmltPgorICAgIDwvaW5zZXJ0PgorCisgICAgPHVwZGF0ZSBpZD0idXBkYXRlVHJhY2tlclRhc2siIHBhcmFtZXRlclR5cGU9IlRyYWNrZXJUYXNrIj4KKyAgICAgICAgdXBkYXRlIHRyYWNrZXJfdGFzaworICAgICAgICA8dHJpbSBwcmVmaXg9IlNFVCIgc3VmZml4T3ZlcnJpZGVzPSIsIj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcm9qZWN0SWQgIT0gbnVsbCI+cHJvamVjdF9pZCA9ICN7cHJvamVjdElkfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRhc2tOYW1lICE9IG51bGwgYW5kIHRhc2tOYW1lICE9ICcnIj50YXNrX25hbWUgPSAje3Rhc2tOYW1lfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImRlc2NyaXB0aW9uICE9IG51bGwiPmRlc2NyaXB0aW9uID0gI3tkZXNjcmlwdGlvbn0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJhc3NpZ25lZFRvICE9IG51bGwiPmFzc2lnbmVkX3RvID0gI3thc3NpZ25lZFRvfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMgPSAje3N0YXR1c30sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwcmlvcml0eSAhPSBudWxsIj5wcmlvcml0eSA9ICN7cHJpb3JpdHl9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY3JlYXRlVGltZSAhPSBudWxsIj5jcmVhdGVfdGltZSA9ICN7Y3JlYXRlVGltZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1cGRhdGVUaW1lICE9IG51bGwiPnVwZGF0ZV90aW1lID0gI3t1cGRhdGVUaW1lfSw8L2lmPgorICAgICAgICA8L3RyaW0+CisgICAgICAgIHdoZXJlIHRhc2tfaWQgPSAje3Rhc2tJZH0KKyAgICA8L3VwZGF0ZT4KKworICAgIDxkZWxldGUgaWQ9ImRlbGV0ZVRyYWNrZXJUYXNrQnlUYXNrSWQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorICAgICAgICBkZWxldGUgZnJvbSB0cmFja2VyX3Rhc2sgd2hlcmUgdGFza19pZCA9ICN7dGFza0lkfQorICAgIDwvZGVsZXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlVHJhY2tlclRhc2tCeVRhc2tJZHMiIHBhcmFtZXRlclR5cGU9IlN0cmluZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIHRyYWNrZXJfdGFzayB3aGVyZSB0YXNrX2lkIGluIAorICAgICAgICA8Zm9yZWFjaCBpdGVtPSJ0YXNrSWQiIGNvbGxlY3Rpb249ImFycmF5IiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAgICAgICAgICAgICN7dGFza0lkfQorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC9kZWxldGU+Cis8L21hcHBlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbXliYXRpcy9teWJhdGlzLWNvbmZpZy54bWwgYi9ydW95aS1hZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvbXliYXRpcy9teWJhdGlzLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0N2MwMwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9teWJhdGlzL215YmF0aXMtY29uZmlnLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBjb25maWd1cmF0aW9uCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgQ29uZmlnIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtY29uZmlnLmR0ZCI+Cis8Y29uZmlndXJhdGlvbj4KKyAgICA8IS0tIOWFqOWxgOWPguaVsCAtLT4KKyAgICA8c2V0dGluZ3M+CisgICAgICAgIDwhLS0g5L2/5YWo5bGA55qE5pig5bCE5Zmo5ZCv55So5oiW56aB55So57yT5a2YIC0tPgorICAgICAgICA8c2V0dGluZyBuYW1lPSJjYWNoZUVuYWJsZWQiICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIiAgIC8+CisgICAgICAgIDwhLS0g5YWB6K64SkRCQyDmlK/mjIHoh6rliqjnlJ/miJDkuLvplK4gLS0+CisgICAgICAgIDxzZXR0aW5nIG5hbWU9InVzZUdlbmVyYXRlZEtleXMiICAgICAgICAgdmFsdWU9InRydWUiICAgLz4KKyAgICAgICAgPCEtLSDphY3nva7pu5jorqTnmoTmiafooYzlmaguU0lNUExF5bCx5piv5pmu6YCa5omn6KGM5ZmoO1JFVVNF5omn6KGM5Zmo5Lya6YeN55So6aKE5aSE55CG6K+t5Y+lKHByZXBhcmVkIHN0YXRlbWVudHMpO0JBVENI5omn6KGM5Zmo5bCG6YeN55So6K+t5Y+l5bm25omn6KGM5om56YeP5pu05pawIC0tPgorICAgICAgICA8c2V0dGluZyBuYW1lPSJkZWZhdWx0RXhlY3V0b3JUeXBlIiAgICAgIHZhbHVlPSJTSU1QTEUiIC8+CisJCTwhLS0g5oyH5a6aIE15QmF0aXMg5omA55So5pel5b+X55qE5YW35L2T5a6e546wIC0tPgorICAgICAgICA8c2V0dGluZyBuYW1lPSJsb2dJbXBsIiAgICAgICAgICAgICAgICAgIHZhbHVlPSJTTEY0SiIgIC8+CisgICAgICAgIDwhLS0g5L2/55So6am85bOw5ZG95ZCN5rOV6L2s5o2i5a2X5q61IC0tPgorCQk8IS0tIDxzZXR0aW5nIG5hbWU9Im1hcFVuZGVyc2NvcmVUb0NhbWVsQ2FzZSIgdmFsdWU9InRydWUiLz4gLS0+CisJPC9zZXR0aW5ncz4KKwkKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9wb20ueG1sIGIvcnVveWktY29tbW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjY4NwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9wb20ueG1sCkBAIC0wLDAgKzEsMTI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4zLjguODwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5ydW95aS1jb21tb248L2FydGlmYWN0SWQ+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIGNvbW1vbumAmueUqOW3peWFtworICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDwhLS0gU3ByaW5n5qGG5p625Z+65pys55qE5qC45b+D5bel5YW3IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dC1zdXBwb3J0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBTcHJpbmdXZWLmqKHlnZcgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHNwcmluZyBzZWN1cml0eSDlronlhajorqTor4EgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3Qtc3RhcnRlci1zZWN1cml0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gcGFnZWhlbHBlciDliIbpobXmj5Lku7YgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5wYWdlaGVscGVyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFnZWhlbHBlci1zcHJpbmctYm9vdC1zdGFydGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSDoh6rlrprkuYnpqozor4Hms6jop6MgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3Qtc3RhcnRlci12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLeW4uOeUqOW3peWFt+exuyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgIAorICAgICAgICA8IS0tIEpTT07lt6XlhbfnsbsgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorICAgICAgICA8IS0tIOmYv+mHjEpTT07op6PmnpDlmaggLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmFsaWJhYmEuZmFzdGpzb24yPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmFzdGpzb24yPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBpb+W4uOeUqOW3peWFt+exuyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gZXhjZWzlt6XlhbcgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5wb2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wb2ktb294bWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHltbOino+aekOWZqCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNuYWtleWFtbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gVG9rZW7nlJ/miJDkuI7op6PmnpAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5qc29ud2VidG9rZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qand0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBKYXhiIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHJlZGlzIOe8k+WtmOaTjeS9nCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLWRhdGEtcmVkaXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHBvb2wg5a+56LGh5rGgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtcG9vbDI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIOino+aekOWuouaIt+err+aTjeS9nOezu+e7n+OAgea1j+iniOWZqOetiSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5ldS5iaXR3YWxrZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5Vc2VyQWdlbnRVdGlsczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gc2VydmxldOWMhSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9Bbm9ueW1vdXMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9Bbm9ueW1vdXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZkNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0Fub255bW91cy5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiDljL/lkI3orr/pl67kuI3pibTmnYPms6jop6MKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5UWVBFIH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK3B1YmxpYyBAaW50ZXJmYWNlIEFub255bW91cworeworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0RhdGFTY29wZS5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0RhdGFTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDljODAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vRGF0YVNjb3BlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIOaVsOaNruadg+mZkOi/h+a7pOazqOinoworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBEYXRhU2NvcGUKK3sKKyAgICAvKioKKyAgICAgKiDpg6jpl6jooajnmoTliKvlkI0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlcHRBbGlhcygpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLfooajnmoTliKvlkI0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHVzZXJBbGlhcygpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDmnYPpmZDlrZfnrKbvvIjnlKjkuo7lpJrkuKrop5LoibLljLnphY3nrKblkIjopoHmsYLnmoTmnYPpmZDvvInpu5jorqTmoLnmja7mnYPpmZDms6jop6NAc3Pojrflj5bvvIzlpJrkuKrmnYPpmZDnlKjpgJflj7fliIbpmpTlvIDmnaUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHBlcm1pc3Npb24oKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0RhdGFTb3VyY2UuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9EYXRhU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljZDE5MQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9EYXRhU291cmNlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkRhdGFTb3VyY2VUeXBlOworCisvKioKKyAqIOiHquWumuS5ieWkmuaVsOaNrua6kOWIh+aNouazqOinoworICoKKyAqIOS8mOWFiOe6p++8muWFiOaWueazle+8jOWQjuexu++8jOWmguaenOaWueazleimhuebluS6huexu+S4iueahOaVsOaNrua6kOexu+Wei++8jOS7peaWueazleeahOS4uuWHhu+8jOWQpuWImeS7peexu+S4iueahOS4uuWHhgorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFRhcmdldCh7IEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRSB9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitASW5oZXJpdGVkCitwdWJsaWMgQGludGVyZmFjZSBEYXRhU291cmNlCit7CisgICAgLyoqCisgICAgICog5YiH5o2i5pWw5o2u5rqQ5ZCN56ewCisgICAgICovCisgICAgcHVibGljIERhdGFTb3VyY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBEYXRhU291cmNlVHlwZS5NQVNURVI7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vRXhjZWwuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9FeGNlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTU4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vRXhjZWwuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuSG9yaXpvbnRhbEFsaWdubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuSW5kZXhlZENvbG9yczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaS5FeGNlbEhhbmRsZXJBZGFwdGVyOworCisvKioKKyAqIOiHquWumuS5ieWvvOWHukV4Y2Vs5pWw5o2u5rOo6KejCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCitwdWJsaWMgQGludGVyZmFjZSBFeGNlbAoreworICAgIC8qKgorICAgICAqIOWvvOWHuuaXtuWcqGV4Y2Vs5Lit5o6S5bqPCisgICAgICovCisgICAgcHVibGljIGludCBzb3J0KCkgZGVmYXVsdCBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIC8qKgorICAgICAqIOWvvOWHuuWIsEV4Y2Vs5Lit55qE5ZCN5a2XLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDml6XmnJ/moLzlvI8sIOWmgjogeXl5eS1NTS1kZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGF0ZUZvcm1hdCgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDlpoLmnpzmmK/lrZflhbjnsbvlnovvvIzor7forr7nva7lrZflhbjnmoR0eXBl5YC8ICjlpoI6IHN5c191c2VyX3NleCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRpY3RUeXBlKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIOivu+WPluWGheWuuei9rOihqOi+vuW8jyAo5aaCOiAwPeeUtywxPeWlsywyPeacquefpSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRDb252ZXJ0ZXJFeHAoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICog5YiG6ZqU56ym77yM6K+75Y+W5a2X56ym5Liy57uE5YaF5a65CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzZXBhcmF0b3IoKSBkZWZhdWx0ICIsIjsKKworICAgIC8qKgorICAgICAqIEJpZ0RlY2ltYWwg57K+5bqmIOm7mOiupDotMSjpu5jorqTkuI3lvIDlkK9CaWdEZWNpbWFs5qC85byP5YyWKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2NhbGUoKSBkZWZhdWx0IC0xOworCisgICAgLyoqCisgICAgICogQmlnRGVjaW1hbCDoiI3lhaXop4TliJkg6buY6K6kOkJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9FVkVOCisgICAgICovCisgICAgcHVibGljIGludCByb3VuZGluZ01vZGUoKSBkZWZhdWx0IEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9FVkVOOworCisgICAgLyoqCisgICAgICog5a+85Ye65pe25ZyoZXhjZWzkuK3mr4/kuKrliJfnmoTpq5jluqYKKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGhlaWdodCgpIGRlZmF1bHQgMTQ7CisKKyAgICAvKioKKyAgICAgKiDlr7zlh7rml7blnKhleGNlbOS4reavj+S4quWIl+eahOWuveW6pgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgd2lkdGgoKSBkZWZhdWx0IDE2OworCisgICAgLyoqCisgICAgICog5paH5a2X5ZCO57yALOWmgiUgOTAg5Y+Y5oiQOTAlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzdWZmaXgoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICog5b2T5YC85Li656m65pe2LOWtl+auteeahOm7mOiupOWAvAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIOaPkOekuuS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcHJvbXB0KCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIOiuvue9ruWPquiDvemAieaLqeS4jeiDvei+k+WFpeeahOWIl+WGheWuuS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gY29tYm8oKSBkZWZhdWx0IHt9OworCisgICAgLyoqCisgICAgICog5piv5ZCm5LuO5a2X5YW46K+75pWw5o2u5YiwY29tYm8s6buY6K6k5LiN6K+75Y+WLOWmguivu+WPlumcgOimgeiuvue9rmRpY3RUeXBl5rOo6KejLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbWJvUmVhZERpY3QoKSBkZWZhdWx0IGZhbHNlOworCisgICAgLyoqCisgICAgICog5piv5ZCm6ZyA6KaB57q15ZCR5ZCI5bm25Y2V5YWD5qC8LOW6lOWvuemcgOaxgjrlkKvmnIlsaXN06ZuG5ZCI5Y2V5YWD5qC8KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5lZWRNZXJnZSgpIGRlZmF1bHQgZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKblr7zlh7rmlbDmja4s5bqU5a+56ZyA5rGCOuacieaXtuaIkeS7rOmcgOimgeWvvOWHuuS4gOS7veaooeadvyzov5nmmK/moIfpopjpnIDopoHkvYblhoXlrrnpnIDopoHnlKjmiLfmiYvlt6XloavlhpkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnQoKSBkZWZhdWx0IHRydWU7CisKKyAgICAvKioKKyAgICAgKiDlj6bkuIDkuKrnsbvkuK3nmoTlsZ7mgKflkI3np7As5pSv5oyB5aSa57qn6I635Y+WLOS7peWwj+aVsOeCuemalOW8gAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0QXR0cigpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKboh6rliqjnu5/orqHmlbDmja4s5Zyo5pyA5ZCO6L+95Yqg5LiA6KGM57uf6K6h5pWw5o2u5oC75ZKMCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aXN0aWNzKCkgZGVmYXVsdCBmYWxzZTsKKworICAgIC8qKgorICAgICAqIOWvvOWHuuexu+Wei++8iDDmlbDlrZcgMeWtl+espuS4siAy5Zu+54mH77yJCisgICAgICovCisgICAgcHVibGljIENvbHVtblR5cGUgY2VsbFR5cGUoKSBkZWZhdWx0IENvbHVtblR5cGUuU1RSSU5HOworCisgICAgLyoqCisgICAgICog5a+85Ye65YiX5aS06IOM5pmv6aKc6ImyCisgICAgICovCisgICAgcHVibGljIEluZGV4ZWRDb2xvcnMgaGVhZGVyQmFja2dyb3VuZENvbG9yKCkgZGVmYXVsdCBJbmRleGVkQ29sb3JzLkdSRVlfNTBfUEVSQ0VOVDsKKworICAgIC8qKgorICAgICAqIOWvvOWHuuWIl+WktOWtl+S9k+minOiJsgorICAgICAqLworICAgIHB1YmxpYyBJbmRleGVkQ29sb3JzIGhlYWRlckNvbG9yKCkgZGVmYXVsdCBJbmRleGVkQ29sb3JzLldISVRFOworCisgICAgLyoqCisgICAgICog5a+85Ye65Y2V5YWD5qC86IOM5pmv6aKc6ImyCisgICAgICovCisgICAgcHVibGljIEluZGV4ZWRDb2xvcnMgYmFja2dyb3VuZENvbG9yKCkgZGVmYXVsdCBJbmRleGVkQ29sb3JzLldISVRFOworCisgICAgLyoqCisgICAgICog5a+85Ye65Y2V5YWD5qC85a2X5L2T6aKc6ImyCisgICAgICovCisgICAgcHVibGljIEluZGV4ZWRDb2xvcnMgY29sb3IoKSBkZWZhdWx0IEluZGV4ZWRDb2xvcnMuQkxBQ0s7CisKKyAgICAvKioKKyAgICAgKiDlr7zlh7rlrZfmrrXlr7npvZDmlrnlvI8KKyAgICAgKi8KKyAgICBwdWJsaWMgSG9yaXpvbnRhbEFsaWdubWVudCBhbGlnbigpIGRlZmF1bHQgSG9yaXpvbnRhbEFsaWdubWVudC5DRU5URVI7CisKKyAgICAvKioKKyAgICAgKiDoh6rlrprkuYnmlbDmja7lpITnkIblmagKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8Pz4gaGFuZGxlcigpIGRlZmF1bHQgRXhjZWxIYW5kbGVyQWRhcHRlci5jbGFzczsKKworICAgIC8qKgorICAgICAqIOiHquWumuS5ieaVsOaNruWkhOeQhuWZqOWPguaVsAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBhcmdzKCkgZGVmYXVsdCB7fTsKKworICAgIC8qKgorICAgICAqIOWtl+auteexu+Wei++8iDDvvJrlr7zlh7rlr7zlhaXvvJsx77ya5LuF5a+85Ye677ybMu+8muS7heWvvOWFpe+8iQorICAgICAqLworICAgIFR5cGUgdHlwZSgpIGRlZmF1bHQgVHlwZS5BTEw7CisKKyAgICBwdWJsaWMgZW51bSBUeXBlCisgICAgeworICAgICAgICBBTEwoMCksIEVYUE9SVCgxKSwgSU1QT1JUKDIpOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworICAgICAgICBUeXBlKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCB2YWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gQ29sdW1uVHlwZQorICAgIHsKKyAgICAgICAgTlVNRVJJQygwKSwgU1RSSU5HKDEpLCBJTUFHRSgyKSwgVEVYVCgzKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKyAgICAgICAgQ29sdW1uVHlwZShpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgdmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vRXhjZWxzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vRXhjZWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxY2M4MQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9FeGNlbHMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEV4Y2Vs5rOo6Kej6ZuGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBFeGNlbHMKK3sKKyAgICBwdWJsaWMgRXhjZWxbXSB2YWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0xvZy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL0xvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjhlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vTG9nLmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuT3BlcmF0b3JUeXBlOworCisvKioKKyAqIOiHquWumuS5ieaTjeS9nOaXpeW/l+iusOW9leazqOinoworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKgorICovCitAVGFyZ2V0KHsgRWxlbWVudFR5cGUuUEFSQU1FVEVSLCBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgTG9nCit7CisgICAgLyoqCisgICAgICog5qih5Z2XCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0aXRsZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiDlip/og70KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVzaW5lc3NUeXBlIGJ1c2luZXNzVHlwZSgpIGRlZmF1bHQgQnVzaW5lc3NUeXBlLk9USEVSOworCisgICAgLyoqCisgICAgICog5pON5L2c5Lq657G75YirCisgICAgICovCisgICAgcHVibGljIE9wZXJhdG9yVHlwZSBvcGVyYXRvclR5cGUoKSBkZWZhdWx0IE9wZXJhdG9yVHlwZS5NQU5BR0U7CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbkv53lrZjor7fmsYLnmoTlj4LmlbAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVSZXF1ZXN0RGF0YSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIC8qKgorICAgICAqIOaYr+WQpuS/neWtmOWTjeW6lOeahOWPguaVsAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZVJlc3BvbnNlRGF0YSgpIGRlZmF1bHQgdHJ1ZTsKKworICAgIC8qKgorICAgICAqIOaOkumZpOaMh+WumueahOivt+axguWPguaVsAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBleGNsdWRlUGFyYW1OYW1lcygpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vUmF0ZUxpbWl0ZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9SYXRlTGltaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDI0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vUmF0ZUxpbWl0ZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5DYWNoZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkxpbWl0VHlwZTsKKworLyoqCisgKiDpmZDmtYHms6jop6MKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgUmF0ZUxpbWl0ZXIKK3sKKyAgICAvKioKKyAgICAgKiDpmZDmtYFrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGtleSgpIGRlZmF1bHQgQ2FjaGVDb25zdGFudHMuUkFURV9MSU1JVF9LRVk7CisKKyAgICAvKioKKyAgICAgKiDpmZDmtYHml7bpl7Qs5Y2V5L2N56eSCisgICAgICovCisgICAgcHVibGljIGludCB0aW1lKCkgZGVmYXVsdCA2MDsKKworICAgIC8qKgorICAgICAqIOmZkOa1geasoeaVsAorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnQoKSBkZWZhdWx0IDEwMDsKKworICAgIC8qKgorICAgICAqIOmZkOa1geexu+WeiworICAgICAqLworICAgIHB1YmxpYyBMaW1pdFR5cGUgbGltaXRUeXBlKCkgZGVmYXVsdCBMaW1pdFR5cGUuREVGQVVMVDsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9SZXBlYXRTdWJtaXQuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9SZXBlYXRTdWJtaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY5NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9hbm5vdGF0aW9uL1JlcGVhdFN1Ym1pdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Jbmhlcml0ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICog6Ieq5a6a5LmJ5rOo6Kej6Ziy5q2i6KGo5Y2V6YeN5aSN5o+Q5LqkCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqCisgKi8KK0BJbmhlcml0ZWQKK0BUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBSZXBlYXRTdWJtaXQKK3sKKyAgICAvKioKKyAgICAgKiDpl7TpmpTml7bpl7QobXMp77yM5bCP5LqO5q2k5pe26Ze06KeG5Li66YeN5aSN5o+Q5LqkCisgICAgICovCisgICAgcHVibGljIGludCBpbnRlcnZhbCgpIGRlZmF1bHQgNTAwMDsKKworICAgIC8qKgorICAgICAqIOaPkOekuua2iOaBrworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIuS4jeWFgeiuuOmHjeWkjeaPkOS6pO+8jOivt+eojeWAmeWGjeivlSI7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vU2Vuc2l0aXZlLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2Fubm90YXRpb24vU2Vuc2l0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2MjFlOQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vYW5ub3RhdGlvbi9TZW5zaXRpdmUuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkphY2tzb25Bbm5vdGF0aW9uc0luc2lkZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuYW5ub3RhdGlvbi5Kc29uU2VyaWFsaXplOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uZmlnLnNlcmlhbGl6ZXIuU2Vuc2l0aXZlSnNvblNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5EZXNlbnNpdGl6ZWRUeXBlOworCisvKioKKyAqIOaVsOaNruiEseaVj+azqOinoworICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCitASmFja3NvbkFubm90YXRpb25zSW5zaWRlCitASnNvblNlcmlhbGl6ZSh1c2luZyA9IFNlbnNpdGl2ZUpzb25TZXJpYWxpemVyLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgU2Vuc2l0aXZlCit7CisgICAgRGVzZW5zaXRpemVkVHlwZSBkZXNlbnNpdGl6ZWRUeXBlKCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbmZpZy9SdW9ZaUNvbmZpZy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25maWcvUnVvWWlDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI4MWNmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25maWcvUnVvWWlDb25maWcuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvbmZpZzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5jb250ZXh0LnByb3BlcnRpZXMuQ29uZmlndXJhdGlvblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworLyoqCisgKiDor7vlj5bpobnnm67nm7jlhbPphY3nva4KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitAQ29uZmlndXJhdGlvblByb3BlcnRpZXMocHJlZml4ID0gInJ1b3lpIikKK3B1YmxpYyBjbGFzcyBSdW9ZaUNvbmZpZworeworICAgIC8qKiDpobnnm67lkI3np7AgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqIOeJiOacrCAqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb247CisKKyAgICAvKiog54mI5p2D5bm05Lu9ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29weXJpZ2h0WWVhcjsKKworICAgIC8qKiDkuIrkvKDot6/lvoQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJvZmlsZTsKKworICAgIC8qKiDojrflj5blnLDlnYDlvIDlhbMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFkZHJlc3NFbmFibGVkOworCisgICAgLyoqIOmqjOivgeeggeexu+WeiyAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYXB0Y2hhVHlwZTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKKyAgICB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHRZZWFyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb3B5cmlnaHRZZWFyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvcHlyaWdodFllYXIoU3RyaW5nIGNvcHlyaWdodFllYXIpCisgICAgeworICAgICAgICB0aGlzLmNvcHlyaWdodFllYXIgPSBjb3B5cmlnaHRZZWFyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2ZpbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZSkKKyAgICB7CisgICAgICAgIFJ1b1lpQ29uZmlnLnByb2ZpbGUgPSBwcm9maWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FkZHJlc3NFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZGRyZXNzRW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzRW5hYmxlZChib29sZWFuIGFkZHJlc3NFbmFibGVkKQorICAgIHsKKyAgICAgICAgUnVvWWlDb25maWcuYWRkcmVzc0VuYWJsZWQgPSBhZGRyZXNzRW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYXB0Y2hhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhcHRjaGFUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhcHRjaGFUeXBlKFN0cmluZyBjYXB0Y2hhVHlwZSkgeworICAgICAgICBSdW9ZaUNvbmZpZy5jYXB0Y2hhVHlwZSA9IGNhcHRjaGFUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWvvOWFpeS4iuS8oOi3r+W+hAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEltcG9ydFBhdGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2ZpbGUoKSArICIvaW1wb3J0IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blpLTlg4/kuIrkvKDot6/lvoQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdmF0YXJQYXRoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRQcm9maWxlKCkgKyAiL2F2YXRhciI7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5LiL6L296Lev5b6ECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RG93bmxvYWRQYXRoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRQcm9maWxlKCkgKyAiL2Rvd25sb2FkLyI7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5LiK5Lyg6Lev5b6ECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXBsb2FkUGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0UHJvZmlsZSgpICsgIi91cGxvYWQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uZmlnL3NlcmlhbGl6ZXIvU2Vuc2l0aXZlSnNvblNlcmlhbGl6ZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uZmlnL3NlcmlhbGl6ZXIvU2Vuc2l0aXZlSnNvblNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE5YTFkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25maWcvc2VyaWFsaXplci9TZW5zaXRpdmVKc29uU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb25maWcuc2VyaWFsaXplcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuSnNvbkdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuQmVhblByb3BlcnR5OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5Kc29uTWFwcGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvblNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6ZXJQcm92aWRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuc2VyLkNvbnRleHR1YWxTZXJpYWxpemVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5TZW5zaXRpdmU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5EZXNlbnNpdGl6ZWRUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKKworLyoqCisgKiDmlbDmja7ohLHmlY/luo/liJfljJbov4fmu6QKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTZW5zaXRpdmVKc29uU2VyaWFsaXplciBleHRlbmRzIEpzb25TZXJpYWxpemVyPFN0cmluZz4gaW1wbGVtZW50cyBDb250ZXh0dWFsU2VyaWFsaXplcgoreworICAgIHByaXZhdGUgRGVzZW5zaXRpemVkVHlwZSBkZXNlbnNpdGl6ZWRUeXBlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFN0cmluZyB2YWx1ZSwgSnNvbkdlbmVyYXRvciBnZW4sIFNlcmlhbGl6ZXJQcm92aWRlciBzZXJpYWxpemVycykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZGVzZW5zaXRpemF0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbi53cml0ZVN0cmluZyhkZXNlbnNpdGl6ZWRUeXBlLmRlc2Vuc2l0aXplcigpLmFwcGx5KHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnZW4ud3JpdGVTdHJpbmcodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEpzb25TZXJpYWxpemVyPD8+IGNyZWF0ZUNvbnRleHR1YWwoU2VyaWFsaXplclByb3ZpZGVyIHByb3YsIEJlYW5Qcm9wZXJ0eSBwcm9wZXJ0eSkKKyAgICAgICAgICAgIHRocm93cyBKc29uTWFwcGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2Vuc2l0aXZlIGFubm90YXRpb24gPSBwcm9wZXJ0eS5nZXRBbm5vdGF0aW9uKFNlbnNpdGl2ZS5jbGFzcyk7CisgICAgICAgIGlmIChPYmplY3RzLm5vbk51bGwoYW5ub3RhdGlvbikgJiYgT2JqZWN0cy5lcXVhbHMoU3RyaW5nLmNsYXNzLCBwcm9wZXJ0eS5nZXRUeXBlKCkuZ2V0UmF3Q2xhc3MoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGVzZW5zaXRpemVkVHlwZSA9IGFubm90YXRpb24uZGVzZW5zaXRpemVkVHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3YuZmluZFZhbHVlU2VyaWFsaXplcihwcm9wZXJ0eS5nZXRUeXBlKCksIHByb3BlcnR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbpnIDopoHohLHmlY/lpITnkIYKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVzZW5zaXRpemF0aW9uKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBMb2dpblVzZXIgc2VjdXJpdHlVc2VyID0gU2VjdXJpdHlVdGlscy5nZXRMb2dpblVzZXIoKTsKKyAgICAgICAgICAgIC8vIOeuoeeQhuWRmOS4jeiEseaVjworICAgICAgICAgICAgcmV0dXJuICFzZWN1cml0eVVzZXIuZ2V0VXNlcigpLmlzQWRtaW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9DYWNoZUNvbnN0YW50cy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9DYWNoZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODAzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L0NhY2hlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50OworCisvKioKKyAqIOe8k+WtmOeahGtleSDluLjph48KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVDb25zdGFudHMKK3sKKyAgICAvKioKKyAgICAgKiDnmbvlvZXnlKjmiLcgcmVkaXMga2V5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fVE9LRU5fS0VZID0gImxvZ2luX3Rva2VuczoiOworCisgICAgLyoqCisgICAgICog6aqM6K+B56CBIHJlZGlzIGtleQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUFRDSEFfQ09ERV9LRVkgPSAiY2FwdGNoYV9jb2RlczoiOworCisgICAgLyoqCisgICAgICog5Y+C5pWw566h55CGIGNhY2hlIGtleQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU19DT05GSUdfS0VZID0gInN5c19jb25maWc6IjsKKworICAgIC8qKgorICAgICAqIOWtl+WFuOeuoeeQhiBjYWNoZSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNfRElDVF9LRVkgPSAic3lzX2RpY3Q6IjsKKworICAgIC8qKgorICAgICAqIOmYsumHjeaPkOS6pCByZWRpcyBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBFQVRfU1VCTUlUX0tFWSA9ICJyZXBlYXRfc3VibWl0OiI7CisKKyAgICAvKioKKyAgICAgKiDpmZDmtYEgcmVkaXMga2V5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFURV9MSU1JVF9LRVkgPSAicmF0ZV9saW1pdDoiOworCisgICAgLyoqCisgICAgICog55m75b2V6LSm5oi35a+G56CB6ZSZ6K+v5qyh5pWwIHJlZGlzIGtleQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBXRF9FUlJfQ05UX0tFWSA9ICJwd2RfZXJyX2NudDoiOworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9Db25zdGFudHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uc3RhbnQvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzODRjNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uc3RhbnQvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgaW8uanNvbndlYnRva2VuLkNsYWltczsKKworLyoqCisgKiDpgJrnlKjluLjph4/kv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzCit7CisgICAgLyoqCisgICAgICogVVRGLTgg5a2X56ym6ZuGCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGOCA9ICJVVEYtOCI7CisKKyAgICAvKioKKyAgICAgKiBHQksg5a2X56ym6ZuGCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0JLID0gIkdCSyI7CisKKyAgICAvKioKKyAgICAgKiDns7vnu5/or63oqIAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBERUZBVUxUX0xPQ0FMRSA9IExvY2FsZS5TSU1QTElGSUVEX0NISU5FU0U7CisKKyAgICAvKioKKyAgICAgKiB3d3fkuLvln58KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXV1cgPSAid3d3LiI7CisKKyAgICAvKioKKyAgICAgKiBodHRw6K+35rGCCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUCA9ICJodHRwOi8vIjsKKworICAgIC8qKgorICAgICAqIGh0dHBz6K+35rGCCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFMgPSAiaHR0cHM6Ly8iOworCisgICAgLyoqCisgICAgICog6YCa55So5oiQ5Yqf5qCH6K+GCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTUyA9ICIwIjsKKworICAgIC8qKgorICAgICAqIOmAmueUqOWksei0peagh+ivhgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUwgPSAiMSI7CisKKyAgICAvKioKKyAgICAgKiDnmbvlvZXmiJDlip8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9TVUNDRVNTID0gIlN1Y2Nlc3MiOworCisgICAgLyoqCisgICAgICog5rOo6ZSACisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HT1VUID0gIkxvZ291dCI7CisKKyAgICAvKioKKyAgICAgKiDms6jlhowKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RFUiA9ICJSZWdpc3RlciI7CisKKyAgICAvKioKKyAgICAgKiDnmbvlvZXlpLHotKUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9GQUlMID0gIkVycm9yIjsKKworICAgIC8qKgorICAgICAqIOaJgOacieadg+mZkOagh+ivhgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9QRVJNSVNTSU9OID0gIio6KjoqIjsKKworICAgIC8qKgorICAgICAqIOeuoeeQhuWRmOinkuiJsuadg+mZkOagh+ivhgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX0FETUlOID0gImFkbWluIjsKKworICAgIC8qKgorICAgICAqIOinkuiJsuadg+mZkOWIhumalOespgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVMSU1FVEVSID0gIiwiOworCisgICAgLyoqCisgICAgICog5p2D6ZmQ5qCH6K+G5YiG6ZqU56ymCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9ERUxJTUVURVIgPSAiLCI7CisKKyAgICAvKioKKyAgICAgKiDpqozor4HnoIHmnInmlYjmnJ/vvIjliIbpkp/vvIkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FQVENIQV9FWFBJUkFUSU9OID0gMjsKKworICAgIC8qKgorICAgICAqIOS7pOeJjAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOID0gInRva2VuIjsKKworICAgIC8qKgorICAgICAqIOS7pOeJjOWJjee8gAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX1BSRUZJWCA9ICJCZWFyZXIgIjsKKworICAgIC8qKgorICAgICAqIOS7pOeJjOWJjee8gAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX1VTRVJfS0VZID0gImxvZ2luX3VzZXJfa2V5IjsKKworICAgIC8qKgorICAgICAqIOeUqOaIt0lECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSldUX1VTRVJJRCA9ICJ1c2VyaWQiOworCisgICAgLyoqCisgICAgICog55So5oi35ZCN56ewCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSldUX1VTRVJOQU1FID0gQ2xhaW1zLlNVQkpFQ1Q7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLflpLTlg48KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKV1RfQVZBVEFSID0gImF2YXRhciI7CisKKyAgICAvKioKKyAgICAgKiDliJvlu7rml7bpl7QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKV1RfQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgIC8qKgorICAgICAqIOeUqOaIt+adg+mZkAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpXVF9BVVRIT1JJVElFUyA9ICJhdXRob3JpdGllcyI7CisKKyAgICAvKioKKyAgICAgKiDotYTmupDmmKDlsITot6/lvoQg5YmN57yACisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUFJFRklYID0gIi9wcm9maWxlIjsKKworICAgIC8qKgorICAgICAqIFJNSSDov5znqIvmlrnms5XosIPnlKgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfUk1JID0gInJtaToiOworCisgICAgLyoqCisgICAgICogTERBUCDov5znqIvmlrnms5XosIPnlKgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfTERBUCA9ICJsZGFwOiI7CisKKyAgICAvKioKKyAgICAgKiBMREFQUyDov5znqIvmlrnms5XosIPnlKgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfTERBUFMgPSAibGRhcHM6IjsKKworICAgIC8qKgorICAgICAqIOiHquWKqOivhuWIq2pzb27lr7nosaHnmb3lkI3ljZXphY3nva7vvIjku4XlhYHorrjop6PmnpDnmoTljIXlkI3vvIzojIPlm7TotorlsI/otorlronlhajvvIkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpTT05fV0hJVEVMSVNUX1NUUiA9IHsgIm9yZy5zcHJpbmdmcmFtZXdvcmsiLCAiY29tLnJ1b3lpIiB9OworCisgICAgLyoqCisgICAgICog5a6a5pe25Lu75Yqh55m95ZCN5Y2V6YWN572u77yI5LuF5YWB6K646K6/6Zeu55qE5YyF5ZCN77yM5aaC5YW25LuW6ZyA6KaB5Y+v5Lul6Ieq6KGM5re75Yqg77yJCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKT0JfV0hJVEVMSVNUX1NUUiA9IHsgImNvbS5ydW95aS5xdWFydHoudGFzayIgfTsKKworICAgIC8qKgorICAgICAqIOWumuaXtuS7u+WKoei/neinhOeahOWtl+espgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSk9CX0VSUk9SX1NUUiA9IHsgImphdmEubmV0LlVSTCIsICJqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQiLCAib3JnLnlhbWwuc25ha2V5YW1sIiwKKyAgICAgICAgICAgICJvcmcuc3ByaW5nZnJhbWV3b3JrIiwgIm9yZy5hcGFjaGUiLCAiY29tLnJ1b3lpLmNvbW1vbi51dGlscy5maWxlIiwgImNvbS5ydW95aS5jb21tb24uY29uZmlnIiwgImNvbS5ydW95aS5nZW5lcmF0b3IiIH07Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L0dlbkNvbnN0YW50cy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9HZW5Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg5OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9HZW5Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDExNyBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50OworCisvKioKKyAqIOS7o+eggeeUn+aIkOmAmueUqOW4uOmHjworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5Db25zdGFudHMKK3sKKyAgICAvKiog5Y2V6KGo77yI5aKe5Yig5pS55p+l77yJICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFBMX0NSVUQgPSAiY3J1ZCI7CisKKyAgICAvKiog5qCR6KGo77yI5aKe5Yig5pS55p+l77yJICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFBMX1RSRUUgPSAidHJlZSI7CisKKyAgICAvKiog5Li75a2Q6KGo77yI5aKe5Yig5pS55p+l77yJICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFBMX1NVQiA9ICJzdWIiOworCisgICAgLyoqIOagkee8lueggeWtl+autSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfQ09ERSA9ICJ0cmVlQ29kZSI7CisKKyAgICAvKiog5qCR54i257yW56CB5a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRV9QQVJFTlRfQ09ERSA9ICJ0cmVlUGFyZW50Q29kZSI7CisKKyAgICAvKiog5qCR5ZCN56ew5a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRV9OQU1FID0gInRyZWVOYW1lIjsKKworICAgIC8qKiDkuIrnuqfoj5zljZVJROWtl+autSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9NRU5VX0lEID0gInBhcmVudE1lbnVJZCI7CisKKyAgICAvKiog5LiK57qn6I+c5Y2V5ZCN56ew5a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX01FTlVfTkFNRSA9ICJwYXJlbnRNZW51TmFtZSI7CisKKyAgICAvKiog5pWw5o2u5bqT5a2X56ym5Liy57G75Z6LICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5UWVBFX1NUUiA9IHsgImNoYXIiLCAidmFyY2hhciIsICJudmFyY2hhciIsICJ2YXJjaGFyMiIgfTsKKworICAgIC8qKiDmlbDmja7lupPmlofmnKznsbvlnosgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTlRZUEVfVEVYVCA9IHsgInRpbnl0ZXh0IiwgInRleHQiLCAibWVkaXVtdGV4dCIsICJsb25ndGV4dCIgfTsKKworICAgIC8qKiDmlbDmja7lupPml7bpl7TnsbvlnosgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTlRZUEVfVElNRSA9IHsgImRhdGV0aW1lIiwgInRpbWUiLCAiZGF0ZSIsICJ0aW1lc3RhbXAiIH07CisKKyAgICAvKiog5pWw5o2u5bqT5pWw5a2X57G75Z6LICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5UWVBFX05VTUJFUiA9IHsgInRpbnlpbnQiLCAic21hbGxpbnQiLCAibWVkaXVtaW50IiwgImludCIsICJudW1iZXIiLCAiaW50ZWdlciIsCisgICAgICAgICAgICAiYml0IiwgImJpZ2ludCIsICJmbG9hdCIsICJkb3VibGUiLCAiZGVjaW1hbCIgfTsKKworICAgIC8qKiDpobXpnaLkuI3pnIDopoHnvJbovpHlrZfmrrUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTk5BTUVfTk9UX0VESVQgPSB7ICJpZCIsICJjcmVhdGVfYnkiLCAiY3JlYXRlX3RpbWUiLCAiZGVsX2ZsYWciIH07CisKKyAgICAvKiog6aG16Z2i5LiN6ZyA6KaB5pi+56S655qE5YiX6KGo5a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5OQU1FX05PVF9MSVNUID0geyAiaWQiLCAiY3JlYXRlX2J5IiwgImNyZWF0ZV90aW1lIiwgImRlbF9mbGFnIiwgInVwZGF0ZV9ieSIsCisgICAgICAgICAgICAidXBkYXRlX3RpbWUiIH07CisKKyAgICAvKiog6aG16Z2i5LiN6ZyA6KaB5p+l6K+i5a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5OQU1FX05PVF9RVUVSWSA9IHsgImlkIiwgImNyZWF0ZV9ieSIsICJjcmVhdGVfdGltZSIsICJkZWxfZmxhZyIsICJ1cGRhdGVfYnkiLAorICAgICAgICAgICAgInVwZGF0ZV90aW1lIiwgInJlbWFyayIgfTsKKworICAgIC8qKiBFbnRpdHnln7rnsbvlrZfmrrUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJBU0VfRU5USVRZID0geyAiY3JlYXRlQnkiLCAiY3JlYXRlVGltZSIsICJ1cGRhdGVCeSIsICJ1cGRhdGVUaW1lIiwgInJlbWFyayIgfTsKKworICAgIC8qKiBUcmVl5Z+657G75a2X5q61ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUUkVFX0VOVElUWSA9IHsgInBhcmVudE5hbWUiLCAicGFyZW50SWQiLCAib3JkZXJOdW0iLCAiYW5jZXN0b3JzIiwgImNoaWxkcmVuIiB9OworCisgICAgLyoqIOaWh+acrOahhiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfSU5QVVQgPSAiaW5wdXQiOworCisgICAgLyoqIOaWh+acrOWfnyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVEVYVEFSRUEgPSAidGV4dGFyZWEiOworCisgICAgLyoqIOS4i+aLieahhiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU0VMRUNUID0gInNlbGVjdCI7CisKKyAgICAvKiog5Y2V6YCJ5qGGICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9SQURJTyA9ICJyYWRpbyI7CisKKyAgICAvKiog5aSN6YCJ5qGGICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9DSEVDS0JPWCA9ICJjaGVja2JveCI7CisKKyAgICAvKiog5pel5pyf5o6n5Lu2ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9EQVRFVElNRSA9ICJkYXRldGltZSI7CisKKyAgICAvKiog5Zu+54mH5LiK5Lyg5o6n5Lu2ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9JTUFHRV9VUExPQUQgPSAiaW1hZ2VVcGxvYWQiOworCisgICAgLyoqIOaWh+S7tuS4iuS8oOaOp+S7tiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfRklMRV9VUExPQUQgPSAiZmlsZVVwbG9hZCI7CisKKyAgICAvKiog5a+M5paH5pys5o6n5Lu2ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FRElUT1IgPSAiZWRpdG9yIjsKKworICAgIC8qKiDlrZfnrKbkuLLnsbvlnosgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUUklORyA9ICJTdHJpbmciOworCisgICAgLyoqIOaVtOWeiyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5URUdFUiA9ICJJbnRlZ2VyIjsKKworICAgIC8qKiDplb/mlbTlnosgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0xPTkcgPSAiTG9uZyI7CisKKyAgICAvKiog5rWu54K55Z6LICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ET1VCTEUgPSAiRG91YmxlIjsKKworICAgIC8qKiDpq5jnsr7luqborqHnrpfnsbvlnosgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0JJR0RFQ0lNQUwgPSAiQmlnRGVjaW1hbCI7CisKKyAgICAvKiog5pe26Ze057G75Z6LICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9EQVRFID0gIkRhdGUiOworCisgICAgLyoqIOaooeeziuafpeivoiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0xJS0UgPSAiTElLRSI7CisKKyAgICAvKiog55u4562J5p+l6K+iICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfRVEgPSAiRVEiOworCisgICAgLyoqIOmcgOimgSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkUgPSAiMSI7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L0h0dHBTdGF0dXMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uc3RhbnQvSHR0cFN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODNjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L0h0dHBTdGF0dXMuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQ7CisKKy8qKgorICog6L+U5Zue54q25oCB56CBCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEh0dHBTdGF0dXMKK3sKKyAgICAvKioKKyAgICAgKiDmk43kvZzmiJDlip8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTID0gMjAwOworCisgICAgLyoqCisgICAgICog5a+56LGh5Yib5bu65oiQ5YqfCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFRCA9IDIwMTsKKworICAgIC8qKgorICAgICAqIOivt+axguW3sue7j+iiq+aOpeWPlworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VQVEVEID0gMjAyOworCisgICAgLyoqCisgICAgICog5pON5L2c5bey57uP5omn6KGM5oiQ5Yqf77yM5L2G5piv5rKh5pyJ6L+U5Zue5pWw5o2uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09OVEVOVCA9IDIwNDsKKworICAgIC8qKgorICAgICAqIOi1hOa6kOW3suiiq+enu+mZpAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkVEX1BFUk0gPSAzMDE7CisKKyAgICAvKioKKyAgICAgKiDph43lrprlkJEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVfT1RIRVIgPSAzMDM7CisKKyAgICAvKioKKyAgICAgKiDotYTmupDmsqHmnInooqvkv67mlLkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfTU9ESUZJRUQgPSAzMDQ7CisKKyAgICAvKioKKyAgICAgKiDlj4LmlbDliJfooajplJnor6/vvIjnvLrlsJHvvIzmoLzlvI/kuI3ljLnphY3vvIkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfUkVRVUVTVCA9IDQwMDsKKworICAgIC8qKgorICAgICAqIOacquaOiOadgworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQVVUSE9SSVpFRCA9IDQwMTsKKworICAgIC8qKgorICAgICAqIOiuv+mXruWPl+mZkO+8jOaOiOadg+i/h+acnworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUkJJRERFTiA9IDQwMzsKKworICAgIC8qKgorICAgICAqIOi1hOa6kO+8jOacjeWKoeacquaJvuWIsAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9GT1VORCA9IDQwNDsKKworICAgIC8qKgorICAgICAqIOS4jeWFgeiuuOeahGh0dHDmlrnms5UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfTUVUSE9EID0gNDA1OworCisgICAgLyoqCisgICAgICog6LWE5rqQ5Yay56qB77yM5oiW6ICF6LWE5rqQ6KKr6ZSBCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORkxJQ1QgPSA0MDk7CisKKyAgICAvKioKKyAgICAgKiDkuI3mlK/mjIHnmoTmlbDmja7vvIzlqpLkvZPnsbvlnosKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9UWVBFID0gNDE1OworCisgICAgLyoqCisgICAgICog57O757uf5YaF6YOo6ZSZ6K+vCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSA1MDA7CisKKyAgICAvKioKKyAgICAgKiDmjqXlj6PmnKrlrp7njrAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfSU1QTEVNRU5URUQgPSA1MDE7CisKKyAgICAvKioKKyAgICAgKiDns7vnu5/orablkYrmtojmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOID0gNjAxOworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9TY2hlZHVsZUNvbnN0YW50cy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb25zdGFudC9TY2hlZHVsZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWQ4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L1NjaGVkdWxlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50OworCisvKioKKyAqIOS7u+WKoeiwg+W6pumAmueUqOW4uOmHjworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlZHVsZUNvbnN0YW50cworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfQ0xBU1NfTkFNRSA9ICJUQVNLX0NMQVNTX05BTUUiOworCisgICAgLyoqIOaJp+ihjOebruagh2tleSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfUFJPUEVSVElFUyA9ICJUQVNLX1BST1BFUlRJRVMiOworCisgICAgLyoqIOm7mOiupCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU0ZJUkVfREVGQVVMVCA9ICIwIjsKKworICAgIC8qKiDnq4vljbPop6blj5HmiafooYwgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNGSVJFX0lHTk9SRV9NSVNGSVJFUyA9ICIxIjsKKworICAgIC8qKiDop6blj5HkuIDmrKHmiafooYwgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNGSVJFX0ZJUkVfQU5EX1BST0NFRUQgPSAiMiI7CisKKyAgICAvKiog5LiN6Kem5Y+R56uL5Y2z5omn6KGMICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTRklSRV9ET19OT1RISU5HID0gIjMiOworCisgICAgcHVibGljIGVudW0gU3RhdHVzCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICog5q2j5bi4CisgICAgICAgICAqLworICAgICAgICBOT1JNQUwoIjAiKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIOaaguWBnAorICAgICAgICAgKi8KKyAgICAgICAgUEFVU0UoIjEiKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwcml2YXRlIFN0YXR1cyhTdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L1VzZXJDb25zdGFudHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29uc3RhbnQvVXNlckNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzdmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvbnN0YW50L1VzZXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQ7CisKKy8qKgorICog55So5oi35bi46YeP5L+h5oGvCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFVzZXJDb25zdGFudHMKK3sKKyAgICAvKioKKyAgICAgKiDlubPlj7DlhoXns7vnu5/nlKjmiLfnmoTllK/kuIDmoIflv5cKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNfVVNFUiA9ICJTWVNfVVNFUiI7CisKKyAgICAvKiog5q2j5bi454q25oCBICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIjAiOworCisgICAgLyoqIOW8guW4uOeKtuaAgSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTiA9ICIxIjsKKworICAgIC8qKiDnlKjmiLflsIHnpoHnirbmgIEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RJU0FCTEUgPSAiMSI7CisKKyAgICAvKiog6KeS6Imy5q2j5bi454q25oCBICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OT1JNQUwgPSAiMCI7CisKKyAgICAvKiog6KeS6Imy5bCB56aB54q25oCBICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ESVNBQkxFID0gIjEiOworCisgICAgLyoqIOmDqOmXqOato+W4uOeKtuaAgSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFRfTk9STUFMID0gIjAiOworCisgICAgLyoqIOmDqOmXqOWBnOeUqOeKtuaAgSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFRfRElTQUJMRSA9ICIxIjsKKworICAgIC8qKiDlrZflhbjmraPluLjnirbmgIEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUNUX05PUk1BTCA9ICIwIjsKKworICAgIC8qKiDmmK/lkKbkuLrns7vnu5/pu5jorqTvvIjmmK/vvIkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVMgPSAiWSI7CisKKyAgICAvKiog5piv5ZCm6I+c5Y2V5aSW6ZO+77yI5piv77yJICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX0ZSQU1FID0gIjAiOworCisgICAgLyoqIOaYr+WQpuiPnOWNleWklumTvu+8iOWQpu+8iSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0ZSQU1FID0gIjEiOworCisgICAgLyoqIOiPnOWNleexu+Wei++8iOebruW9le+8iSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRElSID0gIk0iOworCisgICAgLyoqIOiPnOWNleexu+Wei++8iOiPnOWNle+8iSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVOVSA9ICJDIjsKKworICAgIC8qKiDoj5zljZXnsbvlnovvvIjmjInpkq7vvIkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0JVVFRPTiA9ICJGIjsKKworICAgIC8qKiBMYXlvdXTnu4Tku7bmoIfor4YgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMQVlPVVQgPSAiTGF5b3V0IjsKKyAgICAKKyAgICAvKiogUGFyZW50Vmlld+e7hOS7tuagh+ivhiAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9WSUVXID0gIlBhcmVudFZpZXciOworCisgICAgLyoqIElubmVyTGlua+e7hOS7tuagh+ivhiAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOTkVSX0xJTksgPSAiSW5uZXJMaW5rIjsKKworICAgIC8qKiDmoKHpqozmmK/lkKbllK/kuIDnmoTov5Tlm57moIfor4YgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gVU5JUVVFID0gdHJ1ZTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gTk9UX1VOSVFVRSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICog55So5oi35ZCN6ZW/5bqm6ZmQ5Yi2CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUk5BTUVfTUlOX0xFTkdUSCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUk5BTUVfTUFYX0xFTkdUSCA9IDIwOworCisgICAgLyoqCisgICAgICog5a+G56CB6ZW/5bqm6ZmQ5Yi2CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfTUlOX0xFTkdUSCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfTUFYX0xFTkdUSCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2NvbnRyb2xsZXIvQmFzZUNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9jb250cm9sbGVyL0Jhc2VDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4NWUwNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9jb250cm9sbGVyL0Jhc2VDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwyMDIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yU3VwcG9ydDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuV2ViRGF0YUJpbmRlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uSW5pdEJpbmRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLnBhZ2VoZWxwZXIuUGFnZUhlbHBlcjsKK2ltcG9ydCBjb20uZ2l0aHViLnBhZ2VoZWxwZXIuUGFnZUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5IdHRwU3RhdHVzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZS5QYWdlRG9tYWluOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVTdXBwb3J0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuRGF0ZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuUGFnZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuc3FsLlNxbFV0aWw7CisKKy8qKgorICogd2Vi5bGC6YCa55So5pWw5o2u5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEJhc2VDb250cm9sbGVyCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmdldENsYXNzKCkpOworCisgICAgLyoqCisgICAgICog5bCG5YmN5Y+w5Lyg6YCS6L+H5p2l55qE5pel5pyf5qC85byP55qE5a2X56ym5Liy77yM6Ieq5Yqo6L2s5YyW5Li6RGF0Zeexu+WeiworICAgICAqLworICAgIEBJbml0QmluZGVyCisgICAgcHVibGljIHZvaWQgaW5pdEJpbmRlcihXZWJEYXRhQmluZGVyIGJpbmRlcikKKyAgICB7CisgICAgICAgIC8vIERhdGUg57G75Z6L6L2s5o2iCisgICAgICAgIGJpbmRlci5yZWdpc3RlckN1c3RvbUVkaXRvcihEYXRlLmNsYXNzLCBuZXcgUHJvcGVydHlFZGl0b3JTdXBwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBc1RleHQoU3RyaW5nIHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0VmFsdWUoRGF0ZVV0aWxzLnBhcnNlRGF0ZSh0ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiuvue9ruivt+axguWIhumhteaVsOaNrgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0UGFnZSgpCisgICAgeworICAgICAgICBQYWdlVXRpbHMuc3RhcnRQYWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u6K+35rGC5o6S5bqP5pWw5o2uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRPcmRlckJ5KCkKKyAgICB7CisgICAgICAgIFBhZ2VEb21haW4gcGFnZURvbWFpbiA9IFRhYmxlU3VwcG9ydC5idWlsZFBhZ2VSZXF1ZXN0KCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBhZ2VEb21haW4uZ2V0T3JkZXJCeSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG9yZGVyQnkgPSBTcWxVdGlsLmVzY2FwZU9yZGVyQnlTcWwocGFnZURvbWFpbi5nZXRPcmRlckJ5KCkpOworICAgICAgICAgICAgUGFnZUhlbHBlci5vcmRlckJ5KG9yZGVyQnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5riF55CG5YiG6aG155qE57q/56iL5Y+Y6YePCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJQYWdlKCkKKyAgICB7CisgICAgICAgIFBhZ2VVdGlscy5jbGVhclBhZ2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlk43lupTor7fmsYLliIbpobXmlbDmja4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgcHJvdGVjdGVkIFRhYmxlRGF0YUluZm8gZ2V0RGF0YVRhYmxlKExpc3Q8Pz4gbGlzdCkKKyAgICB7CisgICAgICAgIFRhYmxlRGF0YUluZm8gcnNwRGF0YSA9IG5ldyBUYWJsZURhdGFJbmZvKCk7CisgICAgICAgIHJzcERhdGEuc2V0Q29kZShIdHRwU3RhdHVzLlNVQ0NFU1MpOworICAgICAgICByc3BEYXRhLnNldE1zZygi5p+l6K+i5oiQ5YqfIik7CisgICAgICAgIHJzcERhdGEuc2V0Um93cyhsaXN0KTsKKyAgICAgICAgcnNwRGF0YS5zZXRUb3RhbChuZXcgUGFnZUluZm8obGlzdCkuZ2V0VG90YWwoKSk7CisgICAgICAgIHJldHVybiByc3BEYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuaIkOWKnworICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0IHN1Y2Nlc3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuc3VjY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuWksei0pea2iOaBrworICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVycm9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L+U5Zue5oiQ5Yqf5raI5oGvCisgICAgICovCisgICAgcHVibGljIEFqYXhSZXN1bHQgc3VjY2VzcyhTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MobWVzc2FnZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIOi/lOWbnuaIkOWKn+a2iOaBrworICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0IHN1Y2Nlc3MoT2JqZWN0IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuWksei0pea2iOaBrworICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVycm9yKFN0cmluZyBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuZXJyb3IobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L+U5Zue6K2m5ZGK5raI5oGvCisgICAgICovCisgICAgcHVibGljIEFqYXhSZXN1bHQgd2FybihTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0Lndhcm4obWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5ZON5bqU6L+U5Zue57uT5p6cCisgICAgICogCisgICAgICogQHBhcmFtIHJvd3Mg5b2x5ZON6KGM5pWwCisgICAgICogQHJldHVybiDmk43kvZznu5PmnpwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWpheFJlc3VsdCB0b0FqYXgoaW50IHJvd3MpCisgICAgeworICAgICAgICByZXR1cm4gcm93cyA+IDAgPyBBamF4UmVzdWx0LnN1Y2Nlc3MoKSA6IEFqYXhSZXN1bHQuZXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlk43lupTov5Tlm57nu5PmnpwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzdWx0IOe7k+aenAorICAgICAqIEByZXR1cm4g5pON5L2c57uT5p6cCisgICAgICovCisgICAgcHJvdGVjdGVkIEFqYXhSZXN1bHQgdG9BamF4KGJvb2xlYW4gcmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IHN1Y2Nlc3MoKSA6IGVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6aG16Z2i6Lez6L2sCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZWRpcmVjdChTdHJpbmcgdXJsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmZvcm1hdCgicmVkaXJlY3Q6e30iLCB1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlueUqOaIt+e8k+WtmOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMb2dpblVzZXIgZ2V0TG9naW5Vc2VyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTZWN1cml0eVV0aWxzLmdldExvZ2luVXNlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlueZu+W9leeUqOaIt2lkCisgICAgICovCisgICAgcHVibGljIExvbmcgZ2V0VXNlcklkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRMb2dpblVzZXIoKS5nZXRVc2VySWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnmbvlvZXpg6jpl6hpZAorICAgICAqLworICAgIHB1YmxpYyBMb25nIGdldERlcHRJZCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0TG9naW5Vc2VyKCkuZ2V0RGVwdElkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W55m75b2V55So5oi35ZCNCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0TG9naW5Vc2VyKCkuZ2V0VXNlcm5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL0FqYXhSZXN1bHQuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vQWpheFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL0FqYXhSZXN1bHQuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5IdHRwU3RhdHVzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog5pON5L2c5raI5oGv5o+Q6YaSCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEFqYXhSZXN1bHQgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOeKtuaAgeeggSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfVEFHID0gImNvZGUiOworCisgICAgLyoqIOi/lOWbnuWGheWuuSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19UQUcgPSAibXNnIjsKKworICAgIC8qKiDmlbDmja7lr7nosaEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RBRyA9ICJkYXRhIjsKKworICAgIC8qKgorICAgICAqIOWIneWni+WMluS4gOS4quaWsOWIm+W7uueahCBBamF4UmVzdWx0IOWvueixoe+8jOS9v+WFtuihqOekuuS4gOS4quepuua2iOaBr+OAggorICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0KCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yid5aeL5YyW5LiA5Liq5paw5Yib5bu655qEIEFqYXhSZXN1bHQg5a+56LGhCisgICAgICogCisgICAgICogQHBhcmFtIGNvZGUg54q25oCB56CBCisgICAgICogQHBhcmFtIG1zZyDov5Tlm57lhoXlrrkKKyAgICAgKi8KKyAgICBwdWJsaWMgQWpheFJlc3VsdChpbnQgY29kZSwgU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHN1cGVyLnB1dChDT0RFX1RBRywgY29kZSk7CisgICAgICAgIHN1cGVyLnB1dChNU0dfVEFHLCBtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIneWni+WMluS4gOS4quaWsOWIm+W7uueahCBBamF4UmVzdWx0IOWvueixoQorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2RlIOeKtuaAgeeggQorICAgICAqIEBwYXJhbSBtc2cg6L+U5Zue5YaF5a65CisgICAgICogQHBhcmFtIGRhdGEg5pWw5o2u5a+56LGhCisgICAgICovCisgICAgcHVibGljIEFqYXhSZXN1bHQoaW50IGNvZGUsIFN0cmluZyBtc2csIE9iamVjdCBkYXRhKQorICAgIHsKKyAgICAgICAgc3VwZXIucHV0KENPREVfVEFHLCBjb2RlKTsKKyAgICAgICAgc3VwZXIucHV0KE1TR19UQUcsIG1zZyk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwoZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLnB1dChEQVRBX1RBRywgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57miJDlip/mtojmga8KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOaIkOWKn+a2iOaBrworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWpheFJlc3VsdCBzdWNjZXNzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MoIuaTjeS9nOaIkOWKnyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuaIkOWKn+aVsOaNrgorICAgICAqIAorICAgICAqIEByZXR1cm4g5oiQ5Yqf5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IHN1Y2Nlc3MoT2JqZWN0IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKCLmk43kvZzmiJDlip8iLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57miJDlip/mtojmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIOi/lOWbnuWGheWuuQorICAgICAqIEByZXR1cm4g5oiQ5Yqf5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IHN1Y2Nlc3MoU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MobXNnLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57miJDlip/mtojmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIOi/lOWbnuWGheWuuQorICAgICAqIEBwYXJhbSBkYXRhIOaVsOaNruWvueixoQorICAgICAqIEByZXR1cm4g5oiQ5Yqf5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IHN1Y2Nlc3MoU3RyaW5nIG1zZywgT2JqZWN0IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFqYXhSZXN1bHQoSHR0cFN0YXR1cy5TVUNDRVNTLCBtc2csIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuitpuWRiua2iOaBrworICAgICAqCisgICAgICogQHBhcmFtIG1zZyDov5Tlm57lhoXlrrkKKyAgICAgKiBAcmV0dXJuIOitpuWRiua2iOaBrworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWpheFJlc3VsdCB3YXJuKFN0cmluZyBtc2cpCisgICAgeworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC53YXJuKG1zZywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L+U5Zue6K2m5ZGK5raI5oGvCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIOi/lOWbnuWGheWuuQorICAgICAqIEBwYXJhbSBkYXRhIOaVsOaNruWvueixoQorICAgICAqIEByZXR1cm4g6K2m5ZGK5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IHdhcm4oU3RyaW5nIG1zZywgT2JqZWN0IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFqYXhSZXN1bHQoSHR0cFN0YXR1cy5XQVJOLCBtc2csIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnumUmeivr+a2iOaBrworICAgICAqIAorICAgICAqIEByZXR1cm4g6ZSZ6K+v5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IGVycm9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKCLmk43kvZzlpLHotKUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57plJnor6/mtojmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIOi/lOWbnuWGheWuuQorICAgICAqIEByZXR1cm4g6ZSZ6K+v5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IGVycm9yKFN0cmluZyBtc2cpCisgICAgeworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5lcnJvcihtc2csIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnumUmeivr+a2iOaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cg6L+U5Zue5YaF5a65CisgICAgICogQHBhcmFtIGRhdGEg5pWw5o2u5a+56LGhCisgICAgICogQHJldHVybiDplJnor6/mtojmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFqYXhSZXN1bHQgZXJyb3IoU3RyaW5nIG1zZywgT2JqZWN0IGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFqYXhSZXN1bHQoSHR0cFN0YXR1cy5FUlJPUiwgbXNnLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57plJnor6/mtojmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29kZSDnirbmgIHnoIEKKyAgICAgKiBAcGFyYW0gbXNnIOi/lOWbnuWGheWuuQorICAgICAqIEByZXR1cm4g6ZSZ6K+v5raI5oGvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBamF4UmVzdWx0IGVycm9yKGludCBjb2RlLCBTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBamF4UmVzdWx0KGNvZGUsIG1zZywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5Li65oiQ5Yqf5raI5oGvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3VjY2VzcygpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoSHR0cFN0YXR1cy5TVUNDRVNTLCB0aGlzLmdldChDT0RFX1RBRykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaYr+WQpuS4uuitpuWRiua2iOaBrworICAgICAqCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dhcm4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKEh0dHBTdGF0dXMuV0FSTiwgdGhpcy5nZXQoQ09ERV9UQUcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbkuLrplJnor6/mtojmga8KKyAgICAgKgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvcigpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoSHR0cFN0YXR1cy5FUlJPUiwgdGhpcy5nZXQoQ09ERV9UQUcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrnkvr/pk77lvI/osIPnlKgKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkg6ZSuCisgICAgICogQHBhcmFtIHZhbHVlIOWAvAorICAgICAqIEByZXR1cm4g5pWw5o2u5a+56LGhCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFqYXhSZXN1bHQgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9CYXNlRW50aXR5LmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL0Jhc2VFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJmNjZiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9CYXNlRW50aXR5LmphdmEKQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkZvcm1hdDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JbmNsdWRlOworCisvKioKKyAqIEVudGl0eeWfuuexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlRW50aXR5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKiog5pCc57Si5YC8ICovCisgICAgQEpzb25JZ25vcmUKKyAgICBwcml2YXRlIFN0cmluZyBzZWFyY2hWYWx1ZTsKKworICAgIC8qKiDliJvlu7rogIUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVCeTsKKworICAgIC8qKiDliJvlu7rml7bpl7QgKi8KKyAgICBASnNvbkZvcm1hdChwYXR0ZXJuID0gInl5eXktTU0tZGQgSEg6bW06c3MiKQorICAgIHByaXZhdGUgRGF0ZSBjcmVhdGVUaW1lOworCisgICAgLyoqIOabtOaWsOiAhSAqLworICAgIHByaXZhdGUgU3RyaW5nIHVwZGF0ZUJ5OworCisgICAgLyoqIOabtOaWsOaXtumXtCAqLworICAgIEBKc29uRm9ybWF0KHBhdHRlcm4gPSAieXl5eS1NTS1kZCBISDptbTpzcyIpCisgICAgcHJpdmF0ZSBEYXRlIHVwZGF0ZVRpbWU7CisKKyAgICAvKiog5aSH5rOoICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtYXJrOworCisgICAgLyoqIOivt+axguWPguaVsCAqLworICAgIEBKc29uSW5jbHVkZShKc29uSW5jbHVkZS5JbmNsdWRlLk5PTl9FTVBUWSkKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zOworCisgICAgcHVibGljIFN0cmluZyBnZXRTZWFyY2hWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2VhcmNoVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoVmFsdWUoU3RyaW5nIHNlYXJjaFZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUJ5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZUJ5KFN0cmluZyBjcmVhdGVCeSkKKyAgICB7CisgICAgICAgIHRoaXMuY3JlYXRlQnkgPSBjcmVhdGVCeTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRDcmVhdGVUaW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjcmVhdGVUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZVRpbWUoRGF0ZSBjcmVhdGVUaW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5jcmVhdGVUaW1lID0gY3JlYXRlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZUJ5KCkKKyAgICB7CisgICAgICAgIHJldHVybiB1cGRhdGVCeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVCeShTdHJpbmcgdXBkYXRlQnkpCisgICAgeworICAgICAgICB0aGlzLnVwZGF0ZUJ5ID0gdXBkYXRlQnk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0VXBkYXRlVGltZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXBkYXRlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVUaW1lKERhdGUgdXBkYXRlVGltZSkKKyAgICB7CisgICAgICAgIHRoaXMudXBkYXRlVGltZSA9IHVwZGF0ZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1hcmsoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlbWFyazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1hcmsoU3RyaW5nIHJlbWFyaykKKyAgICB7CisgICAgICAgIHRoaXMucmVtYXJrID0gcmVtYXJrOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFBhcmFtcygpCisgICAgeworICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykKKyAgICB7CisgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vUi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9SLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNTgwMgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vUi5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW47CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50Lkh0dHBTdGF0dXM7CisKKy8qKgorICog5ZON5bqU5L+h5oGv5Li75L2TCisgKgorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgUjxUPiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOaIkOWKnyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgPSBIdHRwU3RhdHVzLlNVQ0NFU1M7CisKKyAgICAvKiog5aSx6LSlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFJTCA9IEh0dHBTdGF0dXMuRVJST1I7CisKKyAgICBwcml2YXRlIGludCBjb2RlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbXNnOworCisgICAgcHJpdmF0ZSBUIGRhdGE7CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IG9rKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KG51bGwsIFNVQ0NFU1MsICLmk43kvZzmiJDlip8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IG9rKFQgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KGRhdGEsIFNVQ0NFU1MsICLmk43kvZzmiJDlip8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IG9rKFQgZGF0YSwgU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KGRhdGEsIFNVQ0NFU1MsIG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gUjxUPiBmYWlsKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KG51bGwsIEZBSUwsICLmk43kvZzlpLHotKUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IGZhaWwoU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KG51bGwsIEZBSUwsIG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gUjxUPiBmYWlsKFQgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXN0UmVzdWx0KGRhdGEsIEZBSUwsICLmk43kvZzlpLHotKUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IGZhaWwoVCBkYXRhLCBTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3RSZXN1bHQoZGF0YSwgRkFJTCwgbXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSPFQ+IGZhaWwoaW50IGNvZGUsIFN0cmluZyBtc2cpCisgICAgeworICAgICAgICByZXR1cm4gcmVzdFJlc3VsdChudWxsLCBjb2RlLCBtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBSPFQ+IHJlc3RSZXN1bHQoVCBkYXRhLCBpbnQgY29kZSwgU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIFI8VD4gYXBpUmVzdWx0ID0gbmV3IFI8PigpOworICAgICAgICBhcGlSZXN1bHQuc2V0Q29kZShjb2RlKTsKKyAgICAgICAgYXBpUmVzdWx0LnNldERhdGEoZGF0YSk7CisgICAgICAgIGFwaVJlc3VsdC5zZXRNc2cobXNnKTsKKyAgICAgICAgcmV0dXJuIGFwaVJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29kZShpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNc2coKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNc2coU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgIH0KKworICAgIHB1YmxpYyBUIGdldERhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YShUIGRhdGEpCisgICAgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEJvb2xlYW4gaXNFcnJvcihSPFQ+IHJldCkKKyAgICB7CisgICAgICAgIHJldHVybiAhaXNTdWNjZXNzKHJldCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gQm9vbGVhbiBpc1N1Y2Nlc3MoUjxUPiByZXQpCisgICAgeworICAgICAgICByZXR1cm4gUi5TVUNDRVNTID09IHJldC5nZXRDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9UcmVlRW50aXR5LmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL1RyZWVFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTgwYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9UcmVlRW50aXR5LmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUcmVl5Z+657G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFRyZWVFbnRpdHkgZXh0ZW5kcyBCYXNlRW50aXR5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKiog54i26I+c5Y2V5ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKKworICAgIC8qKiDniLboj5zljZVJRCAqLworICAgIHByaXZhdGUgTG9uZyBwYXJlbnRJZDsKKworICAgIC8qKiDmmL7npLrpobrluo8gKi8KKyAgICBwcml2YXRlIEludGVnZXIgb3JkZXJOdW07CisKKyAgICAvKiog56WW57qn5YiX6KGoICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYW5jZXN0b3JzOworCisgICAgLyoqIOWtkOmDqOmXqCAqLworICAgIHByaXZhdGUgTGlzdDw/PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJlbnROYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpCisgICAgeworICAgICAgICB0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldFBhcmVudElkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJlbnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRJZChMb25nIHBhcmVudElkKQorICAgIHsKKyAgICAgICAgdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9yZGVyTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcmRlck51bTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlck51bShJbnRlZ2VyIG9yZGVyTnVtKQorICAgIHsKKyAgICAgICAgdGhpcy5vcmRlck51bSA9IG9yZGVyTnVtOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5jZXN0b3JzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhbmNlc3RvcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QW5jZXN0b3JzKFN0cmluZyBhbmNlc3RvcnMpCisgICAgeworICAgICAgICB0aGlzLmFuY2VzdG9ycyA9IGFuY2VzdG9yczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDw/PiBnZXRDaGlsZHJlbigpCisgICAgeworICAgICAgICByZXR1cm4gY2hpbGRyZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oTGlzdDw/PiBjaGlsZHJlbikKKyAgICB7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL1RyZWVTZWxlY3QuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vVHJlZVNlbGVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODM1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL1RyZWVTZWxlY3QuamF2YQpAQCAtMCwwICsxLDc3IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW47CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkluY2x1ZGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGVwdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNNZW51OworCisvKioKKyAqIFRyZWVzZWxlY3TmoJHnu5PmnoTlrp7kvZPnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVHJlZVNlbGVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOiKgueCuUlEICovCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgLyoqIOiKgueCueWQjeensCAqLworICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOworCisgICAgLyoqIOWtkOiKgueCuSAqLworICAgIEBKc29uSW5jbHVkZShKc29uSW5jbHVkZS5JbmNsdWRlLk5PTl9FTVBUWSkKKyAgICBwcml2YXRlIExpc3Q8VHJlZVNlbGVjdD4gY2hpbGRyZW47CisKKyAgICBwdWJsaWMgVHJlZVNlbGVjdCgpCisgICAgeworCisgICAgfQorCisgICAgcHVibGljIFRyZWVTZWxlY3QoU3lzRGVwdCBkZXB0KQorICAgIHsKKyAgICAgICAgdGhpcy5pZCA9IGRlcHQuZ2V0RGVwdElkKCk7CisgICAgICAgIHRoaXMubGFiZWwgPSBkZXB0LmdldERlcHROYW1lKCk7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBkZXB0LmdldENoaWxkcmVuKCkuc3RyZWFtKCkubWFwKFRyZWVTZWxlY3Q6Om5ldykuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJlZVNlbGVjdChTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICB0aGlzLmlkID0gbWVudS5nZXRNZW51SWQoKTsKKyAgICAgICAgdGhpcy5sYWJlbCA9IG1lbnUuZ2V0TWVudU5hbWUoKTsKKyAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG1lbnUuZ2V0Q2hpbGRyZW4oKS5zdHJlYW0oKS5tYXAoVHJlZVNlbGVjdDo6bmV3KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldElkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChMb25nIGlkKQorICAgIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxhYmVsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkKKyAgICB7CisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUcmVlU2VsZWN0PiBnZXRDaGlsZHJlbigpCisgICAgeworICAgICAgICByZXR1cm4gY2hpbGRyZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oTGlzdDxUcmVlU2VsZWN0PiBjaGlsZHJlbikKKyAgICB7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNEZXB0LmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNEZXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyMzZkYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c0RlcHQuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkVtYWlsOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3RCbGFuazsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkJhc2VFbnRpdHk7CisKKy8qKgorICog6YOo6Zeo6KGoIHN5c19kZXB0CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN5c0RlcHQgZXh0ZW5kcyBCYXNlRW50aXR5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKiog6YOo6ZeoSUQgKi8KKyAgICBwcml2YXRlIExvbmcgZGVwdElkOworCisgICAgLyoqIOeItumDqOmXqElEICovCisgICAgcHJpdmF0ZSBMb25nIHBhcmVudElkOworCisgICAgLyoqIOellue6p+WIl+ihqCAqLworICAgIHByaXZhdGUgU3RyaW5nIGFuY2VzdG9yczsKKworICAgIC8qKiDpg6jpl6jlkI3np7AgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXB0TmFtZTsKKworICAgIC8qKiDmmL7npLrpobrluo8gKi8KKyAgICBwcml2YXRlIEludGVnZXIgb3JkZXJOdW07CisKKyAgICAvKiog6LSf6LSj5Lq6ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGVhZGVyOworCisgICAgLyoqIOiBlOezu+eUteivnSAqLworICAgIHByaXZhdGUgU3RyaW5nIHBob25lOworCisgICAgLyoqIOmCrueusSAqLworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgLyoqIOmDqOmXqOeKtuaAgTow5q2j5bi4LDHlgZznlKggKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgICAvKiog5Yig6Zmk5qCH5b+X77yIMOS7o+ihqOWtmOWcqCAy5Luj6KGo5Yig6Zmk77yJICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsRmxhZzsKKworICAgIC8qKiDniLbpg6jpl6jlkI3np7AgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnROYW1lOworICAgIAorICAgIC8qKiDlrZDpg6jpl6ggKi8KKyAgICBwcml2YXRlIExpc3Q8U3lzRGVwdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFN5c0RlcHQ+KCk7CisKKyAgICBwdWJsaWMgTG9uZyBnZXREZXB0SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlcHRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXB0SWQoTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICB0aGlzLmRlcHRJZCA9IGRlcHRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQYXJlbnRJZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyZW50SWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50SWQoTG9uZyBwYXJlbnRJZCkKKyAgICB7CisgICAgICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFuY2VzdG9ycygpCisgICAgeworICAgICAgICByZXR1cm4gYW5jZXN0b3JzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFuY2VzdG9ycyhTdHJpbmcgYW5jZXN0b3JzKQorICAgIHsKKyAgICAgICAgdGhpcy5hbmNlc3RvcnMgPSBhbmNlc3RvcnM7CisgICAgfQorCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi6YOo6Zeo5ZCN56ew5LiN6IO95Li656m6IikKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSAzMCwgbWVzc2FnZSA9ICLpg6jpl6jlkI3np7Dplb/luqbkuI3og73otoXov4czMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXREZXB0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwdE5hbWUoU3RyaW5nIGRlcHROYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXB0TmFtZSA9IGRlcHROYW1lOworICAgIH0KKworICAgIEBOb3ROdWxsKG1lc3NhZ2UgPSAi5pi+56S66aG65bqP5LiN6IO95Li656m6IikKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRPcmRlck51bSgpCisgICAgeworICAgICAgICByZXR1cm4gb3JkZXJOdW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJOdW0oSW50ZWdlciBvcmRlck51bSkKKyAgICB7CisgICAgICAgIHRoaXMub3JkZXJOdW0gPSBvcmRlck51bTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExlYWRlcigpCisgICAgeworICAgICAgICByZXR1cm4gbGVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExlYWRlcihTdHJpbmcgbGVhZGVyKQorICAgIHsKKyAgICAgICAgdGhpcy5sZWFkZXIgPSBsZWFkZXI7CisgICAgfQorCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTEsIG1lc3NhZ2UgPSAi6IGU57O755S16K+d6ZW/5bqm5LiN6IO96LaF6L+HMTHkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBob25lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBob25lKFN0cmluZyBwaG9uZSkKKyAgICB7CisgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKKyAgICB9CisKKyAgICBARW1haWwobWVzc2FnZSA9ICLpgq7nrrHmoLzlvI/kuI3mraPnoa4iKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDUwLCBtZXNzYWdlID0gIumCrueusemVv+W6puS4jeiDvei2hei/hzUw5Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpCisgICAgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVsRmxhZygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsRmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxGbGFnKFN0cmluZyBkZWxGbGFnKQorICAgIHsKKyAgICAgICAgdGhpcy5kZWxGbGFnID0gZGVsRmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3lzRGVwdD4gZ2V0Q2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKExpc3Q8U3lzRGVwdD4gY2hpbGRyZW4pCisgICAgeworICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJkZXB0SWQiLCBnZXREZXB0SWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInBhcmVudElkIiwgZ2V0UGFyZW50SWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImFuY2VzdG9ycyIsIGdldEFuY2VzdG9ycygpKQorICAgICAgICAgICAgLmFwcGVuZCgiZGVwdE5hbWUiLCBnZXREZXB0TmFtZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgib3JkZXJOdW0iLCBnZXRPcmRlck51bSgpKQorICAgICAgICAgICAgLmFwcGVuZCgibGVhZGVyIiwgZ2V0TGVhZGVyKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJwaG9uZSIsIGdldFBob25lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJlbWFpbCIsIGdldEVtYWlsKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJzdGF0dXMiLCBnZXRTdGF0dXMoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRlbEZsYWciLCBnZXREZWxGbGFnKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjcmVhdGVCeSIsIGdldENyZWF0ZUJ5KCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjcmVhdGVUaW1lIiwgZ2V0Q3JlYXRlVGltZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgidXBkYXRlQnkiLCBnZXRVcGRhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgidXBkYXRlVGltZSIsIGdldFVwZGF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c0RpY3REYXRhLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNEaWN0RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDM1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNEaWN0RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5OworCitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWwuQ29sdW1uVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworCisvKioKKyAqIOWtl+WFuOaVsOaNruihqCBzeXNfZGljdF9kYXRhCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN5c0RpY3REYXRhIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOWtl+WFuOe8lueggSAqLworICAgIEBFeGNlbChuYW1lID0gIuWtl+WFuOe8lueggSIsIGNlbGxUeXBlID0gQ29sdW1uVHlwZS5OVU1FUklDKQorICAgIHByaXZhdGUgTG9uZyBkaWN0Q29kZTsKKworICAgIC8qKiDlrZflhbjmjpLluo8gKi8KKyAgICBARXhjZWwobmFtZSA9ICLlrZflhbjmjpLluo8iLCBjZWxsVHlwZSA9IENvbHVtblR5cGUuTlVNRVJJQykKKyAgICBwcml2YXRlIExvbmcgZGljdFNvcnQ7CisKKyAgICAvKiog5a2X5YW45qCH562+ICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5a2X5YW45qCH562+IikKKyAgICBwcml2YXRlIFN0cmluZyBkaWN0TGFiZWw7CisKKyAgICAvKiog5a2X5YW46ZSu5YC8ICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5a2X5YW46ZSu5YC8IikKKyAgICBwcml2YXRlIFN0cmluZyBkaWN0VmFsdWU7CisKKyAgICAvKiog5a2X5YW457G75Z6LICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5a2X5YW457G75Z6LIikKKyAgICBwcml2YXRlIFN0cmluZyBkaWN0VHlwZTsKKworICAgIC8qKiDmoLflvI/lsZ7mgKfvvIjlhbbku5bmoLflvI/mianlsZXvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjc3NDbGFzczsKKworICAgIC8qKiDooajmoLzlrZflhbjmoLflvI8gKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaXN0Q2xhc3M7CisKKyAgICAvKiog5piv5ZCm6buY6K6k77yIWeaYryBO5ZCm77yJICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5piv5ZCm6buY6K6kIiwgcmVhZENvbnZlcnRlckV4cCA9ICJZPeaYryxOPeWQpiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgaXNEZWZhdWx0OworCisgICAgLyoqIOeKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIueKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3lgZznlKgiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIHB1YmxpYyBMb25nIGdldERpY3RDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0Q29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaWN0Q29kZShMb25nIGRpY3RDb2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5kaWN0Q29kZSA9IGRpY3RDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldERpY3RTb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0U29ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaWN0U29ydChMb25nIGRpY3RTb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy5kaWN0U29ydCA9IGRpY3RTb3J0OworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWtl+WFuOagh+etvuS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuWtl+WFuOagh+etvumVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXREaWN0TGFiZWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRpY3RMYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaWN0TGFiZWwoU3RyaW5nIGRpY3RMYWJlbCkKKyAgICB7CisgICAgICAgIHRoaXMuZGljdExhYmVsID0gZGljdExhYmVsOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWtl+WFuOmUruWAvOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuWtl+WFuOmUruWAvOmVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXREaWN0VmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRpY3RWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaWN0VmFsdWUoU3RyaW5nIGRpY3RWYWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGljdFZhbHVlID0gZGljdFZhbHVlOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWtl+WFuOexu+Wei+S4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuWtl+WFuOexu+Wei+mVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXREaWN0VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGljdFR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGljdFR5cGUoU3RyaW5nIGRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5kaWN0VHlwZSA9IGRpY3RUeXBlOworICAgIH0KKworICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDEwMCwgbWVzc2FnZSA9ICLmoLflvI/lsZ7mgKfplb/luqbkuI3og73otoXov4cxMDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3NzQ2xhc3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNzc0NsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENzc0NsYXNzKFN0cmluZyBjc3NDbGFzcykKKyAgICB7CisgICAgICAgIHRoaXMuY3NzQ2xhc3MgPSBjc3NDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpc3RDbGFzcygpCisgICAgeworICAgICAgICByZXR1cm4gbGlzdENsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpc3RDbGFzcyhTdHJpbmcgbGlzdENsYXNzKQorICAgIHsKKyAgICAgICAgdGhpcy5saXN0Q2xhc3MgPSBsaXN0Q2xhc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdCgpCisgICAgeworICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5ZRVMuZXF1YWxzKHRoaXMuaXNEZWZhdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElzRGVmYXVsdCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNEZWZhdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzRGVmYXVsdChTdHJpbmcgaXNEZWZhdWx0KQorICAgIHsKKyAgICAgICAgdGhpcy5pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzLFRvU3RyaW5nU3R5bGUuTVVMVElfTElORV9TVFlMRSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRpY3RDb2RlIiwgZ2V0RGljdENvZGUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRpY3RTb3J0IiwgZ2V0RGljdFNvcnQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRpY3RMYWJlbCIsIGdldERpY3RMYWJlbCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiZGljdFZhbHVlIiwgZ2V0RGljdFZhbHVlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkaWN0VHlwZSIsIGdldERpY3RUeXBlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjc3NDbGFzcyIsIGdldENzc0NsYXNzKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJsaXN0Q2xhc3MiLCBnZXRMaXN0Q2xhc3MoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImlzRGVmYXVsdCIsIGdldElzRGVmYXVsdCgpKQorICAgICAgICAgICAgLmFwcGVuZCgic3RhdHVzIiwgZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjcmVhdGVCeSIsIGdldENyZWF0ZUJ5KCkpCisgICAgICAgICAgICAuYXBwZW5kKCJjcmVhdGVUaW1lIiwgZ2V0Q3JlYXRlVGltZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgidXBkYXRlQnkiLCBnZXRVcGRhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgidXBkYXRlVGltZSIsIGdldFVwZGF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInJlbWFyayIsIGdldFJlbWFyaygpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9lbnRpdHkvU3lzRGljdFR5cGUuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c0RpY3RUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZDI5MAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c0RpY3RUeXBlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eTsKKworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3RCbGFuazsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWw7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsLkNvbHVtblR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworCisvKioKKyAqIOWtl+WFuOexu+Wei+ihqCBzeXNfZGljdF90eXBlCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN5c0RpY3RUeXBlIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOWtl+WFuOS4u+mUriAqLworICAgIEBFeGNlbChuYW1lID0gIuWtl+WFuOS4u+mUriIsIGNlbGxUeXBlID0gQ29sdW1uVHlwZS5OVU1FUklDKQorICAgIHByaXZhdGUgTG9uZyBkaWN0SWQ7CisKKyAgICAvKiog5a2X5YW45ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5a2X5YW45ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyBkaWN0TmFtZTsKKworICAgIC8qKiDlrZflhbjnsbvlnosgKi8KKyAgICBARXhjZWwobmFtZSA9ICLlrZflhbjnsbvlnosiKQorICAgIHByaXZhdGUgU3RyaW5nIGRpY3RUeXBlOworCisgICAgLyoqIOeKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIueKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3lgZznlKgiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIHB1YmxpYyBMb25nIGdldERpY3RJZCgpCisgICAgeworICAgICAgICByZXR1cm4gZGljdElkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpY3RJZChMb25nIGRpY3RJZCkKKyAgICB7CisgICAgICAgIHRoaXMuZGljdElkID0gZGljdElkOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWtl+WFuOWQjeensOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuWtl+WFuOexu+Wei+WQjeensOmVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXREaWN0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGljdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGljdE5hbWUoU3RyaW5nIGRpY3ROYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5kaWN0TmFtZSA9IGRpY3ROYW1lOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWtl+WFuOexu+Wei+S4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuWtl+WFuOexu+Wei+exu+Wei+mVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgQFBhdHRlcm4ocmVnZXhwID0gIl5bYS16XVthLXowLTlfXSokIiwgbWVzc2FnZSA9ICLlrZflhbjnsbvlnovlv4Xpobvku6XlrZfmr43lvIDlpLTvvIzkuJTlj6rog73kuLrvvIjlsI/lhpnlrZfmr43vvIzmlbDlrZfvvIzkuIvmu5Hnur/vvIkiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGljdFR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRpY3RUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpY3RUeXBlKFN0cmluZyBkaWN0VHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGljdFR5cGUgPSBkaWN0VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgiZGljdElkIiwgZ2V0RGljdElkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkaWN0TmFtZSIsIGdldERpY3ROYW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkaWN0VHlwZSIsIGdldERpY3RUeXBlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJzdGF0dXMiLCBnZXRTdGF0dXMoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyZWF0ZUJ5IiwgZ2V0Q3JlYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyZWF0ZVRpbWUiLCBnZXRDcmVhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1cGRhdGVCeSIsIGdldFVwZGF0ZUJ5KCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1cGRhdGVUaW1lIiwgZ2V0VXBkYXRlVGltZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicmVtYXJrIiwgZ2V0UmVtYXJrKCkpCisgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNNZW51LmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL2VudGl0eS9TeXNNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhYjc2MgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c01lbnUuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDoj5zljZXmnYPpmZDooaggc3lzX21lbnUKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzTWVudSBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDoj5zljZVJRCAqLworICAgIHByaXZhdGUgTG9uZyBtZW51SWQ7CisKKyAgICAvKiog6I+c5Y2V5ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVudU5hbWU7CisKKyAgICAvKiog54i26I+c5Y2V5ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKKworICAgIC8qKiDniLboj5zljZVJRCAqLworICAgIHByaXZhdGUgTG9uZyBwYXJlbnRJZDsKKworICAgIC8qKiDmmL7npLrpobrluo8gKi8KKyAgICBwcml2YXRlIEludGVnZXIgb3JkZXJOdW07CisKKyAgICAvKiog6Lev55Sx5Zyw5Z2AICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgIC8qKiDnu4Tku7bot6/lvoQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnQ7CisKKyAgICAvKiog6Lev55Sx5Y+C5pWwICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnk7CisKKyAgICAvKiog6Lev55Sx5ZCN56ew77yM6buY6K6k5ZKM6Lev55Sx5Zyw5Z2A55u45ZCM55qE6am85bOw5qC85byP77yI5rOo5oSP77ya5Zug5Li6dnVlM+eJiOacrOeahHJvdXRlcuS8muWIoOmZpOWQjeensOebuOWQjOi3r+eUse+8jOS4uumBv+WFjeWQjeWtl+eahOWGsueqge+8jOeJueauiuaDheWGteWPr+S7peiHquWumuS5ie+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvdXRlTmFtZTsKKworICAgIC8qKiDmmK/lkKbkuLrlpJbpk77vvIgw5pivIDHlkKbvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpc0ZyYW1lOworCisgICAgLyoqIOaYr+WQpue8k+WtmO+8iDDnvJPlrZggMeS4jee8k+WtmO+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGlzQ2FjaGU7CisKKyAgICAvKiog57G75Z6L77yITeebruW9lSBD6I+c5Y2VIEbmjInpkq7vvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZW51VHlwZTsKKworICAgIC8qKiDmmL7npLrnirbmgIHvvIgw5pi+56S6IDHpmpDol4/vvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2aXNpYmxlOworCisgICAgLyoqIOiPnOWNleeKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIC8qKiDmnYPpmZDlrZfnrKbkuLIgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwZXJtczsKKworICAgIC8qKiDoj5zljZXlm77moIcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpY29uOworCisgICAgLyoqIOWtkOiPnOWNlSAqLworICAgIHByaXZhdGUgTGlzdDxTeXNNZW51PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8U3lzTWVudT4oKTsKKworICAgIHB1YmxpYyBMb25nIGdldE1lbnVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gbWVudUlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnVJZChMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIHRoaXMubWVudUlkID0gbWVudUlkOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuiPnOWNleWQjeensOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gNTAsIG1lc3NhZ2UgPSAi6I+c5Y2V5ZCN56ew6ZW/5bqm5LiN6IO96LaF6L+HNTDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVudU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbnVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnVOYW1lKFN0cmluZyBtZW51TmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMubWVudU5hbWUgPSBtZW51TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0UGFyZW50SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudElkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudElkKExvbmcgcGFyZW50SWQpCisgICAgeworICAgICAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7CisgICAgfQorCisgICAgQE5vdE51bGwobWVzc2FnZSA9ICLmmL7npLrpobrluo/kuI3og73kuLrnqboiKQorICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9yZGVyTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcmRlck51bTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlck51bShJbnRlZ2VyIG9yZGVyTnVtKQorICAgIHsKKyAgICAgICAgdGhpcy5vcmRlck51bSA9IG9yZGVyTnVtOworICAgIH0KKworICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDIwMCwgbWVzc2FnZSA9ICLot6/nlLHlnLDlnYDkuI3og73otoXov4cyMDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKQorICAgIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSAyMDAsIG1lc3NhZ2UgPSAi57uE5Lu26Lev5b6E5LiN6IO96LaF6L+HMjU15Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChTdHJpbmcgY29tcG9uZW50KQorICAgIHsKKyAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeSgpCisgICAgeworICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KQorICAgIHsKKyAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um91dGVOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiByb3V0ZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um91dGVOYW1lKFN0cmluZyByb3V0ZU5hbWUpCisgICAgeworICAgICAgICB0aGlzLnJvdXRlTmFtZSA9IHJvdXRlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElzRnJhbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRnJhbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNGcmFtZShTdHJpbmcgaXNGcmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuaXNGcmFtZSA9IGlzRnJhbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc0NhY2hlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0NhY2hlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQ2FjaGUoU3RyaW5nIGlzQ2FjaGUpCisgICAgeworICAgICAgICB0aGlzLmlzQ2FjaGUgPSBpc0NhY2hlOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuiPnOWNleexu+Wei+S4jeiDveS4uuepuiIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZW51VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gbWVudVR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVudVR5cGUoU3RyaW5nIG1lbnVUeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5tZW51VHlwZSA9IG1lbnVUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmlzaWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gdmlzaWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKFN0cmluZyB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMTAwLCBtZXNzYWdlID0gIuadg+mZkOagh+ivhumVv+W6puS4jeiDvei2hei/hzEwMOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXRQZXJtcygpCisgICAgeworICAgICAgICByZXR1cm4gcGVybXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGVybXMoU3RyaW5nIHBlcm1zKQorICAgIHsKKyAgICAgICAgdGhpcy5wZXJtcyA9IHBlcm1zOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpCisgICAgeworICAgICAgICByZXR1cm4gaWNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKQorICAgIHsKKyAgICAgICAgdGhpcy5pY29uID0gaWNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTeXNNZW51PiBnZXRDaGlsZHJlbigpCisgICAgeworICAgICAgICByZXR1cm4gY2hpbGRyZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oTGlzdDxTeXNNZW51PiBjaGlsZHJlbikKKyAgICB7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzLFRvU3RyaW5nU3R5bGUuTVVMVElfTElORV9TVFlMRSkKKyAgICAgICAgICAgIC5hcHBlbmQoIm1lbnVJZCIsIGdldE1lbnVJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgibWVudU5hbWUiLCBnZXRNZW51TmFtZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicGFyZW50SWQiLCBnZXRQYXJlbnRJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgib3JkZXJOdW0iLCBnZXRPcmRlck51bSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicGF0aCIsIGdldFBhdGgoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNvbXBvbmVudCIsIGdldENvbXBvbmVudCgpKQorICAgICAgICAgICAgLmFwcGVuZCgicXVlcnkiLCBnZXRRdWVyeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicm91dGVOYW1lIiwgZ2V0Um91dGVOYW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJpc0ZyYW1lIiwgZ2V0SXNGcmFtZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiSXNDYWNoZSIsIGdldElzQ2FjaGUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIm1lbnVUeXBlIiwgZ2V0TWVudVR5cGUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInZpc2libGUiLCBnZXRWaXNpYmxlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJzdGF0dXMgIiwgZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJwZXJtcyIsIGdldFBlcm1zKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJpY29uIiwgZ2V0SWNvbigpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c1JvbGUuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c1JvbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjhlZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9lbnRpdHkvU3lzUm9sZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90Qmxhbms7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDop5LoibLooaggc3lzX3JvbGUKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzUm9sZSBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDop5LoibJJRCAqLworICAgIEBFeGNlbChuYW1lID0gIuinkuiJsuW6j+WPtyIsIGNlbGxUeXBlID0gQ29sdW1uVHlwZS5OVU1FUklDKQorICAgIHByaXZhdGUgTG9uZyByb2xlSWQ7CisKKyAgICAvKiog6KeS6Imy5ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6KeS6Imy5ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyByb2xlTmFtZTsKKworICAgIC8qKiDop5LoibLmnYPpmZAgKi8KKyAgICBARXhjZWwobmFtZSA9ICLop5LoibLmnYPpmZAiKQorICAgIHByaXZhdGUgU3RyaW5nIHJvbGVLZXk7CisKKyAgICAvKiog6KeS6Imy5o6S5bqPICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6KeS6Imy5o6S5bqPIikKKyAgICBwcml2YXRlIEludGVnZXIgcm9sZVNvcnQ7CisKKyAgICAvKiog5pWw5o2u6IyD5Zu077yIMe+8muaJgOacieaVsOaNruadg+mZkO+8mzLvvJroh6rlrprkuYnmlbDmja7mnYPpmZDvvJsz77ya5pys6YOo6Zeo5pWw5o2u5p2D6ZmQ77ybNO+8muacrOmDqOmXqOWPiuS7peS4i+aVsOaNruadg+mZkO+8mzXvvJrku4XmnKzkurrmlbDmja7mnYPpmZDvvIkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmlbDmja7ojIPlm7QiLCByZWFkQ29udmVydGVyRXhwID0gIjE95omA5pyJ5pWw5o2u5p2D6ZmQLDI96Ieq5a6a5LmJ5pWw5o2u5p2D6ZmQLDM95pys6YOo6Zeo5pWw5o2u5p2D6ZmQLDQ95pys6YOo6Zeo5Y+K5Lul5LiL5pWw5o2u5p2D6ZmQLDU95LuF5pys5Lq65pWw5o2u5p2D6ZmQIikKKyAgICBwcml2YXRlIFN0cmluZyBkYXRhU2NvcGU7CisKKyAgICAvKiog6I+c5Y2V5qCR6YCJ5oup6aG55piv5ZCm5YWz6IGU5pi+56S677yIIDDvvJrniLblrZDkuI3kupLnm7jlhbPogZTmmL7npLogMe+8mueItuWtkOS6kuebuOWFs+iBlOaYvuekuu+8iSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtZW51Q2hlY2tTdHJpY3RseTsKKworICAgIC8qKiDpg6jpl6jmoJHpgInmi6npobnmmK/lkKblhbPogZTmmL7npLrvvIgw77ya54i25a2Q5LiN5LqS55u45YWz6IGU5pi+56S6IDHvvJrniLblrZDkupLnm7jlhbPogZTmmL7npLog77yJICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlcHRDaGVja1N0cmljdGx5OworCisgICAgLyoqIOinkuiJsueKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuinkuiJsueKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3lgZznlKgiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIC8qKiDliKDpmaTmoIflv5fvvIgw5Luj6KGo5a2Y5ZyoIDLku6PooajliKDpmaTvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWxGbGFnOworCisgICAgLyoqIOeUqOaIt+aYr+WQpuWtmOWcqOatpOinkuiJsuagh+ivhiDpu5jorqTkuI3lrZjlnKggKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmxhZyA9IGZhbHNlOworCisgICAgLyoqIOiPnOWNlee7hCAqLworICAgIHByaXZhdGUgTG9uZ1tdIG1lbnVJZHM7CisKKyAgICAvKiog6YOo6Zeo57uE77yI5pWw5o2u5p2D6ZmQ77yJICovCisgICAgcHJpdmF0ZSBMb25nW10gZGVwdElkczsKKworICAgIC8qKiDop5LoibLoj5zljZXmnYPpmZAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IHBlcm1pc3Npb25zOworCisgICAgcHVibGljIFN5c1JvbGUoKQorICAgIHsKKworICAgIH0KKworICAgIHB1YmxpYyBTeXNSb2xlKExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgdGhpcy5yb2xlSWQgPSByb2xlSWQ7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0Um9sZUlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiByb2xlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sZUlkKExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgdGhpcy5yb2xlSWQgPSByb2xlSWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNBZG1pbih0aGlzLnJvbGVJZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWRtaW4oTG9uZyByb2xlSWQpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZUlkICE9IG51bGwgJiYgMUwgPT0gcm9sZUlkOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuinkuiJsuWQjeensOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMzAsIG1lc3NhZ2UgPSAi6KeS6Imy5ZCN56ew6ZW/5bqm5LiN6IO96LaF6L+HMzDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyByb2xlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMucm9sZU5hbWUgPSByb2xlTmFtZTsKKyAgICB9CisKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLmnYPpmZDlrZfnrKbkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDEwMCwgbWVzc2FnZSA9ICLmnYPpmZDlrZfnrKbplb/luqbkuI3og73otoXov4cxMDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZUtleSgpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZUtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlS2V5KFN0cmluZyByb2xlS2V5KQorICAgIHsKKyAgICAgICAgdGhpcy5yb2xlS2V5ID0gcm9sZUtleTsKKyAgICB9CisKKyAgICBATm90TnVsbChtZXNzYWdlID0gIuaYvuekuumhuuW6j+S4jeiDveS4uuepuiIpCisgICAgcHVibGljIEludGVnZXIgZ2V0Um9sZVNvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVTb3J0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVTb3J0KEludGVnZXIgcm9sZVNvcnQpCisgICAgeworICAgICAgICB0aGlzLnJvbGVTb3J0ID0gcm9sZVNvcnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhU2NvcGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGFTY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhU2NvcGUoU3RyaW5nIGRhdGFTY29wZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGF0YVNjb3BlID0gZGF0YVNjb3BlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTWVudUNoZWNrU3RyaWN0bHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbnVDaGVja1N0cmljdGx5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnVDaGVja1N0cmljdGx5KGJvb2xlYW4gbWVudUNoZWNrU3RyaWN0bHkpCisgICAgeworICAgICAgICB0aGlzLm1lbnVDaGVja1N0cmljdGx5ID0gbWVudUNoZWNrU3RyaWN0bHk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZXB0Q2hlY2tTdHJpY3RseSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdENoZWNrU3RyaWN0bHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwdENoZWNrU3RyaWN0bHkoYm9vbGVhbiBkZXB0Q2hlY2tTdHJpY3RseSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVwdENoZWNrU3RyaWN0bHkgPSBkZXB0Q2hlY2tTdHJpY3RseTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWxGbGFnKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxGbGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlbEZsYWcoU3RyaW5nIGRlbEZsYWcpCisgICAgeworICAgICAgICB0aGlzLmRlbEZsYWcgPSBkZWxGbGFnOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmxhZygpCisgICAgeworICAgICAgICByZXR1cm4gZmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbGFnKGJvb2xlYW4gZmxhZykKKyAgICB7CisgICAgICAgIHRoaXMuZmxhZyA9IGZsYWc7CisgICAgfQorCisgICAgcHVibGljIExvbmdbXSBnZXRNZW51SWRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZW51SWRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnVJZHMoTG9uZ1tdIG1lbnVJZHMpCisgICAgeworICAgICAgICB0aGlzLm1lbnVJZHMgPSBtZW51SWRzOworICAgIH0KKworICAgIHB1YmxpYyBMb25nW10gZ2V0RGVwdElkcygpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdElkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXB0SWRzKExvbmdbXSBkZXB0SWRzKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXB0SWRzID0gZGVwdElkczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGVybWlzc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb25zKFNldDxTdHJpbmc+IHBlcm1pc3Npb25zKQorICAgIHsKKyAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgicm9sZUlkIiwgZ2V0Um9sZUlkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyb2xlTmFtZSIsIGdldFJvbGVOYW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyb2xlS2V5IiwgZ2V0Um9sZUtleSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicm9sZVNvcnQiLCBnZXRSb2xlU29ydCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiZGF0YVNjb3BlIiwgZ2V0RGF0YVNjb3BlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJtZW51Q2hlY2tTdHJpY3RseSIsIGlzTWVudUNoZWNrU3RyaWN0bHkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRlcHRDaGVja1N0cmljdGx5IiwgaXNEZXB0Q2hlY2tTdHJpY3RseSgpKQorICAgICAgICAgICAgLmFwcGVuZCgic3RhdHVzIiwgZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkZWxGbGFnIiwgZ2V0RGVsRmxhZygpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c1VzZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vZW50aXR5L1N5c1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZjNjVkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9lbnRpdHkvU3lzVXNlci5qYXZhCkBAIC0wLDAgKzEsMzI0IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24ueHNzLlhzczsKKworLyoqCisgKiDnlKjmiLflr7nosaEgc3lzX3VzZXIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzVXNlciBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDnlKjmiLdJRCAqLworICAgIEBFeGNlbChuYW1lID0gIueUqOaIt+W6j+WPtyIsIHR5cGUgPSBUeXBlLkVYUE9SVCwgY2VsbFR5cGUgPSBDb2x1bW5UeXBlLk5VTUVSSUMsIHByb21wdCA9ICLnlKjmiLfnvJblj7ciKQorICAgIHByaXZhdGUgTG9uZyB1c2VySWQ7CisKKyAgICAvKiog6YOo6ZeoSUQgKi8KKyAgICBARXhjZWwobmFtZSA9ICLpg6jpl6jnvJblj7ciLCB0eXBlID0gVHlwZS5JTVBPUlQpCisgICAgcHJpdmF0ZSBMb25nIGRlcHRJZDsKKworICAgIC8qKiDnlKjmiLfotKblj7cgKi8KKyAgICBARXhjZWwobmFtZSA9ICLnmbvlvZXlkI3np7AiKQorICAgIHByaXZhdGUgU3RyaW5nIHVzZXJOYW1lOworCisgICAgLyoqIOeUqOaIt+aYteensCAqLworICAgIEBFeGNlbChuYW1lID0gIueUqOaIt+WQjeensCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7CisKKyAgICAvKiog55So5oi36YKu566xICovCisgICAgQEV4Y2VsKG5hbWUgPSAi55So5oi36YKu566xIikKKyAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsKKworICAgIC8qKiDmiYvmnLrlj7fnoIEgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmiYvmnLrlj7fnoIEiLCBjZWxsVHlwZSA9IENvbHVtblR5cGUuVEVYVCkKKyAgICBwcml2YXRlIFN0cmluZyBwaG9uZW51bWJlcjsKKworICAgIC8qKiDnlKjmiLfmgKfliKsgKi8KKyAgICBARXhjZWwobmFtZSA9ICLnlKjmiLfmgKfliKsiLCByZWFkQ29udmVydGVyRXhwID0gIjA955S3LDE95aWzLDI95pyq55+lIikKKyAgICBwcml2YXRlIFN0cmluZyBzZXg7CisKKyAgICAvKiog55So5oi35aS05YOPICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXZhdGFyOworCisgICAgLyoqIOWvhueggSAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworCisgICAgLyoqIOW4kOWPt+eKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuW4kOWPt+eKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3lgZznlKgiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIC8qKiDliKDpmaTmoIflv5fvvIgw5Luj6KGo5a2Y5ZyoIDLku6PooajliKDpmaTvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWxGbGFnOworCisgICAgLyoqIOacgOWQjueZu+W9lUlQICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5pyA5ZCO55m75b2VSVAiLCB0eXBlID0gVHlwZS5FWFBPUlQpCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9naW5JcDsKKworICAgIC8qKiDmnIDlkI7nmbvlvZXml7bpl7QgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmnIDlkI7nmbvlvZXml7bpl7QiLCB3aWR0aCA9IDMwLCBkYXRlRm9ybWF0ID0gInl5eXktTU0tZGQgSEg6bW06c3MiLCB0eXBlID0gVHlwZS5FWFBPUlQpCisgICAgcHJpdmF0ZSBEYXRlIGxvZ2luRGF0ZTsKKworICAgIC8qKiDpg6jpl6jlr7nosaEgKi8KKyAgICBARXhjZWxzKHsKKyAgICAgICAgQEV4Y2VsKG5hbWUgPSAi6YOo6Zeo5ZCN56ewIiwgdGFyZ2V0QXR0ciA9ICJkZXB0TmFtZSIsIHR5cGUgPSBUeXBlLkVYUE9SVCksCisgICAgICAgIEBFeGNlbChuYW1lID0gIumDqOmXqOi0n+i0o+S6uiIsIHRhcmdldEF0dHIgPSAibGVhZGVyIiwgdHlwZSA9IFR5cGUuRVhQT1JUKQorICAgIH0pCisgICAgcHJpdmF0ZSBTeXNEZXB0IGRlcHQ7CisKKyAgICAvKiog6KeS6Imy5a+56LGhICovCisgICAgcHJpdmF0ZSBMaXN0PFN5c1JvbGU+IHJvbGVzOworCisgICAgLyoqIOinkuiJsue7hCAqLworICAgIHByaXZhdGUgTG9uZ1tdIHJvbGVJZHM7CisKKyAgICAvKiog5bKX5L2N57uEICovCisgICAgcHJpdmF0ZSBMb25nW10gcG9zdElkczsKKworICAgIC8qKiDop5LoibJJRCAqLworICAgIHByaXZhdGUgTG9uZyByb2xlSWQ7CisKKyAgICBwdWJsaWMgU3lzVXNlcigpCisgICAgeworCisgICAgfQorCisgICAgcHVibGljIFN5c1VzZXIoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRVc2VySWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FkbWluKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0FkbWluKHRoaXMudXNlcklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBZG1pbihMb25nIHVzZXJJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VySWQgIT0gbnVsbCAmJiAxTCA9PSB1c2VySWQ7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0RGVwdElkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZXB0SWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwdElkKExvbmcgZGVwdElkKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXB0SWQgPSBkZXB0SWQ7CisgICAgfQorCisgICAgQFhzcyhtZXNzYWdlID0gIueUqOaIt+aYteensOS4jeiDveWMheWQq+iEmuacrOWtl+espiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMzAsIG1lc3NhZ2UgPSAi55So5oi35pi156ew6ZW/5bqm5LiN6IO96LaF6L+HMzDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5pY2tOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsKKyAgICB9CisKKyAgICBAWHNzKG1lc3NhZ2UgPSAi55So5oi36LSm5Y+35LiN6IO95YyF5ZCr6ISa5pys5a2X56ymIikKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLnlKjmiLfotKblj7fkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDMwLCBtZXNzYWdlID0gIueUqOaIt+i0puWPt+mVv+W6puS4jeiDvei2hei/hzMw5Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpCisgICAgeworICAgICAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7CisgICAgfQorCisgICAgQEVtYWlsKG1lc3NhZ2UgPSAi6YKu566x5qC85byP5LiN5q2j56GuIikKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSA1MCwgbWVzc2FnZSA9ICLpgq7nrrHplb/luqbkuI3og73otoXov4c1MOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpCisgICAgeworICAgICAgICByZXR1cm4gZW1haWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQorICAgIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDExLCBtZXNzYWdlID0gIuaJi+acuuWPt+eggemVv+W6puS4jeiDvei2hei/hzEx5Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lbnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwaG9uZW51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZW51bWJlcihTdHJpbmcgcGhvbmVudW1iZXIpCisgICAgeworICAgICAgICB0aGlzLnBob25lbnVtYmVyID0gcGhvbmVudW1iZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNleDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXgoU3RyaW5nIHNleCkKKyAgICB7CisgICAgICAgIHRoaXMuc2V4ID0gc2V4OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXZhdGFyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhdmF0YXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXZhdGFyKFN0cmluZyBhdmF0YXIpCisgICAgeworICAgICAgICB0aGlzLmF2YXRhciA9IGF2YXRhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVsRmxhZygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsRmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxGbGFnKFN0cmluZyBkZWxGbGFnKQorICAgIHsKKyAgICAgICAgdGhpcy5kZWxGbGFnID0gZGVsRmxhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvZ2luSXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ2luSXA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9naW5JcChTdHJpbmcgbG9naW5JcCkKKyAgICB7CisgICAgICAgIHRoaXMubG9naW5JcCA9IGxvZ2luSXA7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0TG9naW5EYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbkRhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9naW5EYXRlKERhdGUgbG9naW5EYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5sb2dpbkRhdGUgPSBsb2dpbkRhdGU7CisgICAgfQorCisgICAgcHVibGljIFN5c0RlcHQgZ2V0RGVwdCgpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXB0KFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIHRoaXMuZGVwdCA9IGRlcHQ7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3lzUm9sZT4gZ2V0Um9sZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKExpc3Q8U3lzUm9sZT4gcm9sZXMpCisgICAgeworICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7CisgICAgfQorCisgICAgcHVibGljIExvbmdbXSBnZXRSb2xlSWRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiByb2xlSWRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVJZHMoTG9uZ1tdIHJvbGVJZHMpCisgICAgeworICAgICAgICB0aGlzLnJvbGVJZHMgPSByb2xlSWRzOworICAgIH0KKworICAgIHB1YmxpYyBMb25nW10gZ2V0UG9zdElkcygpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdElkczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3N0SWRzKExvbmdbXSBwb3N0SWRzKQorICAgIHsKKyAgICAgICAgdGhpcy5wb3N0SWRzID0gcG9zdElkczsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRSb2xlSWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlSWQoTG9uZyByb2xlSWQpCisgICAgeworICAgICAgICB0aGlzLnJvbGVJZCA9IHJvbGVJZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IFRvU3RyaW5nQnVpbGRlcih0aGlzLFRvU3RyaW5nU3R5bGUuTVVMVElfTElORV9TVFlMRSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVzZXJJZCIsIGdldFVzZXJJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiZGVwdElkIiwgZ2V0RGVwdElkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1c2VyTmFtZSIsIGdldFVzZXJOYW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJuaWNrTmFtZSIsIGdldE5pY2tOYW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJlbWFpbCIsIGdldEVtYWlsKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJwaG9uZW51bWJlciIsIGdldFBob25lbnVtYmVyKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJzZXgiLCBnZXRTZXgoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImF2YXRhciIsIGdldEF2YXRhcigpKQorICAgICAgICAgICAgLmFwcGVuZCgicGFzc3dvcmQiLCBnZXRQYXNzd29yZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgic3RhdHVzIiwgZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkZWxGbGFnIiwgZ2V0RGVsRmxhZygpKQorICAgICAgICAgICAgLmFwcGVuZCgibG9naW5JcCIsIGdldExvZ2luSXAoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImxvZ2luRGF0ZSIsIGdldExvZ2luRGF0ZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImRlcHQiLCBnZXREZXB0KCkpCisgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL21vZGVsL0xvZ2luQm9keS5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9tb2RlbC9Mb2dpbkJvZHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJjOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9tb2RlbC9Mb2dpbkJvZHkuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4ubW9kZWw7CisKKy8qKgorICog55So5oi355m75b2V5a+56LGhCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIExvZ2luQm9keQoreworICAgIC8qKgorICAgICAqIOeUqOaIt+WQjQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOworCisgICAgLyoqCisgICAgICog55So5oi35a+G56CBCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisKKyAgICAvKioKKyAgICAgKiDpqozor4HnoIEKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb2RlOworCisgICAgLyoqCisgICAgICog5ZSv5LiA5qCH6K+GCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXVpZDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvZGUoU3RyaW5nIGNvZGUpCisgICAgeworICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXVpZCgpCisgICAgeworICAgICAgICByZXR1cm4gdXVpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVdWlkKFN0cmluZyB1dWlkKQorICAgIHsKKyAgICAgICAgdGhpcy51dWlkID0gdXVpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvZG9tYWluL21vZGVsL0xvZ2luVXNlci5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9tb2RlbC9Mb2dpblVzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBlNmIzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9tb2RlbC9Mb2dpblVzZXIuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsOworCitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLmFubm90YXRpb24uSlNPTkZpZWxkOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1VzZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLkdyYW50ZWRBdXRob3JpdHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLnVzZXJkZXRhaWxzLlVzZXJEZXRhaWxzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICog55m75b2V55So5oi36Lqr5Lu95p2D6ZmQCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIExvZ2luVXNlciBpbXBsZW1lbnRzIFVzZXJEZXRhaWxzCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLdJRAorICAgICAqLworICAgIHByaXZhdGUgTG9uZyB1c2VySWQ7CisKKyAgICAvKioKKyAgICAgKiDpg6jpl6hJRAorICAgICAqLworICAgIHByaXZhdGUgTG9uZyBkZXB0SWQ7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLfllK/kuIDmoIfor4YKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsKKworICAgIC8qKgorICAgICAqIOeZu+W9leaXtumXtAorICAgICAqLworICAgIHByaXZhdGUgTG9uZyBsb2dpblRpbWU7CisKKyAgICAvKioKKyAgICAgKiDov4fmnJ/ml7bpl7QKKyAgICAgKi8KKyAgICBwcml2YXRlIExvbmcgZXhwaXJlVGltZTsKKworICAgIC8qKgorICAgICAqIOeZu+W9lUlQ5Zyw5Z2ACisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaXBhZGRyOworCisgICAgLyoqCisgICAgICog55m75b2V5Zyw54K5CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9naW5Mb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIOa1j+iniOWZqOexu+WeiworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJyb3dzZXI7CisKKyAgICAvKioKKyAgICAgKiDmk43kvZzns7vnu58KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvczsKKworICAgIC8qKgorICAgICAqIOadg+mZkOWIl+ihqAorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcGVybWlzc2lvbnM7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLfkv6Hmga8KKyAgICAgKi8KKyAgICBwcml2YXRlIFN5c1VzZXIgdXNlcjsKKworICAgIHB1YmxpYyBMb2dpblVzZXIoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9naW5Vc2VyKFN5c1VzZXIgdXNlciwgU2V0PFN0cmluZz4gcGVybWlzc2lvbnMpCisgICAgeworICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIExvZ2luVXNlcihMb25nIHVzZXJJZCwgTG9uZyBkZXB0SWQsIFN5c1VzZXIgdXNlciwgU2V0PFN0cmluZz4gcGVybWlzc2lvbnMpCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICAgICAgdGhpcy5kZXB0SWQgPSBkZXB0SWQ7CisgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRVc2VySWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXREZXB0SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlcHRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXB0SWQoTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICB0aGlzLmRlcHRJZCA9IGRlcHRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pCisgICAgeworICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisgICAgfQorCisgICAgQEpTT05GaWVsZChzZXJpYWxpemUgPSBmYWxzZSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyLmdldFBhc3N3b3JkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXNlci5nZXRVc2VyTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi0puaIt+aYr+WQpuacqui/h+acnyzov4fmnJ/ml6Dms5Xpqozor4EKKyAgICAgKi8KKyAgICBASlNPTkZpZWxkKHNlcmlhbGl6ZSA9IGZhbHNlKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWNjb3VudE5vbkV4cGlyZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog5oyH5a6a55So5oi35piv5ZCm6Kej6ZSBLOmUgeWumueahOeUqOaIt+aXoOazlei/m+ihjOi6q+S7vemqjOivgQorICAgICAqIAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBASlNPTkZpZWxkKHNlcmlhbGl6ZSA9IGZhbHNlKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWNjb3VudE5vbkxvY2tlZCgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmjIfnpLrmmK/lkKblt7Lov4fmnJ/nmoTnlKjmiLfnmoTlh63mja4o5a+G56CBKSzov4fmnJ/nmoTlh63mja7pmLLmraLorqTor4EKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgQEpTT05GaWVsZChzZXJpYWxpemUgPSBmYWxzZSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NyZWRlbnRpYWxzTm9uRXhwaXJlZCgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKblj6/nlKggLOemgeeUqOeahOeUqOaIt+S4jeiDvei6q+S7vemqjOivgQorICAgICAqIAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBASlNPTkZpZWxkKHNlcmlhbGl6ZSA9IGZhbHNlKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRMb2dpblRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvZ2luVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpblRpbWUoTG9uZyBsb2dpblRpbWUpCisgICAgeworICAgICAgICB0aGlzLmxvZ2luVGltZSA9IGxvZ2luVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElwYWRkcigpCisgICAgeworICAgICAgICByZXR1cm4gaXBhZGRyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElwYWRkcihTdHJpbmcgaXBhZGRyKQorICAgIHsKKyAgICAgICAgdGhpcy5pcGFkZHIgPSBpcGFkZHI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2dpbkxvY2F0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luTG9jYXRpb24oU3RyaW5nIGxvZ2luTG9jYXRpb24pCisgICAgeworICAgICAgICB0aGlzLmxvZ2luTG9jYXRpb24gPSBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJvd3NlcigpCisgICAgeworICAgICAgICByZXR1cm4gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCcm93c2VyKFN0cmluZyBicm93c2VyKQorICAgIHsKKyAgICAgICAgdGhpcy5icm93c2VyID0gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcyhTdHJpbmcgb3MpCisgICAgeworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0RXhwaXJlVGltZSgpCisgICAgeworICAgICAgICByZXR1cm4gZXhwaXJlVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmVUaW1lKExvbmcgZXhwaXJlVGltZSkKKyAgICB7CisgICAgICAgIHRoaXMuZXhwaXJlVGltZSA9IGV4cGlyZVRpbWU7CisgICAgfQorCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFBlcm1pc3Npb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwZXJtaXNzaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQZXJtaXNzaW9ucyhTZXQ8U3RyaW5nPiBwZXJtaXNzaW9ucykKKyAgICB7CisgICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3lzVXNlciBnZXRVc2VyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXIoU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhbnRlZEF1dGhvcml0eT4gZ2V0QXV0aG9yaXRpZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL2RvbWFpbi9tb2RlbC9SZWdpc3RlckJvZHkuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vbW9kZWwvUmVnaXN0ZXJCb2R5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4YTFmYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9kb21haW4vbW9kZWwvUmVnaXN0ZXJCb2R5LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsOworCisvKioKKyAqIOeUqOaIt+azqOWGjOWvueixoQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWdpc3RlckJvZHkgZXh0ZW5kcyBMb2dpbkJvZHkKK3sKKworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3BhZ2UvUGFnZURvbWFpbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3BhZ2UvUGFnZURvbWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NjZjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvcGFnZS9QYWdlRG9tYWluLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2U7CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOWIhumhteaVsOaNrgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBQYWdlRG9tYWluCit7CisgICAgLyoqIOW9k+WJjeiusOW9lei1t+Wni+e0ouW8lSAqLworICAgIHByaXZhdGUgSW50ZWdlciBwYWdlTnVtOworCisgICAgLyoqIOavj+mhteaYvuekuuiusOW9leaVsCAqLworICAgIHByaXZhdGUgSW50ZWdlciBwYWdlU2l6ZTsKKworICAgIC8qKiDmjpLluo/liJcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvcmRlckJ5Q29sdW1uOworCisgICAgLyoqIOaOkuW6j+eahOaWueWQkWRlc2PmiJbogIVhc2MgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpc0FzYyA9ICJhc2MiOworCisgICAgLyoqIOWIhumhteWPguaVsOWQiOeQhuWMliAqLworICAgIHByaXZhdGUgQm9vbGVhbiByZWFzb25hYmxlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShvcmRlckJ5Q29sdW1uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy50b1VuZGVyU2NvcmVDYXNlKG9yZGVyQnlDb2x1bW4pICsgIiAiICsgaXNBc2M7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0UGFnZU51bSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFnZU51bTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWdlTnVtKEludGVnZXIgcGFnZU51bSkKKyAgICB7CisgICAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2VOdW07CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0UGFnZVNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhZ2VTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VTaXplKEludGVnZXIgcGFnZVNpemUpCisgICAgeworICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcmRlckJ5Q29sdW1uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcmRlckJ5Q29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyQnlDb2x1bW4oU3RyaW5nIG9yZGVyQnlDb2x1bW4pCisgICAgeworICAgICAgICB0aGlzLm9yZGVyQnlDb2x1bW4gPSBvcmRlckJ5Q29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNBc2MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzQXNjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQXNjKFN0cmluZyBpc0FzYykKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGlzQXNjKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5YW85a655YmN56uv5o6S5bqP57G75Z6LCisgICAgICAgICAgICBpZiAoImFzY2VuZGluZyIuZXF1YWxzKGlzQXNjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc0FzYyA9ICJhc2MiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoImRlc2NlbmRpbmciLmVxdWFscyhpc0FzYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNBc2MgPSAiZGVzYyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmlzQXNjID0gaXNBc2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRSZWFzb25hYmxlKCkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwocmVhc29uYWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYXNvbmFibGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVhc29uYWJsZShCb29sZWFuIHJlYXNvbmFibGUpCisgICAgeworICAgICAgICB0aGlzLnJlYXNvbmFibGUgPSByZWFzb25hYmxlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9wYWdlL1RhYmxlRGF0YUluZm8uamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9wYWdlL1RhYmxlRGF0YUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc2ODViCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3BhZ2UvVGFibGVEYXRhSW5mby5qYXZhCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiDooajmoLzliIbpobXmlbDmja7lr7nosaEKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVGFibGVEYXRhSW5mbyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOaAu+iusOW9leaVsCAqLworICAgIHByaXZhdGUgbG9uZyB0b3RhbDsKKworICAgIC8qKiDliJfooajmlbDmja4gKi8KKyAgICBwcml2YXRlIExpc3Q8Pz4gcm93czsKKworICAgIC8qKiDmtojmga/nirbmgIHnoIEgKi8KKyAgICBwcml2YXRlIGludCBjb2RlOworCisgICAgLyoqIOa2iOaBr+WGheWuuSAqLworICAgIHByaXZhdGUgU3RyaW5nIG1zZzsKKworICAgIC8qKgorICAgICAqIOihqOagvOaVsOaNruWvueixoQorICAgICAqLworICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICog5YiG6aG1CisgICAgICogCisgICAgICogQHBhcmFtIGxpc3Qg5YiX6KGo5pWw5o2uCisgICAgICogQHBhcmFtIHRvdGFsIOaAu+iusOW9leaVsAorICAgICAqLworICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvKExpc3Q8Pz4gbGlzdCwgaW50IHRvdGFsKQorICAgIHsKKyAgICAgICAgdGhpcy5yb3dzID0gbGlzdDsKKyAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRvdGFsKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbChsb25nIHRvdGFsKQorICAgIHsKKyAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PD8+IGdldFJvd3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um93cyhMaXN0PD8+IHJvd3MpCisgICAgeworICAgICAgICB0aGlzLnJvd3MgPSByb3dzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2RlKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1zZygpCisgICAgeworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1zZyhTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3BhZ2UvVGFibGVTdXBwb3J0LmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvcGFnZS9UYWJsZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZlY2YwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3BhZ2UvVGFibGVTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZTsKKworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0LkNvbnZlcnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZXJ2bGV0VXRpbHM7CisKKy8qKgorICog6KGo5qC85pWw5o2u5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFRhYmxlU3VwcG9ydAoreworICAgIC8qKgorICAgICAqIOW9k+WJjeiusOW9lei1t+Wni+e0ouW8lQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTlVNID0gImN1cnJlbnQiOworCisgICAgLyoqCisgICAgICog5q+P6aG15pi+56S66K6w5b2V5pWwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9TSVpFID0gInBhZ2VTaXplIjsKKworICAgIC8qKgorICAgICAqIOaOkuW6j+WIlworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JZX0NPTFVNTiA9ICJvcmRlckJ5Q29sdW1uIjsKKworICAgIC8qKgorICAgICAqIOaOkuW6j+eahOaWueWQkSAiZGVzYyIg5oiW6ICFICJhc2MiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0FTQyA9ICJpc0FzYyI7CisKKyAgICAvKioKKyAgICAgKiDliIbpobXlj4LmlbDlkIjnkIbljJYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05BQkxFID0gInJlYXNvbmFibGUiOworCisgICAgLyoqCisgICAgICog5bCB6KOF5YiG6aG15a+56LGhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWdlRG9tYWluIGdldFBhZ2VEb21haW4oKQorICAgIHsKKyAgICAgICAgUGFnZURvbWFpbiBwYWdlRG9tYWluID0gbmV3IFBhZ2VEb21haW4oKTsKKyAgICAgICAgcGFnZURvbWFpbi5zZXRQYWdlTnVtKENvbnZlcnQudG9JbnQoU2VydmxldFV0aWxzLmdldFBhcmFtZXRlcihQQUdFX05VTSksIDEpKTsKKyAgICAgICAgcGFnZURvbWFpbi5zZXRQYWdlU2l6ZShDb252ZXJ0LnRvSW50KFNlcnZsZXRVdGlscy5nZXRQYXJhbWV0ZXIoUEFHRV9TSVpFKSwgMTApKTsKKyAgICAgICAgcGFnZURvbWFpbi5zZXRPcmRlckJ5Q29sdW1uKFNlcnZsZXRVdGlscy5nZXRQYXJhbWV0ZXIoT1JERVJfQllfQ09MVU1OKSk7CisgICAgICAgIHBhZ2VEb21haW4uc2V0SXNBc2MoU2VydmxldFV0aWxzLmdldFBhcmFtZXRlcihJU19BU0MpKTsKKyAgICAgICAgcGFnZURvbWFpbi5zZXRSZWFzb25hYmxlKFNlcnZsZXRVdGlscy5nZXRQYXJhbWV0ZXJUb0Jvb2woUkVBU09OQUJMRSkpOworICAgICAgICByZXR1cm4gcGFnZURvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhZ2VEb21haW4gYnVpbGRQYWdlUmVxdWVzdCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0UGFnZURvbWFpbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS9yZWRpcy9SZWRpc0NhY2hlLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvcmVkaXMvUmVkaXNDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTgwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvcmVkaXMvUmVkaXNDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMjY4IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS5yZWRpczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5jb3JlLkJvdW5kU2V0T3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVkaXMuY29yZS5IYXNoT3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVkaXMuY29yZS5SZWRpc1RlbXBsYXRlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5jb3JlLlZhbHVlT3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCisvKioKKyAqIHNwcmluZyByZWRpcyDlt6XlhbfnsbsKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKiovCitAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZSA9IHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBSZWRpc0NhY2hlCit7CisgICAgQEF1dG93aXJlZAorICAgIHB1YmxpYyBSZWRpc1RlbXBsYXRlIHJlZGlzVGVtcGxhdGU7CisKKyAgICAvKioKKyAgICAgKiDnvJPlrZjln7rmnKznmoTlr7nosaHvvIxJbnRlZ2Vy44CBU3RyaW5n44CB5a6e5L2T57G7562JCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IOe8k+WtmOeahOmUruWAvAorICAgICAqIEBwYXJhbSB2YWx1ZSDnvJPlrZjnmoTlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IHZvaWQgc2V0Q2FjaGVPYmplY3QoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJlZGlzVGVtcGxhdGUub3BzRm9yVmFsdWUoKS5zZXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog57yT5a2Y5Z+65pys55qE5a+56LGh77yMSW50ZWdlcuOAgVN0cmluZ+OAgeWunuS9k+exu+etiQorICAgICAqCisgICAgICogQHBhcmFtIGtleSDnvJPlrZjnmoTplK7lgLwKKyAgICAgKiBAcGFyYW0gdmFsdWUg57yT5a2Y55qE5YC8CisgICAgICogQHBhcmFtIHRpbWVvdXQg5pe26Ze0CisgICAgICogQHBhcmFtIHRpbWVVbml0IOaXtumXtOmil+eykuW6pgorICAgICAqLworICAgIHB1YmxpYyA8VD4gdm9pZCBzZXRDYWNoZU9iamVjdChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBUIHZhbHVlLCBmaW5hbCBJbnRlZ2VyIHRpbWVvdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KQorICAgIHsKKyAgICAgICAgcmVkaXNUZW1wbGF0ZS5vcHNGb3JWYWx1ZSgpLnNldChrZXksIHZhbHVlLCB0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u5pyJ5pWI5pe26Ze0CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFJlZGlz6ZSuCisgICAgICogQHBhcmFtIHRpbWVvdXQg6LaF5pe25pe26Ze0CisgICAgICogQHJldHVybiB0cnVlPeiuvue9ruaIkOWKn++8m2ZhbHNlPeiuvue9ruWksei0pQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGlyZShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBsb25nIHRpbWVvdXQpCisgICAgeworICAgICAgICByZXR1cm4gZXhwaXJlKGtleSwgdGltZW91dCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u5pyJ5pWI5pe26Ze0CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFJlZGlz6ZSuCisgICAgICogQHBhcmFtIHRpbWVvdXQg6LaF5pe25pe26Ze0CisgICAgICogQHBhcmFtIHVuaXQg5pe26Ze05Y2V5L2NCisgICAgICogQHJldHVybiB0cnVlPeiuvue9ruaIkOWKn++8m2ZhbHNlPeiuvue9ruWksei0pQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGlyZShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBsb25nIHRpbWVvdXQsIGZpbmFsIFRpbWVVbml0IHVuaXQpCisgICAgeworICAgICAgICByZXR1cm4gcmVkaXNUZW1wbGF0ZS5leHBpcmUoa2V5LCB0aW1lb3V0LCB1bml0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bmnInmlYjml7bpl7QKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgUmVkaXPplK4KKyAgICAgKiBAcmV0dXJuIOacieaViOaXtumXtAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEV4cGlyZShmaW5hbCBTdHJpbmcga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZGlzVGVtcGxhdGUuZ2V0RXhwaXJlKGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yik5patIGtleeaYr+WQpuWtmOWcqAorICAgICAqCisgICAgICogQHBhcmFtIGtleSDplK4KKyAgICAgKiBAcmV0dXJuIHRydWUg5a2Y5ZyoIGZhbHNl5LiN5a2Y5ZyoCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gaGFzS2V5KFN0cmluZyBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gcmVkaXNUZW1wbGF0ZS5oYXNLZXkoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflvpfnvJPlrZjnmoTln7rmnKzlr7nosaHjgIIKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkg57yT5a2Y6ZSu5YC8CisgICAgICogQHJldHVybiDnvJPlrZjplK7lgLzlr7nlupTnmoTmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0Q2FjaGVPYmplY3QoZmluYWwgU3RyaW5nIGtleSkKKyAgICB7CisgICAgICAgIFZhbHVlT3BlcmF0aW9uczxTdHJpbmcsIFQ+IG9wZXJhdGlvbiA9IHJlZGlzVGVtcGxhdGUub3BzRm9yVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbi5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTljZXkuKrlr7nosaEKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVPYmplY3QoZmluYWwgU3RyaW5nIGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiByZWRpc1RlbXBsYXRlLmRlbGV0ZShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOmbhuWQiOWvueixoQorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24g5aSa5Liq5a+56LGhCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCisgICAgeworICAgICAgICByZXR1cm4gcmVkaXNUZW1wbGF0ZS5kZWxldGUoY29sbGVjdGlvbikgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIOe8k+WtmExpc3TmlbDmja4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkg57yT5a2Y55qE6ZSu5YC8CisgICAgICogQHBhcmFtIGRhdGFMaXN0IOW+hee8k+WtmOeahExpc3TmlbDmja4KKyAgICAgKiBAcmV0dXJuIOe8k+WtmOeahOWvueixoQorICAgICAqLworICAgIHB1YmxpYyA8VD4gbG9uZyBzZXRDYWNoZUxpc3QoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgTGlzdDxUPiBkYXRhTGlzdCkKKyAgICB7CisgICAgICAgIExvbmcgY291bnQgPSByZWRpc1RlbXBsYXRlLm9wc0Zvckxpc3QoKS5yaWdodFB1c2hBbGwoa2V5LCBkYXRhTGlzdCk7CisgICAgICAgIHJldHVybiBjb3VudCA9PSBudWxsID8gMCA6IGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+W+l+e8k+WtmOeahGxpc3Tlr7nosaEKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkg57yT5a2Y55qE6ZSu5YC8CisgICAgICogQHJldHVybiDnvJPlrZjplK7lgLzlr7nlupTnmoTmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0Q2FjaGVMaXN0KGZpbmFsIFN0cmluZyBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gcmVkaXNUZW1wbGF0ZS5vcHNGb3JMaXN0KCkucmFuZ2Uoa2V5LCAwLCAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog57yT5a2YU2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IOe8k+WtmOmUruWAvAorICAgICAqIEBwYXJhbSBkYXRhU2V0IOe8k+WtmOeahOaVsOaNrgorICAgICAqIEByZXR1cm4g57yT5a2Y5pWw5o2u55qE5a+56LGhCisgICAgICovCisgICAgcHVibGljIDxUPiBCb3VuZFNldE9wZXJhdGlvbnM8U3RyaW5nLCBUPiBzZXRDYWNoZVNldChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTZXQ8VD4gZGF0YVNldCkKKyAgICB7CisgICAgICAgIEJvdW5kU2V0T3BlcmF0aW9uczxTdHJpbmcsIFQ+IHNldE9wZXJhdGlvbiA9IHJlZGlzVGVtcGxhdGUuYm91bmRTZXRPcHMoa2V5KTsKKyAgICAgICAgSXRlcmF0b3I8VD4gaXQgPSBkYXRhU2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldE9wZXJhdGlvbi5hZGQoaXQubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0T3BlcmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+W+l+e8k+WtmOeahHNldAorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFNldDxUPiBnZXRDYWNoZVNldChmaW5hbCBTdHJpbmcga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZGlzVGVtcGxhdGUub3BzRm9yU2V0KCkubWVtYmVycyhrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOe8k+WtmE1hcAorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEBwYXJhbSBkYXRhTWFwCisgICAgICovCisgICAgcHVibGljIDxUPiB2b2lkIHNldENhY2hlTWFwKGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIE1hcDxTdHJpbmcsIFQ+IGRhdGFNYXApCisgICAgeworICAgICAgICBpZiAoZGF0YU1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpc1RlbXBsYXRlLm9wc0Zvckhhc2goKS5wdXRBbGwoa2V5LCBkYXRhTWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+W+l+e8k+WtmOeahE1hcAorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IE1hcDxTdHJpbmcsIFQ+IGdldENhY2hlTWFwKGZpbmFsIFN0cmluZyBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gcmVkaXNUZW1wbGF0ZS5vcHNGb3JIYXNoKCkuZW50cmllcyhrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOW+gEhhc2jkuK3lrZjlhaXmlbDmja4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgUmVkaXPplK4KKyAgICAgKiBAcGFyYW0gaEtleSBIYXNo6ZSuCisgICAgICogQHBhcmFtIHZhbHVlIOWAvAorICAgICAqLworICAgIHB1YmxpYyA8VD4gdm9pZCBzZXRDYWNoZU1hcFZhbHVlKGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyBoS2V5LCBmaW5hbCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmVkaXNUZW1wbGF0ZS5vcHNGb3JIYXNoKCkucHV0KGtleSwgaEtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlkhhc2jkuK3nmoTmlbDmja4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgUmVkaXPplK4KKyAgICAgKiBAcGFyYW0gaEtleSBIYXNo6ZSuCisgICAgICogQHJldHVybiBIYXNo5Lit55qE5a+56LGhCisgICAgICovCisgICAgcHVibGljIDxUPiBUIGdldENhY2hlTWFwVmFsdWUoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIGhLZXkpCisgICAgeworICAgICAgICBIYXNoT3BlcmF0aW9uczxTdHJpbmcsIFN0cmluZywgVD4gb3BzRm9ySGFzaCA9IHJlZGlzVGVtcGxhdGUub3BzRm9ySGFzaCgpOworICAgICAgICByZXR1cm4gb3BzRm9ySGFzaC5nZXQoa2V5LCBoS2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blpJrkuKpIYXNo5Lit55qE5pWw5o2uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFJlZGlz6ZSuCisgICAgICogQHBhcmFtIGhLZXlzIEhhc2jplK7pm4blkIgKKyAgICAgKiBAcmV0dXJuIEhhc2jlr7nosaHpm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0TXVsdGlDYWNoZU1hcFZhbHVlKGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIENvbGxlY3Rpb248T2JqZWN0PiBoS2V5cykKKyAgICB7CisgICAgICAgIHJldHVybiByZWRpc1RlbXBsYXRlLm9wc0Zvckhhc2goKS5tdWx0aUdldChrZXksIGhLZXlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaRIYXNo5Lit55qE5p+Q5p2h5pWw5o2uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFJlZGlz6ZSuCisgICAgICogQHBhcmFtIGhLZXkgSGFzaOmUrgorICAgICAqIEByZXR1cm4g5piv5ZCm5oiQ5YqfCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlQ2FjaGVNYXBWYWx1ZShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgaEtleSkKKyAgICB7CisgICAgICAgIHJldHVybiByZWRpc1RlbXBsYXRlLm9wc0Zvckhhc2goKS5kZWxldGUoa2V5LCBoS2V5KSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635b6X57yT5a2Y55qE5Z+65pys5a+56LGh5YiX6KGoCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiDlrZfnrKbkuLLliY3nvIAKKyAgICAgKiBAcmV0dXJuIOWvueixoeWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4ga2V5cyhmaW5hbCBTdHJpbmcgcGF0dGVybikKKyAgICB7CisgICAgICAgIHJldHVybiByZWRpc1RlbXBsYXRlLmtleXMocGF0dGVybik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3RleHQvQ2hhcnNldEtpdC5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3RleHQvQ2hhcnNldEtpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTI0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvdGV4dC9DaGFyc2V0S2l0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiDlrZfnrKbpm4blt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQ2hhcnNldEtpdAoreworICAgIC8qKiBJU08tODg1OS0xICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPXzg4NTlfMSA9ICJJU08tODg1OS0xIjsKKyAgICAvKiogVVRGLTggKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7CisgICAgLyoqIEdCSyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdCSyA9ICJHQksiOworCisgICAgLyoqIElTTy04ODU5LTEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUlNFVF9JU09fODg1OV8xID0gQ2hhcnNldC5mb3JOYW1lKElTT184ODU5XzEpOworICAgIC8qKiBVVEYtOCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSU0VUX1VURl84ID0gQ2hhcnNldC5mb3JOYW1lKFVURl84KTsKKyAgICAvKiogR0JLICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IENIQVJTRVRfR0JLID0gQ2hhcnNldC5mb3JOYW1lKEdCSyk7CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpDaGFyc2V05a+56LGhCisgICAgICogCisgICAgICogQHBhcmFtIGNoYXJzZXQg5a2X56ym6ZuG77yM5Li656m65YiZ6L+U5Zue6buY6K6k5a2X56ym6ZuGCisgICAgICogQHJldHVybiBDaGFyc2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyc2V0IGNoYXJzZXQoU3RyaW5nIGNoYXJzZXQpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eShjaGFyc2V0KSA/IENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSA6IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLlrZfnrKbkuLLnmoTlrZfnrKbpm4bnvJbnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlIOWtl+espuS4sgorICAgICAqIEBwYXJhbSBzcmNDaGFyc2V0IOa6kOWtl+espumbhu+8jOm7mOiupElTTy04ODU5LTEKKyAgICAgKiBAcGFyYW0gZGVzdENoYXJzZXQg55uu5qCH5a2X56ym6ZuG77yM6buY6K6kVVRGLTgKKyAgICAgKiBAcmV0dXJuIOi9rOaNouWQjueahOWtl+espumbhgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHNyY0NoYXJzZXQsIFN0cmluZyBkZXN0Q2hhcnNldCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb252ZXJ0KHNvdXJjZSwgQ2hhcnNldC5mb3JOYW1lKHNyY0NoYXJzZXQpLCBDaGFyc2V0LmZvck5hbWUoZGVzdENoYXJzZXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLlrZfnrKbkuLLnmoTlrZfnrKbpm4bnvJbnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlIOWtl+espuS4sgorICAgICAqIEBwYXJhbSBzcmNDaGFyc2V0IOa6kOWtl+espumbhu+8jOm7mOiupElTTy04ODU5LTEKKyAgICAgKiBAcGFyYW0gZGVzdENoYXJzZXQg55uu5qCH5a2X56ym6ZuG77yM6buY6K6kVVRGLTgKKyAgICAgKiBAcmV0dXJuIOi9rOaNouWQjueahOWtl+espumbhgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHNvdXJjZSwgQ2hhcnNldCBzcmNDaGFyc2V0LCBDaGFyc2V0IGRlc3RDaGFyc2V0KQorICAgIHsKKyAgICAgICAgaWYgKG51bGwgPT0gc3JjQ2hhcnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjQ2hhcnNldCA9IFN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IGRlc3RDaGFyc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0Q2hhcnNldCA9IFN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzb3VyY2UpIHx8IHNyY0NoYXJzZXQuZXF1YWxzKGRlc3RDaGFyc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzb3VyY2UuZ2V0Qnl0ZXMoc3JjQ2hhcnNldCksIGRlc3RDaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIOezu+e7n+Wtl+espumbhue8lueggQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5c3RlbUNoYXJzZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKS5uYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3RleHQvQ29udmVydC5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3RleHQvQ29udmVydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjlhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2NvcmUvdGV4dC9Db252ZXJ0LmphdmEKQEAgLTAsMCArMSwxMDEwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKKworLyoqCisgKiDnsbvlnovovazmjaLlmagKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBDb252ZXJ0Cit7CisgICAgLyoqCisgICAgICog6L2s5o2i5Li65a2X56ym5LiyPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4um51bGzvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyKE9iamVjdCB2YWx1ZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChudWxsID09IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4uuWtl+espuS4sjxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLo8Y29kZT5udWxsPC9jb2RlPu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxjb2RlPm51bGw8L2NvZGU+PGJyPgorICAgICAqIOi9rOaNouWksei0peS4jeS8muaKpemUmQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIOiiq+i9rOaNoueahOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHIoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyKHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLrlrZfnrKY8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li6bnVsbO+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIOi9rOaNoumUmeivr+aXtueahOm7mOiupOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyYWN0ZXIgdG9DaGFyKE9iamVjdCB2YWx1ZSwgQ2hhcmFjdGVyIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChudWxsID09IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChDaGFyYWN0ZXIpIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZVN0ci5jaGFyQXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li65a2X56ymPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4ujxjb2RlPm51bGw8L2NvZGU+77yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJhY3RlciB0b0NoYXIoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQ2hhcih2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6Ynl0ZTxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLo8Y29kZT5udWxsPC9jb2RlPu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIOi9rOaNoumUmeivr+aXtueahOm7mOiupOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCeXRlIHRvQnl0ZShPYmplY3QgdmFsdWUsIEJ5dGUgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChCeXRlKSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZVN0ciA9IHRvU3RyKHZhbHVlLCBudWxsKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodmFsdWVTdHIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZS5wYXJzZUJ5dGUodmFsdWVTdHIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4umJ5dGU8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li6PGNvZGU+bnVsbDwvY29kZT7vvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZSB0b0J5dGUoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQnl0ZSh2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6U2hvcnQ8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li6PGNvZGU+bnVsbDwvY29kZT7vvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2hvcnQgdG9TaG9ydChPYmplY3QgdmFsdWUsIFNob3J0IGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFNob3J0KSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHIgPSB0b1N0cih2YWx1ZSwgbnVsbCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbHVlU3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNob3J0LnBhcnNlU2hvcnQodmFsdWVTdHIudHJpbSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpTaG9ydDxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLo8Y29kZT5udWxsPC9jb2RlPu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxjb2RlPm51bGw8L2NvZGU+PGJyPgorICAgICAqIOi9rOaNouWksei0peS4jeS8muaKpemUmQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIOiiq+i9rOaNoueahOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTaG9ydCB0b1Nob3J0KE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b1Nob3J0KHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpOdW1iZXI8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li656m677yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGJyPgorICAgICAqIOi9rOaNouWksei0peS4jeS8muaKpemUmQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIOiiq+i9rOaNoueahOWAvAorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUg6L2s5o2i6ZSZ6K+v5pe255qE6buY6K6k5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciB0b051bWJlcihPYmplY3QgdmFsdWUsIE51bWJlciBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTnVtYmVyKSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHIgPSB0b1N0cih2YWx1ZSwgbnVsbCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbHVlU3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpLnBhcnNlKHZhbHVlU3RyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpOdW1iZXI8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li656m677yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciB0b051bWJlcihPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdG9OdW1iZXIodmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4umludDxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciB0b0ludChPYmplY3QgdmFsdWUsIEludGVnZXIgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlU3RyLnRyaW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6aW50PGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4ujxjb2RlPm51bGw8L2NvZGU+77yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgdG9JbnQoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvSW50KHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpJbnRlZ2Vy5pWw57uEPGJyPgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlcltdIHRvSW50QXJyYXkoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiB0b0ludEFycmF5KCIsIiwgc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpMb25n5pWw57uEPGJyPgorICAgICAqCisgICAgICogQHBhcmFtIHN0ciDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9uZ1tdIHRvTG9uZ0FycmF5KFN0cmluZyBzdHIpCisgICAgeworICAgICAgICByZXR1cm4gdG9Mb25nQXJyYXkoIiwiLCBzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4ukludGVnZXLmlbDnu4Q8YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQg5YiG6ZqU56ymCisgICAgICogQHBhcmFtIHNwbGl0IOiiq+i9rOaNoueahOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyW10gdG9JbnRBcnJheShTdHJpbmcgc3BsaXQsIFN0cmluZyBzdHIpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShzdHIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJbXSB7fTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBhcnIgPSBzdHIuc3BsaXQoc3BsaXQpOworICAgICAgICBmaW5hbCBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW2Fyci5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSW50ZWdlciB2ID0gdG9JbnQoYXJyW2ldLCAwKTsKKyAgICAgICAgICAgIGludHNbaV0gPSB2OworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4ukxvbmfmlbDnu4Q8YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQg5YiG6ZqU56ymCisgICAgICogQHBhcmFtIHN0ciDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9uZ1tdIHRvTG9uZ0FycmF5KFN0cmluZyBzcGxpdCwgU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1tdIHt9OworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGFyciA9IHN0ci5zcGxpdChzcGxpdCk7CisgICAgICAgIGZpbmFsIExvbmdbXSBsb25ncyA9IG5ldyBMb25nW2Fyci5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTG9uZyB2ID0gdG9Mb25nKGFycltpXSwgbnVsbCk7CisgICAgICAgICAgICBsb25nc1tpXSA9IHY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4ulN0cmluZ+aVsOe7hDxicj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHIg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRvU3RyQXJyYXkoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge307CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RyQXJyYXkoIiwiLCBzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4ulN0cmluZ+aVsOe7hDxicj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGxpdCDliIbpmpTnrKYKKyAgICAgKiBAcGFyYW0gc3BsaXQg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRvU3RyQXJyYXkoU3RyaW5nIHNwbGl0LCBTdHJpbmcgc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ci5zcGxpdChzcGxpdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6bG9uZzxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9uZyB0b0xvbmcoT2JqZWN0IHZhbHVlLCBMb25nIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTG9uZykgdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHIgPSB0b1N0cih2YWx1ZSwgbnVsbCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbHVlU3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5pSv5oyB56eR5a2m6K6h5pWw5rOVCisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWVTdHIudHJpbSgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpsb25nPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4ujxjb2RlPm51bGw8L2NvZGU+77yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExvbmcgdG9Mb25nKE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0xvbmcodmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4umRvdWJsZTxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRG91YmxlIHRvRG91YmxlKE9iamVjdCB2YWx1ZSwgRG91YmxlIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChEb3VibGUpIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHIgPSB0b1N0cih2YWx1ZSwgbnVsbCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbHVlU3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5pSv5oyB56eR5a2m6K6h5pWw5rOVCisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWVTdHIudHJpbSgpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4umRvdWJsZTxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRG91YmxlIHRvRG91YmxlKE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0RvdWJsZSh2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6RmxvYXQ8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li656m677yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGJyPgorICAgICAqIOi9rOaNouWksei0peS4jeS8muaKpemUmQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIOiiq+i9rOaNoueahOWAvAorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUg6L2s5o2i6ZSZ6K+v5pe255qE6buY6K6k5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZsb2F0IHRvRmxvYXQoT2JqZWN0IHZhbHVlLCBGbG9hdCBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChGbG9hdCkgdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KHZhbHVlU3RyLnRyaW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6RmxvYXQ8YnI+CisgICAgICog5aaC5p6c57uZ5a6a55qE5YC85Li656m677yM5oiW6ICF6L2s5o2i5aSx6LSl77yM6L+U5Zue6buY6K6k5YC8PGNvZGU+bnVsbDwvY29kZT48YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZsb2F0IHRvRmxvYXQoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvRmxvYXQodmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOaNouS4umJvb2xlYW48YnI+CisgICAgICogU3RyaW5n5pSv5oyB55qE5YC85Li677yadHJ1ZeOAgWZhbHNl44CBeWVz44CBb2vjgIFub++8jDEsMCDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiB0b0Jvb2woT2JqZWN0IHZhbHVlLCBCb29sZWFuIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWVTdHIgPSB2YWx1ZVN0ci50cmltKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgc3dpdGNoICh2YWx1ZVN0cikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAidHJ1ZSI6CisgICAgICAgICAgICBjYXNlICJ5ZXMiOgorICAgICAgICAgICAgY2FzZSAib2siOgorICAgICAgICAgICAgY2FzZSAiMSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJmYWxzZSI6CisgICAgICAgICAgICBjYXNlICJubyI6CisgICAgICAgICAgICBjYXNlICIwIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpib29sZWFuPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4uuepuu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxjb2RlPm51bGw8L2NvZGU+PGJyPgorICAgICAqIOi9rOaNouWksei0peS4jeS8muaKpemUmQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIOiiq+i9rOaNoueahOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIHRvQm9vbChPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdG9Cb29sKHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpFbnVt5a+56LGhPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4uuepuu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxicj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBFbnVt55qEQ2xhc3MKKyAgICAgKiBAcGFyYW0gdmFsdWUg5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIEVudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRSB0b0VudW0oQ2xhc3M8RT4gY2xhenosIE9iamVjdCB2YWx1ZSwgRSBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenouaXNBc3NpZ25hYmxlRnJvbSh2YWx1ZS5nZXRDbGFzcygpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBFIG15RSA9IChFKSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBteUU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoY2xhenosIHZhbHVlU3RyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpFbnVt5a+56LGhPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4uuepuu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxjb2RlPm51bGw8L2NvZGU+PGJyPgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IEVudW3nmoRDbGFzcworICAgICAqIEBwYXJhbSB2YWx1ZSDlgLwKKyAgICAgKiBAcmV0dXJuIEVudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRSB0b0VudW0oQ2xhc3M8RT4gY2xhenosIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0VudW0oY2xhenosIHZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpCaWdJbnRlZ2VyPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4uuepuu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIOi9rOaNoumUmeivr+aXtueahOm7mOiupOWAvAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIHRvQmlnSW50ZWdlcihPYmplY3QgdmFsdWUsIEJpZ0ludGVnZXIgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmlnSW50ZWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKChMb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyID0gdG9TdHIodmFsdWUsIG51bGwpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZVN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih2YWx1ZVN0cik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6QmlnSW50ZWdlcjxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8Y29kZT5udWxsPC9jb2RlPjxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciB0b0JpZ0ludGVnZXIoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQmlnSW50ZWdlcih2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L2s5o2i5Li6QmlnRGVjaW1hbDxicj4KKyAgICAgKiDlpoLmnpznu5nlrprnmoTlgLzkuLrnqbrvvIzmiJbogIXovazmjaLlpLHotKXvvIzov5Tlm57pu5jorqTlgLw8YnI+CisgICAgICog6L2s5o2i5aSx6LSl5LiN5Lya5oql6ZSZCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUg6KKr6L2s5o2i55qE5YC8CisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSDovazmjaLplJnor6/ml7bnmoTpu5jorqTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCB0b0JpZ0RlY2ltYWwoT2JqZWN0IHZhbHVlLCBCaWdEZWNpbWFsIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoQmlnRGVjaW1hbCkgdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKChMb25nKSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC52YWx1ZU9mKChEb3VibGUpIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoKEludGVnZXIpIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHIgPSB0b1N0cih2YWx1ZSwgbnVsbCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHZhbHVlU3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHZhbHVlU3RyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDovazmjaLkuLpCaWdEZWNpbWFsPGJyPgorICAgICAqIOWmguaenOe7meWumueahOWAvOS4uuepuu+8jOaIluiAhei9rOaNouWksei0pe+8jOi/lOWbnum7mOiupOWAvDxicj4KKyAgICAgKiDovazmjaLlpLHotKXkuI3kvJrmiqXplJkKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSDooqvovazmjaLnmoTlgLwKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCB0b0JpZ0RlY2ltYWwoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQmlnRGVjaW1hbCh2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG5a+56LGh6L2s5Li65a2X56ym5LiyPGJyPgorICAgICAqIDHjgIFCeXRl5pWw57uE5ZKMQnl0ZUJ1ZmZlcuS8muiiq+i9rOaNouS4uuWvueW6lOWtl+espuS4sueahOaVsOe7hCAy44CB5a+56LGh5pWw57uE5Lya6LCD55SoQXJyYXlzLnRvU3RyaW5n5pa55rOVCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIOWvueixoQorICAgICAqIEByZXR1cm4g5a2X56ym5LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXRmOFN0cihPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cihvYmosIENoYXJzZXRLaXQuQ0hBUlNFVF9VVEZfOCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG5a+56LGh6L2s5Li65a2X56ym5LiyPGJyPgorICAgICAqIDHjgIFCeXRl5pWw57uE5ZKMQnl0ZUJ1ZmZlcuS8muiiq+i9rOaNouS4uuWvueW6lOWtl+espuS4sueahOaVsOe7hCAy44CB5a+56LGh5pWw57uE5Lya6LCD55SoQXJyYXlzLnRvU3RyaW5n5pa55rOVCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIOWvueixoQorICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSDlrZfnrKbpm4YKKyAgICAgKiBAcmV0dXJuIOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cihPYmplY3Qgb2JqLCBTdHJpbmcgY2hhcnNldE5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gc3RyKG9iaiwgQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG5a+56LGh6L2s5Li65a2X56ym5LiyPGJyPgorICAgICAqIDHjgIFCeXRl5pWw57uE5ZKMQnl0ZUJ1ZmZlcuS8muiiq+i9rOaNouS4uuWvueW6lOWtl+espuS4sueahOaVsOe7hCAy44CB5a+56LGh5pWw57uE5Lya6LCD55SoQXJyYXlzLnRvU3RyaW5n5pa55rOVCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIOWvueixoQorICAgICAqIEBwYXJhbSBjaGFyc2V0IOWtl+espumbhgorICAgICAqIEByZXR1cm4g5a2X56ym5LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyKE9iamVjdCBvYmosIENoYXJzZXQgY2hhcnNldCkKKyAgICB7CisgICAgICAgIGlmIChudWxsID09IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgb2JqOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cigoYnl0ZVtdKSBvYmosIGNoYXJzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJ5dGVbXSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQXJyYXlVdGlscy50b1ByaW1pdGl2ZSgoQnl0ZVtdKSBvYmopOworICAgICAgICAgICAgcmV0dXJuIHN0cihieXRlcywgY2hhcnNldCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cigoQnl0ZUJ1ZmZlcikgb2JqLCBjaGFyc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCGYnl0ZeaVsOe7hOi9rOS4uuWtl+espuS4sgorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIGJ5dGXmlbDnu4QKKyAgICAgKiBAcGFyYW0gY2hhcnNldCDlrZfnrKbpm4YKKyAgICAgKiBAcmV0dXJuIOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cihieXRlW10gYnl0ZXMsIFN0cmluZyBjaGFyc2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cihieXRlcywgU3RyaW5nVXRpbHMuaXNFbXB0eShjaGFyc2V0KSA/IENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSA6IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Kej56CB5a2X6IqC56CBCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSDlrZfnrKbkuLIKKyAgICAgKiBAcGFyYW0gY2hhcnNldCDlrZfnrKbpm4bvvIzlpoLmnpzmraTlrZfmrrXkuLrnqbrvvIzliJnop6PnoIHnmoTnu5Pmnpzlj5blhrPkuo7lubPlj7AKKyAgICAgKiBAcmV0dXJuIOino+eggeWQjueahOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cihieXRlW10gZGF0YSwgQ2hhcnNldCBjaGFyc2V0KQorICAgIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCA9PSBjaGFyc2V0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlsIbnvJbnoIHnmoRieXRlQnVmZmVy5pWw5o2u6L2s5o2i5Li65a2X56ym5LiyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSDmlbDmja4KKyAgICAgKiBAcGFyYW0gY2hhcnNldCDlrZfnrKbpm4bvvIzlpoLmnpzkuLrnqbrkvb/nlKjlvZPliY3ns7vnu5/lrZfnrKbpm4YKKyAgICAgKiBAcmV0dXJuIOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cihCeXRlQnVmZmVyIGRhdGEsIFN0cmluZyBjaGFyc2V0KQorICAgIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyKGRhdGEsIENoYXJzZXQuZm9yTmFtZShjaGFyc2V0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG57yW56CB55qEYnl0ZUJ1ZmZlcuaVsOaNrui9rOaNouS4uuWtl+espuS4sgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEg5pWw5o2uCisgICAgICogQHBhcmFtIGNoYXJzZXQg5a2X56ym6ZuG77yM5aaC5p6c5Li656m65L2/55So5b2T5YmN57O757uf5a2X56ym6ZuGCisgICAgICogQHJldHVybiDlrZfnrKbkuLIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHIoQnl0ZUJ1ZmZlciBkYXRhLCBDaGFyc2V0IGNoYXJzZXQpCisgICAgeworICAgICAgICBpZiAobnVsbCA9PSBjaGFyc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFyc2V0LmRlY29kZShkYXRhKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIOWFqOinkuWNiuinkui9rOaNogorICAgIC8qKgorICAgICAqIOWNiuinkui9rOWFqOinkgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIOWFqOinkuWtl+espuS4si4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1NCQyhTdHJpbmcgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gdG9TQkMoaW5wdXQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWNiuinkui9rOWFqOinkgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IFN0cmluZworICAgICAqIEBwYXJhbSBub3RDb252ZXJ0U2V0IOS4jeabv+aNoueahOWtl+espumbhuWQiAorICAgICAqIEByZXR1cm4g5YWo6KeS5a2X56ym5LiyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU0JDKFN0cmluZyBpbnB1dCwgU2V0PENoYXJhY3Rlcj4gbm90Q29udmVydFNldCkKKyAgICB7CisgICAgICAgIGNoYXJbXSBjID0gaW5wdXQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBub3RDb252ZXJ0U2V0ICYmIG5vdENvbnZlcnRTZXQuY29udGFpbnMoY1tpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g6Lez6L+H5LiN5pu/5o2i55qE5a2X56ymCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjW2ldID09ICcgJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjW2ldID0gJ1x1MzAwMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjW2ldIDwgJ1wxNzcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNbaV0gPSAoY2hhcikgKGNbaV0gKyA2NTI0OCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlhajop5LovazljYrop5IKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBTdHJpbmcuCisgICAgICogQHJldHVybiDljYrop5LlrZfnrKbkuLIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0RCQyhTdHJpbmcgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gdG9EQkMoaW5wdXQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOabv+aNouWFqOinkuS4uuWNiuinkgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQg5paH5pysCisgICAgICogQHBhcmFtIG5vdENvbnZlcnRTZXQg5LiN5pu/5o2i55qE5a2X56ym6ZuG5ZCICisgICAgICogQHJldHVybiDmm7/mjaLlkI7nmoTlrZfnrKYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0RCQyhTdHJpbmcgdGV4dCwgU2V0PENoYXJhY3Rlcj4gbm90Q29udmVydFNldCkKKyAgICB7CisgICAgICAgIGNoYXJbXSBjID0gdGV4dC50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IG5vdENvbnZlcnRTZXQgJiYgbm90Q29udmVydFNldC5jb250YWlucyhjW2ldKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyDot7Pov4fkuI3mm7/mjaLnmoTlrZfnrKYKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNbaV0gPT0gJ1x1MzAwMCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY1tpXSA9ICcgJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNbaV0gPiAnXHVGRjAwJyAmJiBjW2ldIDwgJ1x1RkY1RicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY1tpXSA9IChjaGFyKSAoY1tpXSAtIDY1MjQ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gbmV3IFN0cmluZyhjKTsKKworICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaVsOWtl+mHkemineWkp+WGmei9rOaNoiDlhYjlhpnkuKrlrozmlbTnmoTnhLblkI7lsIblpoLpm7bmi77mm7/mjaLmiJDpm7YKKyAgICAgKgorICAgICAqIEBwYXJhbSBuIOaVsOWtlworICAgICAqIEByZXR1cm4g5Lit5paH5aSn5YaZ5pWw5a2XCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGlnaXRVcHBlcmNhc2UoZG91YmxlIG4pCisgICAgeworICAgICAgICBTdHJpbmdbXSBmcmFjdGlvbiA9IHsgIuinkiIsICLliIYiIH07CisgICAgICAgIFN0cmluZ1tdIGRpZ2l0ID0geyAi6Zu2IiwgIuWjuSIsICLotLAiLCAi5Y+BIiwgIuiChiIsICLkvI0iLCAi6ZmGIiwgIuafkiIsICLmjYwiLCAi546WIiB9OworICAgICAgICBTdHJpbmdbXVtdIHVuaXQgPSB7IHsgIuWFgyIsICLkuIciLCAi5Lq/IiB9LCB7ICIiLCAi5ou+IiwgIuS9sCIsICLku58iIH0gfTsKKworICAgICAgICBTdHJpbmcgaGVhZCA9IG4gPCAwID8gIui0nyIgOiAiIjsKKyAgICAgICAgbiA9IE1hdGguYWJzKG4pOworCisgICAgICAgIFN0cmluZyBzID0gIiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhY3Rpb24ubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOS8mOWMlmRvdWJsZeiuoeeul+eyvuW6puS4ouWksemXrumimAorICAgICAgICAgICAgQmlnRGVjaW1hbCBuTnVtID0gbmV3IEJpZ0RlY2ltYWwobik7CisgICAgICAgICAgICBCaWdEZWNpbWFsIGRlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbCgxMCk7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHNjYWxlID0gbk51bS5tdWx0aXBseShkZWNpbWFsKS5zZXRTY2FsZSgyLCBSb3VuZGluZ01vZGUuSEFMRl9FVkVOKTsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gc2NhbGUuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIHMgKz0gKGRpZ2l0WyhpbnQpIChNYXRoLmZsb29yKGQgKiBNYXRoLnBvdygxMCwgaSkpICUgMTApXSArIGZyYWN0aW9uW2ldKS5yZXBsYWNlQWxsKCIo6Zu2LikrIiwgIiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgeworICAgICAgICAgICAgcyA9ICLmlbQiOworICAgICAgICB9CisgICAgICAgIGludCBpbnRlZ2VyUGFydCA9IChpbnQpIE1hdGguZmxvb3Iobik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0WzBdLmxlbmd0aCAmJiBpbnRlZ2VyUGFydCA+IDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHAgPSAiIjsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdW5pdFsxXS5sZW5ndGggJiYgbiA+IDA7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gZGlnaXRbaW50ZWdlclBhcnQgJSAxMF0gKyB1bml0WzFdW2pdICsgcDsKKyAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydCA9IGludGVnZXJQYXJ0IC8gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gcC5yZXBsYWNlQWxsKCIo6Zu2Likq6Zu2JCIsICIiKS5yZXBsYWNlQWxsKCJeJCIsICLpm7YiKSArIHVuaXRbMF1baV0gKyBzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWFkICsgcy5yZXBsYWNlQWxsKCIo6Zu2Likq6Zu25YWDIiwgIuWFgyIpLnJlcGxhY2VGaXJzdCgiKOmbti4pKyIsICIiKS5yZXBsYWNlQWxsKCIo6Zu2LikrIiwgIumbtiIpLnJlcGxhY2VBbGwoIl7mlbQkIiwgIumbtuWFg+aVtCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS90ZXh0L1N0ckZvcm1hdHRlci5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9jb3JlL3RleHQvU3RyRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4YWM3NwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vY29yZS90ZXh0L1N0ckZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnRleHQ7CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOWtl+espuS4suagvOW8j+WMlgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJGb3JtYXR0ZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9KU09OID0gInt9IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19CQUNLU0xBU0ggPSAnXFwnOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RFTElNX1NUQVJUID0gJ3snOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0RFTElNX0VORCA9ICd9JzsKKworICAgIC8qKgorICAgICAqIOagvOW8j+WMluWtl+espuS4sjxicj4KKyAgICAgKiDmraTmlrnms5Xlj6rmmK/nroDljZXlsIbljaDkvY3nrKYge30g5oyJ54Wn6aG65bqP5pu/5o2i5Li65Y+C5pWwPGJyPgorICAgICAqIOWmguaenOaDs+i+k+WHuiB7fSDkvb/nlKggXFzovazkuYkgeyDljbPlj6/vvIzlpoLmnpzmg7PovpPlh7oge30g5LmL5YmN55qEIFwg5L2/55So5Y+M6L2s5LmJ56ymIFxcXFwg5Y2z5Y+vPGJyPgorICAgICAqIOS+i++8mjxicj4KKyAgICAgKiDpgJrluLjkvb/nlKjvvJpmb3JtYXQoInRoaXMgaXMge30gZm9yIHt9IiwgImEiLCAiYiIpIC0+IHRoaXMgaXMgYSBmb3IgYjxicj4KKyAgICAgKiDovazkuYl7fe+8miBmb3JtYXQoInRoaXMgaXMgXFx7fSBmb3Ige30iLCAiYSIsICJiIikgLT4gdGhpcyBpcyBce30gZm9yIGE8YnI+CisgICAgICog6L2s5LmJXO+8miBmb3JtYXQoInRoaXMgaXMgXFxcXHt9IGZvciB7fSIsICJhIiwgImIiKSAtPiB0aGlzIGlzIFxhIGZvciBiPGJyPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJQYXR0ZXJuIOWtl+espuS4suaooeadvworICAgICAqIEBwYXJhbSBhcmdBcnJheSDlj4LmlbDliJfooagKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBTdHJpbmcgc3RyUGF0dGVybiwgZmluYWwgT2JqZWN0Li4uIGFyZ0FycmF5KQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyUGF0dGVybikgfHwgU3RyaW5nVXRpbHMuaXNFbXB0eShhcmdBcnJheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJQYXR0ZXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBzdHJQYXR0ZXJuTGVuZ3RoID0gc3RyUGF0dGVybi5sZW5ndGgoKTsKKworICAgICAgICAvLyDliJ3lp4vljJblrprkuYnlpb3nmoTplb/luqbku6Xojrflvpfmm7Tlpb3nmoTmgKfog70KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyUGF0dGVybkxlbmd0aCArIDUwKTsKKworICAgICAgICBpbnQgaGFuZGxlZFBvc2l0aW9uID0gMDsKKyAgICAgICAgaW50IGRlbGltSW5kZXg7Ly8g5Y2g5L2N56ym5omA5Zyo5L2N572uCisgICAgICAgIGZvciAoaW50IGFyZ0luZGV4ID0gMDsgYXJnSW5kZXggPCBhcmdBcnJheS5sZW5ndGg7IGFyZ0luZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGltSW5kZXggPSBzdHJQYXR0ZXJuLmluZGV4T2YoRU1QVFlfSlNPTiwgaGFuZGxlZFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChkZWxpbUluZGV4ID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoYW5kbGVkUG9zaXRpb24gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJQYXR0ZXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAvLyDlrZfnrKbkuLLmqKHmnb/liankvZnpg6jliIbkuI3lho3ljIXlkKvljaDkvY3nrKbvvIzliqDlhaXliankvZnpg6jliIblkI7ov5Tlm57nu5PmnpwKKyAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoc3RyUGF0dGVybiwgaGFuZGxlZFBvc2l0aW9uLCBzdHJQYXR0ZXJuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGltSW5kZXggPiAwICYmIHN0clBhdHRlcm4uY2hhckF0KGRlbGltSW5kZXggLSAxKSA9PSBDX0JBQ0tTTEFTSCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbUluZGV4ID4gMSAmJiBzdHJQYXR0ZXJuLmNoYXJBdChkZWxpbUluZGV4IC0gMikgPT0gQ19CQUNLU0xBU0gpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi9rOS5ieespuS5i+WJjei/mOacieS4gOS4qui9rOS5ieespu+8jOWNoOS9jeespuS+neaXp+acieaViAorICAgICAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoc3RyUGF0dGVybiwgaGFuZGxlZFBvc2l0aW9uLCBkZWxpbUluZGV4IC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYnVmLmFwcGVuZChDb252ZXJ0LnV0ZjhTdHIoYXJnQXJyYXlbYXJnSW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUG9zaXRpb24gPSBkZWxpbUluZGV4ICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWNoOS9jeespuiiq+i9rOS5iQorICAgICAgICAgICAgICAgICAgICAgICAgYXJnSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNidWYuYXBwZW5kKHN0clBhdHRlcm4sIGhhbmRsZWRQb3NpdGlvbiwgZGVsaW1JbmRleCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoQ19ERUxJTV9TVEFSVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUG9zaXRpb24gPSBkZWxpbUluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyDmraPluLjljaDkvY3nrKYKKyAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoc3RyUGF0dGVybiwgaGFuZGxlZFBvc2l0aW9uLCBkZWxpbUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoQ29udmVydC51dGY4U3RyKGFyZ0FycmF5W2FyZ0luZGV4XSkpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUG9zaXRpb24gPSBkZWxpbUluZGV4ICsgMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8g5Yqg5YWl5pyA5ZCO5LiA5Liq5Y2g5L2N56ym5ZCO5omA5pyJ55qE5a2X56ymCisgICAgICAgIHNidWYuYXBwZW5kKHN0clBhdHRlcm4sIGhhbmRsZWRQb3NpdGlvbiwgc3RyUGF0dGVybi5sZW5ndGgoKSk7CisKKyAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0J1c2luZXNzU3RhdHVzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0J1c2luZXNzU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNzMwNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvQnVzaW5lc3NTdGF0dXMuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKKy8qKgorICog5pON5L2c54q25oCBCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqCisgKi8KK3B1YmxpYyBlbnVtIEJ1c2luZXNzU3RhdHVzCit7CisgICAgLyoqCisgICAgICog5oiQ5YqfCisgICAgICovCisgICAgU1VDQ0VTUywKKworICAgIC8qKgorICAgICAqIOWksei0pQorICAgICAqLworICAgIEZBSUwsCit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0J1c2luZXNzVHlwZS5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9CdXNpbmVzc1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE3YzRhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9CdXNpbmVzc1R5cGUuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKKy8qKgorICog5Lia5Yqh5pON5L2c57G75Z6LCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGVudW0gQnVzaW5lc3NUeXBlCit7CisgICAgLyoqCisgICAgICog5YW25a6DCisgICAgICovCisgICAgT1RIRVIsCisKKyAgICAvKioKKyAgICAgKiDmlrDlop4KKyAgICAgKi8KKyAgICBJTlNFUlQsCisKKyAgICAvKioKKyAgICAgKiDkv67mlLkKKyAgICAgKi8KKyAgICBVUERBVEUsCisKKyAgICAvKioKKyAgICAgKiDliKDpmaQKKyAgICAgKi8KKyAgICBERUxFVEUsCisKKyAgICAvKioKKyAgICAgKiDmjojmnYMKKyAgICAgKi8KKyAgICBHUkFOVCwKKworICAgIC8qKgorICAgICAqIOWvvOWHugorICAgICAqLworICAgIEVYUE9SVCwKKworICAgIC8qKgorICAgICAqIOWvvOWFpQorICAgICAqLworICAgIElNUE9SVCwKKworICAgIC8qKgorICAgICAqIOW8uumAgAorICAgICAqLworICAgIEZPUkNFLAorCisgICAgLyoqCisgICAgICog55Sf5oiQ5Luj56CBCisgICAgICovCisgICAgR0VOQ09ERSwKKyAgICAKKyAgICAvKioKKyAgICAgKiDmuIXnqbrmlbDmja4KKyAgICAgKi8KKyAgICBDTEVBTiwKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvRGF0YVNvdXJjZVR5cGUuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvRGF0YVNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk0NWJlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9EYXRhU291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5lbnVtczsKKworLyoqCisgKiDmlbDmja7mupAKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgZW51bSBEYXRhU291cmNlVHlwZQoreworICAgIC8qKgorICAgICAqIOS4u+W6kworICAgICAqLworICAgIE1BU1RFUiwKKworICAgIC8qKgorICAgICAqIOS7juW6kworICAgICAqLworICAgIFNMQVZFCit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0Rlc2Vuc2l0aXplZFR5cGUuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvRGVzZW5zaXRpemVkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDgxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0Rlc2Vuc2l0aXplZFR5cGUuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EZXNlbnNpdGl6ZWRVdGlsOworCisvKioKKyAqIOiEseaVj+exu+WeiworICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGVudW0gRGVzZW5zaXRpemVkVHlwZQoreworICAgIC8qKgorICAgICAqIOWnk+WQje+8jOesrDLkvY3mmJ/lj7fmm7/mjaIKKyAgICAgKi8KKyAgICBVU0VSTkFNRShzIC0+IHMucmVwbGFjZUFsbCgiKFxcUylcXFMoXFxTKikiLCAiJDEqJDIiKSksCisKKyAgICAvKioKKyAgICAgKiDlr4bnoIHvvIzlhajpg6jlrZfnrKbpg73nlKgq5Luj5pu/CisgICAgICovCisgICAgUEFTU1dPUkQoRGVzZW5zaXRpemVkVXRpbDo6cGFzc3dvcmQpLAorCisgICAgLyoqCisgICAgICog6Lqr5Lu96K+B77yM5Lit6Ze0MTDkvY3mmJ/lj7fmm7/mjaIKKyAgICAgKi8KKyAgICBJRF9DQVJEKHMgLT4gcy5yZXBsYWNlQWxsKCIoXFxkezR9KVxcZHsxMH0oXFxkezR9KSIsICIkMSoqICoqKiogKioqKiQyIikpLAorCisgICAgLyoqCisgICAgICog5omL5py65Y+377yM5Lit6Ze0NOS9jeaYn+WPt+abv+aNogorICAgICAqLworICAgIFBIT05FKHMgLT4gcy5yZXBsYWNlQWxsKCIoXFxkezN9KVxcZHs0fShcXGR7NH0pIiwgIiQxKioqKiQyIikpLAorCisgICAgLyoqCisgICAgICog55S15a2Q6YKu566x77yM5LuF5pi+56S656ys5LiA5Liq5a2X5q+N5ZKMQOWQjumdoueahOWcsOWdgOaYvuekuu+8jOWFtuS7luaYn+WPt+abv+aNogorICAgICAqLworICAgIEVNQUlMKHMgLT4gcy5yZXBsYWNlQWxsKCIoXi4pW15AXSooQC4qJCkiLCAiJDEqKioqJDIiKSksCisKKyAgICAvKioKKyAgICAgKiDpk7booYzljaHlj7fvvIzkv53nlZnmnIDlkI405L2N77yM5YW25LuW5pif5Y+35pu/5o2iCisgICAgICovCisgICAgQkFOS19DQVJEKHMgLT4gcy5yZXBsYWNlQWxsKCJcXGR7MTV9KFxcZHszfSkiLCAiKioqKiAqKioqICoqKiogKioqKiAkMSIpKSwKKworICAgIC8qKgorICAgICAqIOi9pueJjOWPt+egge+8jOWMheWQq+aZrumAmui9pui+huOAgeaWsOiDvea6kOi9pui+hgorICAgICAqLworICAgIENBUl9MSUNFTlNFKERlc2Vuc2l0aXplZFV0aWw6OmNhckxpY2Vuc2UpOworCisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gZGVzZW5zaXRpemVyOworCisgICAgRGVzZW5zaXRpemVkVHlwZShGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gZGVzZW5zaXRpemVyKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXNlbnNpdGl6ZXIgPSBkZXNlbnNpdGl6ZXI7CisgICAgfQorCisgICAgcHVibGljIEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPiBkZXNlbnNpdGl6ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlc2Vuc2l0aXplcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0h0dHBNZXRob2QuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvSHR0cE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmY3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0h0dHBNZXRob2QuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubGFuZy5OdWxsYWJsZTsKKworLyoqCisgKiDor7fmsYLmlrnlvI8KKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBlbnVtIEh0dHBNZXRob2QKK3sKKyAgICBHRVQsIEhFQUQsIFBPU1QsIFBVVCwgUEFUQ0gsIERFTEVURSwgT1BUSU9OUywgVFJBQ0U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBIdHRwTWV0aG9kPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPD4oMTYpOworCisgICAgc3RhdGljCisgICAgeworICAgICAgICBmb3IgKEh0dHBNZXRob2QgaHR0cE1ldGhvZCA6IHZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBtYXBwaW5ncy5wdXQoaHR0cE1ldGhvZC5uYW1lKCksIGh0dHBNZXRob2QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIHN0YXRpYyBIdHRwTWV0aG9kIHJlc29sdmUoQE51bGxhYmxlIFN0cmluZyBtZXRob2QpCisgICAgeworICAgICAgICByZXR1cm4gKG1ldGhvZCAhPSBudWxsID8gbWFwcGluZ3MuZ2V0KG1ldGhvZCkgOiBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZXRob2QpCisgICAgeworICAgICAgICByZXR1cm4gKHRoaXMgPT0gcmVzb2x2ZShtZXRob2QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL0xpbWl0VHlwZS5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9MaW1pdFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA5ZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9MaW1pdFR5cGUuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKKy8qKgorICog6ZmQ5rWB57G75Z6LCisgKgorICogQGF1dGhvciBydW95aQorICovCisKK3B1YmxpYyBlbnVtIExpbWl0VHlwZQoreworICAgIC8qKgorICAgICAqIOm7mOiupOetlueVpeWFqOWxgOmZkOa1gQorICAgICAqLworICAgIERFRkFVTFQsCisKKyAgICAvKioKKyAgICAgKiDmoLnmja7or7fmsYLogIVJUOi/m+ihjOmZkOa1gQorICAgICAqLworICAgIElQCit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2VudW1zL09wZXJhdG9yVHlwZS5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9PcGVyYXRvclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQxNDNjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9PcGVyYXRvclR5cGUuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZW51bXM7CisKKy8qKgorICog5pON5L2c5Lq657G75YirCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGVudW0gT3BlcmF0b3JUeXBlCit7CisgICAgLyoqCisgICAgICog5YW25a6DCisgICAgICovCisgICAgT1RIRVIsCisKKyAgICAvKioKKyAgICAgKiDlkI7lj7DnlKjmiLcKKyAgICAgKi8KKyAgICBNQU5BR0UsCisKKyAgICAvKioKKyAgICAgKiDmiYvmnLrnq6/nlKjmiLcKKyAgICAgKi8KKyAgICBNT0JJTEUKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvVXNlclN0YXR1cy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9lbnVtcy9Vc2VyU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmZjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZW51bXMvVXNlclN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5lbnVtczsKKworLyoqCisgKiDnlKjmiLfnirbmgIEKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgZW51bSBVc2VyU3RhdHVzCit7CisgICAgT0soIjAiLCAi5q2j5bi4IiksIERJU0FCTEUoIjEiLCAi5YGc55SoIiksIERFTEVURUQoIjIiLCAi5Yig6ZmkIik7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb2RlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGluZm87CisKKyAgICBVc2VyU3RhdHVzKFN0cmluZyBjb2RlLCBTdHJpbmcgaW5mbykKKyAgICB7CisgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpCisgICAgeworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9EZW1vTW9kZUV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vRGVtb01vZGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFkMmFiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vRGVtb01vZGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uOworCisvKioKKyAqIOa8lOekuuaooeW8j+W8guW4uAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBEZW1vTW9kZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHB1YmxpYyBEZW1vTW9kZUV4Y2VwdGlvbigpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL0dsb2JhbEV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vR2xvYmFsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNzFiNQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL0dsb2JhbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb247CisKKy8qKgorICog5YWo5bGA5byC5bi4CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEdsb2JhbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKgorICAgICAqIOmUmeivr+aPkOekugorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAvKioKKyAgICAgKiDplJnor6/mmI7nu4bvvIzlhoXpg6josIPor5XplJnor68KKyAgICAgKgorICAgICAqIOWSjCB7QGxpbmsgQ29tbW9uUmVzdWx0I2dldERldGFpbE1lc3NhZ2UoKX0g5LiA6Ie055qE6K6+6K6hCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGV0YWlsTWVzc2FnZTsKKworICAgIC8qKgorICAgICAqIOepuuaehOmAoOaWueazle+8jOmBv+WFjeWPjeW6j+WIl+WMlumXrumimAorICAgICAqLworICAgIHB1YmxpYyBHbG9iYWxFeGNlcHRpb24oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgR2xvYmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbE1lc3NhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRldGFpbE1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIEdsb2JhbEV4Y2VwdGlvbiBzZXREZXRhaWxNZXNzYWdlKFN0cmluZyBkZXRhaWxNZXNzYWdlKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXRhaWxNZXNzYWdlID0gZGV0YWlsTWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBHbG9iYWxFeGNlcHRpb24gc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjN2FiNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL1NlcnZpY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uOworCisvKioKKyAqIOS4muWKoeW8guW4uAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqCisgICAgICog6ZSZ6K+v56CBCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGNvZGU7CisKKyAgICAvKioKKyAgICAgKiDplJnor6/mj5DnpLoKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgLyoqCisgICAgICog6ZSZ6K+v5piO57uG77yM5YaF6YOo6LCD6K+V6ZSZ6K+vCisgICAgICoKKyAgICAgKiDlkowge0BsaW5rIENvbW1vblJlc3VsdCNnZXREZXRhaWxNZXNzYWdlKCl9IOS4gOiHtOeahOiuvuiuoQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbE1lc3NhZ2U7CisKKyAgICAvKioKKyAgICAgKiDnqbrmnoTpgKDmlrnms5XvvIzpgb/lhY3lj43luo/liJfljJbpl67popgKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZUV4Y2VwdGlvbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgSW50ZWdlciBjb2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbE1lc3NhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRldGFpbE1lc3NhZ2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24gc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uIHNldERldGFpbE1lc3NhZ2UoU3RyaW5nIGRldGFpbE1lc3NhZ2UpCisgICAgeworICAgICAgICB0aGlzLmRldGFpbE1lc3NhZ2UgPSBkZXRhaWxNZXNzYWdlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vVXRpbEV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vVXRpbEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGZhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9VdGlsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbjsKKworLyoqCisgKiDlt6XlhbfnsbvlvILluLgKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVXRpbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MjQ3NjEwMzE5MTcxMDE0MTgzTDsKKworICAgIHB1YmxpYyBVdGlsRXhjZXB0aW9uKFRocm93YWJsZSBlKQorICAgIHsKKyAgICAgICAgc3VwZXIoZS5nZXRNZXNzYWdlKCksIGUpOworICAgIH0KKworICAgIHB1YmxpYyBVdGlsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIFV0aWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpCisgICAgeworICAgICAgICBzdXBlcihtZXNzYWdlLCB0aHJvd2FibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2Jhc2UvQmFzZUV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vYmFzZS9CYXNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1ZDcyZQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2Jhc2UvQmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uYmFzZTsKKworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuTWVzc2FnZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog5Z+656GA5byC5bi4CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKioKKyAgICAgKiDmiYDlsZ7mqKHlnZcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtb2R1bGU7CisKKyAgICAvKioKKyAgICAgKiDplJnor6/noIEKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb2RlOworCisgICAgLyoqCisgICAgICog6ZSZ6K+v56CB5a+55bqU55qE5Y+C5pWwCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3RbXSBhcmdzOworCisgICAgLyoqCisgICAgICog6ZSZ6K+v5raI5oGvCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE1lc3NhZ2U7CisKKyAgICBwdWJsaWMgQmFzZUV4Y2VwdGlvbihTdHJpbmcgbW9kdWxlLCBTdHJpbmcgY29kZSwgT2JqZWN0W10gYXJncywgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQorICAgIHsKKyAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2UgPSBkZWZhdWx0TWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZUV4Y2VwdGlvbihTdHJpbmcgbW9kdWxlLCBTdHJpbmcgY29kZSwgT2JqZWN0W10gYXJncykKKyAgICB7CisgICAgICAgIHRoaXMobW9kdWxlLCBjb2RlLCBhcmdzLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZUV4Y2VwdGlvbihTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCisgICAgeworICAgICAgICB0aGlzKG1vZHVsZSwgbnVsbCwgbnVsbCwgZGVmYXVsdE1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBCYXNlRXhjZXB0aW9uKFN0cmluZyBjb2RlLCBPYmplY3RbXSBhcmdzKQorICAgIHsKKyAgICAgICAgdGhpcyhudWxsLCBjb2RlLCBhcmdzLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZUV4Y2VwdGlvbihTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCisgICAgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkoY29kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbHMubWVzc2FnZShjb2RlLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGdldEFyZ3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWVzc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVmYXVsdE1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9maWxlL0ZpbGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzFmMDliCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5maWxlOworCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uYmFzZS5CYXNlRXhjZXB0aW9uOworCisvKioKKyAqIOaWh+S7tuS/oeaBr+W8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIEZpbGVFeGNlcHRpb24oU3RyaW5nIGNvZGUsIE9iamVjdFtdIGFyZ3MpCisgICAgeworICAgICAgICBzdXBlcigiZmlsZSIsIGNvZGUsIGFyZ3MsIG51bGwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlTmFtZUxlbmd0aExpbWl0RXhjZWVkZWRFeGNlcHRpb24uamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2ZpbGUvRmlsZU5hbWVMZW5ndGhMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlMGVjOQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2ZpbGUvRmlsZU5hbWVMZW5ndGhMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5maWxlOworCisvKioKKyAqIOaWh+S7tuWQjeensOi2hemVv+mZkOWItuW8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTmFtZUxlbmd0aExpbWl0RXhjZWVkZWRFeGNlcHRpb24gZXh0ZW5kcyBGaWxlRXhjZXB0aW9uCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwdWJsaWMgRmlsZU5hbWVMZW5ndGhMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKGludCBkZWZhdWx0RmlsZU5hbWVMZW5ndGgpCisgICAgeworICAgICAgICBzdXBlcigidXBsb2FkLmZpbGVuYW1lLmV4Y2VlZC5sZW5ndGgiLCBuZXcgT2JqZWN0W10geyBkZWZhdWx0RmlsZU5hbWVMZW5ndGggfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlU2l6ZUxpbWl0RXhjZWVkZWRFeGNlcHRpb24uamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2ZpbGUvRmlsZVNpemVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2YWIwNQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2ZpbGUvRmlsZVNpemVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5maWxlOworCisvKioKKyAqIOaWh+S7tuWQjeWkp+Wwj+mZkOWItuW8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU2l6ZUxpbWl0RXhjZWVkZWRFeGNlcHRpb24gZXh0ZW5kcyBGaWxlRXhjZXB0aW9uCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwdWJsaWMgRmlsZVNpemVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKGxvbmcgZGVmYXVsdE1heFNpemUpCisgICAgeworICAgICAgICBzdXBlcigidXBsb2FkLmV4Y2VlZC5tYXhTaXplIiwgbmV3IE9iamVjdFtdIHsgZGVmYXVsdE1heFNpemUgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlVXBsb2FkRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9maWxlL0ZpbGVVcGxvYWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVlN2VmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vZmlsZS9GaWxlVXBsb2FkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5maWxlOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvKioKKyAqIOaWh+S7tuS4iuS8oOW8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXBsb2FkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCit7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIGNhdXNlOworCisgICAgcHVibGljIEZpbGVVcGxvYWRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZVVwbG9hZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgdGhpcyhtc2csIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlVXBsb2FkRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gc3RyZWFtKQorICAgIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHN0cmVhbSk7CisgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0ucHJpbnRsbigiQ2F1c2VkIGJ5OiIpOworICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgd3JpdGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ2F1c2VkIGJ5OiIpOworICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYXVzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9maWxlL0ludmFsaWRFeHRlbnNpb25FeGNlcHRpb24uamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2ZpbGUvSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWYzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9maWxlL0ludmFsaWRFeHRlbnNpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLmZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIOaWh+S7tuS4iuS8oCDor6/lvILluLjnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBleHRlbmRzIEZpbGVVcGxvYWRFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgU3RyaW5nW10gYWxsb3dlZEV4dGVuc2lvbjsKKyAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7CisKKyAgICBwdWJsaWMgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbihTdHJpbmdbXSBhbGxvd2VkRXh0ZW5zaW9uLCBTdHJpbmcgZXh0ZW5zaW9uLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICBzdXBlcigi5paH5Lu2WyIgKyBmaWxlbmFtZSArICJd5ZCO57yAWyIgKyBleHRlbnNpb24gKyAiXeS4jeato+ehru+8jOivt+S4iuS8oCIgKyBBcnJheXMudG9TdHJpbmcoYWxsb3dlZEV4dGVuc2lvbikgKyAi5qC85byPIik7CisgICAgICAgIHRoaXMuYWxsb3dlZEV4dGVuc2lvbiA9IGFsbG93ZWRFeHRlbnNpb247CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOworICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFsbG93ZWRFeHRlbnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFsbG93ZWRFeHRlbnNpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRJbWFnZUV4dGVuc2lvbkV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgICAgIHB1YmxpYyBJbnZhbGlkSW1hZ2VFeHRlbnNpb25FeGNlcHRpb24oU3RyaW5nW10gYWxsb3dlZEV4dGVuc2lvbiwgU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihhbGxvd2VkRXh0ZW5zaW9uLCBleHRlbnNpb24sIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZEZsYXNoRXh0ZW5zaW9uRXhjZXB0aW9uIGV4dGVuZHMgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAgICAgcHVibGljIEludmFsaWRGbGFzaEV4dGVuc2lvbkV4Y2VwdGlvbihTdHJpbmdbXSBhbGxvd2VkRXh0ZW5zaW9uLCBTdHJpbmcgZXh0ZW5zaW9uLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGFsbG93ZWRFeHRlbnNpb24sIGV4dGVuc2lvbiwgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkTWVkaWFFeHRlbnNpb25FeGNlcHRpb24gZXh0ZW5kcyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgICAgICBwdWJsaWMgSW52YWxpZE1lZGlhRXh0ZW5zaW9uRXhjZXB0aW9uKFN0cmluZ1tdIGFsbG93ZWRFeHRlbnNpb24sIFN0cmluZyBleHRlbnNpb24sIFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoYWxsb3dlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRWaWRlb0V4dGVuc2lvbkV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgICAgIHB1YmxpYyBJbnZhbGlkVmlkZW9FeHRlbnNpb25FeGNlcHRpb24oU3RyaW5nW10gYWxsb3dlZEV4dGVuc2lvbiwgU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihhbGxvd2VkRXh0ZW5zaW9uLCBleHRlbnNpb24sIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL2pvYi9UYXNrRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9qb2IvVGFza0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjdiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi9qb2IvVGFza0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uam9iOworCisvKioKKyAqIOiuoeWIkuetlueVpeW8guW4uAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwcml2YXRlIENvZGUgY29kZTsKKworICAgIHB1YmxpYyBUYXNrRXhjZXB0aW9uKFN0cmluZyBtc2csIENvZGUgY29kZSkKKyAgICB7CisgICAgICAgIHRoaXMobXNnLCBjb2RlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBDb2RlIGNvZGUsIEV4Y2VwdGlvbiBuZXN0ZWRFeCkKKyAgICB7CisgICAgICAgIHN1cGVyKG1zZywgbmVzdGVkRXgpOworICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlIGdldENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIGVudW0gQ29kZQorICAgIHsKKyAgICAgICAgVEFTS19FWElTVFMsIE5PX1RBU0tfRVhJU1RTLCBUQVNLX0FMUkVBRFlfU1RBUlRFRCwgVU5LTk9XTiwgQ09ORklHX0VSUk9SLCBUQVNLX05PREVfTk9UX0FWQUlMQUJMRQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi91c2VyL0JsYWNrTGlzdEV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9CbGFja0xpc3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY1MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9CbGFja0xpc3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXI7CisKKy8qKgorICog6buR5ZCN5Y2VSVDlvILluLjnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQmxhY2tMaXN0RXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIEJsYWNrTGlzdEV4Y2VwdGlvbigpCisgICAgeworICAgICAgICBzdXBlcigibG9naW4uYmxvY2tlZCIsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvQ2FwdGNoYUV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9DYXB0Y2hhRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ZGJjNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvQ2FwdGNoYUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24udXNlcjsKKworLyoqCisgKiDpqozor4HnoIHplJnor6/lvILluLjnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQ2FwdGNoYUV4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHB1YmxpYyBDYXB0Y2hhRXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIHN1cGVyKCJ1c2VyLmpjYXB0Y2hhLmVycm9yIiwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9DYXB0Y2hhRXhwaXJlRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi91c2VyL0NhcHRjaGFFeHBpcmVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY5NDg2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9DYXB0Y2hhRXhwaXJlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi51c2VyOworCisvKioKKyAqIOmqjOivgeeggeWkseaViOW8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBDYXB0Y2hhRXhwaXJlRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIENhcHRjaGFFeHBpcmVFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgc3VwZXIoInVzZXIuamNhcHRjaGEuZXhwaXJlIiwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9Vc2VyRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi91c2VyL1VzZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjkyZDcwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9Vc2VyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi51c2VyOworCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uYmFzZS5CYXNlRXhjZXB0aW9uOworCisvKioKKyAqIOeUqOaIt+S/oeaBr+W8guW4uOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIFVzZXJFeGNlcHRpb24oU3RyaW5nIGNvZGUsIE9iamVjdFtdIGFyZ3MpCisgICAgeworICAgICAgICBzdXBlcigidXNlciIsIGNvZGUsIGFyZ3MsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvVXNlck5vdEV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9Vc2VyTm90RXhpc3RzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmODE4MQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvVXNlck5vdEV4aXN0c0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24udXNlcjsKKworLyoqCisgKiDnlKjmiLfkuI3lrZjlnKjlvILluLjnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVXNlck5vdEV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHB1YmxpYyBVc2VyTm90RXhpc3RzRXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIHN1cGVyKCJ1c2VyLm5vdC5leGlzdHMiLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi91c2VyL1VzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2V4Y2VwdGlvbi91c2VyL1VzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmM2U1ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvVXNlclBhc3N3b3JkTm90TWF0Y2hFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXI7CisKKy8qKgorICog55So5oi35a+G56CB5LiN5q2j56Gu5oiW5LiN56ym5ZCI6KeE6IyD5byC5bi457G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFVzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIFVzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIHN1cGVyKCJ1c2VyLnBhc3N3b3JkLm5vdC5tYXRjaCIsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvVXNlclBhc3N3b3JkUmV0cnlMaW1pdEV4Y2VlZEV4Y2VwdGlvbi5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9leGNlcHRpb24vdXNlci9Vc2VyUGFzc3dvcmRSZXRyeUxpbWl0RXhjZWVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4N2NmMQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZXhjZXB0aW9uL3VzZXIvVXNlclBhc3N3b3JkUmV0cnlMaW1pdEV4Y2VlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24udXNlcjsKKworLyoqCisgKiDnlKjmiLfplJnor6/mnIDlpKfmrKHmlbDlvILluLjnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVXNlclBhc3N3b3JkUmV0cnlMaW1pdEV4Y2VlZEV4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHB1YmxpYyBVc2VyUGFzc3dvcmRSZXRyeUxpbWl0RXhjZWVkRXhjZXB0aW9uKGludCByZXRyeUxpbWl0Q291bnQsIGludCBsb2NrVGltZSkKKyAgICB7CisgICAgICAgIHN1cGVyKCJ1c2VyLnBhc3N3b3JkLnJldHJ5LmxpbWl0LmV4Y2VlZCIsIG5ldyBPYmplY3RbXSB7IHJldHJ5TGltaXRDb3VudCwgbG9ja1RpbWUgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvUHJvcGVydHlQcmVFeGNsdWRlRmlsdGVyLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2ZpbHRlci9Qcm9wZXJ0eVByZUV4Y2x1ZGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU0MzFiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvUHJvcGVydHlQcmVFeGNsdWRlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmZpbHRlcjsKKworaW1wb3J0IGNvbS5hbGliYWJhLmZhc3Rqc29uMi5maWx0ZXIuU2ltcGxlUHJvcGVydHlQcmVGaWx0ZXI7CisKKy8qKgorICog5o6S6ZmkSlNPTuaVj+aEn+WxnuaApworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVByZUV4Y2x1ZGVGaWx0ZXIgZXh0ZW5kcyBTaW1wbGVQcm9wZXJ0eVByZUZpbHRlcgoreworICAgIHB1YmxpYyBQcm9wZXJ0eVByZUV4Y2x1ZGVGaWx0ZXIoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlQcmVFeGNsdWRlRmlsdGVyIGFkZEV4Y2x1ZGVzKFN0cmluZy4uLiBmaWx0ZXJzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmdldEV4Y2x1ZGVzKCkuYWRkKGZpbHRlcnNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1JlcGVhdGFibGVGaWx0ZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1JlcGVhdGFibGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmVkZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvUmVwZWF0YWJsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGpha2FydGEuc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5NZWRpYVR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBSZXBlYXRhYmxlIOi/h+a7pOWZqAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBlYXRhYmxlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCit7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3RXcmFwcGVyID0gbnVsbDsKKyAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QKKyAgICAgICAgICAgICAgICAmJiBTdHJpbmdVdGlscy5zdGFydHNXaXRoSWdub3JlQ2FzZShyZXF1ZXN0LmdldENvbnRlbnRUeXBlKCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1ZBTFVFKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXIgPSBuZXcgUmVwZWF0ZWRseVJlcXVlc3RXcmFwcGVyKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCA9PSByZXF1ZXN0V3JhcHBlcikKKyAgICAgICAgeworICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdFdyYXBwZXIsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKQorICAgIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1JlcGVhdGVkbHlSZXF1ZXN0V3JhcHBlci5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvUmVwZWF0ZWRseVJlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZWUwOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1JlcGVhdGVkbHlSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGpha2FydGEuc2VydmxldC5SZWFkTGlzdGVuZXI7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaHR0cC5IdHRwSGVscGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ29uc3RhbnRzOworCisvKioKKyAqIOaehOW7uuWPr+mHjeWkjeivu+WPlmlucHV0U3RyZWFt55qEcmVxdWVzdAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBlYXRlZGx5UmVxdWVzdFdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYm9keTsKKworICAgIHB1YmxpYyBSZXBlYXRlZGx5UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhDb25zdGFudHMuVVRGOCk7CisgICAgICAgIHJlc3BvbnNlLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5VVEY4KTsKKworICAgICAgICBib2R5ID0gSHR0cEhlbHBlci5nZXRCb2R5U3RyaW5nKHJlcXVlc3QpLmdldEJ5dGVzKENvbnN0YW50cy5VVEY4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib2R5KTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2bGV0SW5wdXRTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiYWlzLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBib2R5Lmxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlYWRMaXN0ZW5lcihSZWFkTGlzdGVuZXIgcmVhZExpc3RlbmVyKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvWHNzRmlsdGVyLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL2ZpbHRlci9Yc3NGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDM4ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvWHNzRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLmZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGpha2FydGEuc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5IdHRwTWV0aG9kOworCisvKioKKyAqIOmYsuatolhTU+aUu+WHu+eahOi/h+a7pOWZqAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBYc3NGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKK3sKKyAgICAvKioKKyAgICAgKiDmjpLpmaTpk77mjqUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgdGVtcEV4Y2x1ZGVzID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImV4Y2x1ZGVzIik7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHRlbXBFeGNsdWRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHVybHMgPSB0ZW1wRXhjbHVkZXMuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHVybCA6IHVybHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhjbHVkZXMuYWRkKHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlOworICAgICAgICBpZiAoaGFuZGxlRXhjbHVkZVVSTChyZXEsIHJlc3ApKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgWHNzSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB4c3NSZXF1ZXN0ID0gbmV3IFhzc0h0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdCk7CisgICAgICAgIGNoYWluLmRvRmlsdGVyKHhzc1JlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRXhjbHVkZVVSTChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB7CisgICAgICAgIFN0cmluZyB1cmwgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICAvLyBHRVQgREVMRVRFIOS4jei/h+a7pAorICAgICAgICBpZiAobWV0aG9kID09IG51bGwgfHwgSHR0cE1ldGhvZC5HRVQubWF0Y2hlcyhtZXRob2QpIHx8IEh0dHBNZXRob2QuREVMRVRFLm1hdGNoZXMobWV0aG9kKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLm1hdGNoZXModXJsLCBleGNsdWRlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpCisgICAgeworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1hzc0h0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vZmlsdGVyL1hzc0h0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc4MzdiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi9maWx0ZXIvWHNzSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24uZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5SZWFkTGlzdGVuZXI7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmh0dHAuSHR0cEhlYWRlcnM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLk1lZGlhVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaHRtbC5Fc2NhcGVVdGlsOworCisvKioKKyAqIFhTU+i/h+a7pOWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBYc3NIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcgoreworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIFhzc0h0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gc3VwZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOworICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgU3RyaW5nW10gZXNjYXBlc1ZhbHVlcyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g6ZiyeHNz5pS75Ye75ZKM6L+H5ruk5YmN5ZCO56m65qC8CisgICAgICAgICAgICAgICAgZXNjYXBlc1ZhbHVlc1tpXSA9IEVzY2FwZVV0aWwuY2xlYW4odmFsdWVzW2ldKS50cmltKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXNjYXBlc1ZhbHVlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIOmdnmpzb27nsbvlnovvvIznm7TmjqXov5Tlm54KKyAgICAgICAgaWYgKCFpc0pzb25SZXF1ZXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8g5Li656m677yM55u05o6l6L+U5ZueCisgICAgICAgIFN0cmluZyBqc29uID0gSU9VdGlscy50b1N0cmluZyhzdXBlci5nZXRJbnB1dFN0cmVhbSgpLCAidXRmLTgiKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoanNvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8geHNz6L+H5rukCisgICAgICAgIGpzb24gPSBFc2NhcGVVdGlsLmNsZWFuKGpzb24pLnRyaW0oKTsKKyAgICAgICAgYnl0ZVtdIGpzb25CeXRlcyA9IGpzb24uZ2V0Qnl0ZXMoInV0Zi04Iik7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShqc29uQnl0ZXMpOworICAgICAgICByZXR1cm4gbmV3IFNlcnZsZXRJbnB1dFN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkeSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ganNvbkJ5dGVzLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWFkTGlzdGVuZXIoUmVhZExpc3RlbmVyIHJlYWRMaXN0ZW5lcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmlzLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbmmK9Kc29u6K+35rGCCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0pzb25SZXF1ZXN0KCkKKyAgICB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSBzdXBlci5nZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKGhlYWRlciwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVkFMVUUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0FyaXRoLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0FyaXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzMjZjMgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvQXJpdGguamF2YQpAQCAtMCwwICsxLDExNCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKKworLyoqCisgKiDnsr7noa7nmoTmta7ngrnmlbDov5DnrpcKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQXJpdGgKK3sKKworICAgIC8qKiDpu5jorqTpmaTms5Xov5Dnrpfnsr7luqYgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGX0RJVl9TQ0FMRSA9IDEwOworCisgICAgLyoqIOi/meS4quexu+S4jeiDveWunuS+i+WMliAqLworICAgIHByaXZhdGUgQXJpdGgoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmj5Dkvpvnsr7noa7nmoTliqDms5Xov5DnrpfjgIIKKyAgICAgKiBAcGFyYW0gdjEg6KKr5Yqg5pWwCisgICAgICogQHBhcmFtIHYyIOWKoOaVsAorICAgICAqIEByZXR1cm4g5Lik5Liq5Y+C5pWw55qE5ZKMCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgYWRkKGRvdWJsZSB2MSwgZG91YmxlIHYyKQorICAgIHsKKyAgICAgICAgQmlnRGVjaW1hbCBiMSA9IG5ldyBCaWdEZWNpbWFsKERvdWJsZS50b1N0cmluZyh2MSkpOworICAgICAgICBCaWdEZWNpbWFsIGIyID0gbmV3IEJpZ0RlY2ltYWwoRG91YmxlLnRvU3RyaW5nKHYyKSk7CisgICAgICAgIHJldHVybiBiMS5hZGQoYjIpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5o+Q5L6b57K+56Gu55qE5YeP5rOV6L+Q566X44CCCisgICAgICogQHBhcmFtIHYxIOiiq+WHj+aVsAorICAgICAqIEBwYXJhbSB2MiDlh4/mlbAKKyAgICAgKiBAcmV0dXJuIOS4pOS4quWPguaVsOeahOW3rgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHN1Yihkb3VibGUgdjEsIGRvdWJsZSB2MikKKyAgICB7CisgICAgICAgIEJpZ0RlY2ltYWwgYjEgPSBuZXcgQmlnRGVjaW1hbChEb3VibGUudG9TdHJpbmcodjEpKTsKKyAgICAgICAgQmlnRGVjaW1hbCBiMiA9IG5ldyBCaWdEZWNpbWFsKERvdWJsZS50b1N0cmluZyh2MikpOworICAgICAgICByZXR1cm4gYjEuc3VidHJhY3QoYjIpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5o+Q5L6b57K+56Gu55qE5LmY5rOV6L+Q566X44CCCisgICAgICogQHBhcmFtIHYxIOiiq+S5mOaVsAorICAgICAqIEBwYXJhbSB2MiDkuZjmlbAKKyAgICAgKiBAcmV0dXJuIOS4pOS4quWPguaVsOeahOenrworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIG11bChkb3VibGUgdjEsIGRvdWJsZSB2MikKKyAgICB7CisgICAgICAgIEJpZ0RlY2ltYWwgYjEgPSBuZXcgQmlnRGVjaW1hbChEb3VibGUudG9TdHJpbmcodjEpKTsKKyAgICAgICAgQmlnRGVjaW1hbCBiMiA9IG5ldyBCaWdEZWNpbWFsKERvdWJsZS50b1N0cmluZyh2MikpOworICAgICAgICByZXR1cm4gYjEubXVsdGlwbHkoYjIpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5o+Q5L6b77yI55u45a+577yJ57K+56Gu55qE6Zmk5rOV6L+Q566X77yM5b2T5Y+R55Sf6Zmk5LiN5bC955qE5oOF5Ya15pe277yM57K+56Gu5YiwCisgICAgICog5bCP5pWw54K55Lul5ZCOMTDkvY3vvIzku6XlkI7nmoTmlbDlrZflm5voiI3kupTlhaXjgIIKKyAgICAgKiBAcGFyYW0gdjEg6KKr6Zmk5pWwCisgICAgICogQHBhcmFtIHYyIOmZpOaVsAorICAgICAqIEByZXR1cm4g5Lik5Liq5Y+C5pWw55qE5ZWGCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZGl2KGRvdWJsZSB2MSwgZG91YmxlIHYyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRpdih2MSwgdjIsIERFRl9ESVZfU0NBTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaPkOS+m++8iOebuOWvue+8ieeyvuehrueahOmZpOazlei/kOeul+OAguW9k+WPkeeUn+mZpOS4jeWwveeahOaDheWGteaXtu+8jOeUsXNjYWxl5Y+C5pWw5oyHCisgICAgICog5a6a57K+5bqm77yM5Lul5ZCO55qE5pWw5a2X5Zub6IiN5LqU5YWl44CCCisgICAgICogQHBhcmFtIHYxIOiiq+mZpOaVsAorICAgICAqIEBwYXJhbSB2MiDpmaTmlbAKKyAgICAgKiBAcGFyYW0gc2NhbGUg6KGo56S66KGo56S66ZyA6KaB57K+56Gu5Yiw5bCP5pWw54K55Lul5ZCO5Yeg5L2N44CCCisgICAgICogQHJldHVybiDkuKTkuKrlj4LmlbDnmoTllYYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBkaXYoZG91YmxlIHYxLCBkb3VibGUgdjIsIGludCBzY2FsZSkKKyAgICB7CisgICAgICAgIGlmIChzY2FsZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgc2NhbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgemVybyIpOworICAgICAgICB9CisgICAgICAgIEJpZ0RlY2ltYWwgYjEgPSBuZXcgQmlnRGVjaW1hbChEb3VibGUudG9TdHJpbmcodjEpKTsKKyAgICAgICAgQmlnRGVjaW1hbCBiMiA9IG5ldyBCaWdEZWNpbWFsKERvdWJsZS50b1N0cmluZyh2MikpOworICAgICAgICBpZiAoYjEuY29tcGFyZVRvKEJpZ0RlY2ltYWwuWkVSTykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJpZ0RlY2ltYWwuWkVSTy5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiMS5kaXZpZGUoYjIsIHNjYWxlLCBSb3VuZGluZ01vZGUuSEFMRl9VUCkuZG91YmxlVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmj5Dkvpvnsr7noa7nmoTlsI/mlbDkvY3lm5voiI3kupTlhaXlpITnkIbjgIIKKyAgICAgKiBAcGFyYW0gdiDpnIDopoHlm5voiI3kupTlhaXnmoTmlbDlrZcKKyAgICAgKiBAcGFyYW0gc2NhbGUg5bCP5pWw54K55ZCO5L+d55WZ5Yeg5L2NCisgICAgICogQHJldHVybiDlm5voiI3kupTlhaXlkI7nmoTnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSByb3VuZChkb3VibGUgdiwgaW50IHNjYWxlKQorICAgIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBzY2FsZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvIik7CisgICAgICAgIH0KKyAgICAgICAgQmlnRGVjaW1hbCBiID0gbmV3IEJpZ0RlY2ltYWwoRG91YmxlLnRvU3RyaW5nKHYpKTsKKyAgICAgICAgQmlnRGVjaW1hbCBvbmUgPSBCaWdEZWNpbWFsLk9ORTsKKyAgICAgICAgcmV0dXJuIGIuZGl2aWRlKG9uZSwgc2NhbGUsIFJvdW5kaW5nTW9kZS5IQUxGX1VQKS5kb3VibGVWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvRGF0ZVV0aWxzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0RhdGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmFlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0RhdGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZTsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxUaW1lOworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CitpbXBvcnQgamF2YS50aW1lLlpvbmVkRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRpbWUuRGF0ZUZvcm1hdFV0aWxzOworCisvKioKKyAqIOaXtumXtOW3peWFt+exuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlVXRpbHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGltZS5EYXRlVXRpbHMKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBZWVlZID0gInl5eXkiOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWVlZWV9NTSA9ICJ5eXl5LU1NIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFlZWVlfTU1fREQgPSAieXl5eS1NTS1kZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBZWVlZTU1EREhITU1TUyA9ICJ5eXl5TU1kZEhIbW1zcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBZWVlZX01NX0REX0hIX01NX1NTID0gInl5eXktTU0tZGQgSEg6bW06c3MiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcGFyc2VQYXR0ZXJucyA9IHsKKyAgICAgICAgICAgICJ5eXl5LU1NLWRkIiwgInl5eXktTU0tZGQgSEg6bW06c3MiLCAieXl5eS1NTS1kZCBISDptbSIsICJ5eXl5LU1NIiwgCisgICAgICAgICAgICAieXl5eS9NTS9kZCIsICJ5eXl5L01NL2RkIEhIOm1tOnNzIiwgInl5eXkvTU0vZGQgSEg6bW0iLCAieXl5eS9NTSIsCisgICAgICAgICAgICAieXl5eS5NTS5kZCIsICJ5eXl5Lk1NLmRkIEhIOm1tOnNzIiwgInl5eXkuTU0uZGQgSEg6bW0iLCAieXl5eS5NTSJ9OworCisgICAgLyoqCisgICAgICog6I635Y+W5b2T5YmNRGF0ZeWei+aXpeacnworICAgICAqIAorICAgICAqIEByZXR1cm4gRGF0ZSgpIOW9k+WJjeaXpeacnworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBnZXROb3dEYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluW9k+WJjeaXpeacnywg6buY6K6k5qC85byP5Li6eXl5eS1NTS1kZAorICAgICAqIAorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0ZVRpbWVOb3coWVlZWV9NTV9ERCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VGltZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0ZVRpbWVOb3coWVlZWV9NTV9ERF9ISF9NTV9TUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGF0ZVRpbWVOb3coKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGVUaW1lTm93KFlZWVlNTURESEhNTVNTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkYXRlVGltZU5vdyhmaW5hbCBTdHJpbmcgZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlRGF0ZVRvU3RyKGZvcm1hdCwgbmV3IERhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGF0ZVRpbWUoZmluYWwgRGF0ZSBkYXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlRGF0ZVRvU3RyKFlZWVlfTU1fREQsIGRhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHBhcnNlRGF0ZVRvU3RyKGZpbmFsIFN0cmluZyBmb3JtYXQsIGZpbmFsIERhdGUgZGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpLmZvcm1hdChkYXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGUgZGF0ZVRpbWUoZmluYWwgU3RyaW5nIGZvcm1hdCwgZmluYWwgU3RyaW5nIHRzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpLnBhcnNlKHRzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDml6XmnJ/ot6/lvoQg5Y2z5bm0L+aciC/ml6Ug5aaCMjAxOC8wOC8wOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRhdGVQYXRoKCkKKyAgICB7CisgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgcmV0dXJuIERhdGVGb3JtYXRVdGlscy5mb3JtYXQobm93LCAieXl5eS9NTS9kZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaXpeacn+i3r+W+hCDljbPlubQv5pyIL+aXpSDlpoIyMDE4MDgwOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRhdGVUaW1lKCkKKyAgICB7CisgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgcmV0dXJuIERhdGVGb3JtYXRVdGlscy5mb3JtYXQobm93LCAieXl5eU1NZGQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDml6XmnJ/lnovlrZfnrKbkuLLovazljJbkuLrml6XmnJ8g5qC85byPCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRlIHBhcnNlRGF0ZShPYmplY3Qgc3RyKQorICAgIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlRGF0ZShzdHIudG9TdHJpbmcoKSwgcGFyc2VQYXR0ZXJucyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5pyN5Yqh5Zmo5ZCv5Yqo5pe26Ze0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRlIGdldFNlcnZlclN0YXJ0RGF0ZSgpCisgICAgeworICAgICAgICBsb25nIHRpbWUgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRSdW50aW1lTVhCZWFuKCkuZ2V0U3RhcnRUaW1lKCk7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorqHnrpfnm7jlt67lpKnmlbAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBkaWZmZXJlbnREYXlzQnlNaWxsaXNlY29uZChEYXRlIGRhdGUxLCBEYXRlIGRhdGUyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKChpbnQpICgoZGF0ZTIuZ2V0VGltZSgpIC0gZGF0ZTEuZ2V0VGltZSgpKSAvICgxMDAwICogMzYwMCAqIDI0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiuoeeul+aXtumXtOW3rgorICAgICAqCisgICAgICogQHBhcmFtIGVuZERhdGUg5pyA5ZCO5pe26Ze0CisgICAgICogQHBhcmFtIHN0YXJ0VGltZSDlvIDlp4vml7bpl7QKKyAgICAgKiBAcmV0dXJuIOaXtumXtOW3ru+8iOWkqS/lsI/ml7Yv5YiG6ZKf77yJCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGltZURpc3RhbmNlKERhdGUgZW5kRGF0ZSwgRGF0ZSBzdGFydFRpbWUpCisgICAgeworICAgICAgICBsb25nIG5kID0gMTAwMCAqIDI0ICogNjAgKiA2MDsKKyAgICAgICAgbG9uZyBuaCA9IDEwMDAgKiA2MCAqIDYwOworICAgICAgICBsb25nIG5tID0gMTAwMCAqIDYwOworICAgICAgICAvLyBsb25nIG5zID0gMTAwMDsKKyAgICAgICAgLy8g6I635b6X5Lik5Liq5pe26Ze055qE5q+r56eS5pe26Ze05beu5byCCisgICAgICAgIGxvbmcgZGlmZiA9IGVuZERhdGUuZ2V0VGltZSgpIC0gc3RhcnRUaW1lLmdldFRpbWUoKTsKKyAgICAgICAgLy8g6K6h566X5beu5aSa5bCR5aSpCisgICAgICAgIGxvbmcgZGF5ID0gZGlmZiAvIG5kOworICAgICAgICAvLyDorqHnrpflt67lpJrlsJHlsI/ml7YKKyAgICAgICAgbG9uZyBob3VyID0gZGlmZiAlIG5kIC8gbmg7CisgICAgICAgIC8vIOiuoeeul+W3ruWkmuWwkeWIhumSnworICAgICAgICBsb25nIG1pbiA9IGRpZmYgJSBuZCAlIG5oIC8gbm07CisgICAgICAgIC8vIOiuoeeul+W3ruWkmuWwkeenki8v6L6T5Ye657uT5p6cCisgICAgICAgIC8vIGxvbmcgc2VjID0gZGlmZiAlIG5kICUgbmggJSBubSAvIG5zOworICAgICAgICByZXR1cm4gZGF5ICsgIuWkqSIgKyBob3VyICsgIuWwj+aXtiIgKyBtaW4gKyAi5YiG6ZKfIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlop7liqAgTG9jYWxEYXRlVGltZSA9PT4gRGF0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSB0b0RhdGUoTG9jYWxEYXRlVGltZSB0ZW1wb3JhbEFjY2Vzc29yKQorICAgIHsKKyAgICAgICAgWm9uZWREYXRlVGltZSB6ZHQgPSB0ZW1wb3JhbEFjY2Vzc29yLmF0Wm9uZShab25lSWQuc3lzdGVtRGVmYXVsdCgpKTsKKyAgICAgICAgcmV0dXJuIERhdGUuZnJvbSh6ZHQudG9JbnN0YW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWinuWKoCBMb2NhbERhdGUgPT0+IERhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgdG9EYXRlKExvY2FsRGF0ZSB0ZW1wb3JhbEFjY2Vzc29yKQorICAgIHsKKyAgICAgICAgTG9jYWxEYXRlVGltZSBsb2NhbERhdGVUaW1lID0gTG9jYWxEYXRlVGltZS5vZih0ZW1wb3JhbEFjY2Vzc29yLCBMb2NhbFRpbWUub2YoMCwgMCwgMCkpOworICAgICAgICBab25lZERhdGVUaW1lIHpkdCA9IGxvY2FsRGF0ZVRpbWUuYXRab25lKFpvbmVJZC5zeXN0ZW1EZWZhdWx0KCkpOworICAgICAgICByZXR1cm4gRGF0ZS5mcm9tKHpkdC50b0luc3RhbnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9EZXNlbnNpdGl6ZWRVdGlsLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0Rlc2Vuc2l0aXplZFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE0YzAyCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9EZXNlbnNpdGl6ZWRVdGlsLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCisvKioKKyAqIOiEseaVj+W3peWFt+exuworICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIERlc2Vuc2l0aXplZFV0aWwKK3sKKyAgICAvKioKKyAgICAgKiDlr4bnoIHnmoTlhajpg6jlrZfnrKbpg73nlKgq5Luj5pu/77yM5q+U5aaC77yaKioqKioqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQg5a+G56CBCisgICAgICogQHJldHVybiDohLHmlY/lkI7nmoTlr4bnoIEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNCbGFuayhwYXNzd29yZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMucmVwZWF0KCcqJywgcGFzc3dvcmQubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9pueJjOS4remXtOeUqCrku6Pmm7/vvIzlpoLmnpzmmK/plJnor6/nmoTovabniYzvvIzkuI3lpITnkIYKKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXJMaWNlbnNlIOWujOaVtOeahOi9pueJjOWPtworICAgICAqIEByZXR1cm4g6ISx5pWP5ZCO55qE6L2m54mMCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FyTGljZW5zZShTdHJpbmcgY2FyTGljZW5zZSkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKGNhckxpY2Vuc2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgLy8g5pmu6YCa6L2m54mMCisgICAgICAgIGlmIChjYXJMaWNlbnNlLmxlbmd0aCgpID09IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhckxpY2Vuc2UgPSBTdHJpbmdVdGlscy5oaWRlKGNhckxpY2Vuc2UsIDMsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNhckxpY2Vuc2UubGVuZ3RoKCkgPT0gOCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5paw6IO95rqQ6L2m54mMCisgICAgICAgICAgICBjYXJMaWNlbnNlID0gU3RyaW5nVXRpbHMuaGlkZShjYXJMaWNlbnNlLCAzLCA3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FyTGljZW5zZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0RpY3RVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9EaWN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk4NDYyCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9EaWN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05BcnJheTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNhY2hlQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RpY3REYXRhOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5yZWRpcy5SZWRpc0NhY2hlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuc3ByaW5nLlNwcmluZ1V0aWxzOworCisvKioKKyAqIOWtl+WFuOW3peWFt+exuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBEaWN0VXRpbHMKK3sKKyAgICAvKioKKyAgICAgKiDliIbpmpTnrKYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLCI7CisKKyAgICAvKioKKyAgICAgKiDorr7nva7lrZflhbjnvJPlrZgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5IOWPguaVsOmUrgorICAgICAqIEBwYXJhbSBkaWN0RGF0YXMg5a2X5YW45pWw5o2u5YiX6KGoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERpY3RDYWNoZShTdHJpbmcga2V5LCBMaXN0PFN5c0RpY3REYXRhPiBkaWN0RGF0YXMpCisgICAgeworICAgICAgICBTcHJpbmdVdGlscy5nZXRCZWFuKFJlZGlzQ2FjaGUuY2xhc3MpLnNldENhY2hlT2JqZWN0KGdldENhY2hlS2V5KGtleSksIGRpY3REYXRhcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a2X5YW457yT5a2YCisgICAgICogCisgICAgICogQHBhcmFtIGtleSDlj4LmlbDplK4KKyAgICAgKiBAcmV0dXJuIGRpY3REYXRhcyDlrZflhbjmlbDmja7liJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3lzRGljdERhdGE+IGdldERpY3RDYWNoZShTdHJpbmcga2V5KQorICAgIHsKKyAgICAgICAgSlNPTkFycmF5IGFycmF5Q2FjaGUgPSBTcHJpbmdVdGlscy5nZXRCZWFuKFJlZGlzQ2FjaGUuY2xhc3MpLmdldENhY2hlT2JqZWN0KGdldENhY2hlS2V5KGtleSkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGFycmF5Q2FjaGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXJyYXlDYWNoZS50b0xpc3QoU3lzRGljdERhdGEuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei+WSjOWtl+WFuOWAvOiOt+WPluWtl+WFuOagh+etvgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnosKKyAgICAgKiBAcGFyYW0gZGljdFZhbHVlIOWtl+WFuOWAvAorICAgICAqIEByZXR1cm4g5a2X5YW45qCH562+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGljdExhYmVsKFN0cmluZyBkaWN0VHlwZSwgU3RyaW5nIGRpY3RWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGRpY3RWYWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0RGljdExhYmVsKGRpY3RUeXBlLCBkaWN0VmFsdWUsIFNFUEFSQVRPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5ZKM5a2X5YW45qCH562+6I635Y+W5a2X5YW45YC8CisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEBwYXJhbSBkaWN0TGFiZWwg5a2X5YW45qCH562+CisgICAgICogQHJldHVybiDlrZflhbjlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWN0VmFsdWUoU3RyaW5nIGRpY3RUeXBlLCBTdHJpbmcgZGljdExhYmVsKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZGljdExhYmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREaWN0VmFsdWUoZGljdFR5cGUsIGRpY3RMYWJlbCwgU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnovlkozlrZflhbjlgLzojrflj5blrZflhbjmoIfnrb4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHBhcmFtIGRpY3RWYWx1ZSDlrZflhbjlgLwKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIOWIhumalOespgorICAgICAqIEByZXR1cm4g5a2X5YW45qCH562+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGljdExhYmVsKFN0cmluZyBkaWN0VHlwZSwgU3RyaW5nIGRpY3RWYWx1ZSwgU3RyaW5nIHNlcGFyYXRvcikKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcHJvcGVydHlTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBMaXN0PFN5c0RpY3REYXRhPiBkYXRhcyA9IGdldERpY3RDYWNoZShkaWN0VHlwZSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwoZGF0YXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmNvbnRhaW5zQW55KHNlcGFyYXRvciwgZGljdFZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTeXNEaWN0RGF0YSBkaWN0IDogZGF0YXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBkaWN0VmFsdWUuc3BsaXQoc2VwYXJhdG9yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoZGljdC5nZXREaWN0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RyaW5nLmFwcGVuZChkaWN0LmdldERpY3RMYWJlbCgpKS5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTeXNEaWN0RGF0YSBkaWN0IDogZGF0YXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpY3RWYWx1ZS5lcXVhbHMoZGljdC5nZXREaWN0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5nZXREaWN0TGFiZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwRW5kKHByb3BlcnR5U3RyaW5nLnRvU3RyaW5nKCksIHNlcGFyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5ZKM5a2X5YW45qCH562+6I635Y+W5a2X5YW45YC8CisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEBwYXJhbSBkaWN0TGFiZWwg5a2X5YW45qCH562+CisgICAgICogQHBhcmFtIHNlcGFyYXRvciDliIbpmpTnrKYKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOWAvAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpY3RWYWx1ZShTdHJpbmcgZGljdFR5cGUsIFN0cmluZyBkaWN0TGFiZWwsIFN0cmluZyBzZXBhcmF0b3IpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHByb3BlcnR5U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgTGlzdDxTeXNEaWN0RGF0YT4gZGF0YXMgPSBnZXREaWN0Q2FjaGUoZGljdFR5cGUpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOdWxsKGRhdGFzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICB9CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueShzZXBhcmF0b3IsIGRpY3RMYWJlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3lzRGljdERhdGEgZGljdCA6IGRhdGFzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxhYmVsIDogZGljdExhYmVsLnNwbGl0KHNlcGFyYXRvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwuZXF1YWxzKGRpY3QuZ2V0RGljdExhYmVsKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmluZy5hcHBlbmQoZGljdC5nZXREaWN0VmFsdWUoKSkuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3lzRGljdERhdGEgZGljdCA6IGRhdGFzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaWN0TGFiZWwuZXF1YWxzKGRpY3QuZ2V0RGljdExhYmVsKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuZ2V0RGljdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5zdHJpcEVuZChwcm9wZXJ0eVN0cmluZy50b1N0cmluZygpLCBzZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei+iOt+WPluWtl+WFuOaJgOacieWAvAorICAgICAqCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEByZXR1cm4g5a2X5YW45YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGljdFZhbHVlcyhTdHJpbmcgZGljdFR5cGUpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHByb3BlcnR5U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgTGlzdDxTeXNEaWN0RGF0YT4gZGF0YXMgPSBnZXREaWN0Q2FjaGUoZGljdFR5cGUpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOdWxsKGRhdGFzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICB9CisgICAgICAgIGZvciAoU3lzRGljdERhdGEgZGljdCA6IGRhdGFzKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0eVN0cmluZy5hcHBlbmQoZGljdC5nZXREaWN0VmFsdWUoKSkuYXBwZW5kKFNFUEFSQVRPUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwRW5kKHByb3BlcnR5U3RyaW5nLnRvU3RyaW5nKCksIFNFUEFSQVRPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L6I635Y+W5a2X5YW45omA5pyJ5qCH562+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDlrZflhbjlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWN0TGFiZWxzKFN0cmluZyBkaWN0VHlwZSkKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcHJvcGVydHlTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBMaXN0PFN5c0RpY3REYXRhPiBkYXRhcyA9IGdldERpY3RDYWNoZShkaWN0VHlwZSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwoZGF0YXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTeXNEaWN0RGF0YSBkaWN0IDogZGF0YXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3BlcnR5U3RyaW5nLmFwcGVuZChkaWN0LmdldERpY3RMYWJlbCgpKS5hcHBlbmQoU0VQQVJBVE9SKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuc3RyaXBFbmQocHJvcGVydHlTdHJpbmcudG9TdHJpbmcoKSwgU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTmjIflrprlrZflhbjnvJPlrZgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5IOWtl+WFuOmUrgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVEaWN0Q2FjaGUoU3RyaW5nIGtleSkKKyAgICB7CisgICAgICAgIFNwcmluZ1V0aWxzLmdldEJlYW4oUmVkaXNDYWNoZS5jbGFzcykuZGVsZXRlT2JqZWN0KGdldENhY2hlS2V5KGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOa4heepuuWtl+WFuOe8k+WtmAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckRpY3RDYWNoZSgpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4ga2V5cyA9IFNwcmluZ1V0aWxzLmdldEJlYW4oUmVkaXNDYWNoZS5jbGFzcykua2V5cyhDYWNoZUNvbnN0YW50cy5TWVNfRElDVF9LRVkgKyAiKiIpOworICAgICAgICBTcHJpbmdVdGlscy5nZXRCZWFuKFJlZGlzQ2FjaGUuY2xhc3MpLmRlbGV0ZU9iamVjdChrZXlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva5jYWNoZSBrZXkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnS2V5IOWPguaVsOmUrgorICAgICAqIEByZXR1cm4g57yT5a2Y6ZSua2V5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2FjaGVLZXkoU3RyaW5nIGNvbmZpZ0tleSkKKyAgICB7CisgICAgICAgIHJldHVybiBDYWNoZUNvbnN0YW50cy5TWVNfRElDVF9LRVkgKyBjb25maWdLZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9FeGNlcHRpb25VdGlsLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0V4Y2VwdGlvblV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRlNGEwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9FeGNlcHRpb25VdGlsLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuZXhjZXB0aW9uLkV4Y2VwdGlvblV0aWxzOworCisvKioKKyAqIOmUmeivr+S/oeaBr+WkhOeQhuexu+OAggorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvblV0aWwKK3sKKyAgICAvKioKKyAgICAgKiDojrflj5ZleGNlcHRpb27nmoTor6bnu4bplJnor6/kv6Hmga/jgIIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeGNlcHRpb25NZXNzYWdlKFRocm93YWJsZSBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3csIHRydWUpKTsKKyAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Um9vdEVycm9yTWVzc2FnZShFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSByb290ID0gRXhjZXB0aW9uVXRpbHMuZ2V0Um9vdENhdXNlKGUpOworICAgICAgICByb290ID0gKHJvb3QgPT0gbnVsbCA/IGUgOiByb290KTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBtc2cgPSByb290LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1zZyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9Mb2dVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9Mb2dVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTMwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL0xvZ1V0aWxzLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCisvKioKKyAqIOWkhOeQhuW5tuiusOW9leaXpeW/l+aWh+S7tgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dVdGlscworeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJsb2NrKE9iamVjdCBtc2cpCisgICAgeworICAgICAgICBpZiAobXNnID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9ICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiWyIgKyBtc2cudG9TdHJpbmcoKSArICJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL01lc3NhZ2VVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9NZXNzYWdlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFjNzVhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9NZXNzYWdlVXRpbHMuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHM7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuTWVzc2FnZVNvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuaTE4bi5Mb2NhbGVDb250ZXh0SG9sZGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuc3ByaW5nLlNwcmluZ1V0aWxzOworCisvKioKKyAqIOiOt+WPlmkxOG7otYTmupDmlofku7YKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZVV0aWxzCit7CisgICAgLyoqCisgICAgICog5qC55o2u5raI5oGv6ZSu5ZKM5Y+C5pWwIOiOt+WPlua2iOaBryDlp5TmiZjnu5lzcHJpbmcgbWVzc2FnZVNvdXJjZQorICAgICAqCisgICAgICogQHBhcmFtIGNvZGUg5raI5oGv6ZSuCisgICAgICogQHBhcmFtIGFyZ3Mg5Y+C5pWwCisgICAgICogQHJldHVybiDojrflj5blm73pmYXljJbnv7vor5HlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlKFN0cmluZyBjb2RlLCBPYmplY3QuLi4gYXJncykKKyAgICB7CisgICAgICAgIE1lc3NhZ2VTb3VyY2UgbWVzc2FnZVNvdXJjZSA9IFNwcmluZ1V0aWxzLmdldEJlYW4oTWVzc2FnZVNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBtZXNzYWdlU291cmNlLmdldE1lc3NhZ2UoY29kZSwgYXJncywgTG9jYWxlQ29udGV4dEhvbGRlci5nZXRMb2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9QYWdlVXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvUGFnZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlOWIwOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvUGFnZVV0aWxzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgY29tLmdpdGh1Yi5wYWdlaGVscGVyLlBhZ2VIZWxwZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuUGFnZURvbWFpbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZS5UYWJsZVN1cHBvcnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcWwuU3FsVXRpbDsKKworLyoqCisgKiDliIbpobXlt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgUGFnZVV0aWxzIGV4dGVuZHMgUGFnZUhlbHBlcgoreworICAgIC8qKgorICAgICAqIOiuvue9ruivt+axguWIhumhteaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydFBhZ2UoKQorICAgIHsKKyAgICAgICAgUGFnZURvbWFpbiBwYWdlRG9tYWluID0gVGFibGVTdXBwb3J0LmJ1aWxkUGFnZVJlcXVlc3QoKTsKKyAgICAgICAgSW50ZWdlciBwYWdlTnVtID0gcGFnZURvbWFpbi5nZXRQYWdlTnVtKCk7CisgICAgICAgIEludGVnZXIgcGFnZVNpemUgPSBwYWdlRG9tYWluLmdldFBhZ2VTaXplKCk7CisgICAgICAgIFN0cmluZyBvcmRlckJ5ID0gU3FsVXRpbC5lc2NhcGVPcmRlckJ5U3FsKHBhZ2VEb21haW4uZ2V0T3JkZXJCeSgpKTsKKyAgICAgICAgQm9vbGVhbiByZWFzb25hYmxlID0gcGFnZURvbWFpbi5nZXRSZWFzb25hYmxlKCk7CisgICAgICAgIFBhZ2VIZWxwZXIuc3RhcnRQYWdlKHBhZ2VOdW0sIHBhZ2VTaXplLCBvcmRlckJ5KS5zZXRSZWFzb25hYmxlKHJlYXNvbmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOa4heeQhuWIhumhteeahOe6v+eoi+WPmOmHjworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclBhZ2UoKQorICAgIHsKKyAgICAgICAgUGFnZUhlbHBlci5jbGVhclBhZ2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL1NlY3VyaXR5VXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvU2VjdXJpdHlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2FjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL1NlY3VyaXR5VXRpbHMuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmNvcmUuY29udGV4dC5TZWN1cml0eUNvbnRleHRIb2xkZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jcnlwdG8uYmNyeXB0LkJDcnlwdFBhc3N3b3JkRW5jb2RlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuUGF0dGVybk1hdGNoVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5IdHRwU3RhdHVzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKKworLyoqCisgKiDlronlhajmnI3liqHlt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlVdGlscworeworCisgICAgLyoqCisgICAgICog55So5oi3SUQKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBMb25nIGdldFVzZXJJZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldExvZ2luVXNlcigpLmdldFVzZXJJZCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuiOt+WPlueUqOaIt0lE5byC5bi4IiwgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6YOo6ZeoSUQKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBMb25nIGdldERlcHRJZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldExvZ2luVXNlcigpLmdldERlcHRJZCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuiOt+WPlumDqOmXqElE5byC5bi4IiwgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W55So5oi36LSm5oi3CisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVzZXJuYW1lKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TG9naW5Vc2VyKCkuZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLojrflj5bnlKjmiLfotKbmiLflvILluLgiLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnlKjmiLcKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBMb2dpblVzZXIgZ2V0TG9naW5Vc2VyKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKExvZ2luVXNlcikgZ2V0QXV0aGVudGljYXRpb24oKS5nZXRQcmluY2lwYWwoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLojrflj5bnlKjmiLfkv6Hmga/lvILluLgiLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZBdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQXV0aGVudGljYXRpb24gZ2V0QXV0aGVudGljYXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29udGV4dEhvbGRlci5nZXRDb250ZXh0KCkuZ2V0QXV0aGVudGljYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJBCQ3J5cHRQYXNzd29yZEVuY29kZXLlr4bnoIEKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCDlr4bnoIEKKyAgICAgKiBAcmV0dXJuIOWKoOWvhuWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY3J5cHRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICBCQ3J5cHRQYXNzd29yZEVuY29kZXIgcGFzc3dvcmRFbmNvZGVyID0gbmV3IEJDcnlwdFBhc3N3b3JkRW5jb2RlcigpOworICAgICAgICByZXR1cm4gcGFzc3dvcmRFbmNvZGVyLmVuY29kZShwYXNzd29yZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yik5pat5a+G56CB5piv5ZCm55u45ZCMCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmF3UGFzc3dvcmQg55yf5a6e5a+G56CBCisgICAgICogQHBhcmFtIGVuY29kZWRQYXNzd29yZCDliqDlr4blkI7lrZfnrKYKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzUGFzc3dvcmQoU3RyaW5nIHJhd1Bhc3N3b3JkLCBTdHJpbmcgZW5jb2RlZFBhc3N3b3JkKQorICAgIHsKKyAgICAgICAgQkNyeXB0UGFzc3dvcmRFbmNvZGVyIHBhc3N3b3JkRW5jb2RlciA9IG5ldyBCQ3J5cHRQYXNzd29yZEVuY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIHBhc3N3b3JkRW5jb2Rlci5tYXRjaGVzKHJhd1Bhc3N3b3JkLCBlbmNvZGVkUGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaYr+WQpuS4uueuoeeQhuWRmAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FkbWluKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZCAhPSBudWxsICYmIDFMID09IHVzZXJJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpqozor4HnlKjmiLfmmK/lkKblhbflpIfmn5DmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiDmnYPpmZDlrZfnrKbkuLIKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+aYr+WQpuWFt+Wkh+afkOadg+mZkAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQZXJtaShTdHJpbmcgcGVybWlzc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBoYXNQZXJtaShnZXRMb2dpblVzZXIoKS5nZXRQZXJtaXNzaW9ucygpLCBwZXJtaXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3mmK/lkKbljIXlkKvmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXV0aG9yaXRpZXMg5p2D6ZmQ5YiX6KGoCisgICAgICogQHBhcmFtIHBlcm1pc3Npb24g5p2D6ZmQ5a2X56ym5LiyCisgICAgICogQHJldHVybiDnlKjmiLfmmK/lkKblhbflpIfmn5DmnYPpmZAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUGVybWkoQ29sbGVjdGlvbjxTdHJpbmc+IGF1dGhvcml0aWVzLCBTdHJpbmcgcGVybWlzc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBhdXRob3JpdGllcy5zdHJlYW0oKS5maWx0ZXIoU3RyaW5nVXRpbHM6Omhhc1RleHQpCisgICAgICAgICAgICAgICAgLmFueU1hdGNoKHggLT4gQ29uc3RhbnRzLkFMTF9QRVJNSVNTSU9OLmVxdWFscyh4KSB8fCBQYXR0ZXJuTWF0Y2hVdGlscy5zaW1wbGVNYXRjaCh4LCBwZXJtaXNzaW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6aqM6K+B55So5oi35piv5ZCm5oul5pyJ5p+Q5Liq6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5qCH6K+GCisgICAgICogQHJldHVybiDnlKjmiLfmmK/lkKblhbflpIfmn5Dop5LoibIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUm9sZShTdHJpbmcgcm9sZSkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gcm9sZUxpc3QgPSBnZXRMb2dpblVzZXIoKS5nZXRVc2VyKCkuZ2V0Um9sZXMoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHJvbGVzID0gcm9sZUxpc3Quc3RyZWFtKCkubWFwKFN5c1JvbGU6OmdldFJvbGVLZXkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgcmV0dXJuIGhhc1JvbGUocm9sZXMsIHJvbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIpOaWreaYr+WQpuWMheWQq+inkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlcyDop5LoibLliJfooagKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibIKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+aYr+WQpuWFt+Wkh+afkOinkuiJsuadg+mZkAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSb2xlKENvbGxlY3Rpb248U3RyaW5nPiByb2xlcywgU3RyaW5nIHJvbGUpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZXMuc3RyZWFtKCkuZmlsdGVyKFN0cmluZ1V0aWxzOjpoYXNUZXh0KQorICAgICAgICAgICAgICAgIC5hbnlNYXRjaCh4IC0+IENvbnN0YW50cy5TVVBFUl9BRE1JTi5lcXVhbHMoeCkgfHwgUGF0dGVybk1hdGNoVXRpbHMuc2ltcGxlTWF0Y2goeCwgcm9sZSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9TZXJ2bGV0VXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvU2VydmxldFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzNWRiNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvU2VydmxldFV0aWxzLmphdmEKQEAgLTAsMCArMSwyMTggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5yZXF1ZXN0LlJlcXVlc3RBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5SZXF1ZXN0Q29udGV4dEhvbGRlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0LkNvbnZlcnQ7CisKKy8qKgorICog5a6i5oi356uv5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFNlcnZsZXRVdGlscworeworICAgIC8qKgorICAgICAqIOiOt+WPllN0cmluZ+WPguaVsAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPllN0cmluZ+WPguaVsAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBDb252ZXJ0LnRvU3RyKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXIobmFtZSksIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+WSW50ZWdlcuWPguaVsAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRQYXJhbWV0ZXJUb0ludChTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBDb252ZXJ0LnRvSW50KGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXIobmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlkludGVnZXLlj4LmlbAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0UGFyYW1ldGVyVG9JbnQoU3RyaW5nIG5hbWUsIEludGVnZXIgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbnZlcnQudG9JbnQoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcihuYW1lKSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZCb29sZWFu5Y+C5pWwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGdldFBhcmFtZXRlclRvQm9vbChTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBDb252ZXJ0LnRvQm9vbChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZCb29sZWFu5Y+C5pWwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGdldFBhcmFtZXRlclRvQm9vbChTdHJpbmcgbmFtZSwgQm9vbGVhbiBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gQ29udmVydC50b0Jvb2woZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcihuYW1lKSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflvpfmiYDmnInor7fmsYLlj4LmlbAKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IOivt+axguWvueixoXtAbGluayBTZXJ2bGV0UmVxdWVzdH0KKyAgICAgKiBAcmV0dXJuIE1hcAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nW10+IGdldFBhcmFtcyhTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nW10+IG1hcCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflvpfmiYDmnInor7fmsYLlj4LmlbAKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IOivt+axguWvueixoXtAbGluayBTZXJ2bGV0UmVxdWVzdH0KKyAgICAgKiBAcmV0dXJuIE1hcAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbU1hcChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudHJ5IDogZ2V0UGFyYW1zKHJlcXVlc3QpLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtcy5wdXQoZW50cnkuZ2V0S2V5KCksIFN0cmluZ1V0aWxzLmpvaW4oZW50cnkuZ2V0VmFsdWUoKSwgIiwiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZyZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmxldFJlcXVlc3QgZ2V0UmVxdWVzdCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdEF0dHJpYnV0ZXMoKS5nZXRSZXF1ZXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+WcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFJlcXVlc3RBdHRyaWJ1dGVzKCkuZ2V0UmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0U2Vzc2lvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzIGdldFJlcXVlc3RBdHRyaWJ1dGVzKCkKKyAgICB7CisgICAgICAgIFJlcXVlc3RBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBSZXF1ZXN0Q29udGV4dEhvbGRlci5nZXRSZXF1ZXN0QXR0cmlidXRlcygpOworICAgICAgICByZXR1cm4gKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlcykgYXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlsIblrZfnrKbkuLLmuLLmn5PliLDlrqLmiLfnq68KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2Ug5riy5p+T5a+56LGhCisgICAgICogQHBhcmFtIHN0cmluZyDlvoXmuLLmn5PnmoTlrZfnrKbkuLIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVuZGVyU3RyaW5nKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBzdHJpbmcpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMCk7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoInV0Zi04Iik7CisgICAgICAgICAgICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludChzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5pivQWpheOW8guatpeivt+axggorICAgICAqIAorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWpheFJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmcgYWNjZXB0ID0gcmVxdWVzdC5nZXRIZWFkZXIoImFjY2VwdCIpOworICAgICAgICBpZiAoYWNjZXB0ICE9IG51bGwgJiYgYWNjZXB0LmNvbnRhaW5zKCJhcHBsaWNhdGlvbi9qc29uIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHhSZXF1ZXN0ZWRXaXRoID0gcmVxdWVzdC5nZXRIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiKTsKKyAgICAgICAgaWYgKHhSZXF1ZXN0ZWRXaXRoICE9IG51bGwgJiYgeFJlcXVlc3RlZFdpdGguY29udGFpbnMoIlhNTEh0dHBSZXF1ZXN0IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaW5TdHJpbmdJZ25vcmVDYXNlKHVyaSwgIi5qc29uIiwgIi54bWwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYWpheCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJfX2FqYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmluU3RyaW5nSWdub3JlQ2FzZShhamF4LCAianNvbiIsICJ4bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlhoXlrrnnvJbnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyIOWGheWuuQorICAgICAqIEByZXR1cm4g57yW56CB5ZCO55qE5YaF5a65CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyBzdHIpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVSTEVuY29kZXIuZW5jb2RlKHN0ciwgQ29uc3RhbnRzLlVURjgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWGheWuueino+eggQorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg5YaF5a65CisgICAgICogQHJldHVybiDop6PnoIHlkI7nmoTlhoXlrrkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cmxEZWNvZGUoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVVJMRGVjb2Rlci5kZWNvZGUoc3RyLCBDb25zdGFudHMuVVRGOCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9TdHJpbmdVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9TdHJpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzI4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL1N0cmluZ1V0aWxzLmphdmEKQEAgLTAsMCArMSw2ODQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5BbnRQYXRoTWF0Y2hlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dC5TdHJGb3JtYXR0ZXI7CisKKy8qKgorICog5a2X56ym5Liy5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1V0aWxzIGV4dGVuZHMgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzCit7CisgICAgLyoqIOepuuWtl+espuS4siAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMU1RSID0gIiI7CisKKyAgICAvKiog5LiL5YiS57q/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTRVBBUkFUT1IgPSAnXyc7CisKKyAgICAvKiog5pif5Y+3ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBU1RFUklTSyA9ICcqJzsKKworICAgIC8qKgorICAgICAqIOiOt+WPluWPguaVsOS4jeS4uuepuuWAvAorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSBkZWZhdWx0VmFsdWUg6KaB5Yik5pat55qEdmFsdWUKKyAgICAgKiBAcmV0dXJuIHZhbHVlIOi/lOWbnuWAvAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgbnZsKFQgdmFsdWUsIFQgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAqIOWIpOaWreS4gOS4qkNvbGxlY3Rpb27mmK/lkKbkuLrnqbrvvIwg5YyF5ZCrTGlzdO+8jFNldO+8jFF1ZXVlCisgICAgICogCisgICAgICogQHBhcmFtIGNvbGwg6KaB5Yik5pat55qEQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1Ze+8muS4uuepuiBmYWxzZe+8mumdnuepugorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KENvbGxlY3Rpb248Pz4gY29sbCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc051bGwoY29sbCkgfHwgY29sbC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKiDliKTmlq3kuIDkuKpDb2xsZWN0aW9u5piv5ZCm6Z2e56m677yM5YyF5ZCrTGlzdO+8jFNldO+8jFF1ZXVlCisgICAgICogCisgICAgICogQHBhcmFtIGNvbGwg6KaB5Yik5pat55qEQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1Ze+8mumdnuepuiBmYWxzZe+8muepugorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vdEVtcHR5KENvbGxlY3Rpb248Pz4gY29sbCkKKyAgICB7CisgICAgICAgIHJldHVybiAhaXNFbXB0eShjb2xsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAqIOWIpOaWreS4gOS4quWvueixoeaVsOe7hOaYr+WQpuS4uuepugorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3RzIOimgeWIpOaWreeahOWvueixoeaVsOe7hAorICAgICAqKiBAcmV0dXJuIHRydWXvvJrkuLrnqbogZmFsc2XvvJrpnZ7nqboKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShPYmplY3RbXSBvYmplY3RzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzTnVsbChvYmplY3RzKSB8fCAob2JqZWN0cy5sZW5ndGggPT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKiDliKTmlq3kuIDkuKrlr7nosaHmlbDnu4TmmK/lkKbpnZ7nqboKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0cyDopoHliKTmlq3nmoTlr7nosaHmlbDnu4QKKyAgICAgKiBAcmV0dXJuIHRydWXvvJrpnZ7nqbogZmFsc2XvvJrnqboKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOb3RFbXB0eShPYmplY3RbXSBvYmplY3RzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFpc0VtcHR5KG9iamVjdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqICog5Yik5pat5LiA5LiqTWFw5piv5ZCm5Li656m6CisgICAgICogCisgICAgICogQHBhcmFtIG1hcCDopoHliKTmlq3nmoRNYXAKKyAgICAgKiBAcmV0dXJuIHRydWXvvJrkuLrnqbogZmFsc2XvvJrpnZ7nqboKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShNYXA8PywgPz4gbWFwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzTnVsbChtYXApIHx8IG1hcC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKiDliKTmlq3kuIDkuKpNYXDmmK/lkKbkuLrnqboKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFwIOimgeWIpOaWreeahE1hcAorICAgICAqIEByZXR1cm4gdHJ1Ze+8mumdnuepuiBmYWxzZe+8muepugorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vdEVtcHR5KE1hcDw/LCA/PiBtYXApCisgICAgeworICAgICAgICByZXR1cm4gIWlzRW1wdHkobWFwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAqIOWIpOaWreS4gOS4quWtl+espuS4suaYr+WQpuS4uuepuuS4sgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIgU3RyaW5nCisgICAgICogQHJldHVybiB0cnVl77ya5Li656m6IGZhbHNl77ya6Z2e56m6CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBpc051bGwoc3RyKSB8fCBOVUxMU1RSLmVxdWFscyhzdHIudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAqIOWIpOaWreS4gOS4quWtl+espuS4suaYr+WQpuS4uumdnuepuuS4sgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIgU3RyaW5nCisgICAgICogQHJldHVybiB0cnVl77ya6Z2e56m65LiyIGZhbHNl77ya56m65LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm90RW1wdHkoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAhaXNFbXB0eShzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICog5Yik5pat5LiA5Liq5a+56LGh5piv5ZCm5Li656m6CisgICAgICogCisgICAgICogQHBhcmFtIG9iamVjdCBPYmplY3QKKyAgICAgKiBAcmV0dXJuIHRydWXvvJrkuLrnqbogZmFsc2XvvJrpnZ7nqboKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsKE9iamVjdCBvYmplY3QpCisgICAgeworICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogKiDliKTmlq3kuIDkuKrlr7nosaHmmK/lkKbpnZ7nqboKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0IE9iamVjdAorICAgICAqIEByZXR1cm4gdHJ1Ze+8mumdnuepuiBmYWxzZe+8muepugorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgIHJldHVybiAhaXNOdWxsKG9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogKiDliKTmlq3kuIDkuKrlr7nosaHmmK/lkKbmmK/mlbDnu4TnsbvlnovvvIhKYXZh5Z+65pys5Z6L5Yir55qE5pWw57uE77yJCisgICAgICogCisgICAgICogQHBhcmFtIG9iamVjdCDlr7nosaEKKyAgICAgKiBAcmV0dXJuIHRydWXvvJrmmK/mlbDnu4QgZmFsc2XvvJrkuI3mmK/mlbDnu4QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheShPYmplY3Qgb2JqZWN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzTm90TnVsbChvYmplY3QpICYmIG9iamVjdC5nZXRDbGFzcygpLmlzQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDljrvnqbrmoLwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltKFN0cmluZyBzdHIpCisgICAgeworICAgICAgICByZXR1cm4gKHN0ciA9PSBudWxsID8gIiIgOiBzdHIudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmm7/mjaLmjIflrprlrZfnrKbkuLLnmoTmjIflrprljLrpl7TlhoXlrZfnrKbkuLoiKiIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHIg5a2X56ym5LiyCisgICAgICogQHBhcmFtIHN0YXJ0SW5jbHVkZSDlvIDlp4vkvY3nva7vvIjljIXlkKvvvIkKKyAgICAgKiBAcGFyYW0gZW5kRXhjbHVkZSDnu5PmnZ/kvY3nva7vvIjkuI3ljIXlkKvvvIkKKyAgICAgKiBAcmV0dXJuIOabv+aNouWQjueahOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhpZGUoQ2hhclNlcXVlbmNlIHN0ciwgaW50IHN0YXJ0SW5jbHVkZSwgaW50IGVuZEV4Y2x1ZGUpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eShzdHIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTlVMTFNUUjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgc3RyTGVuZ3RoID0gc3RyLmxlbmd0aCgpOworICAgICAgICBpZiAoc3RhcnRJbmNsdWRlID4gc3RyTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTlVMTFNUUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5kRXhjbHVkZSA+IHN0ckxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgZW5kRXhjbHVkZSA9IHN0ckxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRJbmNsdWRlID4gZW5kRXhjbHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5aaC5p6c6LW35aeL5L2N572u5aSn5LqO57uT5p2f5L2N572u77yM5LiN5pu/5o2iCisgICAgICAgICAgICByZXR1cm4gTlVMTFNUUjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltzdHJMZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ckxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+PSBzdGFydEluY2x1ZGUgJiYgaSA8IGVuZEV4Y2x1ZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBBU1RFUklTSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyc1tpXSA9IHN0ci5jaGFyQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaIquWPluWtl+espuS4sgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg5a2X56ym5LiyCisgICAgICogQHBhcmFtIHN0YXJ0IOW8gOWniworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic3RyaW5nKGZpbmFsIFN0cmluZyBzdHIsIGludCBzdGFydCkKKyAgICB7CisgICAgICAgIGlmIChzdHIgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTExTVFI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IHN0ci5sZW5ndGgoKSArIHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydCA+IHN0ci5sZW5ndGgoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTExTVFI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdGFydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5oiq5Y+W5a2X56ym5LiyCisgICAgICogCisgICAgICogQHBhcmFtIHN0ciDlrZfnrKbkuLIKKyAgICAgKiBAcGFyYW0gc3RhcnQg5byA5aeLCisgICAgICogQHBhcmFtIGVuZCDnu5PmnZ8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1YnN0cmluZyhmaW5hbCBTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQpCisgICAgeworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMU1RSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuZCA9IHN0ci5sZW5ndGgoKSArIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IHN0ci5sZW5ndGgoKSArIHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZCA+IHN0ci5sZW5ndGgoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5kID0gc3RyLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTlVMTFNUUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgZW5kID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIpOaWreaYr+WQpuS4uuepuu+8jOW5tuS4lOS4jeaYr+epuueZveWtl+espgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg6KaB5Yik5pat55qEdmFsdWUKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNUZXh0KFN0cmluZyBzdHIpCisgICAgeworICAgICAgICByZXR1cm4gKHN0ciAhPSBudWxsICYmICFzdHIuaXNFbXB0eSgpICYmIGNvbnRhaW5zVGV4dChzdHIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zVGV4dChDaGFyU2VxdWVuY2Ugc3RyKQorICAgIHsKKyAgICAgICAgaW50IHN0ckxlbiA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJMZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoaSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLzlvI/ljJbmlofmnKwsIHt9IOihqOekuuWNoOS9jeespjxicj4KKyAgICAgKiDmraTmlrnms5Xlj6rmmK/nroDljZXlsIbljaDkvY3nrKYge30g5oyJ54Wn6aG65bqP5pu/5o2i5Li65Y+C5pWwPGJyPgorICAgICAqIOWmguaenOaDs+i+k+WHuiB7fSDkvb/nlKggXFzovazkuYkgeyDljbPlj6/vvIzlpoLmnpzmg7PovpPlh7oge30g5LmL5YmN55qEIFwg5L2/55So5Y+M6L2s5LmJ56ymIFxcXFwg5Y2z5Y+vPGJyPgorICAgICAqIOS+i++8mjxicj4KKyAgICAgKiDpgJrluLjkvb/nlKjvvJpmb3JtYXQoInRoaXMgaXMge30gZm9yIHt9IiwgImEiLCAiYiIpIC0+IHRoaXMgaXMgYSBmb3IgYjxicj4KKyAgICAgKiDovazkuYl7fe+8miBmb3JtYXQoInRoaXMgaXMgXFx7fSBmb3Ige30iLCAiYSIsICJiIikgLT4gdGhpcyBpcyBce30gZm9yIGE8YnI+CisgICAgICog6L2s5LmJXO+8miBmb3JtYXQoInRoaXMgaXMgXFxcXHt9IGZvciB7fSIsICJhIiwgImIiKSAtPiB0aGlzIGlzIFxhIGZvciBiPGJyPgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSDmlofmnKzmqKHmnb/vvIzooqvmm7/mjaLnmoTpg6jliIbnlKgge30g6KGo56S6CisgICAgICogQHBhcmFtIHBhcmFtcyDlj4LmlbDlgLwKKyAgICAgKiBAcmV0dXJuIOagvOW8j+WMluWQjueahOaWh+acrAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIE9iamVjdC4uLiBwYXJhbXMpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eShwYXJhbXMpIHx8IGlzRW1wdHkodGVtcGxhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0ckZvcm1hdHRlci5mb3JtYXQodGVtcGxhdGUsIHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5Li6aHR0cChzKTovL+W8gOWktAorICAgICAqIAorICAgICAqIEBwYXJhbSBsaW5rIOmTvuaOpQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzaHR0cChTdHJpbmcgbGluaykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5zdGFydHNXaXRoQW55KGxpbmssIENvbnN0YW50cy5IVFRQLCBDb25zdGFudHMuSFRUUFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWtl+espuS4sui9rHNldAorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg5a2X56ym5LiyCisgICAgICogQHBhcmFtIHNlcCDliIbpmpTnrKYKKyAgICAgKiBAcmV0dXJuIHNldOmbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc3RyMlNldChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oc3RyMkxpc3Qoc3RyLCBzZXAsIHRydWUsIGZhbHNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a2X56ym5Liy6L2sbGlzdAorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg5a2X56ym5LiyCisgICAgICogQHBhcmFtIHNlcCDliIbpmpTnrKYKKyAgICAgKiBAcGFyYW0gZmlsdGVyQmxhbmsg6L+H5ruk57qv56m655m9CisgICAgICogQHBhcmFtIHRyaW0g5Y675o6J6aaW5bC+56m655m9CisgICAgICogQHJldHVybiBsaXN06ZuG5ZCICisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gc3RyMkxpc3QoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcCwgYm9vbGVhbiBmaWx0ZXJCbGFuaywgYm9vbGVhbiB0cmltKQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoc3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICAvLyDov4fmu6Tnqbrnmb3lrZfnrKbkuLIKKyAgICAgICAgaWYgKGZpbHRlckJsYW5rICYmIFN0cmluZ1V0aWxzLmlzQmxhbmsoc3RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBzdHIuc3BsaXQoc2VwKTsKKyAgICAgICAgZm9yIChTdHJpbmcgc3RyaW5nIDogc3BsaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJCbGFuayAmJiBTdHJpbmdVdGlscy5pc0JsYW5rKHN0cmluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJpbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcudHJpbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5hZGQoc3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIpOaWree7meWumueahGNvbGxlY3Rpb27liJfooajkuK3mmK/lkKbljIXlkKvmlbDnu4RhcnJheSDliKTmlq3nu5nlrprnmoTmlbDnu4RhcnJheeS4reaYr+WQpuWMheWQq+e7meWumueahOWFg+e0oHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiDnu5nlrprnmoTpm4blkIgKKyAgICAgKiBAcGFyYW0gYXJyYXkg57uZ5a6a55qE5pWw57uECisgICAgICogQHJldHVybiBib29sZWFuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiwgU3RyaW5nLi4uIGFycmF5KQorICAgIHsKKyAgICAgICAgaWYgKGlzRW1wdHkoY29sbGVjdGlvbikgfHwgaXNFbXB0eShhcnJheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0ciA6IGFycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKHN0cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xmib7mjIflrprlrZfnrKbkuLLmmK/lkKbljIXlkKvmjIflrprlrZfnrKbkuLLliJfooajkuK3nmoTku7vmhI/kuIDkuKrlrZfnrKbkuLLlkIzml7bkuLLlv73nlaXlpKflsI/lhpkKKyAgICAgKgorICAgICAqIEBwYXJhbSBjcyDmjIflrprlrZfnrKbkuLIKKyAgICAgKiBAcGFyYW0gc2VhcmNoQ2hhclNlcXVlbmNlcyDpnIDopoHmo4Dmn6XnmoTlrZfnrKbkuLLmlbDnu4QKKyAgICAgKiBAcmV0dXJuIOaYr+WQpuWMheWQq+S7u+aEj+S4gOS4quWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FueUlnbm9yZUNhc2UoQ2hhclNlcXVlbmNlIGNzLCBDaGFyU2VxdWVuY2UuLi4gc2VhcmNoQ2hhclNlcXVlbmNlcykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KGNzKSB8fCBpc0VtcHR5KHNlYXJjaENoYXJTZXF1ZW5jZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChDaGFyU2VxdWVuY2UgdGVzdFN0ciA6IHNlYXJjaENoYXJTZXF1ZW5jZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb250YWluc0lnbm9yZUNhc2UoY3MsIHRlc3RTdHIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpqbzls7DovazkuIvliJLnur/lkb3lkI0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1VuZGVyU2NvcmVDYXNlKFN0cmluZyBzdHIpCisgICAgeworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAvLyDliY3nva7lrZfnrKbmmK/lkKblpKflhpkKKyAgICAgICAgYm9vbGVhbiBwcmVDaGFySXNVcHBlckNhc2UgPSB0cnVlOworICAgICAgICAvLyDlvZPliY3lrZfnrKbmmK/lkKblpKflhpkKKyAgICAgICAgYm9vbGVhbiBjdXJyZUNoYXJJc1VwcGVyQ2FzZSA9IHRydWU7CisgICAgICAgIC8vIOS4i+S4gOWtl+espuaYr+WQpuWkp+WGmQorICAgICAgICBib29sZWFuIG5leHRlQ2hhcklzVXBwZXJDYXNlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmVDaGFySXNVcHBlckNhc2UgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyLmNoYXJBdChpIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZUNoYXJJc1VwcGVyQ2FzZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZUNoYXJJc1VwcGVyQ2FzZSA9IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjKTsKKworICAgICAgICAgICAgaWYgKGkgPCAoc3RyLmxlbmd0aCgpIC0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dGVDaGFySXNVcHBlckNhc2UgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyLmNoYXJBdChpICsgMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJlQ2hhcklzVXBwZXJDYXNlICYmIGN1cnJlQ2hhcklzVXBwZXJDYXNlICYmICFuZXh0ZUNoYXJJc1VwcGVyQ2FzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU0VQQVJBVE9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChpICE9IDAgJiYgIXByZUNoYXJJc1VwcGVyQ2FzZSkgJiYgY3VycmVDaGFySXNVcHBlckNhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFNFUEFSQVRPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaYr+WQpuWMheWQq+Wtl+espuS4sgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg6aqM6K+B5a2X56ym5LiyCisgICAgICogQHBhcmFtIHN0cnMg5a2X56ym5Liy57uECisgICAgICogQHJldHVybiDljIXlkKvov5Tlm550cnVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGluU3RyaW5nSWdub3JlQ2FzZShTdHJpbmcgc3RyLCBTdHJpbmcuLi4gc3RycykKKyAgICB7CisgICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiBzdHJzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSh0cmltKHMpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG5LiL5YiS57q/5aSn5YaZ5pa55byP5ZG95ZCN55qE5a2X56ym5Liy6L2s5o2i5Li66am85bOw5byP44CC5aaC5p6c6L2s5o2i5YmN55qE5LiL5YiS57q/5aSn5YaZ5pa55byP5ZG95ZCN55qE5a2X56ym5Liy5Li656m677yM5YiZ6L+U5Zue56m65a2X56ym5Liy44CCIOS+i+Wmgu+8mkhFTExPX1dPUkxELT5IZWxsb1dvcmxkCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUg6L2s5o2i5YmN55qE5LiL5YiS57q/5aSn5YaZ5pa55byP5ZG95ZCN55qE5a2X56ym5LiyCisgICAgICogQHJldHVybiDovazmjaLlkI7nmoTpqbzls7DlvI/lkb3lkI3nmoTlrZfnrKbkuLIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DYW1lbENhc2UoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIC8vIOW/q+mAn+ajgOafpQorICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDmsqHlv4XopoHovazmjaIKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghbmFtZS5jb250YWlucygiXyIpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDkuI3lkKvkuIvliJLnur/vvIzku4XlsIbpppblrZfmr43lpKflhpkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8g55So5LiL5YiS57q/5bCG5Y6f5aeL5a2X56ym5Liy5YiG5YmyCisgICAgICAgIFN0cmluZ1tdIGNhbWVscyA9IG5hbWUuc3BsaXQoIl8iKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY2FtZWwgOiBjYW1lbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOi3s+i/h+WOn+Wni+Wtl+espuS4suS4reW8gOWktOOAgee7k+WwvueahOS4i+aNoue6v+aIluWPjOmHjeS4i+WIkue6vworICAgICAgICAgICAgaWYgKGNhbWVsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIOmmluWtl+avjeWkp+WGmQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjYW1lbC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNhbWVsLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6am85bOw5byP5ZG95ZCN5rOVCisgICAgICog5L6L5aaC77yadXNlcl9uYW1lLT51c2VyTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ2FtZWxDYXNlKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMuaW5kZXhPZihTRVBBUkFUT1IpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgICAgICBzID0gcy50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7CisgICAgICAgIGJvb2xlYW4gdXBwZXJDYXNlID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKworICAgICAgICAgICAgaWYgKGMgPT0gU0VQQVJBVE9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVwcGVyQ2FzZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh1cHBlckNhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7CisgICAgICAgICAgICAgICAgdXBwZXJDYXNlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeaJvuaMh+WumuWtl+espuS4suaYr+WQpuWMuemFjeaMh+WumuWtl+espuS4suWIl+ihqOS4reeahOS7u+aEj+S4gOS4quWtl+espuS4sgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIg5oyH5a6a5a2X56ym5LiyCisgICAgICogQHBhcmFtIHN0cnMg6ZyA6KaB5qOA5p+l55qE5a2X56ym5Liy5pWw57uECisgICAgICogQHJldHVybiDmmK/lkKbljLnphY0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyLCBMaXN0PFN0cmluZz4gc3RycykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KHN0cikgfHwgaXNFbXB0eShzdHJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIHBhdHRlcm4gOiBzdHJzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNNYXRjaChwYXR0ZXJuLCBzdHIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq11cmzmmK/lkKbkuI7op4TliJnphY3nva46IAorICAgICAqID8g6KGo56S65Y2V5Liq5a2X56ymOyAKKyAgICAgKiAqIOihqOekuuS4gOWxgui3r+W+hOWGheeahOS7u+aEj+Wtl+espuS4su+8jOS4jeWPr+i3qOWxgue6pzsgCisgICAgICogKiog6KGo56S65Lu75oSP5bGC6Lev5b6EOworICAgICAqIAorICAgICAqIEBwYXJhbSBwYXR0ZXJuIOWMuemFjeinhOWImQorICAgICAqIEBwYXJhbSB1cmwg6ZyA6KaB5Yy56YWN55qEdXJsCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgdXJsKQorICAgIHsKKyAgICAgICAgQW50UGF0aE1hdGNoZXIgbWF0Y2hlciA9IG5ldyBBbnRQYXRoTWF0Y2hlcigpOworICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChwYXR0ZXJuLCB1cmwpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgY2FzdChPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChUKSBvYmo7CisgICAgfQorCisgICAgLyoqCisgICAgICog5pWw5a2X5bem6L656KGl6b2QMO+8jOS9v+S5i+i+vuWIsOaMh+WumumVv+W6puOAguazqOaEj++8jOWmguaenOaVsOWtl+i9rOaNouS4uuWtl+espuS4suWQju+8jOmVv+W6puWkp+S6jnNpemXvvIzliJnlj6rkv53nlZkg5pyA5ZCOc2l6ZeS4quWtl+espuOAggorICAgICAqIAorICAgICAqIEBwYXJhbSBudW0g5pWw5a2X5a+56LGhCisgICAgICogQHBhcmFtIHNpemUg5a2X56ym5Liy5oyH5a6a6ZW/5bqmCisgICAgICogQHJldHVybiDov5Tlm57mlbDlrZfnmoTlrZfnrKbkuLLmoLzlvI/vvIzor6XlrZfnrKbkuLLkuLrmjIflrprplb/luqbjgIIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwYWRsKGZpbmFsIE51bWJlciBudW0sIGZpbmFsIGludCBzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhZGwobnVtLnRvU3RyaW5nKCksIHNpemUsICcwJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a2X56ym5Liy5bem6KGl6b2Q44CC5aaC5p6c5Y6f5aeL5a2X56ym5Liyc+mVv+W6puWkp+S6jnNpemXvvIzliJnlj6rkv53nlZnmnIDlkI5zaXpl5Liq5a2X56ym44CCCisgICAgICogCisgICAgICogQHBhcmFtIHMg5Y6f5aeL5a2X56ym5LiyCisgICAgICogQHBhcmFtIHNpemUg5a2X56ym5Liy5oyH5a6a6ZW/5bqmCisgICAgICogQHBhcmFtIGMg55So5LqO6KGl6b2Q55qE5a2X56ymCisgICAgICogQHJldHVybiDov5Tlm57mjIflrprplb/luqbnmoTlrZfnrKbkuLLvvIznlLHljp/lrZfnrKbkuLLlt6booaXpvZDmiJbmiKrlj5blvpfliLDjgIIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwYWRsKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBpbnQgc2l6ZSwgZmluYWwgY2hhciBjKQorICAgIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHNpemUpOworICAgICAgICBpZiAocyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpIDw9IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNpemUgLSBsZW47IGkgPiAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcobGVuIC0gc2l6ZSwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzaXplOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9UaHJlYWRzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL1RocmVhZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZlNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9UaHJlYWRzLmphdmEKQEAgLTAsMCArMSw5OSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICog57q/56iL55u45YWz5bel5YW357G7LgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRzCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRocmVhZHMuY2xhc3MpOworCisgICAgLyoqCisgICAgICogc2xlZXDnrYnlvoUs5Y2V5L2N5Li65q+r56eSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKGxvbmcgbWlsbGlzZWNvbmRzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtaWxsaXNlY29uZHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlgZzmraLnur/nqIvmsaAKKyAgICAgKiDlhYjkvb/nlKhzaHV0ZG93biwg5YGc5q2i5o6l5pS25paw5Lu75Yqh5bm25bCd6K+V5a6M5oiQ5omA5pyJ5bey5a2Y5Zyo5Lu75YqhLgorICAgICAqIOWmguaenOi2heaXtiwg5YiZ6LCD55Soc2h1dGRvd25Ob3csIOWPlua2iOWcqHdvcmtRdWV1ZeS4rVBlbmRpbmfnmoTku7vliqEs5bm25Lit5pat5omA5pyJ6Zi75aGe5Ye95pWwLgorICAgICAqIOWmguaenOS7jeeEtui2heaZgu+8jOWJh+W8t+WItumAgOWHui4KKyAgICAgKiDlj6blr7nlnKhzaHV0ZG93buaXtue6v+eoi+acrOi6q+iiq+iwg+eUqOS4reaWreWBmuS6huWkhOeQhi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd25BbmRBd2FpdFRlcm1pbmF0aW9uKEV4ZWN1dG9yU2VydmljZSBwb29sKQorICAgIHsKKyAgICAgICAgaWYgKHBvb2wgIT0gbnVsbCAmJiAhcG9vbC5pc1NodXRkb3duKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvb2wuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghcG9vbC5hd2FpdFRlcm1pbmF0aW9uKDEyMCwgVGltZVVuaXQuU0VDT05EUykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb29sLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcG9vbC5hd2FpdFRlcm1pbmF0aW9uKDEyMCwgVGltZVVuaXQuU0VDT05EUykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJQb29sIGRpZCBub3QgdGVybWluYXRlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9vbC5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmiZPljbDnur/nqIvlvILluLjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFeGNlcHRpb24oUnVubmFibGUgciwgVGhyb3dhYmxlIHQpCisgICAgeworICAgICAgICBpZiAodCA9PSBudWxsICYmIHIgaW5zdGFuY2VvZiBGdXR1cmU8Pz4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSAoRnV0dXJlPD8+KSByOworICAgICAgICAgICAgICAgIGlmIChmdXR1cmUuaXNEb25lKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBjZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQgPSBlZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHQuZ2V0TWVzc2FnZSgpLCB0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvYmVhbi9CZWFuVXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvYmVhbi9CZWFuVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDYzNjYyCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9iZWFuL0JlYW5VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuYmVhbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEJlYW4g5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEJlYW5VdGlscyBleHRlbmRzIG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhblV0aWxzCit7CisgICAgLyoqIEJlYW7mlrnms5XlkI3kuK3lsZ7mgKflkI3lvIDlp4vnmoTkuIvmoIcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkVBTl9NRVRIT0RfUFJPUF9JTkRFWCA9IDM7CisKKyAgICAvKiogKiDljLnphY1nZXR0ZXLmlrnms5XnmoTmraPliJnooajovr7lvI8gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEdFVF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJnZXQoXFxwe2phdmFVcHBlckNhc2V9XFx3KikiKTsKKworICAgIC8qKiAqIOWMuemFjXNldHRlcuaWueazleeahOato+WImeihqOi+vuW8jyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gU0VUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoInNldChcXHB7amF2YVVwcGVyQ2FzZX1cXHcqKSIpOworCisgICAgLyoqCisgICAgICogQmVhbuWxnuaAp+WkjeWItuW3peWFt+aWueazleOAggorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXN0IOebruagh+WvueixoQorICAgICAqIEBwYXJhbSBzcmMg5rqQ5a+56LGhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlCZWFuUHJvcChPYmplY3QgZGVzdCwgT2JqZWN0IHNyYykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBjb3B5UHJvcGVydGllcyhzcmMsIGRlc3QpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWvueixoeeahHNldHRlcuaWueazleOAggorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmog5a+56LGhCisgICAgICogQHJldHVybiDlr7nosaHnmoRzZXR0ZXLmlrnms5XliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kPiBnZXRTZXR0ZXJNZXRob2RzKE9iamVjdCBvYmopCisgICAgeworICAgICAgICAvLyBzZXR0ZXLmlrnms5XliJfooagKKyAgICAgICAgTGlzdDxNZXRob2Q+IHNldHRlck1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZD4oKTsKKworICAgICAgICAvLyDojrflj5bmiYDmnInmlrnms5UKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZHMoKTsKKworICAgICAgICAvLyDmn6Xmib5zZXR0ZXLmlrnms5UKKworICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQorICAgICAgICB7CisgICAgICAgICAgICBNYXRjaGVyIG0gPSBTRVRfUEFUVEVSTi5tYXRjaGVyKG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpICYmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0dGVyTWV0aG9kcy5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyDov5Tlm55zZXR0ZXLmlrnms5XliJfooagKKyAgICAgICAgcmV0dXJuIHNldHRlck1ldGhvZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a+56LGh55qEZ2V0dGVy5pa55rOV44CCCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiDlr7nosaEKKyAgICAgKiBAcmV0dXJuIOWvueixoeeahGdldHRlcuaWueazleWIl+ihqAorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZD4gZ2V0R2V0dGVyTWV0aG9kcyhPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgLy8gZ2V0dGVy5pa55rOV5YiX6KGoCisgICAgICAgIExpc3Q8TWV0aG9kPiBnZXR0ZXJNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7CisgICAgICAgIC8vIOiOt+WPluaJgOacieaWueazlQorICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpOworICAgICAgICAvLyDmn6Xmib5nZXR0ZXLmlrnms5UKKyAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykKKyAgICAgICAgeworICAgICAgICAgICAgTWF0Y2hlciBtID0gR0VUX1BBVFRFUk4ubWF0Y2hlcihtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSAmJiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZHMuYWRkKG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8g6L+U5ZueZ2V0dGVy5pa55rOV5YiX6KGoCisgICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOajgOafpUJlYW7mlrnms5XlkI3kuK3nmoTlsZ7mgKflkI3mmK/lkKbnm7jnrYnjgII8YnI+CisgICAgICog5aaCZ2V0TmFtZSgp5ZKMc2V0TmFtZSgp5bGe5oCn5ZCN5LiA5qC377yMZ2V0TmFtZSgp5ZKMc2V0QWdlKCnlsZ7mgKflkI3kuI3kuIDmoLfjgIIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbTEg5pa55rOV5ZCNMQorICAgICAqIEBwYXJhbSBtMiDmlrnms5XlkI0yCisgICAgICogQHJldHVybiDlsZ7mgKflkI3kuIDmoLfov5Tlm550cnVl77yM5ZCm5YiZ6L+U5ZueZmFsc2UKKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZFByb3BFcXVhbHMoU3RyaW5nIG0xLCBTdHJpbmcgbTIpCisgICAgeworICAgICAgICByZXR1cm4gbTEuc3Vic3RyaW5nKEJFQU5fTUVUSE9EX1BST1BfSU5ERVgpLmVxdWFscyhtMi5zdWJzdHJpbmcoQkVBTl9NRVRIT0RfUFJPUF9JTkRFWCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvYmVhbi9CZWFuVmFsaWRhdG9ycy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9iZWFuL0JlYW5WYWxpZGF0b3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4YWNhNQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvYmVhbi9CZWFuVmFsaWRhdG9ycy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5iZWFuOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uVmFsaWRhdG9yOworCisvKioKKyAqIGJlYW7lr7nosaHlsZ7mgKfpqozor4EKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRvcnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVXaXRoRXhjZXB0aW9uKFZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QsIENsYXNzPD8+Li4uIGdyb3VwcykKKyAgICAgICAgICAgIHRocm93cyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiBjb25zdHJhaW50VmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShvYmplY3QsIGdyb3Vwcyk7CisgICAgICAgIGlmICghY29uc3RyYWludFZpb2xhdGlvbnMuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihjb25zdHJhaW50VmlvbGF0aW9ucyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2ZpbGUvRmlsZVR5cGVVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ZpbGVUeXBlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODEzMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ZpbGVUeXBlVXRpbHMuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog5paH5Lu257G75Z6L5bel5YW357G7CisgKgorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgRmlsZVR5cGVVdGlscworeworICAgIC8qKgorICAgICAqIOiOt+WPluaWh+S7tuexu+WeiworICAgICAqIDxwPgorICAgICAqIOS+i+WmgjogcnVveWkudHh0LCDov5Tlm546IHR4dAorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlIOaWh+S7tuWQjQorICAgICAqIEByZXR1cm4g5ZCO57yA77yI5LiN5ZCrIi4iKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVUeXBlKEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIGlmIChudWxsID09IGZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0RmlsZVR5cGUoZmlsZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluaWh+S7tuexu+WeiworICAgICAqIDxwPgorICAgICAqIOS+i+WmgjogcnVveWkudHh0LCDov5Tlm546IHR4dAorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lIOaWh+S7tuWQjQorICAgICAqIEByZXR1cm4g5ZCO57yA77yI5LiN5ZCrIi4iKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVUeXBlKFN0cmluZyBmaWxlTmFtZSkKKyAgICB7CisgICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgIGlmIChzZXBhcmF0b3JJbmRleCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSkudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bmlofku7bnsbvlnosKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGhvdG9CeXRlIOaWh+S7tuWtl+iKgueggQorICAgICAqIEByZXR1cm4g5ZCO57yA77yI5LiN5ZCrIi4iKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVFeHRlbmROYW1lKGJ5dGVbXSBwaG90b0J5dGUpCisgICAgeworICAgICAgICBTdHJpbmcgc3RyRmlsZUV4dGVuZE5hbWUgPSAiSlBHIjsKKyAgICAgICAgaWYgKChwaG90b0J5dGVbMF0gPT0gNzEpICYmIChwaG90b0J5dGVbMV0gPT0gNzMpICYmIChwaG90b0J5dGVbMl0gPT0gNzApICYmIChwaG90b0J5dGVbM10gPT0gNTYpCisgICAgICAgICAgICAgICAgJiYgKChwaG90b0J5dGVbNF0gPT0gNTUpIHx8IChwaG90b0J5dGVbNF0gPT0gNTcpKSAmJiAocGhvdG9CeXRlWzVdID09IDk3KSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyRmlsZUV4dGVuZE5hbWUgPSAiR0lGIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgocGhvdG9CeXRlWzZdID09IDc0KSAmJiAocGhvdG9CeXRlWzddID09IDcwKSAmJiAocGhvdG9CeXRlWzhdID09IDczKSAmJiAocGhvdG9CeXRlWzldID09IDcwKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyRmlsZUV4dGVuZE5hbWUgPSAiSlBHIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgocGhvdG9CeXRlWzBdID09IDY2KSAmJiAocGhvdG9CeXRlWzFdID09IDc3KSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyRmlsZUV4dGVuZE5hbWUgPSAiQk1QIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgocGhvdG9CeXRlWzFdID09IDgwKSAmJiAocGhvdG9CeXRlWzJdID09IDc4KSAmJiAocGhvdG9CeXRlWzNdID09IDcxKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyRmlsZUV4dGVuZE5hbWUgPSAiUE5HIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyRmlsZUV4dGVuZE5hbWU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvZmlsZS9GaWxlVXBsb2FkVXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvZmlsZS9GaWxlVXBsb2FkVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ1NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ZpbGVVcGxvYWRVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjMyIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVuYW1lVXRpbHM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIubXVsdGlwYXJ0Lk11bHRpcGFydEZpbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25maWcuUnVvWWlDb25maWc7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uZmlsZS5GaWxlTmFtZUxlbmd0aExpbWl0RXhjZWVkZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uZmlsZS5GaWxlU2l6ZUxpbWl0RXhjZWVkZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uZmlsZS5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuRGF0ZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy51dWlkLlNlcTsKKworLyoqCisgKiDmlofku7bkuIrkvKDlt6XlhbfnsbsKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXBsb2FkVXRpbHMKK3sKKyAgICAvKioKKyAgICAgKiDpu5jorqTlpKflsI8gNTBNCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX1NJWkUgPSA1MCAqIDEwMjQgKiAxMDI0TDsKKworICAgIC8qKgorICAgICAqIOm7mOiupOeahOaWh+S7tuWQjeacgOWkp+mVv+W6piAxMDAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZJTEVfTkFNRV9MRU5HVEggPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiDpu5jorqTkuIrkvKDnmoTlnLDlnYAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEJhc2VEaXIgPSBSdW9ZaUNvbmZpZy5nZXRQcm9maWxlKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEJhc2VEaXIoU3RyaW5nIGRlZmF1bHRCYXNlRGlyKQorICAgIHsKKyAgICAgICAgRmlsZVVwbG9hZFV0aWxzLmRlZmF1bHRCYXNlRGlyID0gZGVmYXVsdEJhc2VEaXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEJhc2VEaXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRCYXNlRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS7pem7mOiupOmFjee9rui/m+ihjOaWh+S7tuS4iuS8oAorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUg5LiK5Lyg55qE5paH5Lu2CisgICAgICogQHJldHVybiDmlofku7blkI3np7AKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVwbG9hZChNdWx0aXBhcnRGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB1cGxvYWQoZ2V0RGVmYXVsdEJhc2VEaXIoKSwgZmlsZSwgTWltZVR5cGVVdGlscy5ERUZBVUxUX0FMTE9XRURfRVhURU5TSU9OKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7mlofku7bot6/lvoTkuIrkvKAKKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlRGlyIOebuOWvueW6lOeUqOeahOWfuuebruW9lQorICAgICAqIEBwYXJhbSBmaWxlIOS4iuS8oOeahOaWh+S7tgorICAgICAqIEByZXR1cm4g5paH5Lu25ZCN56ewCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVwbG9hZChTdHJpbmcgYmFzZURpciwgTXVsdGlwYXJ0RmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdXBsb2FkKGJhc2VEaXIsIGZpbGUsIE1pbWVUeXBlVXRpbHMuREVGQVVMVF9BTExPV0VEX0VYVEVOU0lPTik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5paH5Lu25LiK5LygCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZURpciDnm7jlr7nlupTnlKjnmoTln7rnm67lvZUKKyAgICAgKiBAcGFyYW0gZmlsZSDkuIrkvKDnmoTmlofku7YKKyAgICAgKiBAcGFyYW0gYWxsb3dlZEV4dGVuc2lvbiDkuIrkvKDmlofku7bnsbvlnosKKyAgICAgKiBAcmV0dXJuIOi/lOWbnuS4iuS8oOaIkOWKn+eahOaWh+S7tuWQjQorICAgICAqIEB0aHJvd3MgRmlsZVNpemVMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uIOWmguaenOi2heWHuuacgOWkp+Wkp+WwjworICAgICAqIEB0aHJvd3MgRmlsZU5hbWVMZW5ndGhMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uIOaWh+S7tuWQjeWkqumVvworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24g5q+U5aaC6K+75YaZ5paH5Lu25Ye66ZSZ5pe2CisgICAgICogQHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIOaWh+S7tuagoemqjOW8guW4uAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVwbG9hZChTdHJpbmcgYmFzZURpciwgTXVsdGlwYXJ0RmlsZSBmaWxlLCBTdHJpbmdbXSBhbGxvd2VkRXh0ZW5zaW9uKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVTaXplTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEZpbGVOYW1lTGVuZ3RoTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBmaWxlTmFtZWxlbmd0aCA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoZmlsZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCkpLmxlbmd0aCgpOworICAgICAgICBpZiAoZmlsZU5hbWVsZW5ndGggPiBGaWxlVXBsb2FkVXRpbHMuREVGQVVMVF9GSUxFX05BTUVfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5hbWVMZW5ndGhMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKEZpbGVVcGxvYWRVdGlscy5ERUZBVUxUX0ZJTEVfTkFNRV9MRU5HVEgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0QWxsb3dlZChmaWxlLCBhbGxvd2VkRXh0ZW5zaW9uKTsKKworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBleHRyYWN0RmlsZW5hbWUoZmlsZSk7CisKKyAgICAgICAgU3RyaW5nIGFic1BhdGggPSBnZXRBYnNvbHV0ZUZpbGUoYmFzZURpciwgZmlsZU5hbWUpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBmaWxlLnRyYW5zZmVyVG8oUGF0aHMuZ2V0KGFic1BhdGgpKTsKKyAgICAgICAgcmV0dXJuIGdldFBhdGhGaWxlTmFtZShiYXNlRGlyLCBmaWxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog57yW56CB5paH5Lu25ZCNCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXh0cmFjdEZpbGVuYW1lKE11bHRpcGFydEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5mb3JtYXQoInt9L3t9X3t9Lnt9IiwgRGF0ZVV0aWxzLmRhdGVQYXRoKCksCisgICAgICAgICAgICAgICAgRmlsZW5hbWVVdGlscy5nZXRCYXNlTmFtZShmaWxlLmdldE9yaWdpbmFsRmlsZW5hbWUoKSksIFNlcS5nZXRJZChTZXEudXBsb2FkU2VxVHlwZSksIGdldEV4dGVuc2lvbihmaWxlKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlIGdldEFic29sdXRlRmlsZShTdHJpbmcgdXBsb2FkRGlyLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBkZXNjID0gbmV3IEZpbGUodXBsb2FkRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7CisKKyAgICAgICAgaWYgKCFkZXNjLmV4aXN0cygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWRlc2MuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc2MuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFBhdGhGaWxlTmFtZShTdHJpbmcgdXBsb2FkRGlyLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGRpckxhc3RJbmRleCA9IFJ1b1lpQ29uZmlnLmdldFByb2ZpbGUoKS5sZW5ndGgoKSArIDE7CisgICAgICAgIFN0cmluZyBjdXJyZW50RGlyID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nKHVwbG9hZERpciwgZGlyTGFzdEluZGV4KTsKKyAgICAgICAgcmV0dXJuIENvbnN0YW50cy5SRVNPVVJDRV9QUkVGSVggKyAiLyIgKyBjdXJyZW50RGlyICsgIi8iICsgZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paH5Lu25aSn5bCP5qCh6aqMCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSDkuIrkvKDnmoTmlofku7YKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBGaWxlU2l6ZUxpbWl0RXhjZWVkZWRFeGNlcHRpb24g5aaC5p6c6LaF5Ye65pyA5aSn5aSn5bCPCisgICAgICogQHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFzc2VydEFsbG93ZWQoTXVsdGlwYXJ0RmlsZSBmaWxlLCBTdHJpbmdbXSBhbGxvd2VkRXh0ZW5zaW9uKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVTaXplTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiwgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzaXplID0gZmlsZS5nZXRTaXplKCk7CisgICAgICAgIGlmIChzaXplID4gREVGQVVMVF9NQVhfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVTaXplTGltaXRFeGNlZWRlZEV4Y2VwdGlvbihERUZBVUxUX01BWF9TSVpFIC8gMTAyNCAvIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCk7CisgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZSk7CisgICAgICAgIGlmIChhbGxvd2VkRXh0ZW5zaW9uICE9IG51bGwgJiYgIWlzQWxsb3dlZEV4dGVuc2lvbihleHRlbnNpb24sIGFsbG93ZWRFeHRlbnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbiA9PSBNaW1lVHlwZVV0aWxzLklNQUdFX0VYVEVOU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbi5JbnZhbGlkSW1hZ2VFeHRlbnNpb25FeGNlcHRpb24oYWxsb3dlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYWxsb3dlZEV4dGVuc2lvbiA9PSBNaW1lVHlwZVV0aWxzLkZMQVNIX0VYVEVOU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbi5JbnZhbGlkRmxhc2hFeHRlbnNpb25FeGNlcHRpb24oYWxsb3dlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYWxsb3dlZEV4dGVuc2lvbiA9PSBNaW1lVHlwZVV0aWxzLk1FRElBX0VYVEVOU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbi5JbnZhbGlkTWVkaWFFeHRlbnNpb25FeGNlcHRpb24oYWxsb3dlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYWxsb3dlZEV4dGVuc2lvbiA9PSBNaW1lVHlwZVV0aWxzLlZJREVPX0VYVEVOU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbi5JbnZhbGlkVmlkZW9FeHRlbnNpb25FeGNlcHRpb24oYWxsb3dlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKGFsbG93ZWRFeHRlbnNpb24sIGV4dGVuc2lvbiwgZmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yik5patTUlNReexu+Wei+aYr+WQpuaYr+WFgeiuuOeahE1JTUXnsbvlnosKKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb24KKyAgICAgKiBAcGFyYW0gYWxsb3dlZEV4dGVuc2lvbgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd2VkRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24sIFN0cmluZ1tdIGFsbG93ZWRFeHRlbnNpb24pCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBzdHIgOiBhbGxvd2VkRXh0ZW5zaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5paH5Lu25ZCN55qE5ZCO57yACisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSDooajljZXmlofku7YKKyAgICAgKiBAcmV0dXJuIOWQjue8gOWQjQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEV4dGVuc2lvbihNdWx0aXBhcnRGaWxlIGZpbGUpCisgICAgeworICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gRmlsZW5hbWVVdGlscy5nZXRFeHRlbnNpb24oZmlsZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShleHRlbnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBleHRlbnNpb24gPSBNaW1lVHlwZVV0aWxzLmdldEV4dGVuc2lvbihPYmplY3RzLnJlcXVpcmVOb25OdWxsKGZpbGUuZ2V0Q29udGVudFR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleHRlbnNpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ZpbGVVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ZpbGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjJiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2ZpbGUvRmlsZVV0aWxzLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5maWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbmZpZy5SdW9ZaUNvbmZpZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLkRhdGVVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMudXVpZC5JZFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlbmFtZVV0aWxzOworCisvKioKKyAqIOaWh+S7tuWkhOeQhuW3peWFt+exuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXRpbHMKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGSUxFTkFNRV9QQVRURVJOID0gIlthLXpBLVowLTlfXFwtXFx8XFwuXFx1NGUwMC1cXHU5ZmE1XSsiOworCisgICAgLyoqCisgICAgICog6L6T5Ye65oyH5a6a5paH5Lu255qEYnl0ZeaVsOe7hAorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlUGF0aCDmlofku7bot6/lvoQKKyAgICAgKiBAcGFyYW0gb3Mg6L6T5Ye65rWBCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBmaWxlUGF0aCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOworICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBmaXMucmVhZChiKSkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9zLndyaXRlKGIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlKG9zKTsKKyAgICAgICAgICAgIElPVXRpbHMuY2xvc2UoZmlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWGmeaVsOaNruWIsOaWh+S7tuS4rQorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEg5pWw5o2uCisgICAgICogQHJldHVybiDnm67moIfmlofku7YKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElP5byC5bi4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd3JpdGVJbXBvcnRCeXRlcyhieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gd3JpdGVCeXRlcyhkYXRhLCBSdW9ZaUNvbmZpZy5nZXRJbXBvcnRQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWGmeaVsOaNruWIsOaWh+S7tuS4rQorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEg5pWw5o2uCisgICAgICogQHBhcmFtIHVwbG9hZERpciDnm67moIfmlofku7YKKyAgICAgKiBAcmV0dXJuIOebruagh+aWh+S7tgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSU/lvILluLgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB3cml0ZUJ5dGVzKGJ5dGVbXSBkYXRhLCBTdHJpbmcgdXBsb2FkRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gIiI7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RmlsZUV4dGVuZE5hbWUoZGF0YSk7CisgICAgICAgICAgICBwYXRoTmFtZSA9IERhdGVVdGlscy5kYXRlUGF0aCgpICsgIi8iICsgSWRVdGlscy5mYXN0VVVJRCgpICsgIi4iICsgZXh0ZW5zaW9uOworICAgICAgICAgICAgRmlsZSBmaWxlID0gRmlsZVVwbG9hZFV0aWxzLmdldEFic29sdXRlRmlsZSh1cGxvYWREaXIsIHBhdGhOYW1lKTsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgZm9zLndyaXRlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgSU9VdGlscy5jbG9zZShmb3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBGaWxlVXBsb2FkVXRpbHMuZ2V0UGF0aEZpbGVOYW1lKHVwbG9hZERpciwgcGF0aE5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOaWh+S7tgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlUGF0aCDmlofku7YKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVQYXRoKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gZmFsc2U7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKyAgICAgICAgLy8g6Lev5b6E5Li65paH5Lu25LiU5LiN5Li656m65YiZ6L+b6KGM5Yig6ZmkCisgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWh+S7tuWQjeensOmqjOivgQorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlbmFtZSDmlofku7blkI3np7AKKyAgICAgKiBAcmV0dXJuIHRydWUg5q2j5bi4IGZhbHNlIOmdnuazlQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLm1hdGNoZXMoRklMRU5BTUVfUEFUVEVSTik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qOA5p+l5paH5Lu25piv5ZCm5Y+v5LiL6L29CisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlIOmcgOimgeS4i+i9veeahOaWh+S7tgorICAgICAqIEByZXR1cm4gdHJ1ZSDmraPluLggZmFsc2Ug6Z2e5rOVCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQWxsb3dEb3dubG9hZChTdHJpbmcgcmVzb3VyY2UpCisgICAgeworICAgICAgICAvLyDnpoHmraLnm67lvZXkuIrot7PnuqfliKsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmNvbnRhaW5zKHJlc291cmNlLCAiLi4iKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8g5qOA5p+l5YWB6K645LiL6L2955qE5paH5Lu26KeE5YiZCisgICAgICAgIGlmIChBcnJheVV0aWxzLmNvbnRhaW5zKE1pbWVUeXBlVXRpbHMuREVGQVVMVF9BTExPV0VEX0VYVEVOU0lPTiwgRmlsZVR5cGVVdGlscy5nZXRGaWxlVHlwZShyZXNvdXJjZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOS4jeWcqOWFgeiuuOS4i+i9veeahOaWh+S7tuinhOWImQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICog5LiL6L295paH5Lu25ZCN6YeN5paw57yW56CBCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3Qg6K+35rGC5a+56LGhCisgICAgICogQHBhcmFtIGZpbGVOYW1lIOaWh+S7tuWQjQorICAgICAqIEByZXR1cm4g57yW56CB5ZCO55qE5paH5Lu25ZCNCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RmlsZURvd25sb2FkSGVhZGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBTdHJpbmcgYWdlbnQgPSByZXF1ZXN0LmdldEhlYWRlcigiVVNFUi1BR0VOVCIpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgaWYgKGFnZW50LmNvbnRhaW5zKCJNU0lFIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElF5rWP6KeI5ZmoCisgICAgICAgICAgICBmaWxlbmFtZSA9IFVSTEVuY29kZXIuZW5jb2RlKGZpbGVuYW1lLCAidXRmLTgiKTsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZSgiKyIsICIgIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWdlbnQuY29udGFpbnMoIkZpcmVmb3giKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g54Gr54uQ5rWP6KeI5ZmoCisgICAgICAgICAgICBmaWxlbmFtZSA9IG5ldyBTdHJpbmcoZmlsZU5hbWUuZ2V0Qnl0ZXMoKSwgIklTTzg4NTktMSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFnZW50LmNvbnRhaW5zKCJDaHJvbWUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZ29vZ2xl5rWP6KeI5ZmoCisgICAgICAgICAgICBmaWxlbmFtZSA9IFVSTEVuY29kZXIuZW5jb2RlKGZpbGVuYW1lLCAidXRmLTgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOWFtuWug+a1j+iniOWZqAorICAgICAgICAgICAgZmlsZW5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZShmaWxlbmFtZSwgInV0Zi04Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS4i+i9veaWh+S7tuWQjemHjeaWsOe8lueggQorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIOWTjeW6lOWvueixoQorICAgICAqIEBwYXJhbSByZWFsRmlsZU5hbWUg55yf5a6e5paH5Lu25ZCNCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEF0dGFjaG1lbnRSZXNwb25zZUhlYWRlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgcmVhbEZpbGVOYW1lKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHBlcmNlbnRFbmNvZGVkRmlsZU5hbWUgPSBwZXJjZW50RW5jb2RlKHJlYWxGaWxlTmFtZSk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBjb250ZW50RGlzcG9zaXRpb25WYWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvblZhbHVlLmFwcGVuZCgiYXR0YWNobWVudDsgZmlsZW5hbWU9IikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHBlcmNlbnRFbmNvZGVkRmlsZU5hbWUpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiOyIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiZmlsZW5hbWUqPSIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgidXRmLTgnJyIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChwZXJjZW50RW5jb2RlZEZpbGVOYW1lKTsKKworICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzIiwgIkNvbnRlbnQtRGlzcG9zaXRpb24sZG93bmxvYWQtZmlsZW5hbWUiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uIiwgY29udGVudERpc3Bvc2l0aW9uVmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiZG93bmxvYWQtZmlsZW5hbWUiLCBwZXJjZW50RW5jb2RlZEZpbGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnmb7liIblj7fnvJbnoIHlt6Xlhbfmlrnms5UKKyAgICAgKgorICAgICAqIEBwYXJhbSBzIOmcgOimgeeZvuWIhuWPt+e8lueggeeahOWtl+espuS4sgorICAgICAqIEByZXR1cm4g55m+5YiG5Y+357yW56CB5ZCO55qE5a2X56ym5LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGVyY2VudEVuY29kZShTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBlbmNvZGUgPSBVUkxFbmNvZGVyLmVuY29kZShzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84LnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZW5jb2RlLnJlcGxhY2VBbGwoIlxcKyIsICIlMjAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blm77lg4/lkI7nvIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGhvdG9CeXRlIOWbvuWDj+aVsOaNrgorICAgICAqIEByZXR1cm4g5ZCO57yA5ZCNCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuZE5hbWUoYnl0ZVtdIHBob3RvQnl0ZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJGaWxlRXh0ZW5kTmFtZSA9ICJqcGciOworICAgICAgICBpZiAoKHBob3RvQnl0ZVswXSA9PSA3MSkgJiYgKHBob3RvQnl0ZVsxXSA9PSA3MykgJiYgKHBob3RvQnl0ZVsyXSA9PSA3MCkgJiYgKHBob3RvQnl0ZVszXSA9PSA1NikKKyAgICAgICAgICAgICAgICAmJiAoKHBob3RvQnl0ZVs0XSA9PSA1NSkgfHwgKHBob3RvQnl0ZVs0XSA9PSA1NykpICYmIChwaG90b0J5dGVbNV0gPT0gOTcpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJGaWxlRXh0ZW5kTmFtZSA9ICJnaWYiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwaG90b0J5dGVbNl0gPT0gNzQpICYmIChwaG90b0J5dGVbN10gPT0gNzApICYmIChwaG90b0J5dGVbOF0gPT0gNzMpICYmIChwaG90b0J5dGVbOV0gPT0gNzApKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJGaWxlRXh0ZW5kTmFtZSA9ICJqcGciOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwaG90b0J5dGVbMF0gPT0gNjYpICYmIChwaG90b0J5dGVbMV0gPT0gNzcpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJGaWxlRXh0ZW5kTmFtZSA9ICJibXAiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwaG90b0J5dGVbMV0gPT0gODApICYmIChwaG90b0J5dGVbMl0gPT0gNzgpICYmIChwaG90b0J5dGVbM10gPT0gNzEpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJGaWxlRXh0ZW5kTmFtZSA9ICJwbmciOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJGaWxlRXh0ZW5kTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bmlofku7blkI3np7AgL3Byb2ZpbGUvdXBsb2FkLzIwMjIvMDQvMTYvcnVveWkucG5nIC0tIHJ1b3lpLnBuZworICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSDot6/lvoTlkI3np7AKKyAgICAgKiBAcmV0dXJuIOayoeacieaWh+S7tui3r+W+hOeahOWQjeensAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoU3RyaW5nIGZpbGVOYW1lKQorICAgIHsKKyAgICAgICAgaWYgKGZpbGVOYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBsYXN0VW5peFBvcyA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGludCBsYXN0V2luZG93c1BvcyA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCdcXCcpOworICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChsYXN0VW5peFBvcywgbGFzdFdpbmRvd3NQb3MpOworICAgICAgICByZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5LiN5bim5ZCO57yA5paH5Lu25ZCN56ewIC9wcm9maWxlL3VwbG9hZC8yMDIyLzA0LzE2L3J1b3lpLnBuZyAtLSBydW95aQorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSDot6/lvoTlkI3np7AKKyAgICAgKiBAcmV0dXJuIOayoeacieaWh+S7tui3r+W+hOWSjOWQjue8gOeahOWQjeensAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVOb3RTdWZmaXgoU3RyaW5nIGZpbGVOYW1lKQorICAgIHsKKyAgICAgICAgaWYgKGZpbGVOYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IEZpbGVuYW1lVXRpbHMuZ2V0QmFzZU5hbWUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gYmFzZU5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL0ltYWdlVXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvZmlsZS9JbWFnZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyZGZkYQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvZmlsZS9JbWFnZVV0aWxzLmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLklPVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbmZpZy5SdW9ZaUNvbmZpZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOWbvueJh+WkhOeQhuW3peWFt+exuworICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEltYWdlVXRpbHMKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW1hZ2VVdGlscy5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VQYXRoKQorICAgIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRGaWxlKGltYWdlUGF0aCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSU9VdGlscy50b0J5dGVBcnJheShpcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuWbvueJh+WKoOi9veW8guW4uCB7fSIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldEZpbGUoU3RyaW5nIGltYWdlUGF0aCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gcmVhZEZpbGUoaW1hZ2VQYXRoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5cy5jb3B5T2YocmVzdWx0LCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6I635Y+W5Zu+54mH5byC5bi4IHt9IiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K+75Y+W5paH5Lu25Li65a2X6IqC5pWw5o2uCisgICAgICogCisgICAgICogQHBhcmFtIHVybCDlnLDlnYAKKyAgICAgKiBAcmV0dXJuIOWtl+iKguaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKFN0cmluZyB1cmwpCisgICAgeworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyDnvZHnu5zlnLDlnYAKKyAgICAgICAgICAgICAgICBVUkwgdXJsT2JqID0gbmV3IFVSTCh1cmwpOworICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybE9iai5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIHVybENvbm5lY3Rpb24uc2V0Q29ubmVjdFRpbWVvdXQoMzAgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB1cmxDb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KDYwICogMTAwMCk7CisgICAgICAgICAgICAgICAgdXJsQ29ubmVjdGlvbi5zZXREb0lucHV0KHRydWUpOworICAgICAgICAgICAgICAgIGluID0gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOacrOacuuWcsOWdgAorICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhdGggPSBSdW9ZaUNvbmZpZy5nZXRQcm9maWxlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkUGF0aCA9IGxvY2FsUGF0aCArIFN0cmluZ1V0aWxzLnN1YnN0cmluZ0FmdGVyKHVybCwgQ29uc3RhbnRzLlJFU09VUkNFX1BSRUZJWCk7CisgICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRvd25sb2FkUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSU9VdGlscy50b0J5dGVBcnJheShpbik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiOt+WPluaWh+S7tui3r+W+hOW8guW4uCB7fSIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2ZpbGUvTWltZVR5cGVVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL01pbWVUeXBlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY4ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9maWxlL01pbWVUeXBlVXRpbHMuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZTsKKworLyoqCisgKiDlqpLkvZPnsbvlnovlt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgTWltZVR5cGVVdGlscworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1BORyA9ICJpbWFnZS9wbmciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSlBHID0gImltYWdlL2pwZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9KUEVHID0gImltYWdlL2pwZWciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfQk1QID0gImltYWdlL2JtcCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9HSUYgPSAiaW1hZ2UvZ2lmIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElNQUdFX0VYVEVOU0lPTiA9IHsgImJtcCIsICJnaWYiLCAianBnIiwgImpwZWciLCAicG5nIiB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGTEFTSF9FWFRFTlNJT04gPSB7ICJzd2YiLCAiZmx2IiB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNRURJQV9FWFRFTlNJT04gPSB7ICJzd2YiLCAiZmx2IiwgIm1wMyIsICJ3YXYiLCAid21hIiwgIndtdiIsICJtaWQiLCAiYXZpIiwgIm1wZyIsCisgICAgICAgICAgICAiYXNmIiwgInJtIiwgInJtdmIiIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZJREVPX0VYVEVOU0lPTiA9IHsgIm1wNCIsICJhdmkiLCAicm12YiIgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9BTExPV0VEX0VYVEVOU0lPTiA9IHsKKyAgICAgICAgICAgIC8vIOWbvueJhworICAgICAgICAgICAgImJtcCIsICJnaWYiLCAianBnIiwgImpwZWciLCAicG5nIiwKKyAgICAgICAgICAgIC8vIHdvcmQgZXhjZWwgcG93ZXJwb2ludAorICAgICAgICAgICAgImRvYyIsICJkb2N4IiwgInhscyIsICJ4bHN4IiwgInBwdCIsICJwcHR4IiwgImh0bWwiLCAiaHRtIiwgInR4dCIsCisgICAgICAgICAgICAvLyDljovnvKnmlofku7YKKyAgICAgICAgICAgICJyYXIiLCAiemlwIiwgImd6IiwgImJ6MiIsCisgICAgICAgICAgICAvLyDop4bpopHmoLzlvI8KKyAgICAgICAgICAgICJtcDQiLCAiYXZpIiwgInJtdmIiLAorICAgICAgICAgICAgLy8gcGRmCisgICAgICAgICAgICAicGRmIiB9OworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKFN0cmluZyBwcmVmaXgpCisgICAgeworICAgICAgICBzd2l0Y2ggKHByZWZpeCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJTUFHRV9QTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJwbmciOworICAgICAgICAgICAgY2FzZSBJTUFHRV9KUEc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqcGciOworICAgICAgICAgICAgY2FzZSBJTUFHRV9KUEVHOgorICAgICAgICAgICAgICAgIHJldHVybiAianBlZyI7CisgICAgICAgICAgICBjYXNlIElNQUdFX0JNUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJtcCI7CisgICAgICAgICAgICBjYXNlIElNQUdFX0dJRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImdpZiI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaHRtbC9Fc2NhcGVVdGlsLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2h0bWwvRXNjYXBlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmU4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2h0bWwvRXNjYXBlVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuaHRtbDsKKworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog6L2s5LmJ5ZKM5Y+N6L2s5LmJ5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEVzY2FwZVV0aWwKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRV9IVE1MX01BUksgPSAiKDxbXjxdKj8+KXwoPFtcXHNdKj8vW148XSo/Pil8KDxbXjxdKj8vW1xcc10qPz4pIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXVtdIFRFWFQgPSBuZXcgY2hhcls2NF1bXTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBURVhUW2ldID0gbmV3IGNoYXJbXSB7IChjaGFyKSBpIH07CisgICAgICAgIH0KKworICAgICAgICAvLyBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycworICAgICAgICBURVhUWydcJyddID0gIiYjMDM5OyIudG9DaGFyQXJyYXkoKTsgLy8g5Y2V5byV5Y+3CisgICAgICAgIFRFWFRbJyInXSA9ICImIzM0OyIudG9DaGFyQXJyYXkoKTsgLy8g5Y+M5byV5Y+3CisgICAgICAgIFRFWFRbJyYnXSA9ICImIzM4OyIudG9DaGFyQXJyYXkoKTsgLy8gJuespgorICAgICAgICBURVhUWyc8J10gPSAiJiM2MDsiLnRvQ2hhckFycmF5KCk7IC8vIOWwj+S6juWPtworICAgICAgICBURVhUWyc+J10gPSAiJiM2MjsiLnRvQ2hhckFycmF5KCk7IC8vIOWkp+S6juWPtworICAgIH0KKworICAgIC8qKgorICAgICAqIOi9rOS5ieaWh+acrOS4reeahEhUTUzlrZfnrKbkuLrlronlhajnmoTlrZfnrKYKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCDooqvovazkuYnnmoTmlofmnKwKKyAgICAgKiBAcmV0dXJuIOi9rOS5ieWQjueahOaWh+acrAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmNvZGUodGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L+Y5Y6f6KKr6L2s5LmJ55qESFRNTOeJueauiuWtl+espgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZW50IOWMheWQq+i9rOS5ieespueahEhUTUzlhoXlrrkKKyAgICAgKiBAcmV0dXJuIOi9rOaNouWQjueahOWtl+espuS4sgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBjb250ZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29kZShjb250ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmuIXpmaTmiYDmnIlIVE1M5qCH562+77yM5L2G5piv5LiN5Yig6Zmk5qCH562+5YaF55qE5YaF5a65CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRlbnQg5paH5pysCisgICAgICogQHJldHVybiDmuIXpmaTmoIfnrb7lkI7nmoTmlofmnKwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhbihTdHJpbmcgY29udGVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgSFRNTEZpbHRlcigpLmZpbHRlcihjb250ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc2NhcGXnvJbnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCDooqvnvJbnoIHnmoTmlofmnKwKKyAgICAgKiBAcmV0dXJuIOe8lueggeWQjueahOWtl+espgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHRleHQpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh0ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0bXAgPSBuZXcgU3RyaW5nQnVpbGRlcih0ZXh0Lmxlbmd0aCgpICogNik7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSB0ZXh0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjIDwgMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCgiMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKCIldSIpOworICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4ZmZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUjSTQ5SlU4QEdpdGVlCisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoIjAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRtcC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVzY2FwZeino+eggQorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZW50IOiiq+i9rOS5ieeahOWGheWuuQorICAgICAqIEByZXR1cm4g6Kej56CB5ZCO55qE5a2X56ym5LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBjb250ZW50KQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY29udGVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0bXAgPSBuZXcgU3RyaW5nQnVpbGRlcihjb250ZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgaW50IGxhc3RQb3MgPSAwLCBwb3MgPSAwOworICAgICAgICBjaGFyIGNoOworICAgICAgICB3aGlsZSAobGFzdFBvcyA8IGNvbnRlbnQubGVuZ3RoKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IGNvbnRlbnQuaW5kZXhPZigiJSIsIGxhc3RQb3MpOworICAgICAgICAgICAgaWYgKHBvcyA9PSBsYXN0UG9zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmNoYXJBdChwb3MgKyAxKSA9PSAndScpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaCA9IChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKHBvcyArIDIsIHBvcyArIDYpLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gcG9zICsgNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSAoY2hhcikgSW50ZWdlci5wYXJzZUludChjb250ZW50LnN1YnN0cmluZyhwb3MgKyAxLCBwb3MgKyAzKSwgMTYpOworICAgICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IHBvcyArIDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGNvbnRlbnQuc3Vic3RyaW5nKGxhc3RQb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGNvbnRlbnQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoY29udGVudC5zdWJzdHJpbmcobGFzdFBvcywgcG9zKSk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0bXAudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGh0bWwgPSAiPHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4iOworICAgICAgICBTdHJpbmcgZXNjYXBlID0gRXNjYXBlVXRpbC5lc2NhcGUoaHRtbCk7CisgICAgICAgIC8vIFN0cmluZyBodG1sID0gIjxzY3I8c2NyaXB0PmlwdD5hbGVydChcIlhTU1wiKTwvc2NyPHNjcmlwdD5pcHQ+IjsKKyAgICAgICAgLy8gU3RyaW5nIGh0bWwgPSAiPDEyMyI7CisgICAgICAgIC8vIFN0cmluZyBodG1sID0gIjEyMz4iOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNsZWFuOiAiICsgRXNjYXBlVXRpbC5jbGVhbihodG1sKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXNjYXBlOiAiICsgZXNjYXBlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1bmVzY2FwZTogIiArIEVzY2FwZVV0aWwudW5lc2NhcGUoZXNjYXBlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9odG1sL0hUTUxGaWx0ZXIuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaHRtbC9IVE1MRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaHRtbC9IVE1MRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1NzAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5odG1sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEhUTUzov4fmu6TlmajvvIznlKjkuo7ljrvpmaRYU1PmvI/mtJ7pmpDmgqPjgIIKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIVE1MRmlsdGVyCit7CisgICAgLyoqCisgICAgICogcmVnZXggZmxhZyB1bmlvbiByZXByZXNlbnRpbmcgL3NpIG1vZGlmaWVycyBpbiBwaHAKKyAgICAgKiovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFR0VYX0ZMQUdTX1NJID0gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX0NPTU1FTlRTID0gUGF0dGVybi5jb21waWxlKCI8IS0tKC4qPyktLT4iLCBQYXR0ZXJuLkRPVEFMTCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX0NPTU1FTlQgPSBQYXR0ZXJuLmNvbXBpbGUoIl4hLS0oLiopLS0kIiwgUkVHRVhfRkxBR1NfU0kpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9UQUdTID0gUGF0dGVybi5jb21waWxlKCI8KC4qPyk+IiwgUGF0dGVybi5ET1RBTEwpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9FTkRfVEFHID0gUGF0dGVybi5jb21waWxlKCJeLyhbYS16MC05XSspIiwgUkVHRVhfRkxBR1NfU0kpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9TVEFSVF9UQUcgPSBQYXR0ZXJuLmNvbXBpbGUoIl4oW2EtejAtOV0rKSguKj8pKC8/KSQiLCBSRUdFWF9GTEFHU19TSSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX1FVT1RFRF9BVFRSSUJVVEVTID0gUGF0dGVybi5jb21waWxlKCIoW2EtejAtOV0rKT0oW1wiJ10pKC4qPylcXDIiLCBSRUdFWF9GTEFHU19TSSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX1VOUVVPVEVEX0FUVFJJQlVURVMgPSBQYXR0ZXJuLmNvbXBpbGUoIihbYS16MC05XSspKD0pKFteXCJcXHMnXSspIiwgUkVHRVhfRkxBR1NfU0kpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9QUk9UT0NPTCA9IFBhdHRlcm4uY29tcGlsZSgiXihbXjpdKyk6IiwgUkVHRVhfRkxBR1NfU0kpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9FTlRJVFkgPSBQYXR0ZXJuLmNvbXBpbGUoIiYjKFxcZCspOz8iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfRU5USVRZX1VOSUNPREUgPSBQYXR0ZXJuLmNvbXBpbGUoIiYjeChbMC05YS1mXSspOz8iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfRU5DT0RFID0gUGF0dGVybi5jb21waWxlKCIlKFswLTlhLWZdezJ9KTs/Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX1ZBTElEX0VOVElUSUVTID0gUGF0dGVybi5jb21waWxlKCImKFteJjtdKikoPz0oO3wmfCQpKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9WQUxJRF9RVU9URVMgPSBQYXR0ZXJuLmNvbXBpbGUoIig+fF4pKFtePF0rPykoPHwkKSIsIFBhdHRlcm4uRE9UQUxMKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfRU5EX0FSUk9XID0gUGF0dGVybi5jb21waWxlKCJePiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9CT0RZX1RPX0VORCA9IFBhdHRlcm4uY29tcGlsZSgiPChbXj5dKj8pKD89PHwkKSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9YTUxfQ09OVEVOVCA9IFBhdHRlcm4uY29tcGlsZSgiKF58PikoW148XSo/KSg/PT4pIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX1NUUkFZX0xFRlRfQVJST1cgPSBQYXR0ZXJuLmNvbXBpbGUoIjwoW14+XSo/KSg/PTx8JCkiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfU1RSQVlfUklHSFRfQVJST1cgPSBQYXR0ZXJuLmNvbXBpbGUoIihefD4pKFtePF0qPykoPz0+KSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUF9BTVAgPSBQYXR0ZXJuLmNvbXBpbGUoIiYiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfUVVPVEUgPSBQYXR0ZXJuLmNvbXBpbGUoIlwiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQX0xFRlRfQVJST1cgPSBQYXR0ZXJuLmNvbXBpbGUoIjwiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfUklHSFRfQVJST1cgPSBQYXR0ZXJuLmNvbXBpbGUoIj4iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBfQk9USF9BUlJPV1MgPSBQYXR0ZXJuLmNvbXBpbGUoIjw+Iik7CisKKyAgICAvLyBAeHh4IGNvdWxkIGdyb3cgbGFyZ2UuLi4gbWF5YmUgdXNlIHNlc2F0J3MgUmVmZXJlbmNlTWFwCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFBhdHRlcm4+IFBfUkVNT1ZFX1BBSVJfQkxBTktTID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgUGF0dGVybj4gUF9SRU1PVkVfU0VMRl9CTEFOS1MgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogc2V0IG9mIGFsbG93ZWQgaHRtbCBlbGVtZW50cywgYWxvbmcgd2l0aCBhbGxvd2VkIGF0dHJpYnV0ZXMgZm9yIGVhY2ggZWxlbWVudAorICAgICAqKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gdkFsbG93ZWQ7CisgICAgLyoqCisgICAgICogY291bnRzIG9mIG9wZW4gdGFncyBmb3IgZWFjaCAoYWxsb3dhYmxlKSBodG1sIGVsZW1lbnQKKyAgICAgKiovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiB2VGFnQ291bnRzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogaHRtbCBlbGVtZW50cyB3aGljaCBtdXN0IGFsd2F5cyBiZSBzZWxmLWNsb3NpbmcgKGUuZy4gIjxpbWcgLz4iKQorICAgICAqKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHZTZWxmQ2xvc2luZ1RhZ3M7CisgICAgLyoqCisgICAgICogaHRtbCBlbGVtZW50cyB3aGljaCBtdXN0IGFsd2F5cyBoYXZlIHNlcGFyYXRlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyAoZS5nLiAiPGI+PC9iPiIpCisgICAgICoqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdk5lZWRDbG9zaW5nVGFnczsKKyAgICAvKioKKyAgICAgKiBzZXQgb2YgZGlzYWxsb3dlZCBodG1sIGVsZW1lbnRzCisgICAgICoqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdkRpc2FsbG93ZWQ7CisgICAgLyoqCisgICAgICogYXR0cmlidXRlcyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgdmFsaWQgcHJvdG9jb2xzCisgICAgICoqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdlByb3RvY29sQXR0czsKKyAgICAvKioKKyAgICAgKiBhbGxvd2VkIHByb3RvY29scworICAgICAqKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHZBbGxvd2VkUHJvdG9jb2xzOworICAgIC8qKgorICAgICAqIHRhZ3Mgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQgaWYgdGhleSBjb250YWluIG5vIGNvbnRlbnQgKGUuZy4gIjxiPjwvYj4iIG9yICI8YiAvPiIpCisgICAgICoqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdlJlbW92ZUJsYW5rczsKKyAgICAvKioKKyAgICAgKiBlbnRpdGllcyBhbGxvd2VkIHdpdGhpbiBodG1sIG1hcmt1cAorICAgICAqKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHZBbGxvd2VkRW50aXRpZXM7CisgICAgLyoqCisgICAgICogZmxhZyBkZXRlcm1pbmluZyB3aGV0aGVyIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluIGlucHV0IFN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3RyaXBDb21tZW50OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlbmNvZGVRdW90ZXM7CisgICAgLyoqCisgICAgICogZmxhZyBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHRyeSB0byBtYWtlIHRhZ3Mgd2hlbiBwcmVzZW50ZWQgd2l0aCAidW5iYWxhbmNlZCIgYW5nbGUgYnJhY2tldHMgKGUuZy4gIjxiIHRleHQgPC9iPiIKKyAgICAgKiBiZWNvbWVzICI8Yj4gdGV4dCA8L2I+IikuIElmIHNldCB0byBmYWxzZSwgdW5iYWxhbmNlZCBhbmdsZSBicmFja2V0cyB3aWxsIGJlIGh0bWwgZXNjYXBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWx3YXlzTWFrZVRhZ3M7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBIVE1MRmlsdGVyKCkKKyAgICB7CisgICAgICAgIHZBbGxvd2VkID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGFfYXR0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBhX2F0dHMuYWRkKCJocmVmIik7CisgICAgICAgIGFfYXR0cy5hZGQoInRhcmdldCIpOworICAgICAgICB2QWxsb3dlZC5wdXQoImEiLCBhX2F0dHMpOworCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGltZ19hdHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGltZ19hdHRzLmFkZCgic3JjIik7CisgICAgICAgIGltZ19hdHRzLmFkZCgid2lkdGgiKTsKKyAgICAgICAgaW1nX2F0dHMuYWRkKCJoZWlnaHQiKTsKKyAgICAgICAgaW1nX2F0dHMuYWRkKCJhbHQiKTsKKyAgICAgICAgdkFsbG93ZWQucHV0KCJpbWciLCBpbWdfYXR0cyk7CisKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbm9fYXR0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB2QWxsb3dlZC5wdXQoImIiLCBub19hdHRzKTsKKyAgICAgICAgdkFsbG93ZWQucHV0KCJzdHJvbmciLCBub19hdHRzKTsKKyAgICAgICAgdkFsbG93ZWQucHV0KCJpIiwgbm9fYXR0cyk7CisgICAgICAgIHZBbGxvd2VkLnB1dCgiZW0iLCBub19hdHRzKTsKKworICAgICAgICB2U2VsZkNsb3NpbmdUYWdzID0gbmV3IFN0cmluZ1tdIHsgImltZyIgfTsKKyAgICAgICAgdk5lZWRDbG9zaW5nVGFncyA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAic3Ryb25nIiwgImkiLCAiZW0iIH07CisgICAgICAgIHZEaXNhbGxvd2VkID0gbmV3IFN0cmluZ1tdIHt9OworICAgICAgICB2QWxsb3dlZFByb3RvY29scyA9IG5ldyBTdHJpbmdbXSB7ICJodHRwIiwgIm1haWx0byIsICJodHRwcyIgfTsgLy8gbm8gZnRwLgorICAgICAgICB2UHJvdG9jb2xBdHRzID0gbmV3IFN0cmluZ1tdIHsgInNyYyIsICJocmVmIiB9OworICAgICAgICB2UmVtb3ZlQmxhbmtzID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJzdHJvbmciLCAiaSIsICJlbSIgfTsKKyAgICAgICAgdkFsbG93ZWRFbnRpdGllcyA9IG5ldyBTdHJpbmdbXSB7ICJhbXAiLCAiZ3QiLCAibHQiLCAicXVvdCIgfTsKKyAgICAgICAgc3RyaXBDb21tZW50ID0gdHJ1ZTsKKyAgICAgICAgZW5jb2RlUXVvdGVzID0gdHJ1ZTsKKyAgICAgICAgYWx3YXlzTWFrZVRhZ3MgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAtcGFyYW1ldGVyIGNvbmZpZ3VyYWJsZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25mIG1hcCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24uIGtleXMgbWF0Y2ggZmllbGQgbmFtZXMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIEhUTUxGaWx0ZXIoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjb25mKQorICAgIHsKKworICAgICAgICBhc3NlcnQgY29uZi5jb250YWluc0tleSgidkFsbG93ZWQiKSA6ICJjb25maWd1cmF0aW9uIHJlcXVpcmVzIHZBbGxvd2VkIjsKKyAgICAgICAgYXNzZXJ0IGNvbmYuY29udGFpbnNLZXkoInZTZWxmQ2xvc2luZ1RhZ3MiKSA6ICJjb25maWd1cmF0aW9uIHJlcXVpcmVzIHZTZWxmQ2xvc2luZ1RhZ3MiOworICAgICAgICBhc3NlcnQgY29uZi5jb250YWluc0tleSgidk5lZWRDbG9zaW5nVGFncyIpIDogImNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdk5lZWRDbG9zaW5nVGFncyI7CisgICAgICAgIGFzc2VydCBjb25mLmNvbnRhaW5zS2V5KCJ2RGlzYWxsb3dlZCIpIDogImNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdkRpc2FsbG93ZWQiOworICAgICAgICBhc3NlcnQgY29uZi5jb250YWluc0tleSgidkFsbG93ZWRQcm90b2NvbHMiKSA6ICJjb25maWd1cmF0aW9uIHJlcXVpcmVzIHZBbGxvd2VkUHJvdG9jb2xzIjsKKyAgICAgICAgYXNzZXJ0IGNvbmYuY29udGFpbnNLZXkoInZQcm90b2NvbEF0dHMiKSA6ICJjb25maWd1cmF0aW9uIHJlcXVpcmVzIHZQcm90b2NvbEF0dHMiOworICAgICAgICBhc3NlcnQgY29uZi5jb250YWluc0tleSgidlJlbW92ZUJsYW5rcyIpIDogImNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdlJlbW92ZUJsYW5rcyI7CisgICAgICAgIGFzc2VydCBjb25mLmNvbnRhaW5zS2V5KCJ2QWxsb3dlZEVudGl0aWVzIikgOiAiY29uZmlndXJhdGlvbiByZXF1aXJlcyB2QWxsb3dlZEVudGl0aWVzIjsKKworICAgICAgICB2QWxsb3dlZCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgoSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4pIGNvbmYuZ2V0KCJ2QWxsb3dlZCIpKTsKKyAgICAgICAgdlNlbGZDbG9zaW5nVGFncyA9IChTdHJpbmdbXSkgY29uZi5nZXQoInZTZWxmQ2xvc2luZ1RhZ3MiKTsKKyAgICAgICAgdk5lZWRDbG9zaW5nVGFncyA9IChTdHJpbmdbXSkgY29uZi5nZXQoInZOZWVkQ2xvc2luZ1RhZ3MiKTsKKyAgICAgICAgdkRpc2FsbG93ZWQgPSAoU3RyaW5nW10pIGNvbmYuZ2V0KCJ2RGlzYWxsb3dlZCIpOworICAgICAgICB2QWxsb3dlZFByb3RvY29scyA9IChTdHJpbmdbXSkgY29uZi5nZXQoInZBbGxvd2VkUHJvdG9jb2xzIik7CisgICAgICAgIHZQcm90b2NvbEF0dHMgPSAoU3RyaW5nW10pIGNvbmYuZ2V0KCJ2UHJvdG9jb2xBdHRzIik7CisgICAgICAgIHZSZW1vdmVCbGFua3MgPSAoU3RyaW5nW10pIGNvbmYuZ2V0KCJ2UmVtb3ZlQmxhbmtzIik7CisgICAgICAgIHZBbGxvd2VkRW50aXRpZXMgPSAoU3RyaW5nW10pIGNvbmYuZ2V0KCJ2QWxsb3dlZEVudGl0aWVzIik7CisgICAgICAgIHN0cmlwQ29tbWVudCA9IGNvbmYuY29udGFpbnNLZXkoInN0cmlwQ29tbWVudCIpID8gKEJvb2xlYW4pIGNvbmYuZ2V0KCJzdHJpcENvbW1lbnQiKSA6IHRydWU7CisgICAgICAgIGVuY29kZVF1b3RlcyA9IGNvbmYuY29udGFpbnNLZXkoImVuY29kZVF1b3RlcyIpID8gKEJvb2xlYW4pIGNvbmYuZ2V0KCJlbmNvZGVRdW90ZXMiKSA6IHRydWU7CisgICAgICAgIGFsd2F5c01ha2VUYWdzID0gY29uZi5jb250YWluc0tleSgiYWx3YXlzTWFrZVRhZ3MiKSA/IChCb29sZWFuKSBjb25mLmdldCgiYWx3YXlzTWFrZVRhZ3MiKSA6IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHZUYWdDb3VudHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBteSB2ZXJzaW9ucyBvZiBzb21lIFBIUCBsaWJyYXJ5IGZ1bmN0aW9ucworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNocihmaW5hbCBpbnQgZGVjaW1hbCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigoY2hhcikgZGVjaW1hbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFNwZWNpYWxDaGFycyhmaW5hbCBTdHJpbmcgcykKKyAgICB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzOworICAgICAgICByZXN1bHQgPSByZWdleFJlcGxhY2UoUF9BTVAsICImYW1wOyIsIHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IHJlZ2V4UmVwbGFjZShQX1FVT1RFLCAiJnF1b3Q7IiwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVnZXhSZXBsYWNlKFBfTEVGVF9BUlJPVywgIiZsdDsiLCByZXN1bHQpOworICAgICAgICByZXN1bHQgPSByZWdleFJlcGxhY2UoUF9SSUdIVF9BUlJPVywgIiZndDsiLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogZ2l2ZW4gYSB1c2VyIHN1Ym1pdHRlZCBpbnB1dCBTdHJpbmcsIGZpbHRlciBvdXQgYW55IGludmFsaWQgb3IgcmVzdHJpY3RlZCBodG1sLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHRleHQgKGkuZS4gc3VibWl0dGVkIGJ5IGEgdXNlcikgdGhhbiBtYXkgY29udGFpbiBodG1sCisgICAgICogQHJldHVybiAiY2xlYW4iIHZlcnNpb24gb2YgaW5wdXQsIHdpdGggb25seSB2YWxpZCwgd2hpdGVsaXN0ZWQgaHRtbCBlbGVtZW50cyBhbGxvd2VkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoZmluYWwgU3RyaW5nIGlucHV0KQorICAgIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgU3RyaW5nIHMgPSBpbnB1dDsKKworICAgICAgICBzID0gZXNjYXBlQ29tbWVudHMocyk7CisKKyAgICAgICAgcyA9IGJhbGFuY2VIVE1MKHMpOworCisgICAgICAgIHMgPSBjaGVja1RhZ3Mocyk7CisKKyAgICAgICAgcyA9IHByb2Nlc3NSZW1vdmVCbGFua3Mocyk7CisKKyAgICAgICAgLy8gcyA9IHZhbGlkYXRlRW50aXRpZXMocyk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBbHdheXNNYWtlVGFncygpCisgICAgeworICAgICAgICByZXR1cm4gYWx3YXlzTWFrZVRhZ3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpcENvbW1lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJpcENvbW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZXNjYXBlQ29tbWVudHMoZmluYWwgU3RyaW5nIHMpCisgICAgeworICAgICAgICBmaW5hbCBNYXRjaGVyIG0gPSBQX0NPTU1FTlRTLm1hdGNoZXIocyk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChtLmZpbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hdGNoID0gbS5ncm91cCgxKTsgLy8gKC4qPykKKyAgICAgICAgICAgIG0uYXBwZW5kUmVwbGFjZW1lbnQoYnVmLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQoIjwhLS0iICsgaHRtbFNwZWNpYWxDaGFycyhtYXRjaCkgKyAiLS0+IikpOworICAgICAgICB9CisgICAgICAgIG0uYXBwZW5kVGFpbChidWYpOworCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBiYWxhbmNlSFRNTChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIGlmIChhbHdheXNNYWtlVGFncykKKyAgICAgICAgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHRyeSBhbmQgZm9ybSBodG1sCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcyA9IHJlZ2V4UmVwbGFjZShQX0VORF9BUlJPVywgIiIsIHMpOworICAgICAgICAgICAgLy8g5LiN6L+95Yqg57uT5p2f5qCH562+CisgICAgICAgICAgICBzID0gcmVnZXhSZXBsYWNlKFBfQk9EWV9UT19FTkQsICI8JDE+Iiwgcyk7CisgICAgICAgICAgICBzID0gcmVnZXhSZXBsYWNlKFBfWE1MX0NPTlRFTlQsICIkMTwkMiIsIHMpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZXNjYXBlIHN0cmF5IGJyYWNrZXRzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcyA9IHJlZ2V4UmVwbGFjZShQX1NUUkFZX0xFRlRfQVJST1csICImbHQ7JDEiLCBzKTsKKyAgICAgICAgICAgIHMgPSByZWdleFJlcGxhY2UoUF9TVFJBWV9SSUdIVF9BUlJPVywgIiQxJDImZ3Q7PCIsIHMpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gdGhlIGxhc3QgcmVnZXhwIGNhdXNlcyAnPD4nIGVudGl0aWVzIHRvIGFwcGVhcgorICAgICAgICAgICAgLy8gKHdlIG5lZWQgdG8gZG8gYSBsb29rYWhlYWQgYXNzZXJ0aW9uIHNvIHRoYXQgdGhlIGxhc3QgYnJhY2tldCBjYW4KKyAgICAgICAgICAgIC8vIGJlIHVzZWQgaW4gdGhlIG5leHQgcGFzcyBvZiB0aGUgcmVnZXhwKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHMgPSByZWdleFJlcGxhY2UoUF9CT1RIX0FSUk9XUywgIiIsIHMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tUYWdzKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgTWF0Y2hlciBtID0gUF9UQUdTLm1hdGNoZXIocyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZVN0ciA9IG0uZ3JvdXAoMSk7CisgICAgICAgICAgICByZXBsYWNlU3RyID0gcHJvY2Vzc1RhZyhyZXBsYWNlU3RyKTsKKyAgICAgICAgICAgIG0uYXBwZW5kUmVwbGFjZW1lbnQoYnVmLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZVN0cikpOworICAgICAgICB9CisgICAgICAgIG0uYXBwZW5kVGFpbChidWYpOworCisgICAgICAgIC8vIHRoZXNlIGdldCB0YWxsaWVkIGluIHByb2Nlc3NUYWcKKyAgICAgICAgLy8gKHJlbWVtYmVyIHRvIHJlc2V0IGJlZm9yZSBzdWJzZXF1ZW50IGNhbGxzIHRvIGZpbHRlciBtZXRob2QpCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihidWYudG9TdHJpbmcoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHZUYWdDb3VudHMua2V5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCB2VGFnQ291bnRzLmdldChrZXkpOyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNCdWlsZGVyLmFwcGVuZCgiPC8iKS5hcHBlbmQoa2V5KS5hcHBlbmQoIj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzID0gc0J1aWxkZXIudG9TdHJpbmcoKTsKKworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9jZXNzUmVtb3ZlQmxhbmtzKGZpbmFsIFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHM7CisgICAgICAgIGZvciAoU3RyaW5nIHRhZyA6IHZSZW1vdmVCbGFua3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghUF9SRU1PVkVfUEFJUl9CTEFOS1MuY29udGFpbnNLZXkodGFnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQX1JFTU9WRV9QQUlSX0JMQU5LUy5wdXRJZkFic2VudCh0YWcsIFBhdHRlcm4uY29tcGlsZSgiPCIgKyB0YWcgKyAiKFxcc1tePl0qKT8+PC8iICsgdGFnICsgIj4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSByZWdleFJlcGxhY2UoUF9SRU1PVkVfUEFJUl9CTEFOS1MuZ2V0KHRhZyksICIiLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKCFQX1JFTU9WRV9TRUxGX0JMQU5LUy5jb250YWluc0tleSh0YWcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBfUkVNT1ZFX1NFTEZfQkxBTktTLnB1dElmQWJzZW50KHRhZywgUGF0dGVybi5jb21waWxlKCI8IiArIHRhZyArICIoXFxzW14+XSopPy8+IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gcmVnZXhSZXBsYWNlKFBfUkVNT1ZFX1NFTEZfQkxBTktTLmdldCh0YWcpLCAiIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlZ2V4UmVwbGFjZShmaW5hbCBQYXR0ZXJuIHJlZ2V4X3BhdHRlcm4sIGZpbmFsIFN0cmluZyByZXBsYWNlbWVudCwgZmluYWwgU3RyaW5nIHMpCisgICAgeworICAgICAgICBNYXRjaGVyIG0gPSByZWdleF9wYXR0ZXJuLm1hdGNoZXIocyk7CisgICAgICAgIHJldHVybiBtLnJlcGxhY2VBbGwocmVwbGFjZW1lbnQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NUYWcoZmluYWwgU3RyaW5nIHMpCisgICAgeworICAgICAgICAvLyBlbmRpbmcgdGFncworICAgICAgICBNYXRjaGVyIG0gPSBQX0VORF9UQUcubWF0Y2hlcihzKTsKKyAgICAgICAgaWYgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG0uZ3JvdXAoMSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGlmIChhbGxvd2VkKG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW5BcnJheShuYW1lLCB2U2VsZkNsb3NpbmdUYWdzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2VGFnQ291bnRzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2VGFnQ291bnRzLnB1dChuYW1lLCB2VGFnQ291bnRzLmdldChuYW1lKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8LyIgKyBuYW1lICsgIj4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RhcnRpbmcgdGFncworICAgICAgICBtID0gUF9TVEFSVF9UQUcubWF0Y2hlcihzKTsKKyAgICAgICAgaWYgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG0uZ3JvdXAoMSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBib2R5ID0gbS5ncm91cCgyKTsKKyAgICAgICAgICAgIFN0cmluZyBlbmRpbmcgPSBtLmdyb3VwKDMpOworCisgICAgICAgICAgICAvLyBkZWJ1ZyggImluIGEgc3RhcnRpbmcgdGFnLCBuYW1lPSciICsgbmFtZSArICInOyBib2R5PSciICsgYm9keSArICInOyBlbmRpbmc9JyIgKyBlbmRpbmcgKyAiJyIgKTsKKyAgICAgICAgICAgIGlmIChhbGxvd2VkKG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcGFyYW1zID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbTIgPSBQX1FVT1RFRF9BVFRSSUJVVEVTLm1hdGNoZXIoYm9keSk7CisgICAgICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtMyA9IFBfVU5RVU9URURfQVRUUklCVVRFUy5tYXRjaGVyKGJvZHkpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbU5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG0yLmZpbmQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYWRkKG0yLmdyb3VwKDEpKTsgLy8gKFthLXowLTldKykKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKG0yLmdyb3VwKDMpKTsgLy8gKC4qPykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKG0zLmZpbmQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYWRkKG0zLmdyb3VwKDEpKTsgLy8gKFthLXowLTldKykKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKG0zLmdyb3VwKDMpKTsgLy8gKFteXCJcXHMnXSspCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSwgcGFyYW1WYWx1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgcGFyYW1OYW1lcy5zaXplKCk7IGlpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzLmdldChpaSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzLmdldChpaSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcoICJwYXJhbU5hbWU9JyIgKyBwYXJhbU5hbWUgKyAiJyIgKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcoICJwYXJhbVZhbHVlPSciICsgcGFyYW1WYWx1ZSArICInIiApOworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyggImFsbG93ZWQ/ICIgKyB2QWxsb3dlZC5nZXQoIG5hbWUgKS5jb250YWlucyggcGFyYW1OYW1lICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZEF0dHJpYnV0ZShuYW1lLCBwYXJhbU5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5BcnJheShwYXJhbU5hbWUsIHZQcm90b2NvbEF0dHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBwcm9jZXNzUGFyYW1Qcm90b2NvbChwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJyAnKS5hcHBlbmQocGFyYW1OYW1lKS5hcHBlbmQoIj1cXFwiIikuYXBwZW5kKHBhcmFtVmFsdWUpLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGluQXJyYXkobmFtZSwgdlNlbGZDbG9zaW5nVGFncykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmRpbmcgPSAiIC8iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbkFycmF5KG5hbWUsIHZOZWVkQ2xvc2luZ1RhZ3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kaW5nID0gIiI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVuZGluZyA9PSBudWxsIHx8IGVuZGluZy5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodlRhZ0NvdW50cy5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdlRhZ0NvdW50cy5wdXQobmFtZSwgdlRhZ0NvdW50cy5nZXQobmFtZSkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZUYWdDb3VudHMucHV0KG5hbWUsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuZGluZyA9ICIgLyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAiPCIgKyBuYW1lICsgcGFyYW1zICsgZW5kaW5nICsgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbW1lbnRzCisgICAgICAgIG0gPSBQX0NPTU1FTlQubWF0Y2hlcihzKTsKKyAgICAgICAgaWYgKCFzdHJpcENvbW1lbnQgJiYgbS5maW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiPCIgKyBtLmdyb3VwKCkgKyAiPiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1BhcmFtUHJvdG9jb2woU3RyaW5nIHMpCisgICAgeworICAgICAgICBzID0gZGVjb2RlRW50aXRpZXMocyk7CisgICAgICAgIGZpbmFsIE1hdGNoZXIgbSA9IFBfUFJPVE9DT0wubWF0Y2hlcihzKTsKKyAgICAgICAgaWYgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdG9jb2wgPSBtLmdyb3VwKDEpOworICAgICAgICAgICAgaWYgKCFpbkFycmF5KHByb3RvY29sLCB2QWxsb3dlZFByb3RvY29scykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYmFkIHByb3RvY29sLCB0dXJuIGludG8gbG9jYWwgYW5jaG9yIGxpbmsgaW5zdGVhZAorICAgICAgICAgICAgICAgIHMgPSAiIyIgKyBzLnN1YnN0cmluZyhwcm90b2NvbC5sZW5ndGgoKSArIDEpOworICAgICAgICAgICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIiMvLyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9ICIjIiArIHMuc3Vic3RyaW5nKDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGRlY29kZUVudGl0aWVzKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBNYXRjaGVyIG0gPSBQX0VOVElUWS5tYXRjaGVyKHMpOworICAgICAgICB3aGlsZSAobS5maW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXRjaCA9IG0uZ3JvdXAoMSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZGVjaW1hbCA9IEludGVnZXIuZGVjb2RlKG1hdGNoKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChidWYsIE1hdGNoZXIucXVvdGVSZXBsYWNlbWVudChjaHIoZGVjaW1hbCkpKTsKKyAgICAgICAgfQorICAgICAgICBtLmFwcGVuZFRhaWwoYnVmKTsKKyAgICAgICAgcyA9IGJ1Zi50b1N0cmluZygpOworCisgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgbSA9IFBfRU5USVRZX1VOSUNPREUubWF0Y2hlcihzKTsKKyAgICAgICAgd2hpbGUgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWF0Y2ggPSBtLmdyb3VwKDEpOworICAgICAgICAgICAgZmluYWwgaW50IGRlY2ltYWwgPSBJbnRlZ2VyLnZhbHVlT2YobWF0Y2gsIDE2KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChidWYsIE1hdGNoZXIucXVvdGVSZXBsYWNlbWVudChjaHIoZGVjaW1hbCkpKTsKKyAgICAgICAgfQorICAgICAgICBtLmFwcGVuZFRhaWwoYnVmKTsKKyAgICAgICAgcyA9IGJ1Zi50b1N0cmluZygpOworCisgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgbSA9IFBfRU5DT0RFLm1hdGNoZXIocyk7CisgICAgICAgIHdoaWxlIChtLmZpbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hdGNoID0gbS5ncm91cCgxKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBkZWNpbWFsID0gSW50ZWdlci52YWx1ZU9mKG1hdGNoLCAxNikuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIG0uYXBwZW5kUmVwbGFjZW1lbnQoYnVmLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQoY2hyKGRlY2ltYWwpKSk7CisgICAgICAgIH0KKyAgICAgICAgbS5hcHBlbmRUYWlsKGJ1Zik7CisgICAgICAgIHMgPSBidWYudG9TdHJpbmcoKTsKKworICAgICAgICBzID0gdmFsaWRhdGVFbnRpdGllcyhzKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVFbnRpdGllcyhmaW5hbCBTdHJpbmcgcykKKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gdmFsaWRhdGUgZW50aXRpZXMgdGhyb3VnaG91dCB0aGUgc3RyaW5nCisgICAgICAgIE1hdGNoZXIgbSA9IFBfVkFMSURfRU5USVRJRVMubWF0Y2hlcihzKTsKKyAgICAgICAgd2hpbGUgKG0uZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb25lID0gbS5ncm91cCgxKTsgLy8gKFteJjtdKikKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0d28gPSBtLmdyb3VwKDIpOyAvLyAoPz0oO3wmfCQpKQorICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChidWYsIE1hdGNoZXIucXVvdGVSZXBsYWNlbWVudChjaGVja0VudGl0eShvbmUsIHR3bykpKTsKKyAgICAgICAgfQorICAgICAgICBtLmFwcGVuZFRhaWwoYnVmKTsKKworICAgICAgICByZXR1cm4gZW5jb2RlUXVvdGVzKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVRdW90ZXMoZmluYWwgU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoZW5jb2RlUXVvdGVzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgTWF0Y2hlciBtID0gUF9WQUxJRF9RVU9URVMubWF0Y2hlcihzKTsKKyAgICAgICAgICAgIHdoaWxlIChtLmZpbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb25lID0gbS5ncm91cCgxKTsgLy8gKD58XikKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHdvID0gbS5ncm91cCgyKTsgLy8gKFtePF0rPykKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGhyZWUgPSBtLmdyb3VwKDMpOyAvLyAoPHwkKQorICAgICAgICAgICAgICAgIC8vIOS4jeabv+aNouWPjOW8leWPt+S4uiZxdW90O++8jOmYsuatompzb27moLzlvI/ml6DmlYggcmVnZXhSZXBsYWNlKFBfUVVPVEUsICImcXVvdDsiLCB0d28pCisgICAgICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChidWYsIE1hdGNoZXIucXVvdGVSZXBsYWNlbWVudChvbmUgKyB0d28gKyB0aHJlZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbS5hcHBlbmRUYWlsKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrRW50aXR5KGZpbmFsIFN0cmluZyBwcmVhbWJsZSwgZmluYWwgU3RyaW5nIHRlcm0pCisgICAgeworCisgICAgICAgIHJldHVybiAiOyIuZXF1YWxzKHRlcm0pICYmIGlzVmFsaWRFbnRpdHkocHJlYW1ibGUpID8gJyYnICsgcHJlYW1ibGUgOiAiJmFtcDsiICsgcHJlYW1ibGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRFbnRpdHkoZmluYWwgU3RyaW5nIGVudGl0eSkKKyAgICB7CisgICAgICAgIHJldHVybiBpbkFycmF5KGVudGl0eSwgdkFsbG93ZWRFbnRpdGllcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbkFycmF5KGZpbmFsIFN0cmluZyBzLCBmaW5hbCBTdHJpbmdbXSBhcnJheSkKKyAgICB7CisgICAgICAgIGZvciAoU3RyaW5nIGl0ZW0gOiBhcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmVxdWFscyhzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93ZWQoZmluYWwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gKHZBbGxvd2VkLmlzRW1wdHkoKSB8fCB2QWxsb3dlZC5jb250YWluc0tleShuYW1lKSkgJiYgIWluQXJyYXkobmFtZSwgdkRpc2FsbG93ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd2VkQXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFsbG93ZWQobmFtZSkgJiYgKHZBbGxvd2VkLmlzRW1wdHkoKSB8fCB2QWxsb3dlZC5nZXQobmFtZSkuY29udGFpbnMocGFyYW1OYW1lKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaHR0cC9IdHRwSGVscGVyLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2h0dHAvSHR0cEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMWYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2h0dHAvSHR0cEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5odHRwOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5leGNlcHRpb24uRXhjZXB0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiDpgJrnlKhodHRw5bel5YW35bCB6KOFCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEh0dHBIZWxwZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSHR0cEhlbHBlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCb2R5U3RyaW5nKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgTE9HR0VSLndhcm4oImdldEJvZHlTdHJpbmflh7rnjrDpl67popjvvIEiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihFeGNlcHRpb25VdGlscy5nZXRNZXNzYWdlKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9odHRwL0h0dHBVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9odHRwL0h0dHBVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWViMjgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2h0dHAvSHR0cFV0aWxzLmphdmEKQEAgLTAsMCArMSwyNzQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5odHRwOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOmAmueUqGh0dHDlj5HpgIHmlrnms5UKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgSHR0cFV0aWxzCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBVdGlscy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiDlkJHmjIflrpogVVJMIOWPkemAgUdFVOaWueazleeahOivt+axggorICAgICAqCisgICAgICogQHBhcmFtIHVybCDlj5HpgIHor7fmsYLnmoQgVVJMCisgICAgICogQHJldHVybiDmiYDku6Pooajov5znqIvotYTmupDnmoTlk43lupTnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZW5kR2V0KFN0cmluZyB1cmwpCisgICAgeworICAgICAgICByZXR1cm4gc2VuZEdldCh1cmwsIFN0cmluZ1V0aWxzLkVNUFRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlkJHmjIflrpogVVJMIOWPkemAgUdFVOaWueazleeahOivt+axggorICAgICAqCisgICAgICogQHBhcmFtIHVybCDlj5HpgIHor7fmsYLnmoQgVVJMCisgICAgICogQHBhcmFtIHBhcmFtIOivt+axguWPguaVsO+8jOivt+axguWPguaVsOW6lOivpeaYryBuYW1lMT12YWx1ZTEmbmFtZTI9dmFsdWUyIOeahOW9ouW8j+OAggorICAgICAqIEByZXR1cm4g5omA5Luj6KGo6L+c56iL6LWE5rqQ55qE5ZON5bqU57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VuZEdldChTdHJpbmcgdXJsLCBTdHJpbmcgcGFyYW0pCisgICAgeworICAgICAgICByZXR1cm4gc2VuZEdldCh1cmwsIHBhcmFtLCBDb25zdGFudHMuVVRGOCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5ZCR5oyH5a6aIFVSTCDlj5HpgIFHRVTmlrnms5XnmoTor7fmsYIKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwg5Y+R6YCB6K+35rGC55qEIFVSTAorICAgICAqIEBwYXJhbSBwYXJhbSDor7fmsYLlj4LmlbDvvIzor7fmsYLlj4LmlbDlupTor6XmmK8gbmFtZTE9dmFsdWUxJm5hbWUyPXZhbHVlMiDnmoTlvaLlvI/jgIIKKyAgICAgKiBAcGFyYW0gY29udGVudFR5cGUg57yW56CB57G75Z6LCisgICAgICogQHJldHVybiDmiYDku6Pooajov5znqIvotYTmupDnmoTlk43lupTnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZW5kR2V0KFN0cmluZyB1cmwsIFN0cmluZyBwYXJhbSwgU3RyaW5nIGNvbnRlbnRUeXBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJsTmFtZVN0cmluZyA9IFN0cmluZ1V0aWxzLmlzTm90QmxhbmsocGFyYW0pID8gdXJsICsgIj8iICsgcGFyYW0gOiB1cmw7CisgICAgICAgICAgICBsb2cuaW5mbygic2VuZEdldCAtIHt9IiwgdXJsTmFtZVN0cmluZyk7CisgICAgICAgICAgICBVUkwgcmVhbFVybCA9IG5ldyBVUkwodXJsTmFtZVN0cmluZyk7CisgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZWFsVXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiYWNjZXB0IiwgIiovKiIpOworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoImNvbm5lY3Rpb24iLCAiS2VlcC1BbGl2ZSIpOworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoInVzZXItYWdlbnQiLCAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkiKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSwgY29udGVudFR5cGUpKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmluZm8oInJlY3YgLSB7fSIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLosIPnlKhIdHRwVXRpbHMuc2VuZEdldCBDb25uZWN0RXhjZXB0aW9uLCB1cmw9IiArIHVybCArICIscGFyYW09IiArIHBhcmFtLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiwg+eUqEh0dHBVdGlscy5zZW5kR2V0IFNvY2tldFRpbWVvdXRFeGNlcHRpb24sIHVybD0iICsgdXJsICsgIixwYXJhbT0iICsgcGFyYW0sIGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiwg+eUqEh0dHBVdGlscy5zZW5kR2V0IElPRXhjZXB0aW9uLCB1cmw9IiArIHVybCArICIscGFyYW09IiArIHBhcmFtLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoSHR0cHNVdGlsLnNlbmRHZXQgRXhjZXB0aW9uLCB1cmw9IiArIHVybCArICIscGFyYW09IiArIHBhcmFtLCBlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoaW4uY2xvc2UgRXhjZXB0aW9uLCB1cmw9IiArIHVybCArICIscGFyYW09IiArIHBhcmFtLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWQkeaMh+WumiBVUkwg5Y+R6YCBUE9TVOaWueazleeahOivt+axggorICAgICAqCisgICAgICogQHBhcmFtIHVybCDlj5HpgIHor7fmsYLnmoQgVVJMCisgICAgICogQHBhcmFtIHBhcmFtIOivt+axguWPguaVsO+8jOivt+axguWPguaVsOW6lOivpeaYryBuYW1lMT12YWx1ZTEmbmFtZTI9dmFsdWUyIOeahOW9ouW8j+OAggorICAgICAqIEByZXR1cm4g5omA5Luj6KGo6L+c56iL6LWE5rqQ55qE5ZON5bqU57uT5p6cCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VuZFBvc3QoU3RyaW5nIHVybCwgU3RyaW5nIHBhcmFtKQorICAgIHsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuaW5mbygic2VuZFBvc3QgLSB7fSIsIHVybCk7CisgICAgICAgICAgICBVUkwgcmVhbFVybCA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHJlYWxVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJhY2NlcHQiLCAiKi8qIik7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiY29ubmVjdGlvbiIsICJLZWVwLUFsaXZlIik7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgidXNlci1hZ2VudCIsICJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSIpOworICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdC1DaGFyc2V0IiwgInV0Zi04Iik7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiY29udGVudFR5cGUiLCAidXRmLTgiKTsKKyAgICAgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBjb25uLnNldERvSW5wdXQodHJ1ZSk7CisgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoY29ubi5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBvdXQucHJpbnQocGFyYW0pOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29ubi5nZXRJbnB1dFN0cmVhbSgpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5pbmZvKCJyZWN2IC0ge30iLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoSHR0cFV0aWxzLnNlbmRQb3N0IENvbm5lY3RFeGNlcHRpb24sIHVybD0iICsgdXJsICsgIixwYXJhbT0iICsgcGFyYW0sIGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoSHR0cFV0aWxzLnNlbmRQb3N0IFNvY2tldFRpbWVvdXRFeGNlcHRpb24sIHVybD0iICsgdXJsICsgIixwYXJhbT0iICsgcGFyYW0sIGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiwg+eUqEh0dHBVdGlscy5zZW5kUG9zdCBJT0V4Y2VwdGlvbiwgdXJsPSIgKyB1cmwgKyAiLHBhcmFtPSIgKyBwYXJhbSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiwg+eUqEh0dHBzVXRpbC5zZW5kUG9zdCBFeGNlcHRpb24sIHVybD0iICsgdXJsICsgIixwYXJhbT0iICsgcGFyYW0sIGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCLosIPnlKhpbi5jbG9zZSBFeGNlcHRpb24sIHVybD0iICsgdXJsICsgIixwYXJhbT0iICsgcGFyYW0sIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VuZFNTTFBvc3QoU3RyaW5nIHVybCwgU3RyaW5nIHBhcmFtKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmcgdXJsTmFtZVN0cmluZyA9IHVybCArICI/IiArIHBhcmFtOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmluZm8oInNlbmRTU0xQb3N0IC0ge30iLCB1cmxOYW1lU3RyaW5nKTsKKyAgICAgICAgICAgIFNTTENvbnRleHQgc2MgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJTU0wiKTsKKyAgICAgICAgICAgIHNjLmluaXQobnVsbCwgbmV3IFRydXN0TWFuYWdlcltdIHsgbmV3IFRydXN0QW55VHJ1c3RNYW5hZ2VyKCkgfSwgbmV3IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKCkpOworICAgICAgICAgICAgVVJMIGNvbnNvbGUgPSBuZXcgVVJMKHVybE5hbWVTdHJpbmcpOworICAgICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cHNVUkxDb25uZWN0aW9uKSBjb25zb2xlLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiYWNjZXB0IiwgIiovKiIpOworICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoImNvbm5lY3Rpb24iLCAiS2VlcC1BbGl2ZSIpOworICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoInVzZXItYWdlbnQiLCAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkiKTsKKyAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQtQ2hhcnNldCIsICJ1dGYtOCIpOworICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoImNvbnRlbnRUeXBlIiwgInV0Zi04Iik7CisgICAgICAgICAgICBjb25uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICAgICAgY29ubi5zZXREb0lucHV0KHRydWUpOworCisgICAgICAgICAgICBjb25uLnNldFNTTFNvY2tldEZhY3Rvcnkoc2MuZ2V0U29ja2V0RmFjdG9yeSgpKTsKKyAgICAgICAgICAgIGNvbm4uc2V0SG9zdG5hbWVWZXJpZmllcihuZXcgVHJ1c3RBbnlIb3N0bmFtZVZlcmlmaWVyKCkpOworICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgICAgICAgICAgU3RyaW5nIHJldCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKChyZXQgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJldC50cmltKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuZXcgU3RyaW5nKHJldC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmluZm8oInJlY3YgLSB7fSIsIHJlc3VsdCk7CisgICAgICAgICAgICBjb25uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLosIPnlKhIdHRwVXRpbHMuc2VuZFNTTFBvc3QgQ29ubmVjdEV4Y2VwdGlvbiwgdXJsPSIgKyB1cmwgKyAiLHBhcmFtPSIgKyBwYXJhbSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLosIPnlKhIdHRwVXRpbHMuc2VuZFNTTFBvc3QgU29ja2V0VGltZW91dEV4Y2VwdGlvbiwgdXJsPSIgKyB1cmwgKyAiLHBhcmFtPSIgKyBwYXJhbSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoSHR0cFV0aWxzLnNlbmRTU0xQb3N0IElPRXhjZXB0aW9uLCB1cmw9IiArIHVybCArICIscGFyYW09IiArIHBhcmFtLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigi6LCD55SoSHR0cHNVdGlsLnNlbmRTU0xQb3N0IEV4Y2VwdGlvbiwgdXJsPSIgKyB1cmwgKyAiLHBhcmFtPSIgKyBwYXJhbSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRydXN0QW55VHJ1c3RNYW5hZ2VyIGltcGxlbWVudHMgWDUwOVRydXN0TWFuYWdlcgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrQ2xpZW50VHJ1c3RlZChYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiwgU3RyaW5nIGF1dGhUeXBlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGVbXSB7fTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRydXN0QW55SG9zdG5hbWVWZXJpZmllciBpbXBsZW1lbnRzIEhvc3RuYW1lVmVyaWZpZXIKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIGhvc3RuYW1lLCBTU0xTZXNzaW9uIHNlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaXAvQWRkcmVzc1V0aWxzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2lwL0FkZHJlc3NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmU0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL2lwL0FkZHJlc3NVdGlscy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5pcDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT047CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05PYmplY3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25maWcuUnVvWWlDb25maWc7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmh0dHAuSHR0cFV0aWxzOworCisvKioKKyAqIOiOt+WPluWcsOWdgOexuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRyZXNzVXRpbHMKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWRkcmVzc1V0aWxzLmNsYXNzKTsKKworICAgIC8vIElQ5Zyw5Z2A5p+l6K+iCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBfVVJMID0gImh0dHA6Ly93aG9pcy5wY29ubGluZS5jb20uY24vaXBKc29uLmpzcCI7CisKKyAgICAvLyDmnKrnn6XlnLDlnYAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gIlhYIFhYIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlYWxBZGRyZXNzQnlJUChTdHJpbmcgaXApCisgICAgeworICAgICAgICAvLyDlhoXnvZHkuI3mn6Xor6IKKyAgICAgICAgaWYgKElwVXRpbHMuaW50ZXJuYWxJcChpcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAi5YaF572RSVAiOworICAgICAgICB9CisgICAgICAgIGlmIChSdW9ZaUNvbmZpZy5pc0FkZHJlc3NFbmFibGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyByc3BTdHIgPSBIdHRwVXRpbHMuc2VuZEdldChJUF9VUkwsICJpcD0iICsgaXAgKyAiJmpzb249dHJ1ZSIsIENvbnN0YW50cy5HQkspOworICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHJzcFN0cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIuiOt+WPluWcsOeQhuS9jee9ruW8guW4uCB7fSIsIGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEpTT05PYmplY3Qgb2JqID0gSlNPTi5wYXJzZU9iamVjdChyc3BTdHIpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWdpb24gPSBvYmouZ2V0U3RyaW5nKCJwcm8iKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2l0eSA9IG9iai5nZXRTdHJpbmcoImNpdHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgJXMiLCByZWdpb24sIGNpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigi6I635Y+W5Zyw55CG5L2N572u5byC5bi4IHt9IiwgaXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBVTktOT1dOOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaXAvSXBVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9pcC9JcFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3NjQxNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvaXAvSXBVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuaXA7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiDojrflj5ZJUOaWueazlQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBJcFV0aWxzCit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVHWF8wXzI1NSA9ICIoMjVbMC01XXwyWzAtNF1cXGR8MVxcZHsyfXxbMS05XVxcZHxcXGQpIjsKKyAgICAvLyDljLnphY0gaXAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUdYX0lQID0gIigoIiArIFJFR1hfMF8yNTUgKyAiXFwuKXszfSIgKyBSRUdYXzBfMjU1ICsgIikiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFR1hfSVBfV0lMRENBUkQgPSAiKCgoXFwqXFwuKXszfVxcKil8KCIgKyBSRUdYXzBfMjU1ICsgIihcXC5cXCopezN9KXwoIiArIFJFR1hfMF8yNTUgKyAiXFwuIiArIFJFR1hfMF8yNTUgKyAiKShcXC5cXCopezJ9IiArICJ8KCgiICsgUkVHWF8wXzI1NSArICJcXC4pezN9XFwqKSkiOworICAgIC8vIOWMuemFjee9keautQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFR1hfSVBfU0VHID0gIigiICsgUkVHWF9JUCArICJcXC0iICsgUkVHWF9JUCArICIpIjsKKworICAgIC8qKgorICAgICAqIOiOt+WPluWuouaIt+err0lQCisgICAgICogCisgICAgICogQHJldHVybiBJUOWcsOWdgAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElwQWRkcigpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0SXBBZGRyKFNlcnZsZXRVdGlscy5nZXRSZXF1ZXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWuouaIt+err0lQCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3Qg6K+35rGC5a+56LGhCisgICAgICogQHJldHVybiBJUOWcsOWdgAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElwQWRkcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGlwID0gcmVxdWVzdC5nZXRIZWFkZXIoIngtZm9yd2FyZGVkLWZvciIpOworICAgICAgICBpZiAoaXAgPT0gbnVsbCB8fCBpcC5sZW5ndGgoKSA9PSAwIHx8ICJ1bmtub3duIi5lcXVhbHNJZ25vcmVDYXNlKGlwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaXAgPSByZXF1ZXN0LmdldEhlYWRlcigiUHJveHktQ2xpZW50LUlQIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlwID09IG51bGwgfHwgaXAubGVuZ3RoKCkgPT0gMCB8fCAidW5rbm93biIuZXF1YWxzSWdub3JlQ2FzZShpcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlwID0gcmVxdWVzdC5nZXRIZWFkZXIoIlgtRm9yd2FyZGVkLUZvciIpOworICAgICAgICB9CisgICAgICAgIGlmIChpcCA9PSBudWxsIHx8IGlwLmxlbmd0aCgpID09IDAgfHwgInVua25vd24iLmVxdWFsc0lnbm9yZUNhc2UoaXApKQorICAgICAgICB7CisgICAgICAgICAgICBpcCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJXTC1Qcm94eS1DbGllbnQtSVAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXAgPT0gbnVsbCB8fCBpcC5sZW5ndGgoKSA9PSAwIHx8ICJ1bmtub3duIi5lcXVhbHNJZ25vcmVDYXNlKGlwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaXAgPSByZXF1ZXN0LmdldEhlYWRlcigiWC1SZWFsLUlQIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXAgPT0gbnVsbCB8fCBpcC5sZW5ndGgoKSA9PSAwIHx8ICJ1bmtub3duIi5lcXVhbHNJZ25vcmVDYXNlKGlwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaXAgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiMDowOjA6MDowOjA6MDoxIi5lcXVhbHMoaXApID8gIjEyNy4wLjAuMSIgOiBnZXRNdWx0aXN0YWdlUmV2ZXJzZVByb3h5SXAoaXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIOajgOafpeaYr+WQpuS4uuWGhemDqElQ5Zyw5Z2ACisgICAgICogCisgICAgICogQHBhcmFtIGlwIElQ5Zyw5Z2ACisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxJcChTdHJpbmcgaXApCisgICAgeworICAgICAgICBieXRlW10gYWRkciA9IHRleHRUb051bWVyaWNGb3JtYXRWNChpcCk7CisgICAgICAgIHJldHVybiBpbnRlcm5hbElwKGFkZHIpIHx8ICIxMjcuMC4wLjEiLmVxdWFscyhpcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qOA5p+l5piv5ZCm5Li65YaF6YOoSVDlnLDlnYAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkciBieXRl5Zyw5Z2ACisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGludGVybmFsSXAoYnl0ZVtdIGFkZHIpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOdWxsKGFkZHIpIHx8IGFkZHIubGVuZ3RoIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYnl0ZSBiMCA9IGFkZHJbMF07CisgICAgICAgIGZpbmFsIGJ5dGUgYjEgPSBhZGRyWzFdOworICAgICAgICAvLyAxMC54LngueC84CisgICAgICAgIGZpbmFsIGJ5dGUgU0VDVElPTl8xID0gMHgwQTsKKyAgICAgICAgLy8gMTcyLjE2LngueC8xMgorICAgICAgICBmaW5hbCBieXRlIFNFQ1RJT05fMiA9IChieXRlKSAweEFDOworICAgICAgICBmaW5hbCBieXRlIFNFQ1RJT05fMyA9IChieXRlKSAweDEwOworICAgICAgICBmaW5hbCBieXRlIFNFQ1RJT05fNCA9IChieXRlKSAweDFGOworICAgICAgICAvLyAxOTIuMTY4LngueC8xNgorICAgICAgICBmaW5hbCBieXRlIFNFQ1RJT05fNSA9IChieXRlKSAweEMwOworICAgICAgICBmaW5hbCBieXRlIFNFQ1RJT05fNiA9IChieXRlKSAweEE4OworICAgICAgICBzd2l0Y2ggKGIwKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNFQ1RJT05fMToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgU0VDVElPTl8yOgorICAgICAgICAgICAgICAgIGlmIChiMSA+PSBTRUNUSU9OXzMgJiYgYjEgPD0gU0VDVElPTl80KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTRUNUSU9OXzU6CisgICAgICAgICAgICAgICAgc3dpdGNoIChiMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VDVElPTl82OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlsIZJUHY05Zyw5Z2A6L2s5o2i5oiQ5a2X6IqCCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQgSVB2NOWcsOWdgAorICAgICAqIEByZXR1cm4gYnl0ZSDlrZfoioIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0ZXh0VG9OdW1lcmljRm9ybWF0VjQoU3RyaW5nIHRleHQpCisgICAgeworICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHRleHQuc3BsaXQoIlxcLiIsIC0xKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBsID0gTG9uZy5wYXJzZUxvbmcoZWxlbWVudHNbMF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoKGwgPCAwTCkgfHwgKGwgPiA0Mjk0OTY3Mjk1TCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzBdID0gKGJ5dGUpIChpbnQpIChsID4+IDI0ICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzFdID0gKGJ5dGUpIChpbnQpICgobCAmIDB4RkZGRkZGKSA+PiAxNiAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBieXRlc1syXSA9IChieXRlKSAoaW50KSAoKGwgJiAweEZGRkYpID4+IDggJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkgKGludCkgKGwgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBsID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50c1swXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobCA8IDBMKSB8fCAobCA+IDI1NUwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBieXRlc1swXSA9IChieXRlKSAoaW50KSAobCAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBsID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50c1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobCA8IDBMKSB8fCAobCA+IDE2Nzc3MjE1TCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzFdID0gKGJ5dGUpIChpbnQpIChsID4+IDE2ICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzJdID0gKGJ5dGUpIChpbnQpICgobCAmIDB4RkZGRikgPj4gOCAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBieXRlc1szXSA9IChieXRlKSAoaW50KSAobCAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobCA8IDBMKSB8fCAobCA+IDI1NUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgKGludCkgKGwgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50c1syXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobCA8IDBMKSB8fCAobCA+IDY1NTM1TCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzJdID0gKGJ5dGUpIChpbnQpIChsID4+IDggJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkgKGludCkgKGwgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGwgPCAwTCkgfHwgKGwgPiAyNTVMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIChpbnQpIChsICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+WSVDlnLDlnYAKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOacrOWcsElQ5Zyw5Z2ACisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SG9zdElwKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHJldHVybiAiMTI3LjAuMC4xIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bkuLvmnLrlkI0KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOacrOWcsOS4u+acuuWQjQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhvc3ROYW1lKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHJldHVybiAi5pyq55+lIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDku47lpJrnuqflj43lkJHku6PnkIbkuK3ojrflvpfnrKzkuIDkuKrpnZ51bmtub3duIElQ5Zyw5Z2ACisgICAgICoKKyAgICAgKiBAcGFyYW0gaXAg6I635b6X55qESVDlnLDlnYAKKyAgICAgKiBAcmV0dXJuIOesrOS4gOS4qumdnnVua25vd24gSVDlnLDlnYAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNdWx0aXN0YWdlUmV2ZXJzZVByb3h5SXAoU3RyaW5nIGlwKQorICAgIHsKKyAgICAgICAgLy8g5aSa57qn5Y+N5ZCR5Luj55CG5qOA5rWLCisgICAgICAgIGlmIChpcCAhPSBudWxsICYmIGlwLmluZGV4T2YoIiwiKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGlwcyA9IGlwLnRyaW0oKS5zcGxpdCgiLCIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgc3ViSXAgOiBpcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlID09IGlzVW5rbm93bihzdWJJcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpcCA9IHN1YklwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN1YnN0cmluZyhpcCwgMCwgMjU1KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmo4DmtYvnu5nlrprlrZfnrKbkuLLmmK/lkKbkuLrmnKrnn6XvvIzlpJrnlKjkuo7mo4DmtYtIVFRQ6K+35rGC55u45YWzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hlY2tTdHJpbmcg6KKr5qOA5rWL55qE5a2X56ym5LiyCisgICAgICogQHJldHVybiDmmK/lkKbmnKrnn6UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmtub3duKFN0cmluZyBjaGVja1N0cmluZykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc0JsYW5rKGNoZWNrU3RyaW5nKSB8fCAidW5rbm93biIuZXF1YWxzSWdub3JlQ2FzZShjaGVja1N0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5Li6SVAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJUChTdHJpbmcgaXApCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhpcCkgJiYgaXAubWF0Y2hlcyhSRUdYX0lQKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbkuLpJUO+8jOaIliAq5Li66Ze06ZqU55qE6YCa6YWN56ym5Zyw5Z2ACisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSXBXaWxkQ2FyZChTdHJpbmcgaXApCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhpcCkgJiYgaXAubWF0Y2hlcyhSRUdYX0lQX1dJTERDQVJEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmo4DmtYvlj4LmlbDmmK/lkKblnKhpcOmAmumFjeespumHjAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcElzSW5XaWxkQ2FyZE5vQ2hlY2soU3RyaW5nIGlwV2lsZENhcmQsIFN0cmluZyBpcCkKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHMxID0gaXBXaWxkQ2FyZC5zcGxpdCgiXFwuIik7CisgICAgICAgIFN0cmluZ1tdIHMyID0gaXAuc3BsaXQoIlxcLiIpOworICAgICAgICBib29sZWFuIGlzTWF0Y2hlZFNlZyA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczEubGVuZ3RoICYmICFzMVtpXS5lcXVhbHMoIioiKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXMxW2ldLmVxdWFscyhzMltpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNNYXRjaGVkU2VnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZFNlZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbkuLrnibnlrprmoLzlvI/lpoI64oCcMTAuMTAuMTAuMS0xMC4xMC4xMC45OeKAneeahGlw5q615a2X56ym5LiyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSVBTZWdtZW50KFN0cmluZyBpcFNlZykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc05vdEJsYW5rKGlwU2VnKSAmJiBpcFNlZy5tYXRjaGVzKFJFR1hfSVBfU0VHKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq1pcOaYr+WQpuWcqOaMh+Wumue9keauteS4rQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcElzSW5OZXROb0NoZWNrKFN0cmluZyBpcGFyZWEsIFN0cmluZyBpcCkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpcGFyZWEuaW5kZXhPZignLScpOworICAgICAgICBTdHJpbmdbXSBzaXBzID0gaXBhcmVhLnN1YnN0cmluZygwLCBpZHgpLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgU3RyaW5nW10gc2lwZSA9IGlwYXJlYS5zdWJzdHJpbmcoaWR4ICsgMSkuc3BsaXQoIlxcLiIpOworICAgICAgICBTdHJpbmdbXSBzaXB0ID0gaXAuc3BsaXQoIlxcLiIpOworICAgICAgICBsb25nIGlwcyA9IDBMLCBpcGUgPSAwTCwgaXB0ID0gMEw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpcHMgPSBpcHMgPDwgOCB8IEludGVnZXIucGFyc2VJbnQoc2lwc1tpXSk7CisgICAgICAgICAgICBpcGUgPSBpcGUgPDwgOCB8IEludGVnZXIucGFyc2VJbnQoc2lwZVtpXSk7CisgICAgICAgICAgICBpcHQgPSBpcHQgPDwgOCB8IEludGVnZXIucGFyc2VJbnQoc2lwdFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlwcyA+IGlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyB0ID0gaXBzOworICAgICAgICAgICAgaXBzID0gaXBlOworICAgICAgICAgICAgaXBlID0gdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXBzIDw9IGlwdCAmJiBpcHQgPD0gaXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjGlw5piv5ZCm56ym5ZCI6L+H5ruk5Liy6KeE5YiZCisgICAgICogCisgICAgICogQHBhcmFtIGZpbHRlciDov4fmu6RJUOWIl+ihqCzmlK/mjIHlkI7nvIAnKifpgJrphY0s5pSv5oyB572R5q615aaCOmAxMC4xMC4xMC4xLTEwLjEwLjEwLjk5YAorICAgICAqIEBwYXJhbSBpcCDmoKHpqoxJUOWcsOWdgAorICAgICAqIEByZXR1cm4gYm9vbGVhbiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGVkSXAoU3RyaW5nIGZpbHRlciwgU3RyaW5nIGlwKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZmlsdGVyKSB8fCBTdHJpbmdVdGlscy5pc0VtcHR5KGlwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGlwcyA9IGZpbHRlci5zcGxpdCgiOyIpOworICAgICAgICBmb3IgKFN0cmluZyBpU3RyIDogaXBzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNJUChpU3RyKSAmJiBpU3RyLmVxdWFscyhpcCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc0lwV2lsZENhcmQoaVN0cikgJiYgaXBJc0luV2lsZENhcmROb0NoZWNrKGlTdHIsIGlwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGlzSVBTZWdtZW50KGlTdHIpICYmIGlwSXNJbk5ldE5vQ2hlY2soaVN0ciwgaXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9wb2kvRXhjZWxIYW5kbGVyQWRhcHRlci5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9wb2kvRXhjZWxIYW5kbGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWIyODgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3BvaS9FeGNlbEhhbmRsZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaTsKKworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5Xb3JrYm9vazsKKworLyoqCisgKiBFeGNlbOaVsOaNruagvOW8j+WkhOeQhumAgumFjeWZqAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhjZWxIYW5kbGVyQWRhcHRlcgoreworICAgIC8qKgorICAgICAqIOagvOW8j+WMlgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSDljZXlhYPmoLzmlbDmja7lgLwKKyAgICAgKiBAcGFyYW0gYXJncyBleGNlbOazqOino2FyZ3Plj4LmlbDnu4QKKyAgICAgKiBAcGFyYW0gY2VsbCDljZXlhYPmoLzlr7nosaEKKyAgICAgKiBAcGFyYW0gd2Ig5bel5L2c57C/5a+56LGhCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOWkhOeQhuWQjueahOWAvAorICAgICAqLworICAgIE9iamVjdCBmb3JtYXQoT2JqZWN0IHZhbHVlLCBTdHJpbmdbXSBhcmdzLCBDZWxsIGNlbGwsIFdvcmtib29rIHdiKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvcG9pL0V4Y2VsVXRpbC5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9wb2kvRXhjZWxVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NTJmMgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvcG9pL0V4Y2VsVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTgxMiBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLnBvaTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlJlZ0V4VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnJlZmxlY3QuRmllbGRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbC5IU1NGQ2xpZW50QW5jaG9yOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZQaWN0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZQaWN0dXJlRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbC5IU1NGU2hhcGU7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRlNoZWV0OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZXb3JrYm9vazsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5vb3htbC5QT0lYTUxEb2N1bWVudFBhcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkJvcmRlclN0eWxlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5DZWxsU3R5bGU7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkNlbGxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5DbGllbnRBbmNob3I7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkRhdGFGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkRhdGFWYWxpZGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5EYXRhVmFsaWRhdGlvbkNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkRhdGFWYWxpZGF0aW9uSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5EYXRlVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuRHJhd2luZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuRmlsbFBhdHRlcm5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5Gb250OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5Ib3Jpem9udGFsQWxpZ25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5JbmRleGVkQ29sb3JzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5QaWN0dXJlRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5TaGVldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuVmVydGljYWxBbGlnbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLldvcmtib29rOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5Xb3JrYm9va0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXRpbC5DZWxsUmFuZ2VBZGRyZXNzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnV0aWwuQ2VsbFJhbmdlQWRkcmVzc0xpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnhzc2Yuc3RyZWFtaW5nLlNYU1NGV29ya2Jvb2s7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kueHNzZi51c2VybW9kZWwuWFNTRkNsaWVudEFuY2hvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS54c3NmLnVzZXJtb2RlbC5YU1NGRGF0YVZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kueHNzZi51c2VybW9kZWwuWFNTRkRyYXdpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kueHNzZi51c2VybW9kZWwuWFNTRlBpY3R1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kueHNzZi51c2VybW9kZWwuWFNTRlNoYXBlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnhzc2YudXNlcm1vZGVsLlhTU0ZTaGVldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS54c3NmLnVzZXJtb2RlbC5YU1NGV29ya2Jvb2s7CitpbXBvcnQgb3JnLm9wZW54bWxmb3JtYXRzLnNjaGVtYXMuZHJhd2luZ21sLngyMDA2LnNwcmVhZHNoZWV0RHJhd2luZy5DVE1hcmtlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWwuQ29sdW1uVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWwuVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uZmlnLlJ1b1lpQ29uZmlnOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dC5Db252ZXJ0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLlV0aWxFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EaWN0VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmZpbGUuRmlsZVR5cGVVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmZpbGUuRmlsZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuZmlsZS5JbWFnZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucmVmbGVjdC5SZWZsZWN0VXRpbHM7CisKKy8qKgorICogRXhjZWznm7jlhbPlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgRXhjZWxVdGlsPFQ+Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEV4Y2VsVXRpbC5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNVUxBX1JFR0VYX1NUUiA9ICI9fC18XFwrfEAiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNVUxBX1NUUiA9IHsgIj0iLCAiLSIsICIrIiwgIkAiIH07CisKKyAgICAvKioKKyAgICAgKiDnlKjkuo5kaWN0VHlwZeWxnuaAp+aVsOaNruWtmOWCqO+8jOmBv+WFjemHjeWkjeafpee8k+WtmAorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHN5c0RpY3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEV4Y2VsIHNoZWV05pyA5aSn6KGM5pWw77yM6buY6K6kNjU1MzYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaGVldFNpemUgPSA2NTUzNjsKKworICAgIC8qKgorICAgICAqIOW3peS9nOihqOWQjeensAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNoZWV0TmFtZTsKKworICAgIC8qKgorICAgICAqIOWvvOWHuuexu+Wei++8iEVYUE9SVDrlr7zlh7rmlbDmja7vvJtJTVBPUlTvvJrlr7zlhaXmqKHmnb/vvIkKKyAgICAgKi8KKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIC8qKgorICAgICAqIOW3peS9nOiWhOWvueixoQorICAgICAqLworICAgIHByaXZhdGUgV29ya2Jvb2sgd2I7CisKKyAgICAvKioKKyAgICAgKiDlt6XkvZzooajlr7nosaEKKyAgICAgKi8KKyAgICBwcml2YXRlIFNoZWV0IHNoZWV0OworCisgICAgLyoqCisgICAgICog5qC35byP5YiX6KGoCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDZWxsU3R5bGU+IHN0eWxlczsKKworICAgIC8qKgorICAgICAqIOWvvOWFpeWvvOWHuuaVsOaNruWIl+ihqAorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxUPiBsaXN0OworCisgICAgLyoqCisgICAgICog5rOo6Kej5YiX6KGoCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PE9iamVjdFtdPiBmaWVsZHM7CisKKyAgICAvKioKKyAgICAgKiDlvZPliY3ooYzlj7cKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByb3dudW07CisKKyAgICAvKioKKyAgICAgKiDmoIfpopgKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKworICAgIC8qKgorICAgICAqIOacgOWkp+mrmOW6pgorICAgICAqLworICAgIHByaXZhdGUgc2hvcnQgbWF4SGVpZ2h0OworCisgICAgLyoqCisgICAgICog5ZCI5bm25ZCO5pyA5ZCO6KGM5pWwCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3ViTWVyZ2VkTGFzdFJvd051bSA9IDA7CisKKyAgICAvKioKKyAgICAgKiDlkIjlubblkI7lvIDlp4vooYzmlbAKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzdWJNZXJnZWRGaXJzdFJvd051bSA9IDE7CisKKyAgICAvKioKKyAgICAgKiDlr7nosaHnmoTlrZDliJfooajmlrnms5UKKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBzdWJNZXRob2Q7CisKKyAgICAvKioKKyAgICAgKiDlr7nosaHnmoTlrZDliJfooajlsZ7mgKcKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8RmllbGQ+IHN1YkZpZWxkczsKKworICAgIC8qKgorICAgICAqIOe7n+iuoeWIl+ihqAorICAgICAqLworICAgIHByaXZhdGUgTWFwPEludGVnZXIsIERvdWJsZT4gc3RhdGlzdGljcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIERvdWJsZT4oKTsKKworICAgIC8qKgorICAgICAqIOaVsOWtl+agvOW8jworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlY2ltYWxGb3JtYXQgRE9VQkxFX0ZPUk1BVCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMjIyMwLjAwIik7CisKKyAgICAvKioKKyAgICAgKiDlrp7kvZPlr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8VD4gY2xheno7CisKKyAgICAvKioKKyAgICAgKiDpnIDopoHmjpLpmaTliJflsZ7mgKcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZXhjbHVkZUZpZWxkczsKKworICAgIHB1YmxpYyBFeGNlbFV0aWwoQ2xhc3M8VD4gY2xhenopCisgICAgeworICAgICAgICB0aGlzLmNsYXp6ID0gY2xheno7CisgICAgfQorCisgICAgLyoqCisgICAgICog6ZqQ6JePRXhjZWzkuK3liJflsZ7mgKcKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZHMg5YiX5bGe5oCn5ZCNIOekuuS+i1vljZXkuKoibmFtZSIv5aSa5LiqImlkIiwibmFtZSJdCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoaWRlQ29sdW1uKFN0cmluZy4uLiBmaWVsZHMpCisgICAgeworICAgICAgICB0aGlzLmV4Y2x1ZGVGaWVsZHMgPSBmaWVsZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChMaXN0PFQ+IGxpc3QsIFN0cmluZyBzaGVldE5hbWUsIFN0cmluZyB0aXRsZSwgVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgICAgICB0aGlzLnNoZWV0TmFtZSA9IHNoZWV0TmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgICAgICBjcmVhdGVFeGNlbEZpZWxkKCk7CisgICAgICAgIGNyZWF0ZVdvcmtib29rKCk7CisgICAgICAgIGNyZWF0ZVRpdGxlKCk7CisgICAgICAgIGNyZWF0ZVN1YkhlYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliJvlu7pleGNlbOesrOS4gOihjOagh+mimAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRpdGxlKCkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHRpdGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3ViTWVyZ2VkRmlyc3RSb3dOdW0rKzsKKyAgICAgICAgICAgIHN1Yk1lcmdlZExhc3RSb3dOdW0rKzsKKyAgICAgICAgICAgIGludCB0aXRsZUxhc3RDb2wgPSB0aGlzLmZpZWxkcy5zaXplKCkgLSAxOworICAgICAgICAgICAgaWYgKGlzU3ViTGlzdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpdGxlTGFzdENvbCA9IHRpdGxlTGFzdENvbCArIHN1YkZpZWxkcy5zaXplKCkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUm93IHRpdGxlUm93ID0gc2hlZXQuY3JlYXRlUm93KHJvd251bSA9PSAwID8gcm93bnVtKysgOiAwKTsKKyAgICAgICAgICAgIHRpdGxlUm93LnNldEhlaWdodEluUG9pbnRzKDMwKTsKKyAgICAgICAgICAgIENlbGwgdGl0bGVDZWxsID0gdGl0bGVSb3cuY3JlYXRlQ2VsbCgwKTsKKyAgICAgICAgICAgIHRpdGxlQ2VsbC5zZXRDZWxsU3R5bGUoc3R5bGVzLmdldCgidGl0bGUiKSk7CisgICAgICAgICAgICB0aXRsZUNlbGwuc2V0Q2VsbFZhbHVlKHRpdGxlKTsKKyAgICAgICAgICAgIHNoZWV0LmFkZE1lcmdlZFJlZ2lvbihuZXcgQ2VsbFJhbmdlQWRkcmVzcyh0aXRsZVJvdy5nZXRSb3dOdW0oKSwgdGl0bGVSb3cuZ2V0Um93TnVtKCksIHRpdGxlUm93LmdldFJvd051bSgpLCB0aXRsZUxhc3RDb2wpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWIm+W7uuWvueixoeeahOWtkOWIl+ihqOWQjeensAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVN1YkhlYWQoKQorICAgIHsKKyAgICAgICAgaWYgKGlzU3ViTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJNZXJnZWRGaXJzdFJvd051bSsrOworICAgICAgICAgICAgc3ViTWVyZ2VkTGFzdFJvd051bSsrOworICAgICAgICAgICAgUm93IHN1YlJvdyA9IHNoZWV0LmNyZWF0ZVJvdyhyb3dudW0pOworICAgICAgICAgICAgaW50IGV4Y2VsTnVtID0gMDsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0W10gb2JqZWN0cyA6IGZpZWxkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbCBhdHRyID0gKEV4Y2VsKSBvYmplY3RzWzFdOworICAgICAgICAgICAgICAgIENlbGwgaGVhZENlbGwxID0gc3ViUm93LmNyZWF0ZUNlbGwoZXhjZWxOdW0pOworICAgICAgICAgICAgICAgIGhlYWRDZWxsMS5zZXRDZWxsVmFsdWUoYXR0ci5uYW1lKCkpOworICAgICAgICAgICAgICAgIGhlYWRDZWxsMS5zZXRDZWxsU3R5bGUoc3R5bGVzLmdldChTdHJpbmdVdGlscy5mb3JtYXQoImhlYWRlcl97fV97fSIsIGF0dHIuaGVhZGVyQ29sb3IoKSwgYXR0ci5oZWFkZXJCYWNrZ3JvdW5kQ29sb3IoKSkpKTsKKyAgICAgICAgICAgICAgICBleGNlbE51bSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGhlYWRGaXJzdFJvdyA9IGV4Y2VsTnVtIC0gMTsKKyAgICAgICAgICAgIGludCBoZWFkTGFzdFJvdyA9IGhlYWRGaXJzdFJvdyArIHN1YkZpZWxkcy5zaXplKCkgLSAxOworICAgICAgICAgICAgaWYgKGhlYWRMYXN0Um93ID4gaGVhZEZpcnN0Um93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoZWV0LmFkZE1lcmdlZFJlZ2lvbihuZXcgQ2VsbFJhbmdlQWRkcmVzcyhyb3dudW0sIHJvd251bSwgaGVhZEZpcnN0Um93LCBoZWFkTGFzdFJvdykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93bnVtKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lleGNlbOihqOWNlem7mOiupOesrOS4gOS4que0ouW8leWQjei9rOaNouaIkGxpc3QKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMg6L6T5YWl5rWBCisgICAgICogQHJldHVybiDovazmjaLlkI7pm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUPiBpbXBvcnRFeGNlbChJbnB1dFN0cmVhbSBpcykKKyAgICB7CisgICAgICAgIExpc3Q8VD4gbGlzdCA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0ID0gaW1wb3J0RXhjZWwoaXMsIDApOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLlr7zlhaVFeGNlbOW8guW4uHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFV0aWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvuWV4Y2Vs6KGo5Y2V6buY6K6k56ys5LiA5Liq57Si5byV5ZCN6L2s5o2i5oiQbGlzdAorICAgICAqIAorICAgICAqIEBwYXJhbSBpcyDovpPlhaXmtYEKKyAgICAgKiBAcGFyYW0gdGl0bGVOdW0g5qCH6aKY5Y2g55So6KGM5pWwCisgICAgICogQHJldHVybiDovazmjaLlkI7pm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUPiBpbXBvcnRFeGNlbChJbnB1dFN0cmVhbSBpcywgaW50IHRpdGxlTnVtKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW1wb3J0RXhjZWwoU3RyaW5nVXRpbHMuRU1QVFksIGlzLCB0aXRsZU51bSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+5ZXhjZWzooajljZXmjIflrprooajmoLzntKLlvJXlkI3ovazmjaLmiJBsaXN0CisgICAgICogCisgICAgICogQHBhcmFtIHNoZWV0TmFtZSDooajmoLzntKLlvJXlkI0KKyAgICAgKiBAcGFyYW0gdGl0bGVOdW0g5qCH6aKY5Y2g55So6KGM5pWwCisgICAgICogQHBhcmFtIGlzIOi+k+WFpea1gQorICAgICAqIEByZXR1cm4g6L2s5o2i5ZCO6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VD4gaW1wb3J0RXhjZWwoU3RyaW5nIHNoZWV0TmFtZSwgSW5wdXRTdHJlYW0gaXMsIGludCB0aXRsZU51bSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy50eXBlID0gVHlwZS5JTVBPUlQ7CisgICAgICAgIHRoaXMud2IgPSBXb3JrYm9va0ZhY3RvcnkuY3JlYXRlKGlzKTsKKyAgICAgICAgTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPigpOworICAgICAgICAvLyDlpoLmnpzmjIflrppzaGVldOWQjSzliJnlj5bmjIflrppzaGVldOS4reeahOWGheWuuSDlkKbliJnpu5jorqTmjIflkJHnrKwx5Liqc2hlZXQKKyAgICAgICAgU2hlZXQgc2hlZXQgPSBTdHJpbmdVdGlscy5pc05vdEVtcHR5KHNoZWV0TmFtZSkgPyB3Yi5nZXRTaGVldChzaGVldE5hbWUpIDogd2IuZ2V0U2hlZXRBdCgwKTsKKyAgICAgICAgaWYgKHNoZWV0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigi5paH5Lu2c2hlZXTkuI3lrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGlzWFNTRldvcmtib29rID0gISh3YiBpbnN0YW5jZW9mIEhTU0ZXb3JrYm9vayk7CisgICAgICAgIE1hcDxTdHJpbmcsIFBpY3R1cmVEYXRhPiBwaWN0dXJlczsKKyAgICAgICAgaWYgKGlzWFNTRldvcmtib29rKQorICAgICAgICB7CisgICAgICAgICAgICBwaWN0dXJlcyA9IGdldFNoZWV0UGljdHVyZXMwNygoWFNTRlNoZWV0KSBzaGVldCwgKFhTU0ZXb3JrYm9vaykgd2IpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGljdHVyZXMgPSBnZXRTaGVldFBpY3R1cmVzMDMoKEhTU0ZTaGVldCkgc2hlZXQsIChIU1NGV29ya2Jvb2spIHdiKTsKKyAgICAgICAgfQorICAgICAgICAvLyDojrflj5bmnIDlkI7kuIDkuKrpnZ7nqbrooYznmoTooYzkuIvmoIfvvIzmr5TlpoLmgLvooYzmlbDkuLpu77yM5YiZ6L+U5Zue55qE5Li6bi0xCisgICAgICAgIGludCByb3dzID0gc2hlZXQuZ2V0TGFzdFJvd051bSgpOworICAgICAgICBpZiAocm93cyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOWumuS5ieS4gOS4qm1hcOeUqOS6juWtmOaUvmV4Y2Vs5YiX55qE5bqP5Y+35ZKMZmllbGQuCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBjZWxsTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICAgICAgLy8g6I635Y+W6KGo5aS0CisgICAgICAgICAgICBSb3cgaGVhcmQgPSBzaGVldC5nZXRSb3codGl0bGVOdW0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFyZC5nZXRQaHlzaWNhbE51bWJlck9mQ2VsbHMoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENlbGwgY2VsbCA9IGhlYXJkLmdldENlbGwoaSk7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChjZWxsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKGhlYXJkLCBpKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBjZWxsTWFwLnB1dCh2YWx1ZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGxNYXAucHV0KG51bGwsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIOacieaVsOaNruaXtuaJjeWkhOeQhiDlvpfliLDnsbvnmoTmiYDmnIlmaWVsZC4KKyAgICAgICAgICAgIExpc3Q8T2JqZWN0W10+IGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBNYXA8SW50ZWdlciwgT2JqZWN0W10+IGZpZWxkc01hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE9iamVjdFtdPigpOworICAgICAgICAgICAgZm9yIChPYmplY3RbXSBvYmplY3RzIDogZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsIGF0dHIgPSAoRXhjZWwpIG9iamVjdHNbMV07CisgICAgICAgICAgICAgICAgSW50ZWdlciBjb2x1bW4gPSBjZWxsTWFwLmdldChhdHRyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRzTWFwLnB1dChjb2x1bW4sIG9iamVjdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB0aXRsZU51bSArIDE7IGkgPD0gcm93czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOS7juesrDLooYzlvIDlp4vlj5bmlbDmja4s6buY6K6k56ys5LiA6KGM5piv6KGo5aS0LgorICAgICAgICAgICAgICAgIFJvdyByb3cgPSBzaGVldC5nZXRSb3coaSk7CisgICAgICAgICAgICAgICAgLy8g5Yik5pat5b2T5YmN6KGM5piv5ZCm5piv56m66KGMCisgICAgICAgICAgICAgICAgaWYgKGlzUm93RW1wdHkocm93KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUIGVudGl0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgT2JqZWN0W10+IGVudHJ5IDogZmllbGRzTWFwLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gdGhpcy5nZXRDZWxsVmFsdWUocm93LCBlbnRyeS5nZXRLZXkoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiN5a2Y5Zyo5a6e5L6L5YiZ5paw5bu6LgorICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAoZW50aXR5ID09IG51bGwgPyBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9yKCkubmV3SW5zdGFuY2UoKSA6IGVudGl0eSk7CisgICAgICAgICAgICAgICAgICAgIC8vIOS7jm1hcOS4reW+l+WIsOWvueW6lOWIl+eahGZpZWxkLgorICAgICAgICAgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IChGaWVsZCkgZW50cnkuZ2V0VmFsdWUoKVswXTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWwgYXR0ciA9IChFeGNlbCkgZW50cnkuZ2V0VmFsdWUoKVsxXTsKKyAgICAgICAgICAgICAgICAgICAgLy8g5Y+W5b6X57G75Z6LLOW5tuagueaNruWvueixoeexu+Wei+iuvue9ruWAvC4KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZmllbGRUeXBlID0gZmllbGQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLmNsYXNzID09IGZpZWxkVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBDb252ZXJ0LnRvU3RyKHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGgocywgIi4wIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKHMsICIuMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRlRm9ybWF0ID0gZmllbGQuZ2V0QW5ub3RhdGlvbihFeGNlbC5jbGFzcykuZGF0ZUZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGRhdGVGb3JtYXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyc2VEYXRlVG9TdHIoZGF0ZUZvcm1hdCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gQ29udmVydC50b1N0cih2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoSW50ZWdlci5UWVBFID09IGZpZWxkVHlwZSB8fCBJbnRlZ2VyLmNsYXNzID09IGZpZWxkVHlwZSkgJiYgU3RyaW5nVXRpbHMuaXNOdW1lcmljKENvbnZlcnQudG9TdHIodmFsKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IENvbnZlcnQudG9JbnQodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoTG9uZy5UWVBFID09IGZpZWxkVHlwZSB8fCBMb25nLmNsYXNzID09IGZpZWxkVHlwZSkgJiYgU3RyaW5nVXRpbHMuaXNOdW1lcmljKENvbnZlcnQudG9TdHIodmFsKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IENvbnZlcnQudG9Mb25nKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRG91YmxlLlRZUEUgPT0gZmllbGRUeXBlIHx8IERvdWJsZS5jbGFzcyA9PSBmaWVsZFR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IENvbnZlcnQudG9Eb3VibGUodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChGbG9hdC5UWVBFID09IGZpZWxkVHlwZSB8fCBGbG9hdC5jbGFzcyA9PSBmaWVsZFR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IENvbnZlcnQudG9GbG9hdCh2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJpZ0RlY2ltYWwuY2xhc3MgPT0gZmllbGRUeXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBDb252ZXJ0LnRvQmlnRGVjaW1hbCh2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKERhdGUuY2xhc3MgPT0gZmllbGRUeXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IERhdGVVdGlscy5wYXJzZURhdGUodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIERvdWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBEYXRlVXRpbC5nZXRKYXZhRGF0ZSgoRG91YmxlKSB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJvb2xlYW4uVFlQRSA9PSBmaWVsZFR5cGUgfHwgQm9vbGVhbi5jbGFzcyA9PSBmaWVsZFR5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IENvbnZlcnQudG9Cb29sKHZhbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwoZmllbGRUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGF0dHIudGFyZ2V0QXR0cigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBmaWVsZC5nZXROYW1lKCkgKyAiLiIgKyBhdHRyLnRhcmdldEF0dHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGF0dHIucmVhZENvbnZlcnRlckV4cCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSByZXZlcnNlQnlFeHAoQ29udmVydC50b1N0cih2YWwpLCBhdHRyLnJlYWRDb252ZXJ0ZXJFeHAoKSwgYXR0ci5zZXBhcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGF0dHIuZGljdFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzeXNEaWN0TWFwLmNvbnRhaW5zS2V5KGF0dHIuZGljdFR5cGUoKSArIHZhbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGljdFZhbHVlID0gcmV2ZXJzZURpY3RCeUV4cChDb252ZXJ0LnRvU3RyKHZhbCksIGF0dHIuZGljdFR5cGUoKSwgYXR0ci5zZXBhcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c0RpY3RNYXAucHV0KGF0dHIuZGljdFR5cGUoKSArIHZhbCwgZGljdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc3lzRGljdE1hcC5nZXQoYXR0ci5kaWN0VHlwZSgpICsgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhdHRyLmhhbmRsZXIoKS5lcXVhbHMoRXhjZWxIYW5kbGVyQWRhcHRlci5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZGF0YUZvcm1hdEhhbmRsZXJBZGFwdGVyKHZhbCwgYXR0ciwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChDb2x1bW5UeXBlLklNQUdFID09IGF0dHIuY2VsbFR5cGUoKSAmJiBTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBpY3R1cmVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWN0dXJlRGF0YSBpbWFnZSA9IHBpY3R1cmVzLmdldChyb3cuZ2V0Um93TnVtKCkgKyAiXyIgKyBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBpbWFnZS5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZpbGVVdGlscy53cml0ZUltcG9ydEJ5dGVzKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3RVdGlscy5pbnZva2VTZXR0ZXIoZW50aXR5LCBwcm9wZXJ0eU5hbWUsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoZW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lsaXN05pWw5o2u5rqQ5bCG5YW26YeM6Z2i55qE5pWw5o2u5a+85YWl5YiwZXhjZWzooajljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdCDlr7zlh7rmlbDmja7pm4blkIgKKyAgICAgKiBAcGFyYW0gc2hlZXROYW1lIOW3peS9nOihqOeahOWQjeensAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIEFqYXhSZXN1bHQgZXhwb3J0RXhjZWwoTGlzdDxUPiBsaXN0LCBTdHJpbmcgc2hlZXROYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4cG9ydEV4Y2VsKGxpc3QsIHNoZWV0TmFtZSwgU3RyaW5nVXRpbHMuRU1QVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvuWxpc3TmlbDmja7mupDlsIblhbbph4zpnaLnmoTmlbDmja7lr7zlhaXliLBleGNlbOihqOWNlQorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXN0IOWvvOWHuuaVsOaNrumbhuWQiAorICAgICAqIEBwYXJhbSBzaGVldE5hbWUg5bel5L2c6KGo55qE5ZCN56ewCisgICAgICogQHBhcmFtIHRpdGxlIOagh+mimAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIEFqYXhSZXN1bHQgZXhwb3J0RXhjZWwoTGlzdDxUPiBsaXN0LCBTdHJpbmcgc2hlZXROYW1lLCBTdHJpbmcgdGl0bGUpCisgICAgeworICAgICAgICB0aGlzLmluaXQobGlzdCwgc2hlZXROYW1lLCB0aXRsZSwgVHlwZS5FWFBPUlQpOworICAgICAgICByZXR1cm4gZXhwb3J0RXhjZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lsaXN05pWw5o2u5rqQ5bCG5YW26YeM6Z2i55qE5pWw5o2u5a+85YWl5YiwZXhjZWzooajljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2Ug6L+U5Zue5pWw5o2uCisgICAgICogQHBhcmFtIGxpc3Qg5a+85Ye65pWw5o2u6ZuG5ZCICisgICAgICogQHBhcmFtIHNoZWV0TmFtZSDlt6XkvZzooajnmoTlkI3np7AKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cG9ydEV4Y2VsKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIExpc3Q8VD4gbGlzdCwgU3RyaW5nIHNoZWV0TmFtZSkKKyAgICB7CisgICAgICAgIGV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCBzaGVldE5hbWUsIFN0cmluZ1V0aWxzLkVNUFRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lsaXN05pWw5o2u5rqQ5bCG5YW26YeM6Z2i55qE5pWw5o2u5a+85YWl5YiwZXhjZWzooajljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2Ug6L+U5Zue5pWw5o2uCisgICAgICogQHBhcmFtIGxpc3Qg5a+85Ye65pWw5o2u6ZuG5ZCICisgICAgICogQHBhcmFtIHNoZWV0TmFtZSDlt6XkvZzooajnmoTlkI3np7AKKyAgICAgKiBAcGFyYW0gdGl0bGUg5qCH6aKYCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBvcnRFeGNlbChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBMaXN0PFQ+IGxpc3QsIFN0cmluZyBzaGVldE5hbWUsIFN0cmluZyB0aXRsZSkKKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCIpOworICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZygidXRmLTgiKTsKKyAgICAgICAgdGhpcy5pbml0KGxpc3QsIHNoZWV0TmFtZSwgdGl0bGUsIFR5cGUuRVhQT1JUKTsKKyAgICAgICAgZXhwb3J0RXhjZWwocmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvuWxpc3TmlbDmja7mupDlsIblhbbph4zpnaLnmoTmlbDmja7lr7zlhaXliLBleGNlbOihqOWNlQorICAgICAqIAorICAgICAqIEBwYXJhbSBzaGVldE5hbWUg5bel5L2c6KGo55qE5ZCN56ewCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgQWpheFJlc3VsdCBpbXBvcnRUZW1wbGF0ZUV4Y2VsKFN0cmluZyBzaGVldE5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gaW1wb3J0VGVtcGxhdGVFeGNlbChzaGVldE5hbWUsIFN0cmluZ1V0aWxzLkVNUFRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lsaXN05pWw5o2u5rqQ5bCG5YW26YeM6Z2i55qE5pWw5o2u5a+85YWl5YiwZXhjZWzooajljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hlZXROYW1lIOW3peS9nOihqOeahOWQjeensAorICAgICAqIEBwYXJhbSB0aXRsZSDmoIfpopgKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBBamF4UmVzdWx0IGltcG9ydFRlbXBsYXRlRXhjZWwoU3RyaW5nIHNoZWV0TmFtZSwgU3RyaW5nIHRpdGxlKQorICAgIHsKKyAgICAgICAgdGhpcy5pbml0KG51bGwsIHNoZWV0TmFtZSwgdGl0bGUsIFR5cGUuSU1QT1JUKTsKKyAgICAgICAgcmV0dXJuIGV4cG9ydEV4Y2VsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+5bGlzdOaVsOaNrua6kOWwhuWFtumHjOmdoueahOaVsOaNruWvvOWFpeWIsGV4Y2Vs6KGo5Y2VCisgICAgICogCisgICAgICogQHBhcmFtIHNoZWV0TmFtZSDlt6XkvZzooajnmoTlkI3np7AKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGltcG9ydFRlbXBsYXRlRXhjZWwoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIHNoZWV0TmFtZSkKKyAgICB7CisgICAgICAgIGltcG9ydFRlbXBsYXRlRXhjZWwocmVzcG9uc2UsIHNoZWV0TmFtZSwgU3RyaW5nVXRpbHMuRU1QVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvuWxpc3TmlbDmja7mupDlsIblhbbph4zpnaLnmoTmlbDmja7lr7zlhaXliLBleGNlbOihqOWNlQorICAgICAqIAorICAgICAqIEBwYXJhbSBzaGVldE5hbWUg5bel5L2c6KGo55qE5ZCN56ewCisgICAgICogQHBhcmFtIHRpdGxlIOagh+mimAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW1wb3J0VGVtcGxhdGVFeGNlbChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgc2hlZXROYW1lLCBTdHJpbmcgdGl0bGUpCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoInV0Zi04Iik7CisgICAgICAgIHRoaXMuaW5pdChudWxsLCBzaGVldE5hbWUsIHRpdGxlLCBUeXBlLklNUE9SVCk7CisgICAgICAgIGV4cG9ydEV4Y2VsKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7lsaXN05pWw5o2u5rqQ5bCG5YW26YeM6Z2i55qE5pWw5o2u5a+85YWl5YiwZXhjZWzooajljZUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cG9ydEV4Y2VsKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaGVldCgpOworICAgICAgICAgICAgd2Iud3JpdGUocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLlr7zlh7pFeGNlbOW8guW4uHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkod2IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+5bGlzdOaVsOaNrua6kOWwhuWFtumHjOmdoueahOaVsOaNruWvvOWFpeWIsGV4Y2Vs6KGo5Y2VCisgICAgICogCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgQWpheFJlc3VsdCBleHBvcnRFeGNlbCgpCisgICAgeworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlU2hlZXQoKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGVuY29kaW5nRmlsZW5hbWUoc2hlZXROYW1lKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGdldEFic29sdXRlRmlsZShmaWxlbmFtZSkpOworICAgICAgICAgICAgd2Iud3JpdGUob3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBamF4UmVzdWx0LnN1Y2Nlc3MoZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLlr7zlh7pFeGNlbOW8guW4uHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFV0aWxFeGNlcHRpb24oIuWvvOWHukV4Y2Vs5aSx6LSl77yM6K+36IGU57O7572R56uZ566h55CG5ZGY77yBIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseSh3Yik7CisgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu65YaZ5YWl5pWw5o2u5YiwU2hlZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVNoZWV0KCkKKyAgICB7CisgICAgICAgIC8vIOWPluWHuuS4gOWFseacieWkmuWwkeS4qnNoZWV0LgorICAgICAgICBpbnQgc2hlZXRObyA9IE1hdGgubWF4KDEsIChpbnQpIE1hdGguY2VpbChsaXN0LnNpemUoKSAqIDEuMCAvIHNoZWV0U2l6ZSkpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2hlZXRObzsgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3JlYXRlU2hlZXQoc2hlZXRObywgaW5kZXgpOworCisgICAgICAgICAgICAvLyDkuqfnlJ/kuIDooYwKKyAgICAgICAgICAgIFJvdyByb3cgPSBzaGVldC5jcmVhdGVSb3cocm93bnVtKTsKKyAgICAgICAgICAgIGludCBjb2x1bW4gPSAwOworICAgICAgICAgICAgLy8g5YaZ5YWl5ZCE5Liq5a2X5q6155qE5YiX5aS05ZCN56ewCisgICAgICAgICAgICBmb3IgKE9iamVjdFtdIG9zIDogZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKSBvc1swXTsKKyAgICAgICAgICAgICAgICBFeGNlbCBleGNlbCA9IChFeGNlbCkgb3NbMV07CisgICAgICAgICAgICAgICAgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmaWVsZC5nZXRUeXBlKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChGaWVsZCBzdWJGaWVsZCA6IHN1YkZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWwgc3ViRXhjZWwgPSBzdWJGaWVsZC5nZXRBbm5vdGF0aW9uKEV4Y2VsLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSGVhZENlbGwoc3ViRXhjZWwsIHJvdywgY29sdW1uKyspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSGVhZENlbGwoZXhjZWwsIHJvdywgY29sdW1uKyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUeXBlLkVYUE9SVC5lcXVhbHModHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsbEV4Y2VsRGF0YShpbmRleCwgcm93KTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0aXN0aWNzUm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDloavlhYVleGNlbOaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleCDluo/lj7cKKyAgICAgKiBAcGFyYW0gcm93IOWNleWFg+agvOihjAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGZpbGxFeGNlbERhdGEoaW50IGluZGV4LCBSb3cgcm93KQorICAgIHsKKyAgICAgICAgaW50IHN0YXJ0Tm8gPSBpbmRleCAqIHNoZWV0U2l6ZTsKKyAgICAgICAgaW50IGVuZE5vID0gTWF0aC5taW4oc3RhcnRObyArIHNoZWV0U2l6ZSwgbGlzdC5zaXplKCkpOworICAgICAgICBpbnQgcm93Tm8gPSAoMSArIHJvd251bSkgLSBzdGFydE5vOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnRObzsgaSA8IGVuZE5vOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvd05vID0gaXNTdWJMaXN0KCkgPyAoaSA+IDEgPyByb3dObyArIDEgOiByb3dObyArIGkpIDogaSArIDEgKyByb3dudW0gLSBzdGFydE5vOworICAgICAgICAgICAgcm93ID0gc2hlZXQuY3JlYXRlUm93KHJvd05vKTsKKyAgICAgICAgICAgIC8vIOW+l+WIsOWvvOWHuuWvueixoS4KKyAgICAgICAgICAgIFQgdm8gPSAoVCkgbGlzdC5nZXQoaSk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPD8+IHN1Ykxpc3QgPSBudWxsOworICAgICAgICAgICAgaWYgKGlzU3ViTGlzdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1N1Ykxpc3RWYWx1ZSh2bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdWJMaXN0ID0gZ2V0TGlzdENlbGxWYWx1ZSh2byk7CisgICAgICAgICAgICAgICAgICAgIHN1Yk1lcmdlZExhc3RSb3dOdW0gPSBzdWJNZXJnZWRMYXN0Um93TnVtICsgc3ViTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1Yk1lcmdlZEZpcnN0Um93TnVtKys7CisgICAgICAgICAgICAgICAgICAgIHN1Yk1lcmdlZExhc3RSb3dOdW0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY29sdW1uID0gMDsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0W10gb3MgOiBmaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmllbGQgZmllbGQgPSAoRmllbGQpIG9zWzBdOworICAgICAgICAgICAgICAgIEV4Y2VsIGV4Y2VsID0gKEV4Y2VsKSBvc1sxXTsKKyAgICAgICAgICAgICAgICBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZpZWxkLmdldFR5cGUoKSkgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHN1Ykxpc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdWJGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBzdWJMaXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Tm8rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBzaGVldC5jcmVhdGVSb3cocm93Tm8pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGaWVsZD4gc3ViRmllbGRzID0gRmllbGRVdGlscy5nZXRGaWVsZHNMaXN0V2l0aEFubm90YXRpb24ob2JqLmdldENsYXNzKCksIEV4Y2VsLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZpZWxkIHN1YkZpZWxkIDogc3ViRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJGaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KEV4Y2VsLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsIGF0dHIgPSBzdWJGaWVsZC5nZXRBbm5vdGF0aW9uKEV4Y2VsLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDZWxsKGF0dHIsIHJvdywgKFQpIG9iaiwgc3ViRmllbGQsIGNvbHVtbiArIHN1YkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Yk1lcmdlZEZpcnN0Um93TnVtID0gdGhpcy5zdWJNZXJnZWRGaXJzdFJvd051bSArIHN1Ykxpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENlbGwoZXhjZWwsIHJvdywgdm8sIGZpZWxkLCBjb2x1bW4rKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu66KGo5qC85qC35byPCisgICAgICogCisgICAgICogQHBhcmFtIHdiIOW3peS9nOiWhOWvueixoQorICAgICAqIEByZXR1cm4g5qC35byP5YiX6KGoCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDZWxsU3R5bGU+IGNyZWF0ZVN0eWxlcyhXb3JrYm9vayB3YikKKyAgICB7CisgICAgICAgIC8vIOWGmeWFpeWQhOadoeiusOW9lSzmr4/mnaHorrDlvZXlr7nlupRleGNlbOihqOS4reeahOS4gOihjAorICAgICAgICBNYXA8U3RyaW5nLCBDZWxsU3R5bGU+IHN0eWxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2VsbFN0eWxlPigpOworICAgICAgICBDZWxsU3R5bGUgc3R5bGUgPSB3Yi5jcmVhdGVDZWxsU3R5bGUoKTsKKyAgICAgICAgc3R5bGUuc2V0QWxpZ25tZW50KEhvcml6b250YWxBbGlnbm1lbnQuQ0VOVEVSKTsKKyAgICAgICAgc3R5bGUuc2V0VmVydGljYWxBbGlnbm1lbnQoVmVydGljYWxBbGlnbm1lbnQuQ0VOVEVSKTsKKyAgICAgICAgRm9udCB0aXRsZUZvbnQgPSB3Yi5jcmVhdGVGb250KCk7CisgICAgICAgIHRpdGxlRm9udC5zZXRGb250TmFtZSgiQXJpYWwiKTsKKyAgICAgICAgdGl0bGVGb250LnNldEZvbnRIZWlnaHRJblBvaW50cygoc2hvcnQpIDE2KTsKKyAgICAgICAgdGl0bGVGb250LnNldEJvbGQodHJ1ZSk7CisgICAgICAgIHN0eWxlLnNldEZvbnQodGl0bGVGb250KTsKKyAgICAgICAgRGF0YUZvcm1hdCBkYXRhRm9ybWF0ID0gd2IuY3JlYXRlRGF0YUZvcm1hdCgpOworICAgICAgICBzdHlsZS5zZXREYXRhRm9ybWF0KGRhdGFGb3JtYXQuZ2V0Rm9ybWF0KCJAIikpOworICAgICAgICBzdHlsZXMucHV0KCJ0aXRsZSIsIHN0eWxlKTsKKworICAgICAgICBzdHlsZSA9IHdiLmNyZWF0ZUNlbGxTdHlsZSgpOworICAgICAgICBzdHlsZS5zZXRBbGlnbm1lbnQoSG9yaXpvbnRhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICBzdHlsZS5zZXRWZXJ0aWNhbEFsaWdubWVudChWZXJ0aWNhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICBzdHlsZS5zZXRCb3JkZXJSaWdodChCb3JkZXJTdHlsZS5USElOKTsKKyAgICAgICAgc3R5bGUuc2V0UmlnaHRCb3JkZXJDb2xvcihJbmRleGVkQ29sb3JzLkdSRVlfNTBfUEVSQ0VOVC5nZXRJbmRleCgpKTsKKyAgICAgICAgc3R5bGUuc2V0Qm9yZGVyTGVmdChCb3JkZXJTdHlsZS5USElOKTsKKyAgICAgICAgc3R5bGUuc2V0TGVmdEJvcmRlckNvbG9yKEluZGV4ZWRDb2xvcnMuR1JFWV81MF9QRVJDRU5ULmdldEluZGV4KCkpOworICAgICAgICBzdHlsZS5zZXRCb3JkZXJUb3AoQm9yZGVyU3R5bGUuVEhJTik7CisgICAgICAgIHN0eWxlLnNldFRvcEJvcmRlckNvbG9yKEluZGV4ZWRDb2xvcnMuR1JFWV81MF9QRVJDRU5ULmdldEluZGV4KCkpOworICAgICAgICBzdHlsZS5zZXRCb3JkZXJCb3R0b20oQm9yZGVyU3R5bGUuVEhJTik7CisgICAgICAgIHN0eWxlLnNldEJvdHRvbUJvcmRlckNvbG9yKEluZGV4ZWRDb2xvcnMuR1JFWV81MF9QRVJDRU5ULmdldEluZGV4KCkpOworICAgICAgICBGb250IGRhdGFGb250ID0gd2IuY3JlYXRlRm9udCgpOworICAgICAgICBkYXRhRm9udC5zZXRGb250TmFtZSgiQXJpYWwiKTsKKyAgICAgICAgZGF0YUZvbnQuc2V0Rm9udEhlaWdodEluUG9pbnRzKChzaG9ydCkgMTApOworICAgICAgICBzdHlsZS5zZXRGb250KGRhdGFGb250KTsKKyAgICAgICAgc3R5bGVzLnB1dCgiZGF0YSIsIHN0eWxlKTsKKworICAgICAgICBzdHlsZSA9IHdiLmNyZWF0ZUNlbGxTdHlsZSgpOworICAgICAgICBzdHlsZS5zZXRBbGlnbm1lbnQoSG9yaXpvbnRhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICBzdHlsZS5zZXRWZXJ0aWNhbEFsaWdubWVudChWZXJ0aWNhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICBGb250IHRvdGFsRm9udCA9IHdiLmNyZWF0ZUZvbnQoKTsKKyAgICAgICAgdG90YWxGb250LnNldEZvbnROYW1lKCJBcmlhbCIpOworICAgICAgICB0b3RhbEZvbnQuc2V0Rm9udEhlaWdodEluUG9pbnRzKChzaG9ydCkgMTApOworICAgICAgICBzdHlsZS5zZXRGb250KHRvdGFsRm9udCk7CisgICAgICAgIHN0eWxlcy5wdXQoInRvdGFsIiwgc3R5bGUpOworCisgICAgICAgIHN0eWxlcy5wdXRBbGwoYW5ub3RhdGlvbkhlYWRlclN0eWxlcyh3Yiwgc3R5bGVzKSk7CisKKyAgICAgICAgc3R5bGVzLnB1dEFsbChhbm5vdGF0aW9uRGF0YVN0eWxlcyh3YikpOworCisgICAgICAgIHJldHVybiBzdHlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2uRXhjZWzms6jop6PliJvlu7rooajmoLzlpLTmoLflvI8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2Ig5bel5L2c6JaE5a+56LGhCisgICAgICogQHJldHVybiDoh6rlrprkuYnmoLflvI/liJfooagKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENlbGxTdHlsZT4gYW5ub3RhdGlvbkhlYWRlclN0eWxlcyhXb3JrYm9vayB3YiwgTWFwPFN0cmluZywgQ2VsbFN0eWxlPiBzdHlsZXMpCisgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBDZWxsU3R5bGU+IGhlYWRlclN0eWxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2VsbFN0eWxlPigpOworICAgICAgICBmb3IgKE9iamVjdFtdIG9zIDogZmllbGRzKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbCBleGNlbCA9IChFeGNlbCkgb3NbMV07CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nVXRpbHMuZm9ybWF0KCJoZWFkZXJfe31fe30iLCBleGNlbC5oZWFkZXJDb2xvcigpLCBleGNlbC5oZWFkZXJCYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgICAgICAgICBpZiAoIWhlYWRlclN0eWxlcy5jb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENlbGxTdHlsZSBzdHlsZSA9IHdiLmNyZWF0ZUNlbGxTdHlsZSgpOworICAgICAgICAgICAgICAgIHN0eWxlLmNsb25lU3R5bGVGcm9tKHN0eWxlcy5nZXQoImRhdGEiKSk7CisgICAgICAgICAgICAgICAgc3R5bGUuc2V0QWxpZ25tZW50KEhvcml6b250YWxBbGlnbm1lbnQuQ0VOVEVSKTsKKyAgICAgICAgICAgICAgICBzdHlsZS5zZXRWZXJ0aWNhbEFsaWdubWVudChWZXJ0aWNhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICAgICAgICAgIHN0eWxlLnNldEZpbGxGb3JlZ3JvdW5kQ29sb3IoZXhjZWwuaGVhZGVyQmFja2dyb3VuZENvbG9yKCkuaW5kZXgpOworICAgICAgICAgICAgICAgIHN0eWxlLnNldEZpbGxQYXR0ZXJuKEZpbGxQYXR0ZXJuVHlwZS5TT0xJRF9GT1JFR1JPVU5EKTsKKyAgICAgICAgICAgICAgICBGb250IGhlYWRlckZvbnQgPSB3Yi5jcmVhdGVGb250KCk7CisgICAgICAgICAgICAgICAgaGVhZGVyRm9udC5zZXRGb250TmFtZSgiQXJpYWwiKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJGb250LnNldEZvbnRIZWlnaHRJblBvaW50cygoc2hvcnQpIDEwKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJGb250LnNldEJvbGQodHJ1ZSk7CisgICAgICAgICAgICAgICAgaGVhZGVyRm9udC5zZXRDb2xvcihleGNlbC5oZWFkZXJDb2xvcigpLmluZGV4KTsKKyAgICAgICAgICAgICAgICBzdHlsZS5zZXRGb250KGhlYWRlckZvbnQpOworICAgICAgICAgICAgICAgIC8vIOiuvue9ruihqOagvOWktOWNleWFg+agvOaWh+acrOW9ouW8jworICAgICAgICAgICAgICAgIERhdGFGb3JtYXQgZGF0YUZvcm1hdCA9IHdiLmNyZWF0ZURhdGFGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBzdHlsZS5zZXREYXRhRm9ybWF0KGRhdGFGb3JtYXQuZ2V0Rm9ybWF0KCJAIikpOworICAgICAgICAgICAgICAgIGhlYWRlclN0eWxlcy5wdXQoa2V5LCBzdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlYWRlclN0eWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja5FeGNlbOazqOino+WIm+W7uuihqOagvOWIl+agt+W8jworICAgICAqIAorICAgICAqIEBwYXJhbSB3YiDlt6XkvZzoloTlr7nosaEKKyAgICAgKiBAcmV0dXJuIOiHquWumuS5ieagt+W8j+WIl+ihqAorICAgICAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ2VsbFN0eWxlPiBhbm5vdGF0aW9uRGF0YVN0eWxlcyhXb3JrYm9vayB3YikKKyAgICB7CisgICAgICAgIE1hcDxTdHJpbmcsIENlbGxTdHlsZT4gc3R5bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDZWxsU3R5bGU+KCk7CisgICAgICAgIGZvciAoT2JqZWN0W10gb3MgOiBmaWVsZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKSBvc1swXTsKKyAgICAgICAgICAgIEV4Y2VsIGV4Y2VsID0gKEV4Y2VsKSBvc1sxXTsKKyAgICAgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZmllbGQuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgZmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBzdWJDbGFzcyA9IChDbGFzczw/PikgcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICAgICAgICAgIExpc3Q8RmllbGQ+IHN1YkZpZWxkcyA9IEZpZWxkVXRpbHMuZ2V0RmllbGRzTGlzdFdpdGhBbm5vdGF0aW9uKHN1YkNsYXNzLCBFeGNlbC5jbGFzcyk7CisgICAgICAgICAgICAgICAgZm9yIChGaWVsZCBzdWJGaWVsZCA6IHN1YkZpZWxkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsIHN1YkV4Y2VsID0gc3ViRmllbGQuZ2V0QW5ub3RhdGlvbihFeGNlbC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EYXRhU3R5bGVzKHN0eWxlcywgc3ViRmllbGQsIHN1YkV4Y2VsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRhdGFTdHlsZXMoc3R5bGVzLCBmaWVsZCwgZXhjZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2uRXhjZWzms6jop6PliJvlu7rooajmoLzliJfmoLflvI8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3R5bGVzIOiHquWumuS5ieagt+W8j+WIl+ihqAorICAgICAqIEBwYXJhbSBmaWVsZCAg5bGe5oCn5YiX5L+h5oGvCisgICAgICogQHBhcmFtIGV4Y2VsICDms6jop6Pkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uRGF0YVN0eWxlcyhNYXA8U3RyaW5nLCBDZWxsU3R5bGU+IHN0eWxlcywgRmllbGQgZmllbGQsIEV4Y2VsIGV4Y2VsKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZ1V0aWxzLmZvcm1hdCgiZGF0YV97fV97fV97fV97fSIsIGV4Y2VsLmFsaWduKCksIGV4Y2VsLmNvbG9yKCksIGV4Y2VsLmJhY2tncm91bmRDb2xvcigpLCBleGNlbC5jZWxsVHlwZSgpKTsKKyAgICAgICAgaWYgKCFzdHlsZXMuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2VsbFN0eWxlIHN0eWxlID0gd2IuY3JlYXRlQ2VsbFN0eWxlKCk7CisgICAgICAgICAgICBzdHlsZS5zZXRBbGlnbm1lbnQoZXhjZWwuYWxpZ24oKSk7CisgICAgICAgICAgICBzdHlsZS5zZXRWZXJ0aWNhbEFsaWdubWVudChWZXJ0aWNhbEFsaWdubWVudC5DRU5URVIpOworICAgICAgICAgICAgc3R5bGUuc2V0Qm9yZGVyUmlnaHQoQm9yZGVyU3R5bGUuVEhJTik7CisgICAgICAgICAgICBzdHlsZS5zZXRSaWdodEJvcmRlckNvbG9yKEluZGV4ZWRDb2xvcnMuR1JFWV81MF9QRVJDRU5ULmdldEluZGV4KCkpOworICAgICAgICAgICAgc3R5bGUuc2V0Qm9yZGVyTGVmdChCb3JkZXJTdHlsZS5USElOKTsKKyAgICAgICAgICAgIHN0eWxlLnNldExlZnRCb3JkZXJDb2xvcihJbmRleGVkQ29sb3JzLkdSRVlfNTBfUEVSQ0VOVC5nZXRJbmRleCgpKTsKKyAgICAgICAgICAgIHN0eWxlLnNldEJvcmRlclRvcChCb3JkZXJTdHlsZS5USElOKTsKKyAgICAgICAgICAgIHN0eWxlLnNldFRvcEJvcmRlckNvbG9yKEluZGV4ZWRDb2xvcnMuR1JFWV81MF9QRVJDRU5ULmdldEluZGV4KCkpOworICAgICAgICAgICAgc3R5bGUuc2V0Qm9yZGVyQm90dG9tKEJvcmRlclN0eWxlLlRISU4pOworICAgICAgICAgICAgc3R5bGUuc2V0Qm90dG9tQm9yZGVyQ29sb3IoSW5kZXhlZENvbG9ycy5HUkVZXzUwX1BFUkNFTlQuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICBzdHlsZS5zZXRGaWxsUGF0dGVybihGaWxsUGF0dGVyblR5cGUuU09MSURfRk9SRUdST1VORCk7CisgICAgICAgICAgICBzdHlsZS5zZXRGaWxsRm9yZWdyb3VuZENvbG9yKGV4Y2VsLmJhY2tncm91bmRDb2xvcigpLmdldEluZGV4KCkpOworICAgICAgICAgICAgRm9udCBkYXRhRm9udCA9IHdiLmNyZWF0ZUZvbnQoKTsKKyAgICAgICAgICAgIGRhdGFGb250LnNldEZvbnROYW1lKCJBcmlhbCIpOworICAgICAgICAgICAgZGF0YUZvbnQuc2V0Rm9udEhlaWdodEluUG9pbnRzKChzaG9ydCkgMTApOworICAgICAgICAgICAgZGF0YUZvbnQuc2V0Q29sb3IoZXhjZWwuY29sb3IoKS5pbmRleCk7CisgICAgICAgICAgICBzdHlsZS5zZXRGb250KGRhdGFGb250KTsKKyAgICAgICAgICAgIGlmIChDb2x1bW5UeXBlLlRFWFQgPT0gZXhjZWwuY2VsbFR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEYXRhRm9ybWF0IGRhdGFGb3JtYXQgPSB3Yi5jcmVhdGVEYXRhRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgc3R5bGUuc2V0RGF0YUZvcm1hdChkYXRhRm9ybWF0LmdldEZvcm1hdCgiQCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0eWxlcy5wdXQoa2V5LCBzdHlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliJvlu7rljZXlhYPmoLwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VsbCBjcmVhdGVIZWFkQ2VsbChFeGNlbCBhdHRyLCBSb3cgcm93LCBpbnQgY29sdW1uKQorICAgIHsKKyAgICAgICAgLy8g5Yib5bu65YiXCisgICAgICAgIENlbGwgY2VsbCA9IHJvdy5jcmVhdGVDZWxsKGNvbHVtbik7CisgICAgICAgIC8vIOWGmeWFpeWIl+S/oeaBrworICAgICAgICBjZWxsLnNldENlbGxWYWx1ZShhdHRyLm5hbWUoKSk7CisgICAgICAgIHNldERhdGFWYWxpZGF0aW9uKGF0dHIsIHJvdywgY29sdW1uKTsKKyAgICAgICAgY2VsbC5zZXRDZWxsU3R5bGUoc3R5bGVzLmdldChTdHJpbmdVdGlscy5mb3JtYXQoImhlYWRlcl97fV97fSIsIGF0dHIuaGVhZGVyQ29sb3IoKSwgYXR0ci5oZWFkZXJCYWNrZ3JvdW5kQ29sb3IoKSkpKTsKKyAgICAgICAgaWYgKGlzU3ViTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDloavlhYXpu5jorqTmoLflvI/vvIzpmLLmraLlkIjlubbljZXlhYPmoLzmoLflvI/lpLHmlYgKKyAgICAgICAgICAgIHNoZWV0LnNldERlZmF1bHRDb2x1bW5TdHlsZShjb2x1bW4sIHN0eWxlcy5nZXQoU3RyaW5nVXRpbHMuZm9ybWF0KCJkYXRhX3t9X3t9X3t9X3t9IiwgYXR0ci5hbGlnbigpLCBhdHRyLmNvbG9yKCksIGF0dHIuYmFja2dyb3VuZENvbG9yKCksIGF0dHIuY2VsbFR5cGUoKSkpKTsKKyAgICAgICAgICAgIGlmIChhdHRyLm5lZWRNZXJnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoZWV0LmFkZE1lcmdlZFJlZ2lvbihuZXcgQ2VsbFJhbmdlQWRkcmVzcyhyb3dudW0gLSAxLCByb3dudW0sIGNvbHVtbiwgY29sdW1uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNlbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u5Y2V5YWD5qC85L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIOWNleWFg+agvOWAvAorICAgICAqIEBwYXJhbSBhdHRyIOazqOino+ebuOWFsworICAgICAqIEBwYXJhbSBjZWxsIOWNleWFg+agvOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENlbGxWbyhPYmplY3QgdmFsdWUsIEV4Y2VsIGF0dHIsIENlbGwgY2VsbCkKKyAgICB7CisgICAgICAgIGlmIChDb2x1bW5UeXBlLlNUUklORyA9PSBhdHRyLmNlbGxUeXBlKCkgfHwgQ29sdW1uVHlwZS5URVhUID09IGF0dHIuY2VsbFR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGNlbGxWYWx1ZSA9IENvbnZlcnQudG9TdHIodmFsdWUpOworICAgICAgICAgICAgLy8g5a+55LqO5Lu75L2V5Lul6KGo6L6+5byP6Kem5Y+R5a2X56ymID0tK0DlvIDlpLTnmoTljZXlhYPmoLzvvIznm7TmjqXkvb/nlKh0YWLlrZfnrKbkvZzkuLrliY3nvIDvvIzpmLLmraJDU1bms6jlhaXjgIIKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5zdGFydHNXaXRoQW55KGNlbGxWYWx1ZSwgRk9STVVMQV9TVFIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlbGxWYWx1ZSA9IFJlZ0V4VXRpbHMucmVwbGFjZUZpcnN0KGNlbGxWYWx1ZSwgRk9STVVMQV9SRUdFWF9TVFIsICJcdCQwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmIFN0cmluZ1V0aWxzLmVxdWFscygiW10iLCBjZWxsVmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlbGxWYWx1ZSA9IFN0cmluZ1V0aWxzLkVNUFRZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUoU3RyaW5nVXRpbHMuaXNOdWxsKGNlbGxWYWx1ZSkgPyBhdHRyLmRlZmF1bHRWYWx1ZSgpIDogY2VsbFZhbHVlICsgYXR0ci5zdWZmaXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ29sdW1uVHlwZS5OVU1FUklDID09IGF0dHIuY2VsbFR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbCh2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUoU3RyaW5nVXRpbHMuY29udGFpbnMoQ29udmVydC50b1N0cih2YWx1ZSksICIuIikgPyBDb252ZXJ0LnRvRG91YmxlKHZhbHVlKSA6IENvbnZlcnQudG9JbnQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChDb2x1bW5UeXBlLklNQUdFID09IGF0dHIuY2VsbFR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xpZW50QW5jaG9yIGFuY2hvciA9IG5ldyBYU1NGQ2xpZW50QW5jaG9yKDAsIDAsIDAsIDAsIChzaG9ydCkgY2VsbC5nZXRDb2x1bW5JbmRleCgpLCBjZWxsLmdldFJvdygpLmdldFJvd051bSgpLCAoc2hvcnQpIChjZWxsLmdldENvbHVtbkluZGV4KCkgKyAxKSwgY2VsbC5nZXRSb3coKS5nZXRSb3dOdW0oKSArIDEpOworICAgICAgICAgICAgU3RyaW5nIGltYWdlUGF0aCA9IENvbnZlcnQudG9TdHIodmFsdWUpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoaW1hZ2VQYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IEltYWdlVXRpbHMuZ2V0SW1hZ2UoaW1hZ2VQYXRoKTsKKyAgICAgICAgICAgICAgICBnZXREcmF3aW5nUGF0cmlhcmNoKGNlbGwuZ2V0U2hlZXQoKSkuY3JlYXRlUGljdHVyZShhbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmdldFNoZWV0KCkuZ2V0V29ya2Jvb2soKS5hZGRQaWN0dXJlKGRhdGEsIGdldEltYWdlVHlwZShkYXRhKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W55S75biDCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEcmF3aW5nPD8+IGdldERyYXdpbmdQYXRyaWFyY2goU2hlZXQgc2hlZXQpCisgICAgeworICAgICAgICBpZiAoc2hlZXQuZ2V0RHJhd2luZ1BhdHJpYXJjaCgpID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoZWV0LmNyZWF0ZURyYXdpbmdQYXRyaWFyY2goKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hlZXQuZ2V0RHJhd2luZ1BhdHJpYXJjaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWbvueJh+exu+Weiyzorr7nva7lm77niYfmj5LlhaXnsbvlnosKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEltYWdlVHlwZShieXRlW10gdmFsdWUpCisgICAgeworICAgICAgICBTdHJpbmcgdHlwZSA9IEZpbGVUeXBlVXRpbHMuZ2V0RmlsZUV4dGVuZE5hbWUodmFsdWUpOworICAgICAgICBpZiAoIkpQRyIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdvcmtib29rLlBJQ1RVUkVfVFlQRV9KUEVHOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCJQTkciLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXb3JrYm9vay5QSUNUVVJFX1RZUEVfUE5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBXb3JrYm9vay5QSUNUVVJFX1RZUEVfSlBFRzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliJvlu7rooajmoLzmoLflvI8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhVmFsaWRhdGlvbihFeGNlbCBhdHRyLCBSb3cgcm93LCBpbnQgY29sdW1uKQorICAgIHsKKyAgICAgICAgaWYgKGF0dHIubmFtZSgpLmluZGV4T2YoIuazqO+8miIpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoZWV0LnNldENvbHVtbldpZHRoKGNvbHVtbiwgNjAwMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyDorr7nva7liJflrr0KKyAgICAgICAgICAgIHNoZWV0LnNldENvbHVtbldpZHRoKGNvbHVtbiwgKGludCkgKChhdHRyLndpZHRoKCkgKyAwLjcyKSAqIDI1NikpOworICAgICAgICB9CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGF0dHIucHJvbXB0KCkpIHx8IGF0dHIuY29tYm8oKS5sZW5ndGggPiAwIHx8IGF0dHIuY29tYm9SZWFkRGljdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdbXSBjb21ib0FycmF5ID0gYXR0ci5jb21ibygpOworICAgICAgICAgICAgaWYgKGF0dHIuY29tYm9SZWFkRGljdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3lzRGljdE1hcC5jb250YWluc0tleSgiY29tYm9fIiArIGF0dHIuZGljdFR5cGUoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxzID0gRGljdFV0aWxzLmdldERpY3RMYWJlbHMoYXR0ci5kaWN0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3lzRGljdE1hcC5wdXQoImNvbWJvXyIgKyBhdHRyLmRpY3RUeXBlKCksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBzeXNEaWN0TWFwLmdldCgiY29tYm9fIiArIGF0dHIuZGljdFR5cGUoKSk7CisgICAgICAgICAgICAgICAgY29tYm9BcnJheSA9IFN0cmluZ1V0aWxzLnNwbGl0KHZhbCwgRGljdFV0aWxzLlNFUEFSQVRPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tYm9BcnJheS5sZW5ndGggPiAxNSB8fCBTdHJpbmdVdGlscy5qb2luKGNvbWJvQXJyYXkpLmxlbmd0aCgpID4gMjU1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOWmguaenOS4i+aLieaVsOWkp+S6jjE15oiW5a2X56ym5Liy6ZW/5bqm5aSn5LqOMjU177yM5YiZ5L2/55So5LiA5Liq5pawc2hlZXTlrZjlgqjvvIzpgb/lhY3nlJ/miJDnmoTmqKHmnb/kuIvmi4nlgLzojrflj5bkuI3liLAKKyAgICAgICAgICAgICAgICBzZXRYU1NGVmFsaWRhdGlvbldpdGhIaWRkZW4oc2hlZXQsIGNvbWJvQXJyYXksIGF0dHIucHJvbXB0KCksIDEsIDEwMCwgY29sdW1uLCBjb2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOaPkOekuuS/oeaBr+aIluWPquiDvemAieaLqeS4jeiDvei+k+WFpeeahOWIl+WGheWuuS4KKyAgICAgICAgICAgICAgICBzZXRQcm9tcHRPclZhbGlkYXRpb24oc2hlZXQsIGNvbWJvQXJyYXksIGF0dHIucHJvbXB0KCksIDEsIDEwMCwgY29sdW1uLCBjb2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5re75Yqg5Y2V5YWD5qC8CisgICAgICovCisgICAgcHVibGljIENlbGwgYWRkQ2VsbChFeGNlbCBhdHRyLCBSb3cgcm93LCBUIHZvLCBGaWVsZCBmaWVsZCwgaW50IGNvbHVtbikKKyAgICB7CisgICAgICAgIENlbGwgY2VsbCA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyDorr7nva7ooYzpq5gKKyAgICAgICAgICAgIHJvdy5zZXRIZWlnaHQobWF4SGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIOagueaNrkV4Y2Vs5Lit6K6+572u5oOF5Ya15Yaz5a6a5piv5ZCm5a+85Ye6LOacieS6m+aDheWGtemcgOimgeS/neaMgeS4uuepuizluIzmnJvnlKjmiLfloavlhpnov5nkuIDliJcuCisgICAgICAgICAgICBpZiAoYXR0ci5pc0V4cG9ydCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOWIm+W7umNlbGwKKyAgICAgICAgICAgICAgICBjZWxsID0gcm93LmNyZWF0ZUNlbGwoY29sdW1uKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNTdWJMaXN0VmFsdWUodm8pICYmIGdldExpc3RDZWxsVmFsdWUodm8pLnNpemUoKSA+IDEgJiYgYXR0ci5uZWVkTWVyZ2UoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENlbGxSYW5nZUFkZHJlc3MgY2VsbEFkZHJlc3MgPSBuZXcgQ2VsbFJhbmdlQWRkcmVzcyhzdWJNZXJnZWRGaXJzdFJvd051bSwgc3ViTWVyZ2VkTGFzdFJvd051bSwgY29sdW1uLCBjb2x1bW4pOworICAgICAgICAgICAgICAgICAgICBzaGVldC5hZGRNZXJnZWRSZWdpb24oY2VsbEFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjZWxsLnNldENlbGxTdHlsZShzdHlsZXMuZ2V0KFN0cmluZ1V0aWxzLmZvcm1hdCgiZGF0YV97fV97fV97fV97fSIsIGF0dHIuYWxpZ24oKSwgYXR0ci5jb2xvcigpLCBhdHRyLmJhY2tncm91bmRDb2xvcigpLCBhdHRyLmNlbGxUeXBlKCkpKSk7CisKKyAgICAgICAgICAgICAgICAvLyDnlKjkuo7or7vlj5blr7nosaHkuK3nmoTlsZ7mgKcKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRUYXJnZXRWYWx1ZSh2bywgZmllbGQsIGF0dHIpOworICAgICAgICAgICAgICAgIFN0cmluZyBkYXRlRm9ybWF0ID0gYXR0ci5kYXRlRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYWRDb252ZXJ0ZXJFeHAgPSBhdHRyLnJlYWRDb252ZXJ0ZXJFeHAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gYXR0ci5zZXBhcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGljdFR5cGUgPSBhdHRyLmRpY3RUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZGF0ZUZvcm1hdCkgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKHBhcnNlRGF0ZVRvU3RyKGRhdGVGb3JtYXQsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkocmVhZENvbnZlcnRlckV4cCkgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKGNvbnZlcnRCeUV4cChDb252ZXJ0LnRvU3RyKHZhbHVlKSwgcmVhZENvbnZlcnRlckV4cCwgc2VwYXJhdG9yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZGljdFR5cGUpICYmIFN0cmluZ1V0aWxzLmlzTm90TnVsbCh2YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN5c0RpY3RNYXAuY29udGFpbnNLZXkoZGljdFR5cGUgKyB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJsZSA9IGNvbnZlcnREaWN0QnlFeHAoQ29udmVydC50b1N0cih2YWx1ZSksIGRpY3RUeXBlLCBzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgc3lzRGljdE1hcC5wdXQoZGljdFR5cGUgKyB2YWx1ZSwgbGFibGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKHN5c0RpY3RNYXAuZ2V0KGRpY3RUeXBlICsgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsICYmIC0xICE9IGF0dHIuc2NhbGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKCgoKEJpZ0RlY2ltYWwpIHZhbHVlKS5zZXRTY2FsZShhdHRyLnNjYWxlKCksIGF0dHIucm91bmRpbmdNb2RlKCkpKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWF0dHIuaGFuZGxlcigpLmVxdWFscyhFeGNlbEhhbmRsZXJBZGFwdGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKGRhdGFGb3JtYXRIYW5kbGVyQWRhcHRlcih2YWx1ZSwgYXR0ciwgY2VsbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyDorr7nva7liJfnsbvlnosKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2VsbFZvKHZhbHVlLCBhdHRyLCBjZWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkU3RhdGlzdGljc0RhdGEoY29sdW1uLCBDb252ZXJ0LnRvU3RyKHZhbHVlKSwgYXR0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuWvvOWHukV4Y2Vs5aSx6LSle30iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2VsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva4gUE9JIFhTU0ZTaGVldCDljZXlhYPmoLzmj5DnpLrmiJbpgInmi6nmoYYKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hlZXQg6KGo5Y2VCisgICAgICogQHBhcmFtIHRleHRsaXN0IOS4i+aLieahhuaYvuekuueahOWGheWuuQorICAgICAqIEBwYXJhbSBwcm9tcHRDb250ZW50IOaPkOekuuWGheWuuQorICAgICAqIEBwYXJhbSBmaXJzdFJvdyDlvIDlp4vooYwKKyAgICAgKiBAcGFyYW0gZW5kUm93IOe7k+adn+ihjAorICAgICAqIEBwYXJhbSBmaXJzdENvbCDlvIDlp4vliJcKKyAgICAgKiBAcGFyYW0gZW5kQ29sIOe7k+adn+WIlworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdE9yVmFsaWRhdGlvbihTaGVldCBzaGVldCwgU3RyaW5nW10gdGV4dGxpc3QsIFN0cmluZyBwcm9tcHRDb250ZW50LCBpbnQgZmlyc3RSb3csIGludCBlbmRSb3csCisgICAgICAgICAgICBpbnQgZmlyc3RDb2wsIGludCBlbmRDb2wpCisgICAgeworICAgICAgICBEYXRhVmFsaWRhdGlvbkhlbHBlciBoZWxwZXIgPSBzaGVldC5nZXREYXRhVmFsaWRhdGlvbkhlbHBlcigpOworICAgICAgICBEYXRhVmFsaWRhdGlvbkNvbnN0cmFpbnQgY29uc3RyYWludCA9IHRleHRsaXN0Lmxlbmd0aCA+IDAgPyBoZWxwZXIuY3JlYXRlRXhwbGljaXRMaXN0Q29uc3RyYWludCh0ZXh0bGlzdCkgOiBoZWxwZXIuY3JlYXRlQ3VzdG9tQ29uc3RyYWludCgiREQxIik7CisgICAgICAgIENlbGxSYW5nZUFkZHJlc3NMaXN0IHJlZ2lvbnMgPSBuZXcgQ2VsbFJhbmdlQWRkcmVzc0xpc3QoZmlyc3RSb3csIGVuZFJvdywgZmlyc3RDb2wsIGVuZENvbCk7CisgICAgICAgIERhdGFWYWxpZGF0aW9uIGRhdGFWYWxpZGF0aW9uID0gaGVscGVyLmNyZWF0ZVZhbGlkYXRpb24oY29uc3RyYWludCwgcmVnaW9ucyk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHByb21wdENvbnRlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDlpoLmnpzorr7nva7kuobmj5DnpLrkv6Hmga/liJnpvKDmoIfmlL7kuIrljrvmj5DnpLoKKyAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uLmNyZWF0ZVByb21wdEJveCgiIiwgcHJvbXB0Q29udGVudCk7CisgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbi5zZXRTaG93UHJvbXB0Qm94KHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vIOWkhOeQhkV4Y2Vs5YW85a655oCn6Zeu6aKYCisgICAgICAgIGlmIChkYXRhVmFsaWRhdGlvbiBpbnN0YW5jZW9mIFhTU0ZEYXRhVmFsaWRhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24uc2V0U3VwcHJlc3NEcm9wRG93bkFycm93KHRydWUpOworICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24uc2V0U2hvd0Vycm9yQm94KHRydWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24uc2V0U3VwcHJlc3NEcm9wRG93bkFycm93KGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBzaGVldC5hZGRWYWxpZGF0aW9uRGF0YShkYXRhVmFsaWRhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u5p+Q5Lqb5YiX55qE5YC85Y+q6IO96L6T5YWl6aKE5Yi255qE5pWw5o2uLOaYvuekuuS4i+aLieahhu+8iOWFvOWuuei2heWHuuS4gOWumuaVsOmHj+eahOS4i+aLieahhu+8iS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hlZXQg6KaB6K6+572u55qEc2hlZXQuCisgICAgICogQHBhcmFtIHRleHRsaXN0IOS4i+aLieahhuaYvuekuueahOWGheWuuQorICAgICAqIEBwYXJhbSBwcm9tcHRDb250ZW50IOaPkOekuuWGheWuuQorICAgICAqIEBwYXJhbSBmaXJzdFJvdyDlvIDlp4vooYwKKyAgICAgKiBAcGFyYW0gZW5kUm93IOe7k+adn+ihjAorICAgICAqIEBwYXJhbSBmaXJzdENvbCDlvIDlp4vliJcKKyAgICAgKiBAcGFyYW0gZW5kQ29sIOe7k+adn+WIlworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhTU0ZWYWxpZGF0aW9uV2l0aEhpZGRlbihTaGVldCBzaGVldCwgU3RyaW5nW10gdGV4dGxpc3QsIFN0cmluZyBwcm9tcHRDb250ZW50LCBpbnQgZmlyc3RSb3csIGludCBlbmRSb3csIGludCBmaXJzdENvbCwgaW50IGVuZENvbCkKKyAgICB7CisgICAgICAgIFN0cmluZyBoaWRlU2hlZXROYW1lID0gImNvbWJvXyIgKyBmaXJzdENvbCArICJfIiArIGVuZENvbDsKKyAgICAgICAgU2hlZXQgaGlkZVNoZWV0ID0gd2IuY3JlYXRlU2hlZXQoaGlkZVNoZWV0TmFtZSk7IC8vIOeUqOS6juWtmOWCqCDkuIvmi4noj5zljZXmlbDmja4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0bGlzdC5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaGlkZVNoZWV0LmNyZWF0ZVJvdyhpKS5jcmVhdGVDZWxsKDApLnNldENlbGxWYWx1ZSh0ZXh0bGlzdFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgLy8g5Yib5bu65ZCN56ew77yM5Y+v6KKr5YW25LuW5Y2V5YWD5qC85byV55SoCisgICAgICAgIE5hbWUgbmFtZSA9IHdiLmNyZWF0ZU5hbWUoKTsKKyAgICAgICAgbmFtZS5zZXROYW1lTmFtZShoaWRlU2hlZXROYW1lICsgIl9kYXRhIik7CisgICAgICAgIG5hbWUuc2V0UmVmZXJzVG9Gb3JtdWxhKGhpZGVTaGVldE5hbWUgKyAiISRBJDE6JEEkIiArIHRleHRsaXN0Lmxlbmd0aCk7CisgICAgICAgIERhdGFWYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IHNoZWV0LmdldERhdGFWYWxpZGF0aW9uSGVscGVyKCk7CisgICAgICAgIC8vIOWKoOi9veS4i+aLieWIl+ihqOWGheWuuQorICAgICAgICBEYXRhVmFsaWRhdGlvbkNvbnN0cmFpbnQgY29uc3RyYWludCA9IGhlbHBlci5jcmVhdGVGb3JtdWxhTGlzdENvbnN0cmFpbnQoaGlkZVNoZWV0TmFtZSArICJfZGF0YSIpOworICAgICAgICAvLyDorr7nva7mlbDmja7mnInmlYjmgKfliqDovb3lnKjlk6rkuKrljZXlhYPmoLzkuIos5Zub5Liq5Y+C5pWw5YiG5Yir5piv77ya6LW35aeL6KGM44CB57uI5q2i6KGM44CB6LW35aeL5YiX44CB57uI5q2i5YiXCisgICAgICAgIENlbGxSYW5nZUFkZHJlc3NMaXN0IHJlZ2lvbnMgPSBuZXcgQ2VsbFJhbmdlQWRkcmVzc0xpc3QoZmlyc3RSb3csIGVuZFJvdywgZmlyc3RDb2wsIGVuZENvbCk7CisgICAgICAgIC8vIOaVsOaNruacieaViOaAp+WvueixoQorICAgICAgICBEYXRhVmFsaWRhdGlvbiBkYXRhVmFsaWRhdGlvbiA9IGhlbHBlci5jcmVhdGVWYWxpZGF0aW9uKGNvbnN0cmFpbnQsIHJlZ2lvbnMpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShwcm9tcHRDb250ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5aaC5p6c6K6+572u5LqG5o+Q56S65L+h5oGv5YiZ6byg5qCH5pS+5LiK5Y675o+Q56S6CisgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbi5jcmVhdGVQcm9tcHRCb3goIiIsIHByb21wdENvbnRlbnQpOworICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24uc2V0U2hvd1Byb21wdEJveCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyDlpITnkIZFeGNlbOWFvOWuueaAp+mXrumimAorICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24gaW5zdGFuY2VvZiBYU1NGRGF0YVZhbGlkYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uLnNldFN1cHByZXNzRHJvcERvd25BcnJvdyh0cnVlKTsKKyAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uLnNldFNob3dFcnJvckJveCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uLnNldFN1cHByZXNzRHJvcERvd25BcnJvdyhmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBzaGVldC5hZGRWYWxpZGF0aW9uRGF0YShkYXRhVmFsaWRhdGlvbik7CisgICAgICAgIC8vIOiuvue9rmhpZGRlblNoZWV06ZqQ6JePCisgICAgICAgIHdiLnNldFNoZWV0SGlkZGVuKHdiLmdldFNoZWV0SW5kZXgoaGlkZVNoZWV0KSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Kej5p6Q5a+85Ye65YC8IDA955S3LDE95aWzLDI95pyq55+lCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUg5Y+C5pWw5YC8CisgICAgICogQHBhcmFtIGNvbnZlcnRlckV4cCDnv7vor5Hms6jop6MKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIOWIhumalOespgorICAgICAqIEByZXR1cm4g6Kej5p6Q5ZCO5YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEJ5RXhwKFN0cmluZyBwcm9wZXJ0eVZhbHVlLCBTdHJpbmcgY29udmVydGVyRXhwLCBTdHJpbmcgc2VwYXJhdG9yKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBwcm9wZXJ0eVN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ1tdIGNvbnZlcnRTb3VyY2UgPSBjb252ZXJ0ZXJFeHAuc3BsaXQoIiwiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGNvbnZlcnRTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGl0ZW1BcnJheSA9IGl0ZW0uc3BsaXQoIj0iKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueShwcm9wZXJ0eVZhbHVlLCBzZXBhcmF0b3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHJvcGVydHlWYWx1ZS5zcGxpdChzZXBhcmF0b3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1BcnJheVswXS5lcXVhbHModmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmluZy5hcHBlbmQoaXRlbUFycmF5WzFdICsgc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXJyYXlbMF0uZXF1YWxzKHByb3BlcnR5VmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BcnJheVsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwRW5kKHByb3BlcnR5U3RyaW5nLnRvU3RyaW5nKCksIHNlcGFyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Y+N5ZCR6Kej5p6Q5YC8IOeUtz0wLOWlsz0xLOacquefpT0yCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUg5Y+C5pWw5YC8CisgICAgICogQHBhcmFtIGNvbnZlcnRlckV4cCDnv7vor5Hms6jop6MKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIOWIhumalOespgorICAgICAqIEByZXR1cm4g6Kej5p6Q5ZCO5YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2ZXJzZUJ5RXhwKFN0cmluZyBwcm9wZXJ0eVZhbHVlLCBTdHJpbmcgY29udmVydGVyRXhwLCBTdHJpbmcgc2VwYXJhdG9yKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBwcm9wZXJ0eVN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ1tdIGNvbnZlcnRTb3VyY2UgPSBjb252ZXJ0ZXJFeHAuc3BsaXQoIiwiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGNvbnZlcnRTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGl0ZW1BcnJheSA9IGl0ZW0uc3BsaXQoIj0iKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueShwcm9wZXJ0eVZhbHVlLCBzZXBhcmF0b3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHJvcGVydHlWYWx1ZS5zcGxpdChzZXBhcmF0b3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1BcnJheVsxXS5lcXVhbHModmFsdWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmluZy5hcHBlbmQoaXRlbUFycmF5WzBdICsgc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXJyYXlbMV0uZXF1YWxzKHByb3BlcnR5VmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BcnJheVswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwRW5kKHByb3BlcnR5U3RyaW5nLnRvU3RyaW5nKCksIHNlcGFyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Kej5p6Q5a2X5YW45YC8CisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RWYWx1ZSDlrZflhbjlgLwKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHBhcmFtIHNlcGFyYXRvciDliIbpmpTnrKYKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOagh+etvgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnREaWN0QnlFeHAoU3RyaW5nIGRpY3RWYWx1ZSwgU3RyaW5nIGRpY3RUeXBlLCBTdHJpbmcgc2VwYXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERpY3RVdGlscy5nZXREaWN0TGFiZWwoZGljdFR5cGUsIGRpY3RWYWx1ZSwgc2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlj43lkJHop6PmnpDlgLzlrZflhbjlgLwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdExhYmVsIOWtl+WFuOagh+etvgorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnosKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIOWIhumalOespgorICAgICAqIEByZXR1cm4g5a2X5YW45YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2ZXJzZURpY3RCeUV4cChTdHJpbmcgZGljdExhYmVsLCBTdHJpbmcgZGljdFR5cGUsIFN0cmluZyBzZXBhcmF0b3IpCisgICAgeworICAgICAgICByZXR1cm4gRGljdFV0aWxzLmdldERpY3RWYWx1ZShkaWN0VHlwZSwgZGljdExhYmVsLCBzZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaVsOaNruWkhOeQhuWZqAorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSDmlbDmja7lgLwKKyAgICAgKiBAcGFyYW0gZXhjZWwg5pWw5o2u5rOo6KejCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGF0YUZvcm1hdEhhbmRsZXJBZGFwdGVyKE9iamVjdCB2YWx1ZSwgRXhjZWwgZXhjZWwsIENlbGwgY2VsbCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBleGNlbC5oYW5kbGVyKCkuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBNZXRob2QgZm9ybWF0TWV0aG9kID0gZXhjZWwuaGFuZGxlcigpLmdldE1ldGhvZCgiZm9ybWF0IiwgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIFN0cmluZ1tdLmNsYXNzLCBDZWxsLmNsYXNzLCBXb3JrYm9vay5jbGFzcyB9KTsKKyAgICAgICAgICAgIHZhbHVlID0gZm9ybWF0TWV0aG9kLmludm9rZShpbnN0YW5jZSwgdmFsdWUsIGV4Y2VsLmFyZ3MoKSwgY2VsbCwgdGhpcy53Yik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuS4jeiDveagvOW8j+WMluaVsOaNriAiICsgZXhjZWwuaGFuZGxlcigpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnZlcnQudG9TdHIodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWQiOiuoee7n+iuoeS/oeaBrworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTdGF0aXN0aWNzRGF0YShJbnRlZ2VyIGluZGV4LCBTdHJpbmcgdGV4dCwgRXhjZWwgZW50aXR5KQorICAgIHsKKyAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5pc1N0YXRpc3RpY3MoKSkKKyAgICAgICAgeworICAgICAgICAgICAgRG91YmxlIHRlbXAgPSAwRDsKKyAgICAgICAgICAgIGlmICghc3RhdGlzdGljcy5jb250YWluc0tleShpbmRleCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGlzdGljcy5wdXQoaW5kZXgsIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IERvdWJsZS52YWx1ZU9mKHRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGlzdGljcy5wdXQoaW5kZXgsIHN0YXRpc3RpY3MuZ2V0KGluZGV4KSArIHRlbXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu657uf6K6h6KGMCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU3RhdGlzdGljc1JvdygpCisgICAgeworICAgICAgICBpZiAoc3RhdGlzdGljcy5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBSb3cgcm93ID0gc2hlZXQuY3JlYXRlUm93KHNoZWV0LmdldExhc3RSb3dOdW0oKSArIDEpOworICAgICAgICAgICAgU2V0PEludGVnZXI+IGtleXMgPSBzdGF0aXN0aWNzLmtleVNldCgpOworICAgICAgICAgICAgQ2VsbCBjZWxsID0gcm93LmNyZWF0ZUNlbGwoMCk7CisgICAgICAgICAgICBjZWxsLnNldENlbGxTdHlsZShzdHlsZXMuZ2V0KCJ0b3RhbCIpKTsKKyAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFZhbHVlKCLlkIjorqEiKTsKKworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGtleSA6IGtleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VsbCA9IHJvdy5jcmVhdGVDZWxsKGtleSk7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRDZWxsU3R5bGUoc3R5bGVzLmdldCgidG90YWwiKSk7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUoRE9VQkxFX0ZPUk1BVC5mb3JtYXQoc3RhdGlzdGljcy5nZXQoa2V5KSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGlzdGljcy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog57yW56CB5paH5Lu25ZCNCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGluZ0ZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIGZpbGVuYW1lID0gVVVJRC5yYW5kb21VVUlEKCkgKyAiXyIgKyBmaWxlbmFtZSArICIueGxzeCI7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bkuIvovb3ot6/lvoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUg5paH5Lu25ZCN56ewCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGRvd25sb2FkUGF0aCA9IFJ1b1lpQ29uZmlnLmdldERvd25sb2FkUGF0aCgpICsgZmlsZW5hbWU7CisgICAgICAgIEZpbGUgZGVzYyA9IG5ldyBGaWxlKGRvd25sb2FkUGF0aCk7CisgICAgICAgIGlmICghZGVzYy5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc2MuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb3dubG9hZFBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+WYmVhbuS4reeahOWxnuaAp+WAvAorICAgICAqIAorICAgICAqIEBwYXJhbSB2byDlrp7kvZPlr7nosaEKKyAgICAgKiBAcGFyYW0gZmllbGQg5a2X5q61CisgICAgICogQHBhcmFtIGV4Y2VsIOazqOinoworICAgICAqIEByZXR1cm4g5pyA57uI55qE5bGe5oCn5YC8CisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBnZXRUYXJnZXRWYWx1ZShUIHZvLCBGaWVsZCBmaWVsZCwgRXhjZWwgZXhjZWwpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE9iamVjdCBvID0gZmllbGQuZ2V0KHZvKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZXhjZWwudGFyZ2V0QXR0cigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IGV4Y2VsLnRhcmdldEF0dHIoKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQuY29udGFpbnMoIi4iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0YXJnZXRzID0gdGFyZ2V0LnNwbGl0KCJbLl0iKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogdGFyZ2V0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG8gPSBnZXRWYWx1ZShvLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbyA9IGdldFZhbHVlKG8sIHRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgLyoqCisgICAgICog5Lul57G755qE5bGe5oCn55qEZ2V05pa55rOV5pa55rOV5b2i5byP6I635Y+W5YC8CisgICAgICogCisgICAgICogQHBhcmFtIG8KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEByZXR1cm4gdmFsdWUKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBvLCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChvKSAmJiBTdHJpbmdVdGlscy5pc05vdEVtcHR5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IG8uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZChuYW1lKTsKKyAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBvID0gZmllbGQuZ2V0KG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvOworICAgIH0KKworICAgIC8qKgorICAgICAqIOW+l+WIsOaJgOacieWumuS5ieWtl+autQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVFeGNlbEZpZWxkKCkKKyAgICB7CisgICAgICAgIHRoaXMuZmllbGRzID0gZ2V0RmllbGRzKCk7CisgICAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5maWVsZHMuc3RyZWFtKCkuc29ydGVkKENvbXBhcmF0b3IuY29tcGFyaW5nKG9iamVjdHMgLT4gKChFeGNlbCkgb2JqZWN0c1sxXSkuc29ydCgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgdGhpcy5tYXhIZWlnaHQgPSBnZXRSb3dIZWlnaHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blrZfmrrXms6jop6Pkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3RbXT4gZ2V0RmllbGRzKCkKKyAgICB7CisgICAgICAgIExpc3Q8T2JqZWN0W10+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0W10+KCk7CisgICAgICAgIExpc3Q8RmllbGQ+IHRlbXBGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdGVtcEZpZWxkcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGF6ei5nZXRTdXBlcmNsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKSkpOworICAgICAgICB0ZW1wRmllbGRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpKTsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IHRlbXBGaWVsZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyh0aGlzLmV4Y2x1ZGVGaWVsZHMsIGZpZWxkLmdldE5hbWUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g5Y2V5rOo6KejCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoRXhjZWwuY2xhc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWwgYXR0ciA9IGZpZWxkLmdldEFubm90YXRpb24oRXhjZWwuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsICYmIChhdHRyLnR5cGUoKSA9PSBUeXBlLkFMTCB8fCBhdHRyLnR5cGUoKSA9PSB0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5hZGQobmV3IE9iamVjdFtdIHsgZmllbGQsIGF0dHIgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmaWVsZC5nZXRUeXBlKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJNZXRob2QgPSBnZXRTdWJNZXRob2QoZmllbGQuZ2V0TmFtZSgpLCBjbGF6eik7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgZmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHN1YkNsYXNzID0gKENsYXNzPD8+KSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YkZpZWxkcyA9IEZpZWxkVXRpbHMuZ2V0RmllbGRzTGlzdFdpdGhBbm5vdGF0aW9uKHN1YkNsYXNzLCBFeGNlbC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyDlpJrms6jop6MKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChFeGNlbHMuY2xhc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxzIGF0dHJzID0gZmllbGQuZ2V0QW5ub3RhdGlvbihFeGNlbHMuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBFeGNlbFtdIGV4Y2VscyA9IGF0dHJzLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRXhjZWwgYXR0ciA6IGV4Y2VscykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKHRoaXMuZXhjbHVkZUZpZWxkcywgZmllbGQuZ2V0TmFtZSgpICsgIi4iICsgYXR0ci50YXJnZXRBdHRyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhdHRyICE9IG51bGwgJiYgKGF0dHIudHlwZSgpID09IFR5cGUuQUxMIHx8IGF0dHIudHlwZSgpID09IHR5cGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5hZGQobmV3IE9iamVjdFtdIHsgZmllbGQsIGF0dHIgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7ms6jop6Pojrflj5bmnIDlpKfooYzpq5gKKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0Um93SGVpZ2h0KCkKKyAgICB7CisgICAgICAgIGRvdWJsZSBtYXhIZWlnaHQgPSAwOworICAgICAgICBmb3IgKE9iamVjdFtdIG9zIDogdGhpcy5maWVsZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsIGV4Y2VsID0gKEV4Y2VsKSBvc1sxXTsKKyAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgZXhjZWwuaGVpZ2h0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2hvcnQpIChtYXhIZWlnaHQgKiAyMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu65LiA5Liq5bel5L2c57C/CisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlV29ya2Jvb2soKQorICAgIHsKKyAgICAgICAgdGhpcy53YiA9IG5ldyBTWFNTRldvcmtib29rKDUwMCk7CisgICAgICAgIHRoaXMuc2hlZXQgPSB3Yi5jcmVhdGVTaGVldCgpOworICAgICAgICB3Yi5zZXRTaGVldE5hbWUoMCwgc2hlZXROYW1lKTsKKyAgICAgICAgdGhpcy5zdHlsZXMgPSBjcmVhdGVTdHlsZXMod2IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIm+W7uuW3peS9nOihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBzaGVldE5vIHNoZWV05pWw6YePCisgICAgICogQHBhcmFtIGluZGV4IOW6j+WPtworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNoZWV0KGludCBzaGVldE5vLCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICAvLyDorr7nva7lt6XkvZzooajnmoTlkI3np7AuCisgICAgICAgIGlmIChzaGVldE5vID4gMSAmJiBpbmRleCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2hlZXQgPSB3Yi5jcmVhdGVTaGVldCgpOworICAgICAgICAgICAgdGhpcy5jcmVhdGVUaXRsZSgpOworICAgICAgICAgICAgd2Iuc2V0U2hlZXROYW1lKGluZGV4LCBzaGVldE5hbWUgKyBpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bljZXlhYPmoLzlgLwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm93IOiOt+WPlueahOihjAorICAgICAqIEBwYXJhbSBjb2x1bW4g6I635Y+W5Y2V5YWD5qC85YiX5Y+3CisgICAgICogQHJldHVybiDljZXlhYPmoLzlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldENlbGxWYWx1ZShSb3cgcm93LCBpbnQgY29sdW1uKQorICAgIHsKKyAgICAgICAgaWYgKHJvdyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgICAgIE9iamVjdCB2YWwgPSAiIjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIENlbGwgY2VsbCA9IHJvdy5nZXRDZWxsKGNvbHVtbik7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGNlbGwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjZWxsLmdldENlbGxUeXBlKCkgPT0gQ2VsbFR5cGUuTlVNRVJJQyB8fCBjZWxsLmdldENlbGxUeXBlKCkgPT0gQ2VsbFR5cGUuRk9STVVMQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGNlbGwuZ2V0TnVtZXJpY0NlbGxWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZVV0aWwuaXNDZWxsRGF0ZUZvcm1hdHRlZChjZWxsKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gRGF0ZVV0aWwuZ2V0SmF2YURhdGUoKERvdWJsZSkgdmFsKTsgLy8gUE9JIEV4Y2VsIOaXpeacn+agvOW8j+i9rOaNogorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChEb3VibGUpIHZhbCAlIDEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBuZXcgQmlnRGVjaW1hbCh2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbmV3IERlY2ltYWxGb3JtYXQoIjAiKS5mb3JtYXQodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjZWxsLmdldENlbGxUeXBlKCkgPT0gQ2VsbFR5cGUuU1RSSU5HKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gY2VsbC5nZXRTdHJpbmdDZWxsVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC5nZXRDZWxsVHlwZSgpID09IENlbGxUeXBlLkJPT0xFQU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSBjZWxsLmdldEJvb2xlYW5DZWxsVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC5nZXRDZWxsVHlwZSgpID09IENlbGxUeXBlLkVSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gY2VsbC5nZXRFcnJvckNlbGxWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIpOaWreaYr+WQpuaYr+epuuihjAorICAgICAqIAorICAgICAqIEBwYXJhbSByb3cg5Yik5pat55qE6KGMCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Jvd0VtcHR5KFJvdyByb3cpCisgICAgeworICAgICAgICBpZiAocm93ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSByb3cuZ2V0Rmlyc3RDZWxsTnVtKCk7IGkgPCByb3cuZ2V0TGFzdENlbGxOdW0oKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDZWxsIGNlbGwgPSByb3cuZ2V0Q2VsbChpKTsKKyAgICAgICAgICAgIGlmIChjZWxsICE9IG51bGwgJiYgY2VsbC5nZXRDZWxsVHlwZSgpICE9IENlbGxUeXBlLkJMQU5LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZFeGNlbDIwMDPlm77niYcKKyAgICAgKgorICAgICAqIEBwYXJhbSBzaGVldCDlvZPliY1zaGVldOWvueixoQorICAgICAqIEBwYXJhbSB3b3JrYm9vayDlt6XkvZznsL/lr7nosaEKKyAgICAgKiBAcmV0dXJuIE1hcCBrZXk65Zu+54mH5Y2V5YWD5qC857Si5byV77yIMV8x77yJU3RyaW5n77yMdmFsdWU65Zu+54mH5rWBUGljdHVyZURhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFBpY3R1cmVEYXRhPiBnZXRTaGVldFBpY3R1cmVzMDMoSFNTRlNoZWV0IHNoZWV0LCBIU1NGV29ya2Jvb2sgd29ya2Jvb2spCisgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBQaWN0dXJlRGF0YT4gc2hlZXRJbmRleFBpY01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGljdHVyZURhdGE+KCk7CisgICAgICAgIExpc3Q8SFNTRlBpY3R1cmVEYXRhPiBwaWN0dXJlcyA9IHdvcmtib29rLmdldEFsbFBpY3R1cmVzKCk7CisgICAgICAgIGlmICghcGljdHVyZXMuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEhTU0ZTaGFwZSBzaGFwZSA6IHNoZWV0LmdldERyYXdpbmdQYXRyaWFyY2goKS5nZXRDaGlsZHJlbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhTU0ZDbGllbnRBbmNob3IgYW5jaG9yID0gKEhTU0ZDbGllbnRBbmNob3IpIHNoYXBlLmdldEFuY2hvcigpOworICAgICAgICAgICAgICAgIGlmIChzaGFwZSBpbnN0YW5jZW9mIEhTU0ZQaWN0dXJlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSFNTRlBpY3R1cmUgcGljID0gKEhTU0ZQaWN0dXJlKSBzaGFwZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpY3R1cmVJbmRleCA9IHBpYy5nZXRQaWN0dXJlSW5kZXgoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIEhTU0ZQaWN0dXJlRGF0YSBwaWNEYXRhID0gcGljdHVyZXMuZ2V0KHBpY3R1cmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaWNJbmRleCA9IGFuY2hvci5nZXRSb3cxKCkgKyAiXyIgKyBhbmNob3IuZ2V0Q29sMSgpOworICAgICAgICAgICAgICAgICAgICBzaGVldEluZGV4UGljTWFwLnB1dChwaWNJbmRleCwgcGljRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNoZWV0SW5kZXhQaWNNYXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2hlZXRJbmRleFBpY01hcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlkV4Y2VsMjAwN+WbvueJhworICAgICAqCisgICAgICogQHBhcmFtIHNoZWV0IOW9k+WJjXNoZWV05a+56LGhCisgICAgICogQHBhcmFtIHdvcmtib29rIOW3peS9nOewv+WvueixoQorICAgICAqIEByZXR1cm4gTWFwIGtleTrlm77niYfljZXlhYPmoLzntKLlvJXvvIgxXzHvvIlTdHJpbmfvvIx2YWx1ZTrlm77niYfmtYFQaWN0dXJlRGF0YQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUGljdHVyZURhdGE+IGdldFNoZWV0UGljdHVyZXMwNyhYU1NGU2hlZXQgc2hlZXQsIFhTU0ZXb3JrYm9vayB3b3JrYm9vaykKKyAgICB7CisgICAgICAgIE1hcDxTdHJpbmcsIFBpY3R1cmVEYXRhPiBzaGVldEluZGV4UGljTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQaWN0dXJlRGF0YT4oKTsKKyAgICAgICAgZm9yIChQT0lYTUxEb2N1bWVudFBhcnQgZHIgOiBzaGVldC5nZXRSZWxhdGlvbnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRyIGluc3RhbmNlb2YgWFNTRkRyYXdpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWFNTRkRyYXdpbmcgZHJhd2luZyA9IChYU1NGRHJhd2luZykgZHI7CisgICAgICAgICAgICAgICAgTGlzdDxYU1NGU2hhcGU+IHNoYXBlcyA9IGRyYXdpbmcuZ2V0U2hhcGVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChYU1NGU2hhcGUgc2hhcGUgOiBzaGFwZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGUgaW5zdGFuY2VvZiBYU1NGUGljdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWFNTRlBpY3R1cmUgcGljID0gKFhTU0ZQaWN0dXJlKSBzaGFwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTU0ZDbGllbnRBbmNob3IgYW5jaG9yID0gcGljLmdldFByZWZlcnJlZFNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENUTWFya2VyIGN0TWFya2VyID0gYW5jaG9yLmdldEZyb20oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaWNJbmRleCA9IGN0TWFya2VyLmdldFJvdygpICsgIl8iICsgY3RNYXJrZXIuZ2V0Q29sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGVldEluZGV4UGljTWFwLnB1dChwaWNJbmRleCwgcGljLmdldFBpY3R1cmVEYXRhKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaGVldEluZGV4UGljTWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagvOW8j+WMluS4jeWQjOexu+Wei+eahOaXpeacn+WvueixoQorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRlRm9ybWF0IOaXpeacn+agvOW8jworICAgICAqIEBwYXJhbSB2YWwg6KKr5qC85byP5YyW55qE5pel5pyf5a+56LGhCisgICAgICogQHJldHVybiDmoLzlvI/ljJblkI7nmoTml6XmnJ/lrZfnrKYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHBhcnNlRGF0ZVRvU3RyKFN0cmluZyBkYXRlRm9ybWF0LCBPYmplY3QgdmFsKQorICAgIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ciA9IERhdGVVdGlscy5wYXJzZURhdGVUb1N0cihkYXRlRm9ybWF0LCAoRGF0ZSkgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBMb2NhbERhdGVUaW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHIgPSBEYXRlVXRpbHMucGFyc2VEYXRlVG9TdHIoZGF0ZUZvcm1hdCwgRGF0ZVV0aWxzLnRvRGF0ZSgoTG9jYWxEYXRlVGltZSkgdmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTG9jYWxEYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBzdHIgPSBEYXRlVXRpbHMucGFyc2VEYXRlVG9TdHIoZGF0ZUZvcm1hdCwgRGF0ZVV0aWxzLnRvRGF0ZSgoTG9jYWxEYXRlKSB2YWwpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ciA9IHZhbC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5pyJ5a+56LGh55qE5a2Q5YiX6KGoCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWJMaXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc05vdE51bGwoc3ViRmllbGRzKSAmJiBzdWJGaWVsZHMuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbmnInlr7nosaHnmoTlrZDliJfooajvvIzpm4blkIjkuI3kuLrnqboKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1Ykxpc3RWYWx1ZShUIHZvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmlzTm90TnVsbChzdWJGaWVsZHMpICYmIHN1YkZpZWxkcy5zaXplKCkgPiAwICYmIFN0cmluZ1V0aWxzLmlzTm90TnVsbChnZXRMaXN0Q2VsbFZhbHVlKHZvKSkgJiYgZ2V0TGlzdENlbGxWYWx1ZSh2bykuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpm4blkIjnmoTlgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRMaXN0Q2VsbFZhbHVlKE9iamVjdCBvYmopCisgICAgeworICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IHN1Yk1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W10ge30pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbjw/PikgdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a+56LGh55qE5a2Q5YiX6KGo5pa55rOVCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUg5ZCN56ewCisgICAgICogQHBhcmFtIHBvam9DbGFzcyDnsbvlr7nosaEKKyAgICAgKiBAcmV0dXJuIOWtkOWIl+ihqOaWueazlQorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0U3ViTWV0aG9kKFN0cmluZyBuYW1lLCBDbGFzczw/PiBwb2pvQ2xhc3MpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgZ2V0TWV0aG9kTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoImdldCIpOworICAgICAgICBnZXRNZXRob2ROYW1lLmFwcGVuZChuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgZ2V0TWV0aG9kTmFtZS5hcHBlbmQobmFtZS5zdWJzdHJpbmcoMSkpOworICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IHBvam9DbGFzcy5nZXRNZXRob2QoZ2V0TWV0aG9kTmFtZS50b1N0cmluZygpLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIuiOt+WPluWvueixoeW8guW4uHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9yZWZsZWN0L1JlZmxlY3RVdGlscy5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9yZWZsZWN0L1JlZmxlY3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTk1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3JlZmxlY3QvUmVmbGVjdFV0aWxzLmphdmEKQEAgLTAsMCArMSw0MTAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5yZWZsZWN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlZhbGlkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5EYXRlVXRpbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0LkNvbnZlcnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CisKKy8qKgorICog5Y+N5bCE5bel5YW357G7LiDmj5DkvpvosIPnlKhnZXR0ZXIvc2V0dGVy5pa55rOVLCDorr/pl67np4HmnInlj5jph48sIOiwg+eUqOengeacieaWueazlSwg6I635Y+W5rOb5Z6L57G75Z6LQ2xhc3MsIOiiq0FPUOi/h+eahOecn+Wunuexu+etieW3peWFt+WHveaVsC4KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorcHVibGljIGNsYXNzIFJlZmxlY3RVdGlscworeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRURVJfUFJFRklYID0gInNldCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUVEVSX1BSRUZJWCA9ICJnZXQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENHTElCX0NMQVNTX1NFUEFSQVRPUiA9ICIkJCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVmbGVjdFV0aWxzLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIOiwg+eUqEdldHRlcuaWueazlS4KKyAgICAgKiDmlK/mjIHlpJrnuqfvvIzlpoLvvJrlr7nosaHlkI0u5a+56LGh5ZCNLuaWueazlQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEU+IEUgaW52b2tlR2V0dGVyKE9iamVjdCBvYmosIFN0cmluZyBwcm9wZXJ0eU5hbWUpCisgICAgeworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqOworICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogU3RyaW5nVXRpbHMuc3BsaXQocHJvcGVydHlOYW1lLCAiLiIpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZ2V0dGVyTWV0aG9kTmFtZSA9IEdFVFRFUl9QUkVGSVggKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKG5hbWUpOworICAgICAgICAgICAgb2JqZWN0ID0gaW52b2tlTWV0aG9kKG9iamVjdCwgZ2V0dGVyTWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge30sIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChFKSBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICog6LCD55SoU2V0dGVy5pa55rOVLCDku4XljLnphY3mlrnms5XlkI3jgIIKKyAgICAgKiDmlK/mjIHlpJrnuqfvvIzlpoLvvJrlr7nosaHlkI0u5a+56LGh5ZCNLuaWueazlQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgaW52b2tlU2V0dGVyKE9iamVjdCBvYmosIFN0cmluZyBwcm9wZXJ0eU5hbWUsIEUgdmFsdWUpCisgICAgeworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IFN0cmluZ1V0aWxzLnNwbGl0KHByb3BlcnR5TmFtZSwgIi4iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCBuYW1lcy5sZW5ndGggLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBnZXR0ZXJNZXRob2ROYW1lID0gR0VUVEVSX1BSRUZJWCArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobmFtZXNbaV0pOworICAgICAgICAgICAgICAgIG9iamVjdCA9IGludm9rZU1ldGhvZChvYmplY3QsIGdldHRlck1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHt9LCBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZXR0ZXJNZXRob2ROYW1lID0gU0VUVEVSX1BSRUZJWCArIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUobmFtZXNbaV0pOworICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZEJ5TmFtZShvYmplY3QsIHNldHRlck1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog55u05o6l6K+75Y+W5a+56LGh5bGe5oCn5YC8LCDml6Dop4Zwcml2YXRlL3Byb3RlY3RlZOS/rumlsOespiwg5LiN57uP6L+HZ2V0dGVy5Ye95pWwLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0RmllbGRWYWx1ZShmaW5hbCBPYmplY3Qgb2JqLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKQorICAgIHsKKyAgICAgICAgRmllbGQgZmllbGQgPSBnZXRBY2Nlc3NpYmxlRmllbGQob2JqLCBmaWVsZE5hbWUpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCLlnKggWyIgKyBvYmouZ2V0Q2xhc3MoKSArICJdIOS4re+8jOayoeacieaJvuWIsCBbIiArIGZpZWxkTmFtZSArICJdIOWtl+autSAiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEUgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChFKSBmaWVsZC5nZXQob2JqKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIuS4jeWPr+iDveaKm+WHuueahOW8guW4uHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog55u05o6l6K6+572u5a+56LGh5bGe5oCn5YC8LCDml6Dop4Zwcml2YXRlL3Byb3RlY3RlZOS/rumlsOespiwg5LiN57uP6L+Hc2V0dGVy5Ye95pWwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgc2V0RmllbGRWYWx1ZShmaW5hbCBPYmplY3Qgb2JqLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBFIHZhbHVlKQorICAgIHsKKyAgICAgICAgRmllbGQgZmllbGQgPSBnZXRBY2Nlc3NpYmxlRmllbGQob2JqLCBmaWVsZE5hbWUpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigi5ZyoIFsiICsgb2JqLmdldENsYXNzKCkgKyAiXSDkuK3vvIzmsqHmnInmib7liLAgWyIgKyBmaWVsZE5hbWUgKyAiXSDlrZfmrrUgIik7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoIuWcqCBbIiArIG9iai5nZXRDbGFzcygpICsgIl0g5Lit77yM5rKh5pyJ5om+5YiwIFsiICsgZmllbGROYW1lICsgIl0g5a2X5q61ICIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmaWVsZC5zZXQob2JqLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCLkuI3lj6/og73mipvlh7rnmoTlvILluLg6IHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog55u05o6l6LCD55So5a+56LGh5pa55rOVLCDml6Dop4Zwcml2YXRlL3Byb3RlY3RlZOS/rumlsOespi4KKyAgICAgKiDnlKjkuo7kuIDmrKHmgKfosIPnlKjnmoTmg4XlhrXvvIzlkKbliJnlupTkvb/nlKhnZXRBY2Nlc3NpYmxlTWV0aG9kKCnlh73mlbDojrflvpdNZXRob2TlkI7lj43lpI3osIPnlKguCisgICAgICog5ZCM5pe25Yy56YWN5pa55rOV5ZCNK+WPguaVsOexu+Wei++8jAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEU+IEUgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmosIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLAorICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJncykKKyAgICB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBtZXRob2ROYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRBY2Nlc3NpYmxlTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOworICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygi5ZyoIFsiICsgb2JqLmdldENsYXNzKCkgKyAiXSDkuK3vvIzmsqHmnInmib7liLAgWyIgKyBtZXRob2ROYW1lICsgIl0g5pa55rOVICIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoRSkgbWV0aG9kLmludm9rZShvYmosIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJtZXRob2Q6ICIgKyBtZXRob2QgKyAiLCBvYmo6ICIgKyBvYmogKyAiLCBhcmdzOiAiICsgYXJncyArICIiOworICAgICAgICAgICAgdGhyb3cgY29udmVydFJlZmxlY3Rpb25FeGNlcHRpb25Ub1VuY2hlY2tlZChtc2csIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog55u05o6l6LCD55So5a+56LGh5pa55rOVLCDml6Dop4Zwcml2YXRlL3Byb3RlY3RlZOS/rumlsOespu+8jAorICAgICAqIOeUqOS6juS4gOasoeaAp+iwg+eUqOeahOaDheWGte+8jOWQpuWImeW6lOS9v+eUqGdldEFjY2Vzc2libGVNZXRob2RCeU5hbWUoKeWHveaVsOiOt+W+l01ldGhvZOWQjuWPjeWkjeiwg+eUqC4KKyAgICAgKiDlj6rljLnphY3lh73mlbDlkI3vvIzlpoLmnpzmnInlpJrkuKrlkIzlkI3lh73mlbDosIPnlKjnrKzkuIDkuKrjgIIKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxFPiBFIGludm9rZU1ldGhvZEJ5TmFtZShmaW5hbCBPYmplY3Qgb2JqLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJncykKKyAgICB7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRBY2Nlc3NpYmxlTWV0aG9kQnlOYW1lKG9iaiwgbWV0aG9kTmFtZSwgYXJncy5sZW5ndGgpOworICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOWmguaenOS4uuepuuS4jeaKpemUme+8jOebtOaOpei/lOWbnuepuuOAggorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCLlnKggWyIgKyBvYmouZ2V0Q2xhc3MoKSArICJdIOS4re+8jOayoeacieaJvuWIsCBbIiArIG1ldGhvZE5hbWUgKyAiXSDmlrnms5UgIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g57G75Z6L6L2s5o2i77yI5bCG5Y+C5pWw5pWw5o2u57G75Z6L6L2s5o2i5Li655uu5qCH5pa55rOV5Y+C5pWw57G75Z6L77yJCisgICAgICAgICAgICBDbGFzczw/PltdIGNzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldICE9IG51bGwgJiYgIWFyZ3NbaV0uZ2V0Q2xhc3MoKS5lcXVhbHMoY3NbaV0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzW2ldID09IFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IENvbnZlcnQudG9TdHIoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGgoKFN0cmluZykgYXJnc1tpXSwgIi4wIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IFN0cmluZ1V0aWxzLnN1YnN0cmluZ0JlZm9yZSgoU3RyaW5nKSBhcmdzW2ldLCAiLjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjc1tpXSA9PSBJbnRlZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gQ29udmVydC50b0ludChhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjc1tpXSA9PSBMb25nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gQ29udmVydC50b0xvbmcoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3NbaV0gPT0gRG91YmxlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gQ29udmVydC50b0RvdWJsZShhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjc1tpXSA9PSBGbG9hdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IENvbnZlcnQudG9GbG9hdChhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjc1tpXSA9PSBEYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gRGF0ZVV0aWxzLnBhcnNlRGF0ZShhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gRGF0ZVV0aWwuZ2V0SmF2YURhdGUoKERvdWJsZSkgYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3NbaV0gPT0gYm9vbGVhbi5jbGFzcyB8fCBjc1tpXSA9PSBCb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gQ29udmVydC50b0Jvb2woYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKEUpIG1ldGhvZC5pbnZva2Uob2JqLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAibWV0aG9kOiAiICsgbWV0aG9kICsgIiwgb2JqOiAiICsgb2JqICsgIiwgYXJnczogIiArIGFyZ3MgKyAiIjsKKyAgICAgICAgICAgIHRocm93IGNvbnZlcnRSZWZsZWN0aW9uRXhjZXB0aW9uVG9VbmNoZWNrZWQobXNnLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOW+queOr+WQkeS4iui9rOWeiywg6I635Y+W5a+56LGh55qERGVjbGFyZWRGaWVsZCwg5bm25by65Yi26K6+572u5Li65Y+v6K6/6ZeuLgorICAgICAqIOWmguWQkeS4iui9rOWei+WIsE9iamVjdOS7jeaXoOazleaJvuWIsCwg6L+U5ZuebnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkIGdldEFjY2Vzc2libGVGaWVsZChmaW5hbCBPYmplY3Qgb2JqLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKQorICAgIHsKKyAgICAgICAgLy8g5Li656m65LiN5oql6ZSZ44CC55u05o6l6L+U5ZueIG51bGwKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWYWxpZGF0ZS5ub3RCbGFuayhmaWVsZE5hbWUsICJmaWVsZE5hbWUgY2FuJ3QgYmUgYmxhbmsiKTsKKyAgICAgICAgZm9yIChDbGFzczw/PiBzdXBlckNsYXNzID0gb2JqLmdldENsYXNzKCk7IHN1cGVyQ2xhc3MgIT0gT2JqZWN0LmNsYXNzOyBzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5nZXRTdXBlcmNsYXNzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gc3VwZXJDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CisgICAgICAgICAgICAgICAgbWFrZUFjY2Vzc2libGUoZmllbGQpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOW+queOr+WQkeS4iui9rOWeiywg6I635Y+W5a+56LGh55qERGVjbGFyZWRNZXRob2Qs5bm25by65Yi26K6+572u5Li65Y+v6K6/6ZeuLgorICAgICAqIOWmguWQkeS4iui9rOWei+WIsE9iamVjdOS7jeaXoOazleaJvuWIsCwg6L+U5ZuebnVsbC4KKyAgICAgKiDljLnphY3lh73mlbDlkI0r5Y+C5pWw57G75Z6L44CCCisgICAgICog55So5LqO5pa55rOV6ZyA6KaB6KKr5aSa5qyh6LCD55So55qE5oOF5Ya1LiDlhYjkvb/nlKjmnKzlh73mlbDlhYjlj5blvpdNZXRob2Qs54S25ZCO6LCD55SoTWV0aG9kLmludm9rZShPYmplY3Qgb2JqLCBPYmplY3QuLi4gYXJncykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRBY2Nlc3NpYmxlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmosIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4uLi4gcGFyYW1ldGVyVHlwZXMpCisgICAgeworICAgICAgICAvLyDkuLrnqbrkuI3miqXplJnjgILnm7TmjqXov5Tlm54gbnVsbAorICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFZhbGlkYXRlLm5vdEJsYW5rKG1ldGhvZE5hbWUsICJtZXRob2ROYW1lIGNhbid0IGJlIGJsYW5rIik7CisgICAgICAgIGZvciAoQ2xhc3M8Pz4gc2VhcmNoVHlwZSA9IG9iai5nZXRDbGFzcygpOyBzZWFyY2hUeXBlICE9IE9iamVjdC5jbGFzczsgc2VhcmNoVHlwZSA9IHNlYXJjaFR5cGUuZ2V0U3VwZXJjbGFzcygpKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gc2VhcmNoVHlwZS5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgICAgICAgICAgbWFrZUFjY2Vzc2libGUobWV0aG9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOW+queOr+WQkeS4iui9rOWeiywg6I635Y+W5a+56LGh55qERGVjbGFyZWRNZXRob2Qs5bm25by65Yi26K6+572u5Li65Y+v6K6/6ZeuLgorICAgICAqIOWmguWQkeS4iui9rOWei+WIsE9iamVjdOS7jeaXoOazleaJvuWIsCwg6L+U5ZuebnVsbC4KKyAgICAgKiDlj6rljLnphY3lh73mlbDlkI3jgIIKKyAgICAgKiDnlKjkuo7mlrnms5XpnIDopoHooqvlpJrmrKHosIPnlKjnmoTmg4XlhrUuIOWFiOS9v+eUqOacrOWHveaVsOWFiOWPluW+l01ldGhvZCznhLblkI7osIPnlKhNZXRob2QuaW52b2tlKE9iamVjdCBvYmosIE9iamVjdC4uLiBhcmdzKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldEFjY2Vzc2libGVNZXRob2RCeU5hbWUoZmluYWwgT2JqZWN0IG9iaiwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGludCBhcmdzTnVtKQorICAgIHsKKyAgICAgICAgLy8g5Li656m65LiN5oql6ZSZ44CC55u05o6l6L+U5ZueIG51bGwKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWYWxpZGF0ZS5ub3RCbGFuayhtZXRob2ROYW1lLCAibWV0aG9kTmFtZSBjYW4ndCBiZSBibGFuayIpOworICAgICAgICBmb3IgKENsYXNzPD8+IHNlYXJjaFR5cGUgPSBvYmouZ2V0Q2xhc3MoKTsgc2VhcmNoVHlwZSAhPSBPYmplY3QuY2xhc3M7IHNlYXJjaFR5cGUgPSBzZWFyY2hUeXBlLmdldFN1cGVyY2xhc3MoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IHNlYXJjaFR5cGUuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSAmJiBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gYXJnc051bSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VBY2Nlc3NpYmxlKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaUueWPmHByaXZhdGUvcHJvdGVjdGVk55qE5pa55rOV5Li6cHVibGlj77yM5bC96YeP5LiN6LCD55So5a6e6ZmF5pS55Yqo55qE6K+t5Y+l77yM6YG/5YWNSkRL55qEU2VjdXJpdHlNYW5hZ2Vy5oqx5oCo44CCCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1ha2VBY2Nlc3NpYmxlKE1ldGhvZCBtZXRob2QpCisgICAgeworICAgICAgICBpZiAoKCFNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpIHx8ICFNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICAgICAgJiYgIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlLnlj5hwcml2YXRlL3Byb3RlY3RlZOeahOaIkOWRmOWPmOmHj+S4unB1YmxpY++8jOWwvemHj+S4jeiwg+eUqOWunumZheaUueWKqOeahOivreWPpe+8jOmBv+WFjUpES+eahFNlY3VyaXR5TWFuYWdlcuaKseaAqOOAggorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWtlQWNjZXNzaWJsZShGaWVsZCBmaWVsZCkKKyAgICB7CisgICAgICAgIGlmICgoIU1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSB8fCAhTW9kaWZpZXIuaXNQdWJsaWMoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICB8fCBNb2RpZmllci5pc0ZpbmFsKGZpZWxkLmdldE1vZGlmaWVycygpKSkgJiYgIWZpZWxkLmlzQWNjZXNzaWJsZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H5Y+N5bCELCDojrflvpdDbGFzc+WumuS5ieS4reWjsOaYjueahOazm+Wei+WPguaVsOeahOexu+Weiywg5rOo5oSP5rOb5Z6L5b+F6aG75a6a5LmJ5Zyo54i257G75aSECisgICAgICog5aaC5peg5rOV5om+5YiwLCDov5Tlm55PYmplY3QuY2xhc3MuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ2xhc3M8VD4gZ2V0Q2xhc3NHZW5yaWNUeXBlKGZpbmFsIENsYXNzIGNsYXp6KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzR2VucmljVHlwZShjbGF6eiwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H5Y+N5bCELCDojrflvpdDbGFzc+WumuS5ieS4reWjsOaYjueahOeItuexu+eahOazm+Wei+WPguaVsOeahOexu+Weiy4KKyAgICAgKiDlpoLml6Dms5Xmib7liLAsIOi/lOWbnk9iamVjdC5jbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldENsYXNzR2VucmljVHlwZShmaW5hbCBDbGFzcyBjbGF6eiwgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgVHlwZSBnZW5UeXBlID0gY2xhenouZ2V0R2VuZXJpY1N1cGVyY2xhc3MoKTsKKworICAgICAgICBpZiAoIShnZW5UeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoY2xhenouZ2V0U2ltcGxlTmFtZSgpICsgIidzIHN1cGVyY2xhc3Mgbm90IFBhcmFtZXRlcml6ZWRUeXBlIik7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgVHlwZVtdIHBhcmFtcyA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIGdlblR5cGUpLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKKworICAgICAgICBpZiAoaW5kZXggPj0gcGFyYW1zLmxlbmd0aCB8fCBpbmRleCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemUgb2YgIiArIGNsYXp6LmdldFNpbXBsZU5hbWUoKSArICIncyBQYXJhbWV0ZXJpemVkIFR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBwYXJhbXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocGFyYW1zW2luZGV4XSBpbnN0YW5jZW9mIENsYXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGNsYXp6LmdldFNpbXBsZU5hbWUoKSArICIgbm90IHNldCB0aGUgYWN0dWFsIGNsYXNzIG9uIHN1cGVyY2xhc3MgZ2VuZXJpYyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKENsYXNzKSBwYXJhbXNbaW5kZXhdOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0VXNlckNsYXNzKE9iamVjdCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIENsYXNzIGNsYXp6ID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwgJiYgY2xhenouZ2V0TmFtZSgpLmNvbnRhaW5zKENHTElCX0NMQVNTX1NFUEFSQVRPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHN1cGVyQ2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICBpZiAoc3VwZXJDbGFzcyAhPSBudWxsICYmICFPYmplY3QuY2xhc3MuZXF1YWxzKHN1cGVyQ2xhc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlckNsYXNzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGF6ejsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIOWwhuWPjeWwhOaXtueahGNoZWNrZWQgZXhjZXB0aW9u6L2s5o2i5Li6dW5jaGVja2VkIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJ1bnRpbWVFeGNlcHRpb24gY29udmVydFJlZmxlY3Rpb25FeGNlcHRpb25Ub1VuY2hlY2tlZChTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8fCBlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgfHwgZSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9zaWduL0Jhc2U2NC5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9zaWduL0Jhc2U2NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWNkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3NpZ24vQmFzZTY0LmphdmEKQEAgLTAsMCArMSwyOTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zaWduOworCisvKioKKyAqIEJhc2U2NOW3peWFt+exuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCYXNlNjQKK3sKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgICAgIEJBU0VMRU5HVEggICAgICAgICAgID0gMTI4OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgICAgTE9PS1VQTEVOR1RIICAgICAgICAgPSA2NDsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgICAgIFRXRU5UWUZPVVJCSVRHUk9VUCAgID0gMjQ7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICAgICBFSUdIVEJJVCAgICAgICAgICAgICA9IDg7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICAgICBTSVhURUVOQklUICAgICAgICAgICA9IDE2OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgICAgRk9VUkJZVEUgICAgICAgICAgICAgPSA0OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgICAgU0lHTiAgICAgICAgICAgICAgICAgPSAtMTI4OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgICAgUEFEICAgICAgICAgICAgICAgICAgPSAnPSc7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYnl0ZVtdICBiYXNlNjRBbHBoYWJldCAgICAgICA9IG5ldyBieXRlW0JBU0VMRU5HVEhdOworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGNoYXJbXSAgbG9va1VwQmFzZTY0QWxwaGFiZXQgPSBuZXcgY2hhcltMT09LVVBMRU5HVEhdOworCisgICAgc3RhdGljCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VMRU5HVEg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gJ1onOyBpID49ICdBJzsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaSAtICdBJyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9ICd6JzsgaSA+PSAnYSc7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKGkgLSAnYScgKyAyNik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gJzknOyBpID49ICcwJzsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaSAtICcwJyArIDUyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2U2NEFscGhhYmV0WycrJ10gPSA2MjsKKyAgICAgICAgYmFzZTY0QWxwaGFiZXRbJy8nXSA9IDYzOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDI1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGNoYXIpICgnQScgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAyNiwgaiA9IDA7IGkgPD0gNTE7IGkrKywgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChjaGFyKSAoJ2EnICsgaik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gNTIsIGogPSAwOyBpIDw9IDYxOyBpKyssIGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoY2hhcikgKCcwJyArIGopOworICAgICAgICB9CisgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WzYyXSA9IChjaGFyKSAnKyc7CisgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WzYzXSA9IChjaGFyKSAnLyc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoY2hhciBvY3RlY3QpCisgICAgeworICAgICAgICByZXR1cm4gKG9jdGVjdCA9PSAweDIwIHx8IG9jdGVjdCA9PSAweGQgfHwgb2N0ZWN0ID09IDB4YSB8fCBvY3RlY3QgPT0gMHg5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGFkKGNoYXIgb2N0ZWN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChvY3RlY3QgPT0gUEFEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGF0YShjaGFyIG9jdGVjdCkKKyAgICB7CisgICAgICAgIHJldHVybiAob2N0ZWN0IDwgQkFTRUxFTkdUSCAmJiBiYXNlNjRBbHBoYWJldFtvY3RlY3RdICE9IC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIGhleCBvY3RlY3RzIGludG8gQmFzZTY0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBBcnJheSBjb250YWluaW5nIGJpbmFyeURhdGEKKyAgICAgKiBAcmV0dXJuIEVuY29kZWQgQmFzZTY0IGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKGJ5dGVbXSBiaW5hcnlEYXRhKQorICAgIHsKKyAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbGVuZ3RoRGF0YUJpdHMgPSBiaW5hcnlEYXRhLmxlbmd0aCAqIEVJR0hUQklUOworICAgICAgICBpZiAobGVuZ3RoRGF0YUJpdHMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZld2VyVGhhbjI0Yml0cyA9IGxlbmd0aERhdGFCaXRzICUgVFdFTlRZRk9VUkJJVEdST1VQOworICAgICAgICBpbnQgbnVtYmVyVHJpcGxldHMgPSBsZW5ndGhEYXRhQml0cyAvIFRXRU5UWUZPVVJCSVRHUk9VUDsKKyAgICAgICAgaW50IG51bWJlclF1YXJ0ZXQgPSBmZXdlclRoYW4yNGJpdHMgIT0gMCA/IG51bWJlclRyaXBsZXRzICsgMSA6IG51bWJlclRyaXBsZXRzOworICAgICAgICBjaGFyIGVuY29kZWREYXRhW10gPSBudWxsOworCisgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGNoYXJbbnVtYmVyUXVhcnRldCAqIDRdOworCisgICAgICAgIGJ5dGUgayA9IDAsIGwgPSAwLCBiMSA9IDAsIGIyID0gMCwgYjMgPSAwOworCisgICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOworICAgICAgICBpbnQgZGF0YUluZGV4ID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlclRyaXBsZXRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXgrK107CisgICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4KytdOworICAgICAgICAgICAgYjMgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCsrXTsKKworICAgICAgICAgICAgbCA9IChieXRlKSAoYjIgJiAweDBmKTsKKyAgICAgICAgICAgIGsgPSAoYnl0ZSkgKGIxICYgMHgwMyk7CisKKyAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKSA9PSAwKSA/IChieXRlKSAoYjEgPj4gMikgOiAoYnl0ZSkgKChiMSkgPj4gMiBeIDB4YzApOworICAgICAgICAgICAgYnl0ZSB2YWwyID0gKChiMiAmIFNJR04pID09IDApID8gKGJ5dGUpIChiMiA+PiA0KSA6IChieXRlKSAoKGIyKSA+PiA0IF4gMHhmMCk7CisgICAgICAgICAgICBieXRlIHZhbDMgPSAoKGIzICYgU0lHTikgPT0gMCkgPyAoYnl0ZSkgKGIzID4+IDYpIDogKGJ5dGUpICgoYjMpID4+IDYgXiAweGZjKTsKKworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbdmFsMV07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSBsb29rVXBCYXNlNjRBbHBoYWJldFt2YWwyIHwgKGsgPDwgNCldOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbKGwgPDwgMikgfCB2YWwzXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0W2IzICYgMHgzZl07CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JtIGludGVncmFsIG51bWJlciBvZiA2LWJpdCBncm91cHMKKyAgICAgICAgaWYgKGZld2VyVGhhbjI0Yml0cyA9PSBFSUdIVEJJVCkKKyAgICAgICAgeworICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07CisgICAgICAgICAgICBrID0gKGJ5dGUpIChiMSAmIDB4MDMpOworICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pID09IDApID8gKGJ5dGUpIChiMSA+PiAyKSA6IChieXRlKSAoKGIxKSA+PiAyIF4gMHhjMCk7CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSBsb29rVXBCYXNlNjRBbHBoYWJldFt2YWwxXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0W2sgPDwgNF07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSBQQUQ7CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSBQQUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmV3ZXJUaGFuMjRiaXRzID09IFNJWFRFRU5CSVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOworICAgICAgICAgICAgYjIgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArIDFdOworICAgICAgICAgICAgbCA9IChieXRlKSAoYjIgJiAweDBmKTsKKyAgICAgICAgICAgIGsgPSAoYnl0ZSkgKGIxICYgMHgwMyk7CisKKyAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKSA9PSAwKSA/IChieXRlKSAoYjEgPj4gMikgOiAoYnl0ZSkgKChiMSkgPj4gMiBeIDB4YzApOworICAgICAgICAgICAgYnl0ZSB2YWwyID0gKChiMiAmIFNJR04pID09IDApID8gKGJ5dGUpIChiMiA+PiA0KSA6IChieXRlKSAoKGIyKSA+PiA0IF4gMHhmMCk7CisKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0W3ZhbDFdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbdmFsMiB8IChrIDw8IDQpXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0W2wgPDwgMl07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSBQQUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZW5jb2RlZERhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgQmFzZTY0IGRhdGEgaW50byBvY3RlY3RzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RlZCBzdHJpbmcgY29udGFpbmluZyBCYXNlNjQgZGF0YQorICAgICAqIEByZXR1cm4gQXJyYXkgY29udGFpbmluZCBkZWNvZGVkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBlbmNvZGVkKQorICAgIHsKKyAgICAgICAgaWYgKGVuY29kZWQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gYmFzZTY0RGF0YSA9IGVuY29kZWQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgLy8gcmVtb3ZlIHdoaXRlIHNwYWNlcworICAgICAgICBpbnQgbGVuID0gcmVtb3ZlV2hpdGVTcGFjZShiYXNlNjREYXRhKTsKKworICAgICAgICBpZiAobGVuICUgRk9VUkJZVEUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly8gc2hvdWxkIGJlIGRpdmlzaWJsZSBieSBmb3VyCisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtYmVyUXVhZHJ1cGxlID0gKGxlbiAvIEZPVVJCWVRFKTsKKworICAgICAgICBpZiAobnVtYmVyUXVhZHJ1cGxlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGUgZGVjb2RlZERhdGFbXSA9IG51bGw7CisgICAgICAgIGJ5dGUgYjEgPSAwLCBiMiA9IDAsIGIzID0gMCwgYjQgPSAwOworICAgICAgICBjaGFyIGQxID0gMCwgZDIgPSAwLCBkMyA9IDAsIGQ0ID0gMDsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOworICAgICAgICBpbnQgZGF0YUluZGV4ID0gMDsKKyAgICAgICAgZGVjb2RlZERhdGEgPSBuZXcgYnl0ZVsobnVtYmVyUXVhZHJ1cGxlKSAqIDNdOworCisgICAgICAgIGZvciAoOyBpIDwgbnVtYmVyUXVhZHJ1cGxlIC0gMTsgaSsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmICghaXNEYXRhKChkMSA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSkgfHwgIWlzRGF0YSgoZDIgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkpCisgICAgICAgICAgICAgICAgICAgIHx8ICFpc0RhdGEoKGQzID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pKSB8fCAhaXNEYXRhKChkNCA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IC8vIGlmIGZvdW5kICJubyBkYXRhIiBqdXN0IHJldHVybiBudWxsCisKKyAgICAgICAgICAgIGIxID0gYmFzZTY0QWxwaGFiZXRbZDFdOworICAgICAgICAgICAgYjIgPSBiYXNlNjRBbHBoYWJldFtkMl07CisgICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0W2QzXTsKKyAgICAgICAgICAgIGI0ID0gYmFzZTY0QWxwaGFiZXRbZDRdOworCisgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkgKGIxIDw8IDIgfCBiMiA+PiA0KTsKKyAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSAoKChiMiAmIDB4ZikgPDwgNCkgfCAoKGIzID4+IDIpICYgMHhmKSk7CisgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkgKGIzIDw8IDYgfCBiNCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRGF0YSgoZDEgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkpIHx8ICFpc0RhdGEoKGQyID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly8gaWYgZm91bmQgIm5vIGRhdGEiIGp1c3QgcmV0dXJuIG51bGwKKyAgICAgICAgfQorCisgICAgICAgIGIxID0gYmFzZTY0QWxwaGFiZXRbZDFdOworICAgICAgICBiMiA9IGJhc2U2NEFscGhhYmV0W2QyXTsKKworICAgICAgICBkMyA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdOworICAgICAgICBkNCA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdOworICAgICAgICBpZiAoIWlzRGF0YSgoZDMpKSB8fCAhaXNEYXRhKChkNCkpKQorICAgICAgICB7Ly8gQ2hlY2sgaWYgdGhleSBhcmUgUEFEIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGlmIChpc1BhZChkMykgJiYgaXNQYWQoZDQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweGYpICE9IDApLy8gbGFzdCA0IGJpdHMgc2hvdWxkIGJlIHplcm8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbaSAqIDMgKyAxXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRlY29kZWREYXRhLCAwLCB0bXAsIDAsIGkgKiAzKTsKKyAgICAgICAgICAgICAgICB0bXBbZW5jb2RlZEluZGV4XSA9IChieXRlKSAoYjEgPDwgMiB8IGIyID4+IDQpOworICAgICAgICAgICAgICAgIHJldHVybiB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghaXNQYWQoZDMpICYmIGlzUGFkKGQ0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0W2QzXTsKKyAgICAgICAgICAgICAgICBpZiAoKGIzICYgMHgzKSAhPSAwKS8vIGxhc3QgMiBiaXRzIHNob3VsZCBiZSB6ZXJvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2kgKiAzICsgMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkZWNvZGVkRGF0YSwgMCwgdG1wLCAwLCBpICogMyk7CisgICAgICAgICAgICAgICAgdG1wW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSAoYjEgPDwgMiB8IGIyID4+IDQpOworICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXhdID0gKGJ5dGUpICgoKGIyICYgMHhmKSA8PCA0KSB8ICgoYjMgPj4gMikgJiAweGYpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyBObyBQQUQgZS5nIDNjUWwKKyAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbZDNdOworICAgICAgICAgICAgYjQgPSBiYXNlNjRBbHBoYWJldFtkNF07CisgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkgKGIxIDw8IDIgfCBiMiA+PiA0KTsKKyAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSAoKChiMiAmIDB4ZikgPDwgNCkgfCAoKGIzID4+IDIpICYgMHhmKSk7CisgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkgKGIzIDw8IDYgfCBiNCk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIFdoaXRlU3BhY2UgZnJvbSBNSU1FIGNvbnRhaW5pbmcgZW5jb2RlZCBCYXNlNjQgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBieXRlIGFycmF5IG9mIGJhc2U2NCBkYXRhICh3aXRoIFdTKQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBsZW5ndGgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVtb3ZlV2hpdGVTcGFjZShjaGFyW10gZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gY291bnQgY2hhcmFjdGVycyB0aGF0J3Mgbm90IHdoaXRlc3BhY2UKKyAgICAgICAgaW50IG5ld1NpemUgPSAwOworICAgICAgICBpbnQgbGVuID0gZGF0YS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGRhdGFbaV0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGFbbmV3U2l6ZSsrXSA9IGRhdGFbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld1NpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9zaWduL01kNVV0aWxzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3NpZ24vTWQ1VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWM1OGRiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9zaWduL01kNVV0aWxzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLnNpZ247CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogTWQ15Yqg5a+G5pa55rOVCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIE1kNVV0aWxzCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1kNVV0aWxzLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBtZDUoU3RyaW5nIHMpCisgICAgeworICAgICAgICBNZXNzYWdlRGlnZXN0IGFsZ29yaXRobTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFsZ29yaXRobSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICAgICAgYWxnb3JpdGhtLnJlc2V0KCk7CisgICAgICAgICAgICBhbGdvcml0aG0udXBkYXRlKHMuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICAgICAgYnl0ZVtdIG1lc3NhZ2VEaWdlc3QgPSBhbGdvcml0aG0uZGlnZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZURpZ2VzdDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiTUQ1IEVycm9yLi4uIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRvSGV4KGJ5dGUgaGFzaFtdKQorICAgIHsKKyAgICAgICAgaWYgKGhhc2ggPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoaGFzaC5sZW5ndGggKiAyKTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhc2gubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaGFzaFtpXSAmIDB4ZmYpIDwgMHgxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKExvbmcudG9TdHJpbmcoaGFzaFtpXSAmIDB4ZmYsIDE2KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhhc2goU3RyaW5nIHMpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodG9IZXgobWQ1KHMpKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIm5vdCBzdXBwb3J0ZWQgY2hhcnNldC4uLnt9IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvc3ByaW5nL1NwcmluZ1V0aWxzLmphdmEgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3NwcmluZy9TcHJpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTBlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3NwcmluZy9TcHJpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24udXRpbHMuc3ByaW5nOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5hb3AuZnJhbWV3b3JrLkFvcENvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5CZWFuRmFjdG9yeVBvc3RQcm9jZXNzb3I7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmNvbmZpZy5Db25maWd1cmFibGVMaXN0YWJsZUJlYW5GYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dEF3YXJlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBzcHJpbmflt6Xlhbfnsbsg5pa55L6/5Zyo6Z2ec3ByaW5n566h55CG546v5aKD5Lit6I635Y+WYmVhbgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK3B1YmxpYyBmaW5hbCBjbGFzcyBTcHJpbmdVdGlscyBpbXBsZW1lbnRzIEJlYW5GYWN0b3J5UG9zdFByb2Nlc3NvciwgQXBwbGljYXRpb25Db250ZXh0QXdhcmUgCit7CisgICAgLyoqIFNwcmluZ+W6lOeUqOS4iuS4i+aWh+eOr+WigyAqLworICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYWJsZUxpc3RhYmxlQmVhbkZhY3RvcnkgYmVhbkZhY3Rvcnk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkNvbnRleHQgYXBwbGljYXRpb25Db250ZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdFByb2Nlc3NCZWFuRmFjdG9yeShDb25maWd1cmFibGVMaXN0YWJsZUJlYW5GYWN0b3J5IGJlYW5GYWN0b3J5KSB0aHJvd3MgQmVhbnNFeGNlcHRpb24gCisgICAgeworICAgICAgICBTcHJpbmdVdGlscy5iZWFuRmFjdG9yeSA9IGJlYW5GYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uQ29udGV4dChBcHBsaWNhdGlvbkNvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KSB0aHJvd3MgQmVhbnNFeGNlcHRpb24gCisgICAgeworICAgICAgICBTcHJpbmdVdGlscy5hcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a+56LGhCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEByZXR1cm4gT2JqZWN0IOS4gOS4quS7peaJgOe7meWQjeWtl+azqOWGjOeahGJlYW7nmoTlrp7kvosKKyAgICAgKiBAdGhyb3dzIG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuQmVhbnNFeGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0QmVhbihTdHJpbmcgbmFtZSkgdGhyb3dzIEJlYW5zRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gKFQpIGJlYW5GYWN0b3J5LmdldEJlYW4obmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W57G75Z6L5Li6cmVxdWlyZWRUeXBl55qE5a+56LGhCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2x6CisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3Mgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRCZWFuKENsYXNzPFQ+IGNseikgdGhyb3dzIEJlYW5zRXhjZXB0aW9uCisgICAgeworICAgICAgICBUIHJlc3VsdCA9IChUKSBiZWFuRmFjdG9yeS5nZXRCZWFuKGNseik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog5aaC5p6cQmVhbkZhY3RvcnnljIXlkKvkuIDkuKrkuI7miYDnu5nlkI3np7DljLnphY3nmoRiZWFu5a6a5LmJ77yM5YiZ6L+U5ZuedHJ1ZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNCZWFuKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJlYW5GYWN0b3J5LmNvbnRhaW5zQmVhbihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3ku6Xnu5nlrprlkI3lrZfms6jlhoznmoRiZWFu5a6a5LmJ5piv5LiA5Liqc2luZ2xldG9u6L+Y5piv5LiA5LiqcHJvdG90eXBl44CCIOWmguaenOS4jue7meWumuWQjeWtl+ebuOW6lOeahGJlYW7lrprkuYnmsqHmnInooqvmib7liLDvvIzlsIbkvJrmipvlh7rkuIDkuKrlvILluLjvvIhOb1N1Y2hCZWFuRGVmaW5pdGlvbkV4Y2VwdGlvbu+8iQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKiBAdGhyb3dzIG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5Ob1N1Y2hCZWFuRGVmaW5pdGlvbkV4Y2VwdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2luZ2xldG9uKFN0cmluZyBuYW1lKSB0aHJvd3MgTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBiZWFuRmFjdG9yeS5pc1NpbmdsZXRvbihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEByZXR1cm4gQ2xhc3Mg5rOo5YaM5a+56LGh55qE57G75Z6LCisgICAgICogQHRocm93cyBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0VHlwZShTdHJpbmcgbmFtZSkgdGhyb3dzIE5vU3VjaEJlYW5EZWZpbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gYmVhbkZhY3RvcnkuZ2V0VHlwZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlpoLmnpznu5nlrprnmoRiZWFu5ZCN5a2X5ZyoYmVhbuWumuS5ieS4reacieWIq+WQje+8jOWImei/lOWbnui/meS6m+WIq+WQjQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRocm93cyBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuTm9TdWNoQmVhbkRlZmluaXRpb25FeGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxpYXNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIE5vU3VjaEJlYW5EZWZpbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gYmVhbkZhY3RvcnkuZ2V0QWxpYXNlcyhuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5Zhb3Dku6PnkIblr7nosaEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW52b2tlcgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldEFvcFByb3h5KFQgaW52b2tlcikKKyAgICB7CisgICAgICAgIHJldHVybiAoVCkgQW9wQ29udGV4dC5jdXJyZW50UHJveHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blvZPliY3nmoTnjq/looPphY3nva7vvIzml6DphY3nva7ov5Tlm55udWxsCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOW9k+WJjeeahOeOr+Wig+mFjee9rgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWN0aXZlUHJvZmlsZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRFbnZpcm9ubWVudCgpLmdldEFjdGl2ZVByb2ZpbGVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5b2T5YmN55qE546v5aKD6YWN572u77yM5b2T5pyJ5aSa5Liq546v5aKD6YWN572u5pe277yM5Y+q6I635Y+W56ys5LiA5LiqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOW9k+WJjeeahOeOr+Wig+mFjee9rgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2ZVByb2ZpbGUoKQorICAgIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gYWN0aXZlUHJvZmlsZXMgPSBnZXRBY3RpdmVQcm9maWxlcygpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShhY3RpdmVQcm9maWxlcykgPyBhY3RpdmVQcm9maWxlc1swXSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6YWN572u5paH5Lu25Lit55qE5YC8CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IOmFjee9ruaWh+S7tueahGtleQorICAgICAqIEByZXR1cm4g5b2T5YmN55qE6YWN572u5paH5Lu255qE5YC8CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXF1aXJlZFByb3BlcnR5KFN0cmluZyBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb25Db250ZXh0LmdldEVudmlyb25tZW50KCkuZ2V0UmVxdWlyZWRQcm9wZXJ0eShrZXkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvc3FsL1NxbFV0aWwuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvc3FsL1NxbFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFjN2RjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy9zcWwvU3FsVXRpbC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcWw7CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5VdGlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICogc3Fs5pON5L2c5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFNxbFV0aWwKK3sKKyAgICAvKioKKyAgICAgKiDlrprkuYnluLjnlKjnmoQgc3Fs5YWz6ZSu5a2XCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1FMX1JFR0VYID0gImFuZCB8ZXh0cmFjdHZhbHVlfHVwZGF0ZXhtbHxzbGVlcHxleGVjIHxpbnNlcnQgfHNlbGVjdCB8ZGVsZXRlIHx1cGRhdGUgfGRyb3AgfGNvdW50IHxjaHIgfG1pZCB8bWFzdGVyIHx0cnVuY2F0ZSB8Y2hhciB8ZGVjbGFyZSB8b3IgfHVuaW9uIHxsaWtlIHwrfC8qfHVzZXIoKSI7CisKKyAgICAvKioKKyAgICAgKiDku4XmlK/mjIHlrZfmr43jgIHmlbDlrZfjgIHkuIvliJLnur/jgIHnqbrmoLzjgIHpgJflj7fjgIHlsI/mlbDngrnvvIjmlK/mjIHlpJrkuKrlrZfmrrXmjpLluo/vvIkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUUxfUEFUVEVSTiA9ICJbYS16QS1aMC05X1xcIFxcLFxcLl0rIjsKKworICAgIC8qKgorICAgICAqIOmZkOWItm9yZGVyQnnmnIDlpKfplb/luqYKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfQllfTUFYX0xFTkdUSCA9IDUwMDsKKworICAgIC8qKgorICAgICAqIOajgOafpeWtl+espu+8jOmYsuatouazqOWFpee7lei/hworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZU9yZGVyQnlTcWwoU3RyaW5nIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodmFsdWUpICYmICFpc1ZhbGlkT3JkZXJCeVNxbCh2YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKCLlj4LmlbDkuI3nrKblkIjop4TojIPvvIzkuI3og73ov5vooYzmn6Xor6IiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RyaW5nVXRpbHMubGVuZ3RoKHZhbHVlKSA+IE9SREVSX0JZX01BWF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVdGlsRXhjZXB0aW9uKCLlj4LmlbDlt7LotoXov4fmnIDlpKfpmZDliLbvvIzkuI3og73ov5vooYzmn6Xor6IiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6aqM6K+BIG9yZGVyIGJ5IOivreazleaYr+WQpuespuWQiOinhOiMgworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkT3JkZXJCeVNxbChTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUubWF0Y2hlcyhTUUxfUEFUVEVSTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU1FM5YWz6ZSu5a2X5qOA5p+lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbHRlcktleXdvcmQoU3RyaW5nIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gc3FsS2V5d29yZHMgPSBTdHJpbmdVdGlscy5zcGxpdChTUUxfUkVHRVgsICJcXHwiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgc3FsS2V5d29yZCA6IHNxbEtleXdvcmRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaW5kZXhPZklnbm9yZUNhc2UodmFsdWUsIHNxbEtleXdvcmQpID4gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFV0aWxFeGNlcHRpb24oIuWPguaVsOWtmOWcqFNRTOazqOWFpemjjumZqSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy91dWlkL0lkVXRpbHMuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvdXVpZC9JZFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4NDQyNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvdXVpZC9JZFV0aWxzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLnV1aWQ7CisKKy8qKgorICogSUTnlJ/miJDlmajlt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgSWRVdGlscworeworICAgIC8qKgorICAgICAqIOiOt+WPlumaj+aculVVSUQKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOmaj+aculVVSUQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByYW5kb21VVUlEKCkKKyAgICB7CisgICAgICAgIHJldHVybiBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOeugOWMlueahFVVSUTvvIzljrvmjonkuobmqKrnur8KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOeugOWMlueahFVVSUTvvIzljrvmjonkuobmqKrnur8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaW1wbGVVVUlEKCkKKyAgICB7CisgICAgICAgIHJldHVybiBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpmo/mnLpVVUlE77yM5L2/55So5oCn6IO95pu05aW955qEVGhyZWFkTG9jYWxSYW5kb23nlJ/miJBVVUlECisgICAgICogCisgICAgICogQHJldHVybiDpmo/mnLpVVUlECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFzdFVVSUQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFVVSUQuZmFzdFVVSUQoKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOeugOWMlueahFVVSUTvvIzljrvmjonkuobmqKrnur/vvIzkvb/nlKjmgKfog73mm7Tlpb3nmoRUaHJlYWRMb2NhbFJhbmRvbeeUn+aIkFVVSUQKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOeugOWMlueahFVVSUTvvIzljrvmjonkuobmqKrnur8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYXN0U2ltcGxlVVVJRCgpCisgICAgeworICAgICAgICByZXR1cm4gVVVJRC5mYXN0VVVJRCgpLnRvU3RyaW5nKHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvdXVpZC9TZXEuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24vdXRpbHMvdXVpZC9TZXEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk5NjExCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy91dWlkL1NlcS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi51dGlscy51dWlkOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIHJ1b3lpIOW6j+WIl+eUn+aIkOexuworICovCitwdWJsaWMgY2xhc3MgU2VxCit7CisgICAgLy8g6YCa55So5bqP5YiX57G75Z6LCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29tbVNlcVR5cGUgPSAiQ09NTU9OIjsKKworICAgIC8vIOS4iuS8oOW6j+WIl+exu+WeiworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVwbG9hZFNlcVR5cGUgPSAiVVBMT0FEIjsKKworICAgIC8vIOmAmueUqOaOpeWPo+W6j+WIl+aVsAorICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgY29tbVNlcSA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworCisgICAgLy8g5LiK5Lyg5o6l5Y+j5bqP5YiX5pWwCisgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciB1cGxvYWRTZXEgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKKworICAgIC8vIOacuuWZqOagh+ivhgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtYWNoaW5lQ29kZSA9ICJBIjsKKworICAgIC8qKgorICAgICAqIOiOt+WPlumAmueUqOW6j+WIl+WPtworICAgICAqIAorICAgICAqIEByZXR1cm4g5bqP5YiX5YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldElkKGNvbW1TZXFUeXBlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICog6buY6K6kMTbkvY3luo/liJflj7cgeXlNTWRkSEhtbXNzICsg5LiA5L2N5py65Zmo5qCH6K+GICsgM+mVv+W6puW+queOr+mAkuWinuWtl+espuS4sgorICAgICAqIAorICAgICAqIEByZXR1cm4g5bqP5YiX5YC8CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWQoU3RyaW5nIHR5cGUpCisgICAgeworICAgICAgICBBdG9taWNJbnRlZ2VyIGF0b21pY0ludCA9IGNvbW1TZXE7CisgICAgICAgIGlmICh1cGxvYWRTZXFUeXBlLmVxdWFscyh0eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXRvbWljSW50ID0gdXBsb2FkU2VxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRJZChhdG9taWNJbnQsIDMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmueUqOaOpeWPo+W6j+WIl+WPtyB5eU1NZGRISG1tc3MgKyDkuIDkvY3mnLrlmajmoIfor4YgKyBsZW5ndGjplb/luqblvqrnjq/pgJLlop7lrZfnrKbkuLIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXRvbWljSW50IOW6j+WIl+aVsAorICAgICAqIEBwYXJhbSBsZW5ndGgg5pWw5YC86ZW/5bqmCisgICAgICogQHJldHVybiDluo/liJflgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJZChBdG9taWNJbnRlZ2VyIGF0b21pY0ludCwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBEYXRlVXRpbHMuZGF0ZVRpbWVOb3coKTsKKyAgICAgICAgcmVzdWx0ICs9IG1hY2hpbmVDb2RlOworICAgICAgICByZXN1bHQgKz0gZ2V0U2VxKGF0b21pY0ludCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDluo/liJflvqrnjq/pgJLlop7lrZfnrKbkuLJbMSwgMTAg55qEIChsZW5ndGgp5bmC5qyh5pa5KSwg55SoMOW3puihpem9kGxlbmd0aOS9jeaVsAorICAgICAqIAorICAgICAqIEByZXR1cm4g5bqP5YiX5YC8CisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZyBnZXRTZXEoQXRvbWljSW50ZWdlciBhdG9taWNJbnQsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICAvLyDlhYjlj5blgLzlho0rMQorICAgICAgICBpbnQgdmFsdWUgPSBhdG9taWNJbnQuZ2V0QW5kSW5jcmVtZW50KCk7CisKKyAgICAgICAgLy8g5aaC5p6c5pu05paw5ZCO5YC8Pj0xMCDnmoQgKGxlbmd0aCnluYLmrKHmlrnliJnph43nva7kuLoxCisgICAgICAgIGludCBtYXhTZXEgPSAoaW50KSBNYXRoLnBvdygxMCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKGF0b21pY0ludC5nZXQoKSA+PSBtYXhTZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF0b21pY0ludC5zZXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8g6L2s5a2X56ym5Liy77yM55SoMOW3puihpem9kAorICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMucGFkbCh2YWx1ZSwgbGVuZ3RoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3V0aWxzL3V1aWQvVVVJRC5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy91dWlkL1VVSUQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTU4NWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi91dGlscy91dWlkL1VVSUQuamF2YQpAQCAtMCwwICsxLDQ4NCBAQAorcGFja2FnZSBjb20ucnVveWkuY29tbW9uLnV0aWxzLnV1aWQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5VdGlsRXhjZXB0aW9uOworCisvKioKKyAqIOaPkOS+m+mAmueUqOWUr+S4gOivhuWIq+egge+8iHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVy77yJ77yIVVVJRO+8ieWunueOsAorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVVSUQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ29tcGFyYWJsZTxVVUlEPgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTg1MDE1MTQzNjU0NzQ0MTQwTDsKKworICAgIC8qKgorICAgICAqIFNlY3VyZVJhbmRvbSDnmoTljZXkvosKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhvbGRlcgorICAgIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFNlY3VyZVJhbmRvbSBudW1iZXJHZW5lcmF0b3IgPSBnZXRTZWN1cmVSYW5kb20oKTsKKyAgICB9CisKKyAgICAvKiog5q2kVVVJROeahOacgOmrmDY05pyJ5pWI5L2NICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1vc3RTaWdCaXRzOworCisgICAgLyoqIOatpFVVSUTnmoTmnIDkvY42NOacieaViOS9jSAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsZWFzdFNpZ0JpdHM7CisKKyAgICAvKioKKyAgICAgKiDnp4HmnInmnoTpgKAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YSDmlbDmja4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVVSUQoYnl0ZVtdIGRhdGEpCisgICAgeworICAgICAgICBsb25nIG1zYiA9IDA7CisgICAgICAgIGxvbmcgbHNiID0gMDsKKyAgICAgICAgYXNzZXJ0IGRhdGEubGVuZ3RoID09IDE2IDogImRhdGEgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGgiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbXNiID0gKG1zYiA8PCA4KSB8IChkYXRhW2ldICYgMHhmZik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDg7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsc2IgPSAobHNiIDw8IDgpIHwgKGRhdGFbaV0gJiAweGZmKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1vc3RTaWdCaXRzID0gbXNiOworICAgICAgICB0aGlzLmxlYXN0U2lnQml0cyA9IGxzYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkvb/nlKjmjIflrprnmoTmlbDmja7mnoTpgKDmlrDnmoQgVVVJROOAggorICAgICAqCisgICAgICogQHBhcmFtIG1vc3RTaWdCaXRzIOeUqOS6jiB7QGNvZGUgVVVJRH0g55qE5pyA6auY5pyJ5pWIIDY0IOS9jQorICAgICAqIEBwYXJhbSBsZWFzdFNpZ0JpdHMg55So5LqOIHtAY29kZSBVVUlEfSDnmoTmnIDkvY7mnInmlYggNjQg5L2NCisgICAgICovCisgICAgcHVibGljIFVVSUQobG9uZyBtb3N0U2lnQml0cywgbG9uZyBsZWFzdFNpZ0JpdHMpCisgICAgeworICAgICAgICB0aGlzLm1vc3RTaWdCaXRzID0gbW9zdFNpZ0JpdHM7CisgICAgICAgIHRoaXMubGVhc3RTaWdCaXRzID0gbGVhc3RTaWdCaXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluexu+WeiyA077yI5Lyq6ZqP5py655Sf5oiQ55qE77yJVVVJRCDnmoTpnZnmgIHlt6XljoLjgIIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOmaj+acuueUn+aIkOeahCB7QGNvZGUgVVVJRH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVVSUQgZmFzdFVVSUQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbVVVSUQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluexu+WeiyA077yI5Lyq6ZqP5py655Sf5oiQ55qE77yJVVVJRCDnmoTpnZnmgIHlt6XljoLjgIIg5L2/55So5Yqg5a+G55qE5by65Lyq6ZqP5py65pWw55Sf5oiQ5Zmo55Sf5oiQ6K+lIFVVSUTjgIIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOmaj+acuueUn+aIkOeahCB7QGNvZGUgVVVJRH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVVSUQgcmFuZG9tVVVJRCgpCisgICAgeworICAgICAgICByZXR1cm4gcmFuZG9tVVVJRCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnsbvlnosgNO+8iOS8qumaj+acuueUn+aIkOeahO+8iVVVSUQg55qE6Z2Z5oCB5bel5Y6C44CCIOS9v+eUqOWKoOWvhueahOW8uuS8qumaj+acuuaVsOeUn+aIkOWZqOeUn+aIkOivpSBVVUlE44CCCisgICAgICogCisgICAgICogQHBhcmFtIGlzU2VjdXJlIOaYr+WQpuS9v+eUqHtAbGluayBTZWN1cmVSYW5kb2195aaC5p6c5piv5Y+v5Lul6I635b6X5pu05a6J5YWo55qE6ZqP5py656CB77yM5ZCm5YiZ5Y+v5Lul5b6X5Yiw5pu05aW955qE5oCn6IO9CisgICAgICogQHJldHVybiDpmo/mnLrnlJ/miJDnmoQge0Bjb2RlIFVVSUR9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVVUlEIHJhbmRvbVVVSUQoYm9vbGVhbiBpc1NlY3VyZSkKKyAgICB7CisgICAgICAgIGZpbmFsIFJhbmRvbSBuZyA9IGlzU2VjdXJlID8gSG9sZGVyLm51bWJlckdlbmVyYXRvciA6IGdldFJhbmRvbSgpOworCisgICAgICAgIGJ5dGVbXSByYW5kb21CeXRlcyA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgbmcubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgcmFuZG9tQnl0ZXNbNl0gJj0gMHgwZjsgLyogY2xlYXIgdmVyc2lvbiAqLworICAgICAgICByYW5kb21CeXRlc1s2XSB8PSAweDQwOyAvKiBzZXQgdG8gdmVyc2lvbiA0ICovCisgICAgICAgIHJhbmRvbUJ5dGVzWzhdICY9IDB4M2Y7IC8qIGNsZWFyIHZhcmlhbnQgKi8KKyAgICAgICAgcmFuZG9tQnl0ZXNbOF0gfD0gMHg4MDsgLyogc2V0IHRvIElFVEYgdmFyaWFudCAqLworICAgICAgICByZXR1cm4gbmV3IFVVSUQocmFuZG9tQnl0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruaMh+WumueahOWtl+iKguaVsOe7hOiOt+WPluexu+WeiyAz77yI5Z+65LqO5ZCN56ew55qE77yJVVVJRCDnmoTpnZnmgIHlt6XljoLjgIIKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIOeUqOS6juaehOmAoCBVVUlEIOeahOWtl+iKguaVsOe7hOOAggorICAgICAqCisgICAgICogQHJldHVybiDmoLnmja7mjIflrprmlbDnu4TnlJ/miJDnmoQge0Bjb2RlIFVVSUR9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVVUlEIG5hbWVVVUlERnJvbUJ5dGVzKGJ5dGVbXSBuYW1lKQorICAgIHsKKyAgICAgICAgTWVzc2FnZURpZ2VzdCBtZDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBuc2FlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiTUQ1IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gbWQ1Qnl0ZXMgPSBtZC5kaWdlc3QobmFtZSk7CisgICAgICAgIG1kNUJ5dGVzWzZdICY9IDB4MGY7IC8qIGNsZWFyIHZlcnNpb24gKi8KKyAgICAgICAgbWQ1Qnl0ZXNbNl0gfD0gMHgzMDsgLyogc2V0IHRvIHZlcnNpb24gMyAqLworICAgICAgICBtZDVCeXRlc1s4XSAmPSAweDNmOyAvKiBjbGVhciB2YXJpYW50ICovCisgICAgICAgIG1kNUJ5dGVzWzhdIHw9IDB4ODA7IC8qIHNldCB0byBJRVRGIHZhcmlhbnQgKi8KKyAgICAgICAgcmV0dXJuIG5ldyBVVUlEKG1kNUJ5dGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja4ge0BsaW5rICN0b1N0cmluZygpfSDmlrnms5XkuK3mj4/ov7DnmoTlrZfnrKbkuLLmoIflh4booajnpLrlvaLlvI/liJvlu7p7QGNvZGUgVVVJRH3jgIIKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIOaMh+WumiB7QGNvZGUgVVVJRH0g5a2X56ym5LiyCisgICAgICogQHJldHVybiDlhbfmnInmjIflrprlgLznmoQge0Bjb2RlIFVVSUR9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24g5aaC5p6cIG5hbWUg5LiOIHtAbGluayAjdG9TdHJpbmd9IOS4reaPj+i/sOeahOWtl+espuS4suihqOekuuW9ouW8j+S4jeespuaKm+WHuuatpOW8guW4uAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVVUlEIGZyb21TdHJpbmcoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gbmFtZS5zcGxpdCgiLSIpOworICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggIT0gNSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBVVUlEIHN0cmluZzogIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gIjB4IiArIGNvbXBvbmVudHNbaV07CisgICAgICAgIH0KKworICAgICAgICBsb25nIG1vc3RTaWdCaXRzID0gTG9uZy5kZWNvZGUoY29tcG9uZW50c1swXSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIG1vc3RTaWdCaXRzIDw8PSAxNjsKKyAgICAgICAgbW9zdFNpZ0JpdHMgfD0gTG9uZy5kZWNvZGUoY29tcG9uZW50c1sxXSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIG1vc3RTaWdCaXRzIDw8PSAxNjsKKyAgICAgICAgbW9zdFNpZ0JpdHMgfD0gTG9uZy5kZWNvZGUoY29tcG9uZW50c1syXSkubG9uZ1ZhbHVlKCk7CisKKyAgICAgICAgbG9uZyBsZWFzdFNpZ0JpdHMgPSBMb25nLmRlY29kZShjb21wb25lbnRzWzNdKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbGVhc3RTaWdCaXRzIDw8PSA0ODsKKyAgICAgICAgbGVhc3RTaWdCaXRzIHw9IExvbmcuZGVjb2RlKGNvbXBvbmVudHNbNF0pLmxvbmdWYWx1ZSgpOworCisgICAgICAgIHJldHVybiBuZXcgVVVJRChtb3N0U2lnQml0cywgbGVhc3RTaWdCaXRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57mraQgVVVJRCDnmoQgMTI4IOS9jeWAvOS4reeahOacgOS9juacieaViCA2NCDkvY3jgIIKKyAgICAgKgorICAgICAqIEByZXR1cm4g5q2kIFVVSUQg55qEIDEyOCDkvY3lgLzkuK3nmoTmnIDkvY7mnInmlYggNjQg5L2N44CCCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxlYXN0U2lnQml0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57mraQgVVVJRCDnmoQgMTI4IOS9jeWAvOS4reeahOacgOmrmOacieaViCA2NCDkvY3jgIIKKyAgICAgKgorICAgICAqIEByZXR1cm4g5q2kIFVVSUQg55qEIDEyOCDkvY3lgLzkuK3mnIDpq5jmnInmlYggNjQg5L2N44CCCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpCisgICAgeworICAgICAgICByZXR1cm4gbW9zdFNpZ0JpdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICog5LiO5q2kIHtAY29kZSBVVUlEfSDnm7jlhbPogZTnmoTniYjmnKzlj7cuIOeJiOacrOWPt+aPj+i/sOatpCB7QGNvZGUgVVVJRH0g5piv5aaC5L2V55Sf5oiQ55qE44CCCisgICAgICogPHA+CisgICAgICog54mI5pys5Y+35YW35pyJ5Lul5LiL5ZCr5oSPOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+MSDln7rkuo7ml7bpl7TnmoQgVVVJRAorICAgICAqIDxsaT4yIERDRSDlronlhaggVVVJRAorICAgICAqIDxsaT4zIOWfuuS6juWQjeensOeahCBVVUlECisgICAgICogPGxpPjQg6ZqP5py655Sf5oiQ55qEIFVVSUQKKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiDmraQge0Bjb2RlIFVVSUR9IOeahOeJiOacrOWPtworICAgICAqLworICAgIHB1YmxpYyBpbnQgdmVyc2lvbigpCisgICAgeworICAgICAgICAvLyBWZXJzaW9uIGlzIGJpdHMgbWFza2VkIGJ5IDB4MDAwMDAwMDAwMDAwRjAwMCBpbiBNUyBsb25nCisgICAgICAgIHJldHVybiAoaW50KSAoKG1vc3RTaWdCaXRzID4+IDEyKSAmIDB4MGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS4juatpCB7QGNvZGUgVVVJRH0g55u45YWz6IGU55qE5Y+Y5L2T5Y+344CC5Y+Y5L2T5Y+35o+P6L+wIHtAY29kZSBVVUlEfSDnmoTluIPlsYDjgIIKKyAgICAgKiA8cD4KKyAgICAgKiDlj5jkvZPlj7flhbfmnInku6XkuIvlkKvmhI/vvJoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjAg5Li6IE5DUyDlkJHlkI7lhbzlrrnkv53nlZkKKyAgICAgKiA8bGk+MiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dCI+SUVURiZuYnNwO1JGQyZuYnNwOzQxMjI8L2E+KExlYWNoLVNhbHopLCDnlKjkuo7mraTnsbsKKyAgICAgKiA8bGk+NiDkv53nlZnvvIzlvq7ova/lkJHlkI7lhbzlrrkKKyAgICAgKiA8bGk+NyDkv53nlZnkvpvku6XlkI7lrprkuYnkvb/nlKgKKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiDmraQge0Bjb2RlIFVVSUR9IOebuOWFs+iBlOeahOWPmOS9k+WPtworICAgICAqLworICAgIHB1YmxpYyBpbnQgdmFyaWFudCgpCisgICAgeworICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGNvbXBvc2VkIG9mIGEgdmFyeWluZyBudW1iZXIgb2YgYml0cy4KKyAgICAgICAgLy8gMCAtIC0gUmVzZXJ2ZWQgZm9yIE5DUyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIC8vIDEgMCAtIFRoZSBJRVRGIGFrYSBMZWFjaC1TYWx6IHZhcmlhbnQgKHVzZWQgYnkgdGhpcyBjbGFzcykKKyAgICAgICAgLy8gMSAxIDAgUmVzZXJ2ZWQsIE1pY3Jvc29mdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIC8vIDEgMSAxIFJlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbi4KKyAgICAgICAgcmV0dXJuIChpbnQpICgobGVhc3RTaWdCaXRzID4+PiAoNjQgLSAobGVhc3RTaWdCaXRzID4+PiA2MikpKSAmIChsZWFzdFNpZ0JpdHMgPj4gNjMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkuI7mraQgVVVJRCDnm7jlhbPogZTnmoTml7bpl7TmiLPlgLzjgIIKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIDYwIOS9jeeahOaXtumXtOaIs+WAvOagueaNruatpCB7QGNvZGUgVVVJRH0g55qEIHRpbWVfbG9344CBdGltZV9taWQg5ZKMIHRpbWVfaGkg5a2X5q615p6E6YCg44CCPGJyPgorICAgICAqIOaJgOW+l+WIsOeahOaXtumXtOaIs+S7pSAxMDAg5q+r5b6u56eS5Li65Y2V5L2N77yM5LuOIFVUQ++8iOmAmueUqOWNj+iwg+aXtumXtO+8iSAxNTgyIOW5tCAxMCDmnIggMTUg5pel6Zu25pe25byA5aeL44CCCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiDml7bpl7TmiLPlgLzku4XlnKjlnKjln7rkuo7ml7bpl7TnmoQgVVVJRO+8iOWFtiB2ZXJzaW9uIOexu+Wei+S4uiAx77yJ5Lit5omN5pyJ5oSP5LmJ44CCPGJyPgorICAgICAqIOWmguaenOatpCB7QGNvZGUgVVVJRH0g5LiN5piv5Z+65LqO5pe26Ze055qEIFVVSUTvvIzliJnmraTmlrnms5Xmipvlh7ogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb27jgIIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24g5aaC5p6c5q2kIHtAY29kZSBVVUlEfSDkuI3mmK8gdmVyc2lvbiDkuLogMSDnmoQgVVVJROOAggorICAgICAqLworICAgIHB1YmxpYyBsb25nIHRpbWVzdGFtcCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tUaW1lQmFzZSgpOworICAgICAgICByZXR1cm4gKG1vc3RTaWdCaXRzICYgMHgwRkZGTCkgPDwgNDgvLworICAgICAgICAgICAgICAgIHwgKChtb3N0U2lnQml0cyA+PiAxNikgJiAweDBGRkZGTCkgPDwgMzIvLworICAgICAgICAgICAgICAgIHwgbW9zdFNpZ0JpdHMgPj4+IDMyOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS4juatpCBVVUlEIOebuOWFs+iBlOeahOaXtumSn+W6j+WIl+WAvOOAggorICAgICAqCisgICAgICogPHA+CisgICAgICogMTQg5L2N55qE5pe26ZKf5bqP5YiX5YC85qC55o2u5q2kIFVVSUQg55qEIGNsb2NrX3NlcSDlrZfmrrXmnoTpgKDjgIJjbG9ja19zZXEg5a2X5q6155So5LqO5L+d6K+B5Zyo5Z+65LqO5pe26Ze055qEIFVVSUQg5Lit55qE5pe26Ze05ZSv5LiA5oCn44CCCisgICAgICogPHA+CisgICAgICoge0Bjb2RlIGNsb2NrU2VxdWVuY2V9IOWAvOS7heWcqOWfuuS6juaXtumXtOeahCBVVUlE77yI5YW2IHZlcnNpb24g57G75Z6L5Li6IDHvvInkuK3miY3mnInmhI/kuYnjgIIg5aaC5p6c5q2kIFVVSUQg5LiN5piv5Z+65LqO5pe26Ze055qEIFVVSUTvvIzliJnmraTmlrnms5Xmipvlh7oKKyAgICAgKiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbuOAggorICAgICAqCisgICAgICogQHJldHVybiDmraQge0Bjb2RlIFVVSUR9IOeahOaXtumSn+W6j+WIlworICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiDlpoLmnpzmraQgVVVJRCDnmoQgdmVyc2lvbiDkuI3kuLogMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgY2xvY2tTZXF1ZW5jZSgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tUaW1lQmFzZSgpOworICAgICAgICByZXR1cm4gKGludCkgKChsZWFzdFNpZ0JpdHMgJiAweDNGRkYwMDAwMDAwMDAwMDBMKSA+Pj4gNDgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS4juatpCBVVUlEIOebuOWFs+eahOiKgueCueWAvOOAggorICAgICAqCisgICAgICogPHA+CisgICAgICogNDgg5L2N55qE6IqC54K55YC85qC55o2u5q2kIFVVSUQg55qEIG5vZGUg5a2X5q615p6E6YCg44CC5q2k5a2X5q615peo5Zyo55So5LqO5L+d5a2Y5py65Zmo55qEIElFRUUgODAyIOWcsOWdgO+8jOivpeWcsOWdgOeUqOS6jueUn+aIkOatpCBVVUlEIOS7peS/neivgeepuumXtOWUr+S4gOaAp+OAggorICAgICAqIDxwPgorICAgICAqIOiKgueCueWAvOS7heWcqOWfuuS6juaXtumXtOeahCBVVUlE77yI5YW2IHZlcnNpb24g57G75Z6L5Li6IDHvvInkuK3miY3mnInmhI/kuYnjgII8YnI+CisgICAgICog5aaC5p6c5q2kIFVVSUQg5LiN5piv5Z+65LqO5pe26Ze055qEIFVVSUTvvIzliJnmraTmlrnms5Xmipvlh7ogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb27jgIIKKyAgICAgKgorICAgICAqIEByZXR1cm4g5q2kIHtAY29kZSBVVUlEfSDnmoToioLngrnlgLwKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24g5aaC5p6c5q2kIFVVSUQg55qEIHZlcnNpb24g5LiN5Li6IDEKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBub2RlKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBjaGVja1RpbWVCYXNlKCk7CisgICAgICAgIHJldHVybiBsZWFzdFNpZ0JpdHMgJiAweDAwMDBGRkZGRkZGRkZGRkZMOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuatpHtAY29kZSBVVUlEfSDnmoTlrZfnrKbkuLLooajnjrDlvaLlvI/jgIIKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFVVSUQg55qE5a2X56ym5Liy6KGo56S65b2i5byP55Sx5q2kIEJORiDmj4/ov7DvvJoKKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIHtAY29kZQorICAgICAqIFVVSUQgICAgICAgICAgICAgICAgICAgPSA8dGltZV9sb3c+LTx0aW1lX21pZD4tPHRpbWVfaGlnaF9hbmRfdmVyc2lvbj4tPHZhcmlhbnRfYW5kX3NlcXVlbmNlPi08bm9kZT4KKyAgICAgKiB0aW1lX2xvdyAgICAgICAgICAgICAgID0gNCo8aGV4T2N0ZXQ+CisgICAgICogdGltZV9taWQgICAgICAgICAgICAgICA9IDIqPGhleE9jdGV0PgorICAgICAqIHRpbWVfaGlnaF9hbmRfdmVyc2lvbiAgPSAyKjxoZXhPY3RldD4KKyAgICAgKiB2YXJpYW50X2FuZF9zZXF1ZW5jZSAgID0gMio8aGV4T2N0ZXQ+CisgICAgICogbm9kZSAgICAgICAgICAgICAgICAgICA9IDYqPGhleE9jdGV0PgorICAgICAqIGhleE9jdGV0ICAgICAgICAgICAgICAgPSA8aGV4RGlnaXQ+PGhleERpZ2l0PgorICAgICAqIGhleERpZ2l0ICAgICAgICAgICAgICAgPSBbMC05YS1mQS1GXQorICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiA8L2Jsb2NrcXVvdGU+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIOatpHtAY29kZSBVVUlEfSDnmoTlrZfnrKbkuLLooajnjrDlvaLlvI8KKyAgICAgKiBAc2VlICN0b1N0cmluZyhib29sZWFuKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57mraR7QGNvZGUgVVVJRH0g55qE5a2X56ym5Liy6KGo546w5b2i5byP44CCCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBVVUlEIOeahOWtl+espuS4suihqOekuuW9ouW8j+eUseatpCBCTkYg5o+P6L+w77yaCisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiB7QGNvZGUKKyAgICAgKiBVVUlEICAgICAgICAgICAgICAgICAgID0gPHRpbWVfbG93Pi08dGltZV9taWQ+LTx0aW1lX2hpZ2hfYW5kX3ZlcnNpb24+LTx2YXJpYW50X2FuZF9zZXF1ZW5jZT4tPG5vZGU+CisgICAgICogdGltZV9sb3cgICAgICAgICAgICAgICA9IDQqPGhleE9jdGV0PgorICAgICAqIHRpbWVfbWlkICAgICAgICAgICAgICAgPSAyKjxoZXhPY3RldD4KKyAgICAgKiB0aW1lX2hpZ2hfYW5kX3ZlcnNpb24gID0gMio8aGV4T2N0ZXQ+CisgICAgICogdmFyaWFudF9hbmRfc2VxdWVuY2UgICA9IDIqPGhleE9jdGV0PgorICAgICAqIG5vZGUgICAgICAgICAgICAgICAgICAgPSA2KjxoZXhPY3RldD4KKyAgICAgKiBoZXhPY3RldCAgICAgICAgICAgICAgID0gPGhleERpZ2l0PjxoZXhEaWdpdD4KKyAgICAgKiBoZXhEaWdpdCAgICAgICAgICAgICAgID0gWzAtOWEtZkEtRl0KKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPC9ibG9ja3F1b3RlPgorICAgICAqCisgICAgICogQHBhcmFtIGlzU2ltcGxlIOaYr+WQpueugOWNleaooeW8j++8jOeugOWNleaooeW8j+S4uuS4jeW4pictJ+eahFVVSUTlrZfnrKbkuLIKKyAgICAgKiBAcmV0dXJuIOatpHtAY29kZSBVVUlEfSDnmoTlrZfnrKbkuLLooajnjrDlvaLlvI8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gaXNTaW1wbGUpCisgICAgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihpc1NpbXBsZSA/IDMyIDogMzYpOworICAgICAgICAvLyB0aW1lX2xvdworICAgICAgICBidWlsZGVyLmFwcGVuZChkaWdpdHMobW9zdFNpZ0JpdHMgPj4gMzIsIDgpKTsKKyAgICAgICAgaWYgKCFpc1NpbXBsZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJy0nKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aW1lX21pZAorICAgICAgICBidWlsZGVyLmFwcGVuZChkaWdpdHMobW9zdFNpZ0JpdHMgPj4gMTYsIDQpKTsKKyAgICAgICAgaWYgKCFpc1NpbXBsZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJy0nKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aW1lX2hpZ2hfYW5kX3ZlcnNpb24KKyAgICAgICAgYnVpbGRlci5hcHBlbmQoZGlnaXRzKG1vc3RTaWdCaXRzLCA0KSk7CisgICAgICAgIGlmICghaXNTaW1wbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCctJyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmFyaWFudF9hbmRfc2VxdWVuY2UKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoZGlnaXRzKGxlYXN0U2lnQml0cyA+PiA0OCwgNCkpOworICAgICAgICBpZiAoIWlzU2ltcGxlKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLScpOworICAgICAgICB9CisgICAgICAgIC8vIG5vZGUKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoZGlnaXRzKGxlYXN0U2lnQml0cywgMTIpKTsKKworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuatpCBVVUlEIOeahOWTiOW4jOeggeOAggorICAgICAqCisgICAgICogQHJldHVybiBVVUlEIOeahOWTiOW4jOeggeWAvOOAggorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgbG9uZyBoaWxvID0gbW9zdFNpZ0JpdHMgXiBsZWFzdFNpZ0JpdHM7CisgICAgICAgIHJldHVybiAoKGludCkgKGhpbG8gPj4gMzIpKSBeIChpbnQpIGhpbG87CisgICAgfQorCisgICAgLyoqCisgICAgICog5bCG5q2k5a+56LGh5LiO5oyH5a6a5a+56LGh5q+U6L6D44CCCisgICAgICogPHA+CisgICAgICog5b2T5LiU5LuF5b2T5Y+C5pWw5LiN5Li6IHtAY29kZSBudWxsfeOAgeiAjOaYr+S4gOS4qiBVVUlEIOWvueixoeOAgeWFt+acieS4juatpCBVVUlEIOebuOWQjOeahCB2YXJyaWFudOOAgeWMheWQq+ebuOWQjOeahOWAvO+8iOavj+S4gOS9jeWdh+ebuOWQjO+8ieaXtu+8jOe7k+aenOaJjeS4uiB7QGNvZGUgdHJ1ZX3jgIIKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmog6KaB5LiO5LmL5q+U6L6D55qE5a+56LGhCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOWmguaenOWvueixoeebuOWQjO+8jOWImei/lOWbniB7QGNvZGUgdHJ1ZX3vvJvlkKbliJnov5Tlm54ge0Bjb2RlIGZhbHNlfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgaWYgKChudWxsID09IG9iaikgfHwgKG9iai5nZXRDbGFzcygpICE9IFVVSUQuY2xhc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVVVJRCBpZCA9IChVVUlEKSBvYmo7CisgICAgICAgIHJldHVybiAobW9zdFNpZ0JpdHMgPT0gaWQubW9zdFNpZ0JpdHMgJiYgbGVhc3RTaWdCaXRzID09IGlkLmxlYXN0U2lnQml0cyk7CisgICAgfQorCisgICAgLy8gQ29tcGFyaXNvbiBPcGVyYXRpb25zCisKKyAgICAvKioKKyAgICAgKiDlsIbmraQgVVVJRCDkuI7mjIflrprnmoQgVVVJRCDmr5TovoPjgIIKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIOWmguaenOS4pOS4qiBVVUlEIOS4jeWQjO+8jOS4lOesrOS4gOS4qiBVVUlEIOeahOacgOmrmOacieaViOWtl+auteWkp+S6juesrOS6jOS4qiBVVUlEIOeahOWvueW6lOWtl+aute+8jOWImeesrOS4gOS4qiBVVUlEIOWkp+S6juesrOS6jOS4qiBVVUlE44CCCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsIOS4juatpCBVVUlEIOavlOi+g+eahCBVVUlECisgICAgICoKKyAgICAgKiBAcmV0dXJuIOWcqOatpCBVVUlEIOWwj+S6juOAgeetieS6juaIluWkp+S6jiB2YWwg5pe277yM5YiG5Yir6L+U5ZueIC0x44CBMCDmiJYgMeOAggorICAgICAqCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oVVVJRCB2YWwpCisgICAgeworICAgICAgICAvLyBUaGUgb3JkZXJpbmcgaXMgaW50ZW50aW9uYWxseSBzZXQgdXAgc28gdGhhdCB0aGUgVVVJRHMKKyAgICAgICAgLy8gY2FuIHNpbXBseSBiZSBudW1lcmljYWxseSBjb21wYXJlZCBhcyB0d28gbnVtYmVycworICAgICAgICByZXR1cm4gKHRoaXMubW9zdFNpZ0JpdHMgPCB2YWwubW9zdFNpZ0JpdHMgPyAtMSA6IC8vCisgICAgICAgICAgICAgICAgKHRoaXMubW9zdFNpZ0JpdHMgPiB2YWwubW9zdFNpZ0JpdHMgPyAxIDogLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmxlYXN0U2lnQml0cyA8IHZhbC5sZWFzdFNpZ0JpdHMgPyAtMSA6IC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmxlYXN0U2lnQml0cyA+IHZhbC5sZWFzdFNpZ0JpdHMgPyAxIDogLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gUHJpdmF0ZSBtZXRob2Qgc3RhcnQKKyAgICAvKioKKyAgICAgKiDov5Tlm57mjIflrprmlbDlrZflr7nlupTnmoRoZXjlgLwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsIOWAvAorICAgICAqIEBwYXJhbSBkaWdpdHMg5L2NCisgICAgICogQHJldHVybiDlgLwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlnaXRzKGxvbmcgdmFsLCBpbnQgZGlnaXRzKQorICAgIHsKKyAgICAgICAgbG9uZyBoaSA9IDFMIDw8IChkaWdpdHMgKiA0KTsKKyAgICAgICAgcmV0dXJuIExvbmcudG9IZXhTdHJpbmcoaGkgfCAodmFsICYgKGhpIC0gMSkpKS5zdWJzdHJpbmcoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qOA5p+l5piv5ZCm5Li6dGltZS1iYXNlZOeJiOacrFVVSUQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tUaW1lQmFzZSgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbigpICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGEgdGltZS1iYXNlZCBVVUlEIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5Z7QGxpbmsgU2VjdXJlUmFuZG9tfe+8jOexu+aPkOS+m+WKoOWvhueahOW8uumaj+acuuaVsOeUn+aIkOWZqCAoUk5HKQorICAgICAqIAorICAgICAqIEByZXR1cm4ge0BsaW5rIFNlY3VyZVJhbmRvbX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlY3VyZVJhbmRvbSBnZXRTZWN1cmVSYW5kb20oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoIlNIQTFQUk5HIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXRpbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlumaj+acuuaVsOeUn+aIkOWZqOWvueixoTxicj4KKyAgICAgKiBUaHJlYWRMb2NhbFJhbmRvbeaYr0pESyA35LmL5ZCO5o+Q5L6b5bm25Y+R5Lqn55Sf6ZqP5py65pWw77yM6IO95aSf6Kej5Yaz5aSa5Liq57q/56iL5Y+R55Sf55qE56ue5LqJ5LqJ5aS644CCCisgICAgICogCisgICAgICogQHJldHVybiB7QGxpbmsgVGhyZWFkTG9jYWxSYW5kb219CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJlYWRMb2NhbFJhbmRvbSBnZXRSYW5kb20oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3hzcy9Yc3MuamF2YSBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24veHNzL1hzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGI0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1jb21tb24vc3JjL21haW4vamF2YS9jb20vcnVveWkvY29tbW9uL3hzcy9Yc3MuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS5ydW95aS5jb21tb24ueHNzOworCitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLlBheWxvYWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICog6Ieq5a6a5LmJeHNz5qCh6aqM5rOo6KejCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQodmFsdWUgPSB7IEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SLCBFbGVtZW50VHlwZS5QQVJBTUVURVIgfSkKK0BDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBYc3NWYWxpZGF0b3IuY2xhc3MgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFhzcworeworICAgIFN0cmluZyBtZXNzYWdlKCkKKworICAgIGRlZmF1bHQgIuS4jeWFgeiuuOS7u+S9leiEmuacrOi/kOihjCI7CisKKyAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24veHNzL1hzc1ZhbGlkYXRvci5qYXZhIGIvcnVveWktY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2NvbW1vbi94c3MvWHNzVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4ZTRjMAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9jb21tb24veHNzL1hzc1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmNvbW1vbi54c3M7CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiDoh6rlrprkuYl4c3PmoKHpqozms6jop6Plrp7njrAKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgWHNzVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxYc3MsIFN0cmluZz4KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QQVRURVJOID0gIjwoXFxTKj8pW14+XSo+Lio/fDwuKj8gLz4iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsodmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWNvbnRhaW5zSHRtbCh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zSHRtbChTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNIdG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKEhUTUxfUEFUVEVSTik7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih2YWx1ZSk7CisgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc0h0bWwuYXBwZW5kKG1hdGNoZXIuZ3JvdXAoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdHRlcm4ubWF0Y2hlcihzSHRtbCkubWF0Y2hlcygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvcG9tLnhtbCBiL3J1b3lpLWZyYW1ld29yay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDVmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvcG9tLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4zLjguODwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5ydW95aS1mcmFtZXdvcms8L2FydGlmYWN0SWQ+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIGZyYW1ld29ya+ahhuaetuaguOW/gworICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDwhLS0gU3ByaW5nQm9vdCBXZWLlrrnlmaggLS0+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LXN0YXJ0ZXItd2ViPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBTcHJpbmdCb290IOaLpuaIquWZqCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLWFvcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0g6Zi/6YeM5pWw5o2u5bqT6L+e5o6l5rGgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5hbGliYWJhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZHJ1aWQtc3ByaW5nLWJvb3QtMy1zdGFydGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSDpqozor4HnoIEgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+cHJvLmZlc3Npb25hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmthcHRjaGE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0g6I635Y+W57O757uf5L+h5oGvIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIub3NoaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9zaGktY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0g57O757uf5qih5Z2XLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVveWktc3lzdGVtPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvYXNwZWN0ai9EYXRhU2NvcGVBc3BlY3QuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvYXNwZWN0ai9EYXRhU2NvcGVBc3BlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjMzN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL0RhdGFTY29wZUFzcGVjdC5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuYXNwZWN0ajsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5Kb2luUG9pbnQ7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5hbm5vdGF0aW9uLkFzcGVjdDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLmFubm90YXRpb24uQmVmb3JlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkRhdGFTY29wZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dC5Db252ZXJ0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsuc2VjdXJpdHkuY29udGV4dC5QZXJtaXNzaW9uQ29udGV4dEhvbGRlcjsKKworLyoqCisgKiDmlbDmja7ov4fmu6TlpITnkIYKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BBc3BlY3QKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBEYXRhU2NvcGVBc3BlY3QKK3sKKyAgICAvKioKKyAgICAgKiDlhajpg6jmlbDmja7mnYPpmZAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1NDT1BFX0FMTCA9ICIxIjsKKworICAgIC8qKgorICAgICAqIOiHquWumuaVsOaNruadg+mZkAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU0NPUEVfQ1VTVE9NID0gIjIiOworCisgICAgLyoqCisgICAgICog6YOo6Zeo5pWw5o2u5p2D6ZmQCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9TQ09QRV9ERVBUID0gIjMiOworCisgICAgLyoqCisgICAgICog6YOo6Zeo5Y+K5Lul5LiL5pWw5o2u5p2D6ZmQCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9TQ09QRV9ERVBUX0FORF9DSElMRCA9ICI0IjsKKworICAgIC8qKgorICAgICAqIOS7heacrOS6uuaVsOaNruadg+mZkAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU0NPUEVfU0VMRiA9ICI1IjsKKworICAgIC8qKgorICAgICAqIOaVsOaNruadg+mZkOi/h+a7pOWFs+mUruWtlworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU0NPUEUgPSAiZGF0YVNjb3BlIjsKKworICAgIEBCZWZvcmUoIkBhbm5vdGF0aW9uKGNvbnRyb2xsZXJEYXRhU2NvcGUpIikKKyAgICBwdWJsaWMgdm9pZCBkb0JlZm9yZShKb2luUG9pbnQgcG9pbnQsIERhdGFTY29wZSBjb250cm9sbGVyRGF0YVNjb3BlKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjbGVhckRhdGFTY29wZShwb2ludCk7CisgICAgICAgIGhhbmRsZURhdGFTY29wZShwb2ludCwgY29udHJvbGxlckRhdGFTY29wZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGF0YVNjb3BlKGZpbmFsIEpvaW5Qb2ludCBqb2luUG9pbnQsIERhdGFTY29wZSBjb250cm9sbGVyRGF0YVNjb3BlKQorICAgIHsKKyAgICAgICAgLy8g6I635Y+W5b2T5YmN55qE55So5oi3CisgICAgICAgIExvZ2luVXNlciBsb2dpblVzZXIgPSBTZWN1cml0eVV0aWxzLmdldExvZ2luVXNlcigpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGxvZ2luVXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c1VzZXIgY3VycmVudFVzZXIgPSBsb2dpblVzZXIuZ2V0VXNlcigpOworICAgICAgICAgICAgLy8g5aaC5p6c5piv6LaF57qn566h55CG5ZGY77yM5YiZ5LiN6L+H5ruk5pWw5o2uCisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGN1cnJlbnRVc2VyKSAmJiAhY3VycmVudFVzZXIuaXNBZG1pbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uID0gU3RyaW5nVXRpbHMuZGVmYXVsdElmRW1wdHkoY29udHJvbGxlckRhdGFTY29wZS5wZXJtaXNzaW9uKCksIFBlcm1pc3Npb25Db250ZXh0SG9sZGVyLmdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgZGF0YVNjb3BlRmlsdGVyKGpvaW5Qb2ludCwgY3VycmVudFVzZXIsIGNvbnRyb2xsZXJEYXRhU2NvcGUuZGVwdEFsaWFzKCksIGNvbnRyb2xsZXJEYXRhU2NvcGUudXNlckFsaWFzKCksIHBlcm1pc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5pWw5o2u6IyD5Zu06L+H5rukCisgICAgICoKKyAgICAgKiBAcGFyYW0gam9pblBvaW50IOWIh+eCuQorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaItworICAgICAqIEBwYXJhbSBkZXB0QWxpYXMg6YOo6Zeo5Yir5ZCNCisgICAgICogQHBhcmFtIHVzZXJBbGlhcyDnlKjmiLfliKvlkI0KKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiDmnYPpmZDlrZfnrKYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGF0YVNjb3BlRmlsdGVyKEpvaW5Qb2ludCBqb2luUG9pbnQsIFN5c1VzZXIgdXNlciwgU3RyaW5nIGRlcHRBbGlhcywgU3RyaW5nIHVzZXJBbGlhcywgU3RyaW5nIHBlcm1pc3Npb24pCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjb25kaXRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzY29wZUN1c3RvbUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB1c2VyLmdldFJvbGVzKCkuZm9yRWFjaChyb2xlIC0+IHsKKyAgICAgICAgICAgIGlmIChEQVRBX1NDT1BFX0NVU1RPTS5lcXVhbHMocm9sZS5nZXREYXRhU2NvcGUoKSkgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKHJvbGUuZ2V0U3RhdHVzKCksIFVzZXJDb25zdGFudHMuUk9MRV9OT1JNQUwpICYmIFN0cmluZ1V0aWxzLmNvbnRhaW5zQW55KHJvbGUuZ2V0UGVybWlzc2lvbnMoKSwgQ29udmVydC50b1N0ckFycmF5KHBlcm1pc3Npb24pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY29wZUN1c3RvbUlkcy5hZGQoQ29udmVydC50b1N0cihyb2xlLmdldFJvbGVJZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZvciAoU3lzUm9sZSByb2xlIDogdXNlci5nZXRSb2xlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YVNjb3BlID0gcm9sZS5nZXREYXRhU2NvcGUoKTsKKyAgICAgICAgICAgIGlmIChjb25kaXRpb25zLmNvbnRhaW5zKGRhdGFTY29wZSkgfHwgU3RyaW5nVXRpbHMuZXF1YWxzKHJvbGUuZ2V0U3RhdHVzKCksIFVzZXJDb25zdGFudHMuUk9MRV9ESVNBQkxFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuY29udGFpbnNBbnkocm9sZS5nZXRQZXJtaXNzaW9ucygpLCBDb252ZXJ0LnRvU3RyQXJyYXkocGVybWlzc2lvbikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERBVEFfU0NPUEVfQUxMLmVxdWFscyhkYXRhU2NvcGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNxbFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgY29uZGl0aW9ucy5hZGQoZGF0YVNjb3BlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERBVEFfU0NPUEVfQ1VTVE9NLmVxdWFscyhkYXRhU2NvcGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzY29wZUN1c3RvbUlkcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g5aSa5Liq6Ieq5a6a5pWw5o2u5p2D6ZmQ5L2/55SoaW7mn6Xor6LvvIzpgb/lhY3lpJrmrKHmi7zmjqXjgIIKKyAgICAgICAgICAgICAgICAgICAgc3FsU3RyaW5nLmFwcGVuZChTdHJpbmdVdGlscy5mb3JtYXQoIiBPUiB7fS5kZXB0X2lkIElOICggU0VMRUNUIGRlcHRfaWQgRlJPTSBzeXNfcm9sZV9kZXB0IFdIRVJFIHJvbGVfaWQgaW4gKHt9KSApICIsIGRlcHRBbGlhcywgU3RyaW5nLmpvaW4oIiwiLCBzY29wZUN1c3RvbUlkcykpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3FsU3RyaW5nLmFwcGVuZChTdHJpbmdVdGlscy5mb3JtYXQoIiBPUiB7fS5kZXB0X2lkIElOICggU0VMRUNUIGRlcHRfaWQgRlJPTSBzeXNfcm9sZV9kZXB0IFdIRVJFIHJvbGVfaWQgPSB7fSApICIsIGRlcHRBbGlhcywgcm9sZS5nZXRSb2xlSWQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERBVEFfU0NPUEVfREVQVC5lcXVhbHMoZGF0YVNjb3BlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcWxTdHJpbmcuYXBwZW5kKFN0cmluZ1V0aWxzLmZvcm1hdCgiIE9SIHt9LmRlcHRfaWQgPSB7fSAiLCBkZXB0QWxpYXMsIHVzZXIuZ2V0RGVwdElkKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERBVEFfU0NPUEVfREVQVF9BTkRfQ0hJTEQuZXF1YWxzKGRhdGFTY29wZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3FsU3RyaW5nLmFwcGVuZChTdHJpbmdVdGlscy5mb3JtYXQoIiBPUiB7fS5kZXB0X2lkIElOICggU0VMRUNUIGRlcHRfaWQgRlJPTSBzeXNfZGVwdCBXSEVSRSBkZXB0X2lkID0ge30gb3IgZmluZF9pbl9zZXQoIHt9ICwgYW5jZXN0b3JzICkgKSIsIGRlcHRBbGlhcywgdXNlci5nZXREZXB0SWQoKSwgdXNlci5nZXREZXB0SWQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoREFUQV9TQ09QRV9TRUxGLmVxdWFscyhkYXRhU2NvcGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHVzZXJBbGlhcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcWxTdHJpbmcuYXBwZW5kKFN0cmluZ1V0aWxzLmZvcm1hdCgiIE9SIHt9LnVzZXJfaWQgPSB7fSAiLCB1c2VyQWxpYXMsIHVzZXIuZ2V0VXNlcklkKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g5pWw5o2u5p2D6ZmQ5Li65LuF5pys5Lq65LiU5rKh5pyJdXNlckFsaWFz5Yir5ZCN5LiN5p+l6K+i5Lu75L2V5pWw5o2uCisgICAgICAgICAgICAgICAgICAgIHNxbFN0cmluZy5hcHBlbmQoU3RyaW5nVXRpbHMuZm9ybWF0KCIgT1Ige30uZGVwdF9pZCA9IDAgIiwgZGVwdEFsaWFzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZGl0aW9ucy5hZGQoZGF0YVNjb3BlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOinkuiJsumDveS4jeWMheWQq+S8oOmAkui/h+adpeeahOadg+mZkOWtl+espu+8jOi/meS4quaXtuWAmXNxbFN0cmluZ+S5n+S8muS4uuepuu+8jOaJgOS7peimgemZkOWItuS4gOS4iyzkuI3mn6Xor6Lku7vkvZXmlbDmja4KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoY29uZGl0aW9ucykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNxbFN0cmluZy5hcHBlbmQoU3RyaW5nVXRpbHMuZm9ybWF0KCIgT1Ige30uZGVwdF9pZCA9IDAgIiwgZGVwdEFsaWFzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhzcWxTdHJpbmcudG9TdHJpbmcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXMgPSBqb2luUG9pbnQuZ2V0QXJncygpWzBdOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChwYXJhbXMpICYmIHBhcmFtcyBpbnN0YW5jZW9mIEJhc2VFbnRpdHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmFzZUVudGl0eSBiYXNlRW50aXR5ID0gKEJhc2VFbnRpdHkpIHBhcmFtczsKKyAgICAgICAgICAgICAgICBiYXNlRW50aXR5LmdldFBhcmFtcygpLnB1dChEQVRBX1NDT1BFLCAiIEFORCAoIiArIHNxbFN0cmluZy5zdWJzdHJpbmcoNCkgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5ou85o6l5p2D6ZmQc3Fs5YmN5YWI5riF56m6cGFyYW1zLmRhdGFTY29wZeWPguaVsOmYsuatouazqOWFpQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhckRhdGFTY29wZShmaW5hbCBKb2luUG9pbnQgam9pblBvaW50KQorICAgIHsKKyAgICAgICAgT2JqZWN0IHBhcmFtcyA9IGpvaW5Qb2ludC5nZXRBcmdzKClbMF07CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwocGFyYW1zKSAmJiBwYXJhbXMgaW5zdGFuY2VvZiBCYXNlRW50aXR5KQorICAgICAgICB7CisgICAgICAgICAgICBCYXNlRW50aXR5IGJhc2VFbnRpdHkgPSAoQmFzZUVudGl0eSkgcGFyYW1zOworICAgICAgICAgICAgYmFzZUVudGl0eS5nZXRQYXJhbXMoKS5wdXQoREFUQV9TQ09QRSwgIiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL0RhdGFTb3VyY2VBc3BlY3QuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvYXNwZWN0ai9EYXRhU291cmNlQXNwZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYzlmNAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvYXNwZWN0ai9EYXRhU291cmNlQXNwZWN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmFzcGVjdGo7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLlByb2NlZWRpbmdKb2luUG9pbnQ7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5hbm5vdGF0aW9uLkFyb3VuZDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLmFubm90YXRpb24uQXNwZWN0OworaW1wb3J0IG9yZy5hc3BlY3RqLmxhbmcuYW5ub3RhdGlvbi5Qb2ludGN1dDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLnJlZmxlY3QuTWV0aG9kU2lnbmF0dXJlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5hbm5vdGF0aW9uLk9yZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkRhdGFTb3VyY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLmRhdGFzb3VyY2UuRHluYW1pY0RhdGFTb3VyY2VDb250ZXh0SG9sZGVyOworCisvKioKKyAqIOWkmuaVsOaNrua6kOWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BBc3BlY3QKK0BPcmRlcigxKQorQENvbXBvbmVudAorcHVibGljIGNsYXNzIERhdGFTb3VyY2VBc3BlY3QKK3sKKyAgICBwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkpOworCisgICAgQFBvaW50Y3V0KCJAYW5ub3RhdGlvbihjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRGF0YVNvdXJjZSkiCisgICAgICAgICAgICArICJ8fCBAd2l0aGluKGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5EYXRhU291cmNlKSIpCisgICAgcHVibGljIHZvaWQgZHNQb2ludEN1dCgpCisgICAgeworCisgICAgfQorCisgICAgQEFyb3VuZCgiZHNQb2ludEN1dCgpIikKKyAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZChQcm9jZWVkaW5nSm9pblBvaW50IHBvaW50KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBnZXREYXRhU291cmNlKHBvaW50KTsKKworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGRhdGFTb3VyY2UpKQorICAgICAgICB7CisgICAgICAgICAgICBEeW5hbWljRGF0YVNvdXJjZUNvbnRleHRIb2xkZXIuc2V0RGF0YVNvdXJjZVR5cGUoZGF0YVNvdXJjZS52YWx1ZSgpLm5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvaW50LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOmUgOavgeaVsOaNrua6kCDlnKjmiafooYzmlrnms5XkuYvlkI4KKyAgICAgICAgICAgIER5bmFtaWNEYXRhU291cmNlQ29udGV4dEhvbGRlci5jbGVhckRhdGFTb3VyY2VUeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpnIDopoHliIfmjaLnmoTmlbDmja7mupAKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKFByb2NlZWRpbmdKb2luUG9pbnQgcG9pbnQpCisgICAgeworICAgICAgICBNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlID0gKE1ldGhvZFNpZ25hdHVyZSkgcG9pbnQuZ2V0U2lnbmF0dXJlKCk7CisgICAgICAgIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IEFubm90YXRpb25VdGlscy5maW5kQW5ub3RhdGlvbihzaWduYXR1cmUuZ2V0TWV0aG9kKCksIERhdGFTb3VyY2UuY2xhc3MpOworICAgICAgICBpZiAoT2JqZWN0cy5ub25OdWxsKGRhdGFTb3VyY2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZmluZEFubm90YXRpb24oc2lnbmF0dXJlLmdldERlY2xhcmluZ1R5cGUoKSwgRGF0YVNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL0xvZ0FzcGVjdC5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL0xvZ0FzcGVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTlkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2FzcGVjdGovTG9nQXNwZWN0LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5hc3BlY3RqOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLkpvaW5Qb2ludDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLmFubm90YXRpb24uQWZ0ZXJSZXR1cm5pbmc7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5hbm5vdGF0aW9uLkFmdGVyVGhyb3dpbmc7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5hbm5vdGF0aW9uLkFzcGVjdDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLmFubm90YXRpb24uQmVmb3JlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLk5hbWVkVGhyZWFkTG9jYWw7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uQmluZGluZ1Jlc3VsdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tdWx0aXBhcnQuTXVsdGlwYXJ0RmlsZTsKK2ltcG9ydCBjb20uYWxpYmFiYS5mYXN0anNvbjIuSlNPTjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uTG9nOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1VzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1N0YXR1czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkh0dHBNZXRob2Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5maWx0ZXIuUHJvcGVydHlQcmVFeGNsdWRlRmlsdGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaXAuSXBVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXIuQXN5bmNNYW5hZ2VyOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsubWFuYWdlci5mYWN0b3J5LkFzeW5jRmFjdG9yeTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNPcGVyTG9nOworCisvKioKKyAqIOaTjeS9nOaXpeW/l+iusOW9leWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BBc3BlY3QKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBMb2dBc3BlY3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTG9nQXNwZWN0LmNsYXNzKTsKKworICAgIC8qKiDmjpLpmaTmlY/mhJ/lsZ7mgKflrZfmrrUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVYQ0xVREVfUFJPUEVSVElFUyA9IHsgInBhc3N3b3JkIiwgIm9sZFBhc3N3b3JkIiwgIm5ld1Bhc3N3b3JkIiwgImNvbmZpcm1QYXNzd29yZCIgfTsKKworICAgIC8qKiDorqHnrpfmk43kvZzmtojogJfml7bpl7QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxMb25nPiBUSU1FX1RIUkVBRExPQ0FMID0gbmV3IE5hbWVkVGhyZWFkTG9jYWw8TG9uZz4oIkNvc3QgVGltZSIpOworCisgICAgLyoqCisgICAgICog5aSE55CG6K+35rGC5YmN5omn6KGMCisgICAgICovCisgICAgQEJlZm9yZSh2YWx1ZSA9ICJAYW5ub3RhdGlvbihjb250cm9sbGVyTG9nKSIpCisgICAgcHVibGljIHZvaWQgYm9CZWZvcmUoSm9pblBvaW50IGpvaW5Qb2ludCwgTG9nIGNvbnRyb2xsZXJMb2cpCisgICAgeworICAgICAgICBUSU1FX1RIUkVBRExPQ0FMLnNldChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5aSE55CG5a6M6K+35rGC5ZCO5omn6KGMCisgICAgICoKKyAgICAgKiBAcGFyYW0gam9pblBvaW50IOWIh+eCuQorICAgICAqLworICAgIEBBZnRlclJldHVybmluZyhwb2ludGN1dCA9ICJAYW5ub3RhdGlvbihjb250cm9sbGVyTG9nKSIsIHJldHVybmluZyA9ICJqc29uUmVzdWx0IikKKyAgICBwdWJsaWMgdm9pZCBkb0FmdGVyUmV0dXJuaW5nKEpvaW5Qb2ludCBqb2luUG9pbnQsIExvZyBjb250cm9sbGVyTG9nLCBPYmplY3QganNvblJlc3VsdCkKKyAgICB7CisgICAgICAgIGhhbmRsZUxvZyhqb2luUG9pbnQsIGNvbnRyb2xsZXJMb2csIG51bGwsIGpzb25SZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaLpuaIquW8guW4uOaTjeS9nAorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2luUG9pbnQg5YiH54K5CisgICAgICogQHBhcmFtIGUg5byC5bi4CisgICAgICovCisgICAgQEFmdGVyVGhyb3dpbmcodmFsdWUgPSAiQGFubm90YXRpb24oY29udHJvbGxlckxvZykiLCB0aHJvd2luZyA9ICJlIikKKyAgICBwdWJsaWMgdm9pZCBkb0FmdGVyVGhyb3dpbmcoSm9pblBvaW50IGpvaW5Qb2ludCwgTG9nIGNvbnRyb2xsZXJMb2csIEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgICAgaGFuZGxlTG9nKGpvaW5Qb2ludCwgY29udHJvbGxlckxvZywgZSwgbnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTG9nKGZpbmFsIEpvaW5Qb2ludCBqb2luUG9pbnQsIExvZyBjb250cm9sbGVyTG9nLCBmaW5hbCBFeGNlcHRpb24gZSwgT2JqZWN0IGpzb25SZXN1bHQpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g6I635Y+W5b2T5YmN55qE55So5oi3CisgICAgICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gU2VjdXJpdHlVdGlscy5nZXRMb2dpblVzZXIoKTsKKworICAgICAgICAgICAgLy8gKj09PT09PT095pWw5o2u5bqT5pel5b+XPT09PT09PT09Ki8vCisgICAgICAgICAgICBTeXNPcGVyTG9nIG9wZXJMb2cgPSBuZXcgU3lzT3BlckxvZygpOworICAgICAgICAgICAgb3BlckxvZy5zZXRTdGF0dXMoQnVzaW5lc3NTdGF0dXMuU1VDQ0VTUy5vcmRpbmFsKCkpOworICAgICAgICAgICAgLy8g6K+35rGC55qE5Zyw5Z2ACisgICAgICAgICAgICBTdHJpbmcgaXAgPSBJcFV0aWxzLmdldElwQWRkcigpOworICAgICAgICAgICAgb3BlckxvZy5zZXRPcGVySXAoaXApOworICAgICAgICAgICAgb3BlckxvZy5zZXRPcGVyVXJsKFN0cmluZ1V0aWxzLnN1YnN0cmluZyhTZXJ2bGV0VXRpbHMuZ2V0UmVxdWVzdCgpLmdldFJlcXVlc3RVUkkoKSwgMCwgMjU1KSk7CisgICAgICAgICAgICBpZiAobG9naW5Vc2VyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BlckxvZy5zZXRPcGVyTmFtZShsb2dpblVzZXIuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgICAgICAgICAgU3lzVXNlciBjdXJyZW50VXNlciA9IGxvZ2luVXNlci5nZXRVc2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChjdXJyZW50VXNlcikgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGN1cnJlbnRVc2VyLmdldERlcHQoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcGVyTG9nLnNldERlcHROYW1lKGN1cnJlbnRVc2VyLmdldERlcHQoKS5nZXREZXB0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BlckxvZy5zZXRTdGF0dXMoQnVzaW5lc3NTdGF0dXMuRkFJTC5vcmRpbmFsKCkpOworICAgICAgICAgICAgICAgIG9wZXJMb2cuc2V0RXJyb3JNc2coU3RyaW5nVXRpbHMuc3Vic3RyaW5nKGUuZ2V0TWVzc2FnZSgpLCAwLCAyMDAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyDorr7nva7mlrnms5XlkI3np7AKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBqb2luUG9pbnQuZ2V0VGFyZ2V0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGpvaW5Qb2ludC5nZXRTaWduYXR1cmUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBvcGVyTG9nLnNldE1ldGhvZChjbGFzc05hbWUgKyAiLiIgKyBtZXRob2ROYW1lICsgIigpIik7CisgICAgICAgICAgICAvLyDorr7nva7or7fmsYLmlrnlvI8KKyAgICAgICAgICAgIG9wZXJMb2cuc2V0UmVxdWVzdE1ldGhvZChTZXJ2bGV0VXRpbHMuZ2V0UmVxdWVzdCgpLmdldE1ldGhvZCgpKTsKKyAgICAgICAgICAgIC8vIOWkhOeQhuiuvue9ruazqOino+S4iueahOWPguaVsAorICAgICAgICAgICAgZ2V0Q29udHJvbGxlck1ldGhvZERlc2NyaXB0aW9uKGpvaW5Qb2ludCwgY29udHJvbGxlckxvZywgb3BlckxvZywganNvblJlc3VsdCk7CisgICAgICAgICAgICAvLyDorr7nva7mtojogJfml7bpl7QKKyAgICAgICAgICAgIG9wZXJMb2cuc2V0Q29zdFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBUSU1FX1RIUkVBRExPQ0FMLmdldCgpKTsKKyAgICAgICAgICAgIC8vIOS/neWtmOaVsOaNruW6kworICAgICAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkT3BlcihvcGVyTG9nKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleHApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOiusOW9leacrOWcsOW8guW4uOaXpeW/lworICAgICAgICAgICAgbG9nLmVycm9yKCLlvILluLjkv6Hmga86e30iLCBleHAuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGV4cC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIFRJTUVfVEhSRUFETE9DQUwucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bms6jop6PkuK3lr7nmlrnms5XnmoTmj4/ov7Dkv6Hmga8g55So5LqOQ29udHJvbGxlcuWxguazqOinoworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2cg5pel5b+XCisgICAgICogQHBhcmFtIG9wZXJMb2cg5pON5L2c5pel5b+XCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRDb250cm9sbGVyTWV0aG9kRGVzY3JpcHRpb24oSm9pblBvaW50IGpvaW5Qb2ludCwgTG9nIGxvZywgU3lzT3BlckxvZyBvcGVyTG9nLCBPYmplY3QganNvblJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8g6K6+572uYWN0aW9u5Yqo5L2cCisgICAgICAgIG9wZXJMb2cuc2V0QnVzaW5lc3NUeXBlKGxvZy5idXNpbmVzc1R5cGUoKS5vcmRpbmFsKCkpOworICAgICAgICAvLyDorr7nva7moIfpopgKKyAgICAgICAgb3BlckxvZy5zZXRUaXRsZShsb2cudGl0bGUoKSk7CisgICAgICAgIC8vIOiuvue9ruaTjeS9nOS6uuexu+WIqworICAgICAgICBvcGVyTG9nLnNldE9wZXJhdG9yVHlwZShsb2cub3BlcmF0b3JUeXBlKCkub3JkaW5hbCgpKTsKKyAgICAgICAgLy8g5piv5ZCm6ZyA6KaB5L+d5a2YcmVxdWVzdO+8jOWPguaVsOWSjOWAvAorICAgICAgICBpZiAobG9nLmlzU2F2ZVJlcXVlc3REYXRhKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOiOt+WPluWPguaVsOeahOS/oeaBr++8jOS8oOWFpeWIsOaVsOaNruW6k+S4reOAggorICAgICAgICAgICAgc2V0UmVxdWVzdFZhbHVlKGpvaW5Qb2ludCwgb3BlckxvZywgbG9nLmV4Y2x1ZGVQYXJhbU5hbWVzKCkpOworICAgICAgICB9CisgICAgICAgIC8vIOaYr+WQpumcgOimgeS/neWtmHJlc3BvbnNl77yM5Y+C5pWw5ZKM5YC8CisgICAgICAgIGlmIChsb2cuaXNTYXZlUmVzcG9uc2VEYXRhKCkgJiYgU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGpzb25SZXN1bHQpKQorICAgICAgICB7CisgICAgICAgICAgICBvcGVyTG9nLnNldEpzb25SZXN1bHQoU3RyaW5nVXRpbHMuc3Vic3RyaW5nKEpTT04udG9KU09OU3RyaW5nKGpzb25SZXN1bHQpLCAwLCAyMDAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bor7fmsYLnmoTlj4LmlbDvvIzmlL7liLBsb2fkuK0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5cKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiDlvILluLgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UmVxdWVzdFZhbHVlKEpvaW5Qb2ludCBqb2luUG9pbnQsIFN5c09wZXJMb2cgb3BlckxvZywgU3RyaW5nW10gZXhjbHVkZVBhcmFtTmFtZXMpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcDw/LCA/PiBwYXJhbXNNYXAgPSBTZXJ2bGV0VXRpbHMuZ2V0UGFyYW1NYXAoU2VydmxldFV0aWxzLmdldFJlcXVlc3QoKSk7CisgICAgICAgIFN0cmluZyByZXF1ZXN0TWV0aG9kID0gb3BlckxvZy5nZXRSZXF1ZXN0TWV0aG9kKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHBhcmFtc01hcCkKKyAgICAgICAgICAgICAgICAmJiAoSHR0cE1ldGhvZC5QVVQubmFtZSgpLmVxdWFscyhyZXF1ZXN0TWV0aG9kKSB8fCBIdHRwTWV0aG9kLlBPU1QubmFtZSgpLmVxdWFscyhyZXF1ZXN0TWV0aG9kKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbXMgPSBhcmdzQXJyYXlUb1N0cmluZyhqb2luUG9pbnQuZ2V0QXJncygpLCBleGNsdWRlUGFyYW1OYW1lcyk7CisgICAgICAgICAgICBvcGVyTG9nLnNldE9wZXJQYXJhbShTdHJpbmdVdGlscy5zdWJzdHJpbmcocGFyYW1zLCAwLCAyMDAwKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvcGVyTG9nLnNldE9wZXJQYXJhbShTdHJpbmdVdGlscy5zdWJzdHJpbmcoSlNPTi50b0pTT05TdHJpbmcocGFyYW1zTWFwLCBleGNsdWRlUHJvcGVydHlQcmVGaWx0ZXIoZXhjbHVkZVBhcmFtTmFtZXMpKSwgMCwgMjAwMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Y+C5pWw5ou86KOFCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXJnc0FycmF5VG9TdHJpbmcoT2JqZWN0W10gcGFyYW1zQXJyYXksIFN0cmluZ1tdIGV4Y2x1ZGVQYXJhbU5hbWVzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtcyA9ICIiOworICAgICAgICBpZiAocGFyYW1zQXJyYXkgIT0gbnVsbCAmJiBwYXJhbXNBcnJheS5sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogcGFyYW1zQXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChvKSAmJiAhaXNGaWx0ZXJPYmplY3QobykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGpzb25PYmogPSBKU09OLnRvSlNPTlN0cmluZyhvLCBleGNsdWRlUHJvcGVydHlQcmVGaWx0ZXIoZXhjbHVkZVBhcmFtTmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSBqc29uT2JqLnRvU3RyaW5nKCkgKyAiICI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtcy50cmltKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5b+955Wl5pWP5oSf5bGe5oCnCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5UHJlRXhjbHVkZUZpbHRlciBleGNsdWRlUHJvcGVydHlQcmVGaWx0ZXIoU3RyaW5nW10gZXhjbHVkZVBhcmFtTmFtZXMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5UHJlRXhjbHVkZUZpbHRlcigpLmFkZEV4Y2x1ZGVzKEFycmF5VXRpbHMuYWRkQWxsKEVYQ0xVREVfUFJPUEVSVElFUywgZXhjbHVkZVBhcmFtTmFtZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3mmK/lkKbpnIDopoHov4fmu6TnmoTlr7nosaHjgIIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbyDlr7nosaHkv6Hmga/jgIIKKyAgICAgKiBAcmV0dXJuIOWmguaenOaYr+mcgOimgei/h+a7pOeahOWvueixoe+8jOWImei/lOWbnnRydWXvvJvlkKbliJnov5Tlm55mYWxzZeOAggorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJPYmplY3QoZmluYWwgT2JqZWN0IG8pCisgICAgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IG8uZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKGNsYXp6LmlzQXJyYXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldENvbXBvbmVudFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKE11bHRpcGFydEZpbGUuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBvOworICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBjb2xsZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE11bHRpcGFydEZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoTWFwLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKQorICAgICAgICB7CisgICAgICAgICAgICBNYXAgbWFwID0gKE1hcCkgbzsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogbWFwLmVudHJ5U2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgdmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNdWx0aXBhcnRGaWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgTXVsdGlwYXJ0RmlsZSB8fCBvIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0IHx8IG8gaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlc3BvbnNlCisgICAgICAgICAgICAgICAgfHwgbyBpbnN0YW5jZW9mIEJpbmRpbmdSZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL1JhdGVMaW1pdGVyQXNwZWN0LmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2FzcGVjdGovUmF0ZUxpbWl0ZXJBc3BlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzIwYmMxCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9hc3BlY3RqL1JhdGVMaW1pdGVyQXNwZWN0LmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmFzcGVjdGo7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hc3BlY3RqLmxhbmcuSm9pblBvaW50OworaW1wb3J0IG9yZy5hc3BlY3RqLmxhbmcuYW5ub3RhdGlvbi5Bc3BlY3Q7CitpbXBvcnQgb3JnLmFzcGVjdGoubGFuZy5hbm5vdGF0aW9uLkJlZm9yZTsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLnJlZmxlY3QuTWV0aG9kU2lnbmF0dXJlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5jb3JlLlJlZGlzVGVtcGxhdGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlZGlzLmNvcmUuc2NyaXB0LlJlZGlzU2NyaXB0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLlJhdGVMaW1pdGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuTGltaXRUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmlwLklwVXRpbHM7CisKKy8qKgorICog6ZmQ5rWB5aSE55CGCisgKgorICogQGF1dGhvciBydW95aQorICovCitAQXNwZWN0CitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgUmF0ZUxpbWl0ZXJBc3BlY3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmF0ZUxpbWl0ZXJBc3BlY3QuY2xhc3MpOworCisgICAgcHJpdmF0ZSBSZWRpc1RlbXBsYXRlPE9iamVjdCwgT2JqZWN0PiByZWRpc1RlbXBsYXRlOworCisgICAgcHJpdmF0ZSBSZWRpc1NjcmlwdDxMb25nPiBsaW1pdFNjcmlwdDsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWRpc1RlbXBsYXRlMShSZWRpc1RlbXBsYXRlPE9iamVjdCwgT2JqZWN0PiByZWRpc1RlbXBsYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5yZWRpc1RlbXBsYXRlID0gcmVkaXNUZW1wbGF0ZTsKKyAgICB9CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHVibGljIHZvaWQgc2V0TGltaXRTY3JpcHQoUmVkaXNTY3JpcHQ8TG9uZz4gbGltaXRTY3JpcHQpCisgICAgeworICAgICAgICB0aGlzLmxpbWl0U2NyaXB0ID0gbGltaXRTY3JpcHQ7CisgICAgfQorCisgICAgQEJlZm9yZSgiQGFubm90YXRpb24ocmF0ZUxpbWl0ZXIpIikKKyAgICBwdWJsaWMgdm9pZCBkb0JlZm9yZShKb2luUG9pbnQgcG9pbnQsIFJhdGVMaW1pdGVyIHJhdGVMaW1pdGVyKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBpbnQgdGltZSA9IHJhdGVMaW1pdGVyLnRpbWUoKTsKKyAgICAgICAgaW50IGNvdW50ID0gcmF0ZUxpbWl0ZXIuY291bnQoKTsKKworICAgICAgICBTdHJpbmcgY29tYmluZUtleSA9IGdldENvbWJpbmVLZXkocmF0ZUxpbWl0ZXIsIHBvaW50KTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGtleXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbWJpbmVLZXkpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgTG9uZyBudW1iZXIgPSByZWRpc1RlbXBsYXRlLmV4ZWN1dGUobGltaXRTY3JpcHQsIGtleXMsIGNvdW50LCB0aW1lKTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwobnVtYmVyKSB8fCBudW1iZXIuaW50VmFsdWUoKSA+IGNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLorr/pl67ov4fkuo7popHnuYHvvIzor7fnqI3lgJnlho3or5UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5pbmZvKCLpmZDliLbor7fmsYIne30nLOW9k+WJjeivt+axgid7fScs57yT5a2Ya2V5J3t9JyIsIGNvdW50LCBudW1iZXIuaW50VmFsdWUoKSwgY29tYmluZUtleSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNlcnZpY2VFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCLmnI3liqHlmajpmZDmtYHlvILluLjvvIzor7fnqI3lgJnlho3or5UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tYmluZUtleShSYXRlTGltaXRlciByYXRlTGltaXRlciwgSm9pblBvaW50IHBvaW50KQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocmF0ZUxpbWl0ZXIua2V5KCkpOworICAgICAgICBpZiAocmF0ZUxpbWl0ZXIubGltaXRUeXBlKCkgPT0gTGltaXRUeXBlLklQKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKElwVXRpbHMuZ2V0SXBBZGRyKCkpLmFwcGVuZCgiLSIpOworICAgICAgICB9CisgICAgICAgIE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSAoTWV0aG9kU2lnbmF0dXJlKSBwb2ludC5nZXRTaWduYXR1cmUoKTsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNpZ25hdHVyZS5nZXRNZXRob2QoKTsKKyAgICAgICAgQ2xhc3M8Pz4gdGFyZ2V0Q2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCh0YXJnZXRDbGFzcy5nZXROYW1lKCkpLmFwcGVuZCgiLSIpLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0FwcGxpY2F0aW9uQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9BcHBsaWNhdGlvbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGRjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9BcHBsaWNhdGlvbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgb3JnLm15YmF0aXMuc3ByaW5nLmFubm90YXRpb24uTWFwcGVyU2NhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5qYWNrc29uLkphY2tzb24yT2JqZWN0TWFwcGVyQnVpbGRlckN1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkVuYWJsZUFzcGVjdEpBdXRvUHJveHk7CisKKy8qKgorICog56iL5bqP5rOo6Kej6YWN572uCisgKgorICogQGF1dGhvciBydW95aQorICovCitAQ29uZmlndXJhdGlvbgorLy8g6KGo56S66YCa6L+HYW9w5qGG5p625pq06Zyy6K+l5Luj55CG5a+56LGhLEFvcENvbnRleHTog73lpJ/orr/pl64KK0BFbmFibGVBc3BlY3RKQXV0b1Byb3h5KGV4cG9zZVByb3h5ID0gdHJ1ZSkKKy8vIOaMh+WumuimgeaJq+aPj+eahE1hcHBlcuexu+eahOWMheeahOi3r+W+hAorQE1hcHBlclNjYW4oImNvbS5ydW95aS4qKi5tYXBwZXIiKQorcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29uZmlnCit7CisgICAgLyoqCisgICAgICog5pe25Yy66YWN572uCisgICAgICovCisgICAgQEJlYW4KKyAgICBwdWJsaWMgSmFja3NvbjJPYmplY3RNYXBwZXJCdWlsZGVyQ3VzdG9taXplciBqYWNrc29uT2JqZWN0TWFwcGVyQ3VzdG9taXphdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gamFja3Nvbk9iamVjdE1hcHBlckJ1aWxkZXIgLT4gamFja3Nvbk9iamVjdE1hcHBlckJ1aWxkZXIudGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9DYXB0Y2hhQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9DYXB0Y2hhQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlNzhhZQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0NhcHRjaGFDb25maWcuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLmltcGwuRGVmYXVsdEthcHRjaGE7CitpbXBvcnQgY29tLmdvb2dsZS5jb2RlLmthcHRjaGEudXRpbC5Db25maWc7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLkNvbnN0YW50cy4qOworCisvKioKKyAqIOmqjOivgeeggemFjee9rgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb25maWd1cmF0aW9uCitwdWJsaWMgY2xhc3MgQ2FwdGNoYUNvbmZpZworeworICAgIEBCZWFuKG5hbWUgPSAiY2FwdGNoYVByb2R1Y2VyIikKKyAgICBwdWJsaWMgRGVmYXVsdEthcHRjaGEgZ2V0S2FwdGNoYUJlYW4oKQorICAgIHsKKyAgICAgICAgRGVmYXVsdEthcHRjaGEgZGVmYXVsdEthcHRjaGEgPSBuZXcgRGVmYXVsdEthcHRjaGEoKTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgLy8g5piv5ZCm5pyJ6L655qGGIOm7mOiupOS4unRydWUg5oiR5Lus5Y+v5Lul6Ieq5bex6K6+572ueWVz77yMbm8KKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX0JPUkRFUiwgInllcyIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKzlrZfnrKbpopzoibIg6buY6K6k5Li6Q29sb3IuQkxBQ0sKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9GT05UX0NPTE9SLCAiYmxhY2siKTsKKyAgICAgICAgLy8g6aqM6K+B56CB5Zu+54mH5a695bqmIOm7mOiupOS4ujIwMAorICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfSU1BR0VfV0lEVEgsICIxNjAiKTsKKyAgICAgICAgLy8g6aqM6K+B56CB5Zu+54mH6auY5bqmIOm7mOiupOS4ujUwCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoS0FQVENIQV9JTUFHRV9IRUlHSFQsICI2MCIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKzlrZfnrKblpKflsI8g6buY6K6k5Li6NDAKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9GT05UX1NJWkUsICIzOCIpOworICAgICAgICAvLyBLQVBUQ0hBX1NFU1NJT05fS0VZCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoS0FQVENIQV9TRVNTSU9OX0NPTkZJR19LRVksICJrYXB0Y2hhQ29kZSIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKzlrZfnrKbplb/luqYg6buY6K6k5Li6NQorICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfVEVYVFBST0RVQ0VSX0NIQVJfTEVOR1RILCAiNCIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKzlrZfkvZPmoLflvI8g6buY6K6k5Li6bmV3IEZvbnQoIkFyaWFsIiwgMSwgZm9udFNpemUpLCBuZXcgRm9udCgiQ291cmllciIsIDEsIGZvbnRTaXplKQorICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfVEVYVFBST0RVQ0VSX0ZPTlRfTkFNRVMsICJBcmlhbCxDb3VyaWVyIik7CisgICAgICAgIC8vIOWbvueJh+agt+W8jyDmsLTnurljb20uZ29vZ2xlLmNvZGUua2FwdGNoYS5pbXBsLldhdGVyUmlwcGxlIOmxvOecvGNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLmltcGwuRmlzaEV5ZUdpbXB5IOmYtOW9sWNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLmltcGwuU2hhZG93R2ltcHkKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX09CU0NVUklGSUNBVE9SX0lNUEwsICJjb20uZ29vZ2xlLmNvZGUua2FwdGNoYS5pbXBsLlNoYWRvd0dpbXB5Iik7CisgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKHByb3BlcnRpZXMpOworICAgICAgICBkZWZhdWx0S2FwdGNoYS5zZXRDb25maWcoY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRLYXB0Y2hhOworICAgIH0KKworICAgIEBCZWFuKG5hbWUgPSAiY2FwdGNoYVByb2R1Y2VyTWF0aCIpCisgICAgcHVibGljIERlZmF1bHRLYXB0Y2hhIGdldEthcHRjaGFCZWFuTWF0aCgpCisgICAgeworICAgICAgICBEZWZhdWx0S2FwdGNoYSBkZWZhdWx0S2FwdGNoYSA9IG5ldyBEZWZhdWx0S2FwdGNoYSgpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAvLyDmmK/lkKbmnInovrnmoYYg6buY6K6k5Li6dHJ1ZSDmiJHku6zlj6/ku6Xoh6rlt7Horr7nva55ZXPvvIxubworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfQk9SREVSLCAieWVzIik7CisgICAgICAgIC8vIOi+ueahhuminOiJsiDpu5jorqTkuLpDb2xvci5CTEFDSworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfQk9SREVSX0NPTE9SLCAiMTA1LDE3OSw5MCIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKzlrZfnrKbpopzoibIg6buY6K6k5Li6Q29sb3IuQkxBQ0sKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9GT05UX0NPTE9SLCAiYmx1ZSIpOworICAgICAgICAvLyDpqozor4HnoIHlm77niYflrr3luqYg6buY6K6k5Li6MjAwCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoS0FQVENIQV9JTUFHRV9XSURUSCwgIjE2MCIpOworICAgICAgICAvLyDpqozor4HnoIHlm77niYfpq5jluqYg6buY6K6k5Li6NTAKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX0lNQUdFX0hFSUdIVCwgIjYwIik7CisgICAgICAgIC8vIOmqjOivgeeggeaWh+acrOWtl+espuWkp+WwjyDpu5jorqTkuLo0MAorICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KEtBUFRDSEFfVEVYVFBST0RVQ0VSX0ZPTlRfU0laRSwgIjM1Iik7CisgICAgICAgIC8vIEtBUFRDSEFfU0VTU0lPTl9LRVkKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1NFU1NJT05fQ09ORklHX0tFWSwgImthcHRjaGFDb2RlTWF0aCIpOworICAgICAgICAvLyDpqozor4HnoIHmlofmnKznlJ/miJDlmagKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9JTVBMLCAiY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWcuS2FwdGNoYVRleHRDcmVhdG9yIik7CisgICAgICAgIC8vIOmqjOivgeeggeaWh+acrOWtl+espumXtOi3nSDpu5jorqTkuLoyCisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoS0FQVENIQV9URVhUUFJPRFVDRVJfQ0hBUl9TUEFDRSwgIjMiKTsKKyAgICAgICAgLy8g6aqM6K+B56CB5paH5pys5a2X56ym6ZW/5bqmIOm7mOiupOS4ujUKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9DSEFSX0xFTkdUSCwgIjYiKTsKKyAgICAgICAgLy8g6aqM6K+B56CB5paH5pys5a2X5L2T5qC35byPIOm7mOiupOS4um5ldyBGb250KCJBcmlhbCIsIDEsIGZvbnRTaXplKSwgbmV3IEZvbnQoIkNvdXJpZXIiLCAxLCBmb250U2l6ZSkKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX1RFWFRQUk9EVUNFUl9GT05UX05BTUVTLCAiQXJpYWwsQ291cmllciIpOworICAgICAgICAvLyDpqozor4HnoIHlmarngrnpopzoibIg6buY6K6k5Li6Q29sb3IuQkxBQ0sKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX05PSVNFX0NPTE9SLCAid2hpdGUiKTsKKyAgICAgICAgLy8g5bmy5omw5a6e546w57G7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoS0FQVENIQV9OT0lTRV9JTVBMLCAiY29tLmdvb2dsZS5jb2RlLmthcHRjaGEuaW1wbC5Ob05vaXNlIik7CisgICAgICAgIC8vIOWbvueJh+agt+W8jyDmsLTnurljb20uZ29vZ2xlLmNvZGUua2FwdGNoYS5pbXBsLldhdGVyUmlwcGxlIOmxvOecvGNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLmltcGwuRmlzaEV5ZUdpbXB5IOmYtOW9sWNvbS5nb29nbGUuY29kZS5rYXB0Y2hhLmltcGwuU2hhZG93R2ltcHkKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShLQVBUQ0hBX09CU0NVUklGSUNBVE9SX0lNUEwsICJjb20uZ29vZ2xlLmNvZGUua2FwdGNoYS5pbXBsLlNoYWRvd0dpbXB5Iik7CisgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKHByb3BlcnRpZXMpOworICAgICAgICBkZWZhdWx0S2FwdGNoYS5zZXRDb25maWcoY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRLYXB0Y2hhOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0RydWlkQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9EcnVpZENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2I4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9EcnVpZENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuY29uZmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5hdXRvY29uZmlndXJlLmNvbmRpdGlvbi5Db25kaXRpb25hbE9uUHJvcGVydHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmNvbnRleHQucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Qud2ViLnNlcnZsZXQuRmlsdGVyUmVnaXN0cmF0aW9uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uUHJpbWFyeTsKK2ltcG9ydCBjb20uYWxpYmFiYS5kcnVpZC5wb29sLkRydWlkRGF0YVNvdXJjZTsKK2ltcG9ydCBjb20uYWxpYmFiYS5kcnVpZC5zcHJpbmcuYm9vdDMuYXV0b2NvbmZpZ3VyZS5EcnVpZERhdGFTb3VyY2VCdWlsZGVyOworaW1wb3J0IGNvbS5hbGliYWJhLmRydWlkLnNwcmluZy5ib290My5hdXRvY29uZmlndXJlLnByb3BlcnRpZXMuRHJ1aWRTdGF0UHJvcGVydGllczsKK2ltcG9ydCBjb20uYWxpYmFiYS5kcnVpZC51dGlsLlV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuRGF0YVNvdXJjZVR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcHJpbmcuU3ByaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWcucHJvcGVydGllcy5EcnVpZFByb3BlcnRpZXM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5kYXRhc291cmNlLkR5bmFtaWNEYXRhU291cmNlOworaW1wb3J0IGpha2FydGEuc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIGRydWlkIOmFjee9ruWkmuaVsOaNrua6kAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb25maWd1cmF0aW9uCitwdWJsaWMgY2xhc3MgRHJ1aWRDb25maWcKK3sKKyAgICBAQmVhbgorICAgIEBDb25maWd1cmF0aW9uUHJvcGVydGllcygic3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQubWFzdGVyIikKKyAgICBwdWJsaWMgRGF0YVNvdXJjZSBtYXN0ZXJEYXRhU291cmNlKERydWlkUHJvcGVydGllcyBkcnVpZFByb3BlcnRpZXMpCisgICAgeworICAgICAgICBEcnVpZERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IERydWlkRGF0YVNvdXJjZUJ1aWxkZXIuY3JlYXRlKCkuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIGRydWlkUHJvcGVydGllcy5kYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgIH0KKworICAgIEBCZWFuCisgICAgQENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCJzcHJpbmcuZGF0YXNvdXJjZS5kcnVpZC5zbGF2ZSIpCisgICAgQENvbmRpdGlvbmFsT25Qcm9wZXJ0eShwcmVmaXggPSAic3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQuc2xhdmUiLCBuYW1lID0gImVuYWJsZWQiLCBoYXZpbmdWYWx1ZSA9ICJ0cnVlIikKKyAgICBwdWJsaWMgRGF0YVNvdXJjZSBzbGF2ZURhdGFTb3VyY2UoRHJ1aWRQcm9wZXJ0aWVzIGRydWlkUHJvcGVydGllcykKKyAgICB7CisgICAgICAgIERydWlkRGF0YVNvdXJjZSBkYXRhU291cmNlID0gRHJ1aWREYXRhU291cmNlQnVpbGRlci5jcmVhdGUoKS5idWlsZCgpOworICAgICAgICByZXR1cm4gZHJ1aWRQcm9wZXJ0aWVzLmRhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgfQorCisgICAgQEJlYW4obmFtZSA9ICJkeW5hbWljRGF0YVNvdXJjZSIpCisgICAgQFByaW1hcnkKKyAgICBwdWJsaWMgRHluYW1pY0RhdGFTb3VyY2UgZGF0YVNvdXJjZShEYXRhU291cmNlIG1hc3RlckRhdGFTb3VyY2UpCisgICAgeworICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IHRhcmdldERhdGFTb3VyY2VzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICB0YXJnZXREYXRhU291cmNlcy5wdXQoRGF0YVNvdXJjZVR5cGUuTUFTVEVSLm5hbWUoKSwgbWFzdGVyRGF0YVNvdXJjZSk7CisgICAgICAgIHNldERhdGFTb3VyY2UodGFyZ2V0RGF0YVNvdXJjZXMsIERhdGFTb3VyY2VUeXBlLlNMQVZFLm5hbWUoKSwgInNsYXZlRGF0YVNvdXJjZSIpOworICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNEYXRhU291cmNlKG1hc3RlckRhdGFTb3VyY2UsIHRhcmdldERhdGFTb3VyY2VzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICog6K6+572u5pWw5o2u5rqQCisgICAgICogCisgICAgICogQHBhcmFtIHRhcmdldERhdGFTb3VyY2VzIOWkh+mAieaVsOaNrua6kOmbhuWQiAorICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIOaVsOaNrua6kOWQjeensAorICAgICAqIEBwYXJhbSBiZWFuTmFtZSBiZWFu5ZCN56ewCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZShNYXA8T2JqZWN0LCBPYmplY3Q+IHRhcmdldERhdGFTb3VyY2VzLCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIGJlYW5OYW1lKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IFNwcmluZ1V0aWxzLmdldEJlYW4oYmVhbk5hbWUpOworICAgICAgICAgICAgdGFyZ2V0RGF0YVNvdXJjZXMucHV0KHNvdXJjZU5hbWUsIGRhdGFTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Y676Zmk55uR5o6n6aG16Z2i5bqV6YOo55qE5bm/5ZGKCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQorICAgIEBCZWFuCisgICAgQENvbmRpdGlvbmFsT25Qcm9wZXJ0eShuYW1lID0gInNwcmluZy5kYXRhc291cmNlLmRydWlkLnN0YXRWaWV3U2VydmxldC5lbmFibGVkIiwgaGF2aW5nVmFsdWUgPSAidHJ1ZSIpCisgICAgcHVibGljIEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4gcmVtb3ZlRHJ1aWRGaWx0ZXJSZWdpc3RyYXRpb25CZWFuKERydWlkU3RhdFByb3BlcnRpZXMgcHJvcGVydGllcykKKyAgICB7CisgICAgICAgIC8vIOiOt+WPlndlYuebkeaOp+mhtemdoueahOWPguaVsAorICAgICAgICBEcnVpZFN0YXRQcm9wZXJ0aWVzLlN0YXRWaWV3U2VydmxldCBjb25maWcgPSBwcm9wZXJ0aWVzLmdldFN0YXRWaWV3U2VydmxldCgpOworICAgICAgICAvLyDmj5Dlj5Zjb21tb24uanPnmoTphY3nva7ot6/lvoQKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBjb25maWcuZ2V0VXJsUGF0dGVybigpICE9IG51bGwgPyBjb25maWcuZ2V0VXJsUGF0dGVybigpIDogIi9kcnVpZC8qIjsKKyAgICAgICAgU3RyaW5nIGNvbW1vbkpzUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgiXFwqIiwgImpzL2NvbW1vbi5qcyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZVBhdGggPSAic3VwcG9ydC9odHRwL3Jlc291cmNlcy9qcy9jb21tb24uanMiOworICAgICAgICAvLyDliJvlu7pmaWx0ZXLov5vooYzov4fmu6QKKyAgICAgICAgRmlsdGVyIGZpbHRlciA9IG5ldyBGaWx0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoamFrYXJ0YS5zZXJ2bGV0LkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAvLyDph43nva7nvJPlhrLljLrvvIzlk43lupTlpLTkuI3kvJrooqvph43nva4KKyAgICAgICAgICAgICAgICByZXNwb25zZS5yZXNldEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIC8vIOiOt+WPlmNvbW1vbi5qcworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gVXRpbHMucmVhZEZyb21SZXNvdXJjZShmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgLy8g5q2j5YiZ5pu/5o2iYmFubmVyLCDpmaTljrvlupXpg6jnmoTlub/lkYrkv6Hmga8KKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCI8YS4qP2Jhbm5lclwiPjwvYT48YnIvPiIsICIiKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCJwb3dlcmVkLio/c2hyZWsud2FuZzwvYT4iLCAiIik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBGaWx0ZXJSZWdpc3RyYXRpb25CZWFuIHJlZ2lzdHJhdGlvbkJlYW4gPSBuZXcgRmlsdGVyUmVnaXN0cmF0aW9uQmVhbigpOworICAgICAgICByZWdpc3RyYXRpb25CZWFuLnNldEZpbHRlcihmaWx0ZXIpOworICAgICAgICByZWdpc3RyYXRpb25CZWFuLmFkZFVybFBhdHRlcm5zKGNvbW1vbkpzUGF0dGVybik7CisgICAgICAgIHJldHVybiByZWdpc3RyYXRpb25CZWFuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0Zhc3RKc29uMkpzb25SZWRpc1NlcmlhbGl6ZXIuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0Zhc3RKc29uMkpzb25SZWRpc1NlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWRiYjdmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvRmFzdEpzb24ySnNvblJlZGlzU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWc7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlZGlzLnNlcmlhbGl6ZXIuUmVkaXNTZXJpYWxpemVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5zZXJpYWxpemVyLlNlcmlhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT047CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05SZWFkZXI7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05Xcml0ZXI7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLmZpbHRlci5GaWx0ZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CisKKy8qKgorICogUmVkaXPkvb/nlKhGYXN0SnNvbuW6j+WIl+WMlgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBGYXN0SnNvbjJKc29uUmVkaXNTZXJpYWxpemVyPFQ+IGltcGxlbWVudHMgUmVkaXNTZXJpYWxpemVyPFQ+Cit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IERFRkFVTFRfQ0hBUlNFVCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKworICAgIHN0YXRpYyBmaW5hbCBGaWx0ZXIgQVVUT19UWVBFX0ZJTFRFUiA9IEpTT05SZWFkZXIuYXV0b1R5cGVGaWx0ZXIoQ29uc3RhbnRzLkpTT05fV0hJVEVMSVNUX1NUUik7CisKKyAgICBwcml2YXRlIENsYXNzPFQ+IGNsYXp6OworCisgICAgcHVibGljIEZhc3RKc29uMkpzb25SZWRpc1NlcmlhbGl6ZXIoQ2xhc3M8VD4gY2xhenopCisgICAgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmNsYXp6ID0gY2xheno7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBzZXJpYWxpemUoVCB0KSB0aHJvd3MgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKU09OLnRvSlNPTlN0cmluZyh0LCBKU09OV3JpdGVyLkZlYXR1cmUuV3JpdGVDbGFzc05hbWUpLmdldEJ5dGVzKERFRkFVTFRfQ0hBUlNFVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgZGVzZXJpYWxpemUoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgU2VyaWFsaXphdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGJ5dGVzID09IG51bGwgfHwgYnl0ZXMubGVuZ3RoIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKGJ5dGVzLCBERUZBVUxUX0NIQVJTRVQpOworCisgICAgICAgIHJldHVybiBKU09OLnBhcnNlT2JqZWN0KHN0ciwgY2xhenosIEFVVE9fVFlQRV9GSUxURVIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0ZpbHRlckNvbmZpZy5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvRmlsdGVyQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkNmJiOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0ZpbHRlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGpha2FydGEuc2VydmxldC5EaXNwYXRjaGVyVHlwZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5jb25kaXRpb24uQ29uZGl0aW9uYWxPblByb3BlcnR5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC53ZWIuc2VydmxldC5GaWx0ZXJSZWdpc3RyYXRpb25CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkJlYW47CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmZpbHRlci5SZXBlYXRhYmxlRmlsdGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZmlsdGVyLlhzc0ZpbHRlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIEZpbHRlcumFjee9rgorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBGaWx0ZXJDb25maWcKK3sKKyAgICBAVmFsdWUoIiR7eHNzLmV4Y2x1ZGVzfSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZXM7CisKKyAgICBAVmFsdWUoIiR7eHNzLnVybFBhdHRlcm5zfSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJsUGF0dGVybnM7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgQEJlYW4KKyAgICBAQ29uZGl0aW9uYWxPblByb3BlcnR5KHZhbHVlID0gInhzcy5lbmFibGVkIiwgaGF2aW5nVmFsdWUgPSAidHJ1ZSIpCisgICAgcHVibGljIEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4geHNzRmlsdGVyUmVnaXN0cmF0aW9uKCkKKyAgICB7CisgICAgICAgIEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4gcmVnaXN0cmF0aW9uID0gbmV3IEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4oKTsKKyAgICAgICAgcmVnaXN0cmF0aW9uLnNldERpc3BhdGNoZXJUeXBlcyhEaXNwYXRjaGVyVHlwZS5SRVFVRVNUKTsKKyAgICAgICAgcmVnaXN0cmF0aW9uLnNldEZpbHRlcihuZXcgWHNzRmlsdGVyKCkpOworICAgICAgICByZWdpc3RyYXRpb24uYWRkVXJsUGF0dGVybnMoU3RyaW5nVXRpbHMuc3BsaXQodXJsUGF0dGVybnMsICIsIikpOworICAgICAgICByZWdpc3RyYXRpb24uc2V0TmFtZSgieHNzRmlsdGVyIik7CisgICAgICAgIHJlZ2lzdHJhdGlvbi5zZXRPcmRlcihGaWx0ZXJSZWdpc3RyYXRpb25CZWFuLkhJR0hFU1RfUFJFQ0VERU5DRSk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgaW5pdFBhcmFtZXRlcnMucHV0KCJleGNsdWRlcyIsIGV4Y2x1ZGVzKTsKKyAgICAgICAgcmVnaXN0cmF0aW9uLnNldEluaXRQYXJhbWV0ZXJzKGluaXRQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgQEJlYW4KKyAgICBwdWJsaWMgRmlsdGVyUmVnaXN0cmF0aW9uQmVhbiBzb21lRmlsdGVyUmVnaXN0cmF0aW9uKCkKKyAgICB7CisgICAgICAgIEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4gcmVnaXN0cmF0aW9uID0gbmV3IEZpbHRlclJlZ2lzdHJhdGlvbkJlYW4oKTsKKyAgICAgICAgcmVnaXN0cmF0aW9uLnNldEZpbHRlcihuZXcgUmVwZWF0YWJsZUZpbHRlcigpKTsKKyAgICAgICAgcmVnaXN0cmF0aW9uLmFkZFVybFBhdHRlcm5zKCIvKiIpOworICAgICAgICByZWdpc3RyYXRpb24uc2V0TmFtZSgicmVwZWF0YWJsZUZpbHRlciIpOworICAgICAgICByZWdpc3RyYXRpb24uc2V0T3JkZXIoRmlsdGVyUmVnaXN0cmF0aW9uQmVhbi5MT1dFU1RfUFJFQ0VERU5DRSk7CisgICAgICAgIHJldHVybiByZWdpc3RyYXRpb247CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9JMThuQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9JMThuQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzZmQwMQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0kxOG5Db25maWcuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuY29uZmlnOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuTG9jYWxlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5jb25maWcuYW5ub3RhdGlvbi5JbnRlcmNlcHRvclJlZ2lzdHJ5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuY29uZmlnLmFubm90YXRpb24uV2ViTXZjQ29uZmlndXJlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LmkxOG4uTG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5pMThuLlNlc3Npb25Mb2NhbGVSZXNvbHZlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKKworLyoqCisgKiDotYTmupDmlofku7bphY3nva7liqDovb0KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29uZmlndXJhdGlvbgorcHVibGljIGNsYXNzIEkxOG5Db25maWcgaW1wbGVtZW50cyBXZWJNdmNDb25maWd1cmVyCit7CisgICAgQEJlYW4KKyAgICBwdWJsaWMgTG9jYWxlUmVzb2x2ZXIgbG9jYWxlUmVzb2x2ZXIoKQorICAgIHsKKyAgICAgICAgU2Vzc2lvbkxvY2FsZVJlc29sdmVyIHNsciA9IG5ldyBTZXNzaW9uTG9jYWxlUmVzb2x2ZXIoKTsKKyAgICAgICAgLy8g6buY6K6k6K+t6KiACisgICAgICAgIHNsci5zZXREZWZhdWx0TG9jYWxlKENvbnN0YW50cy5ERUZBVUxUX0xPQ0FMRSk7CisgICAgICAgIHJldHVybiBzbHI7CisgICAgfQorCisgICAgQEJlYW4KKyAgICBwdWJsaWMgTG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3IgbG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3IoKQorICAgIHsKKyAgICAgICAgTG9jYWxlQ2hhbmdlSW50ZXJjZXB0b3IgbGNpID0gbmV3IExvY2FsZUNoYW5nZUludGVyY2VwdG9yKCk7CisgICAgICAgIC8vIOWPguaVsOWQjQorICAgICAgICBsY2kuc2V0UGFyYW1OYW1lKCJsYW5nIik7CisgICAgICAgIHJldHVybiBsY2k7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkSW50ZXJjZXB0b3JzKEludGVyY2VwdG9yUmVnaXN0cnkgcmVnaXN0cnkpCisgICAgeworICAgICAgICByZWdpc3RyeS5hZGRJbnRlcmNlcHRvcihsb2NhbGVDaGFuZ2VJbnRlcmNlcHRvcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9LYXB0Y2hhVGV4dENyZWF0b3IuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL0thcHRjaGFUZXh0Q3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGUxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9LYXB0Y2hhVGV4dENyZWF0b3IuamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvZGUua2FwdGNoYS50ZXh0LmltcGwuRGVmYXVsdFRleHRDcmVhdG9yOworCisvKioKKyAqIOmqjOivgeeggeaWh+acrOeUn+aIkOWZqAorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEthcHRjaGFUZXh0Q3JlYXRvciBleHRlbmRzIERlZmF1bHRUZXh0Q3JlYXRvcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENOVU1CRVJTID0gIjAsMSwyLDMsNCw1LDYsNyw4LDksMTAiLnNwbGl0KCIsIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQorICAgIHsKKyAgICAgICAgSW50ZWdlciByZXN1bHQgPSAwOworICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICBpbnQgeCA9IHJhbmRvbS5uZXh0SW50KDEwKTsKKyAgICAgICAgaW50IHkgPSByYW5kb20ubmV4dEludCgxMCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3VDaGluZXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IHJhbmRvbW9wZXJhbmRzID0gcmFuZG9tLm5leHRJbnQoMyk7CisgICAgICAgIGlmIChyYW5kb21vcGVyYW5kcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSB4ICogeTsKKyAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoQ05VTUJFUlNbeF0pOworICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZCgiKiIpOworICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZChDTlVNQkVSU1t5XSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmFuZG9tb3BlcmFuZHMgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh4ICE9IDApICYmIHkgJSB4ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0geSAvIHg7CisgICAgICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZChDTlVNQkVSU1t5XSk7CisgICAgICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoQ05VTUJFUlNbeF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHggKyB5OworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoQ05VTUJFUlNbeF0pOworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoIisiKTsKKyAgICAgICAgICAgICAgICBzdUNoaW5lc2UuYXBwZW5kKENOVU1CRVJTW3ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4ID49IHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0geCAtIHk7CisgICAgICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZChDTlVNQkVSU1t4XSk7CisgICAgICAgICAgICAgICAgc3VDaGluZXNlLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoQ05VTUJFUlNbeV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHkgLSB4OworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoQ05VTUJFUlNbeV0pOworICAgICAgICAgICAgICAgIHN1Q2hpbmVzZS5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICBzdUNoaW5lc2UuYXBwZW5kKENOVU1CRVJTW3hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdUNoaW5lc2UuYXBwZW5kKCI9P0AiICsgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHN1Q2hpbmVzZS50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9NeUJhdGlzQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9NeUJhdGlzQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3Yzk0MQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL015QmF0aXNDb25maWcuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmlvLlZGUzsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5zZXNzaW9uLlNxbFNlc3Npb25GYWN0b3J5OworaW1wb3J0IG9yZy5teWJhdGlzLnNwcmluZy5TcWxTZXNzaW9uRmFjdG9yeUJlYW47CitpbXBvcnQgb3JnLm15YmF0aXMuc3ByaW5nLmJvb3QuYXV0b2NvbmZpZ3VyZS5TcHJpbmdCb290VkZTOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmVudi5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuaW8uRGVmYXVsdFJlc291cmNlTG9hZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuaW8uc3VwcG9ydC5QYXRoTWF0Y2hpbmdSZXNvdXJjZVBhdHRlcm5SZXNvbHZlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuaW8uc3VwcG9ydC5SZXNvdXJjZVBhdHRlcm5SZXNvbHZlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUudHlwZS5jbGFzc3JlYWRpbmcuQ2FjaGluZ01ldGFkYXRhUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUudHlwZS5jbGFzc3JlYWRpbmcuTWV0YWRhdGFSZWFkZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLnR5cGUuY2xhc3NyZWFkaW5nLk1ldGFkYXRhUmVhZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuQ2xhc3NVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIE15YmF0aXPmlK/mjIEq5Yy56YWN5omr5o+P5YyFCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBNeUJhdGlzQ29uZmlnCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgRW52aXJvbm1lbnQgZW52OworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX1BBVFRFUk4gPSAiKiovKi5jbGFzcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXRUeXBlQWxpYXNlc1BhY2thZ2UoU3RyaW5nIHR5cGVBbGlhc2VzUGFja2FnZSkKKyAgICB7CisgICAgICAgIFJlc291cmNlUGF0dGVyblJlc29sdmVyIHJlc29sdmVyID0gKFJlc291cmNlUGF0dGVyblJlc29sdmVyKSBuZXcgUGF0aE1hdGNoaW5nUmVzb3VyY2VQYXR0ZXJuUmVzb2x2ZXIoKTsKKyAgICAgICAgTWV0YWRhdGFSZWFkZXJGYWN0b3J5IG1ldGFkYXRhUmVhZGVyRmFjdG9yeSA9IG5ldyBDYWNoaW5nTWV0YWRhdGFSZWFkZXJGYWN0b3J5KHJlc29sdmVyKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXNlc1BhY2thZ2UgOiB0eXBlQWxpYXNlc1BhY2thZ2Uuc3BsaXQoIiwiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgYWxpYXNlc1BhY2thZ2UgPSBSZXNvdXJjZVBhdHRlcm5SZXNvbHZlci5DTEFTU1BBVEhfQUxMX1VSTF9QUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgQ2xhc3NVdGlscy5jb252ZXJ0Q2xhc3NOYW1lVG9SZXNvdXJjZVBhdGgoYWxpYXNlc1BhY2thZ2UudHJpbSgpKSArICIvIiArIERFRkFVTFRfUkVTT1VSQ0VfUEFUVEVSTjsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJlc29sdmVyLmdldFJlc291cmNlcyhhbGlhc2VzUGFja2FnZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFSZWFkZXIgbWV0YWRhdGFSZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuaXNSZWFkYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVhZGVyID0gbWV0YWRhdGFSZWFkZXJGYWN0b3J5LmdldE1ldGFkYXRhUmVhZGVyKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoQ2xhc3MuZm9yTmFtZShtZXRhZGF0YVJlYWRlci5nZXRDbGFzc01ldGFkYXRhKCkuZ2V0Q2xhc3NOYW1lKCkpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGhhc2hSZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGFsbFJlc3VsdC5hZGRBbGwoaGFzaFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsbFJlc3VsdC5zaXplKCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGVBbGlhc2VzUGFja2FnZSA9IFN0cmluZy5qb2luKCIsIiwgKFN0cmluZ1tdKSBhbGxSZXN1bHQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm15YmF0aXMgdHlwZUFsaWFzZXNQYWNrYWdlIOi3r+W+hOaJq+aPj+mUmeivryzlj4LmlbB0eXBlQWxpYXNlc1BhY2thZ2U6IiArIHR5cGVBbGlhc2VzUGFja2FnZSArICLmnKrmib7liLDku7vkvZXljIUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZUFsaWFzZXNQYWNrYWdlOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvdXJjZVtdIHJlc29sdmVNYXBwZXJMb2NhdGlvbnMoU3RyaW5nW10gbWFwcGVyTG9jYXRpb25zKQorICAgIHsKKyAgICAgICAgUmVzb3VyY2VQYXR0ZXJuUmVzb2x2ZXIgcmVzb3VyY2VSZXNvbHZlciA9IG5ldyBQYXRoTWF0Y2hpbmdSZXNvdXJjZVBhdHRlcm5SZXNvbHZlcigpOworICAgICAgICBMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworICAgICAgICBpZiAobWFwcGVyTG9jYXRpb25zICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1hcHBlckxvY2F0aW9uIDogbWFwcGVyTG9jYXRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VbXSBtYXBwZXJzID0gcmVzb3VyY2VSZXNvbHZlci5nZXRSZXNvdXJjZXMobWFwcGVyTG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWFwcGVycykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb3VyY2VzLnRvQXJyYXkobmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBAQmVhbgorICAgIHB1YmxpYyBTcWxTZXNzaW9uRmFjdG9yeSBzcWxTZXNzaW9uRmFjdG9yeShEYXRhU291cmNlIGRhdGFTb3VyY2UpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyB0eXBlQWxpYXNlc1BhY2thZ2UgPSBlbnYuZ2V0UHJvcGVydHkoIm15YmF0aXMudHlwZUFsaWFzZXNQYWNrYWdlIik7CisgICAgICAgIFN0cmluZyBtYXBwZXJMb2NhdGlvbnMgPSBlbnYuZ2V0UHJvcGVydHkoIm15YmF0aXMubWFwcGVyTG9jYXRpb25zIik7CisgICAgICAgIFN0cmluZyBjb25maWdMb2NhdGlvbiA9IGVudi5nZXRQcm9wZXJ0eSgibXliYXRpcy5jb25maWdMb2NhdGlvbiIpOworICAgICAgICB0eXBlQWxpYXNlc1BhY2thZ2UgPSBzZXRUeXBlQWxpYXNlc1BhY2thZ2UodHlwZUFsaWFzZXNQYWNrYWdlKTsKKyAgICAgICAgVkZTLmFkZEltcGxDbGFzcyhTcHJpbmdCb290VkZTLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBTcWxTZXNzaW9uRmFjdG9yeUJlYW4gc2Vzc2lvbkZhY3RvcnkgPSBuZXcgU3FsU2Vzc2lvbkZhY3RvcnlCZWFuKCk7CisgICAgICAgIHNlc3Npb25GYWN0b3J5LnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgICAgIHNlc3Npb25GYWN0b3J5LnNldFR5cGVBbGlhc2VzUGFja2FnZSh0eXBlQWxpYXNlc1BhY2thZ2UpOworICAgICAgICBzZXNzaW9uRmFjdG9yeS5zZXRNYXBwZXJMb2NhdGlvbnMocmVzb2x2ZU1hcHBlckxvY2F0aW9ucyhTdHJpbmdVdGlscy5zcGxpdChtYXBwZXJMb2NhdGlvbnMsICIsIikpKTsKKyAgICAgICAgc2Vzc2lvbkZhY3Rvcnkuc2V0Q29uZmlnTG9jYXRpb24obmV3IERlZmF1bHRSZXNvdXJjZUxvYWRlcigpLmdldFJlc291cmNlKGNvbmZpZ0xvY2F0aW9uKSk7CisgICAgICAgIHJldHVybiBzZXNzaW9uRmFjdG9yeS5nZXRPYmplY3QoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvUmVkaXNDb25maWcuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL1JlZGlzQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MzIzNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL1JlZGlzQ29uZmlnLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmNvbmZpZzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY2FjaGUuYW5ub3RhdGlvbi5DYWNoaW5nQ29uZmlndXJlclN1cHBvcnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jYWNoZS5hbm5vdGF0aW9uLkVuYWJsZUNhY2hpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5jb25uZWN0aW9uLlJlZGlzQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlZGlzLmNvcmUuUmVkaXNUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVkaXMuY29yZS5zY3JpcHQuRGVmYXVsdFJlZGlzU2NyaXB0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZWRpcy5zZXJpYWxpemVyLlN0cmluZ1JlZGlzU2VyaWFsaXplcjsKKworLyoqCisgKiByZWRpc+mFjee9rgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCitAQ29uZmlndXJhdGlvbgorQEVuYWJsZUNhY2hpbmcKK3B1YmxpYyBjbGFzcyBSZWRpc0NvbmZpZyBleHRlbmRzIENhY2hpbmdDb25maWd1cmVyU3VwcG9ydAoreworICAgIEBCZWFuCisgICAgQFN1cHByZXNzV2FybmluZ3ModmFsdWUgPSB7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisgICAgcHVibGljIFJlZGlzVGVtcGxhdGU8T2JqZWN0LCBPYmplY3Q+IHJlZGlzVGVtcGxhdGUoUmVkaXNDb25uZWN0aW9uRmFjdG9yeSBjb25uZWN0aW9uRmFjdG9yeSkKKyAgICB7CisgICAgICAgIFJlZGlzVGVtcGxhdGU8T2JqZWN0LCBPYmplY3Q+IHRlbXBsYXRlID0gbmV3IFJlZGlzVGVtcGxhdGU8PigpOworICAgICAgICB0ZW1wbGF0ZS5zZXRDb25uZWN0aW9uRmFjdG9yeShjb25uZWN0aW9uRmFjdG9yeSk7CisKKyAgICAgICAgRmFzdEpzb24ySnNvblJlZGlzU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZhc3RKc29uMkpzb25SZWRpc1NlcmlhbGl6ZXIoT2JqZWN0LmNsYXNzKTsKKworICAgICAgICAvLyDkvb/nlKhTdHJpbmdSZWRpc1NlcmlhbGl6ZXLmnaXluo/liJfljJblkozlj43luo/liJfljJZyZWRpc+eahGtleeWAvAorICAgICAgICB0ZW1wbGF0ZS5zZXRLZXlTZXJpYWxpemVyKG5ldyBTdHJpbmdSZWRpc1NlcmlhbGl6ZXIoKSk7CisgICAgICAgIHRlbXBsYXRlLnNldFZhbHVlU2VyaWFsaXplcihzZXJpYWxpemVyKTsKKworICAgICAgICAvLyBIYXNo55qEa2V55Lmf6YeH55SoU3RyaW5nUmVkaXNTZXJpYWxpemVy55qE5bqP5YiX5YyW5pa55byPCisgICAgICAgIHRlbXBsYXRlLnNldEhhc2hLZXlTZXJpYWxpemVyKG5ldyBTdHJpbmdSZWRpc1NlcmlhbGl6ZXIoKSk7CisgICAgICAgIHRlbXBsYXRlLnNldEhhc2hWYWx1ZVNlcmlhbGl6ZXIoc2VyaWFsaXplcik7CisKKyAgICAgICAgdGVtcGxhdGUuYWZ0ZXJQcm9wZXJ0aWVzU2V0KCk7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgICB9CisKKyAgICBAQmVhbgorICAgIHB1YmxpYyBEZWZhdWx0UmVkaXNTY3JpcHQ8TG9uZz4gbGltaXRTY3JpcHQoKQorICAgIHsKKyAgICAgICAgRGVmYXVsdFJlZGlzU2NyaXB0PExvbmc+IHJlZGlzU2NyaXB0ID0gbmV3IERlZmF1bHRSZWRpc1NjcmlwdDw+KCk7CisgICAgICAgIHJlZGlzU2NyaXB0LnNldFNjcmlwdFRleHQobGltaXRTY3JpcHRUZXh0KCkpOworICAgICAgICByZWRpc1NjcmlwdC5zZXRSZXN1bHRUeXBlKExvbmcuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVkaXNTY3JpcHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog6ZmQ5rWB6ISa5pysCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGltaXRTY3JpcHRUZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAibG9jYWwga2V5ID0gS0VZU1sxXVxuIiArCisgICAgICAgICAgICAgICAgImxvY2FsIGNvdW50ID0gdG9udW1iZXIoQVJHVlsxXSlcbiIgKworICAgICAgICAgICAgICAgICJsb2NhbCB0aW1lID0gdG9udW1iZXIoQVJHVlsyXSlcbiIgKworICAgICAgICAgICAgICAgICJsb2NhbCBjdXJyZW50ID0gcmVkaXMuY2FsbCgnZ2V0Jywga2V5KTtcbiIgKworICAgICAgICAgICAgICAgICJpZiBjdXJyZW50IGFuZCB0b251bWJlcihjdXJyZW50KSA+IGNvdW50IHRoZW5cbiIgKworICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRvbnVtYmVyKGN1cnJlbnQpO1xuIiArCisgICAgICAgICAgICAgICAgImVuZFxuIiArCisgICAgICAgICAgICAgICAgImN1cnJlbnQgPSByZWRpcy5jYWxsKCdpbmNyJywga2V5KVxuIiArCisgICAgICAgICAgICAgICAgImlmIHRvbnVtYmVyKGN1cnJlbnQpID09IDEgdGhlblxuIiArCisgICAgICAgICAgICAgICAgIiAgICByZWRpcy5jYWxsKCdleHBpcmUnLCBrZXksIHRpbWUpXG4iICsKKyAgICAgICAgICAgICAgICAiZW5kXG4iICsKKyAgICAgICAgICAgICAgICAicmV0dXJuIHRvbnVtYmVyKGN1cnJlbnQpOyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvUmVzb3VyY2VzQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9SZXNvdXJjZXNDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZiOTNlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvUmVzb3VyY2VzQ29uZmlnLmphdmEKQEAgLTAsMCArMSw3MyBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLkNhY2hlQ29udHJvbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb3JzLkNvcnNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvcnMuVXJsQmFzZWRDb3JzQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5maWx0ZXIuQ29yc0ZpbHRlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LmNvbmZpZy5hbm5vdGF0aW9uLkludGVyY2VwdG9yUmVnaXN0cnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuc2VydmxldC5jb25maWcuYW5ub3RhdGlvbi5SZXNvdXJjZUhhbmRsZXJSZWdpc3RyeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0LmNvbmZpZy5hbm5vdGF0aW9uLldlYk12Y0NvbmZpZ3VyZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25maWcuUnVvWWlDb25maWc7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5pbnRlcmNlcHRvci5SZXBlYXRTdWJtaXRJbnRlcmNlcHRvcjsKKworLyoqCisgKiDpgJrnlKjphY3nva4KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29uZmlndXJhdGlvbgorcHVibGljIGNsYXNzIFJlc291cmNlc0NvbmZpZyBpbXBsZW1lbnRzIFdlYk12Y0NvbmZpZ3VyZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSZXBlYXRTdWJtaXRJbnRlcmNlcHRvciByZXBlYXRTdWJtaXRJbnRlcmNlcHRvcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlSGFuZGxlcnMoUmVzb3VyY2VIYW5kbGVyUmVnaXN0cnkgcmVnaXN0cnkpCisgICAgeworICAgICAgICAvKiog5pys5Zyw5paH5Lu25LiK5Lyg6Lev5b6EICovCisgICAgICAgIHJlZ2lzdHJ5LmFkZFJlc291cmNlSGFuZGxlcihDb25zdGFudHMuUkVTT1VSQ0VfUFJFRklYICsgIi8qKiIpCisgICAgICAgICAgICAgICAgLmFkZFJlc291cmNlTG9jYXRpb25zKCJmaWxlOiIgKyBSdW9ZaUNvbmZpZy5nZXRQcm9maWxlKCkgKyAiLyIpOworCisgICAgICAgIC8qKiBzd2FnZ2Vy6YWN572uICovCisgICAgICAgIHJlZ2lzdHJ5LmFkZFJlc291cmNlSGFuZGxlcigiL3N3YWdnZXItdWkvKioiKQorICAgICAgICAgICAgICAgIC5hZGRSZXNvdXJjZUxvY2F0aW9ucygiY2xhc3NwYXRoOi9NRVRBLUlORi9yZXNvdXJjZXMvd2ViamFycy9zcHJpbmdmb3gtc3dhZ2dlci11aS8iKQorICAgICAgICAgICAgICAgIC5zZXRDYWNoZUNvbnRyb2woQ2FjaGVDb250cm9sLm1heEFnZSg1LCBUaW1lVW5pdC5IT1VSUykuY2FjaGVQdWJsaWMoKSk7OworICAgIH0KKworICAgIC8qKgorICAgICAqIOiHquWumuS5ieaLpuaIquinhOWImQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEludGVyY2VwdG9ycyhJbnRlcmNlcHRvclJlZ2lzdHJ5IHJlZ2lzdHJ5KQorICAgIHsKKyAgICAgICAgcmVnaXN0cnkuYWRkSW50ZXJjZXB0b3IocmVwZWF0U3VibWl0SW50ZXJjZXB0b3IpLmFkZFBhdGhQYXR0ZXJucygiLyoqIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Leo5Z+f6YWN572uCisgICAgICovCisgICAgQEJlYW4KKyAgICBwdWJsaWMgQ29yc0ZpbHRlciBjb3JzRmlsdGVyKCkKKyAgICB7CisgICAgICAgIENvcnNDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb3JzQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcuc2V0QWxsb3dDcmVkZW50aWFscyh0cnVlKTsKKyAgICAgICAgLy8g6K6+572u6K6/6Zeu5rqQ5Zyw5Z2ACisgICAgICAgIGNvbmZpZy5hZGRBbGxvd2VkT3JpZ2luUGF0dGVybigiKiIpOworICAgICAgICAvLyDorr7nva7orr/pl67mupDor7fmsYLlpLQKKyAgICAgICAgY29uZmlnLmFkZEFsbG93ZWRIZWFkZXIoIioiKTsKKyAgICAgICAgLy8g6K6+572u6K6/6Zeu5rqQ6K+35rGC5pa55rOVCisgICAgICAgIGNvbmZpZy5hZGRBbGxvd2VkTWV0aG9kKCIqIik7CisgICAgICAgIC8vIOacieaViOacnyAxODAw56eSCisgICAgICAgIGNvbmZpZy5zZXRNYXhBZ2UoMTgwMEwpOworICAgICAgICAvLyDmt7vliqDmmKDlsITot6/lvoTvvIzmi6bmiKrkuIDliIfor7fmsYIKKyAgICAgICAgVXJsQmFzZWRDb3JzQ29uZmlndXJhdGlvblNvdXJjZSBzb3VyY2UgPSBuZXcgVXJsQmFzZWRDb3JzQ29uZmlndXJhdGlvblNvdXJjZSgpOworICAgICAgICBzb3VyY2UucmVnaXN0ZXJDb3JzQ29uZmlndXJhdGlvbigiLyoqIiwgY29uZmlnKTsKKyAgICAgICAgLy8g6L+U5Zue5paw55qEQ29yc0ZpbHRlcgorICAgICAgICByZXR1cm4gbmV3IENvcnNGaWx0ZXIoc291cmNlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvU2VjdXJpdHlDb25maWcuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL1NlY3VyaXR5Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL1NlY3VyaXR5Q29uZmlnLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWc7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5IdHRwTWV0aG9kOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uQXV0aGVudGljYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uUHJvdmlkZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uZGFvLkRhb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb25maWcuYW5ub3RhdGlvbi5tZXRob2QuY29uZmlndXJhdGlvbi5FbmFibGVNZXRob2RTZWN1cml0eTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmNvbmZpZy5hbm5vdGF0aW9uLndlYi5idWlsZGVycy5IdHRwU2VjdXJpdHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb25maWcuaHR0cC5TZXNzaW9uQ3JlYXRpb25Qb2xpY3k7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLnVzZXJkZXRhaWxzLlVzZXJEZXRhaWxzU2VydmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmNyeXB0by5iY3J5cHQuQkNyeXB0UGFzc3dvcmRFbmNvZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkud2ViLlNlY3VyaXR5RmlsdGVyQ2hhaW47CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS53ZWIuYXV0aGVudGljYXRpb24uVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uRmlsdGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkud2ViLmF1dGhlbnRpY2F0aW9uLmxvZ291dC5Mb2dvdXRGaWx0ZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuZmlsdGVyLkNvcnNGaWx0ZXI7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWcucHJvcGVydGllcy5QZXJtaXRBbGxVcmxQcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsuc2VjdXJpdHkuZmlsdGVyLkp3dEF1dGhlbnRpY2F0aW9uVG9rZW5GaWx0ZXI7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5oYW5kbGUuQXV0aGVudGljYXRpb25FbnRyeVBvaW50SW1wbDsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLnNlY3VyaXR5LmhhbmRsZS5Mb2dvdXRTdWNjZXNzSGFuZGxlckltcGw7CisKKy8qKgorICogc3ByaW5nIHNlY3VyaXR56YWN572uCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQEVuYWJsZU1ldGhvZFNlY3VyaXR5KHByZVBvc3RFbmFibGVkID0gdHJ1ZSwgc2VjdXJlZEVuYWJsZWQgPSB0cnVlKQorQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBTZWN1cml0eUNvbmZpZworeworICAgIC8qKgorICAgICAqIOiHquWumuS5ieeUqOaIt+iupOivgemAu+i+kQorICAgICAqLworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFVzZXJEZXRhaWxzU2VydmljZSB1c2VyRGV0YWlsc1NlcnZpY2U7CisgICAgCisgICAgLyoqCisgICAgICog6K6k6K+B5aSx6LSl5aSE55CG57G7CisgICAgICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgQXV0aGVudGljYXRpb25FbnRyeVBvaW50SW1wbCB1bmF1dGhvcml6ZWRIYW5kbGVyOworCisgICAgLyoqCisgICAgICog6YCA5Ye65aSE55CG57G7CisgICAgICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgTG9nb3V0U3VjY2Vzc0hhbmRsZXJJbXBsIGxvZ291dFN1Y2Nlc3NIYW5kbGVyOworCisgICAgLyoqCisgICAgICogdG9rZW7orqTor4Hov4fmu6TlmagKKyAgICAgKi8KKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBKd3RBdXRoZW50aWNhdGlvblRva2VuRmlsdGVyIGF1dGhlbnRpY2F0aW9uVG9rZW5GaWx0ZXI7CisgICAgCisgICAgLyoqCisgICAgICog6Leo5Z+f6L+H5ruk5ZmoCisgICAgICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgQ29yc0ZpbHRlciBjb3JzRmlsdGVyOworCisgICAgLyoqCisgICAgICog5YWB6K645Yy/5ZCN6K6/6Zeu55qE5Zyw5Z2ACisgICAgICovCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUGVybWl0QWxsVXJsUHJvcGVydGllcyBwZXJtaXRBbGxVcmw7CisKKyAgICAvKioKKyAgICAgKiDouqvku73pqozor4Hlrp7njrAKKyAgICAgKi8KKyAgICBAQmVhbgorICAgIHB1YmxpYyBBdXRoZW50aWNhdGlvbk1hbmFnZXIgYXV0aGVudGljYXRpb25NYW5hZ2VyKCkKKyAgICB7CisgICAgICAgIERhb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIgZGFvQXV0aGVudGljYXRpb25Qcm92aWRlciA9IG5ldyBEYW9BdXRoZW50aWNhdGlvblByb3ZpZGVyKCk7CisgICAgICAgIGRhb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuc2V0VXNlckRldGFpbHNTZXJ2aWNlKHVzZXJEZXRhaWxzU2VydmljZSk7CisgICAgICAgIGRhb0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuc2V0UGFzc3dvcmRFbmNvZGVyKGJDcnlwdFBhc3N3b3JkRW5jb2RlcigpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlck1hbmFnZXIoZGFvQXV0aGVudGljYXRpb25Qcm92aWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYW55UmVxdWVzdCAgICAgICAgICB8ICAg5Yy56YWN5omA5pyJ6K+35rGC6Lev5b6ECisgICAgICogYWNjZXNzICAgICAgICAgICAgICB8ICAgU3ByaW5nRWzooajovr7lvI/nu5PmnpzkuLp0cnVl5pe25Y+v5Lul6K6/6ZeuCisgICAgICogYW5vbnltb3VzICAgICAgICAgICB8ICAg5Yy/5ZCN5Y+v5Lul6K6/6ZeuCisgICAgICogZGVueUFsbCAgICAgICAgICAgICB8ICAg55So5oi35LiN6IO96K6/6ZeuCisgICAgICogZnVsbHlBdXRoZW50aWNhdGVkICB8ICAg55So5oi35a6M5YWo6K6k6K+B5Y+v5Lul6K6/6Zeu77yI6Z2ecmVtZW1iZXItbWXkuIvoh6rliqjnmbvlvZXvvIkKKyAgICAgKiBoYXNBbnlBdXRob3JpdHkgICAgIHwgICDlpoLmnpzmnInlj4LmlbDvvIzlj4LmlbDooajnpLrmnYPpmZDvvIzliJnlhbbkuK3ku7vkvZXkuIDkuKrmnYPpmZDlj6/ku6Xorr/pl64KKyAgICAgKiBoYXNBbnlSb2xlICAgICAgICAgIHwgICDlpoLmnpzmnInlj4LmlbDvvIzlj4LmlbDooajnpLrop5LoibLvvIzliJnlhbbkuK3ku7vkvZXkuIDkuKrop5LoibLlj6/ku6Xorr/pl64KKyAgICAgKiBoYXNBdXRob3JpdHkgICAgICAgIHwgICDlpoLmnpzmnInlj4LmlbDvvIzlj4LmlbDooajnpLrmnYPpmZDvvIzliJnlhbbmnYPpmZDlj6/ku6Xorr/pl64KKyAgICAgKiBoYXNJcEFkZHJlc3MgICAgICAgIHwgICDlpoLmnpzmnInlj4LmlbDvvIzlj4LmlbDooajnpLpJUOWcsOWdgO+8jOWmguaenOeUqOaIt0lQ5ZKM5Y+C5pWw5Yy56YWN77yM5YiZ5Y+v5Lul6K6/6ZeuCisgICAgICogaGFzUm9sZSAgICAgICAgICAgICB8ICAg5aaC5p6c5pyJ5Y+C5pWw77yM5Y+C5pWw6KGo56S66KeS6Imy77yM5YiZ5YW26KeS6Imy5Y+v5Lul6K6/6ZeuCisgICAgICogcGVybWl0QWxsICAgICAgICAgICB8ICAg55So5oi35Y+v5Lul5Lu75oSP6K6/6ZeuCisgICAgICogcmVtZW1iZXJNZSAgICAgICAgICB8ICAg5YWB6K646YCa6L+HcmVtZW1iZXItbWXnmbvlvZXnmoTnlKjmiLforr/pl64KKyAgICAgKiBhdXRoZW50aWNhdGVkICAgICAgIHwgICDnlKjmiLfnmbvlvZXlkI7lj6/orr/pl64KKyAgICAgKi8KKyAgICBAQmVhbgorICAgIHByb3RlY3RlZCBTZWN1cml0eUZpbHRlckNoYWluIGZpbHRlckNoYWluKEh0dHBTZWN1cml0eSBodHRwU2VjdXJpdHkpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBodHRwU2VjdXJpdHkKKyAgICAgICAgICAgIC8vIENTUkbnpoHnlKjvvIzlm6DkuLrkuI3kvb/nlKhzZXNzaW9uCisgICAgICAgICAgICAuY3NyZihjc3JmIC0+IGNzcmYuZGlzYWJsZSgpKQorICAgICAgICAgICAgLy8g56aB55SoSFRUUOWTjeW6lOagh+WktAorICAgICAgICAgICAgLmhlYWRlcnMoKGhlYWRlcnNDdXN0b21pemVyKSAtPiB7CisgICAgICAgICAgICAgICAgaGVhZGVyc0N1c3RvbWl6ZXIuY2FjaGVDb250cm9sKGNhY2hlIC0+IGNhY2hlLmRpc2FibGUoKSkuZnJhbWVPcHRpb25zKG9wdGlvbnMgLT4gb3B0aW9ucy5zYW1lT3JpZ2luKCkpOworICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC8vIOiupOivgeWksei0peWkhOeQhuexuworICAgICAgICAgICAgLmV4Y2VwdGlvbkhhbmRsaW5nKGV4Y2VwdGlvbiAtPiBleGNlcHRpb24uYXV0aGVudGljYXRpb25FbnRyeVBvaW50KHVuYXV0aG9yaXplZEhhbmRsZXIpKQorICAgICAgICAgICAgLy8g5Z+65LqOdG9rZW7vvIzmiYDku6XkuI3pnIDopoFzZXNzaW9uCisgICAgICAgICAgICAuc2Vzc2lvbk1hbmFnZW1lbnQoc2Vzc2lvbiAtPiBzZXNzaW9uLnNlc3Npb25DcmVhdGlvblBvbGljeShTZXNzaW9uQ3JlYXRpb25Qb2xpY3kuU1RBVEVMRVNTKSkKKyAgICAgICAgICAgIC8vIOazqOino+agh+iusOWFgeiuuOWMv+WQjeiuv+mXrueahHVybAorICAgICAgICAgICAgLmF1dGhvcml6ZUh0dHBSZXF1ZXN0cygocmVxdWVzdHMpIC0+IHsKKyAgICAgICAgICAgICAgICBwZXJtaXRBbGxVcmwuZ2V0VXJscygpLmZvckVhY2godXJsIC0+IHJlcXVlc3RzLnJlcXVlc3RNYXRjaGVycyh1cmwpLnBlcm1pdEFsbCgpKTsKKyAgICAgICAgICAgICAgICAvLyDlr7nkuo7nmbvlvZVsb2dpbiDms6jlhoxyZWdpc3RlciDpqozor4HnoIFjYXB0Y2hhSW1hZ2Ug5YWB6K645Yy/5ZCN6K6/6ZeuCisgICAgICAgICAgICAgICAgcmVxdWVzdHMucmVxdWVzdE1hdGNoZXJzKCIvbG9naW4iLCAiL3JlZ2lzdGVyIiwgIi9jYXB0Y2hhSW1hZ2UiKS5wZXJtaXRBbGwoKQorICAgICAgICAgICAgICAgICAgICAvLyDpnZnmgIHotYTmupDvvIzlj6/ljL/lkI3orr/pl64KKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3RNYXRjaGVycyhIdHRwTWV0aG9kLkdFVCwgIi8iLCAiLyouaHRtbCIsICIvKiouaHRtbCIsICIvKiouY3NzIiwgIi8qKi5qcyIsICIvcHJvZmlsZS8qKiIpLnBlcm1pdEFsbCgpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0TWF0Y2hlcnMoIi9zd2FnZ2VyLXVpLmh0bWwiLCAiL3YzL2FwaS1kb2NzLyoqIiwgIi9zd2FnZ2VyLXVpLyoqIiwgIi9kcnVpZC8qKiIpLnBlcm1pdEFsbCgpCisgICAgICAgICAgICAgICAgICAgIC8vIOmZpOS4iumdouWklueahOaJgOacieivt+axguWFqOmDqOmcgOimgemJtOadg+iupOivgQorICAgICAgICAgICAgICAgICAgICAuYW55UmVxdWVzdCgpLmF1dGhlbnRpY2F0ZWQoKTsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAvLyDmt7vliqBMb2dvdXQgZmlsdGVyCisgICAgICAgICAgICAubG9nb3V0KGxvZ291dCAtPiBsb2dvdXQubG9nb3V0VXJsKCIvbG9nb3V0IikubG9nb3V0U3VjY2Vzc0hhbmRsZXIobG9nb3V0U3VjY2Vzc0hhbmRsZXIpKQorICAgICAgICAgICAgLy8g5re75YqgSldUIGZpbHRlcgorICAgICAgICAgICAgLmFkZEZpbHRlckJlZm9yZShhdXRoZW50aWNhdGlvblRva2VuRmlsdGVyLCBVc2VybmFtZVBhc3N3b3JkQXV0aGVudGljYXRpb25GaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAvLyDmt7vliqBDT1JTIGZpbHRlcgorICAgICAgICAgICAgLmFkZEZpbHRlckJlZm9yZShjb3JzRmlsdGVyLCBKd3RBdXRoZW50aWNhdGlvblRva2VuRmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgLmFkZEZpbHRlckJlZm9yZShjb3JzRmlsdGVyLCBMb2dvdXRGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlvLrmlaPliJflk4jluIzliqDlr4blrp7njrAKKyAgICAgKi8KKyAgICBAQmVhbgorICAgIHB1YmxpYyBCQ3J5cHRQYXNzd29yZEVuY29kZXIgYkNyeXB0UGFzc3dvcmRFbmNvZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQkNyeXB0UGFzc3dvcmRFbmNvZGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvU2VydmVyQ29uZmlnLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9TZXJ2ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhmYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvU2VydmVyQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmNvbmZpZzsKKworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VydmxldFV0aWxzOworCisvKioKKyAqIOacjeWKoeebuOWFs+mFjee9rgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBTZXJ2ZXJDb25maWcKK3sKKyAgICAvKioKKyAgICAgKiDojrflj5blrozmlbTnmoTor7fmsYLot6/lvoTvvIzljIXmi6zvvJrln5/lkI3vvIznq6/lj6PvvIzkuIrkuIvmloforr/pl67ot6/lvoQKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOacjeWKoeWcsOWdgAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkKKyAgICB7CisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gU2VydmxldFV0aWxzLmdldFJlcXVlc3QoKTsKKyAgICAgICAgcmV0dXJuIGdldERvbWFpbihyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREb21haW4oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCk7CisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0U2VydmxldENvbnRleHQoKS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICByZXR1cm4gdXJsLmRlbGV0ZSh1cmwubGVuZ3RoKCkgLSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5sZW5ndGgoKSwgdXJsLmxlbmd0aCgpKS5hcHBlbmQoY29udGV4dFBhdGgpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvVGhyZWFkUG9vbENvbmZpZy5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvVGhyZWFkUG9vbENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDAxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9UaHJlYWRQb29sQ29uZmlnLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLmNvbmZpZzsKKworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuVGhyZWFkczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuY29uY3VycmVudC5CYXNpY1RocmVhZEZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2NoZWR1bGluZy5jb25jdXJyZW50LlRocmVhZFBvb2xUYXNrRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CisKKy8qKgorICog57q/56iL5rGg6YWN572uCisgKgorICogQGF1dGhvciBydW95aQorICoqLworQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sQ29uZmlnCit7CisgICAgLy8g5qC45b+D57q/56iL5rGg5aSn5bCPCisgICAgcHJpdmF0ZSBpbnQgY29yZVBvb2xTaXplID0gNTA7CisKKyAgICAvLyDmnIDlpKflj6/liJvlu7rnmoTnur/nqIvmlbAKKyAgICBwcml2YXRlIGludCBtYXhQb29sU2l6ZSA9IDIwMDsKKworICAgIC8vIOmYn+WIl+acgOWkp+mVv+W6pgorICAgIHByaXZhdGUgaW50IHF1ZXVlQ2FwYWNpdHkgPSAxMDAwOworCisgICAgLy8g57q/56iL5rGg57u05oqk57q/56iL5omA5YWB6K6455qE56m66Zey5pe26Ze0CisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlU2Vjb25kcyA9IDMwMDsKKworICAgIEBCZWFuKG5hbWUgPSAidGhyZWFkUG9vbFRhc2tFeGVjdXRvciIpCisgICAgcHVibGljIFRocmVhZFBvb2xUYXNrRXhlY3V0b3IgdGhyZWFkUG9vbFRhc2tFeGVjdXRvcigpCisgICAgeworICAgICAgICBUaHJlYWRQb29sVGFza0V4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IFRocmVhZFBvb2xUYXNrRXhlY3V0b3IoKTsKKyAgICAgICAgZXhlY3V0b3Iuc2V0TWF4UG9vbFNpemUobWF4UG9vbFNpemUpOworICAgICAgICBleGVjdXRvci5zZXRDb3JlUG9vbFNpemUoY29yZVBvb2xTaXplKTsKKyAgICAgICAgZXhlY3V0b3Iuc2V0UXVldWVDYXBhY2l0eShxdWV1ZUNhcGFjaXR5KTsKKyAgICAgICAgZXhlY3V0b3Iuc2V0S2VlcEFsaXZlU2Vjb25kcyhrZWVwQWxpdmVTZWNvbmRzKTsKKyAgICAgICAgLy8g57q/56iL5rGg5a+55ouS57ud5Lu75YqhKOaXoOe6v+eoi+WPr+eUqCnnmoTlpITnkIbnrZbnlaUKKyAgICAgICAgZXhlY3V0b3Iuc2V0UmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuQ2FsbGVyUnVuc1BvbGljeSgpKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJp+ihjOWRqOacn+aAp+aIluWumuaXtuS7u+WKoQorICAgICAqLworICAgIEBCZWFuKG5hbWUgPSAic2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIikKKyAgICBwcm90ZWN0ZWQgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcihjb3JlUG9vbFNpemUsCisgICAgICAgICAgICAgICAgbmV3IEJhc2ljVGhyZWFkRmFjdG9yeS5CdWlsZGVyKCkubmFtaW5nUGF0dGVybigic2NoZWR1bGUtcG9vbC0lZCIpLmRhZW1vbih0cnVlKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuQ2FsbGVyUnVuc1BvbGljeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyRXhlY3V0ZShSdW5uYWJsZSByLCBUaHJvd2FibGUgdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdXBlci5hZnRlckV4ZWN1dGUociwgdCk7CisgICAgICAgICAgICAgICAgVGhyZWFkcy5wcmludEV4Y2VwdGlvbihyLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2NvbmZpZy9wcm9wZXJ0aWVzL0RydWlkUHJvcGVydGllcy5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvcHJvcGVydGllcy9EcnVpZFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE1YzhhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvcHJvcGVydGllcy9EcnVpZFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDg5IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuY29uZmlnLnByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5hbGliYWJhLmRydWlkLnBvb2wuRHJ1aWREYXRhU291cmNlOworCisvKioKKyAqIGRydWlkIOmFjee9ruWxnuaApworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb25maWd1cmF0aW9uCitwdWJsaWMgY2xhc3MgRHJ1aWRQcm9wZXJ0aWVzCit7CisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLmluaXRpYWxTaXplfSIpCisgICAgcHJpdmF0ZSBpbnQgaW5pdGlhbFNpemU7CisKKyAgICBAVmFsdWUoIiR7c3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQubWluSWRsZX0iKQorICAgIHByaXZhdGUgaW50IG1pbklkbGU7CisKKyAgICBAVmFsdWUoIiR7c3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQubWF4QWN0aXZlfSIpCisgICAgcHJpdmF0ZSBpbnQgbWF4QWN0aXZlOworCisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLm1heFdhaXR9IikKKyAgICBwcml2YXRlIGludCBtYXhXYWl0OworCisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLmNvbm5lY3RUaW1lb3V0fSIpCisgICAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXQ7CisKKyAgICBAVmFsdWUoIiR7c3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQuc29ja2V0VGltZW91dH0iKQorICAgIHByaXZhdGUgaW50IHNvY2tldFRpbWVvdXQ7CisKKyAgICBAVmFsdWUoIiR7c3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQudGltZUJldHdlZW5FdmljdGlvblJ1bnNNaWxsaXN9IikKKyAgICBwcml2YXRlIGludCB0aW1lQmV0d2VlbkV2aWN0aW9uUnVuc01pbGxpczsKKworICAgIEBWYWx1ZSgiJHtzcHJpbmcuZGF0YXNvdXJjZS5kcnVpZC5taW5FdmljdGFibGVJZGxlVGltZU1pbGxpc30iKQorICAgIHByaXZhdGUgaW50IG1pbkV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzOworCisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLm1heEV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzfSIpCisgICAgcHJpdmF0ZSBpbnQgbWF4RXZpY3RhYmxlSWRsZVRpbWVNaWxsaXM7CisKKyAgICBAVmFsdWUoIiR7c3ByaW5nLmRhdGFzb3VyY2UuZHJ1aWQudmFsaWRhdGlvblF1ZXJ5fSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblF1ZXJ5OworCisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLnRlc3RXaGlsZUlkbGV9IikKKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdFdoaWxlSWRsZTsKKworICAgIEBWYWx1ZSgiJHtzcHJpbmcuZGF0YXNvdXJjZS5kcnVpZC50ZXN0T25Cb3Jyb3d9IikKKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdE9uQm9ycm93OworCisgICAgQFZhbHVlKCIke3NwcmluZy5kYXRhc291cmNlLmRydWlkLnRlc3RPblJldHVybn0iKQorICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0T25SZXR1cm47CisKKyAgICBwdWJsaWMgRHJ1aWREYXRhU291cmNlIGRhdGFTb3VyY2UoRHJ1aWREYXRhU291cmNlIGRhdGFzb3VyY2UpCisgICAgeworICAgICAgICAvKiog6YWN572u5Yid5aeL5YyW5aSn5bCP44CB5pyA5bCP44CB5pyA5aSnICovCisgICAgICAgIGRhdGFzb3VyY2Uuc2V0SW5pdGlhbFNpemUoaW5pdGlhbFNpemUpOworICAgICAgICBkYXRhc291cmNlLnNldE1heEFjdGl2ZShtYXhBY3RpdmUpOworICAgICAgICBkYXRhc291cmNlLnNldE1pbklkbGUobWluSWRsZSk7CisKKyAgICAgICAgLyoqIOmFjee9ruiOt+WPlui/nuaOpeetieW+hei2heaXtueahOaXtumXtCAqLworICAgICAgICBkYXRhc291cmNlLnNldE1heFdhaXQobWF4V2FpdCk7CisgICAgICAgIAorICAgICAgICAvKiog6YWN572u6amx5Yqo6L+e5o6l6LaF5pe25pe26Ze077yM5qOA5rWL5pWw5o2u5bqT5bu656uL6L+e5o6l55qE6LaF5pe25pe26Ze077yM5Y2V5L2N5piv5q+r56eSICovCisgICAgICAgIGRhdGFzb3VyY2Uuc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXQpOworICAgICAgICAKKyAgICAgICAgLyoqIOmFjee9rue9kee7nOi2heaXtuaXtumXtO+8jOetieW+heaVsOaNruW6k+aTjeS9nOWujOaIkOeahOe9kee7nOi2heaXtuaXtumXtO+8jOWNleS9jeaYr+avq+enkiAqLworICAgICAgICBkYXRhc291cmNlLnNldFNvY2tldFRpbWVvdXQoc29ja2V0VGltZW91dCk7CisKKyAgICAgICAgLyoqIOmFjee9rumXtOmalOWkmuS5heaJjei/m+ihjOS4gOasoeajgOa1i++8jOajgOa1i+mcgOimgeWFs+mXreeahOepuumXsui/nuaOpe+8jOWNleS9jeaYr+avq+enkiAqLworICAgICAgICBkYXRhc291cmNlLnNldFRpbWVCZXR3ZWVuRXZpY3Rpb25SdW5zTWlsbGlzKHRpbWVCZXR3ZWVuRXZpY3Rpb25SdW5zTWlsbGlzKTsKKworICAgICAgICAvKiog6YWN572u5LiA5Liq6L+e5o6l5Zyo5rGg5Lit5pyA5bCP44CB5pyA5aSn55Sf5a2Y55qE5pe26Ze077yM5Y2V5L2N5piv5q+r56eSICovCisgICAgICAgIGRhdGFzb3VyY2Uuc2V0TWluRXZpY3RhYmxlSWRsZVRpbWVNaWxsaXMobWluRXZpY3RhYmxlSWRsZVRpbWVNaWxsaXMpOworICAgICAgICBkYXRhc291cmNlLnNldE1heEV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzKG1heEV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICog55So5p2l5qOA5rWL6L+e5o6l5piv5ZCm5pyJ5pWI55qEc3Fs77yM6KaB5rGC5piv5LiA5Liq5p+l6K+i6K+t5Y+l77yM5bi455Soc2VsZWN0ICd4J+OAguWmguaenHZhbGlkYXRpb25RdWVyeeS4um51bGzvvIx0ZXN0T25Cb3Jyb3fjgIF0ZXN0T25SZXR1cm7jgIF0ZXN0V2hpbGVJZGxl6YO95LiN5Lya6LW35L2c55So44CCCisgICAgICAgICAqLworICAgICAgICBkYXRhc291cmNlLnNldFZhbGlkYXRpb25RdWVyeSh2YWxpZGF0aW9uUXVlcnkpOworICAgICAgICAvKiog5bu66K6u6YWN572u5Li6dHJ1Ze+8jOS4jeW9seWTjeaAp+iDve+8jOW5tuS4lOS/neivgeWuieWFqOaAp+OAgueUs+ivt+i/nuaOpeeahOaXtuWAmeajgOa1i++8jOWmguaenOepuumXsuaXtumXtOWkp+S6jnRpbWVCZXR3ZWVuRXZpY3Rpb25SdW5zTWlsbGlz77yM5omn6KGMdmFsaWRhdGlvblF1ZXJ55qOA5rWL6L+e5o6l5piv5ZCm5pyJ5pWI44CCICovCisgICAgICAgIGRhdGFzb3VyY2Uuc2V0VGVzdFdoaWxlSWRsZSh0ZXN0V2hpbGVJZGxlKTsKKyAgICAgICAgLyoqIOeUs+ivt+i/nuaOpeaXtuaJp+ihjHZhbGlkYXRpb25RdWVyeeajgOa1i+i/nuaOpeaYr+WQpuacieaViO+8jOWBmuS6hui/meS4qumFjee9ruS8mumZjeS9juaAp+iDveOAgiAqLworICAgICAgICBkYXRhc291cmNlLnNldFRlc3RPbkJvcnJvdyh0ZXN0T25Cb3Jyb3cpOworICAgICAgICAvKiog5b2S6L+Y6L+e5o6l5pe25omn6KGMdmFsaWRhdGlvblF1ZXJ55qOA5rWL6L+e5o6l5piv5ZCm5pyJ5pWI77yM5YGa5LqG6L+Z5Liq6YWN572u5Lya6ZmN5L2O5oCn6IO944CCICovCisgICAgICAgIGRhdGFzb3VyY2Uuc2V0VGVzdE9uUmV0dXJuKHRlc3RPblJldHVybik7CisgICAgICAgIHJldHVybiBkYXRhc291cmNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL3Byb3BlcnRpZXMvUGVybWl0QWxsVXJsUHJvcGVydGllcy5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9jb25maWcvcHJvcGVydGllcy9QZXJtaXRBbGxVcmxQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3YmEzYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvY29uZmlnL3Byb3BlcnRpZXMvUGVybWl0QWxsVXJsUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5jb25maWcucHJvcGVydGllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlJlZ0V4VXRpbHM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuSW5pdGlhbGl6aW5nQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHRBd2FyZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tZXRob2QuSGFuZGxlck1ldGhvZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5zZXJ2bGV0Lm12Yy5tZXRob2QuUmVxdWVzdE1hcHBpbmdJbmZvOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQubXZjLm1ldGhvZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nSGFuZGxlck1hcHBpbmc7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkFub255bW91czsKKworLyoqCisgKiDorr7nva5Bbm9ueW1vdXPms6jop6PlhYHorrjljL/lkI3orr/pl67nmoR1cmwKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29uZmlndXJhdGlvbgorcHVibGljIGNsYXNzIFBlcm1pdEFsbFVybFByb3BlcnRpZXMgaW1wbGVtZW50cyBJbml0aWFsaXppbmdCZWFuLCBBcHBsaWNhdGlvbkNvbnRleHRBd2FyZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXFx7KC4qPylcXH0iKTsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHVybHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBTdHJpbmcgQVNURVJJU0sgPSAiKiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZnRlclByb3BlcnRpZXNTZXQoKQorICAgIHsKKyAgICAgICAgUmVxdWVzdE1hcHBpbmdIYW5kbGVyTWFwcGluZyBtYXBwaW5nID0gYXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oUmVxdWVzdE1hcHBpbmdIYW5kbGVyTWFwcGluZy5jbGFzcyk7CisgICAgICAgIE1hcDxSZXF1ZXN0TWFwcGluZ0luZm8sIEhhbmRsZXJNZXRob2Q+IG1hcCA9IG1hcHBpbmcuZ2V0SGFuZGxlck1ldGhvZHMoKTsKKworICAgICAgICBtYXAua2V5U2V0KCkuZm9yRWFjaChpbmZvIC0+IHsKKyAgICAgICAgICAgIEhhbmRsZXJNZXRob2QgaGFuZGxlck1ldGhvZCA9IG1hcC5nZXQoaW5mbyk7CisKKyAgICAgICAgICAgIC8vIOiOt+WPluaWueazleS4iui+ueeahOazqOinoyDmm7/ku6NwYXRoIHZhcmlhYmxlIOS4uiAqCisgICAgICAgICAgICBBbm9ueW1vdXMgbWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmZpbmRBbm5vdGF0aW9uKGhhbmRsZXJNZXRob2QuZ2V0TWV0aG9kKCksIEFub255bW91cy5jbGFzcyk7CisgICAgICAgICAgICBPcHRpb25hbC5vZk51bGxhYmxlKG1ldGhvZCkuaWZQcmVzZW50KGFub255bW91cyAtPiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGluZm8uZ2V0UGF0aFBhdHRlcm5zQ29uZGl0aW9uKCkuZ2V0UGF0dGVyblZhbHVlcygpKSAvLworICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh1cmwgLT4gdXJscy5hZGQoUmVnRXhVdGlscy5yZXBsYWNlQWxsKHVybCwgUEFUVEVSTiwgQVNURVJJU0spKSkpOworCisgICAgICAgICAgICAvLyDojrflj5bnsbvkuIrovrnnmoTms6jop6MsIOabv+S7o3BhdGggdmFyaWFibGUg5Li6ICoKKyAgICAgICAgICAgIEFub255bW91cyBjb250cm9sbGVyID0gQW5ub3RhdGlvblV0aWxzLmZpbmRBbm5vdGF0aW9uKGhhbmRsZXJNZXRob2QuZ2V0QmVhblR5cGUoKSwgQW5vbnltb3VzLmNsYXNzKTsKKyAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoY29udHJvbGxlcikuaWZQcmVzZW50KGFub255bW91cyAtPiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGluZm8uZ2V0UGF0aFBhdHRlcm5zQ29uZGl0aW9uKCkuZ2V0UGF0dGVyblZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh1cmwgLT4gdXJscy5hZGQoUmVnRXhVdGlscy5yZXBsYWNlQWxsKHVybCwgUEFUVEVSTiwgQVNURVJJU0spKSkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkNvbnRleHQoQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBCZWFuc0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VXJscygpCisgICAgeworICAgICAgICByZXR1cm4gdXJsczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmxzKExpc3Q8U3RyaW5nPiB1cmxzKQorICAgIHsKKyAgICAgICAgdGhpcy51cmxzID0gdXJsczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2RhdGFzb3VyY2UvRHluYW1pY0RhdGFTb3VyY2UuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvZGF0YXNvdXJjZS9EeW5hbWljRGF0YVNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGI4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2RhdGFzb3VyY2UvRHluYW1pY0RhdGFTb3VyY2UuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuZGF0YXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5qZGJjLmRhdGFzb3VyY2UubG9va3VwLkFic3RyYWN0Um91dGluZ0RhdGFTb3VyY2U7CisKKy8qKgorICog5Yqo5oCB5pWw5o2u5rqQCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIER5bmFtaWNEYXRhU291cmNlIGV4dGVuZHMgQWJzdHJhY3RSb3V0aW5nRGF0YVNvdXJjZQoreworICAgIHB1YmxpYyBEeW5hbWljRGF0YVNvdXJjZShEYXRhU291cmNlIGRlZmF1bHRUYXJnZXREYXRhU291cmNlLCBNYXA8T2JqZWN0LCBPYmplY3Q+IHRhcmdldERhdGFTb3VyY2VzKQorICAgIHsKKyAgICAgICAgc3VwZXIuc2V0RGVmYXVsdFRhcmdldERhdGFTb3VyY2UoZGVmYXVsdFRhcmdldERhdGFTb3VyY2UpOworICAgICAgICBzdXBlci5zZXRUYXJnZXREYXRhU291cmNlcyh0YXJnZXREYXRhU291cmNlcyk7CisgICAgICAgIHN1cGVyLmFmdGVyUHJvcGVydGllc1NldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3QgZGV0ZXJtaW5lQ3VycmVudExvb2t1cEtleSgpCisgICAgeworICAgICAgICByZXR1cm4gRHluYW1pY0RhdGFTb3VyY2VDb250ZXh0SG9sZGVyLmdldERhdGFTb3VyY2VUeXBlKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvZGF0YXNvdXJjZS9EeW5hbWljRGF0YVNvdXJjZUNvbnRleHRIb2xkZXIuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvZGF0YXNvdXJjZS9EeW5hbWljRGF0YVNvdXJjZUNvbnRleHRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzcwYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9kYXRhc291cmNlL0R5bmFtaWNEYXRhU291cmNlQ29udGV4dEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5kYXRhc291cmNlOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiDmlbDmja7mupDliIfmjaLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgRHluYW1pY0RhdGFTb3VyY2VDb250ZXh0SG9sZGVyCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRHluYW1pY0RhdGFTb3VyY2VDb250ZXh0SG9sZGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIOS9v+eUqFRocmVhZExvY2Fs57u05oqk5Y+Y6YeP77yMVGhyZWFkTG9jYWzkuLrmr4/kuKrkvb/nlKjor6Xlj5jph4/nmoTnur/nqIvmj5Dkvpvni6znq4vnmoTlj5jph4/lia/mnKzvvIwKKyAgICAgKiDmiYDku6Xmr4/kuIDkuKrnur/nqIvpg73lj6/ku6Xni6znq4vlnLDmlLnlj5joh6rlt7HnmoTlia/mnKzvvIzogIzkuI3kvJrlvbHlk43lhbblroPnur/nqIvmiYDlr7nlupTnmoTlia/mnKzjgIIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxTdHJpbmc+IENPTlRFWFRfSE9MREVSID0gbmV3IFRocmVhZExvY2FsPD4oKTsKKworICAgIC8qKgorICAgICAqIOiuvue9ruaVsOaNrua6kOeahOWPmOmHjworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREYXRhU291cmNlVHlwZShTdHJpbmcgZHNUeXBlKQorICAgIHsKKyAgICAgICAgbG9nLmluZm8oIuWIh+aNouWIsHt95pWw5o2u5rqQIiwgZHNUeXBlKTsKKyAgICAgICAgQ09OVEVYVF9IT0xERVIuc2V0KGRzVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635b6X5pWw5o2u5rqQ55qE5Y+Y6YePCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YVNvdXJjZVR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENPTlRFWFRfSE9MREVSLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOa4heepuuaVsOaNrua6kOWPmOmHjworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckRhdGFTb3VyY2VUeXBlKCkKKyAgICB7CisgICAgICAgIENPTlRFWFRfSE9MREVSLnJlbW92ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvaW50ZXJjZXB0b3IvUmVwZWF0U3VibWl0SW50ZXJjZXB0b3IuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvaW50ZXJjZXB0b3IvUmVwZWF0U3VibWl0SW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThkMjBmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9pbnRlcmNlcHRvci9SZXBlYXRTdWJtaXRJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5pbnRlcmNlcHRvcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm1ldGhvZC5IYW5kbGVyTWV0aG9kOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZsZXQuSGFuZGxlckludGVyY2VwdG9yOworaW1wb3J0IGNvbS5hbGliYWJhLmZhc3Rqc29uMi5KU09OOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5SZXBlYXRTdWJtaXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VydmxldFV0aWxzOworCisvKioKKyAqIOmYsuatoumHjeWkjeaPkOS6pOaLpuaIquWZqAorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQENvbXBvbmVudAorcHVibGljIGFic3RyYWN0IGNsYXNzIFJlcGVhdFN1Ym1pdEludGVyY2VwdG9yIGltcGxlbWVudHMgSGFuZGxlckludGVyY2VwdG9yCit7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHJlSGFuZGxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBPYmplY3QgaGFuZGxlcikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyTWV0aG9kKQorICAgICAgICB7CisgICAgICAgICAgICBIYW5kbGVyTWV0aG9kIGhhbmRsZXJNZXRob2QgPSAoSGFuZGxlck1ldGhvZCkgaGFuZGxlcjsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBoYW5kbGVyTWV0aG9kLmdldE1ldGhvZCgpOworICAgICAgICAgICAgUmVwZWF0U3VibWl0IGFubm90YXRpb24gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihSZXBlYXRTdWJtaXQuY2xhc3MpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlcGVhdFN1Ym1pdChyZXF1ZXN0LCBhbm5vdGF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFqYXhSZXN1bHQgYWpheFJlc3VsdCA9IEFqYXhSZXN1bHQuZXJyb3IoYW5ub3RhdGlvbi5tZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0VXRpbHMucmVuZGVyU3RyaW5nKHJlc3BvbnNlLCBKU09OLnRvSlNPTlN0cmluZyhhamF4UmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6aqM6K+B5piv5ZCm6YeN5aSN5o+Q5Lqk55Sx5a2Q57G75a6e546w5YW35L2T55qE6Ziy6YeN5aSN5o+Q5Lqk55qE6KeE5YiZCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCDor7fmsYLkv6Hmga8KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiDpmLLph43lpI3ms6jop6Plj4LmlbAKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZXBlYXRTdWJtaXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFJlcGVhdFN1Ym1pdCBhbm5vdGF0aW9uKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvaW50ZXJjZXB0b3IvaW1wbC9TYW1lVXJsRGF0YUludGVyY2VwdG9yLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2ludGVyY2VwdG9yL2ltcGwvU2FtZVVybERhdGFJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2RmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL2ludGVyY2VwdG9yL2ltcGwvU2FtZVVybERhdGFJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuaW50ZXJjZXB0b3IuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IGNvbS5hbGliYWJhLmZhc3Rqc29uMi5KU09OOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5SZXBlYXRTdWJtaXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5DYWNoZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucmVkaXMuUmVkaXNDYWNoZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmZpbHRlci5SZXBlYXRlZGx5UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmh0dHAuSHR0cEhlbHBlcjsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLmludGVyY2VwdG9yLlJlcGVhdFN1Ym1pdEludGVyY2VwdG9yOworCisvKioKKyAqIOWIpOaWreivt+axgnVybOWSjOaVsOaNruaYr+WQpuWSjOS4iuS4gOasoeebuOWQjO+8jAorICog5aaC5p6c5ZKM5LiK5qyh55u45ZCM77yM5YiZ5piv6YeN5aSN5o+Q5Lqk6KGo5Y2V44CCIOacieaViOaXtumXtOS4ujEw56eS5YaF44CCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQENvbXBvbmVudAorcHVibGljIGNsYXNzIFNhbWVVcmxEYXRhSW50ZXJjZXB0b3IgZXh0ZW5kcyBSZXBlYXRTdWJtaXRJbnRlcmNlcHRvcgoreworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgUkVQRUFUX1BBUkFNUyA9ICJyZXBlYXRQYXJhbXMiOworCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBSRVBFQVRfVElNRSA9ICJyZXBlYXRUaW1lIjsKKworICAgIC8vIOS7pOeJjOiHquWumuS5ieagh+ivhgorICAgIEBWYWx1ZSgiJHt0b2tlbi5oZWFkZXJ9IikKKyAgICBwcml2YXRlIFN0cmluZyBoZWFkZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSZWRpc0NhY2hlIHJlZGlzQ2FjaGU7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdFN1Ym1pdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgUmVwZWF0U3VibWl0IGFubm90YXRpb24pCisgICAgeworICAgICAgICBTdHJpbmcgbm93UGFyYW1zID0gIiI7CisgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVwZWF0ZWRseVJlcXVlc3RXcmFwcGVyKQorICAgICAgICB7CisgICAgICAgICAgICBSZXBlYXRlZGx5UmVxdWVzdFdyYXBwZXIgcmVwZWF0ZWRseVJlcXVlc3QgPSAoUmVwZWF0ZWRseVJlcXVlc3RXcmFwcGVyKSByZXF1ZXN0OworICAgICAgICAgICAgbm93UGFyYW1zID0gSHR0cEhlbHBlci5nZXRCb2R5U3RyaW5nKHJlcGVhdGVkbHlSZXF1ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJvZHnlj4LmlbDkuLrnqbrvvIzojrflj5ZQYXJhbWV0ZXLnmoTmlbDmja4KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkobm93UGFyYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm93UGFyYW1zID0gSlNPTi50b0pTT05TdHJpbmcocmVxdWVzdC5nZXRQYXJhbWV0ZXJNYXAoKSk7CisgICAgICAgIH0KKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBub3dEYXRhTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG5vd0RhdGFNYXAucHV0KFJFUEVBVF9QQVJBTVMsIG5vd1BhcmFtcyk7CisgICAgICAgIG5vd0RhdGFNYXAucHV0KFJFUEVBVF9USU1FLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgICAgICAgLy8g6K+35rGC5Zyw5Z2A77yI5L2c5Li65a2Y5pS+Y2FjaGXnmoRrZXnlgLzvvIkKKyAgICAgICAgU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCisgICAgICAgIC8vIOWUr+S4gOWAvO+8iOayoeaciea2iOaBr+WktOWImeS9v+eUqOivt+axguWcsOWdgO+8iQorICAgICAgICBTdHJpbmcgc3VibWl0S2V5ID0gU3RyaW5nVXRpbHMudHJpbVRvRW1wdHkocmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKSk7CisKKyAgICAgICAgLy8g5ZSv5LiA5qCH6K+G77yI5oyH5a6aa2V5ICsgdXJsICsg5raI5oGv5aS077yJCisgICAgICAgIFN0cmluZyBjYWNoZVJlcGVhdEtleSA9IENhY2hlQ29uc3RhbnRzLlJFUEVBVF9TVUJNSVRfS0VZICsgdXJsICsgc3VibWl0S2V5OworCisgICAgICAgIE9iamVjdCBzZXNzaW9uT2JqID0gcmVkaXNDYWNoZS5nZXRDYWNoZU9iamVjdChjYWNoZVJlcGVhdEtleSk7CisgICAgICAgIGlmIChzZXNzaW9uT2JqICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc2Vzc2lvbk1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBzZXNzaW9uT2JqOworICAgICAgICAgICAgaWYgKHNlc3Npb25NYXAuY29udGFpbnNLZXkodXJsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByZURhdGFNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgc2Vzc2lvbk1hcC5nZXQodXJsKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVBhcmFtcyhub3dEYXRhTWFwLCBwcmVEYXRhTWFwKSAmJiBjb21wYXJlVGltZShub3dEYXRhTWFwLCBwcmVEYXRhTWFwLCBhbm5vdGF0aW9uLmludGVydmFsKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2FjaGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY2FjaGVNYXAucHV0KHVybCwgbm93RGF0YU1hcCk7CisgICAgICAgIHJlZGlzQ2FjaGUuc2V0Q2FjaGVPYmplY3QoY2FjaGVSZXBlYXRLZXksIGNhY2hlTWFwLCBhbm5vdGF0aW9uLmludGVydmFsKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3lj4LmlbDmmK/lkKbnm7jlkIwKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZVBhcmFtcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG5vd01hcCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcmVNYXApCisgICAgeworICAgICAgICBTdHJpbmcgbm93UGFyYW1zID0gKFN0cmluZykgbm93TWFwLmdldChSRVBFQVRfUEFSQU1TKTsKKyAgICAgICAgU3RyaW5nIHByZVBhcmFtcyA9IChTdHJpbmcpIHByZU1hcC5nZXQoUkVQRUFUX1BBUkFNUyk7CisgICAgICAgIHJldHVybiBub3dQYXJhbXMuZXF1YWxzKHByZVBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yik5pat5Lik5qyh6Ze06ZqU5pe26Ze0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVUaW1lKE1hcDxTdHJpbmcsIE9iamVjdD4gbm93TWFwLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByZU1hcCwgaW50IGludGVydmFsKQorICAgIHsKKyAgICAgICAgbG9uZyB0aW1lMSA9IChMb25nKSBub3dNYXAuZ2V0KFJFUEVBVF9USU1FKTsKKyAgICAgICAgbG9uZyB0aW1lMiA9IChMb25nKSBwcmVNYXAuZ2V0KFJFUEVBVF9USU1FKTsKKyAgICAgICAgaWYgKCh0aW1lMSAtIHRpbWUyKSA8IGludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL0FzeW5jTWFuYWdlci5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL0FzeW5jTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODdhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL21hbmFnZXIvQXN5bmNNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlRocmVhZHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcHJpbmcuU3ByaW5nVXRpbHM7CisKKy8qKgorICog5byC5q2l5Lu75Yqh566h55CG5ZmoCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jTWFuYWdlcgoreworICAgIC8qKgorICAgICAqIOaTjeS9nOW7tui/nzEw5q+r56eSCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgT1BFUkFURV9ERUxBWV9USU1FID0gMTA7CisKKyAgICAvKioKKyAgICAgKiDlvILmraXmk43kvZzku7vliqHosIPluqbnur/nqIvmsaAKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IFNwcmluZ1V0aWxzLmdldEJlYW4oInNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSIpOworCisgICAgLyoqCisgICAgICog5Y2V5L6L5qih5byPCisgICAgICovCisgICAgcHJpdmF0ZSBBc3luY01hbmFnZXIoKXt9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBc3luY01hbmFnZXIgbWUgPSBuZXcgQXN5bmNNYW5hZ2VyKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIEFzeW5jTWFuYWdlciBtZSgpCisgICAgeworICAgICAgICByZXR1cm4gbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog5omn6KGM5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIHRhc2sg5Lu75YqhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUaW1lclRhc2sgdGFzaykKKyAgICB7CisgICAgICAgIGV4ZWN1dG9yLnNjaGVkdWxlKHRhc2ssIE9QRVJBVEVfREVMQVlfVElNRSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlgZzmraLku7vliqHnur/nqIvmsaAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpCisgICAgeworICAgICAgICBUaHJlYWRzLnNodXRkb3duQW5kQXdhaXRUZXJtaW5hdGlvbihleGVjdXRvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL1NodXRkb3duTWFuYWdlci5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL1NodXRkb3duTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWI4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL21hbmFnZXIvU2h1dGRvd25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXI7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgamFrYXJ0YS5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKKy8qKgorICog56Gu5L+d5bqU55So6YCA5Ye65pe26IO95YWz6Zet5ZCO5Y+w57q/56iLCisgKgorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgU2h1dGRvd25NYW5hZ2VyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKCJzeXMtdXNlciIpOworCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkKKyAgICB7CisgICAgICAgIHNodXRkb3duQXN5bmNNYW5hZ2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5YGc5q2i5byC5q2l5omn6KGM5Lu75YqhCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNodXRkb3duQXN5bmNNYW5hZ2VyKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiPT09PeWFs+mXreWQjuWPsOS7u+WKoeS7u+WKoee6v+eoi+axoD09PT0iKTsKKyAgICAgICAgICAgIEFzeW5jTWFuYWdlci5tZSgpLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL2ZhY3RvcnkvQXN5bmNGYWN0b3J5LmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL21hbmFnZXIvZmFjdG9yeS9Bc3luY0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdlMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9tYW5hZ2VyL2ZhY3RvcnkvQXN5bmNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5tYW5hZ2VyLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5Mb2dVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaXAuQWRkcmVzc1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaXAuSXBVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnNwcmluZy5TcHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNMb2dpbmluZm9yOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c09wZXJMb2c7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNMb2dpbmluZm9yU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c09wZXJMb2dTZXJ2aWNlOworaW1wb3J0IGV1LmJpdHdhbGtlci51c2VyYWdlbnR1dGlscy5Vc2VyQWdlbnQ7CisKKy8qKgorICog5byC5q2l5bel5Y6C77yI5Lqn55Sf5Lu75Yqh55So77yJCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBzeXNfdXNlcl9sb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigic3lzLXVzZXIiKTsKKworICAgIC8qKgorICAgICAqIOiusOW9leeZu+W9leS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VybmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcGFyYW0gc3RhdHVzIOeKtuaAgQorICAgICAqIEBwYXJhbSBtZXNzYWdlIOa2iOaBrworICAgICAqIEBwYXJhbSBhcmdzIOWIl+ihqAorICAgICAqIEByZXR1cm4g5Lu75YqhdGFzaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGltZXJUYXNrIHJlY29yZExvZ2luaW5mb3IoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgc3RhdHVzLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdC4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgZmluYWwgVXNlckFnZW50IHVzZXJBZ2VudCA9IFVzZXJBZ2VudC5wYXJzZVVzZXJBZ2VudFN0cmluZyhTZXJ2bGV0VXRpbHMuZ2V0UmVxdWVzdCgpLmdldEhlYWRlcigiVXNlci1BZ2VudCIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGlwID0gSXBVdGlscy5nZXRJcEFkZHIoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUaW1lclRhc2soKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBBZGRyZXNzVXRpbHMuZ2V0UmVhbEFkZHJlc3NCeUlQKGlwKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHMuYXBwZW5kKExvZ1V0aWxzLmdldEJsb2NrKGlwKSk7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoTG9nVXRpbHMuZ2V0QmxvY2sodXNlcm5hbWUpKTsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChMb2dVdGlscy5nZXRCbG9jayhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChMb2dVdGlscy5nZXRCbG9jayhtZXNzYWdlKSk7CisgICAgICAgICAgICAgICAgLy8g5omT5Y2w5L+h5oGv5Yiw5pel5b+XCisgICAgICAgICAgICAgICAgc3lzX3VzZXJfbG9nZ2VyLmluZm8ocy50b1N0cmluZygpLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAvLyDojrflj5blrqLmiLfnq6/mk43kvZzns7vnu58KKyAgICAgICAgICAgICAgICBTdHJpbmcgb3MgPSB1c2VyQWdlbnQuZ2V0T3BlcmF0aW5nU3lzdGVtKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIC8vIOiOt+WPluWuouaIt+err+a1j+iniOWZqAorICAgICAgICAgICAgICAgIFN0cmluZyBicm93c2VyID0gdXNlckFnZW50LmdldEJyb3dzZXIoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgLy8g5bCB6KOF5a+56LGhCisgICAgICAgICAgICAgICAgU3lzTG9naW5pbmZvciBsb2dpbmluZm9yID0gbmV3IFN5c0xvZ2luaW5mb3IoKTsKKyAgICAgICAgICAgICAgICBsb2dpbmluZm9yLnNldFVzZXJOYW1lKHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICBsb2dpbmluZm9yLnNldElwYWRkcihpcCk7CisgICAgICAgICAgICAgICAgbG9naW5pbmZvci5zZXRMb2dpbkxvY2F0aW9uKGFkZHJlc3MpOworICAgICAgICAgICAgICAgIGxvZ2luaW5mb3Iuc2V0QnJvd3Nlcihicm93c2VyKTsKKyAgICAgICAgICAgICAgICBsb2dpbmluZm9yLnNldE9zKG9zKTsKKyAgICAgICAgICAgICAgICBsb2dpbmluZm9yLnNldE1zZyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAvLyDml6Xlv5fnirbmgIEKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZXF1YWxzQW55KHN0YXR1cywgQ29uc3RhbnRzLkxPR0lOX1NVQ0NFU1MsIENvbnN0YW50cy5MT0dPVVQsIENvbnN0YW50cy5SRUdJU1RFUikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dpbmluZm9yLnNldFN0YXR1cyhDb25zdGFudHMuU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvbnN0YW50cy5MT0dJTl9GQUlMLmVxdWFscyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9naW5pbmZvci5zZXRTdGF0dXMoQ29uc3RhbnRzLkZBSUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyDmj5LlhaXmlbDmja4KKyAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5nZXRCZWFuKElTeXNMb2dpbmluZm9yU2VydmljZS5jbGFzcykuaW5zZXJ0TG9naW5pbmZvcihsb2dpbmluZm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmk43kvZzml6Xlv5forrDlvZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5fkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOS7u+WKoXRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRpbWVyVGFzayByZWNvcmRPcGVyKGZpbmFsIFN5c09wZXJMb2cgb3BlckxvZykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGltZXJUYXNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOi/nOeoi+afpeivouaTjeS9nOWcsOeCuQorICAgICAgICAgICAgICAgIG9wZXJMb2cuc2V0T3BlckxvY2F0aW9uKEFkZHJlc3NVdGlscy5nZXRSZWFsQWRkcmVzc0J5SVAob3BlckxvZy5nZXRPcGVySXAoKSkpOworICAgICAgICAgICAgICAgIFNwcmluZ1V0aWxzLmdldEJlYW4oSVN5c09wZXJMb2dTZXJ2aWNlLmNsYXNzKS5pbnNlcnRPcGVybG9nKG9wZXJMb2cpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvY29udGV4dC9BdXRoZW50aWNhdGlvbkNvbnRleHRIb2xkZXIuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvY29udGV4dC9BdXRoZW50aWNhdGlvbkNvbnRleHRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc3NmNlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9zZWN1cml0eS9jb250ZXh0L0F1dGhlbnRpY2F0aW9uQ29udGV4dEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5jb250ZXh0OworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLkF1dGhlbnRpY2F0aW9uOworCisvKioKKyAqIOi6q+S7vemqjOivgeS/oeaBrworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkNvbnRleHRIb2xkZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxBdXRoZW50aWNhdGlvbj4gY29udGV4dEhvbGRlciA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIEF1dGhlbnRpY2F0aW9uIGdldENvbnRleHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRIb2xkZXIuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRleHQoQXV0aGVudGljYXRpb24gY29udGV4dCkKKyAgICB7CisgICAgICAgIGNvbnRleHRIb2xkZXIuc2V0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNvbnRleHQoKQorICAgIHsKKyAgICAgICAgY29udGV4dEhvbGRlci5yZW1vdmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3NlY3VyaXR5L2NvbnRleHQvUGVybWlzc2lvbkNvbnRleHRIb2xkZXIuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvY29udGV4dC9QZXJtaXNzaW9uQ29udGV4dEhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzJmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3NlY3VyaXR5L2NvbnRleHQvUGVybWlzc2lvbkNvbnRleHRIb2xkZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuc2VjdXJpdHkuY29udGV4dDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5SZXF1ZXN0QXR0cmlidXRlczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuUmVxdWVzdENvbnRleHRIb2xkZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnRleHQuQ29udmVydDsKKworLyoqCisgKiDmnYPpmZDkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgUGVybWlzc2lvbkNvbnRleHRIb2xkZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlTU0lPTl9DT05URVhUX0FUVFJJQlVURVMgPSAiUEVSTUlTU0lPTl9DT05URVhUIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250ZXh0KFN0cmluZyBwZXJtaXNzaW9uKQorICAgIHsKKyAgICAgICAgUmVxdWVzdENvbnRleHRIb2xkZXIuY3VycmVudFJlcXVlc3RBdHRyaWJ1dGVzKCkuc2V0QXR0cmlidXRlKFBFUk1JU1NJT05fQ09OVEVYVF9BVFRSSUJVVEVTLCBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgIFJlcXVlc3RBdHRyaWJ1dGVzLlNDT1BFX1JFUVVFU1QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRleHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbnZlcnQudG9TdHIoUmVxdWVzdENvbnRleHRIb2xkZXIuY3VycmVudFJlcXVlc3RBdHRyaWJ1dGVzKCkuZ2V0QXR0cmlidXRlKFBFUk1JU1NJT05fQ09OVEVYVF9BVFRSSUJVVEVTLAorICAgICAgICAgICAgICAgIFJlcXVlc3RBdHRyaWJ1dGVzLlNDT1BFX1JFUVVFU1QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3NlY3VyaXR5L2ZpbHRlci9Kd3RBdXRoZW50aWNhdGlvblRva2VuRmlsdGVyLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3NlY3VyaXR5L2ZpbHRlci9Kd3RBdXRoZW50aWNhdGlvblRva2VuRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyZjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvZmlsdGVyL0p3dEF1dGhlbnRpY2F0aW9uVG9rZW5GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsuc2VjdXJpdHkuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW47CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLmNvbnRleHQuU2VjdXJpdHlDb250ZXh0SG9sZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkud2ViLmF1dGhlbnRpY2F0aW9uLldlYkF1dGhlbnRpY2F0aW9uRGV0YWlsc1NvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmZpbHRlci5PbmNlUGVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlLlRva2VuU2VydmljZTsKKworLyoqCisgKiB0b2tlbui/h+a7pOWZqCDpqozor4F0b2tlbuacieaViOaApworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBKd3RBdXRoZW50aWNhdGlvblRva2VuRmlsdGVyIGV4dGVuZHMgT25jZVBlclJlcXVlc3RGaWx0ZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUb2tlblNlcnZpY2UgdG9rZW5TZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9GaWx0ZXJJbnRlcm5hbChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExvZ2luVXNlciBsb2dpblVzZXIgPSB0b2tlblNlcnZpY2UuZ2V0TG9naW5Vc2VyKHJlcXVlc3QpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGxvZ2luVXNlcikgJiYgU3RyaW5nVXRpbHMuaXNOdWxsKFNlY3VyaXR5VXRpbHMuZ2V0QXV0aGVudGljYXRpb24oKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuU2VydmljZS52ZXJpZnlUb2tlbihsb2dpblVzZXIpOworICAgICAgICAgICAgVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW4gYXV0aGVudGljYXRpb25Ub2tlbiA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQXV0aGVudGljYXRpb25Ub2tlbihsb2dpblVzZXIsIG51bGwsIGxvZ2luVXNlci5nZXRBdXRob3JpdGllcygpKTsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4uc2V0RGV0YWlscyhuZXcgV2ViQXV0aGVudGljYXRpb25EZXRhaWxzU291cmNlKCkuYnVpbGREZXRhaWxzKHJlcXVlc3QpKTsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29udGV4dEhvbGRlci5nZXRDb250ZXh0KCkuc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvaGFuZGxlL0F1dGhlbnRpY2F0aW9uRW50cnlQb2ludEltcGwuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvaGFuZGxlL0F1dGhlbnRpY2F0aW9uRW50cnlQb2ludEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTc4OWY4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9zZWN1cml0eS9oYW5kbGUvQXV0aGVudGljYXRpb25FbnRyeVBvaW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5oYW5kbGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LndlYi5BdXRoZW50aWNhdGlvbkVudHJ5UG9pbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKK2ltcG9ydCBjb20uYWxpYmFiYS5mYXN0anNvbjIuSlNPTjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50Lkh0dHBTdGF0dXM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VydmxldFV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CisKKy8qKgorICog6K6k6K+B5aSx6LSl5aSE55CG57G7IOi/lOWbnuacquaOiOadgworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkVudHJ5UG9pbnRJbXBsIGltcGxlbWVudHMgQXV0aGVudGljYXRpb25FbnRyeVBvaW50LCBTZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODk3MDcxODQxMDQzNzA3NzYwNkw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb21tZW5jZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgQXV0aGVudGljYXRpb25FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGNvZGUgPSBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRDsKKyAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZ1V0aWxzLmZvcm1hdCgi6K+35rGC6K6/6Zeu77yae33vvIzorqTor4HlpLHotKXvvIzml6Dms5Xorr/pl67ns7vnu5/otYTmupAiLCByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIFNlcnZsZXRVdGlscy5yZW5kZXJTdHJpbmcocmVzcG9uc2UsIEpTT04udG9KU09OU3RyaW5nKEFqYXhSZXN1bHQuZXJyb3IoY29kZSwgbXNnKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvaGFuZGxlL0xvZ291dFN1Y2Nlc3NIYW5kbGVySW1wbC5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay9zZWN1cml0eS9oYW5kbGUvTG9nb3V0U3VjY2Vzc0hhbmRsZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YmQzZgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvc2VjdXJpdHkvaGFuZGxlL0xvZ291dFN1Y2Nlc3NIYW5kbGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5oYW5kbGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LndlYi5hdXRoZW50aWNhdGlvbi5sb2dvdXQuTG9nb3V0U3VjY2Vzc0hhbmRsZXI7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT047CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4ubW9kZWwuTG9naW5Vc2VyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuTWVzc2FnZVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VydmxldFV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5tYW5hZ2VyLkFzeW5jTWFuYWdlcjsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXIuZmFjdG9yeS5Bc3luY0ZhY3Rvcnk7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZS5Ub2tlblNlcnZpY2U7CisKKy8qKgorICog6Ieq5a6a5LmJ6YCA5Ye65aSE55CG57G7IOi/lOWbnuaIkOWKnworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb25maWd1cmF0aW9uCitwdWJsaWMgY2xhc3MgTG9nb3V0U3VjY2Vzc0hhbmRsZXJJbXBsIGltcGxlbWVudHMgTG9nb3V0U3VjY2Vzc0hhbmRsZXIKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUb2tlblNlcnZpY2UgdG9rZW5TZXJ2aWNlOworCisgICAgLyoqCisgICAgICog6YCA5Ye65aSE55CGCisgICAgICogCisgICAgICogQHJldHVybgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTG9nb3V0U3VjY2VzcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIExvZ2luVXNlciBsb2dpblVzZXIgPSB0b2tlblNlcnZpY2UuZ2V0TG9naW5Vc2VyKHJlcXVlc3QpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGxvZ2luVXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyTmFtZSA9IGxvZ2luVXNlci5nZXRVc2VybmFtZSgpOworICAgICAgICAgICAgLy8g5Yig6Zmk55So5oi357yT5a2Y6K6w5b2VCisgICAgICAgICAgICB0b2tlblNlcnZpY2UuZGVsTG9naW5Vc2VyKGxvZ2luVXNlci5nZXRUb2tlbigpKTsKKyAgICAgICAgICAgIC8vIOiusOW9leeUqOaIt+mAgOWHuuaXpeW/lworICAgICAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkTG9naW5pbmZvcih1c2VyTmFtZSwgQ29uc3RhbnRzLkxPR09VVCwgTWVzc2FnZVV0aWxzLm1lc3NhZ2UoInVzZXIubG9nb3V0LnN1Y2Nlc3MiKSkpOworICAgICAgICB9CisgICAgICAgIFNlcnZsZXRVdGlscy5yZW5kZXJTdHJpbmcocmVzcG9uc2UsIEpTT04udG9KU09OU3RyaW5nKEFqYXhSZXN1bHQuc3VjY2VzcyhNZXNzYWdlVXRpbHMubWVzc2FnZSgidXNlci5sb2dvdXQuc3VjY2VzcyIpKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9TZXJ2ZXIuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9TZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2IwM2RhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvZG9tYWluL1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMjQwIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbjsKKworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuQXJpdGg7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5pcC5JcFV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXIuQ3B1OworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXIuSnZtOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXIuTWVtOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXIuU3lzOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXIuU3lzRmlsZTsKK2ltcG9ydCBvc2hpLlN5c3RlbUluZm87CitpbXBvcnQgb3NoaS5oYXJkd2FyZS5DZW50cmFsUHJvY2Vzc29yOworaW1wb3J0IG9zaGkuaGFyZHdhcmUuQ2VudHJhbFByb2Nlc3Nvci5UaWNrVHlwZTsKK2ltcG9ydCBvc2hpLmhhcmR3YXJlLkdsb2JhbE1lbW9yeTsKK2ltcG9ydCBvc2hpLmhhcmR3YXJlLkhhcmR3YXJlQWJzdHJhY3Rpb25MYXllcjsKK2ltcG9ydCBvc2hpLnNvZnR3YXJlLm9zLkZpbGVTeXN0ZW07CitpbXBvcnQgb3NoaS5zb2Z0d2FyZS5vcy5PU0ZpbGVTdG9yZTsKK2ltcG9ydCBvc2hpLnNvZnR3YXJlLm9zLk9wZXJhdGluZ1N5c3RlbTsKK2ltcG9ydCBvc2hpLnV0aWwuVXRpbDsKKworLyoqCisgKiDmnI3liqHlmajnm7jlhbPkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU2VydmVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9TSElfV0FJVF9TRUNPTkQgPSAxMDAwOworICAgIAorICAgIC8qKgorICAgICAqIENQVeebuOWFs+S/oeaBrworICAgICAqLworICAgIHByaXZhdGUgQ3B1IGNwdSA9IG5ldyBDcHUoKTsKKworICAgIC8qKgorICAgICAqIOWFp+WtmOebuOWFs+S/oeaBrworICAgICAqLworICAgIHByaXZhdGUgTWVtIG1lbSA9IG5ldyBNZW0oKTsKKworICAgIC8qKgorICAgICAqIEpWTeebuOWFs+S/oeaBrworICAgICAqLworICAgIHByaXZhdGUgSnZtIGp2bSA9IG5ldyBKdm0oKTsKKworICAgIC8qKgorICAgICAqIOacjeWKoeWZqOebuOWFs+S/oeaBrworICAgICAqLworICAgIHByaXZhdGUgU3lzIHN5cyA9IG5ldyBTeXMoKTsKKworICAgIC8qKgorICAgICAqIOejgeebmOebuOWFs+S/oeaBrworICAgICAqLworICAgIHByaXZhdGUgTGlzdDxTeXNGaWxlPiBzeXNGaWxlcyA9IG5ldyBMaW5rZWRMaXN0PFN5c0ZpbGU+KCk7CisKKyAgICBwdWJsaWMgQ3B1IGdldENwdSgpCisgICAgeworICAgICAgICByZXR1cm4gY3B1OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENwdShDcHUgY3B1KQorICAgIHsKKyAgICAgICAgdGhpcy5jcHUgPSBjcHU7CisgICAgfQorCisgICAgcHVibGljIE1lbSBnZXRNZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZW0oTWVtIG1lbSkKKyAgICB7CisgICAgICAgIHRoaXMubWVtID0gbWVtOworICAgIH0KKworICAgIHB1YmxpYyBKdm0gZ2V0SnZtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqdm07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SnZtKEp2bSBqdm0pCisgICAgeworICAgICAgICB0aGlzLmp2bSA9IGp2bTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3lzIGdldFN5cygpCisgICAgeworICAgICAgICByZXR1cm4gc3lzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5cyhTeXMgc3lzKQorICAgIHsKKyAgICAgICAgdGhpcy5zeXMgPSBzeXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3lzRmlsZT4gZ2V0U3lzRmlsZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN5c0ZpbGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5c0ZpbGVzKExpc3Q8U3lzRmlsZT4gc3lzRmlsZXMpCisgICAgeworICAgICAgICB0aGlzLnN5c0ZpbGVzID0gc3lzRmlsZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weVRvKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3lzdGVtSW5mbyBzaSA9IG5ldyBTeXN0ZW1JbmZvKCk7CisgICAgICAgIEhhcmR3YXJlQWJzdHJhY3Rpb25MYXllciBoYWwgPSBzaS5nZXRIYXJkd2FyZSgpOworCisgICAgICAgIHNldENwdUluZm8oaGFsLmdldFByb2Nlc3NvcigpKTsKKworICAgICAgICBzZXRNZW1JbmZvKGhhbC5nZXRNZW1vcnkoKSk7CisKKyAgICAgICAgc2V0U3lzSW5mbygpOworCisgICAgICAgIHNldEp2bUluZm8oKTsKKworICAgICAgICBzZXRTeXNGaWxlcyhzaS5nZXRPcGVyYXRpbmdTeXN0ZW0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572uQ1BV5L+h5oGvCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENwdUluZm8oQ2VudHJhbFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgeworICAgICAgICAvLyBDUFXkv6Hmga8KKyAgICAgICAgbG9uZ1tdIHByZXZUaWNrcyA9IHByb2Nlc3Nvci5nZXRTeXN0ZW1DcHVMb2FkVGlja3MoKTsKKyAgICAgICAgVXRpbC5zbGVlcChPU0hJX1dBSVRfU0VDT05EKTsKKyAgICAgICAgbG9uZ1tdIHRpY2tzID0gcHJvY2Vzc29yLmdldFN5c3RlbUNwdUxvYWRUaWNrcygpOworICAgICAgICBsb25nIG5pY2UgPSB0aWNrc1tUaWNrVHlwZS5OSUNFLmdldEluZGV4KCldIC0gcHJldlRpY2tzW1RpY2tUeXBlLk5JQ0UuZ2V0SW5kZXgoKV07CisgICAgICAgIGxvbmcgaXJxID0gdGlja3NbVGlja1R5cGUuSVJRLmdldEluZGV4KCldIC0gcHJldlRpY2tzW1RpY2tUeXBlLklSUS5nZXRJbmRleCgpXTsKKyAgICAgICAgbG9uZyBzb2Z0aXJxID0gdGlja3NbVGlja1R5cGUuU09GVElSUS5nZXRJbmRleCgpXSAtIHByZXZUaWNrc1tUaWNrVHlwZS5TT0ZUSVJRLmdldEluZGV4KCldOworICAgICAgICBsb25nIHN0ZWFsID0gdGlja3NbVGlja1R5cGUuU1RFQUwuZ2V0SW5kZXgoKV0gLSBwcmV2VGlja3NbVGlja1R5cGUuU1RFQUwuZ2V0SW5kZXgoKV07CisgICAgICAgIGxvbmcgY1N5cyA9IHRpY2tzW1RpY2tUeXBlLlNZU1RFTS5nZXRJbmRleCgpXSAtIHByZXZUaWNrc1tUaWNrVHlwZS5TWVNURU0uZ2V0SW5kZXgoKV07CisgICAgICAgIGxvbmcgdXNlciA9IHRpY2tzW1RpY2tUeXBlLlVTRVIuZ2V0SW5kZXgoKV0gLSBwcmV2VGlja3NbVGlja1R5cGUuVVNFUi5nZXRJbmRleCgpXTsKKyAgICAgICAgbG9uZyBpb3dhaXQgPSB0aWNrc1tUaWNrVHlwZS5JT1dBSVQuZ2V0SW5kZXgoKV0gLSBwcmV2VGlja3NbVGlja1R5cGUuSU9XQUlULmdldEluZGV4KCldOworICAgICAgICBsb25nIGlkbGUgPSB0aWNrc1tUaWNrVHlwZS5JRExFLmdldEluZGV4KCldIC0gcHJldlRpY2tzW1RpY2tUeXBlLklETEUuZ2V0SW5kZXgoKV07CisgICAgICAgIGxvbmcgdG90YWxDcHUgPSB1c2VyICsgbmljZSArIGNTeXMgKyBpZGxlICsgaW93YWl0ICsgaXJxICsgc29mdGlycSArIHN0ZWFsOworICAgICAgICBjcHUuc2V0Q3B1TnVtKHByb2Nlc3Nvci5nZXRMb2dpY2FsUHJvY2Vzc29yQ291bnQoKSk7CisgICAgICAgIGNwdS5zZXRUb3RhbCh0b3RhbENwdSk7CisgICAgICAgIGNwdS5zZXRTeXMoY1N5cyk7CisgICAgICAgIGNwdS5zZXRVc2VkKHVzZXIpOworICAgICAgICBjcHUuc2V0V2FpdChpb3dhaXQpOworICAgICAgICBjcHUuc2V0RnJlZShpZGxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva7lhoXlrZjkv6Hmga8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TWVtSW5mbyhHbG9iYWxNZW1vcnkgbWVtb3J5KQorICAgIHsKKyAgICAgICAgbWVtLnNldFRvdGFsKG1lbW9yeS5nZXRUb3RhbCgpKTsKKyAgICAgICAgbWVtLnNldFVzZWQobWVtb3J5LmdldFRvdGFsKCkgLSBtZW1vcnkuZ2V0QXZhaWxhYmxlKCkpOworICAgICAgICBtZW0uc2V0RnJlZShtZW1vcnkuZ2V0QXZhaWxhYmxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiuvue9ruacjeWKoeWZqOS/oeaBrworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTeXNJbmZvKCkKKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworICAgICAgICBzeXMuc2V0Q29tcHV0ZXJOYW1lKElwVXRpbHMuZ2V0SG9zdE5hbWUoKSk7CisgICAgICAgIHN5cy5zZXRDb21wdXRlcklwKElwVXRpbHMuZ2V0SG9zdElwKCkpOworICAgICAgICBzeXMuc2V0T3NOYW1lKHByb3BzLmdldFByb3BlcnR5KCJvcy5uYW1lIikpOworICAgICAgICBzeXMuc2V0T3NBcmNoKHByb3BzLmdldFByb3BlcnR5KCJvcy5hcmNoIikpOworICAgICAgICBzeXMuc2V0VXNlckRpcihwcm9wcy5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572uSmF2YeiZmuaLn+acugorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRKdm1JbmZvKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAganZtLnNldFRvdGFsKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkpOworICAgICAgICBqdm0uc2V0TWF4KFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpKTsKKyAgICAgICAganZtLnNldEZyZWUoUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKKyAgICAgICAganZtLnNldFZlcnNpb24ocHJvcHMuZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpKTsKKyAgICAgICAganZtLnNldEhvbWUocHJvcHMuZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva7no4Hnm5jkv6Hmga8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0U3lzRmlsZXMoT3BlcmF0aW5nU3lzdGVtIG9zKQorICAgIHsKKyAgICAgICAgRmlsZVN5c3RlbSBmaWxlU3lzdGVtID0gb3MuZ2V0RmlsZVN5c3RlbSgpOworICAgICAgICBMaXN0PE9TRmlsZVN0b3JlPiBmc0FycmF5ID0gZmlsZVN5c3RlbS5nZXRGaWxlU3RvcmVzKCk7CisgICAgICAgIGZvciAoT1NGaWxlU3RvcmUgZnMgOiBmc0FycmF5KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGZyZWUgPSBmcy5nZXRVc2FibGVTcGFjZSgpOworICAgICAgICAgICAgbG9uZyB0b3RhbCA9IGZzLmdldFRvdGFsU3BhY2UoKTsKKyAgICAgICAgICAgIGxvbmcgdXNlZCA9IHRvdGFsIC0gZnJlZTsKKyAgICAgICAgICAgIFN5c0ZpbGUgc3lzRmlsZSA9IG5ldyBTeXNGaWxlKCk7CisgICAgICAgICAgICBzeXNGaWxlLnNldERpck5hbWUoZnMuZ2V0TW91bnQoKSk7CisgICAgICAgICAgICBzeXNGaWxlLnNldFN5c1R5cGVOYW1lKGZzLmdldFR5cGUoKSk7CisgICAgICAgICAgICBzeXNGaWxlLnNldFR5cGVOYW1lKGZzLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzeXNGaWxlLnNldFRvdGFsKGNvbnZlcnRGaWxlU2l6ZSh0b3RhbCkpOworICAgICAgICAgICAgc3lzRmlsZS5zZXRGcmVlKGNvbnZlcnRGaWxlU2l6ZShmcmVlKSk7CisgICAgICAgICAgICBzeXNGaWxlLnNldFVzZWQoY29udmVydEZpbGVTaXplKHVzZWQpKTsKKyAgICAgICAgICAgIHN5c0ZpbGUuc2V0VXNhZ2UoQXJpdGgubXVsKEFyaXRoLmRpdih1c2VkLCB0b3RhbCwgNCksIDEwMCkpOworICAgICAgICAgICAgc3lzRmlsZXMuYWRkKHN5c0ZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5a2X6IqC6L2s5o2iCisgICAgICogCisgICAgICogQHBhcmFtIHNpemUg5a2X6IqC5aSn5bCPCisgICAgICogQHJldHVybiDovazmjaLlkI7lgLwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRGaWxlU2l6ZShsb25nIHNpemUpCisgICAgeworICAgICAgICBsb25nIGtiID0gMTAyNDsKKyAgICAgICAgbG9uZyBtYiA9IGtiICogMTAyNDsKKyAgICAgICAgbG9uZyBnYiA9IG1iICogMTAyNDsKKyAgICAgICAgaWYgKHNpemUgPj0gZ2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmIEdCIiwgKGZsb2F0KSBzaXplIC8gZ2IpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNpemUgPj0gbWIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGYgPSAoZmxvYXQpIHNpemUgLyBtYjsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGYgPiAxMDAgPyAiJS4wZiBNQiIgOiAiJS4xZiBNQiIsIGYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNpemUgPj0ga2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGYgPSAoZmxvYXQpIHNpemUgLyBrYjsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGYgPiAxMDAgPyAiJS4wZiBLQiIgOiAiJS4xZiBLQiIsIGYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVkIEIiLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9zZXJ2ZXIvQ3B1LmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL0NwdS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2E2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL0NwdS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXI7CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLkFyaXRoOworCisvKioKKyAqIENQVeebuOWFs+S/oeaBrworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBDcHUKK3sKKyAgICAvKioKKyAgICAgKiDmoLjlv4PmlbAKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjcHVOdW07CisKKyAgICAvKioKKyAgICAgKiBDUFXmgLvnmoTkvb/nlKjnjocKKyAgICAgKi8KKyAgICBwcml2YXRlIGRvdWJsZSB0b3RhbDsKKworICAgIC8qKgorICAgICAqIENQVeezu+e7n+S9v+eUqOeOhworICAgICAqLworICAgIHByaXZhdGUgZG91YmxlIHN5czsKKworICAgIC8qKgorICAgICAqIENQVeeUqOaIt+S9v+eUqOeOhworICAgICAqLworICAgIHByaXZhdGUgZG91YmxlIHVzZWQ7CisKKyAgICAvKioKKyAgICAgKiBDUFXlvZPliY3nrYnlvoXnjocKKyAgICAgKi8KKyAgICBwcml2YXRlIGRvdWJsZSB3YWl0OworCisgICAgLyoqCisgICAgICogQ1BV5b2T5YmN56m66Zey546HCisgICAgICovCisgICAgcHJpdmF0ZSBkb3VibGUgZnJlZTsKKworICAgIHB1YmxpYyBpbnQgZ2V0Q3B1TnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjcHVOdW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3B1TnVtKGludCBjcHVOdW0pCisgICAgeworICAgICAgICB0aGlzLmNwdU51bSA9IGNwdU51bTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFRvdGFsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcml0aC5yb3VuZChBcml0aC5tdWwodG90YWwsIDEwMCksIDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdGFsKGRvdWJsZSB0b3RhbCkKKyAgICB7CisgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldFN5cygpCisgICAgeworICAgICAgICByZXR1cm4gQXJpdGgucm91bmQoQXJpdGgubXVsKHN5cyAvIHRvdGFsLCAxMDApLCAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTeXMoZG91YmxlIHN5cykKKyAgICB7CisgICAgICAgIHRoaXMuc3lzID0gc3lzOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VXNlZCgpCisgICAgeworICAgICAgICByZXR1cm4gQXJpdGgucm91bmQoQXJpdGgubXVsKHVzZWQgLyB0b3RhbCwgMTAwKSwgMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlZChkb3VibGUgdXNlZCkKKyAgICB7CisgICAgICAgIHRoaXMudXNlZCA9IHVzZWQ7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRXYWl0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcml0aC5yb3VuZChBcml0aC5tdWwod2FpdCAvIHRvdGFsLCAxMDApLCAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWl0KGRvdWJsZSB3YWl0KQorICAgIHsKKyAgICAgICAgdGhpcy53YWl0ID0gd2FpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEZyZWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFyaXRoLnJvdW5kKEFyaXRoLm11bChmcmVlIC8gdG90YWwsIDEwMCksIDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZyZWUoZG91YmxlIGZyZWUpCisgICAgeworICAgICAgICB0aGlzLmZyZWUgPSBmcmVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9zZXJ2ZXIvSnZtLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL0p2bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGM2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL0p2bS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmRvbWFpbi5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLkFyaXRoOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuRGF0ZVV0aWxzOworCisvKioKKyAqIEpWTeebuOWFs+S/oeaBrworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBKdm0KK3sKKyAgICAvKioKKyAgICAgKiDlvZPliY1KVk3ljaDnlKjnmoTlhoXlrZjmgLvmlbAoTSkKKyAgICAgKi8KKyAgICBwcml2YXRlIGRvdWJsZSB0b3RhbDsKKworICAgIC8qKgorICAgICAqIEpWTeacgOWkp+WPr+eUqOWGheWtmOaAu+aVsChNKQorICAgICAqLworICAgIHByaXZhdGUgZG91YmxlIG1heDsKKworICAgIC8qKgorICAgICAqIEpWTeepuumXsuWGheWtmChNKQorICAgICAqLworICAgIHByaXZhdGUgZG91YmxlIGZyZWU7CisKKyAgICAvKioKKyAgICAgKiBKREvniYjmnKwKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworCisgICAgLyoqCisgICAgICogSkRL6Lev5b6ECisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9tZTsKKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFyaXRoLmRpdih0b3RhbCwgKDEwMjQgKiAxMDI0KSwgMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG90YWwoZG91YmxlIHRvdGFsKQorICAgIHsKKyAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0TWF4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcml0aC5kaXYobWF4LCAoMTAyNCAqIDEwMjQpLCAyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXgoZG91YmxlIG1heCkKKyAgICB7CisgICAgICAgIHRoaXMubWF4ID0gbWF4OworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0RnJlZSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJpdGguZGl2KGZyZWUsICgxMDI0ICogMTAyNCksIDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZyZWUoZG91YmxlIGZyZWUpCisgICAgeworICAgICAgICB0aGlzLmZyZWUgPSBmcmVlOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VXNlZCgpCisgICAgeworICAgICAgICByZXR1cm4gQXJpdGguZGl2KHRvdGFsIC0gZnJlZSwgKDEwMjQgKiAxMDI0KSwgMik7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRVc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJpdGgubXVsKEFyaXRoLmRpdih0b3RhbCAtIGZyZWUsIHRvdGFsLCA0KSwgMTAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZKREvlkI3np7AKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRWbU5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKKyAgICB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIb21lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBob21lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIGhvbWUpCisgICAgeworICAgICAgICB0aGlzLmhvbWUgPSBob21lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpES+WQr+WKqOaXtumXtAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUaW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRlVXRpbHMucGFyc2VEYXRlVG9TdHIoRGF0ZVV0aWxzLllZWVlfTU1fRERfSEhfTU1fU1MsIERhdGVVdGlscy5nZXRTZXJ2ZXJTdGFydERhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkRL6L+Q6KGM5pe26Ze0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSdW5UaW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRlVXRpbHMudGltZURpc3RhbmNlKERhdGVVdGlscy5nZXROb3dEYXRlKCksIERhdGVVdGlscy5nZXRTZXJ2ZXJTdGFydERhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6L+Q6KGM5Y+C5pWwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbnB1dEFyZ3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRJbnB1dEFyZ3VtZW50cygpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvZG9tYWluL3NlcnZlci9NZW0uamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9zZXJ2ZXIvTWVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZWM1MgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9zZXJ2ZXIvTWVtLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5kb21haW4uc2VydmVyOworCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5Bcml0aDsKKworLyoqCisgKiDlhaflrZjnm7jlhbPkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgTWVtCit7CisgICAgLyoqCisgICAgICog5YaF5a2Y5oC76YePCisgICAgICovCisgICAgcHJpdmF0ZSBkb3VibGUgdG90YWw7CisKKyAgICAvKioKKyAgICAgKiDlt7LnlKjlhoXlrZgKKyAgICAgKi8KKyAgICBwcml2YXRlIGRvdWJsZSB1c2VkOworCisgICAgLyoqCisgICAgICog5Ymp5L2Z5YaF5a2YCisgICAgICovCisgICAgcHJpdmF0ZSBkb3VibGUgZnJlZTsKKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFyaXRoLmRpdih0b3RhbCwgKDEwMjQgKiAxMDI0ICogMTAyNCksIDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdGFsKGxvbmcgdG90YWwpCisgICAgeworICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRVc2VkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcml0aC5kaXYodXNlZCwgKDEwMjQgKiAxMDI0ICogMTAyNCksIDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZWQobG9uZyB1c2VkKQorICAgIHsKKyAgICAgICAgdGhpcy51c2VkID0gdXNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEZyZWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFyaXRoLmRpdihmcmVlLCAoMTAyNCAqIDEwMjQgKiAxMDI0KSwgMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnJlZShsb25nIGZyZWUpCisgICAgeworICAgICAgICB0aGlzLmZyZWUgPSBmcmVlOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0VXNhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFyaXRoLm11bChBcml0aC5kaXYodXNlZCwgdG90YWwsIDQpLCAxMDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2RvbWFpbi9zZXJ2ZXIvU3lzLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL1N5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDY0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL1N5cy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuZG9tYWluLnNlcnZlcjsKKworLyoqCisgKiDns7vnu5/nm7jlhbPkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzCit7CisgICAgLyoqCisgICAgICog5pyN5Yqh5Zmo5ZCN56ewCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZXJOYW1lOworCisgICAgLyoqCisgICAgICog5pyN5Yqh5ZmoSXAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wdXRlcklwOworCisgICAgLyoqCisgICAgICog6aG555uu6Lev5b6ECisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckRpcjsKKworICAgIC8qKgorICAgICAqIOaTjeS9nOezu+e7nworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9zTmFtZTsKKworICAgIC8qKgorICAgICAqIOezu+e7n+aetuaehAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9zQXJjaDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcHV0ZXJOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wdXRlck5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHV0ZXJOYW1lKFN0cmluZyBjb21wdXRlck5hbWUpCisgICAgeworICAgICAgICB0aGlzLmNvbXB1dGVyTmFtZSA9IGNvbXB1dGVyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXB1dGVySXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVySXA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHV0ZXJJcChTdHJpbmcgY29tcHV0ZXJJcCkKKyAgICB7CisgICAgICAgIHRoaXMuY29tcHV0ZXJJcCA9IGNvbXB1dGVySXA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyRGlyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJEaXIoU3RyaW5nIHVzZXJEaXIpCisgICAgeworICAgICAgICB0aGlzLnVzZXJEaXIgPSB1c2VyRGlyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3NOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvc05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3NOYW1lKFN0cmluZyBvc05hbWUpCisgICAgeworICAgICAgICB0aGlzLm9zTmFtZSA9IG9zTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9zQXJjaCgpCisgICAgeworICAgICAgICByZXR1cm4gb3NBcmNoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9zQXJjaChTdHJpbmcgb3NBcmNoKQorICAgIHsKKyAgICAgICAgdGhpcy5vc0FyY2ggPSBvc0FyY2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvZG9tYWluL3NlcnZlci9TeXNGaWxlLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9kb21haW4vc2VydmVyL1N5c0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzIwY2RlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvZG9tYWluL3NlcnZlci9TeXNGaWxlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuZG9tYWluLnNlcnZlcjsKKworLyoqCisgKiDns7vnu5/mlofku7bnm7jlhbPkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzRmlsZQoreworICAgIC8qKgorICAgICAqIOebmOespui3r+W+hAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpck5hbWU7CisKKyAgICAvKioKKyAgICAgKiDnm5jnrKbnsbvlnosKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzeXNUeXBlTmFtZTsKKworICAgIC8qKgorICAgICAqIOaWh+S7tuexu+WeiworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOworCisgICAgLyoqCisgICAgICog5oC75aSn5bCPCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdG90YWw7CisKKyAgICAvKioKKyAgICAgKiDliankvZnlpKflsI8KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmcmVlOworCisgICAgLyoqCisgICAgICog5bey57uP5L2/55So6YePCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlZDsKKworICAgIC8qKgorICAgICAqIOi1hOa6kOeahOS9v+eUqOeOhworICAgICAqLworICAgIHByaXZhdGUgZG91YmxlIHVzYWdlOworCisgICAgcHVibGljIFN0cmluZyBnZXREaXJOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpck5hbWUoU3RyaW5nIGRpck5hbWUpCisgICAgeworICAgICAgICB0aGlzLmRpck5hbWUgPSBkaXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzVHlwZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN5c1R5cGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5c1R5cGVOYW1lKFN0cmluZyBzeXNUeXBlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuc3lzVHlwZU5hbWUgPSBzeXNUeXBlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpCisgICAgeworICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb3RhbCgpCisgICAgeworICAgICAgICByZXR1cm4gdG90YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG90YWwoU3RyaW5nIHRvdGFsKQorICAgIHsKKyAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJlZSgpCisgICAgeworICAgICAgICByZXR1cm4gZnJlZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGcmVlKFN0cmluZyBmcmVlKQorICAgIHsKKyAgICAgICAgdGhpcy5mcmVlID0gZnJlZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlZChTdHJpbmcgdXNlZCkKKyAgICB7CisgICAgICAgIHRoaXMudXNlZCA9IHVzZWQ7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRVc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXNhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNhZ2UoZG91YmxlIHVzYWdlKQorICAgIHsKKyAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL2V4Y2VwdGlvbi9HbG9iYWxFeGNlcHRpb25IYW5kbGVyLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9leGNlcHRpb24vR2xvYmFsRXhjZXB0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTAyODMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9leGNlcHRpb24vR2xvYmFsRXhjZXB0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLmV4Y2VwdGlvbjsKKworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYWNjZXNzLkFjY2Vzc0RlbmllZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uQmluZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5IdHRwUmVxdWVzdE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLk1ldGhvZEFyZ3VtZW50Tm90VmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5NaXNzaW5nUGF0aFZhcmlhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5FeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlckFkdmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tZXRob2QuYW5ub3RhdGlvbi5NZXRob2RBcmd1bWVudFR5cGVNaXNtYXRjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50Lkh0dHBTdGF0dXM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0LkNvbnZlcnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uRGVtb01vZGVFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuaHRtbC5Fc2NhcGVVdGlsOworCisvKioKKyAqIOWFqOWxgOW8guW4uOWkhOeQhuWZqAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BSZXN0Q29udHJvbGxlckFkdmljZQorcHVibGljIGNsYXNzIEdsb2JhbEV4Y2VwdGlvbkhhbmRsZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoR2xvYmFsRXhjZXB0aW9uSGFuZGxlci5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiDmnYPpmZDmoKHpqozlvILluLgKKyAgICAgKi8KKyAgICBARXhjZXB0aW9uSGFuZGxlcihBY2Nlc3NEZW5pZWRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIEFqYXhSZXN1bHQgaGFuZGxlQWNjZXNzRGVuaWVkRXhjZXB0aW9uKEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIGxvZy5lcnJvcigi6K+35rGC5Zyw5Z2AJ3t9JyzmnYPpmZDmoKHpqozlpLHotKUne30nIiwgcmVxdWVzdFVSSSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5lcnJvcihIdHRwU3RhdHVzLkZPUkJJRERFTiwgIuayoeacieadg+mZkO+8jOivt+iBlOezu+euoeeQhuWRmOaOiOadgyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOivt+axguaWueW8j+S4jeaUr+aMgQorICAgICAqLworICAgIEBFeGNlcHRpb25IYW5kbGVyKEh0dHBSZXF1ZXN0TWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGhhbmRsZUh0dHBSZXF1ZXN0TWV0aG9kTm90U3VwcG9ydGVkKEh0dHBSZXF1ZXN0TWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUsCisgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIGxvZy5lcnJvcigi6K+35rGC5Zyw5Z2AJ3t9JyzkuI3mlK/mjIEne30n6K+35rGCIiwgcmVxdWVzdFVSSSwgZS5nZXRNZXRob2QoKSk7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkuJrliqHlvILluLgKKyAgICAgKi8KKyAgICBARXhjZXB0aW9uSGFuZGxlcihTZXJ2aWNlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGhhbmRsZVNlcnZpY2VFeGNlcHRpb24oU2VydmljZUV4Y2VwdGlvbiBlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIEludGVnZXIgY29kZSA9IGUuZ2V0Q29kZSgpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGNvZGUpID8gQWpheFJlc3VsdC5lcnJvcihjb2RlLCBlLmdldE1lc3NhZ2UoKSkgOiBBamF4UmVzdWx0LmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDor7fmsYLot6/lvoTkuK3nvLrlsJHlv4XpnIDnmoTot6/lvoTlj5jph48KKyAgICAgKi8KKyAgICBARXhjZXB0aW9uSGFuZGxlcihNaXNzaW5nUGF0aFZhcmlhYmxlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGhhbmRsZU1pc3NpbmdQYXRoVmFyaWFibGVFeGNlcHRpb24oTWlzc2luZ1BhdGhWYXJpYWJsZUV4Y2VwdGlvbiBlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIGxvZy5lcnJvcigi6K+35rGC6Lev5b6E5Lit57y65bCR5b+F6ZyA55qE6Lev5b6E5Y+Y6YePJ3t9Jyzlj5HnlJ/ns7vnu5/lvILluLguIiwgcmVxdWVzdFVSSSwgZSk7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKFN0cmluZy5mb3JtYXQoIuivt+axgui3r+W+hOS4ree8uuWwkeW/hemcgOeahOi3r+W+hOWPmOmHj1slc10iLCBlLmdldFZhcmlhYmxlTmFtZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K+35rGC5Y+C5pWw57G75Z6L5LiN5Yy56YWNCisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoTWV0aG9kQXJndW1lbnRUeXBlTWlzbWF0Y2hFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIEFqYXhSZXN1bHQgaGFuZGxlTWV0aG9kQXJndW1lbnRUeXBlTWlzbWF0Y2hFeGNlcHRpb24oTWV0aG9kQXJndW1lbnRUeXBlTWlzbWF0Y2hFeGNlcHRpb24gZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBDb252ZXJ0LnRvU3RyKGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBFc2NhcGVVdGlsLmNsZWFuKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBsb2cuZXJyb3IoIuivt+axguWPguaVsOexu+Wei+S4jeWMuemFjSd7fScs5Y+R55Sf57O757uf5byC5bi4LiIsIHJlcXVlc3RVUkksIGUpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5lcnJvcihTdHJpbmcuZm9ybWF0KCLor7fmsYLlj4LmlbDnsbvlnovkuI3ljLnphY3vvIzlj4LmlbBbJXNd6KaB5rGC57G75Z6L5Li677yaJyVzJ++8jOS9hui+k+WFpeWAvOS4uu+8miclcyciLCBlLmdldE5hbWUoKSwgZS5nZXRSZXF1aXJlZFR5cGUoKS5nZXROYW1lKCksIHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5oum5oiq5pyq55+l55qE6L+Q6KGM5pe25byC5bi4CisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBoYW5kbGVSdW50aW1lRXhjZXB0aW9uKFJ1bnRpbWVFeGNlcHRpb24gZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBsb2cuZXJyb3IoIuivt+axguWcsOWdgCd7fScs5Y+R55Sf5pyq55+l5byC5bi4LiIsIHJlcXVlc3RVUkksIGUpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5lcnJvcihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog57O757uf5byC5bi4CisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGhhbmRsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBsb2cuZXJyb3IoIuivt+axguWcsOWdgCd7fScs5Y+R55Sf57O757uf5byC5bi4LiIsIHJlcXVlc3RVUkksIGUpOworICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5lcnJvcihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Ieq5a6a5LmJ6aqM6K+B5byC5bi4CisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoQmluZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBoYW5kbGVCaW5kRXhjZXB0aW9uKEJpbmRFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRBbGxFcnJvcnMoKS5nZXQoMCkuZ2V0RGVmYXVsdE1lc3NhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuZXJyb3IobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6Ieq5a6a5LmJ6aqM6K+B5byC5bi4CisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoTWV0aG9kQXJndW1lbnROb3RWYWxpZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgT2JqZWN0IGhhbmRsZU1ldGhvZEFyZ3VtZW50Tm90VmFsaWRFeGNlcHRpb24oTWV0aG9kQXJndW1lbnROb3RWYWxpZEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBlLmdldEJpbmRpbmdSZXN1bHQoKS5nZXRGaWVsZEVycm9yKCkuZ2V0RGVmYXVsdE1lc3NhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuZXJyb3IobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5ryU56S65qih5byP5byC5bi4CisgICAgICovCisgICAgQEV4Y2VwdGlvbkhhbmRsZXIoRGVtb01vZGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIEFqYXhSZXN1bHQgaGFuZGxlRGVtb01vZGVFeGNlcHRpb24oRGVtb01vZGVFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBamF4UmVzdWx0LmVycm9yKCLmvJTnpLrmqKHlvI/vvIzkuI3lhYHorrjmk43kvZwiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1Blcm1pc3Npb25TZXJ2aWNlLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1Blcm1pc3Npb25TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMjU5YQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvUGVybWlzc2lvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuQ29sbGVjdGlvblV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZWN1cml0eVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5jb250ZXh0LlBlcm1pc3Npb25Db250ZXh0SG9sZGVyOworCisvKioKKyAqIFJ1b1lp6aaW5YibIOiHquWumuS5ieadg+mZkOWunueOsO+8jHNz5Y+W6IeqU3ByaW5nU2VjdXJpdHnpppblrZfmr40KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZSgic3MiKQorcHVibGljIGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog6aqM6K+B55So5oi35piv5ZCm5YW35aSH5p+Q5p2D6ZmQCisgICAgICogCisgICAgICogQHBhcmFtIHBlcm1pc3Npb24g5p2D6ZmQ5a2X56ym5LiyCisgICAgICogQHJldHVybiDnlKjmiLfmmK/lkKblhbflpIfmn5DmnYPpmZAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZXJtaShTdHJpbmcgcGVybWlzc2lvbikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHBlcm1pc3Npb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTG9naW5Vc2VyIGxvZ2luVXNlciA9IFNlY3VyaXR5VXRpbHMuZ2V0TG9naW5Vc2VyKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwobG9naW5Vc2VyKSB8fCBDb2xsZWN0aW9uVXRpbHMuaXNFbXB0eShsb2dpblVzZXIuZ2V0UGVybWlzc2lvbnMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBQZXJtaXNzaW9uQ29udGV4dEhvbGRlci5zZXRDb250ZXh0KHBlcm1pc3Npb24pOworICAgICAgICByZXR1cm4gaGFzUGVybWlzc2lvbnMobG9naW5Vc2VyLmdldFBlcm1pc3Npb25zKCksIHBlcm1pc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmqjOivgeeUqOaIt+aYr+WQpuS4jeWFt+Wkh+afkOadg+mZkO+8jOS4jiBoYXNQZXJtaemAu+i+keebuOWPjQorICAgICAqCisgICAgICogQHBhcmFtIHBlcm1pc3Npb24g5p2D6ZmQ5a2X56ym5LiyCisgICAgICogQHJldHVybiDnlKjmiLfmmK/lkKbkuI3lhbflpIfmn5DmnYPpmZAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsYWNrc1Blcm1pKFN0cmluZyBwZXJtaXNzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGhhc1Blcm1pKHBlcm1pc3Npb24pICE9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6aqM6K+B55So5oi35piv5ZCm5YW35pyJ5Lul5LiL5Lu75oSP5LiA5Liq5p2D6ZmQCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMg5LulIFBFUk1JU1NJT05fREVMSU1FVEVSIOS4uuWIhumalOespueahOadg+mZkOWIl+ihqAorICAgICAqIEByZXR1cm4g55So5oi35piv5ZCm5YW35pyJ5Lul5LiL5Lu75oSP5LiA5Liq5p2D6ZmQCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzQW55UGVybWkoU3RyaW5nIHBlcm1pc3Npb25zKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocGVybWlzc2lvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTG9naW5Vc2VyIGxvZ2luVXNlciA9IFNlY3VyaXR5VXRpbHMuZ2V0TG9naW5Vc2VyKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwobG9naW5Vc2VyKSB8fCBDb2xsZWN0aW9uVXRpbHMuaXNFbXB0eShsb2dpblVzZXIuZ2V0UGVybWlzc2lvbnMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBQZXJtaXNzaW9uQ29udGV4dEhvbGRlci5zZXRDb250ZXh0KHBlcm1pc3Npb25zKTsKKyAgICAgICAgU2V0PFN0cmluZz4gYXV0aG9yaXRpZXMgPSBsb2dpblVzZXIuZ2V0UGVybWlzc2lvbnMoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcGVybWlzc2lvbiA6IHBlcm1pc3Npb25zLnNwbGl0KENvbnN0YW50cy5QRVJNSVNTSU9OX0RFTElNRVRFUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uICE9IG51bGwgJiYgaGFzUGVybWlzc2lvbnMoYXV0aG9yaXRpZXMsIHBlcm1pc3Npb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3nlKjmiLfmmK/lkKbmi6XmnInmn5DkuKrop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLlrZfnrKbkuLIKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+aYr+WQpuWFt+Wkh+afkOinkuiJsgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1JvbGUoU3RyaW5nIHJvbGUpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShyb2xlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIExvZ2luVXNlciBsb2dpblVzZXIgPSBTZWN1cml0eVV0aWxzLmdldExvZ2luVXNlcigpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOdWxsKGxvZ2luVXNlcikgfHwgQ29sbGVjdGlvblV0aWxzLmlzRW1wdHkobG9naW5Vc2VyLmdldFVzZXIoKS5nZXRSb2xlcygpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoU3lzUm9sZSBzeXNSb2xlIDogbG9naW5Vc2VyLmdldFVzZXIoKS5nZXRSb2xlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcm9sZUtleSA9IHN5c1JvbGUuZ2V0Um9sZUtleSgpOworICAgICAgICAgICAgaWYgKENvbnN0YW50cy5TVVBFUl9BRE1JTi5lcXVhbHMocm9sZUtleSkgfHwgcm9sZUtleS5lcXVhbHMoU3RyaW5nVXRpbHMudHJpbShyb2xlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmqjOivgeeUqOaIt+aYr+WQpuS4jeWFt+Wkh+afkOinkuiJsu+8jOS4jiBpc1JvbGXpgLvovpHnm7jlj43jgIIKKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIOinkuiJsuWQjeensAorICAgICAqIEByZXR1cm4g55So5oi35piv5ZCm5LiN5YW35aSH5p+Q6KeS6ImyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbGFja3NSb2xlKFN0cmluZyByb2xlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGhhc1JvbGUocm9sZSkgIT0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpqozor4HnlKjmiLfmmK/lkKblhbfmnInku6XkuIvku7vmhI/kuIDkuKrop5LoibIKKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlcyDku6UgUk9MRV9OQU1FU19ERUxJTUVURVIg5Li65YiG6ZqU56ym55qE6KeS6Imy5YiX6KGoCisgICAgICogQHJldHVybiDnlKjmiLfmmK/lkKblhbfmnInku6XkuIvku7vmhI/kuIDkuKrop5LoibIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbnlSb2xlcyhTdHJpbmcgcm9sZXMpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShyb2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gU2VjdXJpdHlVdGlscy5nZXRMb2dpblVzZXIoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbChsb2dpblVzZXIpIHx8IENvbGxlY3Rpb25VdGlscy5pc0VtcHR5KGxvZ2luVXNlci5nZXRVc2VyKCkuZ2V0Um9sZXMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyByb2xlIDogcm9sZXMuc3BsaXQoQ29uc3RhbnRzLlJPTEVfREVMSU1FVEVSKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc1JvbGUocm9sZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIpOaWreaYr+WQpuWMheWQq+adg+mZkAorICAgICAqIAorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyDmnYPpmZDliJfooagKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiDmnYPpmZDlrZfnrKbkuLIKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+aYr+WQpuWFt+Wkh+afkOadg+mZkAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQZXJtaXNzaW9ucyhTZXQ8U3RyaW5nPiBwZXJtaXNzaW9ucywgU3RyaW5nIHBlcm1pc3Npb24pCisgICAgeworICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMuY29udGFpbnMoQ29uc3RhbnRzLkFMTF9QRVJNSVNTSU9OKSB8fCBwZXJtaXNzaW9ucy5jb250YWlucyhTdHJpbmdVdGlscy50cmltKHBlcm1pc3Npb24pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1N5c0xvZ2luU2VydmljZS5qYXZhIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9TeXNMb2dpblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc5ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9TeXNMb2dpblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlOworCitpbXBvcnQgamFrYXJ0YS5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmF1dGhlbnRpY2F0aW9uLkF1dGhlbnRpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmF1dGhlbnRpY2F0aW9uLkJhZENyZWRlbnRpYWxzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW47CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLkF1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5DYWNoZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucmVkaXMuUmVkaXNDYWNoZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5TZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXIuQmxhY2tMaXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXIuQ2FwdGNoYUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi51c2VyLkNhcHRjaGFFeHBpcmVFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24udXNlci5Vc2VyTm90RXhpc3RzRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXIuVXNlclBhc3N3b3JkTm90TWF0Y2hFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5NZXNzYWdlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmlwLklwVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5tYW5hZ2VyLkFzeW5jTWFuYWdlcjsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXIuZmFjdG9yeS5Bc3luY0ZhY3Rvcnk7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5jb250ZXh0LkF1dGhlbnRpY2F0aW9uQ29udGV4dEhvbGRlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0NvbmZpZ1NlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNVc2VyU2VydmljZTsKKworLyoqCisgKiDnmbvlvZXmoKHpqozmlrnms5UKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgU3lzTG9naW5TZXJ2aWNlCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVG9rZW5TZXJ2aWNlIHRva2VuU2VydmljZTsKKworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgQXV0aGVudGljYXRpb25NYW5hZ2VyIGF1dGhlbnRpY2F0aW9uTWFuYWdlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJlZGlzQ2FjaGUgcmVkaXNDYWNoZTsKKyAgICAKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzVXNlclNlcnZpY2UgdXNlclNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzQ29uZmlnU2VydmljZSBjb25maWdTZXJ2aWNlOworCisgICAgLyoqCisgICAgICog55m75b2V6aqM6K+BCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJuYW1lIOeUqOaIt+WQjQorICAgICAqIEBwYXJhbSBwYXNzd29yZCDlr4bnoIEKKyAgICAgKiBAcGFyYW0gY29kZSDpqozor4HnoIEKKyAgICAgKiBAcGFyYW0gdXVpZCDllK/kuIDmoIfor4YKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbG9naW4oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBjb2RlLCBTdHJpbmcgdXVpZCkKKyAgICB7CisgICAgICAgIC8vIOmqjOivgeeggeagoemqjAorICAgICAgICB2YWxpZGF0ZUNhcHRjaGEodXNlcm5hbWUsIGNvZGUsIHV1aWQpOworICAgICAgICAvLyDnmbvlvZXliY3nva7moKHpqowKKyAgICAgICAgbG9naW5QcmVDaGVjayh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAvLyDnlKjmiLfpqozor4EKKyAgICAgICAgQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb24gPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW4gYXV0aGVudGljYXRpb25Ub2tlbiA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQXV0aGVudGljYXRpb25Ub2tlbih1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgQXV0aGVudGljYXRpb25Db250ZXh0SG9sZGVyLnNldENvbnRleHQoYXV0aGVudGljYXRpb25Ub2tlbik7CisgICAgICAgICAgICAvLyDor6Xmlrnms5XkvJrljrvosIPnlKhVc2VyRGV0YWlsc1NlcnZpY2VJbXBsLmxvYWRVc2VyQnlVc2VybmFtZQorICAgICAgICAgICAgYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbk1hbmFnZXIuYXV0aGVudGljYXRlKGF1dGhlbnRpY2F0aW9uVG9rZW4pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBCYWRDcmVkZW50aWFsc0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3luY01hbmFnZXIubWUoKS5leGVjdXRlKEFzeW5jRmFjdG9yeS5yZWNvcmRMb2dpbmluZm9yKHVzZXJuYW1lLCBDb25zdGFudHMuTE9HSU5fRkFJTCwgTWVzc2FnZVV0aWxzLm1lc3NhZ2UoInVzZXIucGFzc3dvcmQubm90Lm1hdGNoIikpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlclBhc3N3b3JkTm90TWF0Y2hFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3luY01hbmFnZXIubWUoKS5leGVjdXRlKEFzeW5jRmFjdG9yeS5yZWNvcmRMb2dpbmluZm9yKHVzZXJuYW1lLCBDb25zdGFudHMuTE9HSU5fRkFJTCwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBBdXRoZW50aWNhdGlvbkNvbnRleHRIb2xkZXIuY2xlYXJDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkTG9naW5pbmZvcih1c2VybmFtZSwgQ29uc3RhbnRzLkxPR0lOX1NVQ0NFU1MsIE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJ1c2VyLmxvZ2luLnN1Y2Nlc3MiKSkpOworICAgICAgICBMb2dpblVzZXIgbG9naW5Vc2VyID0gKExvZ2luVXNlcikgYXV0aGVudGljYXRpb24uZ2V0UHJpbmNpcGFsKCk7CisgICAgICAgIHJlY29yZExvZ2luSW5mbyhsb2dpblVzZXIuZ2V0VXNlcklkKCkpOworICAgICAgICAvLyDnlJ/miJB0b2tlbgorICAgICAgICByZXR1cm4gdG9rZW5TZXJ2aWNlLmNyZWF0ZVRva2VuKGxvZ2luVXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6aqM6K+B56CBCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJuYW1lIOeUqOaIt+WQjQorICAgICAqIEBwYXJhbSBjb2RlIOmqjOivgeeggQorICAgICAqIEBwYXJhbSB1dWlkIOWUr+S4gOagh+ivhgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDYXB0Y2hhKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNvZGUsIFN0cmluZyB1dWlkKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBjYXB0Y2hhRW5hYmxlZCA9IGNvbmZpZ1NlcnZpY2Uuc2VsZWN0Q2FwdGNoYUVuYWJsZWQoKTsKKyAgICAgICAgaWYgKGNhcHRjaGFFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdmVyaWZ5S2V5ID0gQ2FjaGVDb25zdGFudHMuQ0FQVENIQV9DT0RFX0tFWSArIFN0cmluZ1V0aWxzLm52bCh1dWlkLCAiIik7CisgICAgICAgICAgICBTdHJpbmcgY2FwdGNoYSA9IHJlZGlzQ2FjaGUuZ2V0Q2FjaGVPYmplY3QodmVyaWZ5S2V5KTsKKyAgICAgICAgICAgIGlmIChjYXB0Y2hhID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkTG9naW5pbmZvcih1c2VybmFtZSwgQ29uc3RhbnRzLkxPR0lOX0ZBSUwsIE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJ1c2VyLmpjYXB0Y2hhLmV4cGlyZSIpKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhcHRjaGFFeHBpcmVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZGlzQ2FjaGUuZGVsZXRlT2JqZWN0KHZlcmlmeUtleSk7CisgICAgICAgICAgICBpZiAoIWNvZGUuZXF1YWxzSWdub3JlQ2FzZShjYXB0Y2hhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3luY01hbmFnZXIubWUoKS5leGVjdXRlKEFzeW5jRmFjdG9yeS5yZWNvcmRMb2dpbmluZm9yKHVzZXJuYW1lLCBDb25zdGFudHMuTE9HSU5fRkFJTCwgTWVzc2FnZVV0aWxzLm1lc3NhZ2UoInVzZXIuamNhcHRjaGEuZXJyb3IiKSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYXB0Y2hhRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnmbvlvZXliY3nva7moKHpqowKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUg55So5oi35ZCNCisgICAgICogQHBhcmFtIHBhc3N3b3JkIOeUqOaIt+WvhueggQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZ2luUHJlQ2hlY2soU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgeworICAgICAgICAvLyDnlKjmiLflkI3miJblr4bnoIHkuLrnqbog6ZSZ6K+vCisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXJuYW1lKSB8fCBTdHJpbmdVdGlscy5pc0VtcHR5KHBhc3N3b3JkKSkKKyAgICAgICAgeworICAgICAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkTG9naW5pbmZvcih1c2VybmFtZSwgQ29uc3RhbnRzLkxPR0lOX0ZBSUwsIE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJub3QubnVsbCIpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlck5vdEV4aXN0c0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIC8vIOWvhueggeWmguaenOS4jeWcqOaMh+WumuiMg+WbtOWGhSDplJnor68KKyAgICAgICAgaWYgKHBhc3N3b3JkLmxlbmd0aCgpIDwgVXNlckNvbnN0YW50cy5QQVNTV09SRF9NSU5fTEVOR1RICisgICAgICAgICAgICAgICAgfHwgcGFzc3dvcmQubGVuZ3RoKCkgPiBVc2VyQ29uc3RhbnRzLlBBU1NXT1JEX01BWF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzeW5jTWFuYWdlci5tZSgpLmV4ZWN1dGUoQXN5bmNGYWN0b3J5LnJlY29yZExvZ2luaW5mb3IodXNlcm5hbWUsIENvbnN0YW50cy5MT0dJTl9GQUlMLCBNZXNzYWdlVXRpbHMubWVzc2FnZSgidXNlci5wYXNzd29yZC5ub3QubWF0Y2giKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8g55So5oi35ZCN5LiN5Zyo5oyH5a6a6IyD5Zu05YaFIOmUmeivrworICAgICAgICBpZiAodXNlcm5hbWUubGVuZ3RoKCkgPCBVc2VyQ29uc3RhbnRzLlVTRVJOQU1FX01JTl9MRU5HVEgKKyAgICAgICAgICAgICAgICB8fCB1c2VybmFtZS5sZW5ndGgoKSA+IFVzZXJDb25zdGFudHMuVVNFUk5BTUVfTUFYX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgICAgQXN5bmNNYW5hZ2VyLm1lKCkuZXhlY3V0ZShBc3luY0ZhY3RvcnkucmVjb3JkTG9naW5pbmZvcih1c2VybmFtZSwgQ29uc3RhbnRzLkxPR0lOX0ZBSUwsIE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJ1c2VyLnBhc3N3b3JkLm5vdC5tYXRjaCIpKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlclBhc3N3b3JkTm90TWF0Y2hFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJUOm7keWQjeWNleagoemqjAorICAgICAgICBTdHJpbmcgYmxhY2tTdHIgPSBjb25maWdTZXJ2aWNlLnNlbGVjdENvbmZpZ0J5S2V5KCJzeXMubG9naW4uYmxhY2tJUExpc3QiKTsKKyAgICAgICAgaWYgKElwVXRpbHMuaXNNYXRjaGVkSXAoYmxhY2tTdHIsIElwVXRpbHMuZ2V0SXBBZGRyKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBBc3luY01hbmFnZXIubWUoKS5leGVjdXRlKEFzeW5jRmFjdG9yeS5yZWNvcmRMb2dpbmluZm9yKHVzZXJuYW1lLCBDb25zdGFudHMuTE9HSU5fRkFJTCwgTWVzc2FnZVV0aWxzLm1lc3NhZ2UoImxvZ2luLmJsb2NrZWQiKSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJsYWNrTGlzdEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6w5b2V55m75b2V5L+h5oGvCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb3JkTG9naW5JbmZvKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgU3lzVXNlciBzeXNVc2VyID0gbmV3IFN5c1VzZXIoKTsKKyAgICAgICAgc3lzVXNlci5zZXRVc2VySWQodXNlcklkKTsKKyAgICAgICAgc3lzVXNlci5zZXRMb2dpbklwKElwVXRpbHMuZ2V0SXBBZGRyKCkpOworICAgICAgICBzeXNVc2VyLnNldExvZ2luRGF0ZShEYXRlVXRpbHMuZ2V0Tm93RGF0ZSgpKTsKKyAgICAgICAgdXNlclNlcnZpY2UudXBkYXRlVXNlclByb2ZpbGUoc3lzVXNlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9TeXNQYXNzd29yZFNlcnZpY2UuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvU3lzUGFzc3dvcmRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyOGM3YgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvU3lzUGFzc3dvcmRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS5BdXRoZW50aWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ2FjaGVDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucmVkaXMuUmVkaXNDYWNoZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi51c2VyLlVzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXIuVXNlclBhc3N3b3JkUmV0cnlMaW1pdEV4Y2VlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmZyYW1ld29yay5zZWN1cml0eS5jb250ZXh0LkF1dGhlbnRpY2F0aW9uQ29udGV4dEhvbGRlcjsKKworLyoqCisgKiDnmbvlvZXlr4bnoIHmlrnms5UKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgU3lzUGFzc3dvcmRTZXJ2aWNlCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUmVkaXNDYWNoZSByZWRpc0NhY2hlOworCisgICAgQFZhbHVlKHZhbHVlID0gIiR7dXNlci5wYXNzd29yZC5tYXhSZXRyeUNvdW50fSIpCisgICAgcHJpdmF0ZSBpbnQgbWF4UmV0cnlDb3VudDsKKworICAgIEBWYWx1ZSh2YWx1ZSA9ICIke3VzZXIucGFzc3dvcmQubG9ja1RpbWV9IikKKyAgICBwcml2YXRlIGludCBsb2NrVGltZTsKKworICAgIC8qKgorICAgICAqIOeZu+W9lei0puaIt+WvhueggemUmeivr+asoeaVsOe8k+WtmOmUruWQjQorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VybmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcmV0dXJuIOe8k+WtmOmUrmtleQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyB1c2VybmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBDYWNoZUNvbnN0YW50cy5QV0RfRVJSX0NOVF9LRVkgKyB1c2VybmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBBdXRoZW50aWNhdGlvbiB1c2VybmFtZVBhc3N3b3JkQXV0aGVudGljYXRpb25Ub2tlbiA9IEF1dGhlbnRpY2F0aW9uQ29udGV4dEhvbGRlci5nZXRDb250ZXh0KCk7CisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IHVzZXJuYW1lUGFzc3dvcmRBdXRoZW50aWNhdGlvblRva2VuLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gdXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW4uZ2V0Q3JlZGVudGlhbHMoKS50b1N0cmluZygpOworCisgICAgICAgIEludGVnZXIgcmV0cnlDb3VudCA9IHJlZGlzQ2FjaGUuZ2V0Q2FjaGVPYmplY3QoZ2V0Q2FjaGVLZXkodXNlcm5hbWUpKTsKKworICAgICAgICBpZiAocmV0cnlDb3VudCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXRyeUNvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXRyeUNvdW50ID49IEludGVnZXIudmFsdWVPZihtYXhSZXRyeUNvdW50KS5pbnRWYWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXNlclBhc3N3b3JkUmV0cnlMaW1pdEV4Y2VlZEV4Y2VwdGlvbihtYXhSZXRyeUNvdW50LCBsb2NrVGltZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1hdGNoZXModXNlciwgcGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXRyeUNvdW50ID0gcmV0cnlDb3VudCArIDE7CisgICAgICAgICAgICByZWRpc0NhY2hlLnNldENhY2hlT2JqZWN0KGdldENhY2hlS2V5KHVzZXJuYW1lKSwgcmV0cnlDb3VudCwgbG9ja1RpbWUsIFRpbWVVbml0Lk1JTlVURVMpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJQYXNzd29yZE5vdE1hdGNoRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjbGVhckxvZ2luUmVjb3JkQ2FjaGUodXNlcm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTeXNVc2VyIHVzZXIsIFN0cmluZyByYXdQYXNzd29yZCkKKyAgICB7CisgICAgICAgIHJldHVybiBTZWN1cml0eVV0aWxzLm1hdGNoZXNQYXNzd29yZChyYXdQYXNzd29yZCwgdXNlci5nZXRQYXNzd29yZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckxvZ2luUmVjb3JkQ2FjaGUoU3RyaW5nIGxvZ2luTmFtZSkKKyAgICB7CisgICAgICAgIGlmIChyZWRpc0NhY2hlLmhhc0tleShnZXRDYWNoZUtleShsb2dpbk5hbWUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXNDYWNoZS5kZWxldGVPYmplY3QoZ2V0Q2FjaGVLZXkobG9naW5OYW1lKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1N5c1Blcm1pc3Npb25TZXJ2aWNlLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1N5c1Blcm1pc3Npb25TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNGRkOQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvU3lzUGVybWlzc2lvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5Db2xsZWN0aW9uVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Vc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzTWVudVNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNSb2xlU2VydmljZTsKKworLyoqCisgKiDnlKjmiLfmnYPpmZDlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgU3lzUGVybWlzc2lvblNlcnZpY2UKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzUm9sZVNlcnZpY2Ugcm9sZVNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzTWVudVNlcnZpY2UgbWVudVNlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDojrflj5bop5LoibLmlbDmja7mnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOinkuiJsuadg+mZkOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSb2xlUGVybWlzc2lvbihTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBTZXQ8U3RyaW5nPiByb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgLy8g566h55CG5ZGY5oul5pyJ5omA5pyJ5p2D6ZmQCisgICAgICAgIGlmICh1c2VyLmlzQWRtaW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcm9sZXMuYWRkKCJhZG1pbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcm9sZXMuYWRkQWxsKHJvbGVTZXJ2aWNlLnNlbGVjdFJvbGVQZXJtaXNzaW9uQnlVc2VySWQodXNlci5nZXRVc2VySWQoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb2xlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5boj5zljZXmlbDmja7mnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOiPnOWNleadg+mZkOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRNZW51UGVybWlzc2lvbihTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBTZXQ8U3RyaW5nPiBwZXJtcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgLy8g566h55CG5ZGY5oul5pyJ5omA5pyJ5p2D6ZmQCisgICAgICAgIGlmICh1c2VyLmlzQWRtaW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGVybXMuYWRkKCIqOio6KiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxTeXNSb2xlPiByb2xlcyA9IHVzZXIuZ2V0Um9sZXMoKTsKKyAgICAgICAgICAgIGlmICghQ29sbGVjdGlvblV0aWxzLmlzRW1wdHkocm9sZXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOWkmuinkuiJsuiuvue9rnBlcm1pc3Npb25z5bGe5oCn77yM5Lul5L6/5pWw5o2u5p2D6ZmQ5Yy56YWN5p2D6ZmQCisgICAgICAgICAgICAgICAgZm9yIChTeXNSb2xlIHJvbGUgOiByb2xlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5lcXVhbHMocm9sZS5nZXRTdGF0dXMoKSwgVXNlckNvbnN0YW50cy5ST0xFX05PUk1BTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHJvbGVQZXJtcyA9IG1lbnVTZXJ2aWNlLnNlbGVjdE1lbnVQZXJtc0J5Um9sZUlkKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5zZXRQZXJtaXNzaW9ucyhyb2xlUGVybXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcGVybXMuYWRkQWxsKHJvbGVQZXJtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVybXMuYWRkQWxsKG1lbnVTZXJ2aWNlLnNlbGVjdE1lbnVQZXJtc0J5VXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGVybXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9TeXNSZWdpc3RlclNlcnZpY2UuamF2YSBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvU3lzUmVnaXN0ZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhZmUzMQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvU3lzUmVnaXN0ZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmZyYW1ld29yay53ZWIuc2VydmljZTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ2FjaGVDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Vc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1VzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5SZWdpc3RlckJvZHk7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnJlZGlzLlJlZGlzQ2FjaGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24udXNlci5DYXB0Y2hhRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLnVzZXIuQ2FwdGNoYUV4cGlyZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZnJhbWV3b3JrLm1hbmFnZXIuQXN5bmNNYW5hZ2VyOworaW1wb3J0IGNvbS5ydW95aS5mcmFtZXdvcmsubWFuYWdlci5mYWN0b3J5LkFzeW5jRmFjdG9yeTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0NvbmZpZ1NlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNVc2VyU2VydmljZTsKKworLyoqCisgKiDms6jlhozmoKHpqozmlrnms5UKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgU3lzUmVnaXN0ZXJTZXJ2aWNlCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c1VzZXJTZXJ2aWNlIHVzZXJTZXJ2aWNlOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c0NvbmZpZ1NlcnZpY2UgY29uZmlnU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJlZGlzQ2FjaGUgcmVkaXNDYWNoZTsKKworICAgIC8qKgorICAgICAqIOazqOWGjAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVnaXN0ZXIoUmVnaXN0ZXJCb2R5IHJlZ2lzdGVyQm9keSkKKyAgICB7CisgICAgICAgIFN0cmluZyBtc2cgPSAiIiwgdXNlcm5hbWUgPSByZWdpc3RlckJvZHkuZ2V0VXNlcm5hbWUoKSwgcGFzc3dvcmQgPSByZWdpc3RlckJvZHkuZ2V0UGFzc3dvcmQoKTsKKyAgICAgICAgU3lzVXNlciBzeXNVc2VyID0gbmV3IFN5c1VzZXIoKTsKKyAgICAgICAgc3lzVXNlci5zZXRVc2VyTmFtZSh1c2VybmFtZSk7CisKKyAgICAgICAgLy8g6aqM6K+B56CB5byA5YWzCisgICAgICAgIGJvb2xlYW4gY2FwdGNoYUVuYWJsZWQgPSBjb25maWdTZXJ2aWNlLnNlbGVjdENhcHRjaGFFbmFibGVkKCk7CisgICAgICAgIGlmIChjYXB0Y2hhRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGVDYXB0Y2hhKHVzZXJuYW1lLCByZWdpc3RlckJvZHkuZ2V0Q29kZSgpLCByZWdpc3RlckJvZHkuZ2V0VXVpZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXJuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnID0gIueUqOaIt+WQjeS4jeiDveS4uuepuiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShwYXNzd29yZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9ICLnlKjmiLflr4bnoIHkuI3og73kuLrnqboiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHVzZXJuYW1lLmxlbmd0aCgpIDwgVXNlckNvbnN0YW50cy5VU0VSTkFNRV9NSU5fTEVOR1RICisgICAgICAgICAgICAgICAgfHwgdXNlcm5hbWUubGVuZ3RoKCkgPiBVc2VyQ29uc3RhbnRzLlVTRVJOQU1FX01BWF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9ICLotKbmiLfplb/luqblv4XpobvlnKgy5YiwMjDkuKrlrZfnrKbkuYvpl7QiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhc3N3b3JkLmxlbmd0aCgpIDwgVXNlckNvbnN0YW50cy5QQVNTV09SRF9NSU5fTEVOR1RICisgICAgICAgICAgICAgICAgfHwgcGFzc3dvcmQubGVuZ3RoKCkgPiBVc2VyQ29uc3RhbnRzLlBBU1NXT1JEX01BWF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZyA9ICLlr4bnoIHplb/luqblv4XpobvlnKg15YiwMjDkuKrlrZfnrKbkuYvpl7QiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCF1c2VyU2VydmljZS5jaGVja1VzZXJOYW1lVW5pcXVlKHN5c1VzZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBtc2cgPSAi5L+d5a2Y55So5oi3JyIgKyB1c2VybmFtZSArICIn5aSx6LSl77yM5rOo5YaM6LSm5Y+35bey5a2Y5ZyoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c1VzZXIuc2V0Tmlja05hbWUodXNlcm5hbWUpOworICAgICAgICAgICAgc3lzVXNlci5zZXRQYXNzd29yZChTZWN1cml0eVV0aWxzLmVuY3J5cHRQYXNzd29yZChwYXNzd29yZCkpOworICAgICAgICAgICAgYm9vbGVhbiByZWdGbGFnID0gdXNlclNlcnZpY2UucmVnaXN0ZXJVc2VyKHN5c1VzZXIpOworICAgICAgICAgICAgaWYgKCFyZWdGbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zZyA9ICLms6jlhozlpLHotKUs6K+36IGU57O757O757uf566h55CG5Lq65ZGYIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3luY01hbmFnZXIubWUoKS5leGVjdXRlKEFzeW5jRmFjdG9yeS5yZWNvcmRMb2dpbmluZm9yKHVzZXJuYW1lLCBDb25zdGFudHMuUkVHSVNURVIsIE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJ1c2VyLnJlZ2lzdGVyLnN1Y2Nlc3MiKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6aqM6K+B56CBCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJuYW1lIOeUqOaIt+WQjQorICAgICAqIEBwYXJhbSBjb2RlIOmqjOivgeeggQorICAgICAqIEBwYXJhbSB1dWlkIOWUr+S4gOagh+ivhgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDYXB0Y2hhKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNvZGUsIFN0cmluZyB1dWlkKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZlcmlmeUtleSA9IENhY2hlQ29uc3RhbnRzLkNBUFRDSEFfQ09ERV9LRVkgKyBTdHJpbmdVdGlscy5udmwodXVpZCwgIiIpOworICAgICAgICBTdHJpbmcgY2FwdGNoYSA9IHJlZGlzQ2FjaGUuZ2V0Q2FjaGVPYmplY3QodmVyaWZ5S2V5KTsKKyAgICAgICAgcmVkaXNDYWNoZS5kZWxldGVPYmplY3QodmVyaWZ5S2V5KTsKKyAgICAgICAgaWYgKGNhcHRjaGEgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhcHRjaGFFeHBpcmVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvZGUuZXF1YWxzSWdub3JlQ2FzZShjYXB0Y2hhKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IENhcHRjaGFFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWZyYW1ld29yay9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9mcmFtZXdvcmsvd2ViL3NlcnZpY2UvVG9rZW5TZXJ2aWNlLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1Rva2VuU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2ViYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1Rva2VuU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACitwYWNrYWdlIGNvbS5ydW95aS5mcmFtZXdvcmsud2ViLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ2FjaGVDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnJlZGlzLlJlZGlzQ2FjaGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZXJ2bGV0VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmlwLkFkZHJlc3NVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmlwLklwVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy51dWlkLklkVXRpbHM7CitpbXBvcnQgZXUuYml0d2Fsa2VyLnVzZXJhZ2VudHV0aWxzLlVzZXJBZ2VudDsKK2ltcG9ydCBpby5qc29ud2VidG9rZW4uQ2xhaW1zOworaW1wb3J0IGlvLmpzb253ZWJ0b2tlbi5Kd3RzOworaW1wb3J0IGlvLmpzb253ZWJ0b2tlbi5TaWduYXR1cmVBbGdvcml0aG07CisKKy8qKgorICogdG9rZW7pqozor4HlpITnkIYKKyAqCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBUb2tlblNlcnZpY2UKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVG9rZW5TZXJ2aWNlLmNsYXNzKTsKKworICAgIC8vIOS7pOeJjOiHquWumuS5ieagh+ivhgorICAgIEBWYWx1ZSgiJHt0b2tlbi5oZWFkZXJ9IikKKyAgICBwcml2YXRlIFN0cmluZyBoZWFkZXI7CisKKyAgICAvLyDku6TniYznp5jpkqUKKyAgICBAVmFsdWUoIiR7dG9rZW4uc2VjcmV0fSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VjcmV0OworCisgICAgLy8g5Luk54mM5pyJ5pWI5pyf77yI6buY6K6kMzDliIbpkp/vvIkKKyAgICBAVmFsdWUoIiR7dG9rZW4uZXhwaXJlVGltZX0iKQorICAgIHByaXZhdGUgaW50IGV4cGlyZVRpbWU7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTX1NFQ09ORCA9IDEwMDA7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTX01JTlVURSA9IDYwICogTUlMTElTX1NFQ09ORDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvbmcgTUlMTElTX01JTlVURV9URU4gPSAyMCAqIDYwICogMTAwMEw7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSZWRpc0NhY2hlIHJlZGlzQ2FjaGU7CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnlKjmiLfouqvku73kv6Hmga8KKyAgICAgKgorICAgICAqIEByZXR1cm4g55So5oi35L+h5oGvCisgICAgICovCisgICAgcHVibGljIExvZ2luVXNlciBnZXRMb2dpblVzZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgeworICAgICAgICAvLyDojrflj5bor7fmsYLmkLrluKbnmoTku6TniYwKKyAgICAgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxdWVzdCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHRva2VuKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xhaW1zIGNsYWltcyA9IHBhcnNlVG9rZW4odG9rZW4pOworICAgICAgICAgICAgICAgIC8vIOino+aekOWvueW6lOeahOadg+mZkOS7peWPiueUqOaIt+S/oeaBrworICAgICAgICAgICAgICAgIFN0cmluZyB1dWlkID0gKFN0cmluZykgY2xhaW1zLmdldChDb25zdGFudHMuTE9HSU5fVVNFUl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyB1c2VyS2V5ID0gZ2V0VG9rZW5LZXkodXVpZCk7CisgICAgICAgICAgICAgICAgTG9naW5Vc2VyIHVzZXIgPSByZWRpc0NhY2hlLmdldENhY2hlT2JqZWN0KHVzZXJLZXkpOworICAgICAgICAgICAgICAgIHJldHVybiB1c2VyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigi6I635Y+W55So5oi35L+h5oGv5byC5bi4J3t9JyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva7nlKjmiLfouqvku73kv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpblVzZXIoTG9naW5Vc2VyIGxvZ2luVXNlcikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwobG9naW5Vc2VyKSAmJiBTdHJpbmdVdGlscy5pc05vdEVtcHR5KGxvZ2luVXNlci5nZXRUb2tlbigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVmcmVzaFRva2VuKGxvZ2luVXNlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTnlKjmiLfouqvku73kv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxMb2dpblVzZXIoU3RyaW5nIHRva2VuKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodG9rZW4pKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXNlcktleSA9IGdldFRva2VuS2V5KHRva2VuKTsKKyAgICAgICAgICAgIHJlZGlzQ2FjaGUuZGVsZXRlT2JqZWN0KHVzZXJLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu65Luk54mMCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9naW5Vc2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g5Luk54mMCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVUb2tlbihMb2dpblVzZXIgbG9naW5Vc2VyKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRva2VuID0gSWRVdGlscy5mYXN0VVVJRCgpOworICAgICAgICBsb2dpblVzZXIuc2V0VG9rZW4odG9rZW4pOworICAgICAgICBzZXRVc2VyQWdlbnQobG9naW5Vc2VyKTsKKyAgICAgICAgcmVmcmVzaFRva2VuKGxvZ2luVXNlcik7CisKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjbGFpbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGNsYWltcy5wdXQoQ29uc3RhbnRzLkxPR0lOX1VTRVJfS0VZLCB0b2tlbik7CisgICAgICAgIHJldHVybiBjcmVhdGVUb2tlbihjbGFpbXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmqjOivgeS7pOeJjOacieaViOacn++8jOebuOW3ruS4jei2szIw5YiG6ZKf77yM6Ieq5Yqo5Yi35paw57yT5a2YCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9naW5Vc2VyCisgICAgICogQHJldHVybiDku6TniYwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlUb2tlbihMb2dpblVzZXIgbG9naW5Vc2VyKQorICAgIHsKKyAgICAgICAgbG9uZyBleHBpcmVUaW1lID0gbG9naW5Vc2VyLmdldEV4cGlyZVRpbWUoKTsKKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoZXhwaXJlVGltZSAtIGN1cnJlbnRUaW1lIDw9IE1JTExJU19NSU5VVEVfVEVOKQorICAgICAgICB7CisgICAgICAgICAgICByZWZyZXNoVG9rZW4obG9naW5Vc2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWIt+aWsOS7pOeJjOacieaViOacnworICAgICAqCisgICAgICogQHBhcmFtIGxvZ2luVXNlciDnmbvlvZXkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoVG9rZW4oTG9naW5Vc2VyIGxvZ2luVXNlcikKKyAgICB7CisgICAgICAgIGxvZ2luVXNlci5zZXRMb2dpblRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBsb2dpblVzZXIuc2V0RXhwaXJlVGltZShsb2dpblVzZXIuZ2V0TG9naW5UaW1lKCkgKyBleHBpcmVUaW1lICogTUlMTElTX01JTlVURSk7CisgICAgICAgIC8vIOagueaNrnV1aWTlsIZsb2dpblVzZXLnvJPlrZgKKyAgICAgICAgU3RyaW5nIHVzZXJLZXkgPSBnZXRUb2tlbktleShsb2dpblVzZXIuZ2V0VG9rZW4oKSk7CisgICAgICAgIHJlZGlzQ2FjaGUuc2V0Q2FjaGVPYmplY3QodXNlcktleSwgbG9naW5Vc2VyLCBleHBpcmVUaW1lLCBUaW1lVW5pdC5NSU5VVEVTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva7nlKjmiLfku6PnkIbkv6Hmga8KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2dpblVzZXIg55m75b2V5L+h5oGvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckFnZW50KExvZ2luVXNlciBsb2dpblVzZXIpCisgICAgeworICAgICAgICBVc2VyQWdlbnQgdXNlckFnZW50ID0gVXNlckFnZW50LnBhcnNlVXNlckFnZW50U3RyaW5nKFNlcnZsZXRVdGlscy5nZXRSZXF1ZXN0KCkuZ2V0SGVhZGVyKCJVc2VyLUFnZW50IikpOworICAgICAgICBTdHJpbmcgaXAgPSBJcFV0aWxzLmdldElwQWRkcigpOworICAgICAgICBsb2dpblVzZXIuc2V0SXBhZGRyKGlwKTsKKyAgICAgICAgbG9naW5Vc2VyLnNldExvZ2luTG9jYXRpb24oQWRkcmVzc1V0aWxzLmdldFJlYWxBZGRyZXNzQnlJUChpcCkpOworICAgICAgICBsb2dpblVzZXIuc2V0QnJvd3Nlcih1c2VyQWdlbnQuZ2V0QnJvd3NlcigpLmdldE5hbWUoKSk7CisgICAgICAgIGxvZ2luVXNlci5zZXRPcyh1c2VyQWdlbnQuZ2V0T3BlcmF0aW5nU3lzdGVtKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDku47mlbDmja7lo7DmmI7nlJ/miJDku6TniYwKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFpbXMg5pWw5o2u5aOw5piOCisgICAgICogQHJldHVybiDku6TniYwKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVUb2tlbihNYXA8U3RyaW5nLCBPYmplY3Q+IGNsYWltcykKKyAgICB7CisgICAgICAgIFN0cmluZyB0b2tlbiA9IEp3dHMuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldENsYWltcyhjbGFpbXMpCisgICAgICAgICAgICAgICAgLnNpZ25XaXRoKFNpZ25hdHVyZUFsZ29yaXRobS5IUzUxMiwgc2VjcmV0KS5jb21wYWN0KCk7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDku47ku6TniYzkuK3ojrflj5bmlbDmja7lo7DmmI4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiDku6TniYwKKyAgICAgKiBAcmV0dXJuIOaVsOaNruWjsOaYjgorICAgICAqLworICAgIHByaXZhdGUgQ2xhaW1zIHBhcnNlVG9rZW4oU3RyaW5nIHRva2VuKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEp3dHMucGFyc2VyKCkKKyAgICAgICAgICAgICAgICAuc2V0U2lnbmluZ0tleShzZWNyZXQpCisgICAgICAgICAgICAgICAgLnBhcnNlQ2xhaW1zSndzKHRva2VuKQorICAgICAgICAgICAgICAgIC5nZXRCb2R5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5LuO5Luk54mM5Lit6I635Y+W55So5oi35ZCNCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW4g5Luk54mMCisgICAgICogQHJldHVybiDnlKjmiLflkI0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lRnJvbVRva2VuKFN0cmluZyB0b2tlbikKKyAgICB7CisgICAgICAgIENsYWltcyBjbGFpbXMgPSBwYXJzZVRva2VuKHRva2VuKTsKKyAgICAgICAgcmV0dXJuIGNsYWltcy5nZXRTdWJqZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6K+35rGCdG9rZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0CisgICAgICogQHJldHVybiB0b2tlbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFRva2VuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRva2VuID0gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodG9rZW4pICYmIHRva2VuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlRPS0VOX1BSRUZJWCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW4ucmVwbGFjZShDb25zdGFudHMuVE9LRU5fUFJFRklYLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRva2VuS2V5KFN0cmluZyB1dWlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENhY2hlQ29uc3RhbnRzLkxPR0lOX1RPS0VOX0tFWSArIHV1aWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9Vc2VyRGV0YWlsc1NlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1mcmFtZXdvcmsvc3JjL21haW4vamF2YS9jb20vcnVveWkvZnJhbWV3b3JrL3dlYi9zZXJ2aWNlL1VzZXJEZXRhaWxzU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNkZjkwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZnJhbWV3b3JrL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2ZyYW1ld29yay93ZWIvc2VydmljZS9Vc2VyRGV0YWlsc1NlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBjb20ucnVveWkuZnJhbWV3b3JrLndlYi5zZXJ2aWNlOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLnVzZXJkZXRhaWxzLlVzZXJEZXRhaWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS51c2VyZGV0YWlscy5Vc2VyRGV0YWlsc1NlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLnVzZXJkZXRhaWxzLlVzZXJuYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLm1vZGVsLkxvZ2luVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLlVzZXJTdGF0dXM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzVXNlclNlcnZpY2U7CisKKy8qKgorICog55So5oi36aqM6K+B5aSE55CGCisgKgorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFVzZXJEZXRhaWxzU2VydmljZUltcGwgaW1wbGVtZW50cyBVc2VyRGV0YWlsc1NlcnZpY2UKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVXNlckRldGFpbHNTZXJ2aWNlSW1wbC5jbGFzcyk7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzVXNlclNlcnZpY2UgdXNlclNlcnZpY2U7CisgICAgCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzUGFzc3dvcmRTZXJ2aWNlIHBhc3N3b3JkU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1Blcm1pc3Npb25TZXJ2aWNlIHBlcm1pc3Npb25TZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVzZXJEZXRhaWxzIGxvYWRVc2VyQnlVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHRocm93cyBVc2VybmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgeworICAgICAgICBTeXNVc2VyIHVzZXIgPSB1c2VyU2VydmljZS5zZWxlY3RVc2VyQnlVc2VyTmFtZSh1c2VybmFtZSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwodXNlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCLnmbvlvZXnlKjmiLfvvJp7fSDkuI3lrZjlnKguIiwgdXNlcm5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZVV0aWxzLm1lc3NhZ2UoInVzZXIubm90LmV4aXN0cyIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChVc2VyU3RhdHVzLkRFTEVURUQuZ2V0Q29kZSgpLmVxdWFscyh1c2VyLmdldERlbEZsYWcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCLnmbvlvZXnlKjmiLfvvJp7fSDlt7LooqvliKDpmaQuIiwgdXNlcm5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZVV0aWxzLm1lc3NhZ2UoInVzZXIucGFzc3dvcmQuZGVsZXRlIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFVzZXJTdGF0dXMuRElTQUJMRS5nZXRDb2RlKCkuZXF1YWxzKHVzZXIuZ2V0U3RhdHVzKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuaW5mbygi55m75b2V55So5oi377yae30g5bey6KKr5YGc55SoLiIsIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VVdGlscy5tZXNzYWdlKCJ1c2VyLmJsb2NrZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBwYXNzd29yZFNlcnZpY2UudmFsaWRhdGUodXNlcik7CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUxvZ2luVXNlcih1c2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckRldGFpbHMgY3JlYXRlTG9naW5Vc2VyKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTG9naW5Vc2VyKHVzZXIuZ2V0VXNlcklkKCksIHVzZXIuZ2V0RGVwdElkKCksIHVzZXIsIHBlcm1pc3Npb25TZXJ2aWNlLmdldE1lbnVQZXJtaXNzaW9uKHVzZXIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3IvcG9tLnhtbCBiL3J1b3lpLWdlbmVyYXRvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTkwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3IvcG9tLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnJ1b3lpPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4zLjguODwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5ydW95aS1nZW5lcmF0b3I8L2FydGlmYWN0SWQ+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIGdlbmVyYXRvcuS7o+eggeeUn+aIkAorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDwhLS0gdmVsb2NpdHnku6PnoIHnlJ/miJDkvb/nlKjmqKHmnb8gLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS52ZWxvY2l0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnZlbG9jaXR5LWVuZ2luZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSDpgJrnlKjlt6XlhbctLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIOmYv+mHjOaVsOaNruW6k+i/nuaOpeaxoCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uYWxpYmFiYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmRydWlkLXNwcmluZy1ib290LTMtc3RhcnRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2NvbmZpZy9HZW5Db25maWcuamF2YSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvY29uZmlnL0dlbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGNkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2NvbmZpZy9HZW5Db25maWcuamF2YQpAQCAtMCwwICsxLDczIEBACitwYWNrYWdlIGNvbS5ydW95aS5nZW5lcmF0b3IuY29uZmlnOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmNvbnRleHQucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Qcm9wZXJ0eVNvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCisvKioKKyAqIOivu+WPluS7o+eggeeUn+aIkOebuOWFs+mFjee9rgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQKK0BDb25maWd1cmF0aW9uUHJvcGVydGllcyhwcmVmaXggPSAiZ2VuIikKK0BQcm9wZXJ0eVNvdXJjZSh2YWx1ZSA9IHsgImNsYXNzcGF0aDpnZW5lcmF0b3IueW1sIiB9KQorcHVibGljIGNsYXNzIEdlbkNvbmZpZworeworICAgIC8qKiDkvZzogIUgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhdXRob3I7CisKKyAgICAvKiog55Sf5oiQ5YyF6Lev5b6EICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWU7CisKKyAgICAvKiog6Ieq5Yqo5Y676Zmk6KGo5YmN57yA77yM6buY6K6k5pivZmFsc2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXV0b1JlbW92ZVByZTsKKworICAgIC8qKiDooajliY3nvIAo57G75ZCN5LiN5Lya5YyF5ZCr6KGo5YmN57yAKSAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlUHJlZml4OworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXV0aG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhdXRob3I7CisgICAgfQorCisgICAgQFZhbHVlKCIke2F1dGhvcn0iKQorICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgYXV0aG9yKQorICAgIHsKKyAgICAgICAgR2VuQ29uZmlnLmF1dGhvciA9IGF1dGhvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgQFZhbHVlKCIke3BhY2thZ2VOYW1lfSIpCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQorICAgIHsKKyAgICAgICAgR2VuQ29uZmlnLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEF1dG9SZW1vdmVQcmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGF1dG9SZW1vdmVQcmU7CisgICAgfQorCisgICAgQFZhbHVlKCIke2F1dG9SZW1vdmVQcmV9IikKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvUmVtb3ZlUHJlKGJvb2xlYW4gYXV0b1JlbW92ZVByZSkKKyAgICB7CisgICAgICAgIEdlbkNvbmZpZy5hdXRvUmVtb3ZlUHJlID0gYXV0b1JlbW92ZVByZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWJsZVByZWZpeCgpCisgICAgeworICAgICAgICByZXR1cm4gdGFibGVQcmVmaXg7CisgICAgfQorCisgICAgQFZhbHVlKCIke3RhYmxlUHJlZml4fSIpCisgICAgcHVibGljIHZvaWQgc2V0VGFibGVQcmVmaXgoU3RyaW5nIHRhYmxlUHJlZml4KQorICAgIHsKKyAgICAgICAgR2VuQ29uZmlnLnRhYmxlUHJlZml4ID0gdGFibGVQcmVmaXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci9jb250cm9sbGVyL0dlbkNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvY29udHJvbGxlci9HZW5Db250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3NTJlNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvY29udHJvbGxlci9HZW5Db250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwyNTggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci5jb250cm9sbGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5HZXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0Qm9keTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVxdWVzdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlc3RDb250cm9sbGVyOworaW1wb3J0IGNvbS5hbGliYWJhLmRydWlkLkRiVHlwZTsKK2ltcG9ydCBjb20uYWxpYmFiYS5kcnVpZC5zcWwuU1FMVXRpbHM7CitpbXBvcnQgY29tLmFsaWJhYmEuZHJ1aWQuc3FsLmFzdC5TUUxTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmFsaWJhYmEuZHJ1aWQuc3FsLmRpYWxlY3QubXlzcWwuYXN0LnN0YXRlbWVudC5NeVNxbENyZWF0ZVRhYmxlU3RhdGVtZW50OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5Mb2c7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5BamF4UmVzdWx0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnRleHQuQ29udmVydDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcWwuU3FsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZTsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZUNvbHVtbjsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLnNlcnZpY2UuSUdlblRhYmxlQ29sdW1uU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLnNlcnZpY2UuSUdlblRhYmxlU2VydmljZTsKKworLyoqCisgKiDku6PnoIHnlJ/miJAg5pON5L2c5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9jb2RlL2dlbiIpCitwdWJsaWMgY2xhc3MgR2VuQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSUdlblRhYmxlU2VydmljZSBnZW5UYWJsZVNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJR2VuVGFibGVDb2x1bW5TZXJ2aWNlIGdlblRhYmxlQ29sdW1uU2VydmljZTsKKworICAgIC8qKgorICAgICAqIOafpeivouS7o+eggeeUn+aIkOWIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgndG9vbDpnZW46bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGdlbkxpc3QoR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxHZW5UYWJsZT4gbGlzdCA9IGdlblRhYmxlU2VydmljZS5zZWxlY3RHZW5UYWJsZUxpc3QoZ2VuVGFibGUpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS7o+eggeeUn+aIkOS4muWKoQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgndG9vbDpnZW46cXVlcnknKSIpCisgICAgQEdldE1hcHBpbmcodmFsdWUgPSAiL3t0YWJsZUlkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlIExvbmcgdGFibGVJZCkKKyAgICB7CisgICAgICAgIEdlblRhYmxlIHRhYmxlID0gZ2VuVGFibGVTZXJ2aWNlLnNlbGVjdEdlblRhYmxlQnlJZCh0YWJsZUlkKTsKKyAgICAgICAgTGlzdDxHZW5UYWJsZT4gdGFibGVzID0gZ2VuVGFibGVTZXJ2aWNlLnNlbGVjdEdlblRhYmxlQWxsKCk7CisgICAgICAgIExpc3Q8R2VuVGFibGVDb2x1bW4+IGxpc3QgPSBnZW5UYWJsZUNvbHVtblNlcnZpY2Uuc2VsZWN0R2VuVGFibGVDb2x1bW5MaXN0QnlUYWJsZUlkKHRhYmxlSWQpOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtYXAucHV0KCJpbmZvIiwgdGFibGUpOworICAgICAgICBtYXAucHV0KCJyb3dzIiwgbGlzdCk7CisgICAgICAgIG1hcC5wdXQoInRhYmxlcyIsIHRhYmxlcyk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKG1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5pWw5o2u5bqT5YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKCIvZGIvbGlzdCIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gZGF0YUxpc3QoR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxHZW5UYWJsZT4gbGlzdCA9IGdlblRhYmxlU2VydmljZS5zZWxlY3REYlRhYmxlTGlzdChnZW5UYWJsZSk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5pWw5o2u6KGo5a2X5q615YiX6KGoCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjpsaXN0JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi9jb2x1bW4ve3RhYmxlSWR9IikKKyAgICBwdWJsaWMgVGFibGVEYXRhSW5mbyBjb2x1bW5MaXN0KExvbmcgdGFibGVJZCkKKyAgICB7CisgICAgICAgIFRhYmxlRGF0YUluZm8gZGF0YUluZm8gPSBuZXcgVGFibGVEYXRhSW5mbygpOworICAgICAgICBMaXN0PEdlblRhYmxlQ29sdW1uPiBsaXN0ID0gZ2VuVGFibGVDb2x1bW5TZXJ2aWNlLnNlbGVjdEdlblRhYmxlQ29sdW1uTGlzdEJ5VGFibGVJZCh0YWJsZUlkKTsKKyAgICAgICAgZGF0YUluZm8uc2V0Um93cyhsaXN0KTsKKyAgICAgICAgZGF0YUluZm8uc2V0VG90YWwobGlzdC5zaXplKCkpOworICAgICAgICByZXR1cm4gZGF0YUluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICog5a+85YWl6KGo57uT5p6E77yI5L+d5a2Y77yJCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjppbXBvcnQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku6PnoIHnlJ/miJAiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU1QT1JUKQorICAgIEBQb3N0TWFwcGluZygiL2ltcG9ydFRhYmxlIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBpbXBvcnRUYWJsZVNhdmUoU3RyaW5nIHRhYmxlcykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHRhYmxlTmFtZXMgPSBDb252ZXJ0LnRvU3RyQXJyYXkodGFibGVzKTsKKyAgICAgICAgLy8g5p+l6K+i6KGo5L+h5oGvCisgICAgICAgIExpc3Q8R2VuVGFibGU+IHRhYmxlTGlzdCA9IGdlblRhYmxlU2VydmljZS5zZWxlY3REYlRhYmxlTGlzdEJ5TmFtZXModGFibGVOYW1lcyk7CisgICAgICAgIGdlblRhYmxlU2VydmljZS5pbXBvcnRHZW5UYWJsZSh0YWJsZUxpc3QsIFNlY3VyaXR5VXRpbHMuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu66KGo57uT5p6E77yI5L+d5a2Y77yJCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1JvbGUoJ2FkbWluJykiKQorICAgIEBMb2codGl0bGUgPSAi5Yib5bu66KGoIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLk9USEVSKQorICAgIEBQb3N0TWFwcGluZygiL2NyZWF0ZVRhYmxlIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBjcmVhdGVUYWJsZVNhdmUoU3RyaW5nIHNxbCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTcWxVdGlsLmZpbHRlcktleXdvcmQoc3FsKTsKKyAgICAgICAgICAgIExpc3Q8U1FMU3RhdGVtZW50PiBzcWxTdGF0ZW1lbnRzID0gU1FMVXRpbHMucGFyc2VTdGF0ZW1lbnRzKHNxbCwgRGJUeXBlLm15c3FsKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKFNRTFN0YXRlbWVudCBzcWxTdGF0ZW1lbnQgOiBzcWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzcWxTdGF0ZW1lbnQgaW5zdGFuY2VvZiBNeVNxbENyZWF0ZVRhYmxlU3RhdGVtZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXlTcWxDcmVhdGVUYWJsZVN0YXRlbWVudCBjcmVhdGVUYWJsZVN0YXRlbWVudCA9IChNeVNxbENyZWF0ZVRhYmxlU3RhdGVtZW50KSBzcWxTdGF0ZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZW5UYWJsZVNlcnZpY2UuY3JlYXRlVGFibGUoY3JlYXRlVGFibGVTdGF0ZW1lbnQudG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBjcmVhdGVUYWJsZVN0YXRlbWVudC5nZXRUYWJsZU5hbWUoKS5yZXBsYWNlQWxsKCJgIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lcy5hZGQodGFibGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8R2VuVGFibGU+IHRhYmxlTGlzdCA9IGdlblRhYmxlU2VydmljZS5zZWxlY3REYlRhYmxlTGlzdEJ5TmFtZXModGFibGVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGFibGVOYW1lcy5zaXplKCldKSk7CisgICAgICAgICAgICBTdHJpbmcgb3Blck5hbWUgPSBTZWN1cml0eVV0aWxzLmdldFVzZXJuYW1lKCk7CisgICAgICAgICAgICBnZW5UYWJsZVNlcnZpY2UuaW1wb3J0R2VuVGFibGUodGFibGVMaXN0LCBvcGVyTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQWpheFJlc3VsdC5zdWNjZXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIEFqYXhSZXN1bHQuZXJyb3IoIuWIm+W7uuihqOe7k+aehOW8guW4uCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55L+d5a2Y5Luj56CB55Sf5oiQ5Lia5YqhCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi5Luj56CB55Sf5oiQIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAUHV0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGVkaXRTYXZlKEBWYWxpZGF0ZWQgQFJlcXVlc3RCb2R5IEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgZ2VuVGFibGVTZXJ2aWNlLnZhbGlkYXRlRWRpdChnZW5UYWJsZSk7CisgICAgICAgIGdlblRhYmxlU2VydmljZS51cGRhdGVHZW5UYWJsZShnZW5UYWJsZSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk5Luj56CB55Sf5oiQCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku6PnoIHnlJ/miJAiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuREVMRVRFKQorICAgIEBEZWxldGVNYXBwaW5nKCIve3RhYmxlSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIHRhYmxlSWRzKQorICAgIHsKKyAgICAgICAgZ2VuVGFibGVTZXJ2aWNlLmRlbGV0ZUdlblRhYmxlQnlJZHModGFibGVJZHMpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmihOiniOS7o+eggQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgndG9vbDpnZW46cHJldmlldycpIikKKyAgICBAR2V0TWFwcGluZygiL3ByZXZpZXcve3RhYmxlSWR9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBwcmV2aWV3KEBQYXRoVmFyaWFibGUoInRhYmxlSWQiKSBMb25nIHRhYmxlSWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBkYXRhTWFwID0gZ2VuVGFibGVTZXJ2aWNlLnByZXZpZXdDb2RlKHRhYmxlSWQpOworICAgICAgICByZXR1cm4gc3VjY2VzcyhkYXRhTWFwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJDku6PnoIHvvIjkuIvovb3mlrnlvI/vvIkKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3Rvb2w6Z2VuOmNvZGUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku6PnoIHnlJ/miJAiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuR0VOQ09ERSkKKyAgICBAR2V0TWFwcGluZygiL2Rvd25sb2FkL3t0YWJsZU5hbWV9IikKKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBAUGF0aFZhcmlhYmxlKCJ0YWJsZU5hbWUiKSBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gZ2VuVGFibGVTZXJ2aWNlLmRvd25sb2FkQ29kZSh0YWJsZU5hbWUpOworICAgICAgICBnZW5Db2RlKHJlc3BvbnNlLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJDku6PnoIHvvIjoh6rlrprkuYnot6/lvoTvvIkKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ3Rvb2w6Z2VuOmNvZGUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLku6PnoIHnlJ/miJAiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuR0VOQ09ERSkKKyAgICBAR2V0TWFwcGluZygiL2dlbkNvZGUve3RhYmxlTmFtZX0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IGdlbkNvZGUoQFBhdGhWYXJpYWJsZSgidGFibGVOYW1lIikgU3RyaW5nIHRhYmxlTmFtZSkKKyAgICB7CisgICAgICAgIGdlblRhYmxlU2VydmljZS5nZW5lcmF0b3JDb2RlKHRhYmxlTmFtZSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5ZCM5q2l5pWw5o2u5bqTCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjplZGl0JykiKQorICAgIEBMb2codGl0bGUgPSAi5Luj56CB55Sf5oiQIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLlVQREFURSkKKyAgICBAR2V0TWFwcGluZygiL3N5bmNoRGIve3RhYmxlTmFtZX0iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHN5bmNoRGIoQFBhdGhWYXJpYWJsZSgidGFibGVOYW1lIikgU3RyaW5nIHRhYmxlTmFtZSkKKyAgICB7CisgICAgICAgIGdlblRhYmxlU2VydmljZS5zeW5jaERiKHRhYmxlTmFtZSk7CisgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP55Sf5oiQ5Luj56CBCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCd0b29sOmdlbjpjb2RlJykiKQorICAgIEBMb2codGl0bGUgPSAi5Luj56CB55Sf5oiQIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkdFTkNPREUpCisgICAgQEdldE1hcHBpbmcoIi9iYXRjaEdlbkNvZGUiKQorICAgIHB1YmxpYyB2b2lkIGJhdGNoR2VuQ29kZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgdGFibGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHRhYmxlTmFtZXMgPSBDb252ZXJ0LnRvU3RyQXJyYXkodGFibGVzKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBnZW5UYWJsZVNlcnZpY2UuZG93bmxvYWRDb2RlKHRhYmxlTmFtZXMpOworICAgICAgICBnZW5Db2RlKHJlc3BvbnNlLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJB6aXDmlofku7YKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuQ29kZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5yZXNldCgpOworICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIsICIqIik7CisgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMiLCAiQ29udGVudC1EaXNwb3NpdGlvbiIpOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgZmlsZW5hbWU9XCJydW95aS56aXBcIiIpOworICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgIiIgKyBkYXRhLmxlbmd0aCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07IGNoYXJzZXQ9VVRGLTgiKTsKKyAgICAgICAgSU9VdGlscy53cml0ZShkYXRhLCByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvZG9tYWluL0dlblRhYmxlLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2RvbWFpbi9HZW5UYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTg1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2RvbWFpbi9HZW5UYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzg1IEBACitwYWNrYWdlIGNvbS5ydW95aS5nZW5lcmF0b3IuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLlZhbGlkOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3RCbGFuazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkdlbkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkJhc2VFbnRpdHk7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiDkuJrliqHooaggZ2VuX3RhYmxlCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEdlblRhYmxlIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOe8luWPtyAqLworICAgIHByaXZhdGUgTG9uZyB0YWJsZUlkOworCisgICAgLyoqIOihqOWQjeensCAqLworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuihqOWQjeensOS4jeiDveS4uuepuiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGVOYW1lOworCisgICAgLyoqIOihqOaPj+i/sCAqLworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuihqOaPj+i/sOS4jeiDveS4uuepuiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGVDb21tZW50OworCisgICAgLyoqIOWFs+iBlOeItuihqOeahOihqOWQjSAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1YlRhYmxlTmFtZTsKKworICAgIC8qKiDmnKzooajlhbPogZTniLbooajnmoTlpJbplK7lkI0gKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdWJUYWJsZUZrTmFtZTsKKworICAgIC8qKiDlrp7kvZPnsbvlkI3np7Ao6aaW5a2X5q+N5aSn5YaZKSAqLworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuWunuS9k+exu+WQjeensOS4jeiDveS4uuepuiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgLyoqIOS9v+eUqOeahOaooeadv++8iGNydWTljZXooajmk43kvZwgdHJlZeagkeihqOaTjeS9nCBzdWLkuLvlrZDooajmk43kvZzvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0cGxDYXRlZ29yeTsKKworICAgIC8qKiDliY3nq6/nsbvlnovvvIhlbGVtZW50LXVp5qih54mIIGVsZW1lbnQtcGx1c+aooeeJiO+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIHRwbFdlYlR5cGU7CisKKyAgICAvKiog55Sf5oiQ5YyF6Lev5b6EICovCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi55Sf5oiQ5YyF6Lev5b6E5LiN6IO95Li656m6IikKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKKworICAgIC8qKiDnlJ/miJDmqKHlnZflkI0gKi8KKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLnlJ/miJDmqKHlnZflkI3kuI3og73kuLrnqboiKQorICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZU5hbWU7CisKKyAgICAvKiog55Sf5oiQ5Lia5Yqh5ZCNICovCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi55Sf5oiQ5Lia5Yqh5ZCN5LiN6IO95Li656m6IikKKyAgICBwcml2YXRlIFN0cmluZyBidXNpbmVzc05hbWU7CisKKyAgICAvKiog55Sf5oiQ5Yqf6IO95ZCNICovCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi55Sf5oiQ5Yqf6IO95ZCN5LiN6IO95Li656m6IikKKyAgICBwcml2YXRlIFN0cmluZyBmdW5jdGlvbk5hbWU7CisKKyAgICAvKiog55Sf5oiQ5L2c6ICFICovCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi5L2c6ICF5LiN6IO95Li656m6IikKKyAgICBwcml2YXRlIFN0cmluZyBmdW5jdGlvbkF1dGhvcjsKKworICAgIC8qKiDnlJ/miJDku6PnoIHmlrnlvI/vvIgwemlw5Y6L57yp5YyFIDHoh6rlrprkuYnot6/lvoTvvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZW5UeXBlOworCisgICAgLyoqIOeUn+aIkOi3r+W+hO+8iOS4jeWhq+m7mOiupOmhueebrui3r+W+hO+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGdlblBhdGg7CisKKyAgICAvKiog5Li76ZSu5L+h5oGvICovCisgICAgcHJpdmF0ZSBHZW5UYWJsZUNvbHVtbiBwa0NvbHVtbjsKKworICAgIC8qKiDlrZDooajkv6Hmga8gKi8KKyAgICBwcml2YXRlIEdlblRhYmxlIHN1YlRhYmxlOworCisgICAgLyoqIOihqOWIl+S/oeaBryAqLworICAgIEBWYWxpZAorICAgIHByaXZhdGUgTGlzdDxHZW5UYWJsZUNvbHVtbj4gY29sdW1uczsKKworICAgIC8qKiDlhbblroPnlJ/miJDpgInpobkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvcHRpb25zOworCisgICAgLyoqIOagkee8lueggeWtl+autSAqLworICAgIHByaXZhdGUgU3RyaW5nIHRyZWVDb2RlOworCisgICAgLyoqIOagkeeItue8lueggeWtl+autSAqLworICAgIHByaXZhdGUgU3RyaW5nIHRyZWVQYXJlbnRDb2RlOworCisgICAgLyoqIOagkeWQjeensOWtl+autSAqLworICAgIHByaXZhdGUgU3RyaW5nIHRyZWVOYW1lOworCisgICAgLyoqIOS4iue6p+iPnOWNlUlE5a2X5q61ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50TWVudUlkOworCisgICAgLyoqIOS4iue6p+iPnOWNleWQjeensOWtl+autSAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudE1lbnVOYW1lOworCisgICAgcHVibGljIExvbmcgZ2V0VGFibGVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gdGFibGVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZUlkKExvbmcgdGFibGVJZCkKKyAgICB7CisgICAgICAgIHRoaXMudGFibGVJZCA9IHRhYmxlSWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWUoU3RyaW5nIHRhYmxlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFibGVDb21tZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0YWJsZUNvbW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFibGVDb21tZW50KFN0cmluZyB0YWJsZUNvbW1lbnQpCisgICAgeworICAgICAgICB0aGlzLnRhYmxlQ29tbWVudCA9IHRhYmxlQ29tbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlRhYmxlTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3ViVGFibGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YlRhYmxlTmFtZShTdHJpbmcgc3ViVGFibGVOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5zdWJUYWJsZU5hbWUgPSBzdWJUYWJsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJUYWJsZUZrTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3ViVGFibGVGa05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3ViVGFibGVGa05hbWUoU3RyaW5nIHN1YlRhYmxlRmtOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5zdWJUYWJsZUZrTmFtZSA9IHN1YlRhYmxlRmtOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCisgICAgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRwbENhdGVnb3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cGxDYXRlZ29yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcGxDYXRlZ29yeShTdHJpbmcgdHBsQ2F0ZWdvcnkpCisgICAgeworICAgICAgICB0aGlzLnRwbENhdGVnb3J5ID0gdHBsQ2F0ZWdvcnk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUcGxXZWJUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cGxXZWJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRwbFdlYlR5cGUoU3RyaW5nIHRwbFdlYlR5cGUpCisgICAgeworICAgICAgICB0aGlzLnRwbFdlYlR5cGUgPSB0cGxXZWJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmcgbW9kdWxlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCdXNpbmVzc05hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1c2luZXNzTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc05hbWUoU3RyaW5nIGJ1c2luZXNzTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuYnVzaW5lc3NOYW1lID0gYnVzaW5lc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnVuY3Rpb25OYW1lKFN0cmluZyBmdW5jdGlvbk5hbWUpCisgICAgeworICAgICAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uQXV0aG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbkF1dGhvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbkF1dGhvcihTdHJpbmcgZnVuY3Rpb25BdXRob3IpCisgICAgeworICAgICAgICB0aGlzLmZ1bmN0aW9uQXV0aG9yID0gZnVuY3Rpb25BdXRob3I7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHZW5UeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5UeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdlblR5cGUoU3RyaW5nIGdlblR5cGUpCisgICAgeworICAgICAgICB0aGlzLmdlblR5cGUgPSBnZW5UeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2VuUGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5QYXRoKFN0cmluZyBnZW5QYXRoKQorICAgIHsKKyAgICAgICAgdGhpcy5nZW5QYXRoID0gZ2VuUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgR2VuVGFibGVDb2x1bW4gZ2V0UGtDb2x1bW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBrQ29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBrQ29sdW1uKEdlblRhYmxlQ29sdW1uIHBrQ29sdW1uKQorICAgIHsKKyAgICAgICAgdGhpcy5wa0NvbHVtbiA9IHBrQ29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyBHZW5UYWJsZSBnZXRTdWJUYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3ViVGFibGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3ViVGFibGUoR2VuVGFibGUgc3ViVGFibGUpCisgICAgeworICAgICAgICB0aGlzLnN1YlRhYmxlID0gc3ViVGFibGU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8R2VuVGFibGVDb2x1bW4+IGdldENvbHVtbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhMaXN0PEdlblRhYmxlQ29sdW1uPiBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhTdHJpbmcgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHJlZUNvZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJlZUNvZGUoU3RyaW5nIHRyZWVDb2RlKQorICAgIHsKKyAgICAgICAgdGhpcy50cmVlQ29kZSA9IHRyZWVDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZVBhcmVudENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyZWVQYXJlbnRDb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyZWVQYXJlbnRDb2RlKFN0cmluZyB0cmVlUGFyZW50Q29kZSkKKyAgICB7CisgICAgICAgIHRoaXMudHJlZVBhcmVudENvZGUgPSB0cmVlUGFyZW50Q29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cmVlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmVlTmFtZShTdHJpbmcgdHJlZU5hbWUpCisgICAgeworICAgICAgICB0aGlzLnRyZWVOYW1lID0gdHJlZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRNZW51SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudE1lbnVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRNZW51SWQoU3RyaW5nIHBhcmVudE1lbnVJZCkKKyAgICB7CisgICAgICAgIHRoaXMucGFyZW50TWVudUlkID0gcGFyZW50TWVudUlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TWVudU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudE1lbnVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE1lbnVOYW1lKFN0cmluZyBwYXJlbnRNZW51TmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMucGFyZW50TWVudU5hbWUgPSBwYXJlbnRNZW51TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YigpCisgICAgeworICAgICAgICByZXR1cm4gaXNTdWIodGhpcy50cGxDYXRlZ29yeSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ViKFN0cmluZyB0cGxDYXRlZ29yeSkKKyAgICB7CisgICAgICAgIHJldHVybiB0cGxDYXRlZ29yeSAhPSBudWxsICYmIFN0cmluZ1V0aWxzLmVxdWFscyhHZW5Db25zdGFudHMuVFBMX1NVQiwgdHBsQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJlZSgpCisgICAgeworICAgICAgICByZXR1cm4gaXNUcmVlKHRoaXMudHBsQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyZWUoU3RyaW5nIHRwbENhdGVnb3J5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRwbENhdGVnb3J5ICE9IG51bGwgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKEdlbkNvbnN0YW50cy5UUExfVFJFRSwgdHBsQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ3J1ZCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNDcnVkKHRoaXMudHBsQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NydWQoU3RyaW5nIHRwbENhdGVnb3J5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRwbENhdGVnb3J5ICE9IG51bGwgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKEdlbkNvbnN0YW50cy5UUExfQ1JVRCwgdHBsQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3VwZXJDb2x1bW4oU3RyaW5nIGphdmFGaWVsZCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1N1cGVyQ29sdW1uKHRoaXMudHBsQ2F0ZWdvcnksIGphdmFGaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwZXJDb2x1bW4oU3RyaW5nIHRwbENhdGVnb3J5LCBTdHJpbmcgamF2YUZpZWxkKQorICAgIHsKKyAgICAgICAgaWYgKGlzVHJlZSh0cGxDYXRlZ29yeSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5lcXVhbHNBbnlJZ25vcmVDYXNlKGphdmFGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5hZGRBbGwoR2VuQ29uc3RhbnRzLlRSRUVfRU5USVRZLCBHZW5Db25zdGFudHMuQkFTRV9FTlRJVFkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuZXF1YWxzQW55SWdub3JlQ2FzZShqYXZhRmllbGQsIEdlbkNvbnN0YW50cy5CQVNFX0VOVElUWSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvZG9tYWluL0dlblRhYmxlQ29sdW1uLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2RvbWFpbi9HZW5UYWJsZUNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzZkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL2RvbWFpbi9HZW5UYWJsZUNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsMzczIEBACitwYWNrYWdlIGNvbS5ydW95aS5nZW5lcmF0b3IuZG9tYWluOworCitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOS7o+eggeeUn+aIkOS4muWKoeWtl+auteihqCBnZW5fdGFibGVfY29sdW1uCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIEdlblRhYmxlQ29sdW1uIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOe8luWPtyAqLworICAgIHByaXZhdGUgTG9uZyBjb2x1bW5JZDsKKworICAgIC8qKiDlvZLlsZ7ooajnvJblj7cgKi8KKyAgICBwcml2YXRlIExvbmcgdGFibGVJZDsKKworICAgIC8qKiDliJflkI3np7AgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb2x1bW5OYW1lOworCisgICAgLyoqIOWIl+aPj+i/sCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbHVtbkNvbW1lbnQ7CisKKyAgICAvKiog5YiX57G75Z6LICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29sdW1uVHlwZTsKKworICAgIC8qKiBKQVZB57G75Z6LICovCisgICAgcHJpdmF0ZSBTdHJpbmcgamF2YVR5cGU7CisKKyAgICAvKiogSkFWQeWtl+auteWQjSAqLworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIkphdmHlsZ7mgKfkuI3og73kuLrnqboiKQorICAgIHByaXZhdGUgU3RyaW5nIGphdmFGaWVsZDsKKworICAgIC8qKiDmmK/lkKbkuLvplK7vvIgx5piv77yJICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaXNQazsKKworICAgIC8qKiDmmK/lkKboh6rlop7vvIgx5piv77yJICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaXNJbmNyZW1lbnQ7CisKKyAgICAvKiog5piv5ZCm5b+F5aGr77yIMeaYr++8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGlzUmVxdWlyZWQ7CisKKyAgICAvKiog5piv5ZCm5Li65o+S5YWl5a2X5q6177yIMeaYr++8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGlzSW5zZXJ0OworCisgICAgLyoqIOaYr+WQpue8lui+keWtl+aute+8iDHmmK/vvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpc0VkaXQ7CisKKyAgICAvKiog5piv5ZCm5YiX6KGo5a2X5q6177yIMeaYr++8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGlzTGlzdDsKKworICAgIC8qKiDmmK/lkKbmn6Xor6LlrZfmrrXvvIgx5piv77yJICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaXNRdWVyeTsKKworICAgIC8qKiDmn6Xor6LmlrnlvI/vvIhFUeetieS6juOAgU5F5LiN562J5LqO44CBR1TlpKfkuo7jgIFMVOWwj+S6juOAgUxJS0XmqKHns4rjgIFCRVRXRUVO6IyD5Zu077yJICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlUeXBlOworCisgICAgLyoqIOaYvuekuuexu+Wei++8iGlucHV05paH5pys5qGG44CBdGV4dGFyZWHmlofmnKzln5/jgIFzZWxlY3TkuIvmi4nmoYbjgIFjaGVja2JveOWkjemAieahhuOAgXJhZGlv5Y2V6YCJ5qGG44CBZGF0ZXRpbWXml6XmnJ/mjqfku7bjgIFpbWFnZeWbvueJh+S4iuS8oOaOp+S7tuOAgXVwbG9hZOaWh+S7tuS4iuS8oOaOp+S7tuOAgWVkaXRvcuWvjOaWh+acrOaOp+S7tu+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIGh0bWxUeXBlOworCisgICAgLyoqIOWtl+WFuOexu+WeiyAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpY3RUeXBlOworCisgICAgLyoqIOaOkuW6jyAqLworICAgIHByaXZhdGUgSW50ZWdlciBzb3J0OworCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSWQoTG9uZyBjb2x1bW5JZCkKKyAgICB7CisgICAgICAgIHRoaXMuY29sdW1uSWQgPSBjb2x1bW5JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRDb2x1bW5JZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1uSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFibGVJZChMb25nIHRhYmxlSWQpCisgICAgeworICAgICAgICB0aGlzLnRhYmxlSWQgPSB0YWJsZUlkOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldFRhYmxlSWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuY29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5OYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkNvbW1lbnQoU3RyaW5nIGNvbHVtbkNvbW1lbnQpCisgICAgeworICAgICAgICB0aGlzLmNvbHVtbkNvbW1lbnQgPSBjb2x1bW5Db21tZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uQ29tbWVudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29sdW1uQ29tbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5UeXBlKFN0cmluZyBjb2x1bW5UeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5jb2x1bW5UeXBlID0gY29sdW1uVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtblR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SmF2YVR5cGUoU3RyaW5nIGphdmFUeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGphdmFUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEphdmFGaWVsZChTdHJpbmcgamF2YUZpZWxkKQorICAgIHsKKyAgICAgICAgdGhpcy5qYXZhRmllbGQgPSBqYXZhRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRmllbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGphdmFGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENhcEphdmFGaWVsZCgpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShqYXZhRmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzUGsoU3RyaW5nIGlzUGspCisgICAgeworICAgICAgICB0aGlzLmlzUGsgPSBpc1BrOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNQaygpCisgICAgeworICAgICAgICByZXR1cm4gaXNQazsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1BrKHRoaXMuaXNQayk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQayhTdHJpbmcgaXNQaykKKyAgICB7CisgICAgICAgIHJldHVybiBpc1BrICE9IG51bGwgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKCIxIiwgaXNQayk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc0luY3JlbWVudCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNJbmNyZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNJbmNyZW1lbnQoU3RyaW5nIGlzSW5jcmVtZW50KQorICAgIHsKKyAgICAgICAgdGhpcy5pc0luY3JlbWVudCA9IGlzSW5jcmVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5jcmVtZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0luY3JlbWVudCh0aGlzLmlzSW5jcmVtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudChTdHJpbmcgaXNJbmNyZW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gaXNJbmNyZW1lbnQgIT0gbnVsbCAmJiBTdHJpbmdVdGlscy5lcXVhbHMoIjEiLCBpc0luY3JlbWVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNSZXF1aXJlZChTdHJpbmcgaXNSZXF1aXJlZCkKKyAgICB7CisgICAgICAgIHRoaXMuaXNSZXF1aXJlZCA9IGlzUmVxdWlyZWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1JlcXVpcmVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQodGhpcy5pc1JlcXVpcmVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKFN0cmluZyBpc1JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQgIT0gbnVsbCAmJiBTdHJpbmdVdGlscy5lcXVhbHMoIjEiLCBpc1JlcXVpcmVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0luc2VydChTdHJpbmcgaXNJbnNlcnQpCisgICAgeworICAgICAgICB0aGlzLmlzSW5zZXJ0ID0gaXNJbnNlcnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc0luc2VydCgpCisgICAgeworICAgICAgICByZXR1cm4gaXNJbnNlcnQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnNlcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzSW5zZXJ0KHRoaXMuaXNJbnNlcnQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5zZXJ0KFN0cmluZyBpc0luc2VydCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0luc2VydCAhPSBudWxsICYmIFN0cmluZ1V0aWxzLmVxdWFscygiMSIsIGlzSW5zZXJ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0VkaXQoU3RyaW5nIGlzRWRpdCkKKyAgICB7CisgICAgICAgIHRoaXMuaXNFZGl0ID0gaXNFZGl0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNFZGl0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VkaXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0luc2VydCh0aGlzLmlzRWRpdCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0KFN0cmluZyBpc0VkaXQpCisgICAgeworICAgICAgICByZXR1cm4gaXNFZGl0ICE9IG51bGwgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKCIxIiwgaXNFZGl0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0xpc3QoU3RyaW5nIGlzTGlzdCkKKyAgICB7CisgICAgICAgIHRoaXMuaXNMaXN0ID0gaXNMaXN0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNMaXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0xpc3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMaXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0xpc3QodGhpcy5pc0xpc3QpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdChTdHJpbmcgaXNMaXN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzTGlzdCAhPSBudWxsICYmIFN0cmluZ1V0aWxzLmVxdWFscygiMSIsIGlzTGlzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNRdWVyeShTdHJpbmcgaXNRdWVyeSkKKyAgICB7CisgICAgICAgIHRoaXMuaXNRdWVyeSA9IGlzUXVlcnk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc1F1ZXJ5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1F1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUXVlcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzUXVlcnkodGhpcy5pc1F1ZXJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXJ5KFN0cmluZyBpc1F1ZXJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzUXVlcnkgIT0gbnVsbCAmJiBTdHJpbmdVdGlscy5lcXVhbHMoIjEiLCBpc1F1ZXJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVR5cGUoU3RyaW5nIHF1ZXJ5VHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMucXVlcnlUeXBlID0gcXVlcnlUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBxdWVyeVR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIdG1sVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gaHRtbFR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SHRtbFR5cGUoU3RyaW5nIGh0bWxUeXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5odG1sVHlwZSA9IGh0bWxUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpY3RUeXBlKFN0cmluZyBkaWN0VHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGljdFR5cGUgPSBkaWN0VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpY3RUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3J0KEludGVnZXIgc29ydCkKKyAgICB7CisgICAgICAgIHRoaXMuc29ydCA9IHNvcnQ7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0U29ydCgpCisgICAgeworICAgICAgICByZXR1cm4gc29ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQ29sdW1uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1N1cGVyQ29sdW1uKHRoaXMuamF2YUZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBlckNvbHVtbihTdHJpbmcgamF2YUZpZWxkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmVxdWFsc0FueUlnbm9yZUNhc2UoamF2YUZpZWxkLAorICAgICAgICAgICAgICAgIC8vIEJhc2VFbnRpdHkKKyAgICAgICAgICAgICAgICAiY3JlYXRlQnkiLCAiY3JlYXRlVGltZSIsICJ1cGRhdGVCeSIsICJ1cGRhdGVUaW1lIiwgInJlbWFyayIsCisgICAgICAgICAgICAgICAgLy8gVHJlZUVudGl0eQorICAgICAgICAgICAgICAgICJwYXJlbnROYW1lIiwgInBhcmVudElkIiwgIm9yZGVyTnVtIiwgImFuY2VzdG9ycyIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVXNhYmxlQ29sdW1uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1VzYWJsZUNvbHVtbihqYXZhRmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VzYWJsZUNvbHVtbihTdHJpbmcgamF2YUZpZWxkKQorICAgIHsKKyAgICAgICAgLy8gaXNTdXBlckNvbHVtbigp5Lit55qE5ZCN5Y2V55So5LqO6YG/5YWN55Sf5oiQ5aSa5L2ZRG9tYWlu5bGe5oCn77yM6Iul5p+Q5Lqb5bGe5oCn5Zyo55Sf5oiQ6aG16Z2i5pe26ZyA6KaB55So5Yiw5LiN6IO95b+955Wl77yM5YiZ5pS+5Zyo5q2k5aSE55m95ZCN5Y2VCisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5lcXVhbHNBbnlJZ25vcmVDYXNlKGphdmFGaWVsZCwgInBhcmVudElkIiwgIm9yZGVyTnVtIiwgInJlbWFyayIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVhZENvbnZlcnRlckV4cCgpCisgICAgeworICAgICAgICBTdHJpbmcgcmVtYXJrcyA9IFN0cmluZ1V0aWxzLnN1YnN0cmluZ0JldHdlZW4odGhpcy5jb2x1bW5Db21tZW50LCAi77yIIiwgIu+8iSIpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHJlbWFya3MpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHJlbWFya3Muc3BsaXQoIiAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3RhcnRTdHIgPSB2YWx1ZS5zdWJTZXF1ZW5jZSgwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFN0ciA9IHZhbHVlLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIiKS5hcHBlbmQoc3RhcnRTdHIpLmFwcGVuZCgiPSIpLmFwcGVuZChlbmRTdHIpLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi5kZWxldGVDaGFyQXQoc2IubGVuZ3RoKCkgLSAxKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uQ29tbWVudDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvbWFwcGVyL0dlblRhYmxlQ29sdW1uTWFwcGVyLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL21hcHBlci9HZW5UYWJsZUNvbHVtbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWUxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL21hcHBlci9HZW5UYWJsZUNvbHVtbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZUNvbHVtbjsKKworLyoqCisgKiDkuJrliqHlrZfmrrUg5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBHZW5UYWJsZUNvbHVtbk1hcHBlcgoreworICAgIC8qKgorICAgICAqIOagueaNruihqOWQjeensOafpeivouWIl+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCN56ewCisgICAgICogQHJldHVybiDliJfkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxHZW5UYWJsZUNvbHVtbj4gc2VsZWN0RGJUYWJsZUNvbHVtbnNCeU5hbWUoU3RyaW5nIHRhYmxlTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LkuJrliqHlrZfmrrXliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVJZCDkuJrliqHlrZfmrrXnvJblj7cKKyAgICAgKiBAcmV0dXJuIOS4muWKoeWtl+autembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEdlblRhYmxlQ29sdW1uPiBzZWxlY3RHZW5UYWJsZUNvbHVtbkxpc3RCeVRhYmxlSWQoTG9uZyB0YWJsZUlkKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS4muWKoeWtl+autQorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZUNvbHVtbiDkuJrliqHlrZfmrrXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0R2VuVGFibGVDb2x1bW4oR2VuVGFibGVDb2x1bW4gZ2VuVGFibGVDb2x1bW4pOworCisgICAgLyoqCisgICAgICog5L+u5pS55Lia5Yqh5a2X5q61CisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlQ29sdW1uIOS4muWKoeWtl+auteS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVHZW5UYWJsZUNvbHVtbihHZW5UYWJsZUNvbHVtbiBnZW5UYWJsZUNvbHVtbik7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTkuJrliqHlrZfmrrUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGVDb2x1bW5zIOWIl+aVsOaNrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVHZW5UYWJsZUNvbHVtbnMoTGlzdDxHZW5UYWJsZUNvbHVtbj4gZ2VuVGFibGVDb2x1bW5zKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOS4muWKoeWtl+autQorICAgICAqIAorICAgICAqIEBwYXJhbSBpZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlR2VuVGFibGVDb2x1bW5CeUlkcyhMb25nW10gaWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvbWFwcGVyL0dlblRhYmxlTWFwcGVyLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL21hcHBlci9HZW5UYWJsZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNzY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL21hcHBlci9HZW5UYWJsZU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZTsKKworLyoqCisgKiDkuJrliqEg5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBHZW5UYWJsZU1hcHBlcgoreworICAgIC8qKgorICAgICAqIOafpeivouS4muWKoeWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOS4muWKoembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEdlblRhYmxlPiBzZWxlY3RHZW5UYWJsZUxpc3QoR2VuVGFibGUgZ2VuVGFibGUpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5o2u5bqT5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlIOS4muWKoeS/oeaBrworICAgICAqIEByZXR1cm4g5pWw5o2u5bqT6KGo6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdERiVGFibGVMaXN0KEdlblRhYmxlIGdlblRhYmxlKTsKKworICAgIC8qKgorICAgICAqIOafpeivouaNruW6k+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIOihqOWQjeensOe7hAorICAgICAqIEByZXR1cm4g5pWw5o2u5bqT6KGo6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdERiVGFibGVMaXN0QnlOYW1lcyhTdHJpbmdbXSB0YWJsZU5hbWVzKTsKKworICAgIC8qKgorICAgICAqIOafpeivouaJgOacieihqOS/oeaBrworICAgICAqIAorICAgICAqIEByZXR1cm4g6KGo5L+h5oGv6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdEdlblRhYmxlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LooahJROS4muWKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBpZCDkuJrliqFJRAorICAgICAqIEByZXR1cm4g5Lia5Yqh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIEdlblRhYmxlIHNlbGVjdEdlblRhYmxlQnlJZChMb25nIGlkKTsKKworICAgIC8qKgorICAgICAqIOafpeivouihqOWQjeensOS4muWKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCN56ewCisgICAgICogQHJldHVybiDkuJrliqHkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuVGFibGUgc2VsZWN0R2VuVGFibGVCeU5hbWUoU3RyaW5nIHRhYmxlTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7kuJrliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydEdlblRhYmxlKEdlblRhYmxlIGdlblRhYmxlKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueS4muWKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlR2VuVGFibGUoR2VuVGFibGUgZ2VuVGFibGUpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk5Lia5YqhCisgICAgICogCisgICAgICogQHBhcmFtIGlkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVHZW5UYWJsZUJ5SWRzKExvbmdbXSBpZHMpOworCisgICAgLyoqCisgICAgICog5Yib5bu66KGoCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3FsIOihqOe7k+aehAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBjcmVhdGVUYWJsZShTdHJpbmcgc3FsKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3Ivc2VydmljZS9HZW5UYWJsZUNvbHVtblNlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvR2VuVGFibGVDb2x1bW5TZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Nzk2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvR2VuVGFibGVDb2x1bW5TZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS50ZXh0LkNvbnZlcnQ7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGVDb2x1bW47CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXIuR2VuVGFibGVDb2x1bW5NYXBwZXI7CisKKy8qKgorICog5Lia5Yqh5a2X5q61IOacjeWKoeWxguWunueOsAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgR2VuVGFibGVDb2x1bW5TZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElHZW5UYWJsZUNvbHVtblNlcnZpY2UgCit7CisJQEF1dG93aXJlZAorCXByaXZhdGUgR2VuVGFibGVDb2x1bW5NYXBwZXIgZ2VuVGFibGVDb2x1bW5NYXBwZXI7CisKKwkvKioKKyAgICAgKiDmn6Xor6LkuJrliqHlrZfmrrXliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVJZCDkuJrliqHlrZfmrrXnvJblj7cKKyAgICAgKiBAcmV0dXJuIOS4muWKoeWtl+autembhuWQiAorICAgICAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEdlblRhYmxlQ29sdW1uPiBzZWxlY3RHZW5UYWJsZUNvbHVtbkxpc3RCeVRhYmxlSWQoTG9uZyB0YWJsZUlkKQorCXsKKwkgICAgcmV0dXJuIGdlblRhYmxlQ29sdW1uTWFwcGVyLnNlbGVjdEdlblRhYmxlQ29sdW1uTGlzdEJ5VGFibGVJZCh0YWJsZUlkKTsKKwl9CisJCisgICAgLyoqCisgICAgICog5paw5aKe5Lia5Yqh5a2X5q61CisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlQ29sdW1uIOS4muWKoeWtl+auteS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBpbnNlcnRHZW5UYWJsZUNvbHVtbihHZW5UYWJsZUNvbHVtbiBnZW5UYWJsZUNvbHVtbikKKwl7CisJICAgIHJldHVybiBnZW5UYWJsZUNvbHVtbk1hcHBlci5pbnNlcnRHZW5UYWJsZUNvbHVtbihnZW5UYWJsZUNvbHVtbik7CisJfQorCQorCS8qKgorICAgICAqIOS/ruaUueS4muWKoeWtl+autQorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZUNvbHVtbiDkuJrliqHlrZfmrrXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgdXBkYXRlR2VuVGFibGVDb2x1bW4oR2VuVGFibGVDb2x1bW4gZ2VuVGFibGVDb2x1bW4pCisJeworCSAgICByZXR1cm4gZ2VuVGFibGVDb2x1bW5NYXBwZXIudXBkYXRlR2VuVGFibGVDb2x1bW4oZ2VuVGFibGVDb2x1bW4pOworCX0KKworCS8qKgorICAgICAqIOWIoOmZpOS4muWKoeWtl+auteWvueixoQorICAgICAqIAorICAgICAqIEBwYXJhbSBpZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZGVsZXRlR2VuVGFibGVDb2x1bW5CeUlkcyhTdHJpbmcgaWRzKQorCXsKKwkJcmV0dXJuIGdlblRhYmxlQ29sdW1uTWFwcGVyLmRlbGV0ZUdlblRhYmxlQ29sdW1uQnlJZHMoQ29udmVydC50b0xvbmdBcnJheShpZHMpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvR2VuVGFibGVTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci9zZXJ2aWNlL0dlblRhYmxlU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmI2MzgzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci9zZXJ2aWNlL0dlblRhYmxlU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDUzMSBAQAorcGFja2FnZSBjb20ucnVveWkuZ2VuZXJhdG9yLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5hbm5vdGF0aW9uLlRyYW5zYWN0aW9uYWw7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT047CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05PYmplY3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5HZW5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnRleHQuQ2hhcnNldEtpdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5TZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGU7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGVDb2x1bW47CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXIuR2VuVGFibGVDb2x1bW5NYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXIuR2VuVGFibGVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci51dGlsLkdlblV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5nZW5lcmF0b3IudXRpbC5WZWxvY2l0eUluaXRpYWxpemVyOworaW1wb3J0IGNvbS5ydW95aS5nZW5lcmF0b3IudXRpbC5WZWxvY2l0eVV0aWxzOworCisvKioKKyAqIOS4muWKoSDmnI3liqHlsYLlrp7njrAKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIEdlblRhYmxlU2VydmljZUltcGwgaW1wbGVtZW50cyBJR2VuVGFibGVTZXJ2aWNlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdlblRhYmxlU2VydmljZUltcGwuY2xhc3MpOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgR2VuVGFibGVNYXBwZXIgZ2VuVGFibGVNYXBwZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBHZW5UYWJsZUNvbHVtbk1hcHBlciBnZW5UYWJsZUNvbHVtbk1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOafpeivouS4muWKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBpZCDkuJrliqFJRAorICAgICAqIEByZXR1cm4g5Lia5Yqh5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdlblRhYmxlIHNlbGVjdEdlblRhYmxlQnlJZChMb25nIGlkKQorICAgIHsKKyAgICAgICAgR2VuVGFibGUgZ2VuVGFibGUgPSBnZW5UYWJsZU1hcHBlci5zZWxlY3RHZW5UYWJsZUJ5SWQoaWQpOworICAgICAgICBzZXRUYWJsZUZyb21PcHRpb25zKGdlblRhYmxlKTsKKyAgICAgICAgcmV0dXJuIGdlblRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouS4muWKoeWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOS4muWKoembhuWQiAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEdlblRhYmxlPiBzZWxlY3RHZW5UYWJsZUxpc3QoR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuVGFibGVNYXBwZXIuc2VsZWN0R2VuVGFibGVMaXN0KGdlblRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lmja7lupPliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICogQHJldHVybiDmlbDmja7lupPooajpm4blkIgKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxHZW5UYWJsZT4gc2VsZWN0RGJUYWJsZUxpc3QoR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuVGFibGVNYXBwZXIuc2VsZWN0RGJUYWJsZUxpc3QoZ2VuVGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouaNruW6k+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIOihqOWQjeensOe7hAorICAgICAqIEByZXR1cm4g5pWw5o2u5bqT6KGo6ZuG5ZCICisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdERiVGFibGVMaXN0QnlOYW1lcyhTdHJpbmdbXSB0YWJsZU5hbWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlblRhYmxlTWFwcGVyLnNlbGVjdERiVGFibGVMaXN0QnlOYW1lcyh0YWJsZU5hbWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LmiYDmnInooajkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOihqOS/oeaBr+mbhuWQiAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEdlblRhYmxlPiBzZWxlY3RHZW5UYWJsZUFsbCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuVGFibGVNYXBwZXIuc2VsZWN0R2VuVGFibGVBbGwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkuJrliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUdlblRhYmxlKEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG9wdGlvbnMgPSBKU09OLnRvSlNPTlN0cmluZyhnZW5UYWJsZS5nZXRQYXJhbXMoKSk7CisgICAgICAgIGdlblRhYmxlLnNldE9wdGlvbnMob3B0aW9ucyk7CisgICAgICAgIGludCByb3cgPSBnZW5UYWJsZU1hcHBlci51cGRhdGVHZW5UYWJsZShnZW5UYWJsZSk7CisgICAgICAgIGlmIChyb3cgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEdlblRhYmxlQ29sdW1uIGNlblRhYmxlQ29sdW1uIDogZ2VuVGFibGUuZ2V0Q29sdW1ucygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlblRhYmxlQ29sdW1uTWFwcGVyLnVwZGF0ZUdlblRhYmxlQ29sdW1uKGNlblRhYmxlQ29sdW1uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOS4muWKoeWvueixoQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZUlkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVHZW5UYWJsZUJ5SWRzKExvbmdbXSB0YWJsZUlkcykKKyAgICB7CisgICAgICAgIGdlblRhYmxlTWFwcGVyLmRlbGV0ZUdlblRhYmxlQnlJZHModGFibGVJZHMpOworICAgICAgICBnZW5UYWJsZUNvbHVtbk1hcHBlci5kZWxldGVHZW5UYWJsZUNvbHVtbkJ5SWRzKHRhYmxlSWRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliJvlu7rooagKKyAgICAgKgorICAgICAqIEBwYXJhbSBzcWwg5Yib5bu66KGo6K+t5Y+lCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVUYWJsZShTdHJpbmcgc3FsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlblRhYmxlTWFwcGVyLmNyZWF0ZVRhYmxlKHNxbCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7zlhaXooajnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVMaXN0IOWvvOWFpeihqOWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIHZvaWQgaW1wb3J0R2VuVGFibGUoTGlzdDxHZW5UYWJsZT4gdGFibGVMaXN0LCBTdHJpbmcgb3Blck5hbWUpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChHZW5UYWJsZSB0YWJsZSA6IHRhYmxlTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gdGFibGUuZ2V0VGFibGVOYW1lKCk7CisgICAgICAgICAgICAgICAgR2VuVXRpbHMuaW5pdFRhYmxlKHRhYmxlLCBvcGVyTmFtZSk7CisgICAgICAgICAgICAgICAgaW50IHJvdyA9IGdlblRhYmxlTWFwcGVyLmluc2VydEdlblRhYmxlKHRhYmxlKTsKKyAgICAgICAgICAgICAgICBpZiAocm93ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOWIl+S/oeaBrworICAgICAgICAgICAgICAgICAgICBMaXN0PEdlblRhYmxlQ29sdW1uPiBnZW5UYWJsZUNvbHVtbnMgPSBnZW5UYWJsZUNvbHVtbk1hcHBlci5zZWxlY3REYlRhYmxlQ29sdW1uc0J5TmFtZSh0YWJsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEdlblRhYmxlQ29sdW1uIGNvbHVtbiA6IGdlblRhYmxlQ29sdW1ucykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2VuVXRpbHMuaW5pdENvbHVtbkZpZWxkKGNvbHVtbiwgdGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuVGFibGVDb2x1bW5NYXBwZXIuaW5zZXJ0R2VuVGFibGVDb2x1bW4oY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLlr7zlhaXlpLHotKXvvJoiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6aKE6KeI5Luj56CBCisgICAgICogCisgICAgICogQHBhcmFtIHRhYmxlSWQg6KGo57yW5Y+3CisgICAgICogQHJldHVybiDpooTop4jmlbDmja7liJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBwcmV2aWV3Q29kZShMb25nIHRhYmxlSWQpCisgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGRhdGFNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisgICAgICAgIC8vIOafpeivouihqOS/oeaBrworICAgICAgICBHZW5UYWJsZSB0YWJsZSA9IGdlblRhYmxlTWFwcGVyLnNlbGVjdEdlblRhYmxlQnlJZCh0YWJsZUlkKTsKKyAgICAgICAgLy8g6K6+572u5Li75a2Q6KGo5L+h5oGvCisgICAgICAgIHNldFN1YlRhYmxlKHRhYmxlKTsKKyAgICAgICAgLy8g6K6+572u5Li76ZSu5YiX5L+h5oGvCisgICAgICAgIHNldFBrQ29sdW1uKHRhYmxlKTsKKyAgICAgICAgVmVsb2NpdHlJbml0aWFsaXplci5pbml0VmVsb2NpdHkoKTsKKworICAgICAgICBWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IFZlbG9jaXR5VXRpbHMucHJlcGFyZUNvbnRleHQodGFibGUpOworCisgICAgICAgIC8vIOiOt+WPluaooeadv+WIl+ihqAorICAgICAgICBMaXN0PFN0cmluZz4gdGVtcGxhdGVzID0gVmVsb2NpdHlVdGlscy5nZXRUZW1wbGF0ZUxpc3QodGFibGUuZ2V0VHBsQ2F0ZWdvcnkoKSwgdGFibGUuZ2V0VHBsV2ViVHlwZSgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdGVtcGxhdGUgOiB0ZW1wbGF0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOa4suafk+aooeadvworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgVGVtcGxhdGUgdHBsID0gVmVsb2NpdHkuZ2V0VGVtcGxhdGUodGVtcGxhdGUsIENvbnN0YW50cy5VVEY4KTsKKyAgICAgICAgICAgIHRwbC5tZXJnZShjb250ZXh0LCBzdyk7CisgICAgICAgICAgICBkYXRhTWFwLnB1dCh0ZW1wbGF0ZSwgc3cudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFNYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICog55Sf5oiQ5Luj56CB77yI5LiL6L295pa55byP77yJCisgICAgICogCisgICAgICogQHBhcmFtIHRhYmxlTmFtZSDooajlkI3np7AKKyAgICAgKiBAcmV0dXJuIOaVsOaNrgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZG93bmxvYWRDb2RlKFN0cmluZyB0YWJsZU5hbWUpCisgICAgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBaaXBPdXRwdXRTdHJlYW0gemlwID0gbmV3IFppcE91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgICAgICBnZW5lcmF0b3JDb2RlKHRhYmxlTmFtZSwgemlwKTsKKyAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoemlwKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOeUn+aIkOS7o+egge+8iOiHquWumuS5iei3r+W+hO+8iQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCN56ewCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdG9yQ29kZShTdHJpbmcgdGFibGVOYW1lKQorICAgIHsKKyAgICAgICAgLy8g5p+l6K+i6KGo5L+h5oGvCisgICAgICAgIEdlblRhYmxlIHRhYmxlID0gZ2VuVGFibGVNYXBwZXIuc2VsZWN0R2VuVGFibGVCeU5hbWUodGFibGVOYW1lKTsKKyAgICAgICAgLy8g6K6+572u5Li75a2Q6KGo5L+h5oGvCisgICAgICAgIHNldFN1YlRhYmxlKHRhYmxlKTsKKyAgICAgICAgLy8g6K6+572u5Li76ZSu5YiX5L+h5oGvCisgICAgICAgIHNldFBrQ29sdW1uKHRhYmxlKTsKKworICAgICAgICBWZWxvY2l0eUluaXRpYWxpemVyLmluaXRWZWxvY2l0eSgpOworCisgICAgICAgIFZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gVmVsb2NpdHlVdGlscy5wcmVwYXJlQ29udGV4dCh0YWJsZSk7CisKKyAgICAgICAgLy8g6I635Y+W5qih5p2/5YiX6KGoCisgICAgICAgIExpc3Q8U3RyaW5nPiB0ZW1wbGF0ZXMgPSBWZWxvY2l0eVV0aWxzLmdldFRlbXBsYXRlTGlzdCh0YWJsZS5nZXRUcGxDYXRlZ29yeSgpLCB0YWJsZS5nZXRUcGxXZWJUeXBlKCkpOworICAgICAgICBmb3IgKFN0cmluZyB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFTdHJpbmdVdGlscy5jb250YWluc0FueSh0ZW1wbGF0ZSwgInNxbC52bSIsICJhcGkuanMudm0iLCAiaW5kZXgudnVlLnZtIiwgImluZGV4LXRyZWUudnVlLnZtIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g5riy5p+T5qih5p2/CisgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgIFRlbXBsYXRlIHRwbCA9IFZlbG9jaXR5LmdldFRlbXBsYXRlKHRlbXBsYXRlLCBDb25zdGFudHMuVVRGOCk7CisgICAgICAgICAgICAgICAgdHBsLm1lcmdlKGNvbnRleHQsIHN3KTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0R2VuUGF0aCh0YWJsZSwgdGVtcGxhdGUpOworICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMud3JpdGVTdHJpbmdUb0ZpbGUobmV3IEZpbGUocGF0aCksIHN3LnRvU3RyaW5nKCksIENoYXJzZXRLaXQuVVRGXzgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLmuLLmn5PmqKHmnb/lpLHotKXvvIzooajlkI3vvJoiICsgdGFibGUuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWQjOatpeaVsOaNruW6kworICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCN56ewCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwKKyAgICBwdWJsaWMgdm9pZCBzeW5jaERiKFN0cmluZyB0YWJsZU5hbWUpCisgICAgeworICAgICAgICBHZW5UYWJsZSB0YWJsZSA9IGdlblRhYmxlTWFwcGVyLnNlbGVjdEdlblRhYmxlQnlOYW1lKHRhYmxlTmFtZSk7CisgICAgICAgIExpc3Q8R2VuVGFibGVDb2x1bW4+IHRhYmxlQ29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgTWFwPFN0cmluZywgR2VuVGFibGVDb2x1bW4+IHRhYmxlQ29sdW1uTWFwID0gdGFibGVDb2x1bW5zLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChHZW5UYWJsZUNvbHVtbjo6Z2V0Q29sdW1uTmFtZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworCisgICAgICAgIExpc3Q8R2VuVGFibGVDb2x1bW4+IGRiVGFibGVDb2x1bW5zID0gZ2VuVGFibGVDb2x1bW5NYXBwZXIuc2VsZWN0RGJUYWJsZUNvbHVtbnNCeU5hbWUodGFibGVOYW1lKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZGJUYWJsZUNvbHVtbnMpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbigi5ZCM5q2l5pWw5o2u5aSx6LSl77yM5Y6f6KGo57uT5p6E5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxTdHJpbmc+IGRiVGFibGVDb2x1bW5OYW1lcyA9IGRiVGFibGVDb2x1bW5zLnN0cmVhbSgpLm1hcChHZW5UYWJsZUNvbHVtbjo6Z2V0Q29sdW1uTmFtZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBkYlRhYmxlQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiAtPiB7CisgICAgICAgICAgICBHZW5VdGlscy5pbml0Q29sdW1uRmllbGQoY29sdW1uLCB0YWJsZSk7CisgICAgICAgICAgICBpZiAodGFibGVDb2x1bW5NYXAuY29udGFpbnNLZXkoY29sdW1uLmdldENvbHVtbk5hbWUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2VuVGFibGVDb2x1bW4gcHJldkNvbHVtbiA9IHRhYmxlQ29sdW1uTWFwLmdldChjb2x1bW4uZ2V0Q29sdW1uTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb2x1bW4uc2V0Q29sdW1uSWQocHJldkNvbHVtbi5nZXRDb2x1bW5JZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzTGlzdCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5piv5YiX6KGo77yM57un57ut5L+d55WZ5p+l6K+i5pa55byPL+Wtl+WFuOexu+Wei+mAiemhuQorICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2V0RGljdFR5cGUocHJldkNvbHVtbi5nZXREaWN0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldFF1ZXJ5VHlwZShwcmV2Q29sdW1uLmdldFF1ZXJ5VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkocHJldkNvbHVtbi5nZXRJc1JlcXVpcmVkKCkpICYmICFjb2x1bW4uaXNQaygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmlzSW5zZXJ0KCkgfHwgY29sdW1uLmlzRWRpdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChjb2x1bW4uaXNVc2FibGVDb2x1bW4oKSkgfHwgKCFjb2x1bW4uaXNTdXBlckNvbHVtbigpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzmmK8o5paw5aKeL+S/ruaUuSbpnZ7kuLvplK4v6Z2e5b+955Wl5Y+K54i25bGe5oCnKe+8jOe7p+e7reS/neeVmeW/heWhqy/mmL7npLrnsbvlnovpgInpobkKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldElzUmVxdWlyZWQocHJldkNvbHVtbi5nZXRJc1JlcXVpcmVkKCkpOworICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2V0SHRtbFR5cGUocHJldkNvbHVtbi5nZXRIdG1sVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuVGFibGVDb2x1bW5NYXBwZXIudXBkYXRlR2VuVGFibGVDb2x1bW4oY29sdW1uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5UYWJsZUNvbHVtbk1hcHBlci5pbnNlcnRHZW5UYWJsZUNvbHVtbihjb2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBMaXN0PEdlblRhYmxlQ29sdW1uPiBkZWxDb2x1bW5zID0gdGFibGVDb2x1bW5zLnN0cmVhbSgpLmZpbHRlcihjb2x1bW4gLT4gIWRiVGFibGVDb2x1bW5OYW1lcy5jb250YWlucyhjb2x1bW4uZ2V0Q29sdW1uTmFtZSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZGVsQ29sdW1ucykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlblRhYmxlQ29sdW1uTWFwcGVyLmRlbGV0ZUdlblRhYmxlQ29sdW1ucyhkZWxDb2x1bW5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+eUn+aIkOS7o+egge+8iOS4i+i9veaWueW8j++8iQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIOihqOaVsOe7hAorICAgICAqIEByZXR1cm4g5pWw5o2uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBkb3dubG9hZENvZGUoU3RyaW5nW10gdGFibGVOYW1lcykKKyAgICB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFppcE91dHB1dFN0cmVhbSB6aXAgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSk7CisgICAgICAgIGZvciAoU3RyaW5nIHRhYmxlTmFtZSA6IHRhYmxlTmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbmVyYXRvckNvZGUodGFibGVOYW1lLCB6aXApOworICAgICAgICB9CisgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHppcCk7CisgICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Looajkv6Hmga/lubbnlJ/miJDku6PnoIEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdG9yQ29kZShTdHJpbmcgdGFibGVOYW1lLCBaaXBPdXRwdXRTdHJlYW0gemlwKQorICAgIHsKKyAgICAgICAgLy8g5p+l6K+i6KGo5L+h5oGvCisgICAgICAgIEdlblRhYmxlIHRhYmxlID0gZ2VuVGFibGVNYXBwZXIuc2VsZWN0R2VuVGFibGVCeU5hbWUodGFibGVOYW1lKTsKKyAgICAgICAgLy8g6K6+572u5Li75a2Q6KGo5L+h5oGvCisgICAgICAgIHNldFN1YlRhYmxlKHRhYmxlKTsKKyAgICAgICAgLy8g6K6+572u5Li76ZSu5YiX5L+h5oGvCisgICAgICAgIHNldFBrQ29sdW1uKHRhYmxlKTsKKworICAgICAgICBWZWxvY2l0eUluaXRpYWxpemVyLmluaXRWZWxvY2l0eSgpOworCisgICAgICAgIFZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gVmVsb2NpdHlVdGlscy5wcmVwYXJlQ29udGV4dCh0YWJsZSk7CisKKyAgICAgICAgLy8g6I635Y+W5qih5p2/5YiX6KGoCisgICAgICAgIExpc3Q8U3RyaW5nPiB0ZW1wbGF0ZXMgPSBWZWxvY2l0eVV0aWxzLmdldFRlbXBsYXRlTGlzdCh0YWJsZS5nZXRUcGxDYXRlZ29yeSgpLCB0YWJsZS5nZXRUcGxXZWJUeXBlKCkpOworICAgICAgICBmb3IgKFN0cmluZyB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5riy5p+T5qih5p2/CisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICBUZW1wbGF0ZSB0cGwgPSBWZWxvY2l0eS5nZXRUZW1wbGF0ZSh0ZW1wbGF0ZSwgQ29uc3RhbnRzLlVURjgpOworICAgICAgICAgICAgdHBsLm1lcmdlKGNvbnRleHQsIHN3KTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIOa3u+WKoOWIsHppcAorICAgICAgICAgICAgICAgIHppcC5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KFZlbG9jaXR5VXRpbHMuZ2V0RmlsZU5hbWUodGVtcGxhdGUsIHRhYmxlKSkpOworICAgICAgICAgICAgICAgIElPVXRpbHMud3JpdGUoc3cudG9TdHJpbmcoKSwgemlwLCBDb25zdGFudHMuVVRGOCk7CisgICAgICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoc3cpOworICAgICAgICAgICAgICAgIHppcC5mbHVzaCgpOworICAgICAgICAgICAgICAgIHppcC5jbG9zZUVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIua4suafk+aooeadv+Wksei0pe+8jOihqOWQje+8miIgKyB0YWJsZS5nZXRUYWJsZU5hbWUoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjlj4LmlbDmoKHpqowKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVFZGl0KEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgaWYgKEdlbkNvbnN0YW50cy5UUExfVFJFRS5lcXVhbHMoZ2VuVGFibGUuZ2V0VHBsQ2F0ZWdvcnkoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBvcHRpb25zID0gSlNPTi50b0pTT05TdHJpbmcoZ2VuVGFibGUuZ2V0UGFyYW1zKCkpOworICAgICAgICAgICAgSlNPTk9iamVjdCBwYXJhbXNPYmogPSBKU09OLnBhcnNlT2JqZWN0KG9wdGlvbnMpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocGFyYW1zT2JqLmdldFN0cmluZyhHZW5Db25zdGFudHMuVFJFRV9DT0RFKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuagkee8lueggeWtl+auteS4jeiDveS4uuepuiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX1BBUkVOVF9DT0RFKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuagkeeItue8lueggeWtl+auteS4jeiDveS4uuepuiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX05BTUUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbigi5qCR5ZCN56ew5a2X5q615LiN6IO95Li656m6Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChHZW5Db25zdGFudHMuVFBMX1NVQi5lcXVhbHMoZ2VuVGFibGUuZ2V0VHBsQ2F0ZWdvcnkoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoZ2VuVGFibGUuZ2V0U3ViVGFibGVOYW1lKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuWFs+iBlOWtkOihqOeahOihqOWQjeS4jeiDveS4uuepuiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGdlblRhYmxlLmdldFN1YlRhYmxlRmtOYW1lKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuWtkOihqOWFs+iBlOeahOWklumUruWQjeS4jeiDveS4uuepuiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiuvue9ruS4u+mUruWIl+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZSDkuJrliqHooajkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQa0NvbHVtbihHZW5UYWJsZSB0YWJsZSkKKyAgICB7CisgICAgICAgIGZvciAoR2VuVGFibGVDb2x1bW4gY29sdW1uIDogdGFibGUuZ2V0Q29sdW1ucygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sdW1uLmlzUGsoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5zZXRQa0NvbHVtbihjb2x1bW4pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwodGFibGUuZ2V0UGtDb2x1bW4oKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhYmxlLnNldFBrQ29sdW1uKHRhYmxlLmdldENvbHVtbnMoKS5nZXQoMCkpOworICAgICAgICB9CisgICAgICAgIGlmIChHZW5Db25zdGFudHMuVFBMX1NVQi5lcXVhbHModGFibGUuZ2V0VHBsQ2F0ZWdvcnkoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoR2VuVGFibGVDb2x1bW4gY29sdW1uIDogdGFibGUuZ2V0U3ViVGFibGUoKS5nZXRDb2x1bW5zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5pc1BrKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YWJsZS5nZXRTdWJUYWJsZSgpLnNldFBrQ29sdW1uKGNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwodGFibGUuZ2V0U3ViVGFibGUoKS5nZXRQa0NvbHVtbigpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5nZXRTdWJUYWJsZSgpLnNldFBrQ29sdW1uKHRhYmxlLmdldFN1YlRhYmxlKCkuZ2V0Q29sdW1ucygpLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDorr7nva7kuLvlrZDooajkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGUg5Lia5Yqh6KGo5L+h5oGvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViVGFibGUoR2VuVGFibGUgdGFibGUpCisgICAgeworICAgICAgICBTdHJpbmcgc3ViVGFibGVOYW1lID0gdGFibGUuZ2V0U3ViVGFibGVOYW1lKCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHN1YlRhYmxlTmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhYmxlLnNldFN1YlRhYmxlKGdlblRhYmxlTWFwcGVyLnNlbGVjdEdlblRhYmxlQnlOYW1lKHN1YlRhYmxlTmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572u5Luj56CB55Sf5oiQ5YW25LuW6YCJ6aG55YC8CisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlIOiuvue9ruWQjueahOeUn+aIkOWvueixoQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlRnJvbU9wdGlvbnMoR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICBKU09OT2JqZWN0IHBhcmFtc09iaiA9IEpTT04ucGFyc2VPYmplY3QoZ2VuVGFibGUuZ2V0T3B0aW9ucygpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChwYXJhbXNPYmopKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdHJlZUNvZGUgPSBwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX0NPREUpOworICAgICAgICAgICAgU3RyaW5nIHRyZWVQYXJlbnRDb2RlID0gcGFyYW1zT2JqLmdldFN0cmluZyhHZW5Db25zdGFudHMuVFJFRV9QQVJFTlRfQ09ERSk7CisgICAgICAgICAgICBTdHJpbmcgdHJlZU5hbWUgPSBwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX05BTUUpOworICAgICAgICAgICAgU3RyaW5nIHBhcmVudE1lbnVJZCA9IHBhcmFtc09iai5nZXRTdHJpbmcoR2VuQ29uc3RhbnRzLlBBUkVOVF9NRU5VX0lEKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJlbnRNZW51TmFtZSA9IHBhcmFtc09iai5nZXRTdHJpbmcoR2VuQ29uc3RhbnRzLlBBUkVOVF9NRU5VX05BTUUpOworCisgICAgICAgICAgICBnZW5UYWJsZS5zZXRUcmVlQ29kZSh0cmVlQ29kZSk7CisgICAgICAgICAgICBnZW5UYWJsZS5zZXRUcmVlUGFyZW50Q29kZSh0cmVlUGFyZW50Q29kZSk7CisgICAgICAgICAgICBnZW5UYWJsZS5zZXRUcmVlTmFtZSh0cmVlTmFtZSk7CisgICAgICAgICAgICBnZW5UYWJsZS5zZXRQYXJlbnRNZW51SWQocGFyZW50TWVudUlkKTsKKyAgICAgICAgICAgIGdlblRhYmxlLnNldFBhcmVudE1lbnVOYW1lKHBhcmVudE1lbnVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluS7o+eggeeUn+aIkOWcsOWdgAorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZSDkuJrliqHooajkv6Hmga8KKyAgICAgKiBAcGFyYW0gdGVtcGxhdGUg5qih5p2/5paH5Lu26Lev5b6ECisgICAgICogQHJldHVybiDnlJ/miJDlnLDlnYAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHZW5QYXRoKEdlblRhYmxlIHRhYmxlLCBTdHJpbmcgdGVtcGxhdGUpCisgICAgeworICAgICAgICBTdHJpbmcgZ2VuUGF0aCA9IHRhYmxlLmdldEdlblBhdGgoKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhnZW5QYXRoLCAiLyIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjIiArIEZpbGUuc2VwYXJhdG9yICsgVmVsb2NpdHlVdGlscy5nZXRGaWxlTmFtZSh0ZW1wbGF0ZSwgdGFibGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZW5QYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBWZWxvY2l0eVV0aWxzLmdldEZpbGVOYW1lKHRlbXBsYXRlLCB0YWJsZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3Ivc2VydmljZS9JR2VuVGFibGVDb2x1bW5TZXJ2aWNlLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvSUdlblRhYmxlQ29sdW1uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzdmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvSUdlblRhYmxlQ29sdW1uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGVDb2x1bW47CisKKy8qKgorICog5Lia5Yqh5a2X5q61IOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUdlblRhYmxlQ29sdW1uU2VydmljZQoreworICAgIC8qKgorICAgICAqIOafpeivouS4muWKoeWtl+auteWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZUlkIOS4muWKoeWtl+autee8luWPtworICAgICAqIEByZXR1cm4g5Lia5Yqh5a2X5q616ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGVDb2x1bW4+IHNlbGVjdEdlblRhYmxlQ29sdW1uTGlzdEJ5VGFibGVJZChMb25nIHRhYmxlSWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe5Lia5Yqh5a2X5q61CisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlQ29sdW1uIOS4muWKoeWtl+auteS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRHZW5UYWJsZUNvbHVtbihHZW5UYWJsZUNvbHVtbiBnZW5UYWJsZUNvbHVtbik7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkuJrliqHlrZfmrrUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGVDb2x1bW4g5Lia5Yqh5a2X5q615L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZUdlblRhYmxlQ29sdW1uKEdlblRhYmxlQ29sdW1uIGdlblRhYmxlQ29sdW1uKTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOS4muWKoeWtl+auteS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBpZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlR2VuVGFibGVDb2x1bW5CeUlkcyhTdHJpbmcgaWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3Ivc2VydmljZS9JR2VuVGFibGVTZXJ2aWNlLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvSUdlblRhYmxlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTQyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3NlcnZpY2UvSUdlblRhYmxlU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIGNvbS5ydW95aS5nZW5lcmF0b3Iuc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGU7CisKKy8qKgorICog5Lia5YqhIOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUdlblRhYmxlU2VydmljZQoreworICAgIC8qKgorICAgICAqIOafpeivouS4muWKoeWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOS4muWKoembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEdlblRhYmxlPiBzZWxlY3RHZW5UYWJsZUxpc3QoR2VuVGFibGUgZ2VuVGFibGUpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5o2u5bqT5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIGdlblRhYmxlIOS4muWKoeS/oeaBrworICAgICAqIEByZXR1cm4g5pWw5o2u5bqT6KGo6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdERiVGFibGVMaXN0KEdlblRhYmxlIGdlblRhYmxlKTsKKworICAgIC8qKgorICAgICAqIOafpeivouaNruW6k+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIOihqOWQjeensOe7hAorICAgICAqIEByZXR1cm4g5pWw5o2u5bqT6KGo6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdERiVGFibGVMaXN0QnlOYW1lcyhTdHJpbmdbXSB0YWJsZU5hbWVzKTsKKworICAgIC8qKgorICAgICAqIOafpeivouaJgOacieihqOS/oeaBrworICAgICAqIAorICAgICAqIEByZXR1cm4g6KGo5L+h5oGv6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8R2VuVGFibGU+IHNlbGVjdEdlblRhYmxlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LkuJrliqHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQg5Lia5YqhSUQKKyAgICAgKiBAcmV0dXJuIOS4muWKoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBHZW5UYWJsZSBzZWxlY3RHZW5UYWJsZUJ5SWQoTG9uZyBpZCk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkuJrliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVHZW5UYWJsZShHZW5UYWJsZSBnZW5UYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTkuJrliqHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVJZHMg6ZyA6KaB5Yig6Zmk55qE6KGo5pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUdlblRhYmxlQnlJZHMoTG9uZ1tdIHRhYmxlSWRzKTsKKworICAgIC8qKgorICAgICAqIOWIm+W7uuihqAorICAgICAqCisgICAgICogQHBhcmFtIHNxbCDliJvlu7rooajor63lj6UKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVRhYmxlKFN0cmluZyBzcWwpOworCisgICAgLyoqCisgICAgICog5a+85YWl6KGo57uT5p6ECisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFibGVMaXN0IOWvvOWFpeihqOWIl+ihqAorICAgICAqIEBwYXJhbSBvcGVyTmFtZSDmk43kvZzkurrlkZgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbXBvcnRHZW5UYWJsZShMaXN0PEdlblRhYmxlPiB0YWJsZUxpc3QsIFN0cmluZyBvcGVyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDpooTop4jku6PnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVJZCDooajnvJblj7cKKyAgICAgKiBAcmV0dXJuIOmihOiniOaVsOaNruWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXZpZXdDb2RlKExvbmcgdGFibGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJDku6PnoIHvvIjkuIvovb3mlrnlvI/vvIkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVOYW1lIOihqOWQjeensAorICAgICAqIEByZXR1cm4g5pWw5o2uCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBkb3dubG9hZENvZGUoU3RyaW5nIHRhYmxlTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDnlJ/miJDku6PnoIHvvIjoh6rlrprkuYnot6/lvoTvvIkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFibGVOYW1lIOihqOWQjeensAorICAgICAqIEByZXR1cm4g5pWw5o2uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdG9yQ29kZShTdHJpbmcgdGFibGVOYW1lKTsKKworICAgIC8qKgorICAgICAqIOWQjOatpeaVsOaNruW6kworICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCN56ewCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luY2hEYihTdHJpbmcgdGFibGVOYW1lKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+eUn+aIkOS7o+egge+8iOS4i+i9veaWueW8j++8iQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWVzIOihqOaVsOe7hAorICAgICAqIEByZXR1cm4g5pWw5o2uCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBkb3dubG9hZENvZGUoU3RyaW5nW10gdGFibGVOYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjlj4LmlbDmoKHpqowKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVFZGl0KEdlblRhYmxlIGdlblRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvdXRpbC9HZW5VdGlscy5qYXZhIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci91dGlsL0dlblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlYmMyMAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvdXRpbC9HZW5VdGlscy5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACitwYWNrYWdlIGNvbS5ydW95aS5nZW5lcmF0b3IudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlJlZ0V4VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5HZW5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmNvbmZpZy5HZW5Db25maWc7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGU7CitpbXBvcnQgY29tLnJ1b3lpLmdlbmVyYXRvci5kb21haW4uR2VuVGFibGVDb2x1bW47CisKKy8qKgorICog5Luj56CB55Sf5oiQ5ZmoIOW3peWFt+exuworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5VdGlscworeworICAgIC8qKgorICAgICAqIOWIneWni+WMluihqOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0VGFibGUoR2VuVGFibGUgZ2VuVGFibGUsIFN0cmluZyBvcGVyTmFtZSkKKyAgICB7CisgICAgICAgIGdlblRhYmxlLnNldENsYXNzTmFtZShjb252ZXJ0Q2xhc3NOYW1lKGdlblRhYmxlLmdldFRhYmxlTmFtZSgpKSk7CisgICAgICAgIGdlblRhYmxlLnNldFBhY2thZ2VOYW1lKEdlbkNvbmZpZy5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgZ2VuVGFibGUuc2V0TW9kdWxlTmFtZShnZXRNb2R1bGVOYW1lKEdlbkNvbmZpZy5nZXRQYWNrYWdlTmFtZSgpKSk7CisgICAgICAgIGdlblRhYmxlLnNldEJ1c2luZXNzTmFtZShnZXRCdXNpbmVzc05hbWUoZ2VuVGFibGUuZ2V0VGFibGVOYW1lKCkpKTsKKyAgICAgICAgZ2VuVGFibGUuc2V0RnVuY3Rpb25OYW1lKHJlcGxhY2VUZXh0KGdlblRhYmxlLmdldFRhYmxlQ29tbWVudCgpKSk7CisgICAgICAgIGdlblRhYmxlLnNldEZ1bmN0aW9uQXV0aG9yKEdlbkNvbmZpZy5nZXRBdXRob3IoKSk7CisgICAgICAgIGdlblRhYmxlLnNldENyZWF0ZUJ5KG9wZXJOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliJ3lp4vljJbliJflsZ7mgKflrZfmrrUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdENvbHVtbkZpZWxkKEdlblRhYmxlQ29sdW1uIGNvbHVtbiwgR2VuVGFibGUgdGFibGUpCisgICAgeworICAgICAgICBTdHJpbmcgZGF0YVR5cGUgPSBnZXREYlR5cGUoY29sdW1uLmdldENvbHVtblR5cGUoKSk7CisgICAgICAgIFN0cmluZyBjb2x1bW5OYW1lID0gY29sdW1uLmdldENvbHVtbk5hbWUoKTsKKyAgICAgICAgY29sdW1uLnNldFRhYmxlSWQodGFibGUuZ2V0VGFibGVJZCgpKTsKKyAgICAgICAgY29sdW1uLnNldENyZWF0ZUJ5KHRhYmxlLmdldENyZWF0ZUJ5KCkpOworICAgICAgICAvLyDorr7nva5qYXZh5a2X5q615ZCNCisgICAgICAgIGNvbHVtbi5zZXRKYXZhRmllbGQoU3RyaW5nVXRpbHMudG9DYW1lbENhc2UoY29sdW1uTmFtZSkpOworICAgICAgICAvLyDorr7nva7pu5jorqTnsbvlnosKKyAgICAgICAgY29sdW1uLnNldEphdmFUeXBlKEdlbkNvbnN0YW50cy5UWVBFX1NUUklORyk7CisgICAgICAgIGNvbHVtbi5zZXRRdWVyeVR5cGUoR2VuQ29uc3RhbnRzLlFVRVJZX0VRKTsKKworICAgICAgICBpZiAoYXJyYXlzQ29udGFpbnMoR2VuQ29uc3RhbnRzLkNPTFVNTlRZUEVfU1RSLCBkYXRhVHlwZSkgfHwgYXJyYXlzQ29udGFpbnMoR2VuQ29uc3RhbnRzLkNPTFVNTlRZUEVfVEVYVCwgZGF0YVR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDlrZfnrKbkuLLplb/luqbotoXov4c1MDDorr7nva7kuLrmlofmnKzln58KKyAgICAgICAgICAgIEludGVnZXIgY29sdW1uTGVuZ3RoID0gZ2V0Q29sdW1uTGVuZ3RoKGNvbHVtbi5nZXRDb2x1bW5UeXBlKCkpOworICAgICAgICAgICAgU3RyaW5nIGh0bWxUeXBlID0gY29sdW1uTGVuZ3RoID49IDUwMCB8fCBhcnJheXNDb250YWlucyhHZW5Db25zdGFudHMuQ09MVU1OVFlQRV9URVhULCBkYXRhVHlwZSkgPyBHZW5Db25zdGFudHMuSFRNTF9URVhUQVJFQSA6IEdlbkNvbnN0YW50cy5IVE1MX0lOUFVUOworICAgICAgICAgICAgY29sdW1uLnNldEh0bWxUeXBlKGh0bWxUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcnJheXNDb250YWlucyhHZW5Db25zdGFudHMuQ09MVU1OVFlQRV9USU1FLCBkYXRhVHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRKYXZhVHlwZShHZW5Db25zdGFudHMuVFlQRV9EQVRFKTsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRIdG1sVHlwZShHZW5Db25zdGFudHMuSFRNTF9EQVRFVElNRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJyYXlzQ29udGFpbnMoR2VuQ29uc3RhbnRzLkNPTFVNTlRZUEVfTlVNQkVSLCBkYXRhVHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRIdG1sVHlwZShHZW5Db25zdGFudHMuSFRNTF9JTlBVVCk7CisKKyAgICAgICAgICAgIC8vIOWmguaenOaYr+a1rueCueWeiyDnu5/kuIDnlKhCaWdEZWNpbWFsCisgICAgICAgICAgICBTdHJpbmdbXSBzdHIgPSBTdHJpbmdVdGlscy5zcGxpdChTdHJpbmdVdGlscy5zdWJzdHJpbmdCZXR3ZWVuKGNvbHVtbi5nZXRDb2x1bW5UeXBlKCksICIoIiwgIikiKSwgIiwiKTsKKyAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoID09IDIgJiYgSW50ZWdlci5wYXJzZUludChzdHJbMV0pID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2x1bW4uc2V0SmF2YVR5cGUoR2VuQ29uc3RhbnRzLlRZUEVfQklHREVDSU1BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyDlpoLmnpzmmK/mlbTlvaIKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGggPT0gMSAmJiBJbnRlZ2VyLnBhcnNlSW50KHN0clswXSkgPD0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29sdW1uLnNldEphdmFUeXBlKEdlbkNvbnN0YW50cy5UWVBFX0lOVEVHRVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g6ZW/5pW05b2iCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29sdW1uLnNldEphdmFUeXBlKEdlbkNvbnN0YW50cy5UWVBFX0xPTkcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8g5o+S5YWl5a2X5q6177yI6buY6K6k5omA5pyJ5a2X5q616YO96ZyA6KaB5o+S5YWl77yJCisgICAgICAgIGNvbHVtbi5zZXRJc0luc2VydChHZW5Db25zdGFudHMuUkVRVUlSRSk7CisKKyAgICAgICAgLy8g57yW6L6R5a2X5q61CisgICAgICAgIGlmICghYXJyYXlzQ29udGFpbnMoR2VuQ29uc3RhbnRzLkNPTFVNTk5BTUVfTk9UX0VESVQsIGNvbHVtbk5hbWUpICYmICFjb2x1bW4uaXNQaygpKQorICAgICAgICB7CisgICAgICAgICAgICBjb2x1bW4uc2V0SXNFZGl0KEdlbkNvbnN0YW50cy5SRVFVSVJFKTsKKyAgICAgICAgfQorICAgICAgICAvLyDliJfooajlrZfmrrUKKyAgICAgICAgaWYgKCFhcnJheXNDb250YWlucyhHZW5Db25zdGFudHMuQ09MVU1OTkFNRV9OT1RfTElTVCwgY29sdW1uTmFtZSkgJiYgIWNvbHVtbi5pc1BrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRJc0xpc3QoR2VuQ29uc3RhbnRzLlJFUVVJUkUpOworICAgICAgICB9CisgICAgICAgIC8vIOafpeivouWtl+autQorICAgICAgICBpZiAoIWFycmF5c0NvbnRhaW5zKEdlbkNvbnN0YW50cy5DT0xVTU5OQU1FX05PVF9RVUVSWSwgY29sdW1uTmFtZSkgJiYgIWNvbHVtbi5pc1BrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRJc1F1ZXJ5KEdlbkNvbnN0YW50cy5SRVFVSVJFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOafpeivouWtl+auteexu+WeiworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGhJZ25vcmVDYXNlKGNvbHVtbk5hbWUsICJuYW1lIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbHVtbi5zZXRRdWVyeVR5cGUoR2VuQ29uc3RhbnRzLlFVRVJZX0xJS0UpOworICAgICAgICB9CisgICAgICAgIC8vIOeKtuaAgeWtl+auteiuvue9ruWNlemAieahhgorICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGhJZ25vcmVDYXNlKGNvbHVtbk5hbWUsICJzdGF0dXMiKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sdW1uLnNldEh0bWxUeXBlKEdlbkNvbnN0YW50cy5IVE1MX1JBRElPKTsKKyAgICAgICAgfQorICAgICAgICAvLyDnsbvlnosm5oCn5Yir5a2X5q616K6+572u5LiL5ouJ5qGGCisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmVuZHNXaXRoSWdub3JlQ2FzZShjb2x1bW5OYW1lLCAidHlwZSIpCisgICAgICAgICAgICAgICAgfHwgU3RyaW5nVXRpbHMuZW5kc1dpdGhJZ25vcmVDYXNlKGNvbHVtbk5hbWUsICJzZXgiKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sdW1uLnNldEh0bWxUeXBlKEdlbkNvbnN0YW50cy5IVE1MX1NFTEVDVCk7CisgICAgICAgIH0KKyAgICAgICAgLy8g5Zu+54mH5a2X5q616K6+572u5Zu+54mH5LiK5Lyg5o6n5Lu2CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmVuZHNXaXRoSWdub3JlQ2FzZShjb2x1bW5OYW1lLCAiaW1hZ2UiKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sdW1uLnNldEh0bWxUeXBlKEdlbkNvbnN0YW50cy5IVE1MX0lNQUdFX1VQTE9BRCk7CisgICAgICAgIH0KKyAgICAgICAgLy8g5paH5Lu25a2X5q616K6+572u5paH5Lu25LiK5Lyg5o6n5Lu2CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmVuZHNXaXRoSWdub3JlQ2FzZShjb2x1bW5OYW1lLCAiZmlsZSIpKQorICAgICAgICB7CisgICAgICAgICAgICBjb2x1bW4uc2V0SHRtbFR5cGUoR2VuQ29uc3RhbnRzLkhUTUxfRklMRV9VUExPQUQpOworICAgICAgICB9CisgICAgICAgIC8vIOWGheWuueWtl+auteiuvue9ruWvjOaWh+acrOaOp+S7tgorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5lbmRzV2l0aElnbm9yZUNhc2UoY29sdW1uTmFtZSwgImNvbnRlbnQiKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sdW1uLnNldEh0bWxUeXBlKEdlbkNvbnN0YW50cy5IVE1MX0VESVRPUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozmlbDnu4TmmK/lkKbljIXlkKvmjIflrprlgLwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJyIOaVsOe7hAorICAgICAqIEBwYXJhbSB0YXJnZXRWYWx1ZSDlgLwKKyAgICAgKiBAcmV0dXJuIOaYr+WQpuWMheWQqworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcnJheXNDb250YWlucyhTdHJpbmdbXSBhcnIsIFN0cmluZyB0YXJnZXRWYWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGFycikuY29udGFpbnModGFyZ2V0VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluaooeWdl+WQjQorICAgICAqIAorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSDljIXlkI0KKyAgICAgKiBAcmV0dXJuIOaooeWdl+WQjQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQorICAgIHsKKyAgICAgICAgaW50IGxhc3RJbmRleCA9IHBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgIGludCBuYW1lTGVuZ3RoID0gcGFja2FnZU5hbWUubGVuZ3RoKCk7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5zdWJzdHJpbmcocGFja2FnZU5hbWUsIGxhc3RJbmRleCArIDEsIG5hbWVMZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluS4muWKoeWQjQorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUg6KGo5ZCNCisgICAgICogQHJldHVybiDkuJrliqHlkI0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdXNpbmVzc05hbWUoU3RyaW5nIHRhYmxlTmFtZSkKKyAgICB7CisgICAgICAgIGludCBsYXN0SW5kZXggPSB0YWJsZU5hbWUubGFzdEluZGV4T2YoIl8iKTsKKyAgICAgICAgaW50IG5hbWVMZW5ndGggPSB0YWJsZU5hbWUubGVuZ3RoKCk7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5zdWJzdHJpbmcodGFibGVOYW1lLCBsYXN0SW5kZXggKyAxLCBuYW1lTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDooajlkI3ovazmjaLmiJBKYXZh57G75ZCNCisgICAgICogCisgICAgICogQHBhcmFtIHRhYmxlTmFtZSDooajlkI3np7AKKyAgICAgKiBAcmV0dXJuIOexu+WQjQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRDbGFzc05hbWUoU3RyaW5nIHRhYmxlTmFtZSkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gYXV0b1JlbW92ZVByZSA9IEdlbkNvbmZpZy5nZXRBdXRvUmVtb3ZlUHJlKCk7CisgICAgICAgIFN0cmluZyB0YWJsZVByZWZpeCA9IEdlbkNvbmZpZy5nZXRUYWJsZVByZWZpeCgpOworICAgICAgICBpZiAoYXV0b1JlbW92ZVByZSAmJiBTdHJpbmdVdGlscy5pc05vdEVtcHR5KHRhYmxlUHJlZml4KSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nW10gc2VhcmNoTGlzdCA9IFN0cmluZ1V0aWxzLnNwbGl0KHRhYmxlUHJlZml4LCAiLCIpOworICAgICAgICAgICAgdGFibGVOYW1lID0gcmVwbGFjZUZpcnN0KHRhYmxlTmFtZSwgc2VhcmNoTGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0NhbWVsQ2FzZSh0YWJsZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+abv+aNouWJjee8gAorICAgICAqIAorICAgICAqIEBwYXJhbSByZXBsYWNlbWVudG0g5pu/5o2i5YC8CisgICAgICogQHBhcmFtIHNlYXJjaExpc3Qg5pu/5o2i5YiX6KGoCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaXJzdChTdHJpbmcgcmVwbGFjZW1lbnRtLCBTdHJpbmdbXSBzZWFyY2hMaXN0KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSByZXBsYWNlbWVudG07CisgICAgICAgIGZvciAoU3RyaW5nIHNlYXJjaFN0cmluZyA6IHNlYXJjaExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudG0uc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRleHQgPSByZXBsYWNlbWVudG0ucmVwbGFjZUZpcnN0KHNlYXJjaFN0cmluZywgIiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOWFs+mUruWtl+abv+aNogorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0IOmcgOimgeiiq+abv+aNoueahOWQjeWtlworICAgICAqIEByZXR1cm4g5pu/5o2i5ZCO55qE5ZCN5a2XCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVRleHQoU3RyaW5nIHRleHQpCisgICAgeworICAgICAgICByZXR1cm4gUmVnRXhVdGlscy5yZXBsYWNlQWxsKHRleHQsICIoPzrooah86Iul5L6dKSIsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bmlbDmja7lupPnsbvlnovlrZfmrrUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sdW1uVHlwZSDliJfnsbvlnosKKyAgICAgKiBAcmV0dXJuIOaIquWPluWQjueahOWIl+exu+WeiworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERiVHlwZShTdHJpbmcgY29sdW1uVHlwZSkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pbmRleE9mKGNvbHVtblR5cGUsICIoIikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKGNvbHVtblR5cGUsICIoIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWtl+autemVv+W6pgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2x1bW5UeXBlIOWIl+exu+WeiworICAgICAqIEByZXR1cm4g5oiq5Y+W5ZCO55qE5YiX57G75Z6LCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldENvbHVtbkxlbmd0aChTdHJpbmcgY29sdW1uVHlwZSkKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pbmRleE9mKGNvbHVtblR5cGUsICIoIikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbGVuZ3RoID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmV0d2Vlbihjb2x1bW5UeXBlLCAiKCIsICIpIik7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9nZW5lcmF0b3IvdXRpbC9WZWxvY2l0eUluaXRpYWxpemVyLmphdmEgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3V0aWwvVmVsb2NpdHlJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjk0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3V0aWwvVmVsb2NpdHlJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLmdlbmVyYXRvci51dGlsOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHk7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CisKKy8qKgorICogVmVsb2NpdHlFbmdpbmXlt6XljoIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVmVsb2NpdHlJbml0aWFsaXplcgoreworICAgIC8qKgorICAgICAqIOWIneWni+WMlnZt5pa55rOVCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRWZWxvY2l0eSgpCisgICAgeworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5Yqg6L29Y2xhc3NwYXRo55uu5b2V5LiL55qEdm3mlofku7YKKyAgICAgICAgICAgIHAuc2V0UHJvcGVydHkoInJlc291cmNlLmxvYWRlci5maWxlLmNsYXNzIiwgIm9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5yZXNvdXJjZS5sb2FkZXIuQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIiKTsKKyAgICAgICAgICAgIC8vIOWumuS5ieWtl+espumbhgorICAgICAgICAgICAgcC5zZXRQcm9wZXJ0eShWZWxvY2l0eS5JTlBVVF9FTkNPRElORywgQ29uc3RhbnRzLlVURjgpOworICAgICAgICAgICAgLy8g5Yid5aeL5YyWVmVsb2NpdHnlvJXmk47vvIzmjIflrprphY3nva5Qcm9wZXJ0aWVzCisgICAgICAgICAgICBWZWxvY2l0eS5pbml0KHApOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vcnVveWkvZ2VuZXJhdG9yL3V0aWwvVmVsb2NpdHlVdGlscy5qYXZhIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci91dGlsL1ZlbG9jaXR5VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE0NjgxCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL2dlbmVyYXRvci91dGlsL1ZlbG9jaXR5VXRpbHMuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorcGFja2FnZSBjb20ucnVveWkuZ2VuZXJhdG9yLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT047CitpbXBvcnQgY29tLmFsaWJhYmEuZmFzdGpzb24yLkpTT05PYmplY3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5HZW5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZTsKK2ltcG9ydCBjb20ucnVveWkuZ2VuZXJhdG9yLmRvbWFpbi5HZW5UYWJsZUNvbHVtbjsKKworLyoqCisgKiDmqKHmnb/lpITnkIblt6XlhbfnsbsKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgVmVsb2NpdHlVdGlscworeworICAgIC8qKiDpobnnm67nqbrpl7Tot6/lvoQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9QQVRIID0gIm1haW4vamF2YSI7CisKKyAgICAvKiogbXliYXRpc+epuumXtOi3r+W+hCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWUJBVElTX1BBVEggPSAibWFpbi9yZXNvdXJjZXMvbWFwcGVyIjsKKworICAgIC8qKiDpu5jorqTkuIrnuqfoj5zljZXvvIzns7vnu5/lt6XlhbcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQVJFTlRfTUVOVV9JRCA9ICIzIjsKKworICAgIC8qKgorICAgICAqIOiuvue9ruaooeadv+WPmOmHj+S/oeaBrworICAgICAqCisgICAgICogQHJldHVybiDmqKHmnb/liJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZlbG9jaXR5Q29udGV4dCBwcmVwYXJlQ29udGV4dChHZW5UYWJsZSBnZW5UYWJsZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gZ2VuVGFibGUuZ2V0TW9kdWxlTmFtZSgpOworICAgICAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gZ2VuVGFibGUuZ2V0QnVzaW5lc3NOYW1lKCk7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdlblRhYmxlLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIFN0cmluZyB0cGxDYXRlZ29yeSA9IGdlblRhYmxlLmdldFRwbENhdGVnb3J5KCk7CisgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUgPSBnZW5UYWJsZS5nZXRGdW5jdGlvbk5hbWUoKTsKKworICAgICAgICBWZWxvY2l0eUNvbnRleHQgdmVsb2NpdHlDb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJ0cGxDYXRlZ29yeSIsIGdlblRhYmxlLmdldFRwbENhdGVnb3J5KCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJ0YWJsZU5hbWUiLCBnZW5UYWJsZS5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImZ1bmN0aW9uTmFtZSIsIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZnVuY3Rpb25OYW1lKSA/IGZ1bmN0aW9uTmFtZSA6ICLjgJDor7floavlhpnlip/og73lkI3np7DjgJEiKTsKKyAgICAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiQ2xhc3NOYW1lIiwgZ2VuVGFibGUuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJjbGFzc05hbWUiLCBTdHJpbmdVdGlscy51bmNhcGl0YWxpemUoZ2VuVGFibGUuZ2V0Q2xhc3NOYW1lKCkpKTsKKyAgICAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgibW9kdWxlTmFtZSIsIGdlblRhYmxlLmdldE1vZHVsZU5hbWUoKSk7CisgICAgICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoIkJ1c2luZXNzTmFtZSIsIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUoZ2VuVGFibGUuZ2V0QnVzaW5lc3NOYW1lKCkpKTsKKyAgICAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiYnVzaW5lc3NOYW1lIiwgZ2VuVGFibGUuZ2V0QnVzaW5lc3NOYW1lKCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJiYXNlUGFja2FnZSIsIGdldFBhY2thZ2VQcmVmaXgocGFja2FnZU5hbWUpKTsKKyAgICAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgicGFja2FnZU5hbWUiLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImF1dGhvciIsIGdlblRhYmxlLmdldEZ1bmN0aW9uQXV0aG9yKCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJkYXRldGltZSIsIERhdGVVdGlscy5nZXREYXRlKCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJwa0NvbHVtbiIsIGdlblRhYmxlLmdldFBrQ29sdW1uKCkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJpbXBvcnRMaXN0IiwgZ2V0SW1wb3J0TGlzdChnZW5UYWJsZSkpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJwZXJtaXNzaW9uUHJlZml4IiwgZ2V0UGVybWlzc2lvblByZWZpeChtb2R1bGVOYW1lLCBidXNpbmVzc05hbWUpKTsKKyAgICAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiY29sdW1ucyIsIGdlblRhYmxlLmdldENvbHVtbnMoKSk7CisgICAgICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoInRhYmxlIiwgZ2VuVGFibGUpOworICAgICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJkaWN0cyIsIGdldERpY3RzKGdlblRhYmxlKSk7CisgICAgICAgIHNldE1lbnVWZWxvY2l0eUNvbnRleHQodmVsb2NpdHlDb250ZXh0LCBnZW5UYWJsZSk7CisgICAgICAgIGlmIChHZW5Db25zdGFudHMuVFBMX1RSRUUuZXF1YWxzKHRwbENhdGVnb3J5KSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0VHJlZVZlbG9jaXR5Q29udGV4dCh2ZWxvY2l0eUNvbnRleHQsIGdlblRhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoR2VuQ29uc3RhbnRzLlRQTF9TVUIuZXF1YWxzKHRwbENhdGVnb3J5KSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0U3ViVmVsb2NpdHlDb250ZXh0KHZlbG9jaXR5Q29udGV4dCwgZ2VuVGFibGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZWxvY2l0eUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1lbnVWZWxvY2l0eUNvbnRleHQoVmVsb2NpdHlDb250ZXh0IGNvbnRleHQsIEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG9wdGlvbnMgPSBnZW5UYWJsZS5nZXRPcHRpb25zKCk7CisgICAgICAgIEpTT05PYmplY3QgcGFyYW1zT2JqID0gSlNPTi5wYXJzZU9iamVjdChvcHRpb25zKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudE1lbnVJZCA9IGdldFBhcmVudE1lbnVJZChwYXJhbXNPYmopOworICAgICAgICBjb250ZXh0LnB1dCgicGFyZW50TWVudUlkIiwgcGFyZW50TWVudUlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJlZVZlbG9jaXR5Q29udGV4dChWZWxvY2l0eUNvbnRleHQgY29udGV4dCwgR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICBTdHJpbmcgb3B0aW9ucyA9IGdlblRhYmxlLmdldE9wdGlvbnMoKTsKKyAgICAgICAgSlNPTk9iamVjdCBwYXJhbXNPYmogPSBKU09OLnBhcnNlT2JqZWN0KG9wdGlvbnMpOworICAgICAgICBTdHJpbmcgdHJlZUNvZGUgPSBnZXRUcmVlY29kZShwYXJhbXNPYmopOworICAgICAgICBTdHJpbmcgdHJlZVBhcmVudENvZGUgPSBnZXRUcmVlUGFyZW50Q29kZShwYXJhbXNPYmopOworICAgICAgICBTdHJpbmcgdHJlZU5hbWUgPSBnZXRUcmVlTmFtZShwYXJhbXNPYmopOworCisgICAgICAgIGNvbnRleHQucHV0KCJ0cmVlQ29kZSIsIHRyZWVDb2RlKTsKKyAgICAgICAgY29udGV4dC5wdXQoInRyZWVQYXJlbnRDb2RlIiwgdHJlZVBhcmVudENvZGUpOworICAgICAgICBjb250ZXh0LnB1dCgidHJlZU5hbWUiLCB0cmVlTmFtZSk7CisgICAgICAgIGNvbnRleHQucHV0KCJleHBhbmRDb2x1bW4iLCBnZXRFeHBhbmRDb2x1bW4oZ2VuVGFibGUpKTsKKyAgICAgICAgaWYgKHBhcmFtc09iai5jb250YWluc0tleShHZW5Db25zdGFudHMuVFJFRV9QQVJFTlRfQ09ERSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQucHV0KCJ0cmVlX3BhcmVudF9jb2RlIiwgcGFyYW1zT2JqLmdldFN0cmluZyhHZW5Db25zdGFudHMuVFJFRV9QQVJFTlRfQ09ERSkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXNPYmouY29udGFpbnNLZXkoR2VuQ29uc3RhbnRzLlRSRUVfTkFNRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQucHV0KCJ0cmVlX25hbWUiLCBwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX05BTUUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdWJWZWxvY2l0eUNvbnRleHQoVmVsb2NpdHlDb250ZXh0IGNvbnRleHQsIEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgR2VuVGFibGUgc3ViVGFibGUgPSBnZW5UYWJsZS5nZXRTdWJUYWJsZSgpOworICAgICAgICBTdHJpbmcgc3ViVGFibGVOYW1lID0gZ2VuVGFibGUuZ2V0U3ViVGFibGVOYW1lKCk7CisgICAgICAgIFN0cmluZyBzdWJUYWJsZUZrTmFtZSA9IGdlblRhYmxlLmdldFN1YlRhYmxlRmtOYW1lKCk7CisgICAgICAgIFN0cmluZyBzdWJDbGFzc05hbWUgPSBnZW5UYWJsZS5nZXRTdWJUYWJsZSgpLmdldENsYXNzTmFtZSgpOworICAgICAgICBTdHJpbmcgc3ViVGFibGVGa0NsYXNzTmFtZSA9IFN0cmluZ1V0aWxzLmNvbnZlcnRUb0NhbWVsQ2FzZShzdWJUYWJsZUZrTmFtZSk7CisKKyAgICAgICAgY29udGV4dC5wdXQoInN1YlRhYmxlIiwgc3ViVGFibGUpOworICAgICAgICBjb250ZXh0LnB1dCgic3ViVGFibGVOYW1lIiwgc3ViVGFibGVOYW1lKTsKKyAgICAgICAgY29udGV4dC5wdXQoInN1YlRhYmxlRmtOYW1lIiwgc3ViVGFibGVGa05hbWUpOworICAgICAgICBjb250ZXh0LnB1dCgic3ViVGFibGVGa0NsYXNzTmFtZSIsIHN1YlRhYmxlRmtDbGFzc05hbWUpOworICAgICAgICBjb250ZXh0LnB1dCgic3ViVGFibGVGa2NsYXNzTmFtZSIsIFN0cmluZ1V0aWxzLnVuY2FwaXRhbGl6ZShzdWJUYWJsZUZrQ2xhc3NOYW1lKSk7CisgICAgICAgIGNvbnRleHQucHV0KCJzdWJDbGFzc05hbWUiLCBzdWJDbGFzc05hbWUpOworICAgICAgICBjb250ZXh0LnB1dCgic3ViY2xhc3NOYW1lIiwgU3RyaW5nVXRpbHMudW5jYXBpdGFsaXplKHN1YkNsYXNzTmFtZSkpOworICAgICAgICBjb250ZXh0LnB1dCgic3ViSW1wb3J0TGlzdCIsIGdldEltcG9ydExpc3QoZ2VuVGFibGUuZ2V0U3ViVGFibGUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluaooeadv+S/oeaBrworICAgICAqIEBwYXJhbSB0cGxDYXRlZ29yeSDnlJ/miJDnmoTmqKHmnb8KKyAgICAgKiBAcGFyYW0gdHBsV2ViVHlwZSDliY3nq6/nsbvlnosKKyAgICAgKiBAcmV0dXJuIOaooeadv+WIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlTGlzdChTdHJpbmcgdHBsQ2F0ZWdvcnksIFN0cmluZyB0cGxXZWJUeXBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHVzZVdlYlR5cGUgPSAidm0vdnVlIjsKKyAgICAgICAgaWYgKCJlbGVtZW50LXBsdXMiLmVxdWFscyh0cGxXZWJUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNlV2ViVHlwZSA9ICJ2bS92dWUvdjMiOworICAgICAgICB9CisgICAgICAgIExpc3Q8U3RyaW5nPiB0ZW1wbGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdGVtcGxhdGVzLmFkZCgidm0vamF2YS9kb21haW4uamF2YS52bSIpOworICAgICAgICB0ZW1wbGF0ZXMuYWRkKCJ2bS9qYXZhL21hcHBlci5qYXZhLnZtIik7CisgICAgICAgIHRlbXBsYXRlcy5hZGQoInZtL2phdmEvc2VydmljZS5qYXZhLnZtIik7CisgICAgICAgIHRlbXBsYXRlcy5hZGQoInZtL2phdmEvc2VydmljZUltcGwuamF2YS52bSIpOworICAgICAgICB0ZW1wbGF0ZXMuYWRkKCJ2bS9qYXZhL2NvbnRyb2xsZXIuamF2YS52bSIpOworICAgICAgICB0ZW1wbGF0ZXMuYWRkKCJ2bS94bWwvbWFwcGVyLnhtbC52bSIpOworICAgICAgICB0ZW1wbGF0ZXMuYWRkKCJ2bS9zcWwvc3FsLnZtIik7CisgICAgICAgIHRlbXBsYXRlcy5hZGQoInZtL2pzL2FwaS5qcy52bSIpOworICAgICAgICBpZiAoR2VuQ29uc3RhbnRzLlRQTF9DUlVELmVxdWFscyh0cGxDYXRlZ29yeSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQodXNlV2ViVHlwZSArICIvaW5kZXgudnVlLnZtIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoR2VuQ29uc3RhbnRzLlRQTF9UUkVFLmVxdWFscyh0cGxDYXRlZ29yeSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQodXNlV2ViVHlwZSArICIvaW5kZXgtdHJlZS52dWUudm0iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChHZW5Db25zdGFudHMuVFBMX1NVQi5lcXVhbHModHBsQ2F0ZWdvcnkpKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbGF0ZXMuYWRkKHVzZVdlYlR5cGUgKyAiL2luZGV4LnZ1ZS52bSIpOworICAgICAgICAgICAgdGVtcGxhdGVzLmFkZCgidm0vamF2YS9zdWItZG9tYWluLmphdmEudm0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVtcGxhdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluaWh+S7tuWQjQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyB0ZW1wbGF0ZSwgR2VuVGFibGUgZ2VuVGFibGUpCisgICAgeworICAgICAgICAvLyDmlofku7blkI3np7AKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gIiI7CisgICAgICAgIC8vIOWMhei3r+W+hAorICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZW5UYWJsZS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAvLyDmqKHlnZflkI0KKyAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBnZW5UYWJsZS5nZXRNb2R1bGVOYW1lKCk7CisgICAgICAgIC8vIOWkp+WGmeexu+WQjQorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2VuVGFibGUuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIC8vIOS4muWKoeWQjeensAorICAgICAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gZ2VuVGFibGUuZ2V0QnVzaW5lc3NOYW1lKCk7CisKKyAgICAgICAgU3RyaW5nIGphdmFQYXRoID0gUFJPSkVDVF9QQVRIICsgIi8iICsgU3RyaW5nVXRpbHMucmVwbGFjZShwYWNrYWdlTmFtZSwgIi4iLCAiLyIpOworICAgICAgICBTdHJpbmcgbXliYXRpc1BhdGggPSBNWUJBVElTX1BBVEggKyAiLyIgKyBtb2R1bGVOYW1lOworICAgICAgICBTdHJpbmcgdnVlUGF0aCA9ICJ2dWUiOworCisgICAgICAgIGlmICh0ZW1wbGF0ZS5jb250YWlucygiZG9tYWluLmphdmEudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L2RvbWFpbi97fS5qYXZhIiwgamF2YVBhdGgsIGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXBsYXRlLmNvbnRhaW5zKCJzdWItZG9tYWluLmphdmEudm0iKSAmJiBTdHJpbmdVdGlscy5lcXVhbHMoR2VuQ29uc3RhbnRzLlRQTF9TVUIsIGdlblRhYmxlLmdldFRwbENhdGVnb3J5KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlTmFtZSA9IFN0cmluZ1V0aWxzLmZvcm1hdCgie30vZG9tYWluL3t9LmphdmEiLCBqYXZhUGF0aCwgZ2VuVGFibGUuZ2V0U3ViVGFibGUoKS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuY29udGFpbnMoIm1hcHBlci5qYXZhLnZtIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gU3RyaW5nVXRpbHMuZm9ybWF0KCJ7fS9tYXBwZXIve31NYXBwZXIuamF2YSIsIGphdmFQYXRoLCBjbGFzc05hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlLmNvbnRhaW5zKCJzZXJ2aWNlLmphdmEudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L3NlcnZpY2UvSXt9U2VydmljZS5qYXZhIiwgamF2YVBhdGgsIGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuY29udGFpbnMoInNlcnZpY2VJbXBsLmphdmEudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L3NlcnZpY2UvaW1wbC97fVNlcnZpY2VJbXBsLmphdmEiLCBqYXZhUGF0aCwgY2xhc3NOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZS5jb250YWlucygiY29udHJvbGxlci5qYXZhLnZtIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gU3RyaW5nVXRpbHMuZm9ybWF0KCJ7fS9jb250cm9sbGVyL3t9Q29udHJvbGxlci5qYXZhIiwgamF2YVBhdGgsIGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuY29udGFpbnMoIm1hcHBlci54bWwudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L3t9TWFwcGVyLnhtbCIsIG15YmF0aXNQYXRoLCBjbGFzc05hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlLmNvbnRhaW5zKCJzcWwudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBidXNpbmVzc05hbWUgKyAiTWVudS5zcWwiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlLmNvbnRhaW5zKCJhcGkuanMudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L2FwaS97fS97fS5qcyIsIHZ1ZVBhdGgsIG1vZHVsZU5hbWUsIGJ1c2luZXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcGxhdGUuY29udGFpbnMoImluZGV4LnZ1ZS52bSIpKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlTmFtZSA9IFN0cmluZ1V0aWxzLmZvcm1hdCgie30vdmlld3Mve30ve30vaW5kZXgudnVlIiwgdnVlUGF0aCwgbW9kdWxlTmFtZSwgYnVzaW5lc3NOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZS5jb250YWlucygiaW5kZXgtdHJlZS52dWUudm0iKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBTdHJpbmdVdGlscy5mb3JtYXQoInt9L3ZpZXdzL3t9L3t9L2luZGV4LnZ1ZSIsIHZ1ZVBhdGgsIG1vZHVsZU5hbWUsIGJ1c2luZXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWMheWJjee8gAorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIOWMheWQjeensAorICAgICAqIEByZXR1cm4g5YyF5YmN57yA5ZCN56ewCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZVByZWZpeChTdHJpbmcgcGFja2FnZU5hbWUpCisgICAgeworICAgICAgICBpbnQgbGFzdEluZGV4ID0gcGFja2FnZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN1YnN0cmluZyhwYWNrYWdlTmFtZSwgMCwgbGFzdEluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7liJfnsbvlnovojrflj5blr7zlhaXljIUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2VuVGFibGUg5Lia5Yqh6KGo5a+56LGhCisgICAgICogQHJldHVybiDov5Tlm57pnIDopoHlr7zlhaXnmoTljIXliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRJbXBvcnRMaXN0KEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgTGlzdDxHZW5UYWJsZUNvbHVtbj4gY29sdW1ucyA9IGdlblRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgR2VuVGFibGUgc3ViR2VuVGFibGUgPSBnZW5UYWJsZS5nZXRTdWJUYWJsZSgpOworICAgICAgICBIYXNoU2V0PFN0cmluZz4gaW1wb3J0TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChzdWJHZW5UYWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGltcG9ydExpc3QuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOworICAgICAgICB9CisgICAgICAgIGZvciAoR2VuVGFibGVDb2x1bW4gY29sdW1uIDogY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjb2x1bW4uaXNTdXBlckNvbHVtbigpICYmIEdlbkNvbnN0YW50cy5UWVBFX0RBVEUuZXF1YWxzKGNvbHVtbi5nZXRKYXZhVHlwZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRMaXN0LmFkZCgiamF2YS51dGlsLkRhdGUiKTsKKyAgICAgICAgICAgICAgICBpbXBvcnRMaXN0LmFkZCgiY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkZvcm1hdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWNvbHVtbi5pc1N1cGVyQ29sdW1uKCkgJiYgR2VuQ29uc3RhbnRzLlRZUEVfQklHREVDSU1BTC5lcXVhbHMoY29sdW1uLmdldEphdmFUeXBlKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltcG9ydExpc3QuYWRkKCJqYXZhLm1hdGguQmlnRGVjaW1hbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbXBvcnRMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWIl+exu+Wei+iOt+WPluWtl+WFuOe7hAorICAgICAqIAorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHooajlr7nosaEKKyAgICAgKiBAcmV0dXJuIOi/lOWbnuWtl+WFuOe7hAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpY3RzKEdlblRhYmxlIGdlblRhYmxlKQorICAgIHsKKyAgICAgICAgTGlzdDxHZW5UYWJsZUNvbHVtbj4gY29sdW1ucyA9IGdlblRhYmxlLmdldENvbHVtbnMoKTsKKyAgICAgICAgU2V0PFN0cmluZz4gZGljdHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGFkZERpY3RzKGRpY3RzLCBjb2x1bW5zKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChnZW5UYWJsZS5nZXRTdWJUYWJsZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxHZW5UYWJsZUNvbHVtbj4gc3ViQ29sdW1ucyA9IGdlblRhYmxlLmdldFN1YlRhYmxlKCkuZ2V0Q29sdW1ucygpOworICAgICAgICAgICAgYWRkRGljdHMoZGljdHMsIHN1YkNvbHVtbnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5qb2luKGRpY3RzLCAiLCAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmt7vliqDlrZflhbjliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdHMg5a2X5YW45YiX6KGoCisgICAgICogQHBhcmFtIGNvbHVtbnMg5YiX6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERpY3RzKFNldDxTdHJpbmc+IGRpY3RzLCBMaXN0PEdlblRhYmxlQ29sdW1uPiBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgZm9yIChHZW5UYWJsZUNvbHVtbiBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNvbHVtbi5pc1N1cGVyQ29sdW1uKCkgJiYgU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShjb2x1bW4uZ2V0RGljdFR5cGUoKSkgJiYgU3RyaW5nVXRpbHMuZXF1YWxzQW55KAorICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZ2V0SHRtbFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgR2VuQ29uc3RhbnRzLkhUTUxfU0VMRUNULCBHZW5Db25zdGFudHMuSFRNTF9SQURJTywgR2VuQ29uc3RhbnRzLkhUTUxfQ0hFQ0tCT1ggfSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGljdHMuYWRkKCInIiArIGNvbHVtbi5nZXREaWN0VHlwZSgpICsgIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluadg+mZkOWJjee8gAorICAgICAqCisgICAgICogQHBhcmFtIG1vZHVsZU5hbWUg5qih5Z2X5ZCN56ewCisgICAgICogQHBhcmFtIGJ1c2luZXNzTmFtZSDkuJrliqHlkI3np7AKKyAgICAgKiBAcmV0dXJuIOi/lOWbnuadg+mZkOWJjee8gAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBlcm1pc3Npb25QcmVmaXgoU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBidXNpbmVzc05hbWUpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuZm9ybWF0KCJ7fTp7fSIsIG1vZHVsZU5hbWUsIGJ1c2luZXNzTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5LiK57qn6I+c5Y2VSUTlrZfmrrUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXNPYmog55Sf5oiQ5YW25LuW6YCJ6aG5CisgICAgICogQHJldHVybiDkuIrnuqfoj5zljZVJROWtl+autQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmVudE1lbnVJZChKU09OT2JqZWN0IHBhcmFtc09iaikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBhcmFtc09iaikgJiYgcGFyYW1zT2JqLmNvbnRhaW5zS2V5KEdlbkNvbnN0YW50cy5QQVJFTlRfTUVOVV9JRCkKKyAgICAgICAgICAgICAgICAmJiBTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBhcmFtc09iai5nZXRTdHJpbmcoR2VuQ29uc3RhbnRzLlBBUkVOVF9NRU5VX0lEKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5QQVJFTlRfTUVOVV9JRCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERFRkFVTFRfUEFSRU5UX01FTlVfSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5qCR57yW56CBCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zT2JqIOeUn+aIkOWFtuS7lumAiemhuQorICAgICAqIEByZXR1cm4g5qCR57yW56CBCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJlZWNvZGUoSlNPTk9iamVjdCBwYXJhbXNPYmopCisgICAgeworICAgICAgICBpZiAocGFyYW1zT2JqLmNvbnRhaW5zS2V5KEdlbkNvbnN0YW50cy5UUkVFX0NPREUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMudG9DYW1lbENhc2UocGFyYW1zT2JqLmdldFN0cmluZyhHZW5Db25zdGFudHMuVFJFRV9DT0RFKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluagkeeItue8lueggQorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtc09iaiDnlJ/miJDlhbbku5bpgInpobkKKyAgICAgKiBAcmV0dXJuIOagkeeItue8lueggQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyZWVQYXJlbnRDb2RlKEpTT05PYmplY3QgcGFyYW1zT2JqKQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtc09iai5jb250YWluc0tleShHZW5Db25zdGFudHMuVFJFRV9QQVJFTlRfQ09ERSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy50b0NhbWVsQ2FzZShwYXJhbXNPYmouZ2V0U3RyaW5nKEdlbkNvbnN0YW50cy5UUkVFX1BBUkVOVF9DT0RFKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLkVNUFRZOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluagkeWQjeensAorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtc09iaiDnlJ/miJDlhbbku5bpgInpobkKKyAgICAgKiBAcmV0dXJuIOagkeWQjeensAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyZWVOYW1lKEpTT05PYmplY3QgcGFyYW1zT2JqKQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtc09iai5jb250YWluc0tleShHZW5Db25zdGFudHMuVFJFRV9OQU1FKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnRvQ2FtZWxDYXNlKHBhcmFtc09iai5nZXRTdHJpbmcoR2VuQ29uc3RhbnRzLlRSRUVfTkFNRSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpnIDopoHlnKjlk6rkuIDliJfkuIrpnaLmmL7npLrlsZXlvIDmjInpkq4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZW5UYWJsZSDkuJrliqHooajlr7nosaEKKyAgICAgKiBAcmV0dXJuIOWxleW8gOaMiemSruWIl+W6j+WPtworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEV4cGFuZENvbHVtbihHZW5UYWJsZSBnZW5UYWJsZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBvcHRpb25zID0gZ2VuVGFibGUuZ2V0T3B0aW9ucygpOworICAgICAgICBKU09OT2JqZWN0IHBhcmFtc09iaiA9IEpTT04ucGFyc2VPYmplY3Qob3B0aW9ucyk7CisgICAgICAgIFN0cmluZyB0cmVlTmFtZSA9IHBhcmFtc09iai5nZXRTdHJpbmcoR2VuQ29uc3RhbnRzLlRSRUVfTkFNRSk7CisgICAgICAgIGludCBudW0gPSAwOworICAgICAgICBmb3IgKEdlblRhYmxlQ29sdW1uIGNvbHVtbiA6IGdlblRhYmxlLmdldENvbHVtbnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbHVtbi5pc0xpc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uTmFtZSA9IGNvbHVtbi5nZXRDb2x1bW5OYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWUuZXF1YWxzKHRyZWVOYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvZ2VuZXJhdG9yLnltbCBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvZ2VuZXJhdG9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWFlNjhlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy9nZW5lcmF0b3IueW1sCkBAIC0wLDAgKzEsMTAgQEAKKyMg5Luj56CB55Sf5oiQCitnZW46CisgICMg5L2c6ICFCisgIGF1dGhvcjogcnVveWkKKyAgIyDpu5jorqTnlJ/miJDljIXot6/lvoQgc3lzdGVtIOmcgOaUueaIkOiHquW3seeahOaooeWdl+WQjeensCDlpoIgc3lzdGVtIG1vbml0b3IgdG9vbAorICBwYWNrYWdlTmFtZTogY29tLnJ1b3lpLnN5c3RlbQorICAjIOiHquWKqOWOu+mZpOihqOWJjee8gO+8jOm7mOiupOaYr2ZhbHNlCisgIGF1dG9SZW1vdmVQcmU6IGZhbHNlCisgICMg6KGo5YmN57yA77yI55Sf5oiQ57G75ZCN5LiN5Lya5YyF5ZCr6KGo5YmN57yA77yM5aSa5Liq55So6YCX5Y+35YiG6ZqU77yJCisgIHRhYmxlUHJlZml4OiBzeXNfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvZ2VuZXJhdG9yL0dlblRhYmxlQ29sdW1uTWFwcGVyLnhtbCBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL2dlbmVyYXRvci9HZW5UYWJsZUNvbHVtbk1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NTdlOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL2dlbmVyYXRvci9HZW5UYWJsZUNvbHVtbk1hcHBlci54bWwKQEAgLTAsMCArMSwxMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5nZW5lcmF0b3IubWFwcGVyLkdlblRhYmxlQ29sdW1uTWFwcGVyIj4KKworICAgIDxyZXN1bHRNYXAgdHlwZT0iR2VuVGFibGVDb2x1bW4iIGlkPSJHZW5UYWJsZUNvbHVtblJlc3VsdCI+CisgICAgICAgIDxpZCAgICAgcHJvcGVydHk9ImNvbHVtbklkIiAgICAgICBjb2x1bW49ImNvbHVtbl9pZCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ0YWJsZUlkIiAgICAgICAgY29sdW1uPSJ0YWJsZV9pZCIgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iY29sdW1uTmFtZSIgICAgIGNvbHVtbj0iY29sdW1uX25hbWUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNvbHVtbkNvbW1lbnQiICBjb2x1bW49ImNvbHVtbl9jb21tZW50IiAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb2x1bW5UeXBlIiAgICAgY29sdW1uPSJjb2x1bW5fdHlwZSIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iamF2YVR5cGUiICAgICAgIGNvbHVtbj0iamF2YV90eXBlIiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImphdmFGaWVsZCIgICAgICBjb2x1bW49ImphdmFfZmllbGQiICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJpc1BrIiAgICAgICAgICAgY29sdW1uPSJpc19wayIgICAgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iaXNJbmNyZW1lbnQiICAgIGNvbHVtbj0iaXNfaW5jcmVtZW50IiAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImlzUmVxdWlyZWQiICAgICBjb2x1bW49ImlzX3JlcXVpcmVkIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJpc0luc2VydCIgICAgICAgY29sdW1uPSJpc19pbnNlcnQiICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iaXNFZGl0IiAgICAgICAgIGNvbHVtbj0iaXNfZWRpdCIgICAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImlzTGlzdCIgICAgICAgICBjb2x1bW49ImlzX2xpc3QiICAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJpc1F1ZXJ5IiAgICAgICAgY29sdW1uPSJpc19xdWVyeSIgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icXVlcnlUeXBlIiAgICAgIGNvbHVtbj0icXVlcnlfdHlwZSIgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9Imh0bWxUeXBlIiAgICAgICBjb2x1bW49Imh0bWxfdHlwZSIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkaWN0VHlwZSIgICAgICAgY29sdW1uPSJkaWN0X3R5cGUiICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0ic29ydCIgICAgICAgICAgIGNvbHVtbj0ic29ydCIgICAgICAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZUJ5IiAgICAgICBjb2x1bW49ImNyZWF0ZV9ieSIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICAgY29sdW1uPSJjcmVhdGVfdGltZSIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlQnkiICAgICAgIGNvbHVtbj0idXBkYXRlX2J5IiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiICAgICBjb2x1bW49InVwZGF0ZV90aW1lIiAgICAvPgorICAgIDwvcmVzdWx0TWFwPgorCisJPHNxbCBpZD0ic2VsZWN0R2VuVGFibGVDb2x1bW5WbyI+CisgICAgICAgIHNlbGVjdCBjb2x1bW5faWQsIHRhYmxlX2lkLCBjb2x1bW5fbmFtZSwgY29sdW1uX2NvbW1lbnQsIGNvbHVtbl90eXBlLCBqYXZhX3R5cGUsIGphdmFfZmllbGQsIGlzX3BrLCBpc19pbmNyZW1lbnQsIGlzX3JlcXVpcmVkLCBpc19pbnNlcnQsIGlzX2VkaXQsIGlzX2xpc3QsIGlzX3F1ZXJ5LCBxdWVyeV90eXBlLCBodG1sX3R5cGUsIGRpY3RfdHlwZSwgc29ydCwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSBmcm9tIGdlbl90YWJsZV9jb2x1bW4KKyAgICA8L3NxbD4KKworICAgIDxzZWxlY3QgaWQ9InNlbGVjdEdlblRhYmxlQ29sdW1uTGlzdEJ5VGFibGVJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJHZW5UYWJsZUNvbHVtblJlc3VsdCI+CisgICAgICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3RHZW5UYWJsZUNvbHVtblZvIi8+CisgICAgICAgIHdoZXJlIHRhYmxlX2lkID0gI3t0YWJsZUlkfQorICAgICAgICBvcmRlciBieSBzb3J0CisgICAgPC9zZWxlY3Q+CisKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3REYlRhYmxlQ29sdW1uc0J5TmFtZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IkdlblRhYmxlQ29sdW1uUmVzdWx0Ij4KKwkJc2VsZWN0IGNvbHVtbl9uYW1lLCAoY2FzZSB3aGVuIChpc19udWxsYWJsZSA9ICdubycgPCFbQ0RBVEFbICYmIF1dPiBjb2x1bW5fa2V5ICE9ICdQUkknKSB0aGVuICcxJyBlbHNlICcwJyBlbmQpIGFzIGlzX3JlcXVpcmVkLCAoY2FzZSB3aGVuIGNvbHVtbl9rZXkgPSAnUFJJJyB0aGVuICcxJyBlbHNlICcwJyBlbmQpIGFzIGlzX3BrLCBvcmRpbmFsX3Bvc2l0aW9uIGFzIHNvcnQsIGNvbHVtbl9jb21tZW50LCAoY2FzZSB3aGVuIGV4dHJhID0gJ2F1dG9faW5jcmVtZW50JyB0aGVuICcxJyBlbHNlICcwJyBlbmQpIGFzIGlzX2luY3JlbWVudCwgY29sdW1uX3R5cGUKKwkJZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9zY2hlbWEgPSAoc2VsZWN0IGRhdGFiYXNlKCkpIGFuZCB0YWJsZV9uYW1lID0gKCN7dGFibGVOYW1lfSkKKwkJb3JkZXIgYnkgb3JkaW5hbF9wb3NpdGlvbgorCTwvc2VsZWN0PgorCisgICAgPGluc2VydCBpZD0iaW5zZXJ0R2VuVGFibGVDb2x1bW4iIHBhcmFtZXRlclR5cGU9IkdlblRhYmxlQ29sdW1uIiB1c2VHZW5lcmF0ZWRLZXlzPSJ0cnVlIiBrZXlQcm9wZXJ0eT0iY29sdW1uSWQiPgorICAgICAgICBpbnNlcnQgaW50byBnZW5fdGFibGVfY29sdW1uICgKKwkJCTxpZiB0ZXN0PSJ0YWJsZUlkICE9IG51bGwgYW5kIHRhYmxlSWQgIT0gJyciPnRhYmxlX2lkLDwvaWY+CisJCQk8aWYgdGVzdD0iY29sdW1uTmFtZSAhPSBudWxsIGFuZCBjb2x1bW5OYW1lICE9ICcnIj5jb2x1bW5fbmFtZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbHVtbkNvbW1lbnQgIT0gbnVsbCBhbmQgY29sdW1uQ29tbWVudCAhPSAnJyI+Y29sdW1uX2NvbW1lbnQsPC9pZj4KKwkJCTxpZiB0ZXN0PSJjb2x1bW5UeXBlICE9IG51bGwgYW5kIGNvbHVtblR5cGUgIT0gJyciPmNvbHVtbl90eXBlLDwvaWY+CisJCQk8aWYgdGVzdD0iamF2YVR5cGUgIT0gbnVsbCBhbmQgamF2YVR5cGUgIT0gJyciPmphdmFfdHlwZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImphdmFGaWVsZCAhPSBudWxsICBhbmQgamF2YUZpZWxkICE9ICcnIj5qYXZhX2ZpZWxkLDwvaWY+CisJCQk8aWYgdGVzdD0iaXNQayAhPSBudWxsIGFuZCBpc1BrICE9ICcnIj5pc19wayw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzSW5jcmVtZW50ICE9IG51bGwgYW5kIGlzSW5jcmVtZW50ICE9ICcnIj5pc19pbmNyZW1lbnQsPC9pZj4KKwkJCTxpZiB0ZXN0PSJpc1JlcXVpcmVkICE9IG51bGwgYW5kIGlzUmVxdWlyZWQgIT0gJyciPmlzX3JlcXVpcmVkLDwvaWY+CisJCQk8aWYgdGVzdD0iaXNJbnNlcnQgIT0gbnVsbCBhbmQgaXNJbnNlcnQgIT0gJyciPmlzX2luc2VydCw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzRWRpdCAhPSBudWxsIGFuZCBpc0VkaXQgIT0gJyciPmlzX2VkaXQsPC9pZj4KKwkJCTxpZiB0ZXN0PSJpc0xpc3QgIT0gbnVsbCBhbmQgaXNMaXN0ICE9ICcnIj5pc19saXN0LDwvaWY+CisJCQk8aWYgdGVzdD0iaXNRdWVyeSAhPSBudWxsIGFuZCBpc1F1ZXJ5ICE9ICcnIj5pc19xdWVyeSw8L2lmPgorCQkJPGlmIHRlc3Q9InF1ZXJ5VHlwZSAhPSBudWxsIGFuZCBxdWVyeVR5cGUgIT0gJyciPnF1ZXJ5X3R5cGUsPC9pZj4KKwkJCTxpZiB0ZXN0PSJodG1sVHlwZSAhPSBudWxsIGFuZCBodG1sVHlwZSAhPSAnJyI+aHRtbF90eXBlLDwvaWY+CisJCQk8aWYgdGVzdD0iZGljdFR5cGUgIT0gbnVsbCBhbmQgZGljdFR5cGUgIT0gJyciPmRpY3RfdHlwZSw8L2lmPgorCQkJPGlmIHRlc3Q9InNvcnQgIT0gbnVsbCI+c29ydCw8L2lmPgorCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj5jcmVhdGVfYnksPC9pZj4KKwkJCWNyZWF0ZV90aW1lCisgICAgICAgICApdmFsdWVzKAorCQkJPGlmIHRlc3Q9InRhYmxlSWQgIT0gbnVsbCBhbmQgdGFibGVJZCAhPSAnJyI+I3t0YWJsZUlkfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbHVtbk5hbWUgIT0gbnVsbCBhbmQgY29sdW1uTmFtZSAhPSAnJyI+I3tjb2x1bW5OYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbHVtbkNvbW1lbnQgIT0gbnVsbCBhbmQgY29sdW1uQ29tbWVudCAhPSAnJyI+I3tjb2x1bW5Db21tZW50fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbHVtblR5cGUgIT0gbnVsbCBhbmQgY29sdW1uVHlwZSAhPSAnJyI+I3tjb2x1bW5UeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImphdmFUeXBlICE9IG51bGwgYW5kIGphdmFUeXBlICE9ICcnIj4je2phdmFUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImphdmFGaWVsZCAhPSBudWxsIGFuZCBqYXZhRmllbGQgIT0gJyciPiN7amF2YUZpZWxkfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzUGsgIT0gbnVsbCBhbmQgaXNQayAhPSAnJyI+I3tpc1BrfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzSW5jcmVtZW50ICE9IG51bGwgYW5kIGlzSW5jcmVtZW50ICE9ICcnIj4je2lzSW5jcmVtZW50fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzUmVxdWlyZWQgIT0gbnVsbCBhbmQgaXNSZXF1aXJlZCAhPSAnJyI+I3tpc1JlcXVpcmVkfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzSW5zZXJ0ICE9IG51bGwgYW5kIGlzSW5zZXJ0ICE9ICcnIj4je2lzSW5zZXJ0fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzRWRpdCAhPSBudWxsIGFuZCBpc0VkaXQgIT0gJyciPiN7aXNFZGl0fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzTGlzdCAhPSBudWxsIGFuZCBpc0xpc3QgIT0gJyciPiN7aXNMaXN0fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzUXVlcnkgIT0gbnVsbCBhbmQgaXNRdWVyeSAhPSAnJyI+I3tpc1F1ZXJ5fSw8L2lmPgorCQkJPGlmIHRlc3Q9InF1ZXJ5VHlwZSAhPSBudWxsIGFuZCBxdWVyeVR5cGUgIT0gJyciPiN7cXVlcnlUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9Imh0bWxUeXBlICE9IG51bGwgYW5kIGh0bWxUeXBlICE9ICcnIj4je2h0bWxUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImRpY3RUeXBlICE9IG51bGwgYW5kIGRpY3RUeXBlICE9ICcnIj4je2RpY3RUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9InNvcnQgIT0gbnVsbCI+I3tzb3J0fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj4je2NyZWF0ZUJ5fSw8L2lmPgorCQkJc3lzZGF0ZSgpCisgICAgICAgICApCisgICAgPC9pbnNlcnQ+CisKKyAgICA8dXBkYXRlIGlkPSJ1cGRhdGVHZW5UYWJsZUNvbHVtbiIgcGFyYW1ldGVyVHlwZT0iR2VuVGFibGVDb2x1bW4iPgorICAgICAgICB1cGRhdGUgZ2VuX3RhYmxlX2NvbHVtbgorICAgICAgICA8c2V0PgorICAgICAgICAgICAgPGlmIHRlc3Q9ImNvbHVtbkNvbW1lbnQgIT0gbnVsbCI+Y29sdW1uX2NvbW1lbnQgPSAje2NvbHVtbkNvbW1lbnR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iamF2YVR5cGUgIT0gbnVsbCI+amF2YV90eXBlID0gI3tqYXZhVHlwZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJqYXZhRmllbGQgIT0gbnVsbCI+amF2YV9maWVsZCA9ICN7amF2YUZpZWxkfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImlzSW5zZXJ0ICE9IG51bGwiPmlzX2luc2VydCA9ICN7aXNJbnNlcnR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iaXNFZGl0ICE9IG51bGwiPmlzX2VkaXQgPSAje2lzRWRpdH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJpc0xpc3QgIT0gbnVsbCI+aXNfbGlzdCA9ICN7aXNMaXN0fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImlzUXVlcnkgIT0gbnVsbCI+aXNfcXVlcnkgPSAje2lzUXVlcnl9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iaXNSZXF1aXJlZCAhPSBudWxsIj5pc19yZXF1aXJlZCA9ICN7aXNSZXF1aXJlZH0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJxdWVyeVR5cGUgIT0gbnVsbCI+cXVlcnlfdHlwZSA9ICN7cXVlcnlUeXBlfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9Imh0bWxUeXBlICE9IG51bGwiPmh0bWxfdHlwZSA9ICN7aHRtbFR5cGV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZGljdFR5cGUgIT0gbnVsbCI+ZGljdF90eXBlID0gI3tkaWN0VHlwZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJzb3J0ICE9IG51bGwiPnNvcnQgPSAje3NvcnR9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKyAgICAgICAgICAgIHVwZGF0ZV90aW1lID0gc3lzZGF0ZSgpCisgICAgICAgIDwvc2V0PgorICAgICAgICB3aGVyZSBjb2x1bW5faWQgPSAje2NvbHVtbklkfQorICAgIDwvdXBkYXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlR2VuVGFibGVDb2x1bW5CeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIGdlbl90YWJsZV9jb2x1bW4gd2hlcmUgdGFibGVfaWQgaW4KKyAgICAgICAgPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09InRhYmxlSWQiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorICAgICAgICAgICAgI3t0YWJsZUlkfQorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC9kZWxldGU+CisKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGVHZW5UYWJsZUNvbHVtbnMiPgorICAgICAgICBkZWxldGUgZnJvbSBnZW5fdGFibGVfY29sdW1uIHdoZXJlIGNvbHVtbl9pZCBpbgorICAgICAgICA8Zm9yZWFjaCBjb2xsZWN0aW9uPSJsaXN0IiBpdGVtPSJpdGVtIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAgICAgICAgICAgICN7aXRlbS5jb2x1bW5JZH0KKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvZGVsZXRlPgorCis8L21hcHBlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9nZW5lcmF0b3IvR2VuVGFibGVNYXBwZXIueG1sIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvZ2VuZXJhdG9yL0dlblRhYmxlTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTExMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvZ2VuZXJhdG9yL0dlblRhYmxlTWFwcGVyLnhtbApAQCAtMCwwICsxLDIxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLmdlbmVyYXRvci5tYXBwZXIuR2VuVGFibGVNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJHZW5UYWJsZSIgaWQ9IkdlblRhYmxlUmVzdWx0Ij4KKwkgICAgPGlkICAgICBwcm9wZXJ0eT0idGFibGVJZCIgICAgICAgIGNvbHVtbj0idGFibGVfaWQiICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InRhYmxlTmFtZSIgICAgICBjb2x1bW49InRhYmxlX25hbWUiICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ0YWJsZUNvbW1lbnQiICAgY29sdW1uPSJ0YWJsZV9jb21tZW50IiAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ic3ViVGFibGVOYW1lIiAgIGNvbHVtbj0ic3ViX3RhYmxlX25hbWUiICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN1YlRhYmxlRmtOYW1lIiBjb2x1bW49InN1Yl90YWJsZV9ma19uYW1lIiAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjbGFzc05hbWUiICAgICAgY29sdW1uPSJjbGFzc19uYW1lIiAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idHBsQ2F0ZWdvcnkiICAgIGNvbHVtbj0idHBsX2NhdGVnb3J5IiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InRwbFdlYlR5cGUiICAgICBjb2x1bW49InRwbF93ZWJfdHlwZSIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJwYWNrYWdlTmFtZSIgICAgY29sdW1uPSJwYWNrYWdlX25hbWUiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ibW9kdWxlTmFtZSIgICAgIGNvbHVtbj0ibW9kdWxlX25hbWUiICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImJ1c2luZXNzTmFtZSIgICBjb2x1bW49ImJ1c2luZXNzX25hbWUiICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJmdW5jdGlvbk5hbWUiICAgY29sdW1uPSJmdW5jdGlvbl9uYW1lIiAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iZnVuY3Rpb25BdXRob3IiIGNvbHVtbj0iZnVuY3Rpb25fYXV0aG9yIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImdlblR5cGUiICAgICAgICBjb2x1bW49Imdlbl90eXBlIiAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJnZW5QYXRoIiAgICAgICAgY29sdW1uPSJnZW5fcGF0aCIgICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ib3B0aW9ucyIgICAgICAgIGNvbHVtbj0ib3B0aW9ucyIgICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZUJ5IiAgICAgICBjb2x1bW49ImNyZWF0ZV9ieSIgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICAgY29sdW1uPSJjcmVhdGVfdGltZSIgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlQnkiICAgICAgIGNvbHVtbj0idXBkYXRlX2J5IiAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiICAgICBjb2x1bW49InVwZGF0ZV90aW1lIiAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyZW1hcmsiICAgICAgICAgY29sdW1uPSJyZW1hcmsiICAgICAgICAgICAgLz4KKwkJPGNvbGxlY3Rpb24gIHByb3BlcnR5PSJjb2x1bW5zIiAgIGphdmFUeXBlPSJqYXZhLnV0aWwuTGlzdCIgIHJlc3VsdE1hcD0iR2VuVGFibGVDb2x1bW5SZXN1bHQiIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHJlc3VsdE1hcCB0eXBlPSJHZW5UYWJsZUNvbHVtbiIgaWQ9IkdlblRhYmxlQ29sdW1uUmVzdWx0Ij4KKyAgICAgICAgPGlkICAgICBwcm9wZXJ0eT0iY29sdW1uSWQiICAgICAgIGNvbHVtbj0iY29sdW1uX2lkIiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InRhYmxlSWQiICAgICAgICBjb2x1bW49InRhYmxlX2lkIiAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb2x1bW5OYW1lIiAgICAgY29sdW1uPSJjb2x1bW5fbmFtZSIgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iY29sdW1uQ29tbWVudCIgIGNvbHVtbj0iY29sdW1uX2NvbW1lbnQiIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNvbHVtblR5cGUiICAgICBjb2x1bW49ImNvbHVtbl90eXBlIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJqYXZhVHlwZSIgICAgICAgY29sdW1uPSJqYXZhX3R5cGUiICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iamF2YUZpZWxkIiAgICAgIGNvbHVtbj0iamF2YV9maWVsZCIgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImlzUGsiICAgICAgICAgICBjb2x1bW49ImlzX3BrIiAgICAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJpc0luY3JlbWVudCIgICAgY29sdW1uPSJpc19pbmNyZW1lbnQiICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iaXNSZXF1aXJlZCIgICAgIGNvbHVtbj0iaXNfcmVxdWlyZWQiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImlzSW5zZXJ0IiAgICAgICBjb2x1bW49ImlzX2luc2VydCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJpc0VkaXQiICAgICAgICAgY29sdW1uPSJpc19lZGl0IiAgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iaXNMaXN0IiAgICAgICAgIGNvbHVtbj0iaXNfbGlzdCIgICAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImlzUXVlcnkiICAgICAgICBjb2x1bW49ImlzX3F1ZXJ5IiAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJxdWVyeVR5cGUiICAgICAgY29sdW1uPSJxdWVyeV90eXBlIiAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iaHRtbFR5cGUiICAgICAgIGNvbHVtbj0iaHRtbF90eXBlIiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImRpY3RUeXBlIiAgICAgICBjb2x1bW49ImRpY3RfdHlwZSIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJzb3J0IiAgICAgICAgICAgY29sdW1uPSJzb3J0IiAgICAgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlQnkiICAgICAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiICAgICBjb2x1bW49ImNyZWF0ZV90aW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgICAgY29sdW1uPSJ1cGRhdGVfYnkiICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlVGltZSIgICAgIGNvbHVtbj0idXBkYXRlX3RpbWUiICAgIC8+CisgICAgPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0R2VuVGFibGVWbyI+CisgICAgICAgIHNlbGVjdCB0YWJsZV9pZCwgdGFibGVfbmFtZSwgdGFibGVfY29tbWVudCwgc3ViX3RhYmxlX25hbWUsIHN1Yl90YWJsZV9ma19uYW1lLCBjbGFzc19uYW1lLCB0cGxfY2F0ZWdvcnksIHRwbF93ZWJfdHlwZSwgcGFja2FnZV9uYW1lLCBtb2R1bGVfbmFtZSwgYnVzaW5lc3NfbmFtZSwgZnVuY3Rpb25fbmFtZSwgZnVuY3Rpb25fYXV0aG9yLCBnZW5fdHlwZSwgZ2VuX3BhdGgsIG9wdGlvbnMsIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyayBmcm9tIGdlbl90YWJsZQorICAgIDwvc3FsPgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdEdlblRhYmxlTGlzdCIgcGFyYW1ldGVyVHlwZT0iR2VuVGFibGUiIHJlc3VsdE1hcD0iR2VuVGFibGVSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0R2VuVGFibGVWbyIvPgorCQk8d2hlcmU+CisJCQk8aWYgdGVzdD0idGFibGVOYW1lICE9IG51bGwgYW5kIHRhYmxlTmFtZSAhPSAnJyI+CisJCQkJQU5EIGxvd2VyKHRhYmxlX25hbWUpIGxpa2UgbG93ZXIoY29uY2F0KCclJywgI3t0YWJsZU5hbWV9LCAnJScpKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJ0YWJsZUNvbW1lbnQgIT0gbnVsbCBhbmQgdGFibGVDb21tZW50ICE9ICcnIj4KKwkJCQlBTkQgbG93ZXIodGFibGVfY29tbWVudCkgbGlrZSBsb3dlcihjb25jYXQoJyUnLCAje3RhYmxlQ29tbWVudH0sICclJykpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InBhcmFtcy5iZWdpblRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmJlZ2luVGltZSAhPSAnJyI+PCEtLSDlvIDlp4vml7bpl7Tmo4DntKIgLS0+CisJCQkJQU5EIGRhdGVfZm9ybWF0KGNyZWF0ZV90aW1lLCclWSVtJWQnKSAmZ3Q7PSBkYXRlX2Zvcm1hdCgje3BhcmFtcy5iZWdpblRpbWV9LCclWSVtJWQnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwYXJhbXMuZW5kVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kVGltZSAhPSAnJyI+PCEtLSDnu5PmnZ/ml7bpl7Tmo4DntKIgLS0+CisJCQkJQU5EIGRhdGVfZm9ybWF0KGNyZWF0ZV90aW1lLCclWSVtJWQnKSAmbHQ7PSBkYXRlX2Zvcm1hdCgje3BhcmFtcy5lbmRUaW1lfSwnJVklbSVkJykKKwkJCTwvaWY+CisJCTwvd2hlcmU+CisJPC9zZWxlY3Q+CisKKwk8c2VsZWN0IGlkPSJzZWxlY3REYlRhYmxlTGlzdCIgcGFyYW1ldGVyVHlwZT0iR2VuVGFibGUiIHJlc3VsdE1hcD0iR2VuVGFibGVSZXN1bHQiPgorCQlzZWxlY3QgdGFibGVfbmFtZSwgdGFibGVfY29tbWVudCwgY3JlYXRlX3RpbWUsIHVwZGF0ZV90aW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcworCQl3aGVyZSB0YWJsZV9zY2hlbWEgPSAoc2VsZWN0IGRhdGFiYXNlKCkpCisJCUFORCB0YWJsZV9uYW1lIE5PVCBMSUtFICdxcnR6XF8lJyBBTkQgdGFibGVfbmFtZSBOT1QgTElLRSAnZ2VuXF8lJworCQlBTkQgdGFibGVfbmFtZSBOT1QgSU4gKHNlbGVjdCB0YWJsZV9uYW1lIGZyb20gZ2VuX3RhYmxlKQorCQk8aWYgdGVzdD0idGFibGVOYW1lICE9IG51bGwgYW5kIHRhYmxlTmFtZSAhPSAnJyI+CisJCQlBTkQgbG93ZXIodGFibGVfbmFtZSkgbGlrZSBsb3dlcihjb25jYXQoJyUnLCAje3RhYmxlTmFtZX0sICclJykpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJ0YWJsZUNvbW1lbnQgIT0gbnVsbCBhbmQgdGFibGVDb21tZW50ICE9ICcnIj4KKwkJCUFORCBsb3dlcih0YWJsZV9jb21tZW50KSBsaWtlIGxvd2VyKGNvbmNhdCgnJScsICN7dGFibGVDb21tZW50fSwgJyUnKSkKKwkJPC9pZj4KKwkJPGlmIHRlc3Q9InBhcmFtcy5iZWdpblRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmJlZ2luVGltZSAhPSAnJyI+PCEtLSDlvIDlp4vml7bpl7Tmo4DntKIgLS0+CisJCQlBTkQgZGF0ZV9mb3JtYXQoY3JlYXRlX3RpbWUsJyVZJW0lZCcpICZndDs9IGRhdGVfZm9ybWF0KCN7cGFyYW1zLmJlZ2luVGltZX0sJyVZJW0lZCcpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJwYXJhbXMuZW5kVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kVGltZSAhPSAnJyI+PCEtLSDnu5PmnZ/ml7bpl7Tmo4DntKIgLS0+CisJCQlBTkQgZGF0ZV9mb3JtYXQoY3JlYXRlX3RpbWUsJyVZJW0lZCcpICZsdDs9IGRhdGVfZm9ybWF0KCN7cGFyYW1zLmVuZFRpbWV9LCclWSVtJWQnKQorCQk8L2lmPgorICAgICAgICBvcmRlciBieSBjcmVhdGVfdGltZSBkZXNjCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0RGJUYWJsZUxpc3RCeU5hbWVzIiByZXN1bHRNYXA9IkdlblRhYmxlUmVzdWx0Ij4KKwkJc2VsZWN0IHRhYmxlX25hbWUsIHRhYmxlX2NvbW1lbnQsIGNyZWF0ZV90aW1lLCB1cGRhdGVfdGltZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMKKwkJd2hlcmUgdGFibGVfbmFtZSBOT1QgTElLRSAncXJ0elxfJScgYW5kIHRhYmxlX25hbWUgTk9UIExJS0UgJ2dlblxfJScgYW5kIHRhYmxlX3NjaGVtYSA9IChzZWxlY3QgZGF0YWJhc2UoKSkKKwkJYW5kIHRhYmxlX25hbWUgaW4KKwkgICAgPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09Im5hbWUiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorIAkJCSN7bmFtZX0KKyAgICAgICAgPC9mb3JlYWNoPiAKKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RUYWJsZUJ5TmFtZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IkdlblRhYmxlUmVzdWx0Ij4KKwkJc2VsZWN0IHRhYmxlX25hbWUsIHRhYmxlX2NvbW1lbnQsIGNyZWF0ZV90aW1lLCB1cGRhdGVfdGltZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMKKwkJd2hlcmUgdGFibGVfY29tbWVudCA8IVtDREFUQVsgPD4gXV0+ICcnIGFuZCB0YWJsZV9zY2hlbWEgPSAoc2VsZWN0IGRhdGFiYXNlKCkpCisJCWFuZCB0YWJsZV9uYW1lID0gI3t0YWJsZU5hbWV9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0R2VuVGFibGVCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IkdlblRhYmxlUmVzdWx0Ij4KKwkgICAgU0VMRUNUIHQudGFibGVfaWQsIHQudGFibGVfbmFtZSwgdC50YWJsZV9jb21tZW50LCB0LnN1Yl90YWJsZV9uYW1lLCB0LnN1Yl90YWJsZV9ma19uYW1lLCB0LmNsYXNzX25hbWUsIHQudHBsX2NhdGVnb3J5LCB0LnRwbF93ZWJfdHlwZSwgdC5wYWNrYWdlX25hbWUsIHQubW9kdWxlX25hbWUsIHQuYnVzaW5lc3NfbmFtZSwgdC5mdW5jdGlvbl9uYW1lLCB0LmZ1bmN0aW9uX2F1dGhvciwgdC5nZW5fdHlwZSwgdC5nZW5fcGF0aCwgdC5vcHRpb25zLCB0LnJlbWFyaywKKwkJCSAgIGMuY29sdW1uX2lkLCBjLmNvbHVtbl9uYW1lLCBjLmNvbHVtbl9jb21tZW50LCBjLmNvbHVtbl90eXBlLCBjLmphdmFfdHlwZSwgYy5qYXZhX2ZpZWxkLCBjLmlzX3BrLCBjLmlzX2luY3JlbWVudCwgYy5pc19yZXF1aXJlZCwgYy5pc19pbnNlcnQsIGMuaXNfZWRpdCwgYy5pc19saXN0LCBjLmlzX3F1ZXJ5LCBjLnF1ZXJ5X3R5cGUsIGMuaHRtbF90eXBlLCBjLmRpY3RfdHlwZSwgYy5zb3J0CisJCUZST00gZ2VuX3RhYmxlIHQKKwkJCSBMRUZUIEpPSU4gZ2VuX3RhYmxlX2NvbHVtbiBjIE9OIHQudGFibGVfaWQgPSBjLnRhYmxlX2lkCisJCXdoZXJlIHQudGFibGVfaWQgPSAje3RhYmxlSWR9IG9yZGVyIGJ5IGMuc29ydAorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdEdlblRhYmxlQnlOYW1lIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iR2VuVGFibGVSZXN1bHQiPgorCSAgICBTRUxFQ1QgdC50YWJsZV9pZCwgdC50YWJsZV9uYW1lLCB0LnRhYmxlX2NvbW1lbnQsIHQuc3ViX3RhYmxlX25hbWUsIHQuc3ViX3RhYmxlX2ZrX25hbWUsIHQuY2xhc3NfbmFtZSwgdC50cGxfY2F0ZWdvcnksIHQudHBsX3dlYl90eXBlLCB0LnBhY2thZ2VfbmFtZSwgdC5tb2R1bGVfbmFtZSwgdC5idXNpbmVzc19uYW1lLCB0LmZ1bmN0aW9uX25hbWUsIHQuZnVuY3Rpb25fYXV0aG9yLCB0Lmdlbl90eXBlLCB0Lmdlbl9wYXRoLCB0Lm9wdGlvbnMsIHQucmVtYXJrLAorCQkJICAgYy5jb2x1bW5faWQsIGMuY29sdW1uX25hbWUsIGMuY29sdW1uX2NvbW1lbnQsIGMuY29sdW1uX3R5cGUsIGMuamF2YV90eXBlLCBjLmphdmFfZmllbGQsIGMuaXNfcGssIGMuaXNfaW5jcmVtZW50LCBjLmlzX3JlcXVpcmVkLCBjLmlzX2luc2VydCwgYy5pc19lZGl0LCBjLmlzX2xpc3QsIGMuaXNfcXVlcnksIGMucXVlcnlfdHlwZSwgYy5odG1sX3R5cGUsIGMuZGljdF90eXBlLCBjLnNvcnQKKwkJRlJPTSBnZW5fdGFibGUgdAorCQkJIExFRlQgSk9JTiBnZW5fdGFibGVfY29sdW1uIGMgT04gdC50YWJsZV9pZCA9IGMudGFibGVfaWQKKwkJd2hlcmUgdC50YWJsZV9uYW1lID0gI3t0YWJsZU5hbWV9IG9yZGVyIGJ5IGMuc29ydAorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdEdlblRhYmxlQWxsIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iR2VuVGFibGVSZXN1bHQiPgorCSAgICBTRUxFQ1QgdC50YWJsZV9pZCwgdC50YWJsZV9uYW1lLCB0LnRhYmxlX2NvbW1lbnQsIHQuc3ViX3RhYmxlX25hbWUsIHQuc3ViX3RhYmxlX2ZrX25hbWUsIHQuY2xhc3NfbmFtZSwgdC50cGxfY2F0ZWdvcnksIHQudHBsX3dlYl90eXBlLCB0LnBhY2thZ2VfbmFtZSwgdC5tb2R1bGVfbmFtZSwgdC5idXNpbmVzc19uYW1lLCB0LmZ1bmN0aW9uX25hbWUsIHQuZnVuY3Rpb25fYXV0aG9yLCB0Lm9wdGlvbnMsIHQucmVtYXJrLAorCQkJICAgYy5jb2x1bW5faWQsIGMuY29sdW1uX25hbWUsIGMuY29sdW1uX2NvbW1lbnQsIGMuY29sdW1uX3R5cGUsIGMuamF2YV90eXBlLCBjLmphdmFfZmllbGQsIGMuaXNfcGssIGMuaXNfaW5jcmVtZW50LCBjLmlzX3JlcXVpcmVkLCBjLmlzX2luc2VydCwgYy5pc19lZGl0LCBjLmlzX2xpc3QsIGMuaXNfcXVlcnksIGMucXVlcnlfdHlwZSwgYy5odG1sX3R5cGUsIGMuZGljdF90eXBlLCBjLnNvcnQKKwkJRlJPTSBnZW5fdGFibGUgdAorCQkJIExFRlQgSk9JTiBnZW5fdGFibGVfY29sdW1uIGMgT04gdC50YWJsZV9pZCA9IGMudGFibGVfaWQKKwkJb3JkZXIgYnkgYy5zb3J0CisJPC9zZWxlY3Q+CisJCisJPGluc2VydCBpZD0iaW5zZXJ0R2VuVGFibGUiIHBhcmFtZXRlclR5cGU9IkdlblRhYmxlIiB1c2VHZW5lcmF0ZWRLZXlzPSJ0cnVlIiBrZXlQcm9wZXJ0eT0idGFibGVJZCI+CisgICAgICAgIGluc2VydCBpbnRvIGdlbl90YWJsZSAoCisJCQk8aWYgdGVzdD0idGFibGVOYW1lICE9IG51bGwiPnRhYmxlX25hbWUsPC9pZj4KKwkJCTxpZiB0ZXN0PSJ0YWJsZUNvbW1lbnQgIT0gbnVsbCBhbmQgdGFibGVDb21tZW50ICE9ICcnIj50YWJsZV9jb21tZW50LDwvaWY+CisJCQk8aWYgdGVzdD0iY2xhc3NOYW1lICE9IG51bGwgYW5kIGNsYXNzTmFtZSAhPSAnJyI+Y2xhc3NfbmFtZSw8L2lmPgorCQkJPGlmIHRlc3Q9InRwbENhdGVnb3J5ICE9IG51bGwgYW5kIHRwbENhdGVnb3J5ICE9ICcnIj50cGxfY2F0ZWdvcnksPC9pZj4KKwkJCTxpZiB0ZXN0PSJ0cGxXZWJUeXBlICE9IG51bGwgYW5kIHRwbFdlYlR5cGUgIT0gJyciPnRwbF93ZWJfdHlwZSw8L2lmPgorCQkJPGlmIHRlc3Q9InBhY2thZ2VOYW1lICE9IG51bGwgYW5kIHBhY2thZ2VOYW1lICE9ICcnIj5wYWNrYWdlX25hbWUsPC9pZj4KKwkJCTxpZiB0ZXN0PSJtb2R1bGVOYW1lICE9IG51bGwgYW5kIG1vZHVsZU5hbWUgIT0gJyciPm1vZHVsZV9uYW1lLDwvaWY+CisJCQk8aWYgdGVzdD0iYnVzaW5lc3NOYW1lICE9IG51bGwgYW5kIGJ1c2luZXNzTmFtZSAhPSAnJyI+YnVzaW5lc3NfbmFtZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImZ1bmN0aW9uTmFtZSAhPSBudWxsIGFuZCBmdW5jdGlvbk5hbWUgIT0gJyciPmZ1bmN0aW9uX25hbWUsPC9pZj4KKwkJCTxpZiB0ZXN0PSJmdW5jdGlvbkF1dGhvciAhPSBudWxsIGFuZCBmdW5jdGlvbkF1dGhvciAhPSAnJyI+ZnVuY3Rpb25fYXV0aG9yLDwvaWY+CisJCQk8aWYgdGVzdD0iZ2VuVHlwZSAhPSBudWxsIGFuZCBnZW5UeXBlICE9ICcnIj5nZW5fdHlwZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImdlblBhdGggIT0gbnVsbCBhbmQgZ2VuUGF0aCAhPSAnJyI+Z2VuX3BhdGgsPC9pZj4KKwkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmssPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPmNyZWF0ZV9ieSw8L2lmPgorCQkJY3JlYXRlX3RpbWUKKyAgICAgICAgICl2YWx1ZXMoCisJCQk8aWYgdGVzdD0idGFibGVOYW1lICE9IG51bGwiPiN7dGFibGVOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9InRhYmxlQ29tbWVudCAhPSBudWxsIGFuZCB0YWJsZUNvbW1lbnQgIT0gJyciPiN7dGFibGVDb21tZW50fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNsYXNzTmFtZSAhPSBudWxsIGFuZCBjbGFzc05hbWUgIT0gJyciPiN7Y2xhc3NOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9InRwbENhdGVnb3J5ICE9IG51bGwgYW5kIHRwbENhdGVnb3J5ICE9ICcnIj4je3RwbENhdGVnb3J5fSw8L2lmPgorCQkJPGlmIHRlc3Q9InRwbFdlYlR5cGUgIT0gbnVsbCBhbmQgdHBsV2ViVHlwZSAhPSAnJyI+I3t0cGxXZWJUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9InBhY2thZ2VOYW1lICE9IG51bGwgYW5kIHBhY2thZ2VOYW1lICE9ICcnIj4je3BhY2thZ2VOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9Im1vZHVsZU5hbWUgIT0gbnVsbCBhbmQgbW9kdWxlTmFtZSAhPSAnJyI+I3ttb2R1bGVOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImJ1c2luZXNzTmFtZSAhPSBudWxsIGFuZCBidXNpbmVzc05hbWUgIT0gJyciPiN7YnVzaW5lc3NOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImZ1bmN0aW9uTmFtZSAhPSBudWxsIGFuZCBmdW5jdGlvbk5hbWUgIT0gJyciPiN7ZnVuY3Rpb25OYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImZ1bmN0aW9uQXV0aG9yICE9IG51bGwgYW5kIGZ1bmN0aW9uQXV0aG9yICE9ICcnIj4je2Z1bmN0aW9uQXV0aG9yfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImdlblR5cGUgIT0gbnVsbCBhbmQgZ2VuVHlwZSAhPSAnJyI+I3tnZW5UeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImdlblBhdGggIT0gbnVsbCBhbmQgZ2VuUGF0aCAhPSAnJyI+I3tnZW5QYXRofSw8L2lmPgorCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+I3tjcmVhdGVCeX0sPC9pZj4KKwkJCXN5c2RhdGUoKQorICAgICAgICAgKQorICAgIDwvaW5zZXJ0PgorICAgIAorICAgIDx1cGRhdGUgaWQ9ImNyZWF0ZVRhYmxlIj4KKyAgICAgICAgJHtzcWx9CisgICAgPC91cGRhdGU+CisgICAgCisgICAgPHVwZGF0ZSBpZD0idXBkYXRlR2VuVGFibGUiIHBhcmFtZXRlclR5cGU9IkdlblRhYmxlIj4KKyAgICAgICAgdXBkYXRlIGdlbl90YWJsZQorICAgICAgICA8c2V0PgorICAgICAgICAgICAgPGlmIHRlc3Q9InRhYmxlTmFtZSAhPSBudWxsIj50YWJsZV9uYW1lID0gI3t0YWJsZU5hbWV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idGFibGVDb21tZW50ICE9IG51bGwgYW5kIHRhYmxlQ29tbWVudCAhPSAnJyI+dGFibGVfY29tbWVudCA9ICN7dGFibGVDb21tZW50fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN1YlRhYmxlTmFtZSAhPSBudWxsIj5zdWJfdGFibGVfbmFtZSA9ICN7c3ViVGFibGVOYW1lfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN1YlRhYmxlRmtOYW1lICE9IG51bGwiPnN1Yl90YWJsZV9ma19uYW1lID0gI3tzdWJUYWJsZUZrTmFtZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjbGFzc05hbWUgIT0gbnVsbCBhbmQgY2xhc3NOYW1lICE9ICcnIj5jbGFzc19uYW1lID0gI3tjbGFzc05hbWV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZnVuY3Rpb25BdXRob3IgIT0gbnVsbCBhbmQgZnVuY3Rpb25BdXRob3IgIT0gJyciPmZ1bmN0aW9uX2F1dGhvciA9ICN7ZnVuY3Rpb25BdXRob3J9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iZ2VuVHlwZSAhPSBudWxsIGFuZCBnZW5UeXBlICE9ICcnIj5nZW5fdHlwZSA9ICN7Z2VuVHlwZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJnZW5QYXRoICE9IG51bGwgYW5kIGdlblBhdGggIT0gJyciPmdlbl9wYXRoID0gI3tnZW5QYXRofSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRwbENhdGVnb3J5ICE9IG51bGwgYW5kIHRwbENhdGVnb3J5ICE9ICcnIj50cGxfY2F0ZWdvcnkgPSAje3RwbENhdGVnb3J5fSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InRwbFdlYlR5cGUgIT0gbnVsbCBhbmQgdHBsV2ViVHlwZSAhPSAnJyI+dHBsX3dlYl90eXBlID0gI3t0cGxXZWJUeXBlfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InBhY2thZ2VOYW1lICE9IG51bGwgYW5kIHBhY2thZ2VOYW1lICE9ICcnIj5wYWNrYWdlX25hbWUgPSAje3BhY2thZ2VOYW1lfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9Im1vZHVsZU5hbWUgIT0gbnVsbCBhbmQgbW9kdWxlTmFtZSAhPSAnJyI+bW9kdWxlX25hbWUgPSAje21vZHVsZU5hbWV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iYnVzaW5lc3NOYW1lICE9IG51bGwgYW5kIGJ1c2luZXNzTmFtZSAhPSAnJyI+YnVzaW5lc3NfbmFtZSA9ICN7YnVzaW5lc3NOYW1lfSw8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9ImZ1bmN0aW9uTmFtZSAhPSBudWxsIGFuZCBmdW5jdGlvbk5hbWUgIT0gJyciPmZ1bmN0aW9uX25hbWUgPSAje2Z1bmN0aW9uTmFtZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJvcHRpb25zICE9IG51bGwgYW5kIG9wdGlvbnMgIT0gJyciPm9wdGlvbnMgPSAje29wdGlvbnN9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCBhbmQgdXBkYXRlQnkgIT0gJyciPnVwZGF0ZV9ieSA9ICN7dXBkYXRlQnl9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0icmVtYXJrICE9IG51bGwiPnJlbWFyayA9ICN7cmVtYXJrfSw8L2lmPgorICAgICAgICAgICAgdXBkYXRlX3RpbWUgPSBzeXNkYXRlKCkKKyAgICAgICAgPC9zZXQ+CisgICAgICAgIHdoZXJlIHRhYmxlX2lkID0gI3t0YWJsZUlkfQorICAgIDwvdXBkYXRlPgorICAgIAorICAgIDxkZWxldGUgaWQ9ImRlbGV0ZUdlblRhYmxlQnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorICAgICAgICBkZWxldGUgZnJvbSBnZW5fdGFibGUgd2hlcmUgdGFibGVfaWQgaW4gCisgICAgICAgIDxmb3JlYWNoIGNvbGxlY3Rpb249ImFycmF5IiBpdGVtPSJ0YWJsZUlkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAgICAgICAgICAgICN7dGFibGVJZH0KKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvZGVsZXRlPgorCis8L21hcHBlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvY29udHJvbGxlci5qYXZhLnZtIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qYXZhL2NvbnRyb2xsZXIuamF2YS52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQ1N2EzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qYXZhL2NvbnRyb2xsZXIuamF2YS52bQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSAke3BhY2thZ2VOYW1lfS5jb250cm9sbGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnNlY3VyaXR5LmFjY2Vzcy5wcmVwb3N0LlByZUF1dGhvcml6ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBvc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QdXRNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5EZWxldGVNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5QYXRoVmFyaWFibGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5lbnVtcy5CdXNpbmVzc1R5cGU7CitpbXBvcnQgJHtwYWNrYWdlTmFtZX0uZG9tYWluLiR7Q2xhc3NOYW1lfTsKK2ltcG9ydCAke3BhY2thZ2VOYW1lfS5zZXJ2aWNlLkkke0NsYXNzTmFtZX1TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKKyNpZigkdGFibGUuY3J1ZCB8fCAkdGFibGUuc3ViKQoraW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5wYWdlLlRhYmxlRGF0YUluZm87CisjZWxzZWlmKCR0YWJsZS50cmVlKQorI2VuZAorCisvKioKKyAqICR7ZnVuY3Rpb25OYW1lfUNvbnRyb2xsZXIKKyAqIAorICogQGF1dGhvciAke2F1dGhvcn0KKyAqIEBkYXRlICR7ZGF0ZXRpbWV9CisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0iKQorcHVibGljIGNsYXNzICR7Q2xhc3NOYW1lfUNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIEkke0NsYXNzTmFtZX1TZXJ2aWNlICR7Y2xhc3NOYW1lfVNlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Ike2Z1bmN0aW9uTmFtZX3liJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJyR7cGVybWlzc2lvblByZWZpeH06bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorI2lmKCR0YWJsZS5jcnVkIHx8ICR0YWJsZS5zdWIpCisgICAgcHVibGljIFRhYmxlRGF0YUluZm8gbGlzdCgke0NsYXNzTmFtZX0gJHtjbGFzc05hbWV9KQorICAgIHsKKyAgICAgICAgc3RhcnRQYWdlKCk7CisgICAgICAgIExpc3Q8JHtDbGFzc05hbWV9PiBsaXN0ID0gJHtjbGFzc05hbWV9U2VydmljZS5zZWxlY3Qke0NsYXNzTmFtZX1MaXN0KCR7Y2xhc3NOYW1lfSk7CisgICAgICAgIHJldHVybiBnZXREYXRhVGFibGUobGlzdCk7CisgICAgfQorI2Vsc2VpZigkdGFibGUudHJlZSkKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBsaXN0KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pCisgICAgeworICAgICAgICBMaXN0PCR7Q2xhc3NOYW1lfT4gbGlzdCA9ICR7Y2xhc3NOYW1lfVNlcnZpY2Uuc2VsZWN0JHtDbGFzc05hbWV9TGlzdCgke2NsYXNzTmFtZX0pOworICAgICAgICByZXR1cm4gc3VjY2VzcyhsaXN0KTsKKyAgICB9CisjZW5kCisKKyAgICAvKioKKyAgICAgKiDlr7zlh7oke2Z1bmN0aW9uTmFtZX3liJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJyR7cGVybWlzc2lvblByZWZpeH06ZXhwb3J0JykiKQorICAgIEBMb2codGl0bGUgPSAiJHtmdW5jdGlvbk5hbWV9IiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCAke0NsYXNzTmFtZX0gJHtjbGFzc05hbWV9KQorICAgIHsKKyAgICAgICAgTGlzdDwke0NsYXNzTmFtZX0+IGxpc3QgPSAke2NsYXNzTmFtZX1TZXJ2aWNlLnNlbGVjdCR7Q2xhc3NOYW1lfUxpc3QoJHtjbGFzc05hbWV9KTsKKyAgICAgICAgRXhjZWxVdGlsPCR7Q2xhc3NOYW1lfT4gdXRpbCA9IG5ldyBFeGNlbFV0aWw8JHtDbGFzc05hbWV9Pigke0NsYXNzTmFtZX0uY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAiJHtmdW5jdGlvbk5hbWV95pWw5o2uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+WJHtmdW5jdGlvbk5hbWV96K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCcke3Blcm1pc3Npb25QcmVmaXh9OnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97JHtwa0NvbHVtbi5qYXZhRmllbGR9fSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlKCIke3BrQ29sdW1uLmphdmFGaWVsZH0iKSAke3BrQ29sdW1uLmphdmFUeXBlfSAke3BrQ29sdW1uLmphdmFGaWVsZH0pCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2Vzcygke2NsYXNzTmFtZX1TZXJ2aWNlLnNlbGVjdCR7Q2xhc3NOYW1lfUJ5JHtwa0NvbHVtbi5jYXBKYXZhRmllbGR9KCR7cGtDb2x1bW4uamF2YUZpZWxkfSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWiniR7ZnVuY3Rpb25OYW1lfQorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnJHtwZXJtaXNzaW9uUHJlZml4fTphZGQnKSIpCisgICAgQExvZyh0aXRsZSA9ICIke2Z1bmN0aW9uTmFtZX0iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuSU5TRVJUKQorICAgIEBQb3N0TWFwcGluZworICAgIHB1YmxpYyBBamF4UmVzdWx0IGFkZChAUmVxdWVzdEJvZHkgJHtDbGFzc05hbWV9ICR7Y2xhc3NOYW1lfSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0FqYXgoJHtjbGFzc05hbWV9U2VydmljZS5pbnNlcnQke0NsYXNzTmFtZX0oJHtjbGFzc05hbWV9KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS5JHtmdW5jdGlvbk5hbWV9CisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCcke3Blcm1pc3Npb25QcmVmaXh9OmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICIke2Z1bmN0aW9uTmFtZX0iLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAUmVxdWVzdEJvZHkgJHtDbGFzc05hbWV9ICR7Y2xhc3NOYW1lfSkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0FqYXgoJHtjbGFzc05hbWV9U2VydmljZS51cGRhdGUke0NsYXNzTmFtZX0oJHtjbGFzc05hbWV9KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6ZmkJHtmdW5jdGlvbk5hbWV9CisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCcke3Blcm1pc3Npb25QcmVmaXh9OnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIiR7ZnVuY3Rpb25OYW1lfSIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisJQERlbGV0ZU1hcHBpbmcoIi97JHtwa0NvbHVtbi5qYXZhRmllbGR9c30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlICR7cGtDb2x1bW4uamF2YVR5cGV9W10gJHtwa0NvbHVtbi5qYXZhRmllbGR9cykKKyAgICB7CisgICAgICAgIHJldHVybiB0b0FqYXgoJHtjbGFzc05hbWV9U2VydmljZS5kZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfXMoJHtwa0NvbHVtbi5qYXZhRmllbGR9cykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vamF2YS9kb21haW4uamF2YS52bSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vamF2YS9kb21haW4uamF2YS52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDUxYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qYXZhL2RvbWFpbi5qYXZhLnZtCkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlICR7cGFja2FnZU5hbWV9LmRvbWFpbjsKKworI2ZvcmVhY2ggKCRpbXBvcnQgaW4gJGltcG9ydExpc3QpCitpbXBvcnQgJHtpbXBvcnR9OworI2VuZAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbDsKKyNpZigkdGFibGUuY3J1ZCB8fCAkdGFibGUuc3ViKQoraW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKyNlbHNlaWYoJHRhYmxlLnRyZWUpCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5UcmVlRW50aXR5OworI2VuZAorCisvKioKKyAqICR7ZnVuY3Rpb25OYW1lfeWvueixoSAke3RhYmxlTmFtZX0KKyAqIAorICogQGF1dGhvciAke2F1dGhvcn0KKyAqIEBkYXRlICR7ZGF0ZXRpbWV9CisgKi8KKyNpZigkdGFibGUuY3J1ZCB8fCAkdGFibGUuc3ViKQorI3NldCgkRW50aXR5PSJCYXNlRW50aXR5IikKKyNlbHNlaWYoJHRhYmxlLnRyZWUpCisjc2V0KCRFbnRpdHk9IlRyZWVFbnRpdHkiKQorI2VuZAorcHVibGljIGNsYXNzICR7Q2xhc3NOYW1lfSBleHRlbmRzICR7RW50aXR5fQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZighJHRhYmxlLmlzU3VwZXJDb2x1bW4oJGNvbHVtbi5qYXZhRmllbGQpKQorICAgIC8qKiAkY29sdW1uLmNvbHVtbkNvbW1lbnQgKi8KKyNpZigkY29sdW1uLmxpc3QpCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyAgICBARXhjZWwobmFtZSA9ICIke2NvbW1lbnR9IiwgcmVhZENvbnZlcnRlckV4cCA9ICIkY29sdW1uLnJlYWRDb252ZXJ0ZXJFeHAoKSIpCisjZWxzZWlmKCRjb2x1bW4uamF2YVR5cGUgPT0gJ0RhdGUnKQorICAgIEBKc29uRm9ybWF0KHBhdHRlcm4gPSAieXl5eS1NTS1kZCIpCisgICAgQEV4Y2VsKG5hbWUgPSAiJHtjb21tZW50fSIsIHdpZHRoID0gMzAsIGRhdGVGb3JtYXQgPSAieXl5eS1NTS1kZCIpCisjZWxzZQorICAgIEBFeGNlbChuYW1lID0gIiR7Y29tbWVudH0iKQorI2VuZAorI2VuZAorICAgIHByaXZhdGUgJGNvbHVtbi5qYXZhVHlwZSAkY29sdW1uLmphdmFGaWVsZDsKKworI2VuZAorI2VuZAorI2lmKCR0YWJsZS5zdWIpCisgICAgLyoqICR0YWJsZS5zdWJUYWJsZS5mdW5jdGlvbk5hbWXkv6Hmga8gKi8KKyAgICBwcml2YXRlIExpc3Q8JHtzdWJDbGFzc05hbWV9PiAke3N1YmNsYXNzTmFtZX1MaXN0OworCisjZW5kCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZighJHRhYmxlLmlzU3VwZXJDb2x1bW4oJGNvbHVtbi5qYXZhRmllbGQpKQorI2lmKCRjb2x1bW4uamF2YUZpZWxkLmxlbmd0aCgpID4gMiAmJiAkY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMSwyKS5tYXRjaGVzKCJbQS1aXSIpKQorI3NldCgkQXR0ck5hbWU9JGNvbHVtbi5qYXZhRmllbGQpCisjZWxzZQorI3NldCgkQXR0ck5hbWU9JGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArICR7Y29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMSl9KQorI2VuZAorICAgIHB1YmxpYyB2b2lkIHNldCR7QXR0ck5hbWV9KCRjb2x1bW4uamF2YVR5cGUgJGNvbHVtbi5qYXZhRmllbGQpIAorICAgIHsKKyAgICAgICAgdGhpcy4kY29sdW1uLmphdmFGaWVsZCA9ICRjb2x1bW4uamF2YUZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyAkY29sdW1uLmphdmFUeXBlIGdldCR7QXR0ck5hbWV9KCkgCisgICAgeworICAgICAgICByZXR1cm4gJGNvbHVtbi5qYXZhRmllbGQ7CisgICAgfQorI2VuZAorI2VuZAorCisjaWYoJHRhYmxlLnN1YikKKyAgICBwdWJsaWMgTGlzdDwke3N1YkNsYXNzTmFtZX0+IGdldCR7c3ViQ2xhc3NOYW1lfUxpc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR7c3ViY2xhc3NOYW1lfUxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0JHtzdWJDbGFzc05hbWV9TGlzdChMaXN0PCR7c3ViQ2xhc3NOYW1lfT4gJHtzdWJjbGFzc05hbWV9TGlzdCkKKyAgICB7CisgICAgICAgIHRoaXMuJHtzdWJjbGFzc05hbWV9TGlzdCA9ICR7c3ViY2xhc3NOYW1lfUxpc3Q7CisgICAgfQorCisjZW5kCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmphdmFGaWVsZC5sZW5ndGgoKSA+IDIgJiYgJGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEsMikubWF0Y2hlcygiW0EtWl0iKSkKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkKQorI2Vsc2UKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyAke2NvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEpfSkKKyNlbmQKKyAgICAgICAgICAgIC5hcHBlbmQoIiR7Y29sdW1uLmphdmFGaWVsZH0iLCBnZXQke0F0dHJOYW1lfSgpKQorI2VuZAorI2lmKCR0YWJsZS5zdWIpCisgICAgICAgICAgICAuYXBwZW5kKCIke3N1YmNsYXNzTmFtZX1MaXN0IiwgZ2V0JHtzdWJDbGFzc05hbWV9TGlzdCgpKQorI2VuZAorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qYXZhL21hcHBlci5qYXZhLnZtIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qYXZhL21hcHBlci5qYXZhLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2Q3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvbWFwcGVyLmphdmEudm0KQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSAke3BhY2thZ2VOYW1lfS5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCAke3BhY2thZ2VOYW1lfS5kb21haW4uJHtDbGFzc05hbWV9OworI2lmKCR0YWJsZS5zdWIpCitpbXBvcnQgJHtwYWNrYWdlTmFtZX0uZG9tYWluLiR7c3ViQ2xhc3NOYW1lfTsKKyNlbmQKKworLyoqCisgKiAke2Z1bmN0aW9uTmFtZX1NYXBwZXLmjqXlj6MKKyAqIAorICogQGF1dGhvciAke2F1dGhvcn0KKyAqIEBkYXRlICR7ZGF0ZXRpbWV9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgJHtDbGFzc05hbWV9TWFwcGVyIAoreworICAgIC8qKgorICAgICAqIOafpeivoiR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH0gJHtmdW5jdGlvbk5hbWV95Li76ZSuCisgICAgICogQHJldHVybiAke2Z1bmN0aW9uTmFtZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgJHtDbGFzc05hbWV9IHNlbGVjdCR7Q2xhc3NOYW1lfUJ5JHtwa0NvbHVtbi5jYXBKYXZhRmllbGR9KCR7cGtDb2x1bW4uamF2YVR5cGV9ICR7cGtDb2x1bW4uamF2YUZpZWxkfSk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Ike2Z1bmN0aW9uTmFtZX3liJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtjbGFzc05hbWV9ICR7ZnVuY3Rpb25OYW1lfQorICAgICAqIEByZXR1cm4gJHtmdW5jdGlvbk5hbWV96ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8JHtDbGFzc05hbWV9PiBzZWxlY3Qke0NsYXNzTmFtZX1MaXN0KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pOworCisgICAgLyoqCisgICAgICog5paw5aKeJHtmdW5jdGlvbk5hbWV9CisgICAgICogCisgICAgICogQHBhcmFtICR7Y2xhc3NOYW1lfSAke2Z1bmN0aW9uTmFtZX0KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0JHtDbGFzc05hbWV9KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pOworCisgICAgLyoqCisgICAgICog5L+u5pS5JHtmdW5jdGlvbk5hbWV9CisgICAgICogCisgICAgICogQHBhcmFtICR7Y2xhc3NOYW1lfSAke2Z1bmN0aW9uTmFtZX0KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlJHtDbGFzc05hbWV9KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pOworCisgICAgLyoqCisgICAgICog5Yig6ZmkJHtmdW5jdGlvbk5hbWV9CisgICAgICogCisgICAgICogQHBhcmFtICR7cGtDb2x1bW4uamF2YUZpZWxkfSAke2Z1bmN0aW9uTmFtZX3kuLvplK4KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlJHtDbGFzc05hbWV9Qnkke3BrQ29sdW1uLmNhcEphdmFGaWVsZH0oJHtwa0NvbHVtbi5qYXZhVHlwZX0gJHtwa0NvbHVtbi5qYXZhRmllbGR9KTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpCR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH1zIOmcgOimgeWIoOmZpOeahOaVsOaNruS4u+mUrumbhuWQiAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfXMoJHtwa0NvbHVtbi5qYXZhVHlwZX1bXSAke3BrQ29sdW1uLmphdmFGaWVsZH1zKTsKKyNpZigkdGFibGUuc3ViKQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6ZmkJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV9CisgICAgICogCisgICAgICogQHBhcmFtICR7cGtDb2x1bW4uamF2YUZpZWxkfXMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2u5Li76ZSu6ZuG5ZCICisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZSR7c3ViQ2xhc3NOYW1lfUJ5JHtzdWJUYWJsZUZrQ2xhc3NOYW1lfXMoJHtwa0NvbHVtbi5qYXZhVHlwZX1bXSAke3BrQ29sdW1uLmphdmFGaWVsZH1zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiDmibnph4/mlrDlop4ke3N1YlRhYmxlLmZ1bmN0aW9uTmFtZX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtzdWJjbGFzc05hbWV9TGlzdCAke3N1YlRhYmxlLmZ1bmN0aW9uTmFtZX3liJfooagKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgYmF0Y2gke3N1YkNsYXNzTmFtZX0oTGlzdDwke3N1YkNsYXNzTmFtZX0+ICR7c3ViY2xhc3NOYW1lfUxpc3QpOworICAgIAorCisgICAgLyoqCisgICAgICog6YCa6L+HJHtmdW5jdGlvbk5hbWV95Li76ZSu5Yig6ZmkJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtICR7cGtDb2x1bW4uamF2YUZpZWxkfSAke2Z1bmN0aW9uTmFtZX1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGUke3N1YkNsYXNzTmFtZX1CeSR7c3ViVGFibGVGa0NsYXNzTmFtZX0oJHtwa0NvbHVtbi5qYXZhVHlwZX0gJHtwa0NvbHVtbi5qYXZhRmllbGR9KTsKKyNlbmQKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vamF2YS9zZXJ2aWNlLmphdmEudm0gYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc2VydmljZS5qYXZhLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDg4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc2VydmljZS5qYXZhLnZtCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgJHtwYWNrYWdlTmFtZX0uc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0ICR7cGFja2FnZU5hbWV9LmRvbWFpbi4ke0NsYXNzTmFtZX07CisKKy8qKgorICogJHtmdW5jdGlvbk5hbWV9U2VydmljZeaOpeWPoworICogCisgKiBAYXV0aG9yICR7YXV0aG9yfQorICogQGRhdGUgJHtkYXRldGltZX0KKyAqLworcHVibGljIGludGVyZmFjZSBJJHtDbGFzc05hbWV9U2VydmljZSAKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Ike2Z1bmN0aW9uTmFtZX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtwa0NvbHVtbi5qYXZhRmllbGR9ICR7ZnVuY3Rpb25OYW1lfeS4u+mUrgorICAgICAqIEByZXR1cm4gJHtmdW5jdGlvbk5hbWV9CisgICAgICovCisgICAgcHVibGljICR7Q2xhc3NOYW1lfSBzZWxlY3Qke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfSgke3BrQ29sdW1uLmphdmFUeXBlfSAke3BrQ29sdW1uLmphdmFGaWVsZH0pOworCisgICAgLyoqCisgICAgICog5p+l6K+iJHtmdW5jdGlvbk5hbWV95YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtICR7Y2xhc3NOYW1lfSAke2Z1bmN0aW9uTmFtZX0KKyAgICAgKiBAcmV0dXJuICR7ZnVuY3Rpb25OYW1lfembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PCR7Q2xhc3NOYW1lfT4gc2VsZWN0JHtDbGFzc05hbWV9TGlzdCgke0NsYXNzTmFtZX0gJHtjbGFzc05hbWV9KTsKKworICAgIC8qKgorICAgICAqIOaWsOWiniR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke2NsYXNzTmFtZX0gJHtmdW5jdGlvbk5hbWV9CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydCR7Q2xhc3NOYW1lfSgke0NsYXNzTmFtZX0gJHtjbGFzc05hbWV9KTsKKworICAgIC8qKgorICAgICAqIOS/ruaUuSR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke2NsYXNzTmFtZX0gJHtmdW5jdGlvbk5hbWV9CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZSR7Q2xhc3NOYW1lfSgke0NsYXNzTmFtZX0gJHtjbGFzc05hbWV9KTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpCR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH1zIOmcgOimgeWIoOmZpOeahCR7ZnVuY3Rpb25OYW1lfeS4u+mUrumbhuWQiAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfXMoJHtwa0NvbHVtbi5qYXZhVHlwZX1bXSAke3BrQ29sdW1uLmphdmFGaWVsZH1zKTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpCR7ZnVuY3Rpb25OYW1lfeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH0gJHtmdW5jdGlvbk5hbWV95Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZSR7Q2xhc3NOYW1lfUJ5JHtwa0NvbHVtbi5jYXBKYXZhRmllbGR9KCR7cGtDb2x1bW4uamF2YVR5cGV9ICR7cGtDb2x1bW4uamF2YUZpZWxkfSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc2VydmljZUltcGwuamF2YS52bSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vamF2YS9zZXJ2aWNlSW1wbC5qYXZhLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzQ2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc2VydmljZUltcGwuamF2YS52bQpAQCAtMCwwICsxLDE2OSBAQAorcGFja2FnZSAke3BhY2thZ2VOYW1lfS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uamF2YUZpZWxkID09ICdjcmVhdGVUaW1lJyB8fCAkY29sdW1uLmphdmFGaWVsZCA9PSAndXBkYXRlVGltZScpCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EYXRlVXRpbHM7CisjYnJlYWsKKyNlbmQKKyNlbmQKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CisjaWYoJHRhYmxlLnN1YikKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5hbm5vdGF0aW9uLlRyYW5zYWN0aW9uYWw7CitpbXBvcnQgJHtwYWNrYWdlTmFtZX0uZG9tYWluLiR7c3ViQ2xhc3NOYW1lfTsKKyNlbmQKK2ltcG9ydCAke3BhY2thZ2VOYW1lfS5tYXBwZXIuJHtDbGFzc05hbWV9TWFwcGVyOworaW1wb3J0ICR7cGFja2FnZU5hbWV9LmRvbWFpbi4ke0NsYXNzTmFtZX07CitpbXBvcnQgJHtwYWNrYWdlTmFtZX0uc2VydmljZS5JJHtDbGFzc05hbWV9U2VydmljZTsKKworLyoqCisgKiAke2Z1bmN0aW9uTmFtZX1TZXJ2aWNl5Lia5Yqh5bGC5aSE55CGCisgKiAKKyAqIEBhdXRob3IgJHthdXRob3J9CisgKiBAZGF0ZSAke2RhdGV0aW1lfQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzICR7Q2xhc3NOYW1lfVNlcnZpY2VJbXBsIGltcGxlbWVudHMgSSR7Q2xhc3NOYW1lfVNlcnZpY2UgCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgJHtDbGFzc05hbWV9TWFwcGVyICR7Y2xhc3NOYW1lfU1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOafpeivoiR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH0gJHtmdW5jdGlvbk5hbWV95Li76ZSuCisgICAgICogQHJldHVybiAke2Z1bmN0aW9uTmFtZX0KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgJHtDbGFzc05hbWV9IHNlbGVjdCR7Q2xhc3NOYW1lfUJ5JHtwa0NvbHVtbi5jYXBKYXZhRmllbGR9KCR7cGtDb2x1bW4uamF2YVR5cGV9ICR7cGtDb2x1bW4uamF2YUZpZWxkfSkKKyAgICB7CisgICAgICAgIHJldHVybiAke2NsYXNzTmFtZX1NYXBwZXIuc2VsZWN0JHtDbGFzc05hbWV9Qnkke3BrQ29sdW1uLmNhcEphdmFGaWVsZH0oJHtwa0NvbHVtbi5qYXZhRmllbGR9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Ike2Z1bmN0aW9uTmFtZX3liJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtjbGFzc05hbWV9ICR7ZnVuY3Rpb25OYW1lfQorICAgICAqIEByZXR1cm4gJHtmdW5jdGlvbk5hbWV9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8JHtDbGFzc05hbWV9PiBzZWxlY3Qke0NsYXNzTmFtZX1MaXN0KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pCisgICAgeworICAgICAgICByZXR1cm4gJHtjbGFzc05hbWV9TWFwcGVyLnNlbGVjdCR7Q2xhc3NOYW1lfUxpc3QoJHtjbGFzc05hbWV9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop4ke2Z1bmN0aW9uTmFtZX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtjbGFzc05hbWV9ICR7ZnVuY3Rpb25OYW1lfQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisjaWYoJHRhYmxlLnN1YikKKyAgICBAVHJhbnNhY3Rpb25hbAorI2VuZAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0JHtDbGFzc05hbWV9KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pCisgICAgeworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5qYXZhRmllbGQgPT0gJ2NyZWF0ZVRpbWUnKQorICAgICAgICAke2NsYXNzTmFtZX0uc2V0Q3JlYXRlVGltZShEYXRlVXRpbHMuZ2V0Tm93RGF0ZSgpKTsKKyNlbmQKKyNlbmQKKyNpZigkdGFibGUuc3ViKQorICAgICAgICBpbnQgcm93cyA9ICR7Y2xhc3NOYW1lfU1hcHBlci5pbnNlcnQke0NsYXNzTmFtZX0oJHtjbGFzc05hbWV9KTsKKyAgICAgICAgaW5zZXJ0JHtzdWJDbGFzc05hbWV9KCR7Y2xhc3NOYW1lfSk7CisgICAgICAgIHJldHVybiByb3dzOworI2Vsc2UKKyAgICAgICAgcmV0dXJuICR7Y2xhc3NOYW1lfU1hcHBlci5pbnNlcnQke0NsYXNzTmFtZX0oJHtjbGFzc05hbWV9KTsKKyNlbmQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLkke2Z1bmN0aW9uTmFtZX0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gJHtjbGFzc05hbWV9ICR7ZnVuY3Rpb25OYW1lfQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisjaWYoJHRhYmxlLnN1YikKKyAgICBAVHJhbnNhY3Rpb25hbAorI2VuZAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlJHtDbGFzc05hbWV9KCR7Q2xhc3NOYW1lfSAke2NsYXNzTmFtZX0pCisgICAgeworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5qYXZhRmllbGQgPT0gJ3VwZGF0ZVRpbWUnKQorICAgICAgICAke2NsYXNzTmFtZX0uc2V0VXBkYXRlVGltZShEYXRlVXRpbHMuZ2V0Tm93RGF0ZSgpKTsKKyNlbmQKKyNlbmQKKyNpZigkdGFibGUuc3ViKQorICAgICAgICAke2NsYXNzTmFtZX1NYXBwZXIuZGVsZXRlJHtzdWJDbGFzc05hbWV9Qnkke3N1YlRhYmxlRmtDbGFzc05hbWV9KCR7Y2xhc3NOYW1lfS5nZXQke3BrQ29sdW1uLmNhcEphdmFGaWVsZH0oKSk7CisgICAgICAgIGluc2VydCR7c3ViQ2xhc3NOYW1lfSgke2NsYXNzTmFtZX0pOworI2VuZAorICAgICAgICByZXR1cm4gJHtjbGFzc05hbWV9TWFwcGVyLnVwZGF0ZSR7Q2xhc3NOYW1lfSgke2NsYXNzTmFtZX0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpCR7ZnVuY3Rpb25OYW1lfQorICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH1zIOmcgOimgeWIoOmZpOeahCR7ZnVuY3Rpb25OYW1lfeS4u+mUrgorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisjaWYoJHRhYmxlLnN1YikKKyAgICBAVHJhbnNhY3Rpb25hbAorI2VuZAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlJHtDbGFzc05hbWV9Qnkke3BrQ29sdW1uLmNhcEphdmFGaWVsZH1zKCR7cGtDb2x1bW4uamF2YVR5cGV9W10gJHtwa0NvbHVtbi5qYXZhRmllbGR9cykKKyAgICB7CisjaWYoJHRhYmxlLnN1YikKKyAgICAgICAgJHtjbGFzc05hbWV9TWFwcGVyLmRlbGV0ZSR7c3ViQ2xhc3NOYW1lfUJ5JHtzdWJUYWJsZUZrQ2xhc3NOYW1lfXMoJHtwa0NvbHVtbi5qYXZhRmllbGR9cyk7CisjZW5kCisgICAgICAgIHJldHVybiAke2NsYXNzTmFtZX1NYXBwZXIuZGVsZXRlJHtDbGFzc05hbWV9Qnkke3BrQ29sdW1uLmNhcEphdmFGaWVsZH1zKCR7cGtDb2x1bW4uamF2YUZpZWxkfXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpCR7ZnVuY3Rpb25OYW1lfeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSAke3BrQ29sdW1uLmphdmFGaWVsZH0gJHtmdW5jdGlvbk5hbWV95Li76ZSuCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyNpZigkdGFibGUuc3ViKQorICAgIEBUcmFuc2FjdGlvbmFsCisjZW5kCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfSgke3BrQ29sdW1uLmphdmFUeXBlfSAke3BrQ29sdW1uLmphdmFGaWVsZH0pCisgICAgeworI2lmKCR0YWJsZS5zdWIpCisgICAgICAgICR7Y2xhc3NOYW1lfU1hcHBlci5kZWxldGUke3N1YkNsYXNzTmFtZX1CeSR7c3ViVGFibGVGa0NsYXNzTmFtZX0oJHtwa0NvbHVtbi5qYXZhRmllbGR9KTsKKyNlbmQKKyAgICAgICAgcmV0dXJuICR7Y2xhc3NOYW1lfU1hcHBlci5kZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfSgke3BrQ29sdW1uLmphdmFGaWVsZH0pOworICAgIH0KKyNpZigkdGFibGUuc3ViKQorCisgICAgLyoqCisgICAgICog5paw5aKeJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtICR7Y2xhc3NOYW1lfSAke2Z1bmN0aW9uTmFtZX3lr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQke3N1YkNsYXNzTmFtZX0oJHtDbGFzc05hbWV9ICR7Y2xhc3NOYW1lfSkKKyAgICB7CisgICAgICAgIExpc3Q8JHtzdWJDbGFzc05hbWV9PiAke3N1YmNsYXNzTmFtZX1MaXN0ID0gJHtjbGFzc05hbWV9LmdldCR7c3ViQ2xhc3NOYW1lfUxpc3QoKTsKKyAgICAgICAgJHtwa0NvbHVtbi5qYXZhVHlwZX0gJHtwa0NvbHVtbi5qYXZhRmllbGR9ID0gJHtjbGFzc05hbWV9LmdldCR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfSgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKCR7c3ViY2xhc3NOYW1lfUxpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PCR7c3ViQ2xhc3NOYW1lfT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8JHtzdWJDbGFzc05hbWV9PigpOworICAgICAgICAgICAgZm9yICgke3N1YkNsYXNzTmFtZX0gJHtzdWJjbGFzc05hbWV9IDogJHtzdWJjbGFzc05hbWV9TGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAke3N1YmNsYXNzTmFtZX0uc2V0JHtzdWJUYWJsZUZrQ2xhc3NOYW1lfSgke3BrQ29sdW1uLmphdmFGaWVsZH0pOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKCR7c3ViY2xhc3NOYW1lfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICR7Y2xhc3NOYW1lfU1hcHBlci5iYXRjaCR7c3ViQ2xhc3NOYW1lfShsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmQKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vamF2YS9zdWItZG9tYWluLmphdmEudm0gYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc3ViLWRvbWFpbi5qYXZhLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjUzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL2phdmEvc3ViLWRvbWFpbi5qYXZhLnZtCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgJHtwYWNrYWdlTmFtZX0uZG9tYWluOworCisjZm9yZWFjaCAoJGltcG9ydCBpbiAkc3ViSW1wb3J0TGlzdCkKK2ltcG9ydCAke2ltcG9ydH07CisjZW5kCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiAke3N1YlRhYmxlLmZ1bmN0aW9uTmFtZX3lr7nosaEgJHtzdWJUYWJsZU5hbWV9CisgKiAKKyAqIEBhdXRob3IgJHthdXRob3J9CisgKiBAZGF0ZSAke2RhdGV0aW1lfQorICovCitwdWJsaWMgY2xhc3MgJHtzdWJDbGFzc05hbWV9IGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkc3ViVGFibGUuY29sdW1ucykKKyNpZighJHRhYmxlLmlzU3VwZXJDb2x1bW4oJGNvbHVtbi5qYXZhRmllbGQpKQorICAgIC8qKiAkY29sdW1uLmNvbHVtbkNvbW1lbnQgKi8KKyNpZigkY29sdW1uLmxpc3QpCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyAgICBARXhjZWwobmFtZSA9ICIke2NvbW1lbnR9IiwgcmVhZENvbnZlcnRlckV4cCA9ICIkY29sdW1uLnJlYWRDb252ZXJ0ZXJFeHAoKSIpCisjZWxzZWlmKCRjb2x1bW4uamF2YVR5cGUgPT0gJ0RhdGUnKQorICAgIEBKc29uRm9ybWF0KHBhdHRlcm4gPSAieXl5eS1NTS1kZCIpCisgICAgQEV4Y2VsKG5hbWUgPSAiJHtjb21tZW50fSIsIHdpZHRoID0gMzAsIGRhdGVGb3JtYXQgPSAieXl5eS1NTS1kZCIpCisjZWxzZQorICAgIEBFeGNlbChuYW1lID0gIiR7Y29tbWVudH0iKQorI2VuZAorI2VuZAorICAgIHByaXZhdGUgJGNvbHVtbi5qYXZhVHlwZSAkY29sdW1uLmphdmFGaWVsZDsKKworI2VuZAorI2VuZAorI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHN1YlRhYmxlLmNvbHVtbnMpCisjaWYoISR0YWJsZS5pc1N1cGVyQ29sdW1uKCRjb2x1bW4uamF2YUZpZWxkKSkKKyNpZigkY29sdW1uLmphdmFGaWVsZC5sZW5ndGgoKSA+IDIgJiYgJGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEsMikubWF0Y2hlcygiW0EtWl0iKSkKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkKQorI2Vsc2UKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyAke2NvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEpfSkKKyNlbmQKKyAgICBwdWJsaWMgdm9pZCBzZXQke0F0dHJOYW1lfSgkY29sdW1uLmphdmFUeXBlICRjb2x1bW4uamF2YUZpZWxkKSAKKyAgICB7CisgICAgICAgIHRoaXMuJGNvbHVtbi5qYXZhRmllbGQgPSAkY29sdW1uLmphdmFGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgJGNvbHVtbi5qYXZhVHlwZSBnZXQke0F0dHJOYW1lfSgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuICRjb2x1bW4uamF2YUZpZWxkOworICAgIH0KKyNlbmQKKyNlbmQKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHN1YlRhYmxlLmNvbHVtbnMpCisjaWYoJGNvbHVtbi5qYXZhRmllbGQubGVuZ3RoKCkgPiAyICYmICRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxLDIpLm1hdGNoZXMoIltBLVpdIikpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZCkKKyNlbHNlCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisjZW5kCisgICAgICAgICAgICAuYXBwZW5kKCIke2NvbHVtbi5qYXZhRmllbGR9IiwgZ2V0JHtBdHRyTmFtZX0oKSkKKyNlbmQKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vanMvYXBpLmpzLnZtIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9qcy9hcGkuanMudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5NTUyNAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vanMvYXBpLmpzLnZtCkBAIC0wLDAgKzEsNDQgQEAKK2ltcG9ydCByZXF1ZXN0IGZyb20gJ0AvdXRpbHMvcmVxdWVzdCcKKworLy8g5p+l6K+iJHtmdW5jdGlvbk5hbWV95YiX6KGoCitleHBvcnQgZnVuY3Rpb24gbGlzdCR7QnVzaW5lc3NOYW1lfShxdWVyeSkgeworICByZXR1cm4gcmVxdWVzdCh7CisgICAgdXJsOiAnLyR7bW9kdWxlTmFtZX0vJHtidXNpbmVzc05hbWV9L2xpc3QnLAorICAgIG1ldGhvZDogJ2dldCcsCisgICAgcGFyYW1zOiBxdWVyeQorICB9KQorfQorCisvLyDmn6Xor6Ike2Z1bmN0aW9uTmFtZX3or6bnu4YKK2V4cG9ydCBmdW5jdGlvbiBnZXQke0J1c2luZXNzTmFtZX0oJHtwa0NvbHVtbi5qYXZhRmllbGR9KSB7CisgIHJldHVybiByZXF1ZXN0KHsKKyAgICB1cmw6ICcvJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0vJyArICR7cGtDb2x1bW4uamF2YUZpZWxkfSwKKyAgICBtZXRob2Q6ICdnZXQnCisgIH0pCit9CisKKy8vIOaWsOWiniR7ZnVuY3Rpb25OYW1lfQorZXhwb3J0IGZ1bmN0aW9uIGFkZCR7QnVzaW5lc3NOYW1lfShkYXRhKSB7CisgIHJldHVybiByZXF1ZXN0KHsKKyAgICB1cmw6ICcvJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0nLAorICAgIG1ldGhvZDogJ3Bvc3QnLAorICAgIGRhdGE6IGRhdGEKKyAgfSkKK30KKworLy8g5L+u5pS5JHtmdW5jdGlvbk5hbWV9CitleHBvcnQgZnVuY3Rpb24gdXBkYXRlJHtCdXNpbmVzc05hbWV9KGRhdGEpIHsKKyAgcmV0dXJuIHJlcXVlc3QoeworICAgIHVybDogJy8ke21vZHVsZU5hbWV9LyR7YnVzaW5lc3NOYW1lfScsCisgICAgbWV0aG9kOiAncHV0JywKKyAgICBkYXRhOiBkYXRhCisgIH0pCit9CisKKy8vIOWIoOmZpCR7ZnVuY3Rpb25OYW1lfQorZXhwb3J0IGZ1bmN0aW9uIGRlbCR7QnVzaW5lc3NOYW1lfSgke3BrQ29sdW1uLmphdmFGaWVsZH0pIHsKKyAgcmV0dXJuIHJlcXVlc3QoeworICAgIHVybDogJy8ke21vZHVsZU5hbWV9LyR7YnVzaW5lc3NOYW1lfS8nICsgJHtwa0NvbHVtbi5qYXZhRmllbGR9LAorICAgIG1ldGhvZDogJ2RlbGV0ZScKKyAgfSkKK30KZGlmZiAtLWdpdCBhL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vc3FsL3NxbC52bSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vc3FsL3NxbC52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTc1NTgzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS9zcWwvc3FsLnZtCkBAIC0wLDAgKzEsMjIgQEAKKy0tIOiPnOWNlSBTUUwKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfScsICcke3BhcmVudE1lbnVJZH0nLCAnMScsICcke2J1c2luZXNzTmFtZX0nLCAnJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0vaW5kZXgnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnJHtwZXJtaXNzaW9uUHJlZml4fTpsaXN0JywgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJHtmdW5jdGlvbk5hbWV96I+c5Y2VJyk7CisKKy0tIOaMiemSrueItuiPnOWNlUlECitTRUxFQ1QgQHBhcmVudElkIDo9IExBU1RfSU5TRVJUX0lEKCk7CisKKy0tIOaMiemSriBTUUwKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfeafpeivoicsIEBwYXJlbnRJZCwgJzEnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJyR7cGVybWlzc2lvblByZWZpeH06cXVlcnknLCAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfeaWsOWinicsIEBwYXJlbnRJZCwgJzInLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJyR7cGVybWlzc2lvblByZWZpeH06YWRkJywgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfeS/ruaUuScsIEBwYXJlbnRJZCwgJzMnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJyR7cGVybWlzc2lvblByZWZpeH06ZWRpdCcsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfeWIoOmZpCcsIEBwYXJlbnRJZCwgJzQnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJyR7cGVybWlzc2lvblByZWZpeH06cmVtb3ZlJywgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJyR7ZnVuY3Rpb25OYW1lfeWvvOWHuicsIEBwYXJlbnRJZCwgJzUnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJyR7cGVybWlzc2lvblByZWZpeH06ZXhwb3J0JywgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvaW5kZXgtdHJlZS52dWUudm0gYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL3Z1ZS9pbmRleC10cmVlLnZ1ZS52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE5YzJhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvaW5kZXgtdHJlZS52dWUudm0KQEAgLTAsMCArMSw1MDUgQEAKKzx0ZW1wbGF0ZT4KKyAgPGRpdiBjbGFzcz0iYXBwLWNvbnRhaW5lciI+CisgICAgPGVsLWZvcm0gOm1vZGVsPSJxdWVyeVBhcmFtcyIgcmVmPSJxdWVyeUZvcm0iIHNpemU9InNtYWxsIiA6aW5saW5lPSJ0cnVlIiB2LXNob3c9InNob3dTZWFyY2giIGxhYmVsLXdpZHRoPSI2OHB4Ij4KKyNmb3JlYWNoKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5xdWVyeSkKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtjb2x1bW4uamF2YUZpZWxkfSI+CisgICAgICAgIDxlbC1pbnB1dAorICAgICAgICAgIHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iCisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSR7Y29tbWVudH0iCisgICAgICAgICAgY2xlYXJhYmxlCisgICAgICAgICAgQGtleXVwLmVudGVyLm5hdGl2ZT0iaGFuZGxlUXVlcnkiCisgICAgICAgIC8+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIgY2xlYXJhYmxlPgorICAgICAgICAgIDxlbC1vcHRpb24KKyAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluIGRpY3QudHlwZS4ke2RpY3RUeXBlfSIKKyAgICAgICAgICAgIDprZXk9ImRpY3QudmFsdWUiCisgICAgICAgICAgICA6bGFiZWw9ImRpY3QubGFiZWwiCisgICAgICAgICAgICA6dmFsdWU9ImRpY3QudmFsdWUiCisgICAgICAgICAgLz4KKyAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAkZGljdFR5cGUpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIgY2xlYXJhYmxlPgorICAgICAgICAgIDxlbC1vcHRpb24gbGFiZWw9Iuivt+mAieaLqeWtl+WFuOeUn+aIkCIgdmFsdWU9IiIgLz4KKyAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlICE9ICJCRVRXRUVOIikKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7Y29sdW1uLmphdmFGaWVsZH0iPgorICAgICAgICA8ZWwtZGF0ZS1waWNrZXIgY2xlYXJhYmxlCisgICAgICAgICAgdi1tb2RlbD0icXVlcnlQYXJhbXMuJHtjb2x1bW4uamF2YUZpZWxkfSIKKyAgICAgICAgICB0eXBlPSJkYXRlIgorICAgICAgICAgIHZhbHVlLWZvcm1hdD0ieXl5eS1NTS1kZCIKKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6YCJ5oupJHtjb21tZW50fSI+CisgICAgICAgIDwvZWwtZGF0ZS1waWNrZXI+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iPgorICAgICAgICA8ZWwtZGF0ZS1waWNrZXIKKyAgICAgICAgICB2LW1vZGVsPSJkYXRlcmFuZ2Uke0F0dHJOYW1lfSIKKyAgICAgICAgICBzdHlsZT0id2lkdGg6IDI0MHB4IgorICAgICAgICAgIHZhbHVlLWZvcm1hdD0ieXl5eS1NTS1kZCIKKyAgICAgICAgICB0eXBlPSJkYXRlcmFuZ2UiCisgICAgICAgICAgcmFuZ2Utc2VwYXJhdG9yPSItIgorICAgICAgICAgIHN0YXJ0LXBsYWNlaG9sZGVyPSLlvIDlp4vml6XmnJ8iCisgICAgICAgICAgZW5kLXBsYWNlaG9sZGVyPSLnu5PmnZ/ml6XmnJ8iCisgICAgICAgID48L2VsLWRhdGUtcGlja2VyPgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZW5kCisjZW5kCisjZW5kCisgICAgICA8ZWwtZm9ybS1pdGVtPgorCSAgICA8ZWwtYnV0dG9uIHR5cGU9InByaW1hcnkiIGljb249ImVsLWljb24tc2VhcmNoIiBzaXplPSJtaW5pIiBAY2xpY2s9ImhhbmRsZVF1ZXJ5Ij7mkJzntKI8L2VsLWJ1dHRvbj4KKyAgICAgICAgPGVsLWJ1dHRvbiBpY29uPSJlbC1pY29uLXJlZnJlc2giIHNpemU9Im1pbmkiIEBjbGljaz0icmVzZXRRdWVyeSI+6YeN572uPC9lbC1idXR0b24+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyAgICA8L2VsLWZvcm0+CisKKyAgICA8ZWwtcm93IDpndXR0ZXI9IjEwIiBjbGFzcz0ibWI4Ij4KKyAgICAgIDxlbC1jb2wgOnNwYW49IjEuNSI+CisgICAgICAgIDxlbC1idXR0b24KKyAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgIHBsYWluCisgICAgICAgICAgaWNvbj0iZWwtaWNvbi1wbHVzIgorICAgICAgICAgIHNpemU9Im1pbmkiCisgICAgICAgICAgQGNsaWNrPSJoYW5kbGVBZGQiCisgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTphZGQnXSIKKyAgICAgICAgPuaWsOWinjwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgdHlwZT0iaW5mbyIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249ImVsLWljb24tc29ydCIKKyAgICAgICAgICBzaXplPSJtaW5pIgorICAgICAgICAgIEBjbGljaz0idG9nZ2xlRXhwYW5kQWxsIgorICAgICAgICA+5bGV5byAL+aKmOWPoDwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8cmlnaHQtdG9vbGJhciA6c2hvd1NlYXJjaC5zeW5jPSJzaG93U2VhcmNoIiBAcXVlcnlUYWJsZT0iZ2V0TGlzdCI+PC9yaWdodC10b29sYmFyPgorICAgIDwvZWwtcm93PgorCisgICAgPGVsLXRhYmxlCisgICAgICB2LWlmPSJyZWZyZXNoVGFibGUiCisgICAgICB2LWxvYWRpbmc9ImxvYWRpbmciCisgICAgICA6ZGF0YT0iJHtidXNpbmVzc05hbWV9TGlzdCIKKyAgICAgIHJvdy1rZXk9IiR7dHJlZUNvZGV9IgorICAgICAgOmRlZmF1bHQtZXhwYW5kLWFsbD0iaXNFeHBhbmRBbGwiCisgICAgICA6dHJlZS1wcm9wcz0ie2NoaWxkcmVuOiAnY2hpbGRyZW4nLCBoYXNDaGlsZHJlbjogJ2hhc0NoaWxkcmVuJ30iCisgICAgPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGphdmFGaWVsZD0kY29sdW1uLmphdmFGaWVsZCkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNpZigkY29sdW1uLnBrKQorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiKQorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJHtjb21tZW50fSIgYWxpZ249ImNlbnRlciIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMTgwIj4KKyAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9InNjb3BlIj4KKyAgICAgICAgICA8c3Bhbj57eyBwYXJzZVRpbWUoc2NvcGUucm93LiR7amF2YUZpZWxkfSwgJ3t5fS17bX0te2R9JykgfX08L3NwYW4+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImltYWdlVXBsb2FkIikKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgd2lkdGg9IjEwMCI+CisgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgPGltYWdlLXByZXZpZXcgOnNyYz0ic2NvcGUucm93LiR7amF2YUZpZWxkfSIgOndpZHRoPSI1MCIgOmhlaWdodD0iNTAiLz4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGNvbHVtbi5kaWN0VHlwZSkKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSI+CisgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgICAgICAgIDxkaWN0LXRhZyA6b3B0aW9ucz0iZGljdC50eXBlLiR7Y29sdW1uLmRpY3RUeXBlfSIgOnZhbHVlPSJzY29wZS5yb3cuJHtqYXZhRmllbGR9ID8gc2NvcGUucm93LiR7amF2YUZpZWxkfS5zcGxpdCgnLCcpIDogW10iLz4KKyNlbHNlCisgICAgICAgICAgPGRpY3QtdGFnIDpvcHRpb25zPSJkaWN0LnR5cGUuJHtjb2x1bW4uZGljdFR5cGV9IiA6dmFsdWU9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iLz4KKyNlbmQKKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGphdmFGaWVsZCkKKyNpZigke2ZvcmVhY2guaW5kZXh9ID09IDEpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2phdmFGaWVsZH0iIC8+CisjZWxzZQorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJHtjb21tZW50fSIgYWxpZ249ImNlbnRlciIgcHJvcD0iJHtqYXZhRmllbGR9IiAvPgorI2VuZAorI2VuZAorI2VuZAorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0i5pON5L2cIiBhbGlnbj0iY2VudGVyIiBjbGFzcy1uYW1lPSJzbWFsbC1wYWRkaW5nIGZpeGVkLXdpZHRoIj4KKyAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9InNjb3BlIj4KKyAgICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgICBzaXplPSJtaW5pIgorICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgIGljb249ImVsLWljb24tZWRpdCIKKyAgICAgICAgICAgIEBjbGljaz0iaGFuZGxlVXBkYXRlKHNjb3BlLnJvdykiCisgICAgICAgICAgICB2LWhhc1Blcm1pPSJbJyR7bW9kdWxlTmFtZX06JHtidXNpbmVzc05hbWV9OmVkaXQnXSIKKyAgICAgICAgICA+5L+u5pS5PC9lbC1idXR0b24+CisgICAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgICAgc2l6ZT0ibWluaSIKKyAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICBpY29uPSJlbC1pY29uLXBsdXMiCisgICAgICAgICAgICBAY2xpY2s9ImhhbmRsZUFkZChzY29wZS5yb3cpIgorICAgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTphZGQnXSIKKyAgICAgICAgICA+5paw5aKePC9lbC1idXR0b24+CisgICAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgICAgc2l6ZT0ibWluaSIKKyAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICBpY29uPSJlbC1pY29uLWRlbGV0ZSIKKyAgICAgICAgICAgIEBjbGljaz0iaGFuZGxlRGVsZXRlKHNjb3BlLnJvdykiCisgICAgICAgICAgICB2LWhhc1Blcm1pPSJbJyR7bW9kdWxlTmFtZX06JHtidXNpbmVzc05hbWV9OnJlbW92ZSddIgorICAgICAgICAgID7liKDpmaQ8L2VsLWJ1dHRvbj4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorICAgIDwvZWwtdGFibGU+CisKKyAgICA8IS0tIOa3u+WKoOaIluS/ruaUuSR7ZnVuY3Rpb25OYW1lfeWvueivneahhiAtLT4KKyAgICA8ZWwtZGlhbG9nIDp0aXRsZT0idGl0bGUiIDp2aXNpYmxlLnN5bmM9Im9wZW4iIHdpZHRoPSI1MDBweCIgYXBwZW5kLXRvLWJvZHk+CisgICAgICA8ZWwtZm9ybSByZWY9ImZvcm0iIDptb2RlbD0iZm9ybSIgOnJ1bGVzPSJydWxlcyIgbGFiZWwtd2lkdGg9IjgwcHgiPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI2lmKCRjb2x1bW4uaW5zZXJ0ICYmICEkY29sdW1uLnBrKQorI2lmKCgkY29sdW1uLnVzYWJsZUNvbHVtbikgfHwgKCEkY29sdW1uLnN1cGVyQ29sdW1uKSkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjaWYoIiIgIT0gJHRyZWVQYXJlbnRDb2RlICYmICRjb2x1bW4uamF2YUZpZWxkID09ICR0cmVlUGFyZW50Q29kZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHt0cmVlUGFyZW50Q29kZX0iPgorICAgICAgICAgIDx0cmVlc2VsZWN0IHYtbW9kZWw9ImZvcm0uJHt0cmVlUGFyZW50Q29kZX0iIDpvcHRpb25zPSIke2J1c2luZXNzTmFtZX1PcHRpb25zIiA6bm9ybWFsaXplcj0ibm9ybWFsaXplciIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iIC8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJpbnB1dCIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtaW5wdXQgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSR7Y29tbWVudH0iIC8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJpbWFnZVVwbG9hZCIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8aW1hZ2UtdXBsb2FkIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImZpbGVVcGxvYWQiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGZpbGUtdXBsb2FkIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImVkaXRvciIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iPgorICAgICAgICAgIDxlZGl0b3Igdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgOm1pbi1oZWlnaHQ9IjE5MiIvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fpgInmi6kke2NvbW1lbnR9Ij4KKyAgICAgICAgICAgIDxlbC1vcHRpb24KKyAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gZGljdC50eXBlLiR7ZGljdFR5cGV9IgorICAgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgICA6bGFiZWw9ImRpY3QubGFiZWwiCisjaWYoJGNvbHVtbi5qYXZhVHlwZSA9PSAiSW50ZWdlciIgfHwgJGNvbHVtbi5qYXZhVHlwZSA9PSAiTG9uZyIpCisgICAgICAgICAgICAgIDp2YWx1ZT0icGFyc2VJbnQoZGljdC52YWx1ZSkiCisjZWxzZQorICAgICAgICAgICAgICA6dmFsdWU9ImRpY3QudmFsdWUiCisjZW5kCisgICAgICAgICAgICA+PC9lbC1vcHRpb24+CisgICAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiICYmICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1zZWxlY3Qgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICAgICAgPGVsLW9wdGlvbiBsYWJlbD0i6K+36YCJ5oup5a2X5YW455Sf5oiQIiB2YWx1ZT0iIiAvPgorICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giICYmICIiICE9ICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1jaGVja2JveC1ncm91cCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ij4KKyAgICAgICAgICAgIDxlbC1jaGVja2JveAorICAgICAgICAgICAgICB2LWZvcj0iZGljdCBpbiBkaWN0LnR5cGUuJHtkaWN0VHlwZX0iCisgICAgICAgICAgICAgIDprZXk9ImRpY3QudmFsdWUiCisgICAgICAgICAgICAgIDpsYWJlbD0iZGljdC52YWx1ZSI+CisgICAgICAgICAgICAgIHt7ZGljdC5sYWJlbH19CisgICAgICAgICAgICA8L2VsLWNoZWNrYm94PgorICAgICAgICAgIDwvZWwtY2hlY2tib3gtZ3JvdXA+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIgJiYgJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWNoZWNrYm94LWdyb3VwIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iPgorICAgICAgICAgICAgPGVsLWNoZWNrYm94Puivt+mAieaLqeWtl+WFuOeUn+aIkDwvZWwtY2hlY2tib3g+CisgICAgICAgICAgPC9lbC1jaGVja2JveC1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIiAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtcmFkaW8tZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtcmFkaW8KKyAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gZGljdC50eXBlLiR7ZGljdFR5cGV9IgorICAgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorI2lmKCRjb2x1bW4uamF2YVR5cGUgPT0gIkludGVnZXIiIHx8ICRjb2x1bW4uamF2YVR5cGUgPT0gIkxvbmciKQorICAgICAgICAgICAgICA6bGFiZWw9InBhcnNlSW50KGRpY3QudmFsdWUpIgorI2Vsc2UKKyAgICAgICAgICAgICAgOmxhYmVsPSJkaWN0LnZhbHVlIgorI2VuZAorICAgICAgICAgICAgPnt7ZGljdC5sYWJlbH19PC9lbC1yYWRpbz4KKyAgICAgICAgICA8L2VsLXJhZGlvLWdyb3VwPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iICYmICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1yYWRpby1ncm91cCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ij4KKyAgICAgICAgICAgIDxlbC1yYWRpbyBsYWJlbD0iMSI+6K+36YCJ5oup5a2X5YW455Sf5oiQPC9lbC1yYWRpbz4KKyAgICAgICAgICA8L2VsLXJhZGlvLWdyb3VwPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWRhdGUtcGlja2VyIGNsZWFyYWJsZQorICAgICAgICAgICAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIKKyAgICAgICAgICAgIHR5cGU9ImRhdGUiCisgICAgICAgICAgICB2YWx1ZS1mb3JtYXQ9Inl5eXktTU0tZGQiCisgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6YCJ5oupJHtjb21tZW50fSI+CisgICAgICAgICAgPC9lbC1kYXRlLXBpY2tlcj4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInRleHRhcmVhIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1pbnB1dCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IiB0eXBlPSJ0ZXh0YXJlYSIgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpeWGheWuuSIgLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZW5kCisjZW5kCisjZW5kCisjZW5kCisgICAgICA8L2VsLWZvcm0+CisgICAgICA8ZGl2IHNsb3Q9ImZvb3RlciIgY2xhc3M9ImRpYWxvZy1mb290ZXIiPgorICAgICAgICA8ZWwtYnV0dG9uIHR5cGU9InByaW1hcnkiIEBjbGljaz0ic3VibWl0Rm9ybSI+56GuIOWumjwvZWwtYnV0dG9uPgorICAgICAgICA8ZWwtYnV0dG9uIEBjbGljaz0iY2FuY2VsIj7lj5Yg5raIPC9lbC1idXR0b24+CisgICAgICA8L2Rpdj4KKyAgICA8L2VsLWRpYWxvZz4KKyAgPC9kaXY+Cis8L3RlbXBsYXRlPgorCis8c2NyaXB0PgoraW1wb3J0IHsgbGlzdCR7QnVzaW5lc3NOYW1lfSwgZ2V0JHtCdXNpbmVzc05hbWV9LCBkZWwke0J1c2luZXNzTmFtZX0sIGFkZCR7QnVzaW5lc3NOYW1lfSwgdXBkYXRlJHtCdXNpbmVzc05hbWV9IH0gZnJvbSAiQC9hcGkvJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0iOworaW1wb3J0IFRyZWVzZWxlY3QgZnJvbSAiQHJpb3BoYWUvdnVlLXRyZWVzZWxlY3QiOworaW1wb3J0ICJAcmlvcGhhZS92dWUtdHJlZXNlbGVjdC9kaXN0L3Z1ZS10cmVlc2VsZWN0LmNzcyI7CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgbmFtZTogIiR7QnVzaW5lc3NOYW1lfSIsCisjaWYoJHtkaWN0c30gIT0gJycpCisgIGRpY3RzOiBbJHtkaWN0c31dLAorI2VuZAorICBjb21wb25lbnRzOiB7CisgICAgVHJlZXNlbGVjdAorICB9LAorICBkYXRhKCkgeworICAgIHJldHVybiB7CisgICAgICAvLyDpga7nvanlsYIKKyAgICAgIGxvYWRpbmc6IHRydWUsCisgICAgICAvLyDmmL7npLrmkJzntKLmnaHku7YKKyAgICAgIHNob3dTZWFyY2g6IHRydWUsCisgICAgICAvLyAke2Z1bmN0aW9uTmFtZX3ooajmoLzmlbDmja4KKyAgICAgICR7YnVzaW5lc3NOYW1lfUxpc3Q6IFtdLAorICAgICAgLy8gJHtmdW5jdGlvbk5hbWV95qCR6YCJ6aG5CisgICAgICAke2J1c2luZXNzTmFtZX1PcHRpb25zOiBbXSwKKyAgICAgIC8vIOW8ueWHuuWxguagh+mimAorICAgICAgdGl0bGU6ICIiLAorICAgICAgLy8g5piv5ZCm5pi+56S65by55Ye65bGCCisgICAgICBvcGVuOiBmYWxzZSwKKyAgICAgIC8vIOaYr+WQpuWxleW8gO+8jOm7mOiupOWFqOmDqOWxleW8gAorICAgICAgaXNFeHBhbmRBbGw6IHRydWUsCisgICAgICAvLyDph43mlrDmuLLmn5PooajmoLznirbmgIEKKyAgICAgIHJlZnJlc2hUYWJsZTogdHJ1ZSwKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgICAgICAvLyAkY29tbWVudOaXtumXtOiMg+WbtAorICAgICAgZGF0ZXJhbmdlJHtBdHRyTmFtZX06IFtdLAorI2VuZAorI2VuZAorICAgICAgLy8g5p+l6K+i5Y+C5pWwCisgICAgICBxdWVyeVBhcmFtczogeworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5xdWVyeSkKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IG51bGwjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgICAgICB9LAorICAgICAgLy8g6KGo5Y2V5Y+C5pWwCisgICAgICBmb3JtOiB7fSwKKyAgICAgIC8vIOihqOWNleagoemqjAorICAgICAgcnVsZXM6IHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4ucmVxdWlyZWQpCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisgICAgICAgICRjb2x1bW4uamF2YUZpZWxkOiBbCisgICAgICAgICAgeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogIiRjb21tZW505LiN6IO95Li656m6IiwgdHJpZ2dlcjogI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSJjaGFuZ2UiI2Vsc2UiYmx1ciIjZW5kIH0KKyAgICAgICAgXSNpZigkZm9yZWFjaC5jb3VudCAhPSAkY29sdW1ucy5zaXplKCkpLCNlbmQKKyNlbmQKKyNlbmQKKyAgICAgIH0KKyAgICB9OworICB9LAorICBjcmVhdGVkKCkgeworICAgIHRoaXMuZ2V0TGlzdCgpOworICB9LAorICBtZXRob2RzOiB7CisgICAgLyoqIOafpeivoiR7ZnVuY3Rpb25OYW1lfeWIl+ihqCAqLworICAgIGdldExpc3QoKSB7CisgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyAgICAgIHRoaXMucXVlcnlQYXJhbXMucGFyYW1zID0ge307CisjYnJlYWsKKyNlbmQKKyNlbmQKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgICAgICBpZiAobnVsbCAhPSB0aGlzLmRhdGVyYW5nZSR7QXR0ck5hbWV9ICYmICcnICE9IHRoaXMuZGF0ZXJhbmdlJHtBdHRyTmFtZX0pIHsKKyAgICAgICAgdGhpcy5xdWVyeVBhcmFtcy5wYXJhbXNbImJlZ2luJHtBdHRyTmFtZX0iXSA9IHRoaXMuZGF0ZXJhbmdlJHtBdHRyTmFtZX1bMF07CisgICAgICAgIHRoaXMucXVlcnlQYXJhbXMucGFyYW1zWyJlbmQke0F0dHJOYW1lfSJdID0gdGhpcy5kYXRlcmFuZ2Uke0F0dHJOYW1lfVsxXTsKKyAgICAgIH0KKyNlbmQKKyNlbmQKKyAgICAgIGxpc3Qke0J1c2luZXNzTmFtZX0odGhpcy5xdWVyeVBhcmFtcykudGhlbihyZXNwb25zZSA9PiB7CisgICAgICAgIHRoaXMuJHtidXNpbmVzc05hbWV9TGlzdCA9IHRoaXMuaGFuZGxlVHJlZShyZXNwb25zZS5kYXRhLCAiJHt0cmVlQ29kZX0iLCAiJHt0cmVlUGFyZW50Q29kZX0iKTsKKyAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CisgICAgICB9KTsKKyAgICB9LAorICAgIC8qKiDovazmjaIke2Z1bmN0aW9uTmFtZX3mlbDmja7nu5PmnoQgKi8KKyAgICBub3JtYWxpemVyKG5vZGUpIHsKKyAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmICFub2RlLmNoaWxkcmVuLmxlbmd0aCkgeworICAgICAgICBkZWxldGUgbm9kZS5jaGlsZHJlbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiB7CisgICAgICAgIGlkOiBub2RlLiR7dHJlZUNvZGV9LAorICAgICAgICBsYWJlbDogbm9kZS4ke3RyZWVOYW1lfSwKKyAgICAgICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4KKyAgICAgIH07CisgICAgfSwKKwkvKiog5p+l6K+iJHtmdW5jdGlvbk5hbWV95LiL5ouJ5qCR57uT5p6EICovCisgICAgZ2V0VHJlZXNlbGVjdCgpIHsKKyAgICAgIGxpc3Qke0J1c2luZXNzTmFtZX0oKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgICAgdGhpcy4ke2J1c2luZXNzTmFtZX1PcHRpb25zID0gW107CisgICAgICAgIGNvbnN0IGRhdGEgPSB7ICR7dHJlZUNvZGV9OiAwLCAke3RyZWVOYW1lfTogJ+mhtue6p+iKgueCuScsIGNoaWxkcmVuOiBbXSB9OworICAgICAgICBkYXRhLmNoaWxkcmVuID0gdGhpcy5oYW5kbGVUcmVlKHJlc3BvbnNlLmRhdGEsICIke3RyZWVDb2RlfSIsICIke3RyZWVQYXJlbnRDb2RlfSIpOworICAgICAgICB0aGlzLiR7YnVzaW5lc3NOYW1lfU9wdGlvbnMucHVzaChkYXRhKTsKKyAgICAgIH0pOworICAgIH0sCisgICAgLy8g5Y+W5raI5oyJ6ZKuCisgICAgY2FuY2VsKCkgeworICAgICAgdGhpcy5vcGVuID0gZmFsc2U7CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfSwKKyAgICAvLyDooajljZXph43nva4KKyAgICByZXNldCgpIHsKKyAgICAgIHRoaXMuZm9ybSA9IHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IikKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IFtdI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZAorI2Vsc2UKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IG51bGwjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgICAgICB9OworICAgICAgdGhpcy5yZXNldEZvcm0oImZvcm0iKTsKKyAgICB9LAorICAgIC8qKiDmkJzntKLmjInpkq7mk43kvZwgKi8KKyAgICBoYW5kbGVRdWVyeSgpIHsKKyAgICAgIHRoaXMuZ2V0TGlzdCgpOworICAgIH0sCisgICAgLyoqIOmHjee9ruaMiemSruaTjeS9nCAqLworICAgIHJlc2V0UXVlcnkoKSB7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgPT0gIkJFVFdFRU4iKQorI3NldCgkQXR0ck5hbWU9JGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArICR7Y29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMSl9KQorICAgICAgdGhpcy5kYXRlcmFuZ2Uke0F0dHJOYW1lfSA9IFtdOworI2VuZAorI2VuZAorICAgICAgdGhpcy5yZXNldEZvcm0oInF1ZXJ5Rm9ybSIpOworICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpOworICAgIH0sCisgICAgLyoqIOaWsOWinuaMiemSruaTjeS9nCAqLworICAgIGhhbmRsZUFkZChyb3cpIHsKKyAgICAgIHRoaXMucmVzZXQoKTsKKyAgICAgIHRoaXMuZ2V0VHJlZXNlbGVjdCgpOworICAgICAgaWYgKHJvdyAhPSBudWxsICYmIHJvdy4ke3RyZWVDb2RlfSkgeworICAgICAgICB0aGlzLmZvcm0uJHt0cmVlUGFyZW50Q29kZX0gPSByb3cuJHt0cmVlQ29kZX07CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmZvcm0uJHt0cmVlUGFyZW50Q29kZX0gPSAwOworICAgICAgfQorICAgICAgdGhpcy5vcGVuID0gdHJ1ZTsKKyAgICAgIHRoaXMudGl0bGUgPSAi5re75YqgJHtmdW5jdGlvbk5hbWV9IjsKKyAgICB9LAorICAgIC8qKiDlsZXlvIAv5oqY5Y+g5pON5L2cICovCisgICAgdG9nZ2xlRXhwYW5kQWxsKCkgeworICAgICAgdGhpcy5yZWZyZXNoVGFibGUgPSBmYWxzZTsKKyAgICAgIHRoaXMuaXNFeHBhbmRBbGwgPSAhdGhpcy5pc0V4cGFuZEFsbDsKKyAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsKKyAgICAgICAgdGhpcy5yZWZyZXNoVGFibGUgPSB0cnVlOworICAgICAgfSk7CisgICAgfSwKKyAgICAvKiog5L+u5pS55oyJ6ZKu5pON5L2cICovCisgICAgaGFuZGxlVXBkYXRlKHJvdykgeworICAgICAgdGhpcy5yZXNldCgpOworICAgICAgdGhpcy5nZXRUcmVlc2VsZWN0KCk7CisgICAgICBpZiAocm93ICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5mb3JtLiR7dHJlZVBhcmVudENvZGV9ID0gcm93LiR7dHJlZVBhcmVudENvZGV9OworICAgICAgfQorICAgICAgZ2V0JHtCdXNpbmVzc05hbWV9KHJvdy4ke3BrQ29sdW1uLmphdmFGaWVsZH0pLnRoZW4ocmVzcG9uc2UgPT4geworICAgICAgICB0aGlzLmZvcm0gPSByZXNwb25zZS5kYXRhOworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgICAgICB0aGlzLmZvcm0uJGNvbHVtbi5qYXZhRmllbGQgPSB0aGlzLmZvcm0uJHtjb2x1bW4uamF2YUZpZWxkfS5zcGxpdCgiLCIpOworI2VuZAorI2VuZAorICAgICAgICB0aGlzLm9wZW4gPSB0cnVlOworICAgICAgICB0aGlzLnRpdGxlID0gIuS/ruaUuSR7ZnVuY3Rpb25OYW1lfSI7CisgICAgICB9KTsKKyAgICB9LAorICAgIC8qKiDmj5DkuqTmjInpkq4gKi8KKyAgICBzdWJtaXRGb3JtKCkgeworICAgICAgdGhpcy4jW1skXV0jcmVmc1siZm9ybSJdLnZhbGlkYXRlKHZhbGlkID0+IHsKKyAgICAgICAgaWYgKHZhbGlkKSB7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICAgICAgdGhpcy5mb3JtLiRjb2x1bW4uamF2YUZpZWxkID0gdGhpcy5mb3JtLiR7Y29sdW1uLmphdmFGaWVsZH0uam9pbigiLCIpOworI2VuZAorI2VuZAorICAgICAgICAgIGlmICh0aGlzLmZvcm0uJHtwa0NvbHVtbi5qYXZhRmllbGR9ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwZGF0ZSR7QnVzaW5lc3NOYW1lfSh0aGlzLmZvcm0pLnRoZW4ocmVzcG9uc2UgPT4geworICAgICAgICAgICAgICB0aGlzLiNbWyRtb2RhbF1dIy5tc2dTdWNjZXNzKCLkv67mlLnmiJDlip8iKTsKKyAgICAgICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7CisgICAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZCR7QnVzaW5lc3NOYW1lfSh0aGlzLmZvcm0pLnRoZW4ocmVzcG9uc2UgPT4geworICAgICAgICAgICAgICB0aGlzLiNbWyRtb2RhbF1dIy5tc2dTdWNjZXNzKCLmlrDlop7miJDlip8iKTsKKyAgICAgICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7CisgICAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9LAorICAgIC8qKiDliKDpmaTmjInpkq7mk43kvZwgKi8KKyAgICBoYW5kbGVEZWxldGUocm93KSB7CisgICAgICB0aGlzLiNbWyRtb2RhbF1dIy5jb25maXJtKCfmmK/lkKbnoa7orqTliKDpmaQke2Z1bmN0aW9uTmFtZX3nvJblj7fkuLoiJyArIHJvdy4ke3BrQ29sdW1uLmphdmFGaWVsZH0gKyAnIueahOaVsOaNrumhue+8nycpLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBkZWwke0J1c2luZXNzTmFtZX0ocm93LiR7cGtDb2x1bW4uamF2YUZpZWxkfSk7CisgICAgICB9KS50aGVuKCgpID0+IHsKKyAgICAgICAgdGhpcy5nZXRMaXN0KCk7CisgICAgICAgIHRoaXMuI1tbJG1vZGFsXV0jLm1zZ1N1Y2Nlc3MoIuWIoOmZpOaIkOWKnyIpOworICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOworICAgIH0KKyAgfQorfTsKKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvaW5kZXgudnVlLnZtIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvaW5kZXgudnVlLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTYwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL3Z1ZS9pbmRleC52dWUudm0KQEAgLTAsMCArMSw2MDIgQEAKKzx0ZW1wbGF0ZT4KKyAgPGRpdiBjbGFzcz0iYXBwLWNvbnRhaW5lciI+CisgICAgPGVsLWZvcm0gOm1vZGVsPSJxdWVyeVBhcmFtcyIgcmVmPSJxdWVyeUZvcm0iIHNpemU9InNtYWxsIiA6aW5saW5lPSJ0cnVlIiB2LXNob3c9InNob3dTZWFyY2giIGxhYmVsLXdpZHRoPSI2OHB4Ij4KKyNmb3JlYWNoKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5xdWVyeSkKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtjb2x1bW4uamF2YUZpZWxkfSI+CisgICAgICAgIDxlbC1pbnB1dAorICAgICAgICAgIHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iCisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSR7Y29tbWVudH0iCisgICAgICAgICAgY2xlYXJhYmxlCisgICAgICAgICAgQGtleXVwLmVudGVyLm5hdGl2ZT0iaGFuZGxlUXVlcnkiCisgICAgICAgIC8+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIgY2xlYXJhYmxlPgorICAgICAgICAgIDxlbC1vcHRpb24KKyAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluIGRpY3QudHlwZS4ke2RpY3RUeXBlfSIKKyAgICAgICAgICAgIDprZXk9ImRpY3QudmFsdWUiCisgICAgICAgICAgICA6bGFiZWw9ImRpY3QubGFiZWwiCisgICAgICAgICAgICA6dmFsdWU9ImRpY3QudmFsdWUiCisgICAgICAgICAgLz4KKyAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAkZGljdFR5cGUpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIgY2xlYXJhYmxlPgorICAgICAgICAgIDxlbC1vcHRpb24gbGFiZWw9Iuivt+mAieaLqeWtl+WFuOeUn+aIkCIgdmFsdWU9IiIgLz4KKyAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlICE9ICJCRVRXRUVOIikKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7Y29sdW1uLmphdmFGaWVsZH0iPgorICAgICAgICA8ZWwtZGF0ZS1waWNrZXIgY2xlYXJhYmxlCisgICAgICAgICAgdi1tb2RlbD0icXVlcnlQYXJhbXMuJHtjb2x1bW4uamF2YUZpZWxkfSIKKyAgICAgICAgICB0eXBlPSJkYXRlIgorICAgICAgICAgIHZhbHVlLWZvcm1hdD0ieXl5eS1NTS1kZCIKKyAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSI+CisgICAgICAgIDwvZWwtZGF0ZS1waWNrZXI+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iPgorICAgICAgICA8ZWwtZGF0ZS1waWNrZXIKKyAgICAgICAgICB2LW1vZGVsPSJkYXRlcmFuZ2Uke0F0dHJOYW1lfSIKKyAgICAgICAgICBzdHlsZT0id2lkdGg6IDI0MHB4IgorICAgICAgICAgIHZhbHVlLWZvcm1hdD0ieXl5eS1NTS1kZCIKKyAgICAgICAgICB0eXBlPSJkYXRlcmFuZ2UiCisgICAgICAgICAgcmFuZ2Utc2VwYXJhdG9yPSItIgorICAgICAgICAgIHN0YXJ0LXBsYWNlaG9sZGVyPSLlvIDlp4vml6XmnJ8iCisgICAgICAgICAgZW5kLXBsYWNlaG9sZGVyPSLnu5PmnZ/ml6XmnJ8iCisgICAgICAgID48L2VsLWRhdGUtcGlja2VyPgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZW5kCisjZW5kCisjZW5kCisgICAgICA8ZWwtZm9ybS1pdGVtPgorICAgICAgICA8ZWwtYnV0dG9uIHR5cGU9InByaW1hcnkiIGljb249ImVsLWljb24tc2VhcmNoIiBzaXplPSJtaW5pIiBAY2xpY2s9ImhhbmRsZVF1ZXJ5Ij7mkJzntKI8L2VsLWJ1dHRvbj4KKyAgICAgICAgPGVsLWJ1dHRvbiBpY29uPSJlbC1pY29uLXJlZnJlc2giIHNpemU9Im1pbmkiIEBjbGljaz0icmVzZXRRdWVyeSI+6YeN572uPC9lbC1idXR0b24+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyAgICA8L2VsLWZvcm0+CisKKyAgICA8ZWwtcm93IDpndXR0ZXI9IjEwIiBjbGFzcz0ibWI4Ij4KKyAgICAgIDxlbC1jb2wgOnNwYW49IjEuNSI+CisgICAgICAgIDxlbC1idXR0b24KKyAgICAgICAgICB0eXBlPSJwcmltYXJ5IgorICAgICAgICAgIHBsYWluCisgICAgICAgICAgaWNvbj0iZWwtaWNvbi1wbHVzIgorICAgICAgICAgIHNpemU9Im1pbmkiCisgICAgICAgICAgQGNsaWNrPSJoYW5kbGVBZGQiCisgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTphZGQnXSIKKyAgICAgICAgPuaWsOWinjwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgdHlwZT0ic3VjY2VzcyIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249ImVsLWljb24tZWRpdCIKKyAgICAgICAgICBzaXplPSJtaW5pIgorICAgICAgICAgIDpkaXNhYmxlZD0ic2luZ2xlIgorICAgICAgICAgIEBjbGljaz0iaGFuZGxlVXBkYXRlIgorICAgICAgICAgIHYtaGFzUGVybWk9IlsnJHttb2R1bGVOYW1lfToke2J1c2luZXNzTmFtZX06ZWRpdCddIgorICAgICAgICA+5L+u5pS5PC9lbC1idXR0b24+CisgICAgICA8L2VsLWNvbD4KKyAgICAgIDxlbC1jb2wgOnNwYW49IjEuNSI+CisgICAgICAgIDxlbC1idXR0b24KKyAgICAgICAgICB0eXBlPSJkYW5nZXIiCisgICAgICAgICAgcGxhaW4KKyAgICAgICAgICBpY29uPSJlbC1pY29uLWRlbGV0ZSIKKyAgICAgICAgICBzaXplPSJtaW5pIgorICAgICAgICAgIDpkaXNhYmxlZD0ibXVsdGlwbGUiCisgICAgICAgICAgQGNsaWNrPSJoYW5kbGVEZWxldGUiCisgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTpyZW1vdmUnXSIKKyAgICAgICAgPuWIoOmZpDwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgdHlwZT0id2FybmluZyIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249ImVsLWljb24tZG93bmxvYWQiCisgICAgICAgICAgc2l6ZT0ibWluaSIKKyAgICAgICAgICBAY2xpY2s9ImhhbmRsZUV4cG9ydCIKKyAgICAgICAgICB2LWhhc1Blcm1pPSJbJyR7bW9kdWxlTmFtZX06JHtidXNpbmVzc05hbWV9OmV4cG9ydCddIgorICAgICAgICA+5a+85Ye6PC9lbC1idXR0b24+CisgICAgICA8L2VsLWNvbD4KKyAgICAgIDxyaWdodC10b29sYmFyIDpzaG93U2VhcmNoLnN5bmM9InNob3dTZWFyY2giIEBxdWVyeVRhYmxlPSJnZXRMaXN0Ij48L3JpZ2h0LXRvb2xiYXI+CisgICAgPC9lbC1yb3c+CisKKyAgICA8ZWwtdGFibGUgdi1sb2FkaW5nPSJsb2FkaW5nIiA6ZGF0YT0iJHtidXNpbmVzc05hbWV9TGlzdCIgQHNlbGVjdGlvbi1jaGFuZ2U9ImhhbmRsZVNlbGVjdGlvbkNoYW5nZSI+CisgICAgICA8ZWwtdGFibGUtY29sdW1uIHR5cGU9InNlbGVjdGlvbiIgd2lkdGg9IjU1IiBhbGlnbj0iY2VudGVyIiAvPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGphdmFGaWVsZD0kY29sdW1uLmphdmFGaWVsZCkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNpZigkY29sdW1uLnBrKQorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJHtjb21tZW50fSIgYWxpZ249ImNlbnRlciIgcHJvcD0iJHtqYXZhRmllbGR9IiAvPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiKQorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJHtjb21tZW50fSIgYWxpZ249ImNlbnRlciIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMTgwIj4KKyAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9InNjb3BlIj4KKyAgICAgICAgICA8c3Bhbj57eyBwYXJzZVRpbWUoc2NvcGUucm93LiR7amF2YUZpZWxkfSwgJ3t5fS17bX0te2R9JykgfX08L3NwYW4+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImltYWdlVXBsb2FkIikKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgd2lkdGg9IjEwMCI+CisgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgPGltYWdlLXByZXZpZXcgOnNyYz0ic2NvcGUucm93LiR7amF2YUZpZWxkfSIgOndpZHRoPSI1MCIgOmhlaWdodD0iNTAiLz4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGNvbHVtbi5kaWN0VHlwZSkKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSI+CisgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgICAgICAgIDxkaWN0LXRhZyA6b3B0aW9ucz0iZGljdC50eXBlLiR7Y29sdW1uLmRpY3RUeXBlfSIgOnZhbHVlPSJzY29wZS5yb3cuJHtqYXZhRmllbGR9ID8gc2NvcGUucm93LiR7amF2YUZpZWxkfS5zcGxpdCgnLCcpIDogW10iLz4KKyNlbHNlCisgICAgICAgICAgPGRpY3QtdGFnIDpvcHRpb25zPSJkaWN0LnR5cGUuJHtjb2x1bW4uZGljdFR5cGV9IiA6dmFsdWU9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iLz4KKyNlbmQKKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGphdmFGaWVsZCkKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgLz4KKyNlbmQKKyNlbmQKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IuaTjeS9nCIgYWxpZ249ImNlbnRlciIgY2xhc3MtbmFtZT0ic21hbGwtcGFkZGluZyBmaXhlZC13aWR0aCI+CisgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgICAgc2l6ZT0ibWluaSIKKyAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICBpY29uPSJlbC1pY29uLWVkaXQiCisgICAgICAgICAgICBAY2xpY2s9ImhhbmRsZVVwZGF0ZShzY29wZS5yb3cpIgorICAgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTplZGl0J10iCisgICAgICAgICAgPuS/ruaUuTwvZWwtYnV0dG9uPgorICAgICAgICAgIDxlbC1idXR0b24KKyAgICAgICAgICAgIHNpemU9Im1pbmkiCisgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgaWNvbj0iZWwtaWNvbi1kZWxldGUiCisgICAgICAgICAgICBAY2xpY2s9ImhhbmRsZURlbGV0ZShzY29wZS5yb3cpIgorICAgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTpyZW1vdmUnXSIKKyAgICAgICAgICA+5Yig6ZmkPC9lbC1idXR0b24+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyAgICA8L2VsLXRhYmxlPgorICAgIAorICAgIDxwYWdpbmF0aW9uCisgICAgICB2LXNob3c9InRvdGFsPjAiCisgICAgICA6dG90YWw9InRvdGFsIgorICAgICAgOnBhZ2Uuc3luYz0icXVlcnlQYXJhbXMucGFnZU51bSIKKyAgICAgIDpsaW1pdC5zeW5jPSJxdWVyeVBhcmFtcy5wYWdlU2l6ZSIKKyAgICAgIEBwYWdpbmF0aW9uPSJnZXRMaXN0IgorICAgIC8+CisKKyAgICA8IS0tIOa3u+WKoOaIluS/ruaUuSR7ZnVuY3Rpb25OYW1lfeWvueivneahhiAtLT4KKyAgICA8ZWwtZGlhbG9nIDp0aXRsZT0idGl0bGUiIDp2aXNpYmxlLnN5bmM9Im9wZW4iIHdpZHRoPSI1MDBweCIgYXBwZW5kLXRvLWJvZHk+CisgICAgICA8ZWwtZm9ybSByZWY9ImZvcm0iIDptb2RlbD0iZm9ybSIgOnJ1bGVzPSJydWxlcyIgbGFiZWwtd2lkdGg9IjgwcHgiPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI2lmKCRjb2x1bW4uaW5zZXJ0ICYmICEkY29sdW1uLnBrKQorI2lmKCgkY29sdW1uLnVzYWJsZUNvbHVtbikgfHwgKCEkY29sdW1uLnN1cGVyQ29sdW1uKSkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWlucHV0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fovpPlhaUke2NvbW1lbnR9IiAvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW1hZ2VVcGxvYWQiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGltYWdlLXVwbG9hZCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ii8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJmaWxlVXBsb2FkIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxmaWxlLXVwbG9hZCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ii8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJlZGl0b3IiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9Ij4KKyAgICAgICAgICA8ZWRpdG9yIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIDptaW4taGVpZ2h0PSIxOTIiLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgJiYgIiIgIT0gJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSI+CisgICAgICAgICAgICA8ZWwtb3B0aW9uCisgICAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluIGRpY3QudHlwZS4ke2RpY3RUeXBlfSIKKyAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgICAgOmxhYmVsPSJkaWN0LmxhYmVsIgorI2lmKCRjb2x1bW4uamF2YVR5cGUgPT0gIkludGVnZXIiIHx8ICRjb2x1bW4uamF2YVR5cGUgPT0gIkxvbmciKQorICAgICAgICAgICAgICA6dmFsdWU9InBhcnNlSW50KGRpY3QudmFsdWUpIgorI2Vsc2UKKyAgICAgICAgICAgICAgOnZhbHVlPSJkaWN0LnZhbHVlIgorI2VuZAorICAgICAgICAgICAgPjwvZWwtb3B0aW9uPgorICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiAmJiAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fpgInmi6kke2NvbW1lbnR9Ij4KKyAgICAgICAgICAgIDxlbC1vcHRpb24gbGFiZWw9Iuivt+mAieaLqeWtl+WFuOeUn+aIkCIgdmFsdWU9IiIgLz4KKyAgICAgICAgICA8L2VsLXNlbGVjdD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IiAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtY2hlY2tib3gtZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtY2hlY2tib3gKKyAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gZGljdC50eXBlLiR7ZGljdFR5cGV9IgorICAgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgICA6bGFiZWw9ImRpY3QudmFsdWUiPgorICAgICAgICAgICAgICB7e2RpY3QubGFiZWx9fQorICAgICAgICAgICAgPC9lbC1jaGVja2JveD4KKyAgICAgICAgICA8L2VsLWNoZWNrYm94LWdyb3VwPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giICYmICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1jaGVja2JveC1ncm91cCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ij4KKyAgICAgICAgICAgIDxlbC1jaGVja2JveD7or7fpgInmi6nlrZflhbjnlJ/miJA8L2VsLWNoZWNrYm94PgorICAgICAgICAgIDwvZWwtY2hlY2tib3gtZ3JvdXA+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIgJiYgIiIgIT0gJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLXJhZGlvLWdyb3VwIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iPgorICAgICAgICAgICAgPGVsLXJhZGlvCisgICAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluIGRpY3QudHlwZS4ke2RpY3RUeXBlfSIKKyAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyNpZigkY29sdW1uLmphdmFUeXBlID09ICJJbnRlZ2VyIiB8fCAkY29sdW1uLmphdmFUeXBlID09ICJMb25nIikKKyAgICAgICAgICAgICAgOmxhYmVsPSJwYXJzZUludChkaWN0LnZhbHVlKSIKKyNlbHNlCisgICAgICAgICAgICAgIDpsYWJlbD0iZGljdC52YWx1ZSIKKyNlbmQKKyAgICAgICAgICAgID57e2RpY3QubGFiZWx9fTwvZWwtcmFkaW8+CisgICAgICAgICAgPC9lbC1yYWRpby1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIiAmJiAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtcmFkaW8tZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtcmFkaW8gbGFiZWw9IjEiPuivt+mAieaLqeWtl+WFuOeUn+aIkDwvZWwtcmFkaW8+CisgICAgICAgICAgPC9lbC1yYWRpby1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1kYXRlLXBpY2tlciBjbGVhcmFibGUKKyAgICAgICAgICAgIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iCisgICAgICAgICAgICB0eXBlPSJkYXRlIgorICAgICAgICAgICAgdmFsdWUtZm9ybWF0PSJ5eXl5LU1NLWRkIgorICAgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICAgIDwvZWwtZGF0ZS1waWNrZXI+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJ0ZXh0YXJlYSIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtaW5wdXQgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgdHlwZT0idGV4dGFyZWEiIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlhoXlrrkiIC8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI2lmKCR0YWJsZS5zdWIpCisgICAgICAgIDxlbC1kaXZpZGVyIGNvbnRlbnQtcG9zaXRpb249ImNlbnRlciI+JHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95L+h5oGvPC9lbC1kaXZpZGVyPgorICAgICAgICA8ZWwtcm93IDpndXR0ZXI9IjEwIiBjbGFzcz0ibWI4Ij4KKyAgICAgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICAgICAgPGVsLWJ1dHRvbiB0eXBlPSJwcmltYXJ5IiBpY29uPSJlbC1pY29uLXBsdXMiIHNpemU9Im1pbmkiIEBjbGljaz0iaGFuZGxlQWRkJHtzdWJDbGFzc05hbWV9Ij7mt7vliqA8L2VsLWJ1dHRvbj4KKyAgICAgICAgICA8L2VsLWNvbD4KKyAgICAgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICAgICAgPGVsLWJ1dHRvbiB0eXBlPSJkYW5nZXIiIGljb249ImVsLWljb24tZGVsZXRlIiBzaXplPSJtaW5pIiBAY2xpY2s9ImhhbmRsZURlbGV0ZSR7c3ViQ2xhc3NOYW1lfSI+5Yig6ZmkPC9lbC1idXR0b24+CisgICAgICAgICAgPC9lbC1jb2w+CisgICAgICAgIDwvZWwtcm93PgorICAgICAgICA8ZWwtdGFibGUgOmRhdGE9IiR7c3ViY2xhc3NOYW1lfUxpc3QiIDpyb3ctY2xhc3MtbmFtZT0icm93JHtzdWJDbGFzc05hbWV9SW5kZXgiIEBzZWxlY3Rpb24tY2hhbmdlPSJoYW5kbGUke3N1YkNsYXNzTmFtZX1TZWxlY3Rpb25DaGFuZ2UiIHJlZj0iJHtzdWJjbGFzc05hbWV9Ij4KKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIHR5cGU9InNlbGVjdGlvbiIgd2lkdGg9IjUwIiBhbGlnbj0iY2VudGVyIiAvPgorICAgICAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IuW6j+WPtyIgYWxpZ249ImNlbnRlciIgcHJvcD0iaW5kZXgiIHdpZHRoPSI1MCIvPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkc3ViVGFibGUuY29sdW1ucykKKyNzZXQoJGphdmFGaWVsZD0kY29sdW1uLmphdmFGaWVsZCkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNpZigkY29sdW1uLnBrIHx8ICRqYXZhRmllbGQgPT0gJHtzdWJUYWJsZUZrY2xhc3NOYW1lfSkKKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImlucHV0IikKKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIkY29tbWVudCIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMTUwIj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgICAgIDxlbC1pbnB1dCB2LW1vZGVsPSJzY29wZS5yb3cuJGphdmFGaWVsZCIgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSRjb21tZW50IiAvPgorICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIikKKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIkY29tbWVudCIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMjQwIj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgICAgIDxlbC1kYXRlLXBpY2tlciBjbGVhcmFibGUgdi1tb2RlbD0ic2NvcGUucm93LiRqYXZhRmllbGQiIHR5cGU9ImRhdGUiIHZhbHVlLWZvcm1hdD0ieXl5eS1NTS1kZCIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSRjb21tZW50IiAvPgorICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICgkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiIHx8ICRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIikgJiYgIiIgIT0gJGNvbHVtbi5kaWN0VHlwZSkKKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIkY29tbWVudCIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMTUwIj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBzbG90LXNjb3BlPSJzY29wZSI+CisgICAgICAgICAgICAgIDxlbC1zZWxlY3Qgdi1tb2RlbD0ic2NvcGUucm93LiRqYXZhRmllbGQiIHBsYWNlaG9sZGVyPSLor7fpgInmi6kkY29tbWVudCI+CisgICAgICAgICAgICAgICAgPGVsLW9wdGlvbgorICAgICAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gZGljdC50eXBlLiRjb2x1bW4uZGljdFR5cGUiCisgICAgICAgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgICAgICAgOmxhYmVsPSJkaWN0LmxhYmVsIgorICAgICAgICAgICAgICAgICAgOnZhbHVlPSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgICAgID48L2VsLW9wdGlvbj4KKyAgICAgICAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAiIiA9PSAkY29sdW1uLmRpY3RUeXBlKQorICAgICAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiRjb21tZW50IiBwcm9wPSIke2phdmFGaWVsZH0iIHdpZHRoPSIxNTAiPgorICAgICAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9InNjb3BlIj4KKyAgICAgICAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJzY29wZS5yb3cuJGphdmFGaWVsZCIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSRjb21tZW50Ij4KKyAgICAgICAgICAgICAgICA8ZWwtb3B0aW9uIGxhYmVsPSLor7fpgInmi6nlrZflhbjnlJ/miJAiIHZhbHVlPSIiIC8+CisgICAgICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbmQKKyNlbmQKKyAgICAgICAgPC9lbC10YWJsZT4KKyNlbmQKKyAgICAgIDwvZWwtZm9ybT4KKyAgICAgIDxkaXYgc2xvdD0iZm9vdGVyIiBjbGFzcz0iZGlhbG9nLWZvb3RlciI+CisgICAgICAgIDxlbC1idXR0b24gdHlwZT0icHJpbWFyeSIgQGNsaWNrPSJzdWJtaXRGb3JtIj7noa4g5a6aPC9lbC1idXR0b24+CisgICAgICAgIDxlbC1idXR0b24gQGNsaWNrPSJjYW5jZWwiPuWPliDmtog8L2VsLWJ1dHRvbj4KKyAgICAgIDwvZGl2PgorICAgIDwvZWwtZGlhbG9nPgorICA8L2Rpdj4KKzwvdGVtcGxhdGU+CisKKzxzY3JpcHQ+CitpbXBvcnQgeyBsaXN0JHtCdXNpbmVzc05hbWV9LCBnZXQke0J1c2luZXNzTmFtZX0sIGRlbCR7QnVzaW5lc3NOYW1lfSwgYWRkJHtCdXNpbmVzc05hbWV9LCB1cGRhdGUke0J1c2luZXNzTmFtZX0gfSBmcm9tICJAL2FwaS8ke21vZHVsZU5hbWV9LyR7YnVzaW5lc3NOYW1lfSI7CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgbmFtZTogIiR7QnVzaW5lc3NOYW1lfSIsCisjaWYoJHtkaWN0c30gIT0gJycpCisgIGRpY3RzOiBbJHtkaWN0c31dLAorI2VuZAorICBkYXRhKCkgeworICAgIHJldHVybiB7CisgICAgICAvLyDpga7nvanlsYIKKyAgICAgIGxvYWRpbmc6IHRydWUsCisgICAgICAvLyDpgInkuK3mlbDnu4QKKyAgICAgIGlkczogW10sCisjaWYoJHRhYmxlLnN1YikKKyAgICAgIC8vIOWtkOihqOmAieS4reaVsOaNrgorICAgICAgY2hlY2tlZCR7c3ViQ2xhc3NOYW1lfTogW10sCisjZW5kCisgICAgICAvLyDpnZ7ljZXkuKrnpoHnlKgKKyAgICAgIHNpbmdsZTogdHJ1ZSwKKyAgICAgIC8vIOmdnuWkmuS4quemgeeUqAorICAgICAgbXVsdGlwbGU6IHRydWUsCisgICAgICAvLyDmmL7npLrmkJzntKLmnaHku7YKKyAgICAgIHNob3dTZWFyY2g6IHRydWUsCisgICAgICAvLyDmgLvmnaHmlbAKKyAgICAgIHRvdGFsOiAwLAorICAgICAgLy8gJHtmdW5jdGlvbk5hbWV96KGo5qC85pWw5o2uCisgICAgICAke2J1c2luZXNzTmFtZX1MaXN0OiBbXSwKKyNpZigkdGFibGUuc3ViKQorICAgICAgLy8gJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV96KGo5qC85pWw5o2uCisgICAgICAke3N1YmNsYXNzTmFtZX1MaXN0OiBbXSwKKyNlbmQKKyAgICAgIC8vIOW8ueWHuuWxguagh+mimAorICAgICAgdGl0bGU6ICIiLAorICAgICAgLy8g5piv5ZCm5pi+56S65by55Ye65bGCCisgICAgICBvcGVuOiBmYWxzZSwKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgICAgICAvLyAkY29tbWVudOaXtumXtOiMg+WbtAorICAgICAgZGF0ZXJhbmdlJHtBdHRyTmFtZX06IFtdLAorI2VuZAorI2VuZAorICAgICAgLy8g5p+l6K+i5Y+C5pWwCisgICAgICBxdWVyeVBhcmFtczogeworICAgICAgICBwYWdlTnVtOiAxLAorICAgICAgICBwYWdlU2l6ZTogMTAsCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLnF1ZXJ5KQorICAgICAgICAkY29sdW1uLmphdmFGaWVsZDogbnVsbCNpZigkZm9yZWFjaC5jb3VudCAhPSAkY29sdW1ucy5zaXplKCkpLCNlbmQKKyNlbmQKKyNlbmQKKyAgICAgIH0sCisgICAgICAvLyDooajljZXlj4LmlbAKKyAgICAgIGZvcm06IHt9LAorICAgICAgLy8g6KGo5Y2V5qCh6aqMCisgICAgICBydWxlczogeworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5yZXF1aXJlZCkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IFsKKyAgICAgICAgICB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAiJGNvbW1lbnTkuI3og73kuLrnqboiLCB0cmlnZ2VyOiAjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiB8fCAkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIpImNoYW5nZSIjZWxzZSJibHVyIiNlbmQgfQorICAgICAgICBdI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZAorI2VuZAorI2VuZAorICAgICAgfQorICAgIH07CisgIH0sCisgIGNyZWF0ZWQoKSB7CisgICAgdGhpcy5nZXRMaXN0KCk7CisgIH0sCisgIG1ldGhvZHM6IHsKKyAgICAvKiog5p+l6K+iJHtmdW5jdGlvbk5hbWV95YiX6KGoICovCisgICAgZ2V0TGlzdCgpIHsKKyAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgPT0gIkJFVFdFRU4iKQorICAgICAgdGhpcy5xdWVyeVBhcmFtcy5wYXJhbXMgPSB7fTsKKyNicmVhaworI2VuZAorI2VuZAorI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyAke2NvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEpfSkKKyAgICAgIGlmIChudWxsICE9IHRoaXMuZGF0ZXJhbmdlJHtBdHRyTmFtZX0gJiYgJycgIT0gdGhpcy5kYXRlcmFuZ2Uke0F0dHJOYW1lfSkgeworICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zLnBhcmFtc1siYmVnaW4ke0F0dHJOYW1lfSJdID0gdGhpcy5kYXRlcmFuZ2Uke0F0dHJOYW1lfVswXTsKKyAgICAgICAgdGhpcy5xdWVyeVBhcmFtcy5wYXJhbXNbImVuZCR7QXR0ck5hbWV9Il0gPSB0aGlzLmRhdGVyYW5nZSR7QXR0ck5hbWV9WzFdOworICAgICAgfQorI2VuZAorI2VuZAorICAgICAgbGlzdCR7QnVzaW5lc3NOYW1lfSh0aGlzLnF1ZXJ5UGFyYW1zKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgICAgdGhpcy4ke2J1c2luZXNzTmFtZX1MaXN0ID0gcmVzcG9uc2Uucm93czsKKyAgICAgICAgdGhpcy50b3RhbCA9IHJlc3BvbnNlLnRvdGFsOworICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKKyAgICAgIH0pOworICAgIH0sCisgICAgLy8g5Y+W5raI5oyJ6ZKuCisgICAgY2FuY2VsKCkgeworICAgICAgdGhpcy5vcGVuID0gZmFsc2U7CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfSwKKyAgICAvLyDooajljZXph43nva4KKyAgICByZXNldCgpIHsKKyAgICAgIHRoaXMuZm9ybSA9IHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IikKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IFtdI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZAorI2Vsc2UKKyAgICAgICAgJGNvbHVtbi5qYXZhRmllbGQ6IG51bGwjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgICAgICB9OworI2lmKCR0YWJsZS5zdWIpCisgICAgICB0aGlzLiR7c3ViY2xhc3NOYW1lfUxpc3QgPSBbXTsKKyNlbmQKKyAgICAgIHRoaXMucmVzZXRGb3JtKCJmb3JtIik7CisgICAgfSwKKyAgICAvKiog5pCc57Si5oyJ6ZKu5pON5L2cICovCisgICAgaGFuZGxlUXVlcnkoKSB7CisgICAgICB0aGlzLnF1ZXJ5UGFyYW1zLnBhZ2VOdW0gPSAxOworICAgICAgdGhpcy5nZXRMaXN0KCk7CisgICAgfSwKKyAgICAvKiog6YeN572u5oyJ6ZKu5pON5L2cICovCisgICAgcmVzZXRRdWVyeSgpIHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgICAgICB0aGlzLmRhdGVyYW5nZSR7QXR0ck5hbWV9ID0gW107CisjZW5kCisjZW5kCisgICAgICB0aGlzLnJlc2V0Rm9ybSgicXVlcnlGb3JtIik7CisgICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7CisgICAgfSwKKyAgICAvLyDlpJrpgInmoYbpgInkuK3mlbDmja4KKyAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uKSB7CisgICAgICB0aGlzLmlkcyA9IHNlbGVjdGlvbi5tYXAoaXRlbSA9PiBpdGVtLiR7cGtDb2x1bW4uamF2YUZpZWxkfSkKKyAgICAgIHRoaXMuc2luZ2xlID0gc2VsZWN0aW9uLmxlbmd0aCE9PTEKKyAgICAgIHRoaXMubXVsdGlwbGUgPSAhc2VsZWN0aW9uLmxlbmd0aAorICAgIH0sCisgICAgLyoqIOaWsOWinuaMiemSruaTjeS9nCAqLworICAgIGhhbmRsZUFkZCgpIHsKKyAgICAgIHRoaXMucmVzZXQoKTsKKyAgICAgIHRoaXMub3BlbiA9IHRydWU7CisgICAgICB0aGlzLnRpdGxlID0gIua3u+WKoCR7ZnVuY3Rpb25OYW1lfSI7CisgICAgfSwKKyAgICAvKiog5L+u5pS55oyJ6ZKu5pON5L2cICovCisgICAgaGFuZGxlVXBkYXRlKHJvdykgeworICAgICAgdGhpcy5yZXNldCgpOworICAgICAgY29uc3QgJHtwa0NvbHVtbi5qYXZhRmllbGR9ID0gcm93LiR7cGtDb2x1bW4uamF2YUZpZWxkfSB8fCB0aGlzLmlkcworICAgICAgZ2V0JHtCdXNpbmVzc05hbWV9KCR7cGtDb2x1bW4uamF2YUZpZWxkfSkudGhlbihyZXNwb25zZSA9PiB7CisgICAgICAgIHRoaXMuZm9ybSA9IHJlc3BvbnNlLmRhdGE7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICAgIHRoaXMuZm9ybS4kY29sdW1uLmphdmFGaWVsZCA9IHRoaXMuZm9ybS4ke2NvbHVtbi5qYXZhRmllbGR9LnNwbGl0KCIsIik7CisjZW5kCisjZW5kCisjaWYoJHRhYmxlLnN1YikKKyAgICAgICAgdGhpcy4ke3N1YmNsYXNzTmFtZX1MaXN0ID0gcmVzcG9uc2UuZGF0YS4ke3N1YmNsYXNzTmFtZX1MaXN0OworI2VuZAorICAgICAgICB0aGlzLm9wZW4gPSB0cnVlOworICAgICAgICB0aGlzLnRpdGxlID0gIuS/ruaUuSR7ZnVuY3Rpb25OYW1lfSI7CisgICAgICB9KTsKKyAgICB9LAorICAgIC8qKiDmj5DkuqTmjInpkq4gKi8KKyAgICBzdWJtaXRGb3JtKCkgeworICAgICAgdGhpcy4jW1skXV0jcmVmc1siZm9ybSJdLnZhbGlkYXRlKHZhbGlkID0+IHsKKyAgICAgICAgaWYgKHZhbGlkKSB7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICAgICAgdGhpcy5mb3JtLiRjb2x1bW4uamF2YUZpZWxkID0gdGhpcy5mb3JtLiR7Y29sdW1uLmphdmFGaWVsZH0uam9pbigiLCIpOworI2VuZAorI2VuZAorI2lmKCR0YWJsZS5zdWIpCisgICAgICAgICAgdGhpcy5mb3JtLiR7c3ViY2xhc3NOYW1lfUxpc3QgPSB0aGlzLiR7c3ViY2xhc3NOYW1lfUxpc3Q7CisjZW5kCisgICAgICAgICAgaWYgKHRoaXMuZm9ybS4ke3BrQ29sdW1uLmphdmFGaWVsZH0gIT0gbnVsbCkgeworICAgICAgICAgICAgdXBkYXRlJHtCdXNpbmVzc05hbWV9KHRoaXMuZm9ybSkudGhlbihyZXNwb25zZSA9PiB7CisgICAgICAgICAgICAgIHRoaXMuI1tbJG1vZGFsXV0jLm1zZ1N1Y2Nlc3MoIuS/ruaUueaIkOWKnyIpOworICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgdGhpcy5nZXRMaXN0KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkJHtCdXNpbmVzc05hbWV9KHRoaXMuZm9ybSkudGhlbihyZXNwb25zZSA9PiB7CisgICAgICAgICAgICAgIHRoaXMuI1tbJG1vZGFsXV0jLm1zZ1N1Y2Nlc3MoIuaWsOWinuaIkOWKnyIpOworICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgdGhpcy5nZXRMaXN0KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sCisgICAgLyoqIOWIoOmZpOaMiemSruaTjeS9nCAqLworICAgIGhhbmRsZURlbGV0ZShyb3cpIHsKKyAgICAgIGNvbnN0ICR7cGtDb2x1bW4uamF2YUZpZWxkfXMgPSByb3cuJHtwa0NvbHVtbi5qYXZhRmllbGR9IHx8IHRoaXMuaWRzOworICAgICAgdGhpcy4jW1skbW9kYWxdXSMuY29uZmlybSgn5piv5ZCm56Gu6K6k5Yig6ZmkJHtmdW5jdGlvbk5hbWV957yW5Y+35Li6IicgKyAke3BrQ29sdW1uLmphdmFGaWVsZH1zICsgJyLnmoTmlbDmja7pobnvvJ8nKS50aGVuKGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVsJHtCdXNpbmVzc05hbWV9KCR7cGtDb2x1bW4uamF2YUZpZWxkfXMpOworICAgICAgfSkudGhlbigoKSA9PiB7CisgICAgICAgIHRoaXMuZ2V0TGlzdCgpOworICAgICAgICB0aGlzLiNbWyRtb2RhbF1dIy5tc2dTdWNjZXNzKCLliKDpmaTmiJDlip8iKTsKKyAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTsKKyAgICB9LAorI2lmKCR0YWJsZS5zdWIpCisJLyoqICR7c3ViVGFibGUuZnVuY3Rpb25OYW1lfeW6j+WPtyAqLworICAgIHJvdyR7c3ViQ2xhc3NOYW1lfUluZGV4KHsgcm93LCByb3dJbmRleCB9KSB7CisgICAgICByb3cuaW5kZXggPSByb3dJbmRleCArIDE7CisgICAgfSwKKyAgICAvKiogJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95re75Yqg5oyJ6ZKu5pON5L2cICovCisgICAgaGFuZGxlQWRkJHtzdWJDbGFzc05hbWV9KCkgeworICAgICAgbGV0IG9iaiA9IHt9OworI2ZvcmVhY2goJGNvbHVtbiBpbiAkc3ViVGFibGUuY29sdW1ucykKKyNpZigkY29sdW1uLnBrIHx8ICRjb2x1bW4uamF2YUZpZWxkID09ICR7c3ViVGFibGVGa2NsYXNzTmFtZX0pCisjZWxzZWlmKCRjb2x1bW4ubGlzdCAmJiAiIiAhPSAkamF2YUZpZWxkKQorICAgICAgb2JqLiRjb2x1bW4uamF2YUZpZWxkID0gIiI7CisjZW5kCisjZW5kCisgICAgICB0aGlzLiR7c3ViY2xhc3NOYW1lfUxpc3QucHVzaChvYmopOworICAgIH0sCisgICAgLyoqICR7c3ViVGFibGUuZnVuY3Rpb25OYW1lfeWIoOmZpOaMiemSruaTjeS9nCAqLworICAgIGhhbmRsZURlbGV0ZSR7c3ViQ2xhc3NOYW1lfSgpIHsKKyAgICAgIGlmICh0aGlzLmNoZWNrZWQke3N1YkNsYXNzTmFtZX0ubGVuZ3RoID09IDApIHsKKyAgICAgICAgdGhpcy4jW1skbW9kYWxdXSMubXNnRXJyb3IoIuivt+WFiOmAieaLqeimgeWIoOmZpOeahCR7c3ViVGFibGUuZnVuY3Rpb25OYW1lfeaVsOaNriIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgJHtzdWJjbGFzc05hbWV9TGlzdCA9IHRoaXMuJHtzdWJjbGFzc05hbWV9TGlzdDsKKyAgICAgICAgY29uc3QgY2hlY2tlZCR7c3ViQ2xhc3NOYW1lfSA9IHRoaXMuY2hlY2tlZCR7c3ViQ2xhc3NOYW1lfTsKKyAgICAgICAgdGhpcy4ke3N1YmNsYXNzTmFtZX1MaXN0ID0gJHtzdWJjbGFzc05hbWV9TGlzdC5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgeworICAgICAgICAgIHJldHVybiBjaGVja2VkJHtzdWJDbGFzc05hbWV9LmluZGV4T2YoaXRlbS5pbmRleCkgPT0gLTEKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKyAgICAvKiog5aSN6YCJ5qGG6YCJ5Lit5pWw5o2uICovCisgICAgaGFuZGxlJHtzdWJDbGFzc05hbWV9U2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbikgeworICAgICAgdGhpcy5jaGVja2VkJHtzdWJDbGFzc05hbWV9ID0gc2VsZWN0aW9uLm1hcChpdGVtID0+IGl0ZW0uaW5kZXgpCisgICAgfSwKKyNlbmQKKyAgICAvKiog5a+85Ye65oyJ6ZKu5pON5L2cICovCisgICAgaGFuZGxlRXhwb3J0KCkgeworICAgICAgdGhpcy5kb3dubG9hZCgnJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0vZXhwb3J0JywgeworICAgICAgICAuLi50aGlzLnF1ZXJ5UGFyYW1zCisgICAgICB9LCBgJHtidXNpbmVzc05hbWV9XyNbWyR7bmV3IERhdGUoKS5nZXRUaW1lKCl9XV0jLnhsc3hgKQorICAgIH0KKyAgfQorfTsKKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvdjMvaW5kZXgtdHJlZS52dWUudm0gYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL3Z1ZS92My9pbmRleC10cmVlLnZ1ZS52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTRkNjJiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS92dWUvdjMvaW5kZXgtdHJlZS52dWUudm0KQEAgLTAsMCArMSw0NzQgQEAKKzx0ZW1wbGF0ZT4KKyAgPGRpdiBjbGFzcz0iYXBwLWNvbnRhaW5lciI+CisgICAgPGVsLWZvcm0gOm1vZGVsPSJxdWVyeVBhcmFtcyIgcmVmPSJxdWVyeVJlZiIgOmlubGluZT0idHJ1ZSIgdi1zaG93PSJzaG93U2VhcmNoIiBsYWJlbC13aWR0aD0iNjhweCI+CisjZm9yZWFjaCgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4ucXVlcnkpCisjc2V0KCRkaWN0VHlwZT0kY29sdW1uLmRpY3RUeXBlKQorI3NldCgkQXR0ck5hbWU9JGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArICR7Y29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMSl9KQorI3NldCgkcGFyZW50aGVzZUluZGV4PSRjb2x1bW4uY29sdW1uQ29tbWVudC5pbmRleE9mKCLvvIgiKSkKKyNpZigkcGFyZW50aGVzZUluZGV4ICE9IC0xKQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuc3Vic3RyaW5nKDAsICRwYXJlbnRoZXNlSW5kZXgpKQorI2Vsc2UKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50KQorI2VuZAorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImlucHV0IikKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7Y29sdW1uLmphdmFGaWVsZH0iPgorICAgICAgICA8ZWwtaW5wdXQKKyAgICAgICAgICB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IgorICAgICAgICAgIHBsYWNlaG9sZGVyPSLor7fovpPlhaUke2NvbW1lbnR9IgorICAgICAgICAgIGNsZWFyYWJsZQorICAgICAgICAgIEBrZXl1cC5lbnRlcj0iaGFuZGxlUXVlcnkiCisgICAgICAgIC8+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIgY2xlYXJhYmxlPgorICAgICAgICAgIDxlbC1vcHRpb24KKyAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluICR7ZGljdFR5cGV9IgorICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgIDpsYWJlbD0iZGljdC5sYWJlbCIKKyAgICAgICAgICAgIDp2YWx1ZT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAvPgorICAgICAgICA8L2VsLXNlbGVjdD4KKyAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiB8fCAkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIpICYmICRkaWN0VHlwZSkKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7Y29sdW1uLmphdmFGaWVsZH0iPgorICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fpgInmi6kke2NvbW1lbnR9IiBjbGVhcmFibGU+CisgICAgICAgICAgPGVsLW9wdGlvbiBsYWJlbD0i6K+36YCJ5oup5a2X5YW455Sf5oiQIiB2YWx1ZT0iIiAvPgorICAgICAgICA8L2VsLXNlbGVjdD4KKyAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgIT0gIkJFVFdFRU4iKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtjb2x1bW4uamF2YUZpZWxkfSI+CisgICAgICAgIDxlbC1kYXRlLXBpY2tlciBjbGVhcmFibGUKKyAgICAgICAgICB2LW1vZGVsPSJxdWVyeVBhcmFtcy4ke2NvbHVtbi5qYXZhRmllbGR9IgorICAgICAgICAgIHR5cGU9ImRhdGUiCisgICAgICAgICAgdmFsdWUtZm9ybWF0PSJZWVlZLU1NLUREIgorICAgICAgICAgIHBsYWNlaG9sZGVyPSLpgInmi6kke2NvbW1lbnR9Ij4KKyAgICAgICAgPC9lbC1kYXRlLXBpY2tlcj4KKyAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgPT0gIkJFVFdFRU4iKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgc3R5bGU9IndpZHRoOiAzMDhweCI+CisgICAgICAgIDxlbC1kYXRlLXBpY2tlcgorICAgICAgICAgIHYtbW9kZWw9ImRhdGVyYW5nZSR7QXR0ck5hbWV9IgorICAgICAgICAgIHZhbHVlLWZvcm1hdD0iWVlZWS1NTS1ERCIKKyAgICAgICAgICB0eXBlPSJkYXRlcmFuZ2UiCisgICAgICAgICAgcmFuZ2Utc2VwYXJhdG9yPSItIgorICAgICAgICAgIHN0YXJ0LXBsYWNlaG9sZGVyPSLlvIDlp4vml6XmnJ8iCisgICAgICAgICAgZW5kLXBsYWNlaG9sZGVyPSLnu5PmnZ/ml6XmnJ8iCisgICAgICAgID48L2VsLWRhdGUtcGlja2VyPgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZW5kCisjZW5kCisjZW5kCisgICAgICA8ZWwtZm9ybS1pdGVtPgorICAgICAgICA8ZWwtYnV0dG9uIHR5cGU9InByaW1hcnkiIGljb249IlNlYXJjaCIgQGNsaWNrPSJoYW5kbGVRdWVyeSI+5pCc57SiPC9lbC1idXR0b24+CisgICAgICAgIDxlbC1idXR0b24gaWNvbj0iUmVmcmVzaCIgQGNsaWNrPSJyZXNldFF1ZXJ5Ij7ph43nva48L2VsLWJ1dHRvbj4KKyAgICAgIDwvZWwtZm9ybS1pdGVtPgorICAgIDwvZWwtZm9ybT4KKworICAgIDxlbC1yb3cgOmd1dHRlcj0iMTAiIGNsYXNzPSJtYjgiPgorICAgICAgPGVsLWNvbCA6c3Bhbj0iMS41Ij4KKyAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgIHR5cGU9InByaW1hcnkiCisgICAgICAgICAgcGxhaW4KKyAgICAgICAgICBpY29uPSJQbHVzIgorICAgICAgICAgIEBjbGljaz0iaGFuZGxlQWRkIgorICAgICAgICAgIHYtaGFzUGVybWk9IlsnJHttb2R1bGVOYW1lfToke2J1c2luZXNzTmFtZX06YWRkJ10iCisgICAgICAgID7mlrDlop48L2VsLWJ1dHRvbj4KKyAgICAgIDwvZWwtY29sPgorICAgICAgPGVsLWNvbCA6c3Bhbj0iMS41Ij4KKyAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgIHR5cGU9ImluZm8iCisgICAgICAgICAgcGxhaW4KKyAgICAgICAgICBpY29uPSJTb3J0IgorICAgICAgICAgIEBjbGljaz0idG9nZ2xlRXhwYW5kQWxsIgorICAgICAgICA+5bGV5byAL+aKmOWPoDwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8cmlnaHQtdG9vbGJhciB2LW1vZGVsOnNob3dTZWFyY2g9InNob3dTZWFyY2giIEBxdWVyeVRhYmxlPSJnZXRMaXN0Ij48L3JpZ2h0LXRvb2xiYXI+CisgICAgPC9lbC1yb3c+CisKKyAgICA8ZWwtdGFibGUKKyAgICAgIHYtaWY9InJlZnJlc2hUYWJsZSIKKyAgICAgIHYtbG9hZGluZz0ibG9hZGluZyIKKyAgICAgIDpkYXRhPSIke2J1c2luZXNzTmFtZX1MaXN0IgorICAgICAgcm93LWtleT0iJHt0cmVlQ29kZX0iCisgICAgICA6ZGVmYXVsdC1leHBhbmQtYWxsPSJpc0V4cGFuZEFsbCIKKyAgICAgIDp0cmVlLXByb3BzPSJ7Y2hpbGRyZW46ICdjaGlsZHJlbicsIGhhc0NoaWxkcmVuOiAnaGFzQ2hpbGRyZW4nfSIKKyAgICA+CisjZm9yZWFjaCgkY29sdW1uIGluICRjb2x1bW5zKQorI3NldCgkamF2YUZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI3NldCgkcGFyZW50aGVzZUluZGV4PSRjb2x1bW4uY29sdW1uQ29tbWVudC5pbmRleE9mKCLvvIgiKSkKKyNpZigkcGFyZW50aGVzZUluZGV4ICE9IC0xKQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuc3Vic3RyaW5nKDAsICRwYXJlbnRoZXNlSW5kZXgpKQorI2Vsc2UKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50KQorI2VuZAorI2lmKCRjb2x1bW4ucGspCisjZWxzZWlmKCRjb2x1bW4ubGlzdCAmJiAkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBhbGlnbj0iY2VudGVyIiBwcm9wPSIke2phdmFGaWVsZH0iIHdpZHRoPSIxODAiPgorICAgICAgICA8dGVtcGxhdGUgI2RlZmF1bHQ9InNjb3BlIj4KKyAgICAgICAgICA8c3Bhbj57eyBwYXJzZVRpbWUoc2NvcGUucm93LiR7amF2YUZpZWxkfSwgJ3t5fS17bX0te2R9JykgfX08L3NwYW4+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImltYWdlVXBsb2FkIikKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgd2lkdGg9IjEwMCI+CisgICAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD0ic2NvcGUiPgorICAgICAgICAgIDxpbWFnZS1wcmV2aWV3IDpzcmM9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iIDp3aWR0aD0iNTAiIDpoZWlnaHQ9IjUwIi8+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICIiICE9ICRjb2x1bW4uZGljdFR5cGUpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBhbGlnbj0iY2VudGVyIiBwcm9wPSIke2phdmFGaWVsZH0iPgorICAgICAgICA8dGVtcGxhdGUgI2RlZmF1bHQ9InNjb3BlIj4KKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICAgICAgPGRpY3QtdGFnIDpvcHRpb25zPSIke2NvbHVtbi5kaWN0VHlwZX0iIDp2YWx1ZT0ic2NvcGUucm93LiR7amF2YUZpZWxkfSA/IHNjb3BlLnJvdy4ke2phdmFGaWVsZH0uc3BsaXQoJywnKSA6IFtdIi8+CisjZWxzZQorICAgICAgICAgIDxkaWN0LXRhZyA6b3B0aW9ucz0iJHtjb2x1bW4uZGljdFR5cGV9IiA6dmFsdWU9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iLz4KKyNlbmQKKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGphdmFGaWVsZCkKKyNpZigke2ZvcmVhY2guaW5kZXh9ID09IDEpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2phdmFGaWVsZH0iIC8+CisjZWxzZQorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJHtjb21tZW50fSIgYWxpZ249ImNlbnRlciIgcHJvcD0iJHtqYXZhRmllbGR9IiAvPgorI2VuZAorI2VuZAorI2VuZAorICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0i5pON5L2cIiBhbGlnbj0iY2VudGVyIiBjbGFzcy1uYW1lPSJzbWFsbC1wYWRkaW5nIGZpeGVkLXdpZHRoIj4KKyAgICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PSJzY29wZSI+CisgICAgICAgICAgPGVsLWJ1dHRvbiBsaW5rIHR5cGU9InByaW1hcnkiIGljb249IkVkaXQiIEBjbGljaz0iaGFuZGxlVXBkYXRlKHNjb3BlLnJvdykiIHYtaGFzUGVybWk9IlsnJHttb2R1bGVOYW1lfToke2J1c2luZXNzTmFtZX06ZWRpdCddIj7kv67mlLk8L2VsLWJ1dHRvbj4KKyAgICAgICAgICA8ZWwtYnV0dG9uIGxpbmsgdHlwZT0icHJpbWFyeSIgaWNvbj0iUGx1cyIgQGNsaWNrPSJoYW5kbGVBZGQoc2NvcGUucm93KSIgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTphZGQnXSI+5paw5aKePC9lbC1idXR0b24+CisgICAgICAgICAgPGVsLWJ1dHRvbiBsaW5rIHR5cGU9InByaW1hcnkiIGljb249IkRlbGV0ZSIgQGNsaWNrPSJoYW5kbGVEZWxldGUoc2NvcGUucm93KSIgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTpyZW1vdmUnXSI+5Yig6ZmkPC9lbC1idXR0b24+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyAgICA8L2VsLXRhYmxlPgorCisgICAgPCEtLSDmt7vliqDmiJbkv67mlLkke2Z1bmN0aW9uTmFtZX3lr7nor53moYYgLS0+CisgICAgPGVsLWRpYWxvZyA6dGl0bGU9InRpdGxlIiB2LW1vZGVsPSJvcGVuIiB3aWR0aD0iNTAwcHgiIGFwcGVuZC10by1ib2R5PgorICAgICAgPGVsLWZvcm0gcmVmPSIke2J1c2luZXNzTmFtZX1SZWYiIDptb2RlbD0iZm9ybSIgOnJ1bGVzPSJydWxlcyIgbGFiZWwtd2lkdGg9IjgwcHgiPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI2lmKCRjb2x1bW4uaW5zZXJ0ICYmICEkY29sdW1uLnBrKQorI2lmKCgkY29sdW1uLnVzYWJsZUNvbHVtbikgfHwgKCEkY29sdW1uLnN1cGVyQ29sdW1uKSkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjaWYoIiIgIT0gJHRyZWVQYXJlbnRDb2RlICYmICRjb2x1bW4uamF2YUZpZWxkID09ICR0cmVlUGFyZW50Q29kZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHt0cmVlUGFyZW50Q29kZX0iPgorICAgICAgICAgIDxlbC10cmVlLXNlbGVjdAorICAgICAgICAgICAgdi1tb2RlbD0iZm9ybS4ke3RyZWVQYXJlbnRDb2RlfSIKKyAgICAgICAgICAgIDpkYXRhPSIke2J1c2luZXNzTmFtZX1PcHRpb25zIgorICAgICAgICAgICAgOnByb3BzPSJ7IHZhbHVlOiAnJHt0cmVlQ29kZX0nLCBsYWJlbDogJyR7dHJlZU5hbWV9JywgY2hpbGRyZW46ICdjaGlsZHJlbicgfSIKKyAgICAgICAgICAgIHZhbHVlLWtleT0iJHt0cmVlQ29kZX0iCisgICAgICAgICAgICBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSIKKyAgICAgICAgICAgIGNoZWNrLXN0cmljdGx5CisgICAgICAgICAgLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImlucHV0IikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1pbnB1dCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36L6T5YWlJHtjb21tZW50fSIgLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImltYWdlVXBsb2FkIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxpbWFnZS11cGxvYWQgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZmlsZVVwbG9hZCIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZmlsZS11cGxvYWQgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZWRpdG9yIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSI+CisgICAgICAgICAgPGVkaXRvciB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IiA6bWluLWhlaWdodD0iMTkyIi8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiICYmICIiICE9ICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1zZWxlY3Qgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICAgICAgPGVsLW9wdGlvbgorICAgICAgICAgICAgICB2LWZvcj0iZGljdCBpbiAke2RpY3RUeXBlfSIKKyAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgICAgOmxhYmVsPSJkaWN0LmxhYmVsIgorI2lmKCRjb2x1bW4uamF2YVR5cGUgPT0gIkludGVnZXIiIHx8ICRjb2x1bW4uamF2YVR5cGUgPT0gIkxvbmciKQorICAgICAgICAgICAgICA6dmFsdWU9InBhcnNlSW50KGRpY3QudmFsdWUpIgorI2Vsc2UKKyAgICAgICAgICAgICAgOnZhbHVlPSJkaWN0LnZhbHVlIgorI2VuZAorICAgICAgICAgICAgPjwvZWwtb3B0aW9uPgorICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiAmJiAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fpgInmi6kke2NvbW1lbnR9Ij4KKyAgICAgICAgICAgIDxlbC1vcHRpb24gbGFiZWw9Iuivt+mAieaLqeWtl+WFuOeUn+aIkCIgdmFsdWU9IiIgLz4KKyAgICAgICAgICA8L2VsLXNlbGVjdD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IiAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtY2hlY2tib3gtZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtY2hlY2tib3gKKyAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gJHtkaWN0VHlwZX0iCisgICAgICAgICAgICAgIDprZXk9ImRpY3QudmFsdWUiCisgICAgICAgICAgICAgIDpsYWJlbD0iZGljdC52YWx1ZSI+CisgICAgICAgICAgICAgIHt7ZGljdC5sYWJlbH19CisgICAgICAgICAgICA8L2VsLWNoZWNrYm94PgorICAgICAgICAgIDwvZWwtY2hlY2tib3gtZ3JvdXA+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIgJiYgJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWNoZWNrYm94LWdyb3VwIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iPgorICAgICAgICAgICAgPGVsLWNoZWNrYm94Puivt+mAieaLqeWtl+WFuOeUn+aIkDwvZWwtY2hlY2tib3g+CisgICAgICAgICAgPC9lbC1jaGVja2JveC1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIiAmJiAiIiAhPSAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtcmFkaW8tZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtcmFkaW8KKyAgICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gJHtkaWN0VHlwZX0iCisgICAgICAgICAgICAgIDprZXk9ImRpY3QudmFsdWUiCisjaWYoJGNvbHVtbi5qYXZhVHlwZSA9PSAiSW50ZWdlciIgfHwgJGNvbHVtbi5qYXZhVHlwZSA9PSAiTG9uZyIpCisgICAgICAgICAgICAgIDpsYWJlbD0icGFyc2VJbnQoZGljdC52YWx1ZSkiCisjZWxzZQorICAgICAgICAgICAgICA6bGFiZWw9ImRpY3QudmFsdWUiCisjZW5kCisgICAgICAgICAgICA+e3tkaWN0LmxhYmVsfX08L2VsLXJhZGlvPgorICAgICAgICAgIDwvZWwtcmFkaW8tZ3JvdXA+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIgJiYgJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLXJhZGlvLWdyb3VwIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iPgorICAgICAgICAgICAgPGVsLXJhZGlvIGxhYmVsPSIxIj7or7fpgInmi6nlrZflhbjnlJ/miJA8L2VsLXJhZGlvPgorICAgICAgICAgIDwvZWwtcmFkaW8tZ3JvdXA+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtZGF0ZS1waWNrZXIgY2xlYXJhYmxlCisgICAgICAgICAgICB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IgorICAgICAgICAgICAgdHlwZT0iZGF0ZSIKKyAgICAgICAgICAgIHZhbHVlLWZvcm1hdD0iWVlZWS1NTS1ERCIKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyPSLpgInmi6kke2NvbW1lbnR9Ij4KKyAgICAgICAgICA8L2VsLWRhdGUtcGlja2VyPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAidGV4dGFyZWEiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWlucHV0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHR5cGU9InRleHRhcmVhIiBwbGFjZWhvbGRlcj0i6K+36L6T5YWl5YaF5a65IiAvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbmQKKyNlbmQKKyNlbmQKKyNlbmQKKyAgICAgIDwvZWwtZm9ybT4KKyAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPgorICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZm9vdGVyIj4KKyAgICAgICAgICA8ZWwtYnV0dG9uIHR5cGU9InByaW1hcnkiIEBjbGljaz0ic3VibWl0Rm9ybSI+56GuIOWumjwvZWwtYnV0dG9uPgorICAgICAgICAgIDxlbC1idXR0b24gQGNsaWNrPSJjYW5jZWwiPuWPliDmtog8L2VsLWJ1dHRvbj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RlbXBsYXRlPgorICAgIDwvZWwtZGlhbG9nPgorICA8L2Rpdj4KKzwvdGVtcGxhdGU+CisKKzxzY3JpcHQgc2V0dXAgbmFtZT0iJHtCdXNpbmVzc05hbWV9Ij4KK2ltcG9ydCB7IGxpc3Qke0J1c2luZXNzTmFtZX0sIGdldCR7QnVzaW5lc3NOYW1lfSwgZGVsJHtCdXNpbmVzc05hbWV9LCBhZGQke0J1c2luZXNzTmFtZX0sIHVwZGF0ZSR7QnVzaW5lc3NOYW1lfSB9IGZyb20gIkAvYXBpLyR7bW9kdWxlTmFtZX0vJHtidXNpbmVzc05hbWV9IjsKKworY29uc3QgeyBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7CisjaWYoJHtkaWN0c30gIT0gJycpCisjc2V0KCRkaWN0c05vU3ltYm9sPSRkaWN0cy5yZXBsYWNlKCInIiwgIiIpKQorY29uc3QgeyAke2RpY3RzTm9TeW1ib2x9IH0gPSBwcm94eS51c2VEaWN0KCR7ZGljdHN9KTsKKyNlbmQKKworY29uc3QgJHtidXNpbmVzc05hbWV9TGlzdCA9IHJlZihbXSk7Citjb25zdCAke2J1c2luZXNzTmFtZX1PcHRpb25zID0gcmVmKFtdKTsKK2NvbnN0IG9wZW4gPSByZWYoZmFsc2UpOworY29uc3QgbG9hZGluZyA9IHJlZih0cnVlKTsKK2NvbnN0IHNob3dTZWFyY2ggPSByZWYodHJ1ZSk7Citjb25zdCB0aXRsZSA9IHJlZigiIik7Citjb25zdCBpc0V4cGFuZEFsbCA9IHJlZih0cnVlKTsKK2NvbnN0IHJlZnJlc2hUYWJsZSA9IHJlZih0cnVlKTsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCitjb25zdCBkYXRlcmFuZ2Uke0F0dHJOYW1lfSA9IHJlZihbXSk7CisjZW5kCisjZW5kCisKK2NvbnN0IGRhdGEgPSByZWFjdGl2ZSh7CisgIGZvcm06IHt9LAorICBxdWVyeVBhcmFtczogeworICAgICNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4ucXVlcnkpCisgICAgJGNvbHVtbi5qYXZhRmllbGQ6IG51bGwjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgIH0sCisgIHJ1bGVzOiB7CisgICAgI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5yZXF1aXJlZCkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyAgICAkY29sdW1uLmphdmFGaWVsZDogWworICAgICAgeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogIiRjb21tZW505LiN6IO95Li656m6IiwgdHJpZ2dlcjogI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgfHwgJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iKSJjaGFuZ2UiI2Vsc2UiYmx1ciIjZW5kIH0KKyAgICBdI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZAorI2VuZAorI2VuZAorICB9Cit9KTsKKworY29uc3QgeyBxdWVyeVBhcmFtcywgZm9ybSwgcnVsZXMgfSA9IHRvUmVmcyhkYXRhKTsKKworLyoqIOafpeivoiR7ZnVuY3Rpb25OYW1lfeWIl+ihqCAqLworZnVuY3Rpb24gZ2V0TGlzdCgpIHsKKyAgbG9hZGluZy52YWx1ZSA9IHRydWU7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgPT0gIkJFVFdFRU4iKQorICBxdWVyeVBhcmFtcy52YWx1ZS5wYXJhbXMgPSB7fTsKKyNicmVhaworI2VuZAorI2VuZAorI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyAke2NvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEpfSkKKyAgaWYgKG51bGwgIT0gZGF0ZXJhbmdlJHtBdHRyTmFtZX0gJiYgJycgIT0gZGF0ZXJhbmdlJHtBdHRyTmFtZX0pIHsKKyAgICBxdWVyeVBhcmFtcy52YWx1ZS5wYXJhbXNbImJlZ2luJHtBdHRyTmFtZX0iXSA9IGRhdGVyYW5nZSR7QXR0ck5hbWV9LnZhbHVlWzBdOworICAgIHF1ZXJ5UGFyYW1zLnZhbHVlLnBhcmFtc1siZW5kJHtBdHRyTmFtZX0iXSA9IGRhdGVyYW5nZSR7QXR0ck5hbWV9LnZhbHVlWzFdOworICB9CisjZW5kCisjZW5kCisgIGxpc3Qke0J1c2luZXNzTmFtZX0ocXVlcnlQYXJhbXMudmFsdWUpLnRoZW4ocmVzcG9uc2UgPT4geworICAgICR7YnVzaW5lc3NOYW1lfUxpc3QudmFsdWUgPSBwcm94eS5oYW5kbGVUcmVlKHJlc3BvbnNlLmRhdGEsICIke3RyZWVDb2RlfSIsICIke3RyZWVQYXJlbnRDb2RlfSIpOworICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZTsKKyAgfSk7Cit9CisKKy8qKiDmn6Xor6Ike2Z1bmN0aW9uTmFtZX3kuIvmi4nmoJHnu5PmnoQgKi8KK2Z1bmN0aW9uIGdldFRyZWVzZWxlY3QoKSB7CisgIGxpc3Qke0J1c2luZXNzTmFtZX0oKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAke2J1c2luZXNzTmFtZX1PcHRpb25zLnZhbHVlID0gW107CisgICAgY29uc3QgZGF0YSA9IHsgJHt0cmVlQ29kZX06IDAsICR7dHJlZU5hbWV9OiAn6aG257qn6IqC54K5JywgY2hpbGRyZW46IFtdIH07CisgICAgZGF0YS5jaGlsZHJlbiA9IHByb3h5LmhhbmRsZVRyZWUocmVzcG9uc2UuZGF0YSwgIiR7dHJlZUNvZGV9IiwgIiR7dHJlZVBhcmVudENvZGV9Iik7CisgICAgJHtidXNpbmVzc05hbWV9T3B0aW9ucy52YWx1ZS5wdXNoKGRhdGEpOworICB9KTsKK30KKwkKKy8vIOWPlua2iOaMiemSrgorZnVuY3Rpb24gY2FuY2VsKCkgeworICBvcGVuLnZhbHVlID0gZmFsc2U7CisgIHJlc2V0KCk7Cit9CisKKy8vIOihqOWNlemHjee9rgorZnVuY3Rpb24gcmVzZXQoKSB7CisgIGZvcm0udmFsdWUgPSB7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgJGNvbHVtbi5qYXZhRmllbGQ6IFtdI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZAorI2Vsc2UKKyAgICAkY29sdW1uLmphdmFGaWVsZDogbnVsbCNpZigkZm9yZWFjaC5jb3VudCAhPSAkY29sdW1ucy5zaXplKCkpLCNlbmQKKyNlbmQKKyNlbmQKKyAgfTsKKyAgcHJveHkucmVzZXRGb3JtKCIke2J1c2luZXNzTmFtZX1SZWYiKTsKK30KKworLyoqIOaQnOe0ouaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlUXVlcnkoKSB7CisgIGdldExpc3QoKTsKK30KKworLyoqIOmHjee9ruaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gcmVzZXRRdWVyeSgpIHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgIGRhdGVyYW5nZSR7QXR0ck5hbWV9LnZhbHVlID0gW107CisjZW5kCisjZW5kCisgIHByb3h5LnJlc2V0Rm9ybSgicXVlcnlSZWYiKTsKKyAgaGFuZGxlUXVlcnkoKTsKK30KKworLyoqIOaWsOWinuaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlQWRkKHJvdykgeworICByZXNldCgpOworICBnZXRUcmVlc2VsZWN0KCk7CisgIGlmIChyb3cgIT0gbnVsbCAmJiByb3cuJHt0cmVlQ29kZX0pIHsKKyAgICBmb3JtLnZhbHVlLiR7dHJlZVBhcmVudENvZGV9ID0gcm93LiR7dHJlZUNvZGV9OworICB9IGVsc2UgeworICAgIGZvcm0udmFsdWUuJHt0cmVlUGFyZW50Q29kZX0gPSAwOworICB9CisgIG9wZW4udmFsdWUgPSB0cnVlOworICB0aXRsZS52YWx1ZSA9ICLmt7vliqAke2Z1bmN0aW9uTmFtZX0iOworfQorCisvKiog5bGV5byAL+aKmOWPoOaTjeS9nCAqLworZnVuY3Rpb24gdG9nZ2xlRXhwYW5kQWxsKCkgeworICByZWZyZXNoVGFibGUudmFsdWUgPSBmYWxzZTsKKyAgaXNFeHBhbmRBbGwudmFsdWUgPSAhaXNFeHBhbmRBbGwudmFsdWU7CisgIG5leHRUaWNrKCgpID0+IHsKKyAgICByZWZyZXNoVGFibGUudmFsdWUgPSB0cnVlOworICB9KTsKK30KKworLyoqIOS/ruaUueaMiemSruaTjeS9nCAqLworYXN5bmMgZnVuY3Rpb24gaGFuZGxlVXBkYXRlKHJvdykgeworICByZXNldCgpOworICBhd2FpdCBnZXRUcmVlc2VsZWN0KCk7CisgIGlmIChyb3cgIT0gbnVsbCkgeworICAgIGZvcm0udmFsdWUuJHt0cmVlUGFyZW50Q29kZX0gPSByb3cuJHt0cmVlUGFyZW50Q29kZX07CisgIH0KKyAgZ2V0JHtCdXNpbmVzc05hbWV9KHJvdy4ke3BrQ29sdW1uLmphdmFGaWVsZH0pLnRoZW4ocmVzcG9uc2UgPT4geworICAgIGZvcm0udmFsdWUgPSByZXNwb25zZS5kYXRhOworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgIGZvcm0udmFsdWUuJGNvbHVtbi5qYXZhRmllbGQgPSBmb3JtLnZhbHVlLiR7Y29sdW1uLmphdmFGaWVsZH0uc3BsaXQoIiwiKTsKKyNlbmQKKyNlbmQKKyAgICBvcGVuLnZhbHVlID0gdHJ1ZTsKKyAgICB0aXRsZS52YWx1ZSA9ICLkv67mlLkke2Z1bmN0aW9uTmFtZX0iOworICB9KTsKK30KKworLyoqIOaPkOS6pOaMiemSriAqLworZnVuY3Rpb24gc3VibWl0Rm9ybSgpIHsKKyAgcHJveHkuI1tbJF1dI3JlZnNbIiR7YnVzaW5lc3NOYW1lfVJlZiJdLnZhbGlkYXRlKHZhbGlkID0+IHsKKyAgICBpZiAodmFsaWQpIHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IikKKyAgICAgIGZvcm0udmFsdWUuJGNvbHVtbi5qYXZhRmllbGQgPSBmb3JtLnZhbHVlLiR7Y29sdW1uLmphdmFGaWVsZH0uam9pbigiLCIpOworI2VuZAorI2VuZAorICAgICAgaWYgKGZvcm0udmFsdWUuJHtwa0NvbHVtbi5qYXZhRmllbGR9ICE9IG51bGwpIHsKKyAgICAgICAgdXBkYXRlJHtCdXNpbmVzc05hbWV9KGZvcm0udmFsdWUpLnRoZW4ocmVzcG9uc2UgPT4geworICAgICAgICAgIHByb3h5LiNbWyRtb2RhbF1dIy5tc2dTdWNjZXNzKCLkv67mlLnmiJDlip8iKTsKKyAgICAgICAgICBvcGVuLnZhbHVlID0gZmFsc2U7CisgICAgICAgICAgZ2V0TGlzdCgpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZCR7QnVzaW5lc3NOYW1lfShmb3JtLnZhbHVlKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgICAgICBwcm94eS4jW1skbW9kYWxdXSMubXNnU3VjY2Vzcygi5paw5aKe5oiQ5YqfIik7CisgICAgICAgICAgb3Blbi52YWx1ZSA9IGZhbHNlOworICAgICAgICAgIGdldExpc3QoKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9KTsKK30KKworLyoqIOWIoOmZpOaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlRGVsZXRlKHJvdykgeworICBwcm94eS4jW1skbW9kYWxdXSMuY29uZmlybSgn5piv5ZCm56Gu6K6k5Yig6ZmkJHtmdW5jdGlvbk5hbWV957yW5Y+35Li6IicgKyByb3cuJHtwa0NvbHVtbi5qYXZhRmllbGR9ICsgJyLnmoTmlbDmja7pobnvvJ8nKS50aGVuKGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkZWwke0J1c2luZXNzTmFtZX0ocm93LiR7cGtDb2x1bW4uamF2YUZpZWxkfSk7CisgIH0pLnRoZW4oKCkgPT4geworICAgIGdldExpc3QoKTsKKyAgICBwcm94eS4jW1skbW9kYWxdXSMubXNnU3VjY2Vzcygi5Yig6Zmk5oiQ5YqfIik7CisgIH0pLmNhdGNoKCgpID0+IHt9KTsKK30KKworZ2V0TGlzdCgpOworPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL3Z1ZS92My9pbmRleC52dWUudm0gYi9ydW95aS1nZW5lcmF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3ZtL3Z1ZS92My9pbmRleC52dWUudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyNTY2NQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0vdnVlL3YzL2luZGV4LnZ1ZS52bQpAQCAtMCwwICsxLDU5MCBAQAorPHRlbXBsYXRlPgorICA8ZGl2IGNsYXNzPSJhcHAtY29udGFpbmVyIj4KKyAgICA8ZWwtZm9ybSA6bW9kZWw9InF1ZXJ5UGFyYW1zIiByZWY9InF1ZXJ5UmVmIiA6aW5saW5lPSJ0cnVlIiB2LXNob3c9InNob3dTZWFyY2giIGxhYmVsLXdpZHRoPSI2OHB4Ij4KKyNmb3JlYWNoKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5xdWVyeSkKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisjc2V0KCRwYXJlbnRoZXNlSW5kZXg9JGNvbHVtbi5jb2x1bW5Db21tZW50LmluZGV4T2YoIu+8iCIpKQorI2lmKCRwYXJlbnRoZXNlSW5kZXggIT0gLTEpCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudC5zdWJzdHJpbmcoMCwgJHBhcmVudGhlc2VJbmRleCkpCisjZWxzZQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQpCisjZW5kCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtjb2x1bW4uamF2YUZpZWxkfSI+CisgICAgICAgIDxlbC1pbnB1dAorICAgICAgICAgIHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iCisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSR7Y29tbWVudH0iCisgICAgICAgICAgY2xlYXJhYmxlCisgICAgICAgICAgQGtleXVwLmVudGVyPSJoYW5kbGVRdWVyeSIKKyAgICAgICAgLz4KKyAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiB8fCAkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIpICYmICIiICE9ICRkaWN0VHlwZSkKKyAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7Y29sdW1uLmphdmFGaWVsZH0iPgorICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fpgInmi6kke2NvbW1lbnR9IiBjbGVhcmFibGU+CisgICAgICAgICAgPGVsLW9wdGlvbgorICAgICAgICAgICAgdi1mb3I9ImRpY3QgaW4gJHtkaWN0VHlwZX0iCisgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgOmxhYmVsPSJkaWN0LmxhYmVsIgorICAgICAgICAgICAgOnZhbHVlPSJkaWN0LnZhbHVlIgorICAgICAgICAgIC8+CisgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCgkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiIHx8ICRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIikgJiYgJGRpY3RUeXBlKQorICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtjb2x1bW4uamF2YUZpZWxkfSI+CisgICAgICAgIDxlbC1zZWxlY3Qgdi1tb2RlbD0icXVlcnlQYXJhbXMuJHtjb2x1bW4uamF2YUZpZWxkfSIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iIGNsZWFyYWJsZT4KKyAgICAgICAgICA8ZWwtb3B0aW9uIGxhYmVsPSLor7fpgInmi6nlrZflhbjnlJ/miJAiIHZhbHVlPSIiIC8+CisgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSAhPSAiQkVUV0VFTiIpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2NvbHVtbi5qYXZhRmllbGR9Ij4KKyAgICAgICAgPGVsLWRhdGUtcGlja2VyIGNsZWFyYWJsZQorICAgICAgICAgIHYtbW9kZWw9InF1ZXJ5UGFyYW1zLiR7Y29sdW1uLmphdmFGaWVsZH0iCisgICAgICAgICAgdHlwZT0iZGF0ZSIKKyAgICAgICAgICB2YWx1ZS1mb3JtYXQ9IllZWVktTU0tREQiCisgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICA8L2VsLWRhdGUtcGlja2VyPgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBzdHlsZT0id2lkdGg6IDMwOHB4Ij4KKyAgICAgICAgPGVsLWRhdGUtcGlja2VyCisgICAgICAgICAgdi1tb2RlbD0iZGF0ZXJhbmdlJHtBdHRyTmFtZX0iCisgICAgICAgICAgdmFsdWUtZm9ybWF0PSJZWVlZLU1NLUREIgorICAgICAgICAgIHR5cGU9ImRhdGVyYW5nZSIKKyAgICAgICAgICByYW5nZS1zZXBhcmF0b3I9Ii0iCisgICAgICAgICAgc3RhcnQtcGxhY2Vob2xkZXI9IuW8gOWni+aXpeacnyIKKyAgICAgICAgICBlbmQtcGxhY2Vob2xkZXI9Iue7k+adn+aXpeacnyIKKyAgICAgICAgPjwvZWwtZGF0ZS1waWNrZXI+CisgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbmQKKyNlbmQKKyNlbmQKKyAgICAgIDxlbC1mb3JtLWl0ZW0+CisgICAgICAgIDxlbC1idXR0b24gdHlwZT0icHJpbWFyeSIgaWNvbj0iU2VhcmNoIiBAY2xpY2s9ImhhbmRsZVF1ZXJ5Ij7mkJzntKI8L2VsLWJ1dHRvbj4KKyAgICAgICAgPGVsLWJ1dHRvbiBpY29uPSJSZWZyZXNoIiBAY2xpY2s9InJlc2V0UXVlcnkiPumHjee9rjwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1mb3JtLWl0ZW0+CisgICAgPC9lbC1mb3JtPgorCisgICAgPGVsLXJvdyA6Z3V0dGVyPSIxMCIgY2xhc3M9Im1iOCI+CisgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgdHlwZT0icHJpbWFyeSIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249IlBsdXMiCisgICAgICAgICAgQGNsaWNrPSJoYW5kbGVBZGQiCisgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTphZGQnXSIKKyAgICAgICAgPuaWsOWinjwvZWwtYnV0dG9uPgorICAgICAgPC9lbC1jb2w+CisgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICA8ZWwtYnV0dG9uCisgICAgICAgICAgdHlwZT0ic3VjY2VzcyIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249IkVkaXQiCisgICAgICAgICAgOmRpc2FibGVkPSJzaW5nbGUiCisgICAgICAgICAgQGNsaWNrPSJoYW5kbGVVcGRhdGUiCisgICAgICAgICAgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTplZGl0J10iCisgICAgICAgID7kv67mlLk8L2VsLWJ1dHRvbj4KKyAgICAgIDwvZWwtY29sPgorICAgICAgPGVsLWNvbCA6c3Bhbj0iMS41Ij4KKyAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgIHR5cGU9ImRhbmdlciIKKyAgICAgICAgICBwbGFpbgorICAgICAgICAgIGljb249IkRlbGV0ZSIKKyAgICAgICAgICA6ZGlzYWJsZWQ9Im11bHRpcGxlIgorICAgICAgICAgIEBjbGljaz0iaGFuZGxlRGVsZXRlIgorICAgICAgICAgIHYtaGFzUGVybWk9IlsnJHttb2R1bGVOYW1lfToke2J1c2luZXNzTmFtZX06cmVtb3ZlJ10iCisgICAgICAgID7liKDpmaQ8L2VsLWJ1dHRvbj4KKyAgICAgIDwvZWwtY29sPgorICAgICAgPGVsLWNvbCA6c3Bhbj0iMS41Ij4KKyAgICAgICAgPGVsLWJ1dHRvbgorICAgICAgICAgIHR5cGU9Indhcm5pbmciCisgICAgICAgICAgcGxhaW4KKyAgICAgICAgICBpY29uPSJEb3dubG9hZCIKKyAgICAgICAgICBAY2xpY2s9ImhhbmRsZUV4cG9ydCIKKyAgICAgICAgICB2LWhhc1Blcm1pPSJbJyR7bW9kdWxlTmFtZX06JHtidXNpbmVzc05hbWV9OmV4cG9ydCddIgorICAgICAgICA+5a+85Ye6PC9lbC1idXR0b24+CisgICAgICA8L2VsLWNvbD4KKyAgICAgIDxyaWdodC10b29sYmFyIHYtbW9kZWw6c2hvd1NlYXJjaD0ic2hvd1NlYXJjaCIgQHF1ZXJ5VGFibGU9ImdldExpc3QiPjwvcmlnaHQtdG9vbGJhcj4KKyAgICA8L2VsLXJvdz4KKworICAgIDxlbC10YWJsZSB2LWxvYWRpbmc9ImxvYWRpbmciIDpkYXRhPSIke2J1c2luZXNzTmFtZX1MaXN0IiBAc2VsZWN0aW9uLWNoYW5nZT0iaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIj4KKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gdHlwZT0ic2VsZWN0aW9uIiB3aWR0aD0iNTUiIGFsaWduPSJjZW50ZXIiIC8+CisjZm9yZWFjaCgkY29sdW1uIGluICRjb2x1bW5zKQorI3NldCgkamF2YUZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI3NldCgkcGFyZW50aGVzZUluZGV4PSRjb2x1bW4uY29sdW1uQ29tbWVudC5pbmRleE9mKCLvvIgiKSkKKyNpZigkcGFyZW50aGVzZUluZGV4ICE9IC0xKQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuc3Vic3RyaW5nKDAsICRwYXJlbnRoZXNlSW5kZXgpKQorI2Vsc2UKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50KQorI2VuZAorI2lmKCRjb2x1bW4ucGspCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBhbGlnbj0iY2VudGVyIiBwcm9wPSIke2phdmFGaWVsZH0iIC8+CisjZWxzZWlmKCRjb2x1bW4ubGlzdCAmJiAkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBhbGlnbj0iY2VudGVyIiBwcm9wPSIke2phdmFGaWVsZH0iIHdpZHRoPSIxODAiPgorICAgICAgICA8dGVtcGxhdGUgI2RlZmF1bHQ9InNjb3BlIj4KKyAgICAgICAgICA8c3Bhbj57eyBwYXJzZVRpbWUoc2NvcGUucm93LiR7amF2YUZpZWxkfSwgJ3t5fS17bX0te2R9JykgfX08L3NwYW4+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImltYWdlVXBsb2FkIikKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgd2lkdGg9IjEwMCI+CisgICAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD0ic2NvcGUiPgorICAgICAgICAgIDxpbWFnZS1wcmV2aWV3IDpzcmM9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iIDp3aWR0aD0iNTAiIDpoZWlnaHQ9IjUwIi8+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICIiICE9ICRjb2x1bW4uZGljdFR5cGUpCisgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIke2NvbW1lbnR9IiBhbGlnbj0iY2VudGVyIiBwcm9wPSIke2phdmFGaWVsZH0iPgorICAgICAgICA8dGVtcGxhdGUgI2RlZmF1bHQ9InNjb3BlIj4KKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICAgICAgPGRpY3QtdGFnIDpvcHRpb25zPSIke2NvbHVtbi5kaWN0VHlwZX0iIDp2YWx1ZT0ic2NvcGUucm93LiR7amF2YUZpZWxkfSA/IHNjb3BlLnJvdy4ke2phdmFGaWVsZH0uc3BsaXQoJywnKSA6IFtdIi8+CisjZWxzZQorICAgICAgICAgIDxkaWN0LXRhZyA6b3B0aW9ucz0iJHtjb2x1bW4uZGljdFR5cGV9IiA6dmFsdWU9InNjb3BlLnJvdy4ke2phdmFGaWVsZH0iLz4KKyNlbmQKKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgIiIgIT0gJGphdmFGaWVsZCkKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiR7Y29tbWVudH0iIGFsaWduPSJjZW50ZXIiIHByb3A9IiR7amF2YUZpZWxkfSIgLz4KKyNlbmQKKyNlbmQKKyAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IuaTjeS9nCIgYWxpZ249ImNlbnRlciIgY2xhc3MtbmFtZT0ic21hbGwtcGFkZGluZyBmaXhlZC13aWR0aCI+CisgICAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD0ic2NvcGUiPgorICAgICAgICAgIDxlbC1idXR0b24gbGluayB0eXBlPSJwcmltYXJ5IiBpY29uPSJFZGl0IiBAY2xpY2s9ImhhbmRsZVVwZGF0ZShzY29wZS5yb3cpIiB2LWhhc1Blcm1pPSJbJyR7bW9kdWxlTmFtZX06JHtidXNpbmVzc05hbWV9OmVkaXQnXSI+5L+u5pS5PC9lbC1idXR0b24+CisgICAgICAgICAgPGVsLWJ1dHRvbiBsaW5rIHR5cGU9InByaW1hcnkiIGljb249IkRlbGV0ZSIgQGNsaWNrPSJoYW5kbGVEZWxldGUoc2NvcGUucm93KSIgdi1oYXNQZXJtaT0iWycke21vZHVsZU5hbWV9OiR7YnVzaW5lc3NOYW1lfTpyZW1vdmUnXSI+5Yig6ZmkPC9lbC1idXR0b24+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyAgICA8L2VsLXRhYmxlPgorICAgIAorICAgIDxwYWdpbmF0aW9uCisgICAgICB2LXNob3c9InRvdGFsPjAiCisgICAgICA6dG90YWw9InRvdGFsIgorICAgICAgdi1tb2RlbDpwYWdlPSJxdWVyeVBhcmFtcy5wYWdlTnVtIgorICAgICAgdi1tb2RlbDpsaW1pdD0icXVlcnlQYXJhbXMucGFnZVNpemUiCisgICAgICBAcGFnaW5hdGlvbj0iZ2V0TGlzdCIKKyAgICAvPgorCisgICAgPCEtLSDmt7vliqDmiJbkv67mlLkke2Z1bmN0aW9uTmFtZX3lr7nor53moYYgLS0+CisgICAgPGVsLWRpYWxvZyA6dGl0bGU9InRpdGxlIiB2LW1vZGVsPSJvcGVuIiB3aWR0aD0iNTAwcHgiIGFwcGVuZC10by1ib2R5PgorICAgICAgPGVsLWZvcm0gcmVmPSIke2J1c2luZXNzTmFtZX1SZWYiIDptb2RlbD0iZm9ybSIgOnJ1bGVzPSJydWxlcyIgbGFiZWwtd2lkdGg9IjgwcHgiPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNzZXQoJGZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI2lmKCRjb2x1bW4uaW5zZXJ0ICYmICEkY29sdW1uLnBrKQorI2lmKCgkY29sdW1uLnVzYWJsZUNvbHVtbikgfHwgKCEkY29sdW1uLnN1cGVyQ29sdW1uKSkKKyNzZXQoJHBhcmVudGhlc2VJbmRleD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuaW5kZXhPZigi77yIIikpCisjaWYoJHBhcmVudGhlc2VJbmRleCAhPSAtMSkKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50LnN1YnN0cmluZygwLCAkcGFyZW50aGVzZUluZGV4KSkKKyNlbHNlCisjc2V0KCRjb21tZW50PSRjb2x1bW4uY29sdW1uQ29tbWVudCkKKyNlbmQKKyNzZXQoJGRpY3RUeXBlPSRjb2x1bW4uZGljdFR5cGUpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLWlucHV0IHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIHBsYWNlaG9sZGVyPSLor7fovpPlhaUke2NvbW1lbnR9IiAvPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiaW1hZ2VVcGxvYWQiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGltYWdlLXVwbG9hZCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ii8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJmaWxlVXBsb2FkIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxmaWxlLXVwbG9hZCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ii8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJlZGl0b3IiKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9Ij4KKyAgICAgICAgICA8ZWRpdG9yIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iIDptaW4taGVpZ2h0PSIxOTIiLz4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInNlbGVjdCIgJiYgIiIgIT0gJGRpY3RUeXBlKQorICAgICAgICA8ZWwtZm9ybS1pdGVtIGxhYmVsPSIke2NvbW1lbnR9IiBwcm9wPSIke2ZpZWxkfSI+CisgICAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9IiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJHtjb21tZW50fSI+CisgICAgICAgICAgICA8ZWwtb3B0aW9uCisgICAgICAgICAgICAgIHYtZm9yPSJkaWN0IGluICR7ZGljdFR5cGV9IgorICAgICAgICAgICAgICA6a2V5PSJkaWN0LnZhbHVlIgorICAgICAgICAgICAgICA6bGFiZWw9ImRpY3QubGFiZWwiCisjaWYoJGNvbHVtbi5qYXZhVHlwZSA9PSAiSW50ZWdlciIgfHwgJGNvbHVtbi5qYXZhVHlwZSA9PSAiTG9uZyIpCisgICAgICAgICAgICAgIDp2YWx1ZT0icGFyc2VJbnQoZGljdC52YWx1ZSkiCisjZWxzZQorICAgICAgICAgICAgICA6dmFsdWU9ImRpY3QudmFsdWUiCisjZW5kCisgICAgICAgICAgICA+PC9lbC1vcHRpb24+CisgICAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiICYmICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1zZWxlY3Qgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICAgICAgPGVsLW9wdGlvbiBsYWJlbD0i6K+36YCJ5oup5a2X5YW455Sf5oiQIiB2YWx1ZT0iIiAvPgorICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giICYmICIiICE9ICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1jaGVja2JveC1ncm91cCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ij4KKyAgICAgICAgICAgIDxlbC1jaGVja2JveAorICAgICAgICAgICAgICB2LWZvcj0iZGljdCBpbiAke2RpY3RUeXBlfSIKKyAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgICAgOmxhYmVsPSJkaWN0LnZhbHVlIj4KKyAgICAgICAgICAgICAge3tkaWN0LmxhYmVsfX0KKyAgICAgICAgICAgIDwvZWwtY2hlY2tib3g+CisgICAgICAgICAgPC9lbC1jaGVja2JveC1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImNoZWNrYm94IiAmJiAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtY2hlY2tib3gtZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtY2hlY2tib3g+6K+36YCJ5oup5a2X5YW455Sf5oiQPC9lbC1jaGVja2JveD4KKyAgICAgICAgICA8L2VsLWNoZWNrYm94LWdyb3VwPgorICAgICAgICA8L2VsLWZvcm0taXRlbT4KKyNlbHNlaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAicmFkaW8iICYmICIiICE9ICRkaWN0VHlwZSkKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1yYWRpby1ncm91cCB2LW1vZGVsPSJmb3JtLiR7ZmllbGR9Ij4KKyAgICAgICAgICAgIDxlbC1yYWRpbworICAgICAgICAgICAgICB2LWZvcj0iZGljdCBpbiAke2RpY3RUeXBlfSIKKyAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyNpZigkY29sdW1uLmphdmFUeXBlID09ICJJbnRlZ2VyIiB8fCAkY29sdW1uLmphdmFUeXBlID09ICJMb25nIikKKyAgICAgICAgICAgICAgOmxhYmVsPSJwYXJzZUludChkaWN0LnZhbHVlKSIKKyNlbHNlCisgICAgICAgICAgICAgIDpsYWJlbD0iZGljdC52YWx1ZSIKKyNlbmQKKyAgICAgICAgICAgID57e2RpY3QubGFiZWx9fTwvZWwtcmFkaW8+CisgICAgICAgICAgPC9lbC1yYWRpby1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIiAmJiAkZGljdFR5cGUpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtcmFkaW8tZ3JvdXAgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSI+CisgICAgICAgICAgICA8ZWwtcmFkaW8gbGFiZWw9IjEiPuivt+mAieaLqeWtl+WFuOeUn+aIkDwvZWwtcmFkaW8+CisgICAgICAgICAgPC9lbC1yYWRpby1ncm91cD4KKyAgICAgICAgPC9lbC1mb3JtLWl0ZW0+CisjZWxzZWlmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIikKKyAgICAgICAgPGVsLWZvcm0taXRlbSBsYWJlbD0iJHtjb21tZW50fSIgcHJvcD0iJHtmaWVsZH0iPgorICAgICAgICAgIDxlbC1kYXRlLXBpY2tlciBjbGVhcmFibGUKKyAgICAgICAgICAgIHYtbW9kZWw9ImZvcm0uJHtmaWVsZH0iCisgICAgICAgICAgICB0eXBlPSJkYXRlIgorICAgICAgICAgICAgdmFsdWUtZm9ybWF0PSJZWVlZLU1NLUREIgorICAgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSR7Y29tbWVudH0iPgorICAgICAgICAgIDwvZWwtZGF0ZS1waWNrZXI+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2Vsc2VpZigkY29sdW1uLmh0bWxUeXBlID09ICJ0ZXh0YXJlYSIpCisgICAgICAgIDxlbC1mb3JtLWl0ZW0gbGFiZWw9IiR7Y29tbWVudH0iIHByb3A9IiR7ZmllbGR9Ij4KKyAgICAgICAgICA8ZWwtaW5wdXQgdi1tb2RlbD0iZm9ybS4ke2ZpZWxkfSIgdHlwZT0idGV4dGFyZWEiIHBsYWNlaG9sZGVyPSLor7fovpPlhaXlhoXlrrkiIC8+CisgICAgICAgIDwvZWwtZm9ybS1pdGVtPgorI2VuZAorI2VuZAorI2VuZAorI2VuZAorI2lmKCR0YWJsZS5zdWIpCisgICAgICAgIDxlbC1kaXZpZGVyIGNvbnRlbnQtcG9zaXRpb249ImNlbnRlciI+JHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95L+h5oGvPC9lbC1kaXZpZGVyPgorICAgICAgICA8ZWwtcm93IDpndXR0ZXI9IjEwIiBjbGFzcz0ibWI4Ij4KKyAgICAgICAgICA8ZWwtY29sIDpzcGFuPSIxLjUiPgorICAgICAgICAgICAgPGVsLWJ1dHRvbiB0eXBlPSJwcmltYXJ5IiBpY29uPSJQbHVzIiBAY2xpY2s9ImhhbmRsZUFkZCR7c3ViQ2xhc3NOYW1lfSI+5re75YqgPC9lbC1idXR0b24+CisgICAgICAgICAgPC9lbC1jb2w+CisgICAgICAgICAgPGVsLWNvbCA6c3Bhbj0iMS41Ij4KKyAgICAgICAgICAgIDxlbC1idXR0b24gdHlwZT0iZGFuZ2VyIiBpY29uPSJEZWxldGUiIEBjbGljaz0iaGFuZGxlRGVsZXRlJHtzdWJDbGFzc05hbWV9Ij7liKDpmaQ8L2VsLWJ1dHRvbj4KKyAgICAgICAgICA8L2VsLWNvbD4KKyAgICAgICAgPC9lbC1yb3c+CisgICAgICAgIDxlbC10YWJsZSA6ZGF0YT0iJHtzdWJjbGFzc05hbWV9TGlzdCIgOnJvdy1jbGFzcy1uYW1lPSJyb3cke3N1YkNsYXNzTmFtZX1JbmRleCIgQHNlbGVjdGlvbi1jaGFuZ2U9ImhhbmRsZSR7c3ViQ2xhc3NOYW1lfVNlbGVjdGlvbkNoYW5nZSIgcmVmPSIke3N1YmNsYXNzTmFtZX0iPgorICAgICAgICAgIDxlbC10YWJsZS1jb2x1bW4gdHlwZT0ic2VsZWN0aW9uIiB3aWR0aD0iNTAiIGFsaWduPSJjZW50ZXIiIC8+CisgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0i5bqP5Y+3IiBhbGlnbj0iY2VudGVyIiBwcm9wPSJpbmRleCIgd2lkdGg9IjUwIi8+CisjZm9yZWFjaCgkY29sdW1uIGluICRzdWJUYWJsZS5jb2x1bW5zKQorI3NldCgkamF2YUZpZWxkPSRjb2x1bW4uamF2YUZpZWxkKQorI3NldCgkcGFyZW50aGVzZUluZGV4PSRjb2x1bW4uY29sdW1uQ29tbWVudC5pbmRleE9mKCLvvIgiKSkKKyNpZigkcGFyZW50aGVzZUluZGV4ICE9IC0xKQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuc3Vic3RyaW5nKDAsICRwYXJlbnRoZXNlSW5kZXgpKQorI2Vsc2UKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50KQorI2VuZAorI2lmKCRjb2x1bW4ucGsgfHwgJGphdmFGaWVsZCA9PSAke3N1YlRhYmxlRmtjbGFzc05hbWV9KQorI2Vsc2VpZigkY29sdW1uLmxpc3QgJiYgJGNvbHVtbi5odG1sVHlwZSA9PSAiaW5wdXQiKQorICAgICAgICAgIDxlbC10YWJsZS1jb2x1bW4gbGFiZWw9IiRjb21tZW50IiBwcm9wPSIke2phdmFGaWVsZH0iIHdpZHRoPSIxNTAiPgorICAgICAgICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PSJzY29wZSI+CisgICAgICAgICAgICAgIDxlbC1pbnB1dCB2LW1vZGVsPSJzY29wZS5yb3cuJGphdmFGaWVsZCIgcGxhY2Vob2xkZXI9Iuivt+i+k+WFpSRjb21tZW50IiAvPgorICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIikKKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIkY29tbWVudCIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMjQwIj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD0ic2NvcGUiPgorICAgICAgICAgICAgICA8ZWwtZGF0ZS1waWNrZXIgY2xlYXJhYmxlCisgICAgICAgICAgICAgICAgdi1tb2RlbD0ic2NvcGUucm93LiRqYXZhRmllbGQiCisgICAgICAgICAgICAgICAgdHlwZT0iZGF0ZSIKKyAgICAgICAgICAgICAgICB2YWx1ZS1mb3JtYXQ9IllZWVktTU0tREQiCisgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSRjb21tZW50Ij4KKyAgICAgICAgICAgICAgPC9lbC1kYXRlLXBpY2tlcj4KKyAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPC9lbC10YWJsZS1jb2x1bW4+CisjZWxzZWlmKCRjb2x1bW4ubGlzdCAmJiAoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiB8fCAkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIpICYmICIiICE9ICRjb2x1bW4uZGljdFR5cGUpCisgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiBsYWJlbD0iJGNvbW1lbnQiIHByb3A9IiR7amF2YUZpZWxkfSIgd2lkdGg9IjE1MCI+CisgICAgICAgICAgICA8dGVtcGxhdGUgI2RlZmF1bHQ9InNjb3BlIj4KKyAgICAgICAgICAgICAgPGVsLXNlbGVjdCB2LW1vZGVsPSJzY29wZS5yb3cuJGphdmFGaWVsZCIgcGxhY2Vob2xkZXI9Iuivt+mAieaLqSRjb21tZW50Ij4KKyAgICAgICAgICAgICAgICA8ZWwtb3B0aW9uCisgICAgICAgICAgICAgICAgICB2LWZvcj0iZGljdCBpbiAkY29sdW1uLmRpY3RUeXBlIgorICAgICAgICAgICAgICAgICAgOmtleT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgICAgICAgIDpsYWJlbD0iZGljdC5sYWJlbCIKKyAgICAgICAgICAgICAgICAgIDp2YWx1ZT0iZGljdC52YWx1ZSIKKyAgICAgICAgICAgICAgICA+PC9lbC1vcHRpb24+CisgICAgICAgICAgICAgIDwvZWwtc2VsZWN0PgorICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8L2VsLXRhYmxlLWNvbHVtbj4KKyNlbHNlaWYoJGNvbHVtbi5saXN0ICYmICgkY29sdW1uLmh0bWxUeXBlID09ICJzZWxlY3QiIHx8ICRjb2x1bW4uaHRtbFR5cGUgPT0gInJhZGlvIikgJiYgIiIgPT0gJGNvbHVtbi5kaWN0VHlwZSkKKyAgICAgICAgICA8ZWwtdGFibGUtY29sdW1uIGxhYmVsPSIkY29tbWVudCIgcHJvcD0iJHtqYXZhRmllbGR9IiB3aWR0aD0iMTUwIj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD0ic2NvcGUiPgorICAgICAgICAgICAgICA8ZWwtc2VsZWN0IHYtbW9kZWw9InNjb3BlLnJvdy4kamF2YUZpZWxkIiBwbGFjZWhvbGRlcj0i6K+36YCJ5oupJGNvbW1lbnQiPgorICAgICAgICAgICAgICAgIDxlbC1vcHRpb24gbGFiZWw9Iuivt+mAieaLqeWtl+WFuOeUn+aIkCIgdmFsdWU9IiIgLz4KKyAgICAgICAgICAgICAgPC9lbC1zZWxlY3Q+CisgICAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDwvZWwtdGFibGUtY29sdW1uPgorI2VuZAorI2VuZAorICAgICAgICA8L2VsLXRhYmxlPgorI2VuZAorICAgICAgPC9lbC1mb3JtPgorICAgICAgPHRlbXBsYXRlICNmb290ZXI+CisgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1mb290ZXIiPgorICAgICAgICAgIDxlbC1idXR0b24gdHlwZT0icHJpbWFyeSIgQGNsaWNrPSJzdWJtaXRGb3JtIj7noa4g5a6aPC9lbC1idXR0b24+CisgICAgICAgICAgPGVsLWJ1dHRvbiBAY2xpY2s9ImNhbmNlbCI+5Y+WIOa2iDwvZWwtYnV0dG9uPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgPC9lbC1kaWFsb2c+CisgIDwvZGl2PgorPC90ZW1wbGF0ZT4KKworPHNjcmlwdCBzZXR1cCBuYW1lPSIke0J1c2luZXNzTmFtZX0iPgoraW1wb3J0IHsgbGlzdCR7QnVzaW5lc3NOYW1lfSwgZ2V0JHtCdXNpbmVzc05hbWV9LCBkZWwke0J1c2luZXNzTmFtZX0sIGFkZCR7QnVzaW5lc3NOYW1lfSwgdXBkYXRlJHtCdXNpbmVzc05hbWV9IH0gZnJvbSAiQC9hcGkvJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0iOworCitjb25zdCB7IHByb3h5IH0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTsKKyNpZigke2RpY3RzfSAhPSAnJykKKyNzZXQoJGRpY3RzTm9TeW1ib2w9JGRpY3RzLnJlcGxhY2UoIiciLCAiIikpCitjb25zdCB7ICR7ZGljdHNOb1N5bWJvbH0gfSA9IHByb3h5LnVzZURpY3QoJHtkaWN0c30pOworI2VuZAorCitjb25zdCAke2J1c2luZXNzTmFtZX1MaXN0ID0gcmVmKFtdKTsKKyNpZigkdGFibGUuc3ViKQorY29uc3QgJHtzdWJjbGFzc05hbWV9TGlzdCA9IHJlZihbXSk7CisjZW5kCitjb25zdCBvcGVuID0gcmVmKGZhbHNlKTsKK2NvbnN0IGxvYWRpbmcgPSByZWYodHJ1ZSk7Citjb25zdCBzaG93U2VhcmNoID0gcmVmKHRydWUpOworY29uc3QgaWRzID0gcmVmKFtdKTsKKyNpZigkdGFibGUuc3ViKQorY29uc3QgY2hlY2tlZCR7c3ViQ2xhc3NOYW1lfSA9IHJlZihbXSk7CisjZW5kCitjb25zdCBzaW5nbGUgPSByZWYodHJ1ZSk7Citjb25zdCBtdWx0aXBsZSA9IHJlZih0cnVlKTsKK2NvbnN0IHRvdGFsID0gcmVmKDApOworY29uc3QgdGl0bGUgPSByZWYoIiIpOworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiZGF0ZXRpbWUiICYmICRjb2x1bW4ucXVlcnlUeXBlID09ICJCRVRXRUVOIikKKyNzZXQoJEF0dHJOYW1lPSRjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyAke2NvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDEpfSkKK2NvbnN0IGRhdGVyYW5nZSR7QXR0ck5hbWV9ID0gcmVmKFtdKTsKKyNlbmQKKyNlbmQKKworY29uc3QgZGF0YSA9IHJlYWN0aXZlKHsKKyAgZm9ybToge30sCisgIHF1ZXJ5UGFyYW1zOiB7CisgICAgcGFnZU51bTogMSwKKyAgICBwYWdlU2l6ZTogMTAsCisgICAgI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5xdWVyeSkKKyAgICAkY29sdW1uLmphdmFGaWVsZDogbnVsbCNpZigkZm9yZWFjaC5jb3VudCAhPSAkY29sdW1ucy5zaXplKCkpLCNlbmQKKyNlbmQKKyNlbmQKKyAgfSwKKyAgcnVsZXM6IHsKKyAgICAjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLnJlcXVpcmVkKQorI3NldCgkcGFyZW50aGVzZUluZGV4PSRjb2x1bW4uY29sdW1uQ29tbWVudC5pbmRleE9mKCLvvIgiKSkKKyNpZigkcGFyZW50aGVzZUluZGV4ICE9IC0xKQorI3NldCgkY29tbWVudD0kY29sdW1uLmNvbHVtbkNvbW1lbnQuc3Vic3RyaW5nKDAsICRwYXJlbnRoZXNlSW5kZXgpKQorI2Vsc2UKKyNzZXQoJGNvbW1lbnQ9JGNvbHVtbi5jb2x1bW5Db21tZW50KQorI2VuZAorICAgICRjb2x1bW4uamF2YUZpZWxkOiBbCisgICAgICB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAiJGNvbW1lbnTkuI3og73kuLrnqboiLCB0cmlnZ2VyOiAjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAic2VsZWN0IiB8fCAkY29sdW1uLmh0bWxUeXBlID09ICJyYWRpbyIpImNoYW5nZSIjZWxzZSJibHVyIiNlbmQgfQorICAgIF0jaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgIH0KK30pOworCitjb25zdCB7IHF1ZXJ5UGFyYW1zLCBmb3JtLCBydWxlcyB9ID0gdG9SZWZzKGRhdGEpOworCisvKiog5p+l6K+iJHtmdW5jdGlvbk5hbWV95YiX6KGoICovCitmdW5jdGlvbiBnZXRMaXN0KCkgeworICBsb2FkaW5nLnZhbHVlID0gdHJ1ZTsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisgIHF1ZXJ5UGFyYW1zLnZhbHVlLnBhcmFtcyA9IHt9OworI2JyZWFrCisjZW5kCisjZW5kCisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJkYXRldGltZSIgJiYgJGNvbHVtbi5xdWVyeVR5cGUgPT0gIkJFVFdFRU4iKQorI3NldCgkQXR0ck5hbWU9JGNvbHVtbi5qYXZhRmllbGQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArICR7Y29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMSl9KQorICBpZiAobnVsbCAhPSBkYXRlcmFuZ2Uke0F0dHJOYW1lfSAmJiAnJyAhPSBkYXRlcmFuZ2Uke0F0dHJOYW1lfSkgeworICAgIHF1ZXJ5UGFyYW1zLnZhbHVlLnBhcmFtc1siYmVnaW4ke0F0dHJOYW1lfSJdID0gZGF0ZXJhbmdlJHtBdHRyTmFtZX0udmFsdWVbMF07CisgICAgcXVlcnlQYXJhbXMudmFsdWUucGFyYW1zWyJlbmQke0F0dHJOYW1lfSJdID0gZGF0ZXJhbmdlJHtBdHRyTmFtZX0udmFsdWVbMV07CisgIH0KKyNlbmQKKyNlbmQKKyAgbGlzdCR7QnVzaW5lc3NOYW1lfShxdWVyeVBhcmFtcy52YWx1ZSkudGhlbihyZXNwb25zZSA9PiB7CisgICAgJHtidXNpbmVzc05hbWV9TGlzdC52YWx1ZSA9IHJlc3BvbnNlLnJvd3M7CisgICAgdG90YWwudmFsdWUgPSByZXNwb25zZS50b3RhbDsKKyAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2U7CisgIH0pOworfQorCisvLyDlj5bmtojmjInpkq4KK2Z1bmN0aW9uIGNhbmNlbCgpIHsKKyAgb3Blbi52YWx1ZSA9IGZhbHNlOworICByZXNldCgpOworfQorCisvLyDooajljZXph43nva4KK2Z1bmN0aW9uIHJlc2V0KCkgeworICBmb3JtLnZhbHVlID0geworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgICRjb2x1bW4uamF2YUZpZWxkOiBbXSNpZigkZm9yZWFjaC5jb3VudCAhPSAkY29sdW1ucy5zaXplKCkpLCNlbmQKKyNlbHNlCisgICAgJGNvbHVtbi5qYXZhRmllbGQ6IG51bGwjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kCisjZW5kCisjZW5kCisgIH07CisjaWYoJHRhYmxlLnN1YikKKyAgJHtzdWJjbGFzc05hbWV9TGlzdC52YWx1ZSA9IFtdOworI2VuZAorICBwcm94eS5yZXNldEZvcm0oIiR7YnVzaW5lc3NOYW1lfVJlZiIpOworfQorCisvKiog5pCc57Si5oyJ6ZKu5pON5L2cICovCitmdW5jdGlvbiBoYW5kbGVRdWVyeSgpIHsKKyAgcXVlcnlQYXJhbXMudmFsdWUucGFnZU51bSA9IDE7CisgIGdldExpc3QoKTsKK30KKworLyoqIOmHjee9ruaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gcmVzZXRRdWVyeSgpIHsKKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uaHRtbFR5cGUgPT0gImRhdGV0aW1lIiAmJiAkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisgIGRhdGVyYW5nZSR7QXR0ck5hbWV9LnZhbHVlID0gW107CisjZW5kCisjZW5kCisgIHByb3h5LnJlc2V0Rm9ybSgicXVlcnlSZWYiKTsKKyAgaGFuZGxlUXVlcnkoKTsKK30KKworLy8g5aSa6YCJ5qGG6YCJ5Lit5pWw5o2uCitmdW5jdGlvbiBoYW5kbGVTZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uKSB7CisgIGlkcy52YWx1ZSA9IHNlbGVjdGlvbi5tYXAoaXRlbSA9PiBpdGVtLiR7cGtDb2x1bW4uamF2YUZpZWxkfSk7CisgIHNpbmdsZS52YWx1ZSA9IHNlbGVjdGlvbi5sZW5ndGggIT0gMTsKKyAgbXVsdGlwbGUudmFsdWUgPSAhc2VsZWN0aW9uLmxlbmd0aDsKK30KKworLyoqIOaWsOWinuaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlQWRkKCkgeworICByZXNldCgpOworICBvcGVuLnZhbHVlID0gdHJ1ZTsKKyAgdGl0bGUudmFsdWUgPSAi5re75YqgJHtmdW5jdGlvbk5hbWV9IjsKK30KKworLyoqIOS/ruaUueaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlVXBkYXRlKHJvdykgeworICByZXNldCgpOworICBjb25zdCBfJHtwa0NvbHVtbi5qYXZhRmllbGR9ID0gcm93LiR7cGtDb2x1bW4uamF2YUZpZWxkfSB8fCBpZHMudmFsdWUKKyAgZ2V0JHtCdXNpbmVzc05hbWV9KF8ke3BrQ29sdW1uLmphdmFGaWVsZH0pLnRoZW4ocmVzcG9uc2UgPT4geworICAgIGZvcm0udmFsdWUgPSByZXNwb25zZS5kYXRhOworI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5odG1sVHlwZSA9PSAiY2hlY2tib3giKQorICAgIGZvcm0udmFsdWUuJGNvbHVtbi5qYXZhRmllbGQgPSBmb3JtLnZhbHVlLiR7Y29sdW1uLmphdmFGaWVsZH0uc3BsaXQoIiwiKTsKKyNlbmQKKyNlbmQKKyNpZigkdGFibGUuc3ViKQorICAgICR7c3ViY2xhc3NOYW1lfUxpc3QudmFsdWUgPSByZXNwb25zZS5kYXRhLiR7c3ViY2xhc3NOYW1lfUxpc3Q7CisjZW5kCisgICAgb3Blbi52YWx1ZSA9IHRydWU7CisgICAgdGl0bGUudmFsdWUgPSAi5L+u5pS5JHtmdW5jdGlvbk5hbWV9IjsKKyAgfSk7Cit9CisKKy8qKiDmj5DkuqTmjInpkq4gKi8KK2Z1bmN0aW9uIHN1Ym1pdEZvcm0oKSB7CisgIHByb3h5LiNbWyRdXSNyZWZzWyIke2J1c2luZXNzTmFtZX1SZWYiXS52YWxpZGF0ZSh2YWxpZCA9PiB7CisgICAgaWYgKHZhbGlkKSB7CisjZm9yZWFjaCAoJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmh0bWxUeXBlID09ICJjaGVja2JveCIpCisgICAgICBmb3JtLnZhbHVlLiRjb2x1bW4uamF2YUZpZWxkID0gZm9ybS52YWx1ZS4ke2NvbHVtbi5qYXZhRmllbGR9LmpvaW4oIiwiKTsKKyNlbmQKKyNlbmQKKyNpZigkdGFibGUuc3ViKQorICAgICAgZm9ybS52YWx1ZS4ke3N1YmNsYXNzTmFtZX1MaXN0ID0gJHtzdWJjbGFzc05hbWV9TGlzdC52YWx1ZTsKKyNlbmQKKyAgICAgIGlmIChmb3JtLnZhbHVlLiR7cGtDb2x1bW4uamF2YUZpZWxkfSAhPSBudWxsKSB7CisgICAgICAgIHVwZGF0ZSR7QnVzaW5lc3NOYW1lfShmb3JtLnZhbHVlKS50aGVuKHJlc3BvbnNlID0+IHsKKyAgICAgICAgICBwcm94eS4jW1skbW9kYWxdXSMubXNnU3VjY2Vzcygi5L+u5pS55oiQ5YqfIik7CisgICAgICAgICAgb3Blbi52YWx1ZSA9IGZhbHNlOworICAgICAgICAgIGdldExpc3QoKTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhZGQke0J1c2luZXNzTmFtZX0oZm9ybS52YWx1ZSkudGhlbihyZXNwb25zZSA9PiB7CisgICAgICAgICAgcHJveHkuI1tbJG1vZGFsXV0jLm1zZ1N1Y2Nlc3MoIuaWsOWinuaIkOWKnyIpOworICAgICAgICAgIG9wZW4udmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICBnZXRMaXN0KCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfSk7Cit9CisKKy8qKiDliKDpmaTmjInpkq7mk43kvZwgKi8KK2Z1bmN0aW9uIGhhbmRsZURlbGV0ZShyb3cpIHsKKyAgY29uc3QgXyR7cGtDb2x1bW4uamF2YUZpZWxkfXMgPSByb3cuJHtwa0NvbHVtbi5qYXZhRmllbGR9IHx8IGlkcy52YWx1ZTsKKyAgcHJveHkuI1tbJG1vZGFsXV0jLmNvbmZpcm0oJ+aYr+WQpuehruiupOWIoOmZpCR7ZnVuY3Rpb25OYW1lfee8luWPt+S4uiInICsgXyR7cGtDb2x1bW4uamF2YUZpZWxkfXMgKyAnIueahOaVsOaNrumhue+8nycpLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGRlbCR7QnVzaW5lc3NOYW1lfShfJHtwa0NvbHVtbi5qYXZhRmllbGR9cyk7CisgIH0pLnRoZW4oKCkgPT4geworICAgIGdldExpc3QoKTsKKyAgICBwcm94eS4jW1skbW9kYWxdXSMubXNnU3VjY2Vzcygi5Yig6Zmk5oiQ5YqfIik7CisgIH0pLmNhdGNoKCgpID0+IHt9KTsKK30KKworI2lmKCR0YWJsZS5zdWIpCisvKiogJHtzdWJUYWJsZS5mdW5jdGlvbk5hbWV95bqP5Y+3ICovCitmdW5jdGlvbiByb3cke3N1YkNsYXNzTmFtZX1JbmRleCh7IHJvdywgcm93SW5kZXggfSkgeworICByb3cuaW5kZXggPSByb3dJbmRleCArIDE7Cit9CisKKy8qKiAke3N1YlRhYmxlLmZ1bmN0aW9uTmFtZX3mt7vliqDmjInpkq7mk43kvZwgKi8KK2Z1bmN0aW9uIGhhbmRsZUFkZCR7c3ViQ2xhc3NOYW1lfSgpIHsKKyAgbGV0IG9iaiA9IHt9OworI2ZvcmVhY2goJGNvbHVtbiBpbiAkc3ViVGFibGUuY29sdW1ucykKKyNpZigkY29sdW1uLnBrIHx8ICRjb2x1bW4uamF2YUZpZWxkID09ICR7c3ViVGFibGVGa2NsYXNzTmFtZX0pCisjZWxzZWlmKCRjb2x1bW4ubGlzdCAmJiAiIiAhPSAkamF2YUZpZWxkKQorICBvYmouJGNvbHVtbi5qYXZhRmllbGQgPSAiIjsKKyNlbmQKKyNlbmQKKyAgJHtzdWJjbGFzc05hbWV9TGlzdC52YWx1ZS5wdXNoKG9iaik7Cit9CisKKy8qKiAke3N1YlRhYmxlLmZ1bmN0aW9uTmFtZX3liKDpmaTmjInpkq7mk43kvZwgKi8KK2Z1bmN0aW9uIGhhbmRsZURlbGV0ZSR7c3ViQ2xhc3NOYW1lfSgpIHsKKyAgaWYgKGNoZWNrZWQke3N1YkNsYXNzTmFtZX0udmFsdWUubGVuZ3RoID09IDApIHsKKyAgICBwcm94eS4jW1skbW9kYWxdXSMubXNnRXJyb3IoIuivt+WFiOmAieaLqeimgeWIoOmZpOeahCR7c3ViVGFibGUuZnVuY3Rpb25OYW1lfeaVsOaNriIpOworICB9IGVsc2UgeworICAgIGNvbnN0ICR7c3ViY2xhc3NOYW1lfXMgPSAke3N1YmNsYXNzTmFtZX1MaXN0LnZhbHVlOworICAgIGNvbnN0IGNoZWNrZWQke3N1YkNsYXNzTmFtZX1zID0gY2hlY2tlZCR7c3ViQ2xhc3NOYW1lfS52YWx1ZTsKKyAgICAke3N1YmNsYXNzTmFtZX1MaXN0LnZhbHVlID0gJHtzdWJjbGFzc05hbWV9cy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgeworICAgICAgcmV0dXJuIGNoZWNrZWQke3N1YkNsYXNzTmFtZX1zLmluZGV4T2YoaXRlbS5pbmRleCkgPT0gLTEKKyAgICB9KTsKKyAgfQorfQorCisvKiog5aSN6YCJ5qGG6YCJ5Lit5pWw5o2uICovCitmdW5jdGlvbiBoYW5kbGUke3N1YkNsYXNzTmFtZX1TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uKSB7CisgIGNoZWNrZWQke3N1YkNsYXNzTmFtZX0udmFsdWUgPSBzZWxlY3Rpb24ubWFwKGl0ZW0gPT4gaXRlbS5pbmRleCkKK30KKworI2VuZAorLyoqIOWvvOWHuuaMiemSruaTjeS9nCAqLworZnVuY3Rpb24gaGFuZGxlRXhwb3J0KCkgeworICBwcm94eS5kb3dubG9hZCgnJHttb2R1bGVOYW1lfS8ke2J1c2luZXNzTmFtZX0vZXhwb3J0JywgeworICAgIC4uLnF1ZXJ5UGFyYW1zLnZhbHVlCisgIH0sIGAke2J1c2luZXNzTmFtZX1fI1tbJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1dXSMueGxzeGApCit9CisKK2dldExpc3QoKTsKKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcnVveWktZ2VuZXJhdG9yL3NyYy9tYWluL3Jlc291cmNlcy92bS94bWwvbWFwcGVyLnhtbC52bSBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0veG1sL21hcHBlci54bWwudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2NzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLWdlbmVyYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvdm0veG1sL21hcHBlci54bWwudm0KQEAgLTAsMCArMSwxNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9IiR7cGFja2FnZU5hbWV9Lm1hcHBlci4ke0NsYXNzTmFtZX1NYXBwZXIiPgorICAgIAorICAgIDxyZXN1bHRNYXAgdHlwZT0iJHtDbGFzc05hbWV9IiBpZD0iJHtDbGFzc05hbWV9UmVzdWx0Ij4KKyNmb3JlYWNoICgkY29sdW1uIGluICRjb2x1bW5zKQorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSIke2NvbHVtbi5qYXZhRmllbGR9IiAgICBjb2x1bW49IiR7Y29sdW1uLmNvbHVtbk5hbWV9IiAgICAvPgorI2VuZAorICAgIDwvcmVzdWx0TWFwPgorI2lmKCR0YWJsZS5zdWIpCisKKyAgICA8cmVzdWx0TWFwIGlkPSIke0NsYXNzTmFtZX0ke3N1YkNsYXNzTmFtZX1SZXN1bHQiIHR5cGU9IiR7Q2xhc3NOYW1lfSIgZXh0ZW5kcz0iJHtDbGFzc05hbWV9UmVzdWx0Ij4KKyAgICAgICAgPGNvbGxlY3Rpb24gcHJvcGVydHk9IiR7c3ViY2xhc3NOYW1lfUxpc3QiIG9mVHlwZT0iJHtzdWJDbGFzc05hbWV9IiBjb2x1bW49IiR7cGtDb2x1bW4uY29sdW1uTmFtZX0iIHNlbGVjdD0ic2VsZWN0JHtzdWJDbGFzc05hbWV9TGlzdCIgLz4KKyAgICA8L3Jlc3VsdE1hcD4KKworICAgIDxyZXN1bHRNYXAgdHlwZT0iJHtzdWJDbGFzc05hbWV9IiBpZD0iJHtzdWJDbGFzc05hbWV9UmVzdWx0Ij4KKyNmb3JlYWNoICgkY29sdW1uIGluICRzdWJUYWJsZS5jb2x1bW5zKQorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSIke2NvbHVtbi5qYXZhRmllbGR9IiAgICBjb2x1bW49IiR7Y29sdW1uLmNvbHVtbk5hbWV9IiAgICAvPgorI2VuZAorICAgIDwvcmVzdWx0TWFwPgorI2VuZAorCisgICAgPHNxbCBpZD0ic2VsZWN0JHtDbGFzc05hbWV9Vm8iPgorICAgICAgICBzZWxlY3QjZm9yZWFjaCgkY29sdW1uIGluICRjb2x1bW5zKSAkY29sdW1uLmNvbHVtbk5hbWUjaWYoJGZvcmVhY2guY291bnQgIT0gJGNvbHVtbnMuc2l6ZSgpKSwjZW5kI2VuZCBmcm9tICR7dGFibGVOYW1lfQorICAgIDwvc3FsPgorCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0JHtDbGFzc05hbWV9TGlzdCIgcGFyYW1ldGVyVHlwZT0iJHtDbGFzc05hbWV9IiByZXN1bHRNYXA9IiR7Q2xhc3NOYW1lfVJlc3VsdCI+CisgICAgICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3Qke0NsYXNzTmFtZX1WbyIvPgorICAgICAgICA8d2hlcmU+ICAKKyNmb3JlYWNoKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjc2V0KCRxdWVyeVR5cGU9JGNvbHVtbi5xdWVyeVR5cGUpCisjc2V0KCRqYXZhRmllbGQ9JGNvbHVtbi5qYXZhRmllbGQpCisjc2V0KCRqYXZhVHlwZT0kY29sdW1uLmphdmFUeXBlKQorI3NldCgkY29sdW1uTmFtZT0kY29sdW1uLmNvbHVtbk5hbWUpCisjc2V0KCRBdHRyTmFtZT0kY29sdW1uLmphdmFGaWVsZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgJHtjb2x1bW4uamF2YUZpZWxkLnN1YnN0cmluZygxKX0pCisjaWYoJGNvbHVtbi5xdWVyeSkKKyNpZigkY29sdW1uLnF1ZXJ5VHlwZSA9PSAiRVEiKQorICAgICAgICAgICAgPGlmIHRlc3Q9IiRqYXZhRmllbGQgIT0gbnVsbCAjaWYoJGphdmFUeXBlID09ICdTdHJpbmcnICkgYW5kICRqYXZhRmllbGQudHJpbSgpICE9ICcnI2VuZCI+IGFuZCAkY29sdW1uTmFtZSA9ICN7JGphdmFGaWVsZH08L2lmPgorI2Vsc2VpZigkcXVlcnlUeXBlID09ICJORSIpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGphdmFGaWVsZCAhPSBudWxsICNpZigkamF2YVR5cGUgPT0gJ1N0cmluZycgKSBhbmQgJGphdmFGaWVsZC50cmltKCkgIT0gJycjZW5kIj4gYW5kICRjb2x1bW5OYW1lICE9ICN7JGphdmFGaWVsZH08L2lmPgorI2Vsc2VpZigkcXVlcnlUeXBlID09ICJHVCIpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGphdmFGaWVsZCAhPSBudWxsICNpZigkamF2YVR5cGUgPT0gJ1N0cmluZycgKSBhbmQgJGphdmFGaWVsZC50cmltKCkgIT0gJycjZW5kIj4gYW5kICRjb2x1bW5OYW1lICZndDsgI3skamF2YUZpZWxkfTwvaWY+CisjZWxzZWlmKCRxdWVyeVR5cGUgPT0gIkdURSIpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGphdmFGaWVsZCAhPSBudWxsICNpZigkamF2YVR5cGUgPT0gJ1N0cmluZycgKSBhbmQgJGphdmFGaWVsZC50cmltKCkgIT0gJycjZW5kIj4gYW5kICRjb2x1bW5OYW1lICZndDs9ICN7JGphdmFGaWVsZH08L2lmPgorI2Vsc2VpZigkcXVlcnlUeXBlID09ICJMVCIpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGphdmFGaWVsZCAhPSBudWxsICNpZigkamF2YVR5cGUgPT0gJ1N0cmluZycgKSBhbmQgJGphdmFGaWVsZC50cmltKCkgIT0gJycjZW5kIj4gYW5kICRjb2x1bW5OYW1lICZsdDsgI3skamF2YUZpZWxkfTwvaWY+CisjZWxzZWlmKCRxdWVyeVR5cGUgPT0gIkxURSIpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGphdmFGaWVsZCAhPSBudWxsICNpZigkamF2YVR5cGUgPT0gJ1N0cmluZycgKSBhbmQgJGphdmFGaWVsZC50cmltKCkgIT0gJycjZW5kIj4gYW5kICRjb2x1bW5OYW1lICZsdDs9ICN7JGphdmFGaWVsZH08L2lmPgorI2Vsc2VpZigkcXVlcnlUeXBlID09ICJMSUtFIikKKyAgICAgICAgICAgIDxpZiB0ZXN0PSIkamF2YUZpZWxkICE9IG51bGwgI2lmKCRqYXZhVHlwZSA9PSAnU3RyaW5nJyApIGFuZCAkamF2YUZpZWxkLnRyaW0oKSAhPSAnJyNlbmQiPiBhbmQgJGNvbHVtbk5hbWUgbGlrZSBjb25jYXQoJyUnLCAjeyRqYXZhRmllbGR9LCAnJScpPC9pZj4KKyNlbHNlaWYoJHF1ZXJ5VHlwZSA9PSAiQkVUV0VFTiIpCisgICAgICAgICAgICA8aWYgdGVzdD0icGFyYW1zLmJlZ2luJEF0dHJOYW1lICE9IG51bGwgYW5kIHBhcmFtcy5iZWdpbiRBdHRyTmFtZSAhPSAnJyBhbmQgcGFyYW1zLmVuZCRBdHRyTmFtZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kJEF0dHJOYW1lICE9ICcnIj4gYW5kICRjb2x1bW5OYW1lIGJldHdlZW4gI3twYXJhbXMuYmVnaW4kQXR0ck5hbWV9IGFuZCAje3BhcmFtcy5lbmQkQXR0ck5hbWV9PC9pZj4KKyNlbmQKKyNlbmQKKyNlbmQKKyAgICAgICAgPC93aGVyZT4KKyAgICA8L3NlbGVjdD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3Qke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfSIgcGFyYW1ldGVyVHlwZT0iJHtwa0NvbHVtbi5qYXZhVHlwZX0iIHJlc3VsdE1hcD0iI2lmKCR0YWJsZS5zdWIpJHtDbGFzc05hbWV9JHtzdWJDbGFzc05hbWV9UmVzdWx0I2Vsc2Uke0NsYXNzTmFtZX1SZXN1bHQjZW5kIj4KKyNpZigkdGFibGUuY3J1ZCB8fCAkdGFibGUudHJlZSkKKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdCR7Q2xhc3NOYW1lfVZvIi8+CisgICAgICAgIHdoZXJlICR7cGtDb2x1bW4uY29sdW1uTmFtZX0gPSAjeyR7cGtDb2x1bW4uamF2YUZpZWxkfX0KKyNlbHNlaWYoJHRhYmxlLnN1YikKKyAgICAgICAgc2VsZWN0I2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykgJGNvbHVtbi5jb2x1bW5OYW1lI2lmKCRmb3JlYWNoLmNvdW50ICE9ICRjb2x1bW5zLnNpemUoKSksI2VuZCNlbmQKKyAgICAgICAgZnJvbSAke3RhYmxlTmFtZX0KKyAgICAgICAgd2hlcmUgJHtwa0NvbHVtbi5jb2x1bW5OYW1lfSA9ICN7JHtwa0NvbHVtbi5qYXZhRmllbGR9fQorI2VuZAorICAgIDwvc2VsZWN0PgorI2lmKCR0YWJsZS5zdWIpCisKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3Qke3N1YkNsYXNzTmFtZX1MaXN0IiByZXN1bHRNYXA9IiR7c3ViQ2xhc3NOYW1lfVJlc3VsdCI+CisgICAgICAgIHNlbGVjdCNmb3JlYWNoICgkY29sdW1uIGluICRzdWJUYWJsZS5jb2x1bW5zKSAkY29sdW1uLmNvbHVtbk5hbWUjaWYoJGZvcmVhY2guY291bnQgIT0gJHN1YlRhYmxlLmNvbHVtbnMuc2l6ZSgpKSwjZW5kI2VuZAorICAgICAgICBmcm9tICR7c3ViVGFibGVOYW1lfQorICAgICAgICB3aGVyZSAke3N1YlRhYmxlRmtOYW1lfSA9ICN7JHtzdWJUYWJsZUZrTmFtZX19CisgICAgPC9zZWxlY3Q+CisjZW5kCisKKyAgICA8aW5zZXJ0IGlkPSJpbnNlcnQke0NsYXNzTmFtZX0iIHBhcmFtZXRlclR5cGU9IiR7Q2xhc3NOYW1lfSIjaWYoJHBrQ29sdW1uLmluY3JlbWVudCkgdXNlR2VuZXJhdGVkS2V5cz0idHJ1ZSIga2V5UHJvcGVydHk9IiRwa0NvbHVtbi5qYXZhRmllbGQiI2VuZD4KKyAgICAgICAgaW5zZXJ0IGludG8gJHt0YWJsZU5hbWV9CisgICAgICAgIDx0cmltIHByZWZpeD0iKCIgc3VmZml4PSIpIiBzdWZmaXhPdmVycmlkZXM9IiwiPgorI2ZvcmVhY2goJGNvbHVtbiBpbiAkY29sdW1ucykKKyNpZigkY29sdW1uLmNvbHVtbk5hbWUgIT0gJHBrQ29sdW1uLmNvbHVtbk5hbWUgfHwgISRwa0NvbHVtbi5pbmNyZW1lbnQpCisgICAgICAgICAgICA8aWYgdGVzdD0iJGNvbHVtbi5qYXZhRmllbGQgIT0gbnVsbCNpZigkY29sdW1uLmphdmFUeXBlID09ICdTdHJpbmcnICYmICRjb2x1bW4ucmVxdWlyZWQpIGFuZCAkY29sdW1uLmphdmFGaWVsZCAhPSAnJyNlbmQiPiRjb2x1bW4uY29sdW1uTmFtZSw8L2lmPgorI2VuZAorI2VuZAorICAgICAgICAgPC90cmltPgorICAgICAgICA8dHJpbSBwcmVmaXg9InZhbHVlcyAoIiBzdWZmaXg9IikiIHN1ZmZpeE92ZXJyaWRlcz0iLCI+CisjZm9yZWFjaCgkY29sdW1uIGluICRjb2x1bW5zKQorI2lmKCRjb2x1bW4uY29sdW1uTmFtZSAhPSAkcGtDb2x1bW4uY29sdW1uTmFtZSB8fCAhJHBrQ29sdW1uLmluY3JlbWVudCkKKyAgICAgICAgICAgIDxpZiB0ZXN0PSIkY29sdW1uLmphdmFGaWVsZCAhPSBudWxsI2lmKCRjb2x1bW4uamF2YVR5cGUgPT0gJ1N0cmluZycgJiYgJGNvbHVtbi5yZXF1aXJlZCkgYW5kICRjb2x1bW4uamF2YUZpZWxkICE9ICcnI2VuZCI+I3skY29sdW1uLmphdmFGaWVsZH0sPC9pZj4KKyNlbmQKKyNlbmQKKyAgICAgICAgIDwvdHJpbT4KKyAgICA8L2luc2VydD4KKworICAgIDx1cGRhdGUgaWQ9InVwZGF0ZSR7Q2xhc3NOYW1lfSIgcGFyYW1ldGVyVHlwZT0iJHtDbGFzc05hbWV9Ij4KKyAgICAgICAgdXBkYXRlICR7dGFibGVOYW1lfQorICAgICAgICA8dHJpbSBwcmVmaXg9IlNFVCIgc3VmZml4T3ZlcnJpZGVzPSIsIj4KKyNmb3JlYWNoKCRjb2x1bW4gaW4gJGNvbHVtbnMpCisjaWYoJGNvbHVtbi5jb2x1bW5OYW1lICE9ICRwa0NvbHVtbi5jb2x1bW5OYW1lKQorICAgICAgICAgICAgPGlmIHRlc3Q9IiRjb2x1bW4uamF2YUZpZWxkICE9IG51bGwjaWYoJGNvbHVtbi5qYXZhVHlwZSA9PSAnU3RyaW5nJyAmJiAkY29sdW1uLnJlcXVpcmVkKSBhbmQgJGNvbHVtbi5qYXZhRmllbGQgIT0gJycjZW5kIj4kY29sdW1uLmNvbHVtbk5hbWUgPSAjeyRjb2x1bW4uamF2YUZpZWxkfSw8L2lmPgorI2VuZAorI2VuZAorICAgICAgICA8L3RyaW0+CisgICAgICAgIHdoZXJlICR7cGtDb2x1bW4uY29sdW1uTmFtZX0gPSAjeyR7cGtDb2x1bW4uamF2YUZpZWxkfX0KKyAgICA8L3VwZGF0ZT4KKworICAgIDxkZWxldGUgaWQ9ImRlbGV0ZSR7Q2xhc3NOYW1lfUJ5JHtwa0NvbHVtbi5jYXBKYXZhRmllbGR9IiBwYXJhbWV0ZXJUeXBlPSIke3BrQ29sdW1uLmphdmFUeXBlfSI+CisgICAgICAgIGRlbGV0ZSBmcm9tICR7dGFibGVOYW1lfSB3aGVyZSAke3BrQ29sdW1uLmNvbHVtbk5hbWV9ID0gI3ske3BrQ29sdW1uLmphdmFGaWVsZH19CisgICAgPC9kZWxldGU+CisKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGUke0NsYXNzTmFtZX1CeSR7cGtDb2x1bW4uY2FwSmF2YUZpZWxkfXMiIHBhcmFtZXRlclR5cGU9IlN0cmluZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tICR7dGFibGVOYW1lfSB3aGVyZSAke3BrQ29sdW1uLmNvbHVtbk5hbWV9IGluIAorICAgICAgICA8Zm9yZWFjaCBpdGVtPSIke3BrQ29sdW1uLmphdmFGaWVsZH0iIGNvbGxlY3Rpb249ImFycmF5IiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAgICAgICAgICAgICN7JHtwa0NvbHVtbi5qYXZhRmllbGR9fQorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC9kZWxldGU+CisjaWYoJHRhYmxlLnN1YikKKyAgICAKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGUke3N1YkNsYXNzTmFtZX1CeSR7c3ViVGFibGVGa0NsYXNzTmFtZX1zIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciPgorICAgICAgICBkZWxldGUgZnJvbSAke3N1YlRhYmxlTmFtZX0gd2hlcmUgJHtzdWJUYWJsZUZrTmFtZX0gaW4gCisgICAgICAgIDxmb3JlYWNoIGl0ZW09IiR7c3ViVGFibGVGa2NsYXNzTmFtZX0iIGNvbGxlY3Rpb249ImFycmF5IiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAgICAgICAgICAgICN7JHtzdWJUYWJsZUZrY2xhc3NOYW1lfX0KKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvZGVsZXRlPgorCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlJHtzdWJDbGFzc05hbWV9Qnkke3N1YlRhYmxlRmtDbGFzc05hbWV9IiBwYXJhbWV0ZXJUeXBlPSIke3BrQ29sdW1uLmphdmFUeXBlfSI+CisgICAgICAgIGRlbGV0ZSBmcm9tICR7c3ViVGFibGVOYW1lfSB3aGVyZSAke3N1YlRhYmxlRmtOYW1lfSA9ICN7JHtzdWJUYWJsZUZrY2xhc3NOYW1lfX0KKyAgICA8L2RlbGV0ZT4KKworICAgIDxpbnNlcnQgaWQ9ImJhdGNoJHtzdWJDbGFzc05hbWV9Ij4KKyAgICAgICAgaW5zZXJ0IGludG8gJHtzdWJUYWJsZU5hbWV9KCNmb3JlYWNoKCRjb2x1bW4gaW4gJHN1YlRhYmxlLmNvbHVtbnMpICRjb2x1bW4uY29sdW1uTmFtZSNpZigkZm9yZWFjaC5jb3VudCAhPSAkc3ViVGFibGUuY29sdW1ucy5zaXplKCkpLCNlbmQjZW5kKSB2YWx1ZXMKKyAgICAgICAgPGZvcmVhY2ggaXRlbT0iaXRlbSIgaW5kZXg9ImluZGV4IiBjb2xsZWN0aW9uPSJsaXN0IiBzZXBhcmF0b3I9IiwiPgorICAgICAgICAgICAgKCNmb3JlYWNoKCRjb2x1bW4gaW4gJHN1YlRhYmxlLmNvbHVtbnMpICN7aXRlbS4kY29sdW1uLmphdmFGaWVsZH0jaWYoJGZvcmVhY2guY291bnQgIT0gJHN1YlRhYmxlLmNvbHVtbnMuc2l6ZSgpKSwjZW5kI2VuZCkKKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvaW5zZXJ0PgorI2VuZAorPC9tYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3BvbS54bWwgYi9ydW95aS1xdWFydHovcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhMGNlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cnVveWk8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPmNvbS5ydW95aTwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+My44Ljg8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+cnVveWktcXVhcnR6PC9hcnRpZmFjdElkPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBxdWFydHrlrprml7bku7vliqEKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8IS0tIOWumuaXtuS7u+WKoSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucXVhcnR6LXNjaGVkdWxlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnF1YXJ0ejwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5tY2hhbmdlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jM3AwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSDpgJrnlKjlt6XlhbctLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucnVveWk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ydW95aS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9jb25maWcvU2NoZWR1bGVDb25maWcuamF2YSBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovY29uZmlnL1NjaGVkdWxlQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlMDY1YQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovY29uZmlnL1NjaGVkdWxlQ29uZmlnLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLy9wYWNrYWdlIGNvbS5ydW95aS5xdWFydHouY29uZmlnOworLy8KKy8vaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkJlYW47CisvL2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworLy9pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zY2hlZHVsaW5nLnF1YXJ0ei5TY2hlZHVsZXJGYWN0b3J5QmVhbjsKKy8vaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOworLy9pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisvLworLy8vKioKKy8vICog5a6a5pe25Lu75Yqh6YWN572u77yI5Y2V5py66YOo572y5bu66K6u5Yig6Zmk5q2k57G75ZKMcXJ0euaVsOaNruW6k+ihqO+8jOm7mOiupOi1sOWGheWtmOS8muacgOmrmOaViO+8iQorLy8gKiAKKy8vICogQGF1dGhvciBydW95aQorLy8gKi8KKy8vQENvbmZpZ3VyYXRpb24KKy8vcHVibGljIGNsYXNzIFNjaGVkdWxlQ29uZmlnCisvL3sKKy8vICAgIEBCZWFuCisvLyAgICBwdWJsaWMgU2NoZWR1bGVyRmFjdG9yeUJlYW4gc2NoZWR1bGVyRmFjdG9yeUJlYW4oRGF0YVNvdXJjZSBkYXRhU291cmNlKQorLy8gICAgeworLy8gICAgICAgIFNjaGVkdWxlckZhY3RvcnlCZWFuIGZhY3RvcnkgPSBuZXcgU2NoZWR1bGVyRmFjdG9yeUJlYW4oKTsKKy8vICAgICAgICBmYWN0b3J5LnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisvLworLy8gICAgICAgIC8vIHF1YXJ0euWPguaVsAorLy8gICAgICAgIFByb3BlcnRpZXMgcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisvLyAgICAgICAgcHJvcC5wdXQoIm9yZy5xdWFydHouc2NoZWR1bGVyLmluc3RhbmNlTmFtZSIsICJSdW95aVNjaGVkdWxlciIpOworLy8gICAgICAgIHByb3AucHV0KCJvcmcucXVhcnR6LnNjaGVkdWxlci5pbnN0YW5jZUlkIiwgIkFVVE8iKTsKKy8vICAgICAgICAvLyDnur/nqIvmsaDphY3nva4KKy8vICAgICAgICBwcm9wLnB1dCgib3JnLnF1YXJ0ei50aHJlYWRQb29sLmNsYXNzIiwgIm9yZy5xdWFydHouc2ltcGwuU2ltcGxlVGhyZWFkUG9vbCIpOworLy8gICAgICAgIHByb3AucHV0KCJvcmcucXVhcnR6LnRocmVhZFBvb2wudGhyZWFkQ291bnQiLCAiMjAiKTsKKy8vICAgICAgICBwcm9wLnB1dCgib3JnLnF1YXJ0ei50aHJlYWRQb29sLnRocmVhZFByaW9yaXR5IiwgIjUiKTsKKy8vICAgICAgICAvLyBKb2JTdG9yZemFjee9rgorLy8gICAgICAgIHByb3AucHV0KCJvcmcucXVhcnR6LmpvYlN0b3JlLmNsYXNzIiwgIm9yZy5zcHJpbmdmcmFtZXdvcmsuc2NoZWR1bGluZy5xdWFydHouTG9jYWxEYXRhU291cmNlSm9iU3RvcmUiKTsKKy8vICAgICAgICAvLyDpm4bnvqTphY3nva4KKy8vICAgICAgICBwcm9wLnB1dCgib3JnLnF1YXJ0ei5qb2JTdG9yZS5pc0NsdXN0ZXJlZCIsICJ0cnVlIik7CisvLyAgICAgICAgcHJvcC5wdXQoIm9yZy5xdWFydHouam9iU3RvcmUuY2x1c3RlckNoZWNraW5JbnRlcnZhbCIsICIxNTAwMCIpOworLy8gICAgICAgIHByb3AucHV0KCJvcmcucXVhcnR6LmpvYlN0b3JlLm1heE1pc2ZpcmVzVG9IYW5kbGVBdEFUaW1lIiwgIjEwIik7CisvLyAgICAgICAgcHJvcC5wdXQoIm9yZy5xdWFydHouam9iU3RvcmUudHhJc29sYXRpb25MZXZlbFNlcmlhbGl6YWJsZSIsICJ0cnVlIik7CisvLworLy8gICAgICAgIC8vIHNxbHNlcnZlciDlkK/nlKgKKy8vICAgICAgICAvLyBwcm9wLnB1dCgib3JnLnF1YXJ0ei5qb2JTdG9yZS5zZWxlY3RXaXRoTG9ja1NRTCIsICJTRUxFQ1QgKiBGUk9NIHswfUxPQ0tTIFVQRExPQ0sgV0hFUkUgTE9DS19OQU1FID0gPyIpOworLy8gICAgICAgIHByb3AucHV0KCJvcmcucXVhcnR6LmpvYlN0b3JlLm1pc2ZpcmVUaHJlc2hvbGQiLCAiMTIwMDAiKTsKKy8vICAgICAgICBwcm9wLnB1dCgib3JnLnF1YXJ0ei5qb2JTdG9yZS50YWJsZVByZWZpeCIsICJRUlRaXyIpOworLy8gICAgICAgIGZhY3Rvcnkuc2V0UXVhcnR6UHJvcGVydGllcyhwcm9wKTsKKy8vCisvLyAgICAgICAgZmFjdG9yeS5zZXRTY2hlZHVsZXJOYW1lKCJSdW95aVNjaGVkdWxlciIpOworLy8gICAgICAgIC8vIOW7tuaXtuWQr+WKqAorLy8gICAgICAgIGZhY3Rvcnkuc2V0U3RhcnR1cERlbGF5KDEpOworLy8gICAgICAgIGZhY3Rvcnkuc2V0QXBwbGljYXRpb25Db250ZXh0U2NoZWR1bGVyQ29udGV4dEtleSgiYXBwbGljYXRpb25Db250ZXh0S2V5Iik7CisvLyAgICAgICAgLy8g5Y+v6YCJ77yMUXVhcnR6U2NoZWR1bGVyCisvLyAgICAgICAgLy8g5ZCv5Yqo5pe25pu05paw5bex5a2Y5Zyo55qESm9i77yM6L+Z5qC35bCx5LiN55So5q+P5qyh5L+u5pS5dGFyZ2V0T2JqZWN05ZCO5Yig6ZmkcXJ0el9qb2JfZGV0YWlsc+ihqOWvueW6lOiusOW9leS6hgorLy8gICAgICAgIGZhY3Rvcnkuc2V0T3ZlcndyaXRlRXhpc3RpbmdKb2JzKHRydWUpOworLy8gICAgICAgIC8vIOiuvue9ruiHquWKqOWQr+WKqO+8jOm7mOiupOS4unRydWUKKy8vICAgICAgICBmYWN0b3J5LnNldEF1dG9TdGFydHVwKHRydWUpOworLy8KKy8vICAgICAgICByZXR1cm4gZmFjdG9yeTsKKy8vICAgIH0KKy8vfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9jb250cm9sbGVyL1N5c0pvYkNvbnRyb2xsZXIuamF2YSBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovY29udHJvbGxlci9TeXNKb2JDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyNmRmZAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovY29udHJvbGxlci9TeXNKb2JDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxODUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei5jb250cm9sbGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlB1dE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RCb2R5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXF1ZXN0TWFwcGluZzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkxvZzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuY29udHJvbGxlci5CYXNlQ29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLkFqYXhSZXN1bHQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLnBhZ2UuVGFibGVEYXRhSW5mbzsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmVudW1zLkJ1c2luZXNzVHlwZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5qb2IuVGFza0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5zZXJ2aWNlLklTeXNKb2JTZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5xdWFydHoudXRpbC5Dcm9uVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei51dGlsLlNjaGVkdWxlVXRpbHM7CisKKy8qKgorICog6LCD5bqm5Lu75Yqh5L+h5oGv5pON5L2c5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi9tb25pdG9yL2pvYiIpCitwdWJsaWMgY2xhc3MgU3lzSm9iQ29udHJvbGxlciBleHRlbmRzIEJhc2VDb250cm9sbGVyCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSVN5c0pvYlNlcnZpY2Ugam9iU2VydmljZTsKKworICAgIC8qKgorICAgICAqIOafpeivouWumuaXtuS7u+WKoeWIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpqb2I6bGlzdCcpIikKKyAgICBAR2V0TWFwcGluZygiL2xpc3QiKQorICAgIHB1YmxpYyBUYWJsZURhdGFJbmZvIGxpc3QoU3lzSm9iIHN5c0pvYikKKyAgICB7CisgICAgICAgIHN0YXJ0UGFnZSgpOworICAgICAgICBMaXN0PFN5c0pvYj4gbGlzdCA9IGpvYlNlcnZpY2Uuc2VsZWN0Sm9iTGlzdChzeXNKb2IpOworICAgICAgICByZXR1cm4gZ2V0RGF0YVRhYmxlKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvvOWHuuWumuaXtuS7u+WKoeWIl+ihqAorICAgICAqLworICAgIEBQcmVBdXRob3JpemUoIkBzcy5oYXNQZXJtaSgnbW9uaXRvcjpqb2I6ZXhwb3J0JykiKQorICAgIEBMb2codGl0bGUgPSAi5a6a5pe25Lu75YqhIiwgYnVzaW5lc3NUeXBlID0gQnVzaW5lc3NUeXBlLkVYUE9SVCkKKyAgICBAUG9zdE1hcHBpbmcoIi9leHBvcnQiKQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTeXNKb2Igc3lzSm9iKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNKb2I+IGxpc3QgPSBqb2JTZXJ2aWNlLnNlbGVjdEpvYkxpc3Qoc3lzSm9iKTsKKyAgICAgICAgRXhjZWxVdGlsPFN5c0pvYj4gdXRpbCA9IG5ldyBFeGNlbFV0aWw8U3lzSm9iPihTeXNKb2IuY2xhc3MpOworICAgICAgICB1dGlsLmV4cG9ydEV4Y2VsKHJlc3BvbnNlLCBsaXN0LCAi5a6a5pe25Lu75YqhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W5a6a5pe25Lu75Yqh6K+m57uG5L+h5oGvCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmpvYjpxdWVyeScpIikKKyAgICBAR2V0TWFwcGluZyh2YWx1ZSA9ICIve2pvYklkfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgZ2V0SW5mbyhAUGF0aFZhcmlhYmxlKCJqb2JJZCIpIExvbmcgam9iSWQpCisgICAgeworICAgICAgICByZXR1cm4gc3VjY2Vzcyhqb2JTZXJ2aWNlLnNlbGVjdEpvYkJ5SWQoam9iSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7lrprml7bku7vliqEKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOmFkZCcpIikKKyAgICBATG9nKHRpdGxlID0gIuWumuaXtuS7u+WKoSIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5JTlNFUlQpCisgICAgQFBvc3RNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgYWRkKEBSZXF1ZXN0Qm9keSBTeXNKb2Igam9iKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uLCBUYXNrRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoIUNyb25VdGlscy5pc1ZhbGlkKGpvYi5nZXRDcm9uRXhwcmVzc2lvbigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLmlrDlop7ku7vliqEnIiArIGpvYi5nZXRKb2JOYW1lKCkgKyAiJ+Wksei0pe+8jENyb27ooajovr7lvI/kuI3mraPnoa4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5jb250YWluc0lnbm9yZUNhc2Uoam9iLmdldEludm9rZVRhcmdldCgpLCBDb25zdGFudHMuTE9PS1VQX1JNSSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe5Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIznm67moIflrZfnrKbkuLLkuI3lhYHorrgncm1pJ+iwg+eUqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmNvbnRhaW5zQW55SWdub3JlQ2FzZShqb2IuZ2V0SW52b2tlVGFyZ2V0KCksIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5MT09LVVBfTERBUCwgQ29uc3RhbnRzLkxPT0tVUF9MREFQUyB9KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLmlrDlop7ku7vliqEnIiArIGpvYi5nZXRKb2JOYW1lKCkgKyAiJ+Wksei0pe+8jOebruagh+Wtl+espuS4suS4jeWFgeiuuCdsZGFwKHMpJ+iwg+eUqCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmNvbnRhaW5zQW55SWdub3JlQ2FzZShqb2IuZ2V0SW52b2tlVGFyZ2V0KCksIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5IVFRQLCBDb25zdGFudHMuSFRUUFMgfSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe5Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIznm67moIflrZfnrKbkuLLkuI3lhYHorrgnaHR0cChzKSfosIPnlKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueUlnbm9yZUNhc2Uoam9iLmdldEludm9rZVRhcmdldCgpLCBDb25zdGFudHMuSk9CX0VSUk9SX1NUUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5paw5aKe5Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIznm67moIflrZfnrKbkuLLlrZjlnKjov53op4QiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghU2NoZWR1bGVVdGlscy53aGl0ZUxpc3Qoam9iLmdldEludm9rZVRhcmdldCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCLmlrDlop7ku7vliqEnIiArIGpvYi5nZXRKb2JOYW1lKCkgKyAiJ+Wksei0pe+8jOebruagh+Wtl+espuS4suS4jeWcqOeZveWQjeWNleWGhSIpOworICAgICAgICB9CisgICAgICAgIGpvYi5zZXRDcmVhdGVCeShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRvQWpheChqb2JTZXJ2aWNlLmluc2VydEpvYihqb2IpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlrprml7bku7vliqEKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOmVkaXQnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrprml7bku7vliqEiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nCisgICAgcHVibGljIEFqYXhSZXN1bHQgZWRpdChAUmVxdWVzdEJvZHkgU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiwgVGFza0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFDcm9uVXRpbHMuaXNWYWxpZChqb2IuZ2V0Q3JvbkV4cHJlc3Npb24oKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIxDcm9u6KGo6L6+5byP5LiN5q2j56GuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuY29udGFpbnNJZ25vcmVDYXNlKGpvYi5nZXRJbnZva2VUYXJnZXQoKSwgQ29uc3RhbnRzLkxPT0tVUF9STUkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueS7u+WKoSciICsgam9iLmdldEpvYk5hbWUoKSArICIn5aSx6LSl77yM55uu5qCH5a2X56ym5Liy5LiN5YWB6K64J3JtaSfosIPnlKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueUlnbm9yZUNhc2Uoam9iLmdldEludm9rZVRhcmdldCgpLCBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuTE9PS1VQX0xEQVAsIENvbnN0YW50cy5MT09LVVBfTERBUFMgfSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIznm67moIflrZfnrKbkuLLkuI3lhYHorrgnbGRhcChzKSfosIPnlKgiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5jb250YWluc0FueUlnbm9yZUNhc2Uoam9iLmdldEludm9rZVRhcmdldCgpLCBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuSFRUUCwgQ29uc3RhbnRzLkhUVFBTIH0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueS7u+WKoSciICsgam9iLmdldEpvYk5hbWUoKSArICIn5aSx6LSl77yM55uu5qCH5a2X56ym5Liy5LiN5YWB6K64J2h0dHAocykn6LCD55SoIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuY29udGFpbnNBbnlJZ25vcmVDYXNlKGpvYi5nZXRJbnZva2VUYXJnZXQoKSwgQ29uc3RhbnRzLkpPQl9FUlJPUl9TVFIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIuS/ruaUueS7u+WKoSciICsgam9iLmdldEpvYk5hbWUoKSArICIn5aSx6LSl77yM55uu5qCH5a2X56ym5Liy5a2Y5Zyo6L+d6KeEIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIVNjaGVkdWxlVXRpbHMud2hpdGVMaXN0KGpvYi5nZXRJbnZva2VUYXJnZXQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigi5L+u5pS55Lu75YqhJyIgKyBqb2IuZ2V0Sm9iTmFtZSgpICsgIiflpLHotKXvvIznm67moIflrZfnrKbkuLLkuI3lnKjnmb3lkI3ljZXlhoUiKTsKKyAgICAgICAgfQorICAgICAgICBqb2Iuc2V0VXBkYXRlQnkoZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgoam9iU2VydmljZS51cGRhdGVKb2Ioam9iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a6a5pe25Lu75Yqh54q25oCB5L+u5pS5CisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmpvYjpjaGFuZ2VTdGF0dXMnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrprml7bku7vliqEiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nKCIvY2hhbmdlU3RhdHVzIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBjaGFuZ2VTdGF0dXMoQFJlcXVlc3RCb2R5IFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN5c0pvYiBuZXdKb2IgPSBqb2JTZXJ2aWNlLnNlbGVjdEpvYkJ5SWQoam9iLmdldEpvYklkKCkpOworICAgICAgICBuZXdKb2Iuc2V0U3RhdHVzKGpvYi5nZXRTdGF0dXMoKSk7CisgICAgICAgIHJldHVybiB0b0FqYXgoam9iU2VydmljZS5jaGFuZ2VTdGF0dXMobmV3Sm9iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5a6a5pe25Lu75Yqh56uL5Y2z5omn6KGM5LiA5qyhCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmpvYjpjaGFuZ2VTdGF0dXMnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrprml7bku7vliqEiLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuVVBEQVRFKQorICAgIEBQdXRNYXBwaW5nKCIvcnVuIikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBydW4oQFJlcXVlc3RCb2R5IFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gam9iU2VydmljZS5ydW4oam9iKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IHN1Y2Nlc3MoKSA6IGVycm9yKCLku7vliqHkuI3lrZjlnKjmiJblt7Lov4fmnJ/vvIEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTlrprml7bku7vliqEKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOnJlbW92ZScpIikKKyAgICBATG9nKHRpdGxlID0gIuWumuaXtuS7u+WKoSIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5ERUxFVEUpCisgICAgQERlbGV0ZU1hcHBpbmcoIi97am9iSWRzfSIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgcmVtb3ZlKEBQYXRoVmFyaWFibGUgTG9uZ1tdIGpvYklkcykgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiwgVGFza0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgam9iU2VydmljZS5kZWxldGVKb2JCeUlkcyhqb2JJZHMpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovY29udHJvbGxlci9TeXNKb2JMb2dDb250cm9sbGVyLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L2NvbnRyb2xsZXIvU3lzSm9iTG9nQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzM2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L2NvbnRyb2xsZXIvU3lzSm9iTG9nQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei5jb250cm9sbGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5hY2Nlc3MucHJlcG9zdC5QcmVBdXRob3JpemU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkRlbGV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLkdldE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlBhdGhWYXJpYWJsZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUG9zdE1hcHBpbmc7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLlJlcXVlc3RNYXBwaW5nOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi5SZXN0Q29udHJvbGxlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uTG9nOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQWpheFJlc3VsdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucGFnZS5UYWJsZURhdGFJbmZvOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuQnVzaW5lc3NUeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMucG9pLkV4Y2VsVXRpbDsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2JMb2c7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5zZXJ2aWNlLklTeXNKb2JMb2dTZXJ2aWNlOworCisvKioKKyAqIOiwg+W6puaXpeW/l+aTjeS9nOWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKCIvbW9uaXRvci9qb2JMb2ciKQorcHVibGljIGNsYXNzIFN5c0pvYkxvZ0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlcgoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNKb2JMb2dTZXJ2aWNlIGpvYkxvZ1NlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Llrprml7bku7vliqHosIPluqbml6Xlv5fliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOmxpc3QnKSIpCisgICAgQEdldE1hcHBpbmcoIi9saXN0IikKKyAgICBwdWJsaWMgVGFibGVEYXRhSW5mbyBsaXN0KFN5c0pvYkxvZyBzeXNKb2JMb2cpCisgICAgeworICAgICAgICBzdGFydFBhZ2UoKTsKKyAgICAgICAgTGlzdDxTeXNKb2JMb2c+IGxpc3QgPSBqb2JMb2dTZXJ2aWNlLnNlbGVjdEpvYkxvZ0xpc3Qoc3lzSm9iTG9nKTsKKyAgICAgICAgcmV0dXJuIGdldERhdGFUYWJsZShsaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlr7zlh7rlrprml7bku7vliqHosIPluqbml6Xlv5fliJfooagKKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOmV4cG9ydCcpIikKKyAgICBATG9nKHRpdGxlID0gIuS7u+WKoeiwg+W6puaXpeW/lyIsIGJ1c2luZXNzVHlwZSA9IEJ1c2luZXNzVHlwZS5FWFBPUlQpCisgICAgQFBvc3RNYXBwaW5nKCIvZXhwb3J0IikKKyAgICBwdWJsaWMgdm9pZCBleHBvcnQoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3lzSm9iTG9nIHN5c0pvYkxvZykKKyAgICB7CisgICAgICAgIExpc3Q8U3lzSm9iTG9nPiBsaXN0ID0gam9iTG9nU2VydmljZS5zZWxlY3RKb2JMb2dMaXN0KHN5c0pvYkxvZyk7CisgICAgICAgIEV4Y2VsVXRpbDxTeXNKb2JMb2c+IHV0aWwgPSBuZXcgRXhjZWxVdGlsPFN5c0pvYkxvZz4oU3lzSm9iTG9nLmNsYXNzKTsKKyAgICAgICAgdXRpbC5leHBvcnRFeGNlbChyZXNwb25zZSwgbGlzdCwgIuiwg+W6puaXpeW/lyIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiDmoLnmja7osIPluqbnvJblj7fojrflj5bor6bnu4bkv6Hmga8KKyAgICAgKi8KKyAgICBAUHJlQXV0aG9yaXplKCJAc3MuaGFzUGVybWkoJ21vbml0b3I6am9iOnF1ZXJ5JykiKQorICAgIEBHZXRNYXBwaW5nKHZhbHVlID0gIi97am9iTG9nSWR9IikKKyAgICBwdWJsaWMgQWpheFJlc3VsdCBnZXRJbmZvKEBQYXRoVmFyaWFibGUgTG9uZyBqb2JMb2dJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWNjZXNzKGpvYkxvZ1NlcnZpY2Uuc2VsZWN0Sm9iTG9nQnlJZChqb2JMb2dJZCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICog5Yig6Zmk5a6a5pe25Lu75Yqh6LCD5bqm5pel5b+XCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmpvYjpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLlrprml7bku7vliqHosIPluqbml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuREVMRVRFKQorICAgIEBEZWxldGVNYXBwaW5nKCIve2pvYkxvZ0lkc30iKQorICAgIHB1YmxpYyBBamF4UmVzdWx0IHJlbW92ZShAUGF0aFZhcmlhYmxlIExvbmdbXSBqb2JMb2dJZHMpCisgICAgeworICAgICAgICByZXR1cm4gdG9BamF4KGpvYkxvZ1NlcnZpY2UuZGVsZXRlSm9iTG9nQnlJZHMoam9iTG9nSWRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5riF56m65a6a5pe25Lu75Yqh6LCD5bqm5pel5b+XCisgICAgICovCisgICAgQFByZUF1dGhvcml6ZSgiQHNzLmhhc1Blcm1pKCdtb25pdG9yOmpvYjpyZW1vdmUnKSIpCisgICAgQExvZyh0aXRsZSA9ICLosIPluqbml6Xlv5ciLCBidXNpbmVzc1R5cGUgPSBCdXNpbmVzc1R5cGUuQ0xFQU4pCisgICAgQERlbGV0ZU1hcHBpbmcoIi9jbGVhbiIpCisgICAgcHVibGljIEFqYXhSZXN1bHQgY2xlYW4oKQorICAgIHsKKyAgICAgICAgam9iTG9nU2VydmljZS5jbGVhbkpvYkxvZygpOworICAgICAgICByZXR1cm4gc3VjY2VzcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovZG9tYWluL1N5c0pvYi5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9kb21haW4vU3lzSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMTJkYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovZG9tYWluL1N5c0pvYi5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACitwYWNrYWdlIGNvbS5ydW95aS5xdWFydHouZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Gb3JtYXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuU2NoZWR1bGVDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei51dGlsLkNyb25VdGlsczsKKworLyoqCisgKiDlrprml7bku7vliqHosIPluqbooaggc3lzX2pvYgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNKb2IgZXh0ZW5kcyBCYXNlRW50aXR5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKiog5Lu75YqhSUQgKi8KKyAgICBARXhjZWwobmFtZSA9ICLku7vliqHluo/lj7ciLCBjZWxsVHlwZSA9IENvbHVtblR5cGUuTlVNRVJJQykKKyAgICBwcml2YXRlIExvbmcgam9iSWQ7CisKKyAgICAvKiog5Lu75Yqh5ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lu75Yqh5ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyBqb2JOYW1lOworCisgICAgLyoqIOS7u+WKoee7hOWQjSAqLworICAgIEBFeGNlbChuYW1lID0gIuS7u+WKoee7hOWQjSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgam9iR3JvdXA7CisKKyAgICAvKiog6LCD55So55uu5qCH5a2X56ym5LiyICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6LCD55So55uu5qCH5a2X56ym5LiyIikKKyAgICBwcml2YXRlIFN0cmluZyBpbnZva2VUYXJnZXQ7CisKKyAgICAvKiogY3JvbuaJp+ihjOihqOi+vuW8jyAqLworICAgIEBFeGNlbChuYW1lID0gIuaJp+ihjOihqOi+vuW8jyAiKQorICAgIHByaXZhdGUgU3RyaW5nIGNyb25FeHByZXNzaW9uOworCisgICAgLyoqIGNyb27orqHliJLnrZbnlaUgKi8KKyAgICBARXhjZWwobmFtZSA9ICLorqHliJLnrZbnlaUgIiwgcmVhZENvbnZlcnRlckV4cCA9ICIwPem7mOiupCwxPeeri+WNs+inpuWPkeaJp+ihjCwyPeinpuWPkeS4gOasoeaJp+ihjCwzPeS4jeinpuWPkeeri+WNs+aJp+ihjCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbWlzZmlyZVBvbGljeSA9IFNjaGVkdWxlQ29uc3RhbnRzLk1JU0ZJUkVfREVGQVVMVDsKKworICAgIC8qKiDmmK/lkKblubblj5HmiafooYzvvIgw5YWB6K64IDHnpoHmraLvvIkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLlubblj5HmiafooYwiLCByZWFkQ29udmVydGVyRXhwID0gIjA95YWB6K64LDE956aB5q2iIikKKyAgICBwcml2YXRlIFN0cmluZyBjb25jdXJyZW50OworCisgICAgLyoqIOS7u+WKoeeKtuaAge+8iDDmraPluLggMeaaguWBnO+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuS7u+WKoeeKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3mmoLlgZwiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIHB1YmxpYyBMb25nIGdldEpvYklkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqb2JJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JJZChMb25nIGpvYklkKQorICAgIHsKKyAgICAgICAgdGhpcy5qb2JJZCA9IGpvYklkOworICAgIH0KKworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuS7u+WKoeWQjeensOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gNjQsIG1lc3NhZ2UgPSAi5Lu75Yqh5ZCN56ew5LiN6IO96LaF6L+HNjTkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Sm9iTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gam9iTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JOYW1lKFN0cmluZyBqb2JOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5qb2JOYW1lID0gam9iTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpvYkdyb3VwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqb2JHcm91cDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2JHcm91cChTdHJpbmcgam9iR3JvdXApCisgICAgeworICAgICAgICB0aGlzLmpvYkdyb3VwID0gam9iR3JvdXA7CisgICAgfQorCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi6LCD55So55uu5qCH5a2X56ym5Liy5LiN6IO95Li656m6IikKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSA1MDAsIG1lc3NhZ2UgPSAi6LCD55So55uu5qCH5a2X56ym5Liy6ZW/5bqm5LiN6IO96LaF6L+HNTAw5Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEludm9rZVRhcmdldCgpCisgICAgeworICAgICAgICByZXR1cm4gaW52b2tlVGFyZ2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludm9rZVRhcmdldChTdHJpbmcgaW52b2tlVGFyZ2V0KQorICAgIHsKKyAgICAgICAgdGhpcy5pbnZva2VUYXJnZXQgPSBpbnZva2VUYXJnZXQ7CisgICAgfQorCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAiQ3JvbuaJp+ihjOihqOi+vuW8j+S4jeiDveS4uuepuiIpCisgICAgQFNpemUobWluID0gMCwgbWF4ID0gMjU1LCBtZXNzYWdlID0gIkNyb27miafooYzooajovr7lvI/kuI3og73otoXov4cyNTXkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JvbkV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyb25FeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENyb25FeHByZXNzaW9uKFN0cmluZyBjcm9uRXhwcmVzc2lvbikKKyAgICB7CisgICAgICAgIHRoaXMuY3JvbkV4cHJlc3Npb24gPSBjcm9uRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBASnNvbkZvcm1hdChwYXR0ZXJuID0gInl5eXktTU0tZGQgSEg6bW06c3MiKQorICAgIHB1YmxpYyBEYXRlIGdldE5leHRWYWxpZFRpbWUoKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoY3JvbkV4cHJlc3Npb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JvblV0aWxzLmdldE5leHRFeGVjdXRpb24oY3JvbkV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlzZmlyZVBvbGljeSgpCisgICAgeworICAgICAgICByZXR1cm4gbWlzZmlyZVBvbGljeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNaXNmaXJlUG9saWN5KFN0cmluZyBtaXNmaXJlUG9saWN5KQorICAgIHsKKyAgICAgICAgdGhpcy5taXNmaXJlUG9saWN5ID0gbWlzZmlyZVBvbGljeTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmN1cnJlbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmN1cnJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uY3VycmVudChTdHJpbmcgY29uY3VycmVudCkKKyAgICB7CisgICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgiam9iSWQiLCBnZXRKb2JJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiam9iTmFtZSIsIGdldEpvYk5hbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImpvYkdyb3VwIiwgZ2V0Sm9iR3JvdXAoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyb25FeHByZXNzaW9uIiwgZ2V0Q3JvbkV4cHJlc3Npb24oKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIm5leHRWYWxpZFRpbWUiLCBnZXROZXh0VmFsaWRUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJtaXNmaXJlUG9saWN5IiwgZ2V0TWlzZmlyZVBvbGljeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY29uY3VycmVudCIsIGdldENvbmN1cnJlbnQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXR1cyIsIGdldFN0YXR1cygpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovZG9tYWluL1N5c0pvYkxvZy5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9kb21haW4vU3lzSm9iTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxYzAzNQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovZG9tYWluL1N5c0pvYkxvZy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACitwYWNrYWdlIGNvbS5ydW95aS5xdWFydHouZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDlrprml7bku7vliqHosIPluqbml6Xlv5fooaggc3lzX2pvYl9sb2cKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzSm9iTG9nIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIElEICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5pel5b+X5bqP5Y+3IikKKyAgICBwcml2YXRlIExvbmcgam9iTG9nSWQ7CisKKyAgICAvKiog5Lu75Yqh5ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lu75Yqh5ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyBqb2JOYW1lOworCisgICAgLyoqIOS7u+WKoee7hOWQjSAqLworICAgIEBFeGNlbChuYW1lID0gIuS7u+WKoee7hOWQjSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgam9iR3JvdXA7CisKKyAgICAvKiog6LCD55So55uu5qCH5a2X56ym5LiyICovCisgICAgQEV4Y2VsKG5hbWUgPSAi6LCD55So55uu5qCH5a2X56ym5LiyIikKKyAgICBwcml2YXRlIFN0cmluZyBpbnZva2VUYXJnZXQ7CisKKyAgICAvKiog5pel5b+X5L+h5oGvICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5pel5b+X5L+h5oGvIikKKyAgICBwcml2YXRlIFN0cmluZyBqb2JNZXNzYWdlOworCisgICAgLyoqIOaJp+ihjOeKtuaAge+8iDDmraPluLggMeWksei0pe+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuaJp+ihjOeKtuaAgSIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3mraPluLgsMT3lpLHotKUiKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworICAgIC8qKiDlvILluLjkv6Hmga8gKi8KKyAgICBARXhjZWwobmFtZSA9ICLlvILluLjkv6Hmga8iKQorICAgIHByaXZhdGUgU3RyaW5nIGV4Y2VwdGlvbkluZm87CisKKyAgICAvKiog5byA5aeL5pe26Ze0ICovCisgICAgcHJpdmF0ZSBEYXRlIHN0YXJ0VGltZTsKKworICAgIC8qKiDlgZzmraLml7bpl7QgKi8KKyAgICBwcml2YXRlIERhdGUgc3RvcFRpbWU7CisKKyAgICBwdWJsaWMgTG9uZyBnZXRKb2JMb2dJZCgpCisgICAgeworICAgICAgICByZXR1cm4gam9iTG9nSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9iTG9nSWQoTG9uZyBqb2JMb2dJZCkKKyAgICB7CisgICAgICAgIHRoaXMuam9iTG9nSWQgPSBqb2JMb2dJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpvYk5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGpvYk5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9iTmFtZShTdHJpbmcgam9iTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuam9iTmFtZSA9IGpvYk5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKb2JHcm91cCgpCisgICAgeworICAgICAgICByZXR1cm4gam9iR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9iR3JvdXAoU3RyaW5nIGpvYkdyb3VwKQorICAgIHsKKyAgICAgICAgdGhpcy5qb2JHcm91cCA9IGpvYkdyb3VwOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW52b2tlVGFyZ2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnZva2VUYXJnZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW52b2tlVGFyZ2V0KFN0cmluZyBpbnZva2VUYXJnZXQpCisgICAgeworICAgICAgICB0aGlzLmludm9rZVRhcmdldCA9IGludm9rZVRhcmdldDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpvYk1lc3NhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGpvYk1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9iTWVzc2FnZShTdHJpbmcgam9iTWVzc2FnZSkKKyAgICB7CisgICAgICAgIHRoaXMuam9iTWVzc2FnZSA9IGpvYk1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uSW5mbygpCisgICAgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25JbmZvKFN0cmluZyBleGNlcHRpb25JbmZvKQorICAgIHsKKyAgICAgICAgdGhpcy5leGNlcHRpb25JbmZvID0gZXhjZXB0aW9uSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBnZXRTdGFydFRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUoRGF0ZSBzdGFydFRpbWUpCisgICAgeworICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhdGUgZ2V0U3RvcFRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0b3BUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0b3BUaW1lKERhdGUgc3RvcFRpbWUpCisgICAgeworICAgICAgICB0aGlzLnN0b3BUaW1lID0gc3RvcFRpbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJqb2JMb2dJZCIsIGdldEpvYkxvZ0lkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJqb2JOYW1lIiwgZ2V0Sm9iTmFtZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiam9iR3JvdXAiLCBnZXRKb2JHcm91cCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiam9iTWVzc2FnZSIsIGdldEpvYk1lc3NhZ2UoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXR1cyIsIGdldFN0YXR1cygpKQorICAgICAgICAgICAgLmFwcGVuZCgiZXhjZXB0aW9uSW5mbyIsIGdldEV4Y2VwdGlvbkluZm8oKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXJ0VGltZSIsIGdldFN0YXJ0VGltZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgic3RvcFRpbWUiLCBnZXRTdG9wVGltZSgpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9tYXBwZXIvU3lzSm9iTG9nTWFwcGVyLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L21hcHBlci9TeXNKb2JMb2dNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdkOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9tYXBwZXIvU3lzSm9iTG9nTWFwcGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBjb20ucnVveWkucXVhcnR6Lm1hcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5xdWFydHouZG9tYWluLlN5c0pvYkxvZzsKKworLyoqCisgKiDosIPluqbku7vliqHml6Xlv5fkv6Hmga8g5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBTeXNKb2JMb2dNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDojrflj5ZxdWFydHrosIPluqblmajml6Xlv5fnmoTorqHliJLku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iTG9nIOiwg+W6puaXpeW/l+S/oeaBrworICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh5pel5b+X6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzSm9iTG9nPiBzZWxlY3RKb2JMb2dMaXN0KFN5c0pvYkxvZyBqb2JMb2cpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5omA5pyJ6LCD5bqm5Lu75Yqh5pel5b+XCisgICAgICoKKyAgICAgKiBAcmV0dXJuIOiwg+W6puS7u+WKoeaXpeW/l+WIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0pvYkxvZz4gc2VsZWN0Sm9iTG9nQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fosIPluqbku7vliqHml6Xlv5dJROafpeivouiwg+W6puS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JMb2dJZCDosIPluqbku7vliqHml6Xlv5dJRAorICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh5pel5b+X5a+56LGh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c0pvYkxvZyBzZWxlY3RKb2JMb2dCeUlkKExvbmcgam9iTG9nSWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe5Lu75Yqh5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIGpvYkxvZyDosIPluqbml6Xlv5fkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0Sm9iTG9nKFN5c0pvYkxvZyBqb2JMb2cpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6LCD5bqm5pel5b+X5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGxvZ0lkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVKb2JMb2dCeUlkcyhMb25nW10gbG9nSWRzKTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JJZCDosIPluqbml6Xlv5dJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVKb2JMb2dCeUlkKExvbmcgam9iSWQpOworCisgICAgLyoqCisgICAgICog5riF56m65Lu75Yqh5pel5b+XCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW5Kb2JMb2coKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovbWFwcGVyL1N5c0pvYk1hcHBlci5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9tYXBwZXIvU3lzSm9iTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmNDVkYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovbWFwcGVyL1N5c0pvYk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CisKKy8qKgorICog6LCD5bqm5Lu75Yqh5L+h5oGvIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzSm9iTWFwcGVyCit7CisgICAgLyoqCisgICAgICog5p+l6K+i6LCD5bqm5Lu75Yqh5pel5b+X6ZuG5ZCICisgICAgICogCisgICAgICogQHBhcmFtIGpvYiDosIPluqbkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOaTjeS9nOaXpeW/l+mbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0pvYj4gc2VsZWN0Sm9iTGlzdChTeXNKb2Igam9iKTsKKworICAgIC8qKgorICAgICAqIOafpeivouaJgOacieiwg+W6puS7u+WKoQorICAgICAqIAorICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzSm9iPiBzZWxlY3RKb2JBbGwoKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+iwg+W6pklE5p+l6K+i6LCD5bqm5Lu75Yqh5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGpvYklkIOiwg+W6pklECisgICAgICogQHJldHVybiDop5LoibLlr7nosaHkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzSm9iIHNlbGVjdEpvYkJ5SWQoTG9uZyBqb2JJZCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fosIPluqZJROWIoOmZpOiwg+W6puS7u+WKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JJZCDosIPluqZJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVKb2JCeUlkKExvbmcgam9iSWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6LCD5bqm5Lu75Yqh5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGlkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVKb2JCeUlkcyhMb25nW10gaWRzKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueiwg+W6puS7u+WKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5Lu75Yqh5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZUpvYihTeXNKb2Igam9iKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuiwg+W6puS7u+WKoeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5Lu75Yqh5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydEpvYihTeXNKb2Igam9iKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovc2VydmljZS9JU3lzSm9iTG9nU2VydmljZS5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9zZXJ2aWNlL0lTeXNKb2JMb2dTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0Njc5MgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovc2VydmljZS9JU3lzSm9iTG9nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5kb21haW4uU3lzSm9iTG9nOworCisvKioKKyAqIOWumuaXtuS7u+WKoeiwg+W6puaXpeW/l+S/oeaBr+S/oeaBryDmnI3liqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNKb2JMb2dTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog6I635Y+WcXVhcnR66LCD5bqm5Zmo5pel5b+X55qE6K6h5YiS5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIGpvYkxvZyDosIPluqbml6Xlv5fkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOiwg+W6puS7u+WKoeaXpeW/l+mbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0pvYkxvZz4gc2VsZWN0Sm9iTG9nTGlzdChTeXNKb2JMb2cgam9iTG9nKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+iwg+W6puS7u+WKoeaXpeW/l0lE5p+l6K+i6LCD5bqm5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGpvYkxvZ0lkIOiwg+W6puS7u+WKoeaXpeW/l0lECisgICAgICogQHJldHVybiDosIPluqbku7vliqHml6Xlv5flr7nosaHkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzSm9iTG9nIHNlbGVjdEpvYkxvZ0J5SWQoTG9uZyBqb2JMb2dJZCk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7ku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iTG9nIOiwg+W6puaXpeW/l+S/oeaBrworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEpvYkxvZyhTeXNKb2JMb2cgam9iTG9nKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOiwg+W6puaXpeW/l+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBsb2dJZHMg6ZyA6KaB5Yig6Zmk55qE5pel5b+XSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlSm9iTG9nQnlJZHMoTG9uZ1tdIGxvZ0lkcyk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTku7vliqHml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iSWQg6LCD5bqm5pel5b+XSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlSm9iTG9nQnlJZChMb25nIGpvYklkKTsKKworICAgIC8qKgorICAgICAqIOa4heepuuS7u+WKoeaXpeW/lworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFuSm9iTG9nKCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3NlcnZpY2UvSVN5c0pvYlNlcnZpY2UuamF2YSBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovc2VydmljZS9JU3lzSm9iU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzN2FkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3NlcnZpY2UvSVN5c0pvYlNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBjb20ucnVveWkucXVhcnR6LnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5qb2IuVGFza0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CisKKy8qKgorICog5a6a5pe25Lu75Yqh6LCD5bqm5L+h5oGv5L+h5oGvIOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN5c0pvYlNlcnZpY2UKK3sKKyAgICAvKioKKyAgICAgKiDojrflj5ZxdWFydHrosIPluqblmajnmoTorqHliJLku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzSm9iPiBzZWxlY3RKb2JMaXN0KFN5c0pvYiBqb2IpOworCisgICAgLyoqCisgICAgICog6YCa6L+H6LCD5bqm5Lu75YqhSUTmn6Xor6LosIPluqbkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iSWQg6LCD5bqm5Lu75YqhSUQKKyAgICAgKiBAcmV0dXJuIOiwg+W6puS7u+WKoeWvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNKb2Igc2VsZWN0Sm9iQnlJZChMb25nIGpvYklkKTsKKworICAgIC8qKgorICAgICAqIOaaguWBnOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHBhdXNlSm9iKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiDmgaLlpI3ku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCByZXN1bWVKb2IoU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoeWQju+8jOaJgOWvueW6lOeahHRyaWdnZXLkuZ/lsIbooqvliKDpmaQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVKb2IoU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOiwg+W6puS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JJZHMg6ZyA6KaB5Yig6Zmk55qE5Lu75YqhSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUpvYkJ5SWRzKExvbmdbXSBqb2JJZHMpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiDku7vliqHosIPluqbnirbmgIHkv67mlLkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBjaGFuZ2VTdGF0dXMoU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIOeri+WNs+i/kOihjOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBydW4oU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydEpvYihTeXNKb2Igam9iKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uLCBUYXNrRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICog5pu05paw5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIGpvYiDosIPluqbkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlSm9iKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFRhc2tFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiDmoKHpqoxjcm9u6KGo6L6+5byP5piv5ZCm5pyJ5pWICisgICAgICogCisgICAgICogQHBhcmFtIGNyb25FeHByZXNzaW9uIOihqOi+vuW8jworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tDcm9uRXhwcmVzc2lvbklzVmFsaWQoU3RyaW5nIGNyb25FeHByZXNzaW9uKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovc2VydmljZS9pbXBsL1N5c0pvYkxvZ1NlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3NlcnZpY2UvaW1wbC9TeXNKb2JMb2dTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmVlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3NlcnZpY2UvaW1wbC9TeXNKb2JMb2dTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5kb21haW4uU3lzSm9iTG9nOworaW1wb3J0IGNvbS5ydW95aS5xdWFydHoubWFwcGVyLlN5c0pvYkxvZ01hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LnNlcnZpY2UuSVN5c0pvYkxvZ1NlcnZpY2U7CisKKy8qKgorICog5a6a5pe25Lu75Yqh6LCD5bqm5pel5b+X5L+h5oGvIOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzSm9iTG9nU2VydmljZUltcGwgaW1wbGVtZW50cyBJU3lzSm9iTG9nU2VydmljZQoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c0pvYkxvZ01hcHBlciBqb2JMb2dNYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZxdWFydHrosIPluqblmajml6Xlv5fnmoTorqHliJLku7vliqEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iTG9nIOiwg+W6puaXpeW/l+S/oeaBrworICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh5pel5b+X6ZuG5ZCICisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzSm9iTG9nPiBzZWxlY3RKb2JMb2dMaXN0KFN5c0pvYkxvZyBqb2JMb2cpCisgICAgeworICAgICAgICByZXR1cm4gam9iTG9nTWFwcGVyLnNlbGVjdEpvYkxvZ0xpc3Qoam9iTG9nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fosIPluqbku7vliqHml6Xlv5dJROafpeivouiwg+W6puS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JMb2dJZCDosIPluqbku7vliqHml6Xlv5dJRAorICAgICAqIEByZXR1cm4g6LCD5bqm5Lu75Yqh5pel5b+X5a+56LGh5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c0pvYkxvZyBzZWxlY3RKb2JMb2dCeUlkKExvbmcgam9iTG9nSWQpCisgICAgeworICAgICAgICByZXR1cm4gam9iTG9nTWFwcGVyLnNlbGVjdEpvYkxvZ0J5SWQoam9iTG9nSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JMb2cg6LCD5bqm5pel5b+X5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkSm9iTG9nKFN5c0pvYkxvZyBqb2JMb2cpCisgICAgeworICAgICAgICBqb2JMb2dNYXBwZXIuaW5zZXJ0Sm9iTG9nKGpvYkxvZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6LCD5bqm5pel5b+X5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGxvZ0lkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVKb2JMb2dCeUlkcyhMb25nW10gbG9nSWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGpvYkxvZ01hcHBlci5kZWxldGVKb2JMb2dCeUlkcyhsb2dJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOS7u+WKoeaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBqb2JJZCDosIPluqbml6Xlv5dJRAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlSm9iTG9nQnlJZChMb25nIGpvYklkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGpvYkxvZ01hcHBlci5kZWxldGVKb2JMb2dCeUlkKGpvYklkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmuIXnqbrku7vliqHml6Xlv5cKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhbkpvYkxvZygpCisgICAgeworICAgICAgICBqb2JMb2dNYXBwZXIuY2xlYW5Kb2JMb2coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3NlcnZpY2UvaW1wbC9TeXNKb2JTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9zZXJ2aWNlL2ltcGwvU3lzSm9iU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGViZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei9zZXJ2aWNlL2ltcGwvU3lzSm9iU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorcGFja2FnZSBjb20ucnVveWkucXVhcnR6LnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGpha2FydGEuYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IG9yZy5xdWFydHouSm9iRGF0YU1hcDsKK2ltcG9ydCBvcmcucXVhcnR6LkpvYktleTsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5hbm5vdGF0aW9uLlRyYW5zYWN0aW9uYWw7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5TY2hlZHVsZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5qb2IuVGFza0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5tYXBwZXIuU3lzSm9iTWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5xdWFydHouc2VydmljZS5JU3lzSm9iU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LnV0aWwuQ3JvblV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5xdWFydHoudXRpbC5TY2hlZHVsZVV0aWxzOworCisvKioKKyAqIOWumuaXtuS7u+WKoeiwg+W6puS/oeaBryDmnI3liqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c0pvYlNlcnZpY2VJbXBsIGltcGxlbWVudHMgSVN5c0pvYlNlcnZpY2UKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTY2hlZHVsZXIgc2NoZWR1bGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzSm9iTWFwcGVyIGpvYk1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOmhueebruWQr+WKqOaXtu+8jOWIneWni+WMluWumuaXtuWZqCDkuLvopoHmmK/pmLLmraLmiYvliqjkv67mlLnmlbDmja7lupPlr7zoh7TmnKrlkIzmraXliLDlrprml7bku7vliqHlpITnkIbvvIjms6jvvJrkuI3og73miYvliqjkv67mlLnmlbDmja7lupNJROWSjOS7u+WKoee7hOWQje+8jOWQpuWImeS8muWvvOiHtOiEj+aVsOaNru+8iQorICAgICAqLworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFRhc2tFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNjaGVkdWxlci5jbGVhcigpOworICAgICAgICBMaXN0PFN5c0pvYj4gam9iTGlzdCA9IGpvYk1hcHBlci5zZWxlY3RKb2JBbGwoKTsKKyAgICAgICAgZm9yIChTeXNKb2Igam9iIDogam9iTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZWR1bGVVdGlscy5jcmVhdGVTY2hlZHVsZUpvYihzY2hlZHVsZXIsIGpvYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZxdWFydHrosIPluqblmajnmoTorqHliJLku7vliqHliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTeXNKb2I+IHNlbGVjdEpvYkxpc3QoU3lzSm9iIGpvYikKKyAgICB7CisgICAgICAgIHJldHVybiBqb2JNYXBwZXIuc2VsZWN0Sm9iTGlzdChqb2IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmui/h+iwg+W6puS7u+WKoUlE5p+l6K+i6LCD5bqm5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGpvYklkIOiwg+W6puS7u+WKoUlECisgICAgICogQHJldHVybiDosIPluqbku7vliqHlr7nosaHkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3lzSm9iIHNlbGVjdEpvYkJ5SWQoTG9uZyBqb2JJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBqb2JNYXBwZXIuc2VsZWN0Sm9iQnlJZChqb2JJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5pqC5YGc5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIGpvYiDosIPluqbkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbChyb2xsYmFja0ZvciA9IEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgaW50IHBhdXNlSm9iKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIExvbmcgam9iSWQgPSBqb2IuZ2V0Sm9iSWQoKTsKKyAgICAgICAgU3RyaW5nIGpvYkdyb3VwID0gam9iLmdldEpvYkdyb3VwKCk7CisgICAgICAgIGpvYi5zZXRTdGF0dXMoU2NoZWR1bGVDb25zdGFudHMuU3RhdHVzLlBBVVNFLmdldFZhbHVlKCkpOworICAgICAgICBpbnQgcm93cyA9IGpvYk1hcHBlci51cGRhdGVKb2Ioam9iKTsKKyAgICAgICAgaWYgKHJvd3MgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzY2hlZHVsZXIucGF1c2VKb2IoU2NoZWR1bGVVdGlscy5nZXRKb2JLZXkoam9iSWQsIGpvYkdyb3VwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCisgICAgLyoqCisgICAgICog5oGi5aSN5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIGpvYiDosIPluqbkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbChyb2xsYmFja0ZvciA9IEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgaW50IHJlc3VtZUpvYihTeXNKb2Igam9iKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBMb25nIGpvYklkID0gam9iLmdldEpvYklkKCk7CisgICAgICAgIFN0cmluZyBqb2JHcm91cCA9IGpvYi5nZXRKb2JHcm91cCgpOworICAgICAgICBqb2Iuc2V0U3RhdHVzKFNjaGVkdWxlQ29uc3RhbnRzLlN0YXR1cy5OT1JNQUwuZ2V0VmFsdWUoKSk7CisgICAgICAgIGludCByb3dzID0gam9iTWFwcGVyLnVwZGF0ZUpvYihqb2IpOworICAgICAgICBpZiAocm93cyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaGVkdWxlci5yZXN1bWVKb2IoU2NoZWR1bGVVdGlscy5nZXRKb2JLZXkoam9iSWQsIGpvYkdyb3VwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk5Lu75Yqh5ZCO77yM5omA5a+55bqU55qEdHJpZ2dlcuS5n+Wwhuiiq+WIoOmZpAorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwocm9sbGJhY2tGb3IgPSBFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIGludCBkZWxldGVKb2IoU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTG9uZyBqb2JJZCA9IGpvYi5nZXRKb2JJZCgpOworICAgICAgICBTdHJpbmcgam9iR3JvdXAgPSBqb2IuZ2V0Sm9iR3JvdXAoKTsKKyAgICAgICAgaW50IHJvd3MgPSBqb2JNYXBwZXIuZGVsZXRlSm9iQnlJZChqb2JJZCk7CisgICAgICAgIGlmIChyb3dzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2NoZWR1bGVyLmRlbGV0ZUpvYihTY2hlZHVsZVV0aWxzLmdldEpvYktleShqb2JJZCwgam9iR3JvdXApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTosIPluqbkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iSWRzIOmcgOimgeWIoOmZpOeahOS7u+WKoUlECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbChyb2xsYmFja0ZvciA9IEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVKb2JCeUlkcyhMb25nW10gam9iSWRzKSB0aHJvd3MgU2NoZWR1bGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKExvbmcgam9iSWQgOiBqb2JJZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c0pvYiBqb2IgPSBqb2JNYXBwZXIuc2VsZWN0Sm9iQnlJZChqb2JJZCk7CisgICAgICAgICAgICBkZWxldGVKb2Ioam9iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOS7u+WKoeiwg+W6pueKtuaAgeS/ruaUuQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwocm9sbGJhY2tGb3IgPSBFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIGludCBjaGFuZ2VTdGF0dXMoU3lzSm9iIGpvYikgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHJvd3MgPSAwOworICAgICAgICBTdHJpbmcgc3RhdHVzID0gam9iLmdldFN0YXR1cygpOworICAgICAgICBpZiAoU2NoZWR1bGVDb25zdGFudHMuU3RhdHVzLk5PUk1BTC5nZXRWYWx1ZSgpLmVxdWFscyhzdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICByb3dzID0gcmVzdW1lSm9iKGpvYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoU2NoZWR1bGVDb25zdGFudHMuU3RhdHVzLlBBVVNFLmdldFZhbHVlKCkuZXF1YWxzKHN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvd3MgPSBwYXVzZUpvYihqb2IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb3dzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOeri+WNs+i/kOihjOS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwocm9sbGJhY2tGb3IgPSBFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIGJvb2xlYW4gcnVuKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIExvbmcgam9iSWQgPSBqb2IuZ2V0Sm9iSWQoKTsKKyAgICAgICAgU3RyaW5nIGpvYkdyb3VwID0gam9iLmdldEpvYkdyb3VwKCk7CisgICAgICAgIFN5c0pvYiBwcm9wZXJ0aWVzID0gc2VsZWN0Sm9iQnlJZChqb2IuZ2V0Sm9iSWQoKSk7CisgICAgICAgIC8vIOWPguaVsAorICAgICAgICBKb2JEYXRhTWFwIGRhdGFNYXAgPSBuZXcgSm9iRGF0YU1hcCgpOworICAgICAgICBkYXRhTWFwLnB1dChTY2hlZHVsZUNvbnN0YW50cy5UQVNLX1BST1BFUlRJRVMsIHByb3BlcnRpZXMpOworICAgICAgICBKb2JLZXkgam9iS2V5ID0gU2NoZWR1bGVVdGlscy5nZXRKb2JLZXkoam9iSWQsIGpvYkdyb3VwKTsKKyAgICAgICAgaWYgKHNjaGVkdWxlci5jaGVja0V4aXN0cyhqb2JLZXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgc2NoZWR1bGVyLnRyaWdnZXJKb2Ioam9iS2V5LCBkYXRhTWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS7u+WKoQorICAgICAqIAorICAgICAqIEBwYXJhbSBqb2Ig6LCD5bqm5L+h5oGvIOiwg+W6puS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsKHJvbGxiYWNrRm9yID0gRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0Sm9iKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFRhc2tFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGpvYi5zZXRTdGF0dXMoU2NoZWR1bGVDb25zdGFudHMuU3RhdHVzLlBBVVNFLmdldFZhbHVlKCkpOworICAgICAgICBpbnQgcm93cyA9IGpvYk1hcHBlci5pbnNlcnRKb2Ioam9iKTsKKyAgICAgICAgaWYgKHJvd3MgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlZHVsZVV0aWxzLmNyZWF0ZVNjaGVkdWxlSm9iKHNjaGVkdWxlciwgam9iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmm7TmlrDku7vliqHnmoTml7bpl7Tooajovr7lvI8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gam9iIOiwg+W6puS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsKHJvbGxiYWNrRm9yID0gRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyBpbnQgdXBkYXRlSm9iKFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFRhc2tFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN5c0pvYiBwcm9wZXJ0aWVzID0gc2VsZWN0Sm9iQnlJZChqb2IuZ2V0Sm9iSWQoKSk7CisgICAgICAgIGludCByb3dzID0gam9iTWFwcGVyLnVwZGF0ZUpvYihqb2IpOworICAgICAgICBpZiAocm93cyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwZGF0ZVNjaGVkdWxlckpvYihqb2IsIHByb3BlcnRpZXMuZ2V0Sm9iR3JvdXAoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCisgICAgLyoqCisgICAgICog5pu05paw5Lu75YqhCisgICAgICogCisgICAgICogQHBhcmFtIGpvYiDku7vliqHlr7nosaEKKyAgICAgKiBAcGFyYW0gam9iR3JvdXAg5Lu75Yqh57uE5ZCNCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlU2NoZWR1bGVySm9iKFN5c0pvYiBqb2IsIFN0cmluZyBqb2JHcm91cCkgdGhyb3dzIFNjaGVkdWxlckV4Y2VwdGlvbiwgVGFza0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTG9uZyBqb2JJZCA9IGpvYi5nZXRKb2JJZCgpOworICAgICAgICAvLyDliKTmlq3mmK/lkKblrZjlnKgKKyAgICAgICAgSm9iS2V5IGpvYktleSA9IFNjaGVkdWxlVXRpbHMuZ2V0Sm9iS2V5KGpvYklkLCBqb2JHcm91cCk7CisgICAgICAgIGlmIChzY2hlZHVsZXIuY2hlY2tFeGlzdHMoam9iS2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g6Ziy5q2i5Yib5bu65pe25a2Y5Zyo5pWw5o2u6Zeu6aKYIOWFiOenu+mZpO+8jOeEtuWQjuWcqOaJp+ihjOWIm+W7uuaTjeS9nAorICAgICAgICAgICAgc2NoZWR1bGVyLmRlbGV0ZUpvYihqb2JLZXkpOworICAgICAgICB9CisgICAgICAgIFNjaGVkdWxlVXRpbHMuY3JlYXRlU2NoZWR1bGVKb2Ioc2NoZWR1bGVyLCBqb2IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjGNyb27ooajovr7lvI/mmK/lkKbmnInmlYgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3JvbkV4cHJlc3Npb24g6KGo6L6+5byPCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0Nyb25FeHByZXNzaW9uSXNWYWxpZChTdHJpbmcgY3JvbkV4cHJlc3Npb24pCisgICAgeworICAgICAgICByZXR1cm4gQ3JvblV0aWxzLmlzVmFsaWQoY3JvbkV4cHJlc3Npb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdGFzay9SeVRhc2suamF2YSBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdGFzay9SeVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMyNDNiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei90YXNrL1J5VGFzay5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei50YXNrOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOWumuaXtuS7u+WKoeiwg+W6pua1i+ivlQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BDb21wb25lbnQoInJ5VGFzayIpCitwdWJsaWMgY2xhc3MgUnlUYXNrCit7CisgICAgcHVibGljIHZvaWQgcnlNdWx0aXBsZVBhcmFtcyhTdHJpbmcgcywgQm9vbGVhbiBiLCBMb25nIGwsIERvdWJsZSBkLCBJbnRlZ2VyIGkpCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nVXRpbHMuZm9ybWF0KCLmiafooYzlpJrlj4Lmlrnms5XvvJog5a2X56ym5Liy57G75Z6Le33vvIzluIPlsJTnsbvlnot7fe+8jOmVv+aVtOWei3t977yM5rWu54K55Z6Le33vvIzmlbTlvaJ7fSIsIHMsIGIsIGwsIGQsIGkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByeVBhcmFtcyhTdHJpbmcgcGFyYW1zKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLmiafooYzmnInlj4Lmlrnms5XvvJoiICsgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByeU5vUGFyYW1zKCkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi5omn6KGM5peg5Y+C5pa55rOVIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL0Fic3RyYWN0UXVhcnR6Sm9iLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvQWJzdHJhY3RRdWFydHpKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzFhNWViCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL0Fic3RyYWN0UXVhcnR6Sm9iLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgb3JnLnF1YXJ0ei5Kb2I7CitpbXBvcnQgb3JnLnF1YXJ0ei5Kb2JFeGVjdXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5xdWFydHouSm9iRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5TY2hlZHVsZUNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLkV4Y2VwdGlvblV0aWw7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmJlYW4uQmVhblV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuc3ByaW5nLlNwcmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5xdWFydHouZG9tYWluLlN5c0pvYjsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2JMb2c7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5zZXJ2aWNlLklTeXNKb2JMb2dTZXJ2aWNlOworCisvKioKKyAqIOaKveixoXF1YXJ0euiwg+eUqAorICoKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVhcnR6Sm9iIGltcGxlbWVudHMgSm9iCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0UXVhcnR6Sm9iLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIOe6v+eoi+acrOWcsOWPmOmHjworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPERhdGU+IHRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSm9iRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBTeXNKb2Igc3lzSm9iID0gbmV3IFN5c0pvYigpOworICAgICAgICBCZWFuVXRpbHMuY29weUJlYW5Qcm9wKHN5c0pvYiwgY29udGV4dC5nZXRNZXJnZWRKb2JEYXRhTWFwKCkuZ2V0KFNjaGVkdWxlQ29uc3RhbnRzLlRBU0tfUFJPUEVSVElFUykpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYmVmb3JlKGNvbnRleHQsIHN5c0pvYik7CisgICAgICAgICAgICBpZiAoc3lzSm9iICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9FeGVjdXRlKGNvbnRleHQsIHN5c0pvYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZnRlcihjb250ZXh0LCBzeXNKb2IsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmVycm9yKCLku7vliqHmiafooYzlvILluLggIC0g77yaIiwgZSk7CisgICAgICAgICAgICBhZnRlcihjb250ZXh0LCBzeXNKb2IsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5omn6KGM5YmNCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCDlt6XkvZzmiafooYzkuIrkuIvmloflr7nosaEKKyAgICAgKiBAcGFyYW0gc3lzSm9iIOezu+e7n+iuoeWIkuS7u+WKoQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZShKb2JFeGVjdXRpb25Db250ZXh0IGNvbnRleHQsIFN5c0pvYiBzeXNKb2IpCisgICAgeworICAgICAgICB0aHJlYWRMb2NhbC5zZXQobmV3IERhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5omn6KGM5ZCOCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCDlt6XkvZzmiafooYzkuIrkuIvmloflr7nosaEKKyAgICAgKiBAcGFyYW0gc3lzSm9iIOezu+e7n+iuoeWIkuS7u+WKoQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyKEpvYkV4ZWN1dGlvbkNvbnRleHQgY29udGV4dCwgU3lzSm9iIHN5c0pvYiwgRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgICBEYXRlIHN0YXJ0VGltZSA9IHRocmVhZExvY2FsLmdldCgpOworICAgICAgICB0aHJlYWRMb2NhbC5yZW1vdmUoKTsKKworICAgICAgICBmaW5hbCBTeXNKb2JMb2cgc3lzSm9iTG9nID0gbmV3IFN5c0pvYkxvZygpOworICAgICAgICBzeXNKb2JMb2cuc2V0Sm9iTmFtZShzeXNKb2IuZ2V0Sm9iTmFtZSgpKTsKKyAgICAgICAgc3lzSm9iTG9nLnNldEpvYkdyb3VwKHN5c0pvYi5nZXRKb2JHcm91cCgpKTsKKyAgICAgICAgc3lzSm9iTG9nLnNldEludm9rZVRhcmdldChzeXNKb2IuZ2V0SW52b2tlVGFyZ2V0KCkpOworICAgICAgICBzeXNKb2JMb2cuc2V0U3RhcnRUaW1lKHN0YXJ0VGltZSk7CisgICAgICAgIHN5c0pvYkxvZy5zZXRTdG9wVGltZShuZXcgRGF0ZSgpKTsKKyAgICAgICAgbG9uZyBydW5NcyA9IHN5c0pvYkxvZy5nZXRTdG9wVGltZSgpLmdldFRpbWUoKSAtIHN5c0pvYkxvZy5nZXRTdGFydFRpbWUoKS5nZXRUaW1lKCk7CisgICAgICAgIHN5c0pvYkxvZy5zZXRKb2JNZXNzYWdlKHN5c0pvYkxvZy5nZXRKb2JOYW1lKCkgKyAiIOaAu+WFseiAl+aXtu+8miIgKyBydW5NcyArICLmr6vnp5IiKTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3lzSm9iTG9nLnNldFN0YXR1cyhDb25zdGFudHMuRkFJTCk7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSBTdHJpbmdVdGlscy5zdWJzdHJpbmcoRXhjZXB0aW9uVXRpbC5nZXRFeGNlcHRpb25NZXNzYWdlKGUpLCAwLCAyMDAwKTsKKyAgICAgICAgICAgIHN5c0pvYkxvZy5zZXRFeGNlcHRpb25JbmZvKGVycm9yTXNnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c0pvYkxvZy5zZXRTdGF0dXMoQ29uc3RhbnRzLlNVQ0NFU1MpOworICAgICAgICB9CisKKyAgICAgICAgLy8g5YaZ5YWl5pWw5o2u5bqT5b2T5LitCisgICAgICAgIFNwcmluZ1V0aWxzLmdldEJlYW4oSVN5c0pvYkxvZ1NlcnZpY2UuY2xhc3MpLmFkZEpvYkxvZyhzeXNKb2JMb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJp+ihjOaWueazle+8jOeUseWtkOexu+mHjei9vQorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQg5bel5L2c5omn6KGM5LiK5LiL5paH5a+56LGhCisgICAgICogQHBhcmFtIHN5c0pvYiDns7vnu5/orqHliJLku7vliqEKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiDmiafooYzov4fnqIvkuK3nmoTlvILluLgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoSm9iRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0LCBTeXNKb2Igc3lzSm9iKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL0Nyb25VdGlscy5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL0Nyb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNTM4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvQ3JvblV0aWxzLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb20ucnVveWkucXVhcnR6LnV0aWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgb3JnLnF1YXJ0ei5Dcm9uRXhwcmVzc2lvbjsKKworLyoqCisgKiBjcm9u6KGo6L6+5byP5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDcm9uVXRpbHMKK3sKKyAgICAvKioKKyAgICAgKiDov5Tlm57kuIDkuKrluIPlsJTlgLzku6PooajkuIDkuKrnu5nlrprnmoRDcm9u6KGo6L6+5byP55qE5pyJ5pWI5oCnCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JvbkV4cHJlc3Npb24gQ3JvbuihqOi+vuW8jworICAgICAqIEByZXR1cm4gYm9vbGVhbiDooajovr7lvI/mmK/lkKbmnInmlYgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgY3JvbkV4cHJlc3Npb24pCisgICAgeworICAgICAgICByZXR1cm4gQ3JvbkV4cHJlc3Npb24uaXNWYWxpZEV4cHJlc3Npb24oY3JvbkV4cHJlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIOi/lOWbnuS4gOS4quWtl+espuS4suWAvCzooajnpLror6Xmtojmga/ml6DmlYhDcm9u6KGo6L6+5byP57uZ5Ye65pyJ5pWI5oCnCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JvbkV4cHJlc3Npb24gQ3JvbuihqOi+vuW8jworICAgICAqIEByZXR1cm4gU3RyaW5nIOaXoOaViOaXtui/lOWbnuihqOi+vuW8j+mUmeivr+aPj+i/sCzlpoLmnpzmnInmlYjov5Tlm55udWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW52YWxpZE1lc3NhZ2UoU3RyaW5nIGNyb25FeHByZXNzaW9uKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBDcm9uRXhwcmVzc2lvbihjcm9uRXhwcmVzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwZS5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDov5Tlm57kuIvkuIDkuKrmiafooYzml7bpl7TmoLnmja7nu5nlrprnmoRDcm9u6KGo6L6+5byPCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JvbkV4cHJlc3Npb24gQ3JvbuihqOi+vuW8jworICAgICAqIEByZXR1cm4gRGF0ZSDkuIvmrKFDcm9u6KGo6L6+5byP5omn6KGM5pe26Ze0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRlIGdldE5leHRFeGVjdXRpb24oU3RyaW5nIGNyb25FeHByZXNzaW9uKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIENyb25FeHByZXNzaW9uIGNyb24gPSBuZXcgQ3JvbkV4cHJlc3Npb24oY3JvbkV4cHJlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIGNyb24uZ2V0TmV4dFZhbGlkVGltZUFmdGVyKG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL0pvYkludm9rZVV0aWwuamF2YSBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdXRpbC9Kb2JJbnZva2VVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkYzYyYwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdXRpbC9Kb2JJbnZva2VVdGlsLmphdmEKQEAgLTAsMCArMSwxODIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnF1YXJ0ei51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnNwcmluZy5TcHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CisKKy8qKgorICog5Lu75Yqh5omn6KGM5bel5YW3CisgKgorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgSm9iSW52b2tlVXRpbAoreworICAgIC8qKgorICAgICAqIOaJp+ihjOaWueazlQorICAgICAqCisgICAgICogQHBhcmFtIHN5c0pvYiDns7vnu5/ku7vliqEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlTWV0aG9kKFN5c0pvYiBzeXNKb2IpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBpbnZva2VUYXJnZXQgPSBzeXNKb2IuZ2V0SW52b2tlVGFyZ2V0KCk7CisgICAgICAgIFN0cmluZyBiZWFuTmFtZSA9IGdldEJlYW5OYW1lKGludm9rZVRhcmdldCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gZ2V0TWV0aG9kTmFtZShpbnZva2VUYXJnZXQpOworICAgICAgICBMaXN0PE9iamVjdFtdPiBtZXRob2RQYXJhbXMgPSBnZXRNZXRob2RQYXJhbXMoaW52b2tlVGFyZ2V0KTsKKworICAgICAgICBpZiAoIWlzVmFsaWRDbGFzc05hbWUoYmVhbk5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IFNwcmluZ1V0aWxzLmdldEJlYW4oYmVhbk5hbWUpOworICAgICAgICAgICAgaW52b2tlTWV0aG9kKGJlYW4sIG1ldGhvZE5hbWUsIG1ldGhvZFBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IENsYXNzLmZvck5hbWUoYmVhbk5hbWUpLmdldERlY2xhcmVkQ29uc3RydWN0b3IoKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgaW52b2tlTWV0aG9kKGJlYW4sIG1ldGhvZE5hbWUsIG1ldGhvZFBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDosIPnlKjku7vliqHmlrnms5UKKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuIOebruagh+WvueixoQorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIOaWueazleWQjeensAorICAgICAqIEBwYXJhbSBtZXRob2RQYXJhbXMg5pa55rOV5Y+C5pWwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VNZXRob2QoT2JqZWN0IGJlYW4sIFN0cmluZyBtZXRob2ROYW1lLCBMaXN0PE9iamVjdFtdPiBtZXRob2RQYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChtZXRob2RQYXJhbXMpICYmIG1ldGhvZFBhcmFtcy5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gYmVhbi5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBnZXRNZXRob2RQYXJhbXNUeXBlKG1ldGhvZFBhcmFtcykpOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBnZXRNZXRob2RQYXJhbXNWYWx1ZShtZXRob2RQYXJhbXMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBiZWFuLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUpOworICAgICAgICAgICAgbWV0aG9kLmludm9rZShiZWFuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjOaYr+WQpuS4uuS4umNsYXNz5YyF5ZCNCisgICAgICogCisgICAgICogQHBhcmFtIGludm9rZVRhcmdldCDlkI3np7AKKyAgICAgKiBAcmV0dXJuIHRydWXmmK8gZmFsc2XlkKYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENsYXNzTmFtZShTdHJpbmcgaW52b2tlVGFyZ2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmNvdW50TWF0Y2hlcyhpbnZva2VUYXJnZXQsICIuIikgPiAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlmJlYW7lkI3np7AKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW52b2tlVGFyZ2V0IOebruagh+Wtl+espuS4sgorICAgICAqIEByZXR1cm4gYmVhbuWQjeensAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJlYW5OYW1lKFN0cmluZyBpbnZva2VUYXJnZXQpCisgICAgeworICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSBTdHJpbmdVdGlscy5zdWJzdHJpbmdCZWZvcmUoaW52b2tlVGFyZ2V0LCAiKCIpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlTGFzdChiZWFuTmFtZSwgIi4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5ZiZWFu5pa55rOVCisgICAgICogCisgICAgICogQHBhcmFtIGludm9rZVRhcmdldCDnm67moIflrZfnrKbkuLIKKyAgICAgKiBAcmV0dXJuIG1ldGhvZOaWueazlQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoU3RyaW5nIGludm9rZVRhcmdldCkKKyAgICB7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKGludm9rZVRhcmdldCwgIigiKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnN1YnN0cmluZ0FmdGVyTGFzdChtZXRob2ROYW1lLCAiLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPlm1ldGhvZOaWueazleWPguaVsOebuOWFs+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnZva2VUYXJnZXQg55uu5qCH5a2X56ym5LiyCisgICAgICogQHJldHVybiBtZXRob2Tmlrnms5Xnm7jlhbPlj4LmlbDliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IGdldE1ldGhvZFBhcmFtcyhTdHJpbmcgaW52b2tlVGFyZ2V0KQorICAgIHsKKyAgICAgICAgU3RyaW5nIG1ldGhvZFN0ciA9IFN0cmluZ1V0aWxzLnN1YnN0cmluZ0JldHdlZW4oaW52b2tlVGFyZ2V0LCAiKCIsICIpIik7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG1ldGhvZFN0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIG1ldGhvZFBhcmFtcyA9IG1ldGhvZFN0ci5zcGxpdCgiLCg/PShbXlwiJ10qW1wiJ11bXlwiJ10qW1wiJ10pKlteXCInXSokKSIpOworICAgICAgICBMaXN0PE9iamVjdFtdPiBjbGFzc3MgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kUGFyYW1zLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5nVXRpbHMudHJpbVRvRW1wdHkobWV0aG9kUGFyYW1zW2ldKTsKKyAgICAgICAgICAgIC8vIFN0cmluZ+Wtl+espuS4suexu+Wei++8jOS7pSfmiJYi5byA5aS0CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuc3RhcnRzV2l0aEFueShzdHIsICInIiwgIlwiIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xhc3NzLmFkZChuZXcgT2JqZWN0W10geyBTdHJpbmdVdGlscy5zdWJzdHJpbmcoc3RyLCAxLCBzdHIubGVuZ3RoKCkgLSAxKSwgU3RyaW5nLmNsYXNzIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYm9vbGVhbuW4g+WwlOexu+Wei++8jOetieS6jnRydWXmiJbogIVmYWxzZQorICAgICAgICAgICAgZWxzZSBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyKSB8fCAiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGFzc3MuYWRkKG5ldyBPYmplY3RbXSB7IEJvb2xlYW4udmFsdWVPZihzdHIpLCBCb29sZWFuLmNsYXNzIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbG9uZ+mVv+aVtOW9ou+8jOS7pUznu5PlsL4KKyAgICAgICAgICAgIGVsc2UgaWYgKFN0cmluZ1V0aWxzLmVuZHNXaXRoKHN0ciwgIkwiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGFzc3MuYWRkKG5ldyBPYmplY3RbXSB7IExvbmcudmFsdWVPZihTdHJpbmdVdGlscy5zdWJzdHJpbmcoc3RyLCAwLCBzdHIubGVuZ3RoKCkgLSAxKSksIExvbmcuY2xhc3MgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkb3VibGXmta7ngrnnsbvlnovvvIzku6VE57uT5bC+CisgICAgICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5lbmRzV2l0aChzdHIsICJEIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xhc3NzLmFkZChuZXcgT2JqZWN0W10geyBEb3VibGUudmFsdWVPZihTdHJpbmdVdGlscy5zdWJzdHJpbmcoc3RyLCAwLCBzdHIubGVuZ3RoKCkgLSAxKSksIERvdWJsZS5jbGFzcyB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIOWFtuS7luexu+Wei+W9kuexu+S4uuaVtOW9ogorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsYXNzcy5hZGQobmV3IE9iamVjdFtdIHsgSW50ZWdlci52YWx1ZU9mKHN0ciksIEludGVnZXIuY2xhc3MgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5blj4LmlbDnsbvlnosKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWV0aG9kUGFyYW1zIOWPguaVsOebuOWFs+WIl+ihqAorICAgICAqIEByZXR1cm4g5Y+C5pWw57G75Z6L5YiX6KGoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/PltdIGdldE1ldGhvZFBhcmFtc1R5cGUoTGlzdDxPYmplY3RbXT4gbWV0aG9kUGFyYW1zKQorICAgIHsKKyAgICAgICAgQ2xhc3M8Pz5bXSBjbGFzc3MgPSBuZXcgQ2xhc3M8Pz5bbWV0aG9kUGFyYW1zLnNpemUoKV07CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoT2JqZWN0W10gb3MgOiBtZXRob2RQYXJhbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsYXNzc1tpbmRleF0gPSAoQ2xhc3M8Pz4pIG9zWzFdOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluWPguaVsOWAvAorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRob2RQYXJhbXMg5Y+C5pWw55u45YWz5YiX6KGoCisgICAgICogQHJldHVybiDlj4LmlbDlgLzliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldE1ldGhvZFBhcmFtc1ZhbHVlKExpc3Q8T2JqZWN0W10+IG1ldGhvZFBhcmFtcykKKyAgICB7CisgICAgICAgIE9iamVjdFtdIGNsYXNzcyA9IG5ldyBPYmplY3RbbWV0aG9kUGFyYW1zLnNpemUoKV07CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoT2JqZWN0W10gb3MgOiBtZXRob2RQYXJhbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsYXNzc1tpbmRleF0gPSAoT2JqZWN0KSBvc1swXTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvUXVhcnR6RGlzYWxsb3dDb25jdXJyZW50RXhlY3V0aW9uLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvUXVhcnR6RGlzYWxsb3dDb25jdXJyZW50RXhlY3V0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxMzU1OAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdXRpbC9RdWFydHpEaXNhbGxvd0NvbmN1cnJlbnRFeGVjdXRpb24uamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGNvbS5ydW95aS5xdWFydHoudXRpbDsKKworaW1wb3J0IG9yZy5xdWFydHouRGlzYWxsb3dDb25jdXJyZW50RXhlY3V0aW9uOworaW1wb3J0IG9yZy5xdWFydHouSm9iRXhlY3V0aW9uQ29udGV4dDsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CisKKy8qKgorICog5a6a5pe25Lu75Yqh5aSE55CG77yI56aB5q2i5bm25Y+R5omn6KGM77yJCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqCisgKi8KK0BEaXNhbGxvd0NvbmN1cnJlbnRFeGVjdXRpb24KK3B1YmxpYyBjbGFzcyBRdWFydHpEaXNhbGxvd0NvbmN1cnJlbnRFeGVjdXRpb24gZXh0ZW5kcyBBYnN0cmFjdFF1YXJ0ekpvYgoreworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZShKb2JFeGVjdXRpb25Db250ZXh0IGNvbnRleHQsIFN5c0pvYiBzeXNKb2IpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEpvYkludm9rZVV0aWwuaW52b2tlTWV0aG9kKHN5c0pvYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL1F1YXJ0ekpvYkV4ZWN1dGlvbi5qYXZhIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3F1YXJ0ei91dGlsL1F1YXJ0ekpvYkV4ZWN1dGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzUzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvUXVhcnR6Sm9iRXhlY3V0aW9uLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20ucnVveWkucXVhcnR6LnV0aWw7CisKK2ltcG9ydCBvcmcucXVhcnR6LkpvYkV4ZWN1dGlvbkNvbnRleHQ7CitpbXBvcnQgY29tLnJ1b3lpLnF1YXJ0ei5kb21haW4uU3lzSm9iOworCisvKioKKyAqIOWumuaXtuS7u+WKoeWkhOeQhu+8iOWFgeiuuOW5tuWPkeaJp+ihjO+8iQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKgorICovCitwdWJsaWMgY2xhc3MgUXVhcnR6Sm9iRXhlY3V0aW9uIGV4dGVuZHMgQWJzdHJhY3RRdWFydHpKb2IKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoSm9iRXhlY3V0aW9uQ29udGV4dCBjb250ZXh0LCBTeXNKb2Igc3lzSm9iKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBKb2JJbnZva2VVdGlsLmludm9rZU1ldGhvZChzeXNKb2IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9xdWFydHovdXRpbC9TY2hlZHVsZVV0aWxzLmphdmEgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvU2NoZWR1bGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmVkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1xdWFydHovc3JjL21haW4vamF2YS9jb20vcnVveWkvcXVhcnR6L3V0aWwvU2NoZWR1bGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACitwYWNrYWdlIGNvbS5ydW95aS5xdWFydHoudXRpbDsKKworaW1wb3J0IG9yZy5xdWFydHouQ3JvblNjaGVkdWxlQnVpbGRlcjsKK2ltcG9ydCBvcmcucXVhcnR6LkNyb25UcmlnZ2VyOworaW1wb3J0IG9yZy5xdWFydHouSm9iOworaW1wb3J0IG9yZy5xdWFydHouSm9iQnVpbGRlcjsKK2ltcG9ydCBvcmcucXVhcnR6LkpvYkRldGFpbDsKK2ltcG9ydCBvcmcucXVhcnR6LkpvYktleTsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlcjsKK2ltcG9ydCBvcmcucXVhcnR6LlNjaGVkdWxlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcucXVhcnR6LlRyaWdnZXJCdWlsZGVyOworaW1wb3J0IG9yZy5xdWFydHouVHJpZ2dlcktleTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlNjaGVkdWxlQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLmpvYi5UYXNrRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLmpvYi5UYXNrRXhjZXB0aW9uLkNvZGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLnNwcmluZy5TcHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkucXVhcnR6LmRvbWFpbi5TeXNKb2I7CisKKy8qKgorICog5a6a5pe25Lu75Yqh5bel5YW357G7CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlZHVsZVV0aWxzCit7CisgICAgLyoqCisgICAgICog5b6X5YiwcXVhcnR65Lu75Yqh57G7CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3lzSm9iIOaJp+ihjOiuoeWIkgorICAgICAqIEByZXR1cm4g5YW35L2T5omn6KGM5Lu75Yqh57G7CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8PyBleHRlbmRzIEpvYj4gZ2V0UXVhcnR6Sm9iQ2xhc3MoU3lzSm9iIHN5c0pvYikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gaXNDb25jdXJyZW50ID0gIjAiLmVxdWFscyhzeXNKb2IuZ2V0Q29uY3VycmVudCgpKTsKKyAgICAgICAgcmV0dXJuIGlzQ29uY3VycmVudCA/IFF1YXJ0ekpvYkV4ZWN1dGlvbi5jbGFzcyA6IFF1YXJ0ekRpc2FsbG93Q29uY3VycmVudEV4ZWN1dGlvbi5jbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rku7vliqHop6blj5Hlr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRyaWdnZXJLZXkgZ2V0VHJpZ2dlcktleShMb25nIGpvYklkLCBTdHJpbmcgam9iR3JvdXApCisgICAgeworICAgICAgICByZXR1cm4gVHJpZ2dlcktleS50cmlnZ2VyS2V5KFNjaGVkdWxlQ29uc3RhbnRzLlRBU0tfQ0xBU1NfTkFNRSArIGpvYklkLCBqb2JHcm91cCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p6E5bu65Lu75Yqh6ZSu5a+56LGhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBKb2JLZXkgZ2V0Sm9iS2V5KExvbmcgam9iSWQsIFN0cmluZyBqb2JHcm91cCkKKyAgICB7CisgICAgICAgIHJldHVybiBKb2JLZXkuam9iS2V5KFNjaGVkdWxlQ29uc3RhbnRzLlRBU0tfQ0xBU1NfTkFNRSArIGpvYklkLCBqb2JHcm91cCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yib5bu65a6a5pe25Lu75YqhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNjaGVkdWxlSm9iKFNjaGVkdWxlciBzY2hlZHVsZXIsIFN5c0pvYiBqb2IpIHRocm93cyBTY2hlZHVsZXJFeGNlcHRpb24sIFRhc2tFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBKb2I+IGpvYkNsYXNzID0gZ2V0UXVhcnR6Sm9iQ2xhc3Moam9iKTsKKyAgICAgICAgLy8g5p6E5bu6am9i5L+h5oGvCisgICAgICAgIExvbmcgam9iSWQgPSBqb2IuZ2V0Sm9iSWQoKTsKKyAgICAgICAgU3RyaW5nIGpvYkdyb3VwID0gam9iLmdldEpvYkdyb3VwKCk7CisgICAgICAgIEpvYkRldGFpbCBqb2JEZXRhaWwgPSBKb2JCdWlsZGVyLm5ld0pvYihqb2JDbGFzcykud2l0aElkZW50aXR5KGdldEpvYktleShqb2JJZCwgam9iR3JvdXApKS5idWlsZCgpOworCisgICAgICAgIC8vIOihqOi+vuW8j+iwg+W6puaehOW7uuWZqAorICAgICAgICBDcm9uU2NoZWR1bGVCdWlsZGVyIGNyb25TY2hlZHVsZUJ1aWxkZXIgPSBDcm9uU2NoZWR1bGVCdWlsZGVyLmNyb25TY2hlZHVsZShqb2IuZ2V0Q3JvbkV4cHJlc3Npb24oKSk7CisgICAgICAgIGNyb25TY2hlZHVsZUJ1aWxkZXIgPSBoYW5kbGVDcm9uU2NoZWR1bGVNaXNmaXJlUG9saWN5KGpvYiwgY3JvblNjaGVkdWxlQnVpbGRlcik7CisKKyAgICAgICAgLy8g5oyJ5paw55qEY3JvbkV4cHJlc3Npb27ooajovr7lvI/mnoTlu7rkuIDkuKrmlrDnmoR0cmlnZ2VyCisgICAgICAgIENyb25UcmlnZ2VyIHRyaWdnZXIgPSBUcmlnZ2VyQnVpbGRlci5uZXdUcmlnZ2VyKCkud2l0aElkZW50aXR5KGdldFRyaWdnZXJLZXkoam9iSWQsIGpvYkdyb3VwKSkKKyAgICAgICAgICAgICAgICAud2l0aFNjaGVkdWxlKGNyb25TY2hlZHVsZUJ1aWxkZXIpLmJ1aWxkKCk7CisKKyAgICAgICAgLy8g5pS+5YWl5Y+C5pWw77yM6L+Q6KGM5pe255qE5pa55rOV5Y+v5Lul6I635Y+WCisgICAgICAgIGpvYkRldGFpbC5nZXRKb2JEYXRhTWFwKCkucHV0KFNjaGVkdWxlQ29uc3RhbnRzLlRBU0tfUFJPUEVSVElFUywgam9iKTsKKworICAgICAgICAvLyDliKTmlq3mmK/lkKblrZjlnKgKKyAgICAgICAgaWYgKHNjaGVkdWxlci5jaGVja0V4aXN0cyhnZXRKb2JLZXkoam9iSWQsIGpvYkdyb3VwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOmYsuatouWIm+W7uuaXtuWtmOWcqOaVsOaNrumXrumimCDlhYjnp7vpmaTvvIznhLblkI7lnKjmiafooYzliJvlu7rmk43kvZwKKyAgICAgICAgICAgIHNjaGVkdWxlci5kZWxldGVKb2IoZ2V0Sm9iS2V5KGpvYklkLCBqb2JHcm91cCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8g5Yik5pat5Lu75Yqh5piv5ZCm6L+H5pyfCisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwoQ3JvblV0aWxzLmdldE5leHRFeGVjdXRpb24oam9iLmdldENyb25FeHByZXNzaW9uKCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5omn6KGM6LCD5bqm5Lu75YqhCisgICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVKb2Ioam9iRGV0YWlsLCB0cmlnZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIOaaguWBnOS7u+WKoQorICAgICAgICBpZiAoam9iLmdldFN0YXR1cygpLmVxdWFscyhTY2hlZHVsZUNvbnN0YW50cy5TdGF0dXMuUEFVU0UuZ2V0VmFsdWUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaGVkdWxlci5wYXVzZUpvYihTY2hlZHVsZVV0aWxzLmdldEpvYktleShqb2JJZCwgam9iR3JvdXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOiuvue9ruWumuaXtuS7u+WKoeetlueVpQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3JvblNjaGVkdWxlQnVpbGRlciBoYW5kbGVDcm9uU2NoZWR1bGVNaXNmaXJlUG9saWN5KFN5c0pvYiBqb2IsIENyb25TY2hlZHVsZUJ1aWxkZXIgY2IpCisgICAgICAgICAgICB0aHJvd3MgVGFza0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3dpdGNoIChqb2IuZ2V0TWlzZmlyZVBvbGljeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVkdWxlQ29uc3RhbnRzLk1JU0ZJUkVfREVGQVVMVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2I7CisgICAgICAgICAgICBjYXNlIFNjaGVkdWxlQ29uc3RhbnRzLk1JU0ZJUkVfSUdOT1JFX01JU0ZJUkVTOgorICAgICAgICAgICAgICAgIHJldHVybiBjYi53aXRoTWlzZmlyZUhhbmRsaW5nSW5zdHJ1Y3Rpb25JZ25vcmVNaXNmaXJlcygpOworICAgICAgICAgICAgY2FzZSBTY2hlZHVsZUNvbnN0YW50cy5NSVNGSVJFX0ZJUkVfQU5EX1BST0NFRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNiLndpdGhNaXNmaXJlSGFuZGxpbmdJbnN0cnVjdGlvbkZpcmVBbmRQcm9jZWVkKCk7CisgICAgICAgICAgICBjYXNlIFNjaGVkdWxlQ29uc3RhbnRzLk1JU0ZJUkVfRE9fTk9USElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2Iud2l0aE1pc2ZpcmVIYW5kbGluZ0luc3RydWN0aW9uRG9Ob3RoaW5nKCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXNrRXhjZXB0aW9uKCJUaGUgdGFzayBtaXNmaXJlIHBvbGljeSAnIiArIGpvYi5nZXRNaXNmaXJlUG9saWN5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY2Fubm90IGJlIHVzZWQgaW4gY3JvbiBzY2hlZHVsZSB0YXNrcyIsIENvZGUuQ09ORklHX0VSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOajgOafpeWMheWQjeaYr+WQpuS4uueZveWQjeWNlemFjee9rgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnZva2VUYXJnZXQg55uu5qCH5a2X56ym5LiyCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2hpdGVMaXN0KFN0cmluZyBpbnZva2VUYXJnZXQpCisgICAgeworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBTdHJpbmdVdGlscy5zdWJzdHJpbmdCZWZvcmUoaW52b2tlVGFyZ2V0LCAiKCIpOworICAgICAgICBpbnQgY291bnQgPSBTdHJpbmdVdGlscy5jb3VudE1hdGNoZXMocGFja2FnZU5hbWUsICIuIik7CisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5jb250YWluc0FueUlnbm9yZUNhc2UoaW52b2tlVGFyZ2V0LCBDb25zdGFudHMuSk9CX1dISVRFTElTVF9TVFIpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBvYmogPSBTcHJpbmdVdGlscy5nZXRCZWFuKFN0cmluZ1V0aWxzLnNwbGl0KGludm9rZVRhcmdldCwgIi4iKVswXSk7CisgICAgICAgIFN0cmluZyBiZWFuUGFja2FnZU5hbWUgPSBvYmouZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuY29udGFpbnNBbnlJZ25vcmVDYXNlKGJlYW5QYWNrYWdlTmFtZSwgQ29uc3RhbnRzLkpPQl9XSElURUxJU1RfU1RSKQorICAgICAgICAgICAgICAgICYmICFTdHJpbmdVdGlscy5jb250YWluc0FueUlnbm9yZUNhc2UoYmVhblBhY2thZ2VOYW1lLCBDb25zdGFudHMuSk9CX0VSUk9SX1NUUik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktcXVhcnR6L3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvcXVhcnR6L1N5c0pvYkxvZ01hcHBlci54bWwgYi9ydW95aS1xdWFydHovc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9xdWFydHovU3lzSm9iTG9nTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFiNjgzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvcXVhcnR6L1N5c0pvYkxvZ01hcHBlci54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLnF1YXJ0ei5tYXBwZXIuU3lzSm9iTG9nTWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzSm9iTG9nIiBpZD0iU3lzSm9iTG9nUmVzdWx0Ij4KKwkJPGlkICAgICBwcm9wZXJ0eT0iam9iTG9nSWQiICAgICAgIGNvbHVtbj0iam9iX2xvZ19pZCIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJqb2JOYW1lIiAgICAgICAgY29sdW1uPSJqb2JfbmFtZSIgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImpvYkdyb3VwIiAgICAgICBjb2x1bW49ImpvYl9ncm91cCIgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iaW52b2tlVGFyZ2V0IiAgIGNvbHVtbj0iaW52b2tlX3RhcmdldCIgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJqb2JNZXNzYWdlIiAgICAgY29sdW1uPSJqb2JfbWVzc2FnZSIgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgICAgICBjb2x1bW49InN0YXR1cyIgICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iZXhjZXB0aW9uSW5mbyIgIGNvbHVtbj0iZXhjZXB0aW9uX2luZm8iICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICAgY29sdW1uPSJjcmVhdGVfdGltZSIgICAgIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0Sm9iTG9nVm8iPgorICAgICAgICBzZWxlY3Qgam9iX2xvZ19pZCwgam9iX25hbWUsIGpvYl9ncm91cCwgaW52b2tlX3RhcmdldCwgam9iX21lc3NhZ2UsIHN0YXR1cywgZXhjZXB0aW9uX2luZm8sIGNyZWF0ZV90aW1lIAorCQlmcm9tIHN5c19qb2JfbG9nCisgICAgPC9zcWw+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Sm9iTG9nTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzSm9iTG9nIiByZXN1bHRNYXA9IlN5c0pvYkxvZ1Jlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RKb2JMb2dWbyIvPgorCQk8d2hlcmU+CisJCQk8aWYgdGVzdD0iam9iTmFtZSAhPSBudWxsIGFuZCBqb2JOYW1lICE9ICcnIj4KKwkJCQlBTkQgam9iX25hbWUgbGlrZSBjb25jYXQoJyUnLCAje2pvYk5hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9ImpvYkdyb3VwICE9IG51bGwgYW5kIGpvYkdyb3VwICE9ICcnIj4KKwkJCQlBTkQgam9iX2dyb3VwID0gI3tqb2JHcm91cH0KKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJpbnZva2VUYXJnZXQgIT0gbnVsbCBhbmQgaW52b2tlVGFyZ2V0ICE9ICcnIj4KKwkJCQlBTkQgaW52b2tlX3RhcmdldCBsaWtlIGNvbmNhdCgnJScsICN7aW52b2tlVGFyZ2V0fSwgJyUnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwYXJhbXMuYmVnaW5UaW1lICE9IG51bGwgYW5kIHBhcmFtcy5iZWdpblRpbWUgIT0gJyciPjwhLS0g5byA5aeL5pe26Ze05qOA57SiIC0tPgorCQkJCWFuZCBkYXRlX2Zvcm1hdChjcmVhdGVfdGltZSwnJVklbSVkJykgJmd0Oz0gZGF0ZV9mb3JtYXQoI3twYXJhbXMuYmVnaW5UaW1lfSwnJVklbSVkJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0icGFyYW1zLmVuZFRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmVuZFRpbWUgIT0gJyciPjwhLS0g57uT5p2f5pe26Ze05qOA57SiIC0tPgorCQkJCWFuZCBkYXRlX2Zvcm1hdChjcmVhdGVfdGltZSwnJVklbSVkJykgJmx0Oz0gZGF0ZV9mb3JtYXQoI3twYXJhbXMuZW5kVGltZX0sJyVZJW0lZCcpCisJCQk8L2lmPgorCQk8L3doZXJlPgorCQlvcmRlciBieSBjcmVhdGVfdGltZSBkZXNjCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Sm9iTG9nQWxsIiByZXN1bHRNYXA9IlN5c0pvYkxvZ1Jlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RKb2JMb2dWbyIvPgorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdEpvYkxvZ0J5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iU3lzSm9iTG9nUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdEpvYkxvZ1ZvIi8+CisJCXdoZXJlIGpvYl9sb2dfaWQgPSAje2pvYkxvZ0lkfQorCTwvc2VsZWN0PgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZUpvYkxvZ0J5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX2pvYl9sb2cgd2hlcmUgam9iX2xvZ19pZCA9ICN7am9iTG9nSWR9CisgCTwvZGVsZXRlPgorIAkKKyAJPGRlbGV0ZSBpZD0iZGVsZXRlSm9iTG9nQnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX2pvYl9sb2cgd2hlcmUgam9iX2xvZ19pZCBpbgorIAkJPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09ImpvYkxvZ0lkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje2pvYkxvZ0lkfQorICAgICAgICA8L2ZvcmVhY2g+IAorIAk8L2RlbGV0ZT4KKyAJCisgCTx1cGRhdGUgaWQ9ImNsZWFuSm9iTG9nIj4KKyAgICAgICAgdHJ1bmNhdGUgdGFibGUgc3lzX2pvYl9sb2cKKyAgICA8L3VwZGF0ZT4KKyAJCisgCTxpbnNlcnQgaWQ9Imluc2VydEpvYkxvZyIgcGFyYW1ldGVyVHlwZT0iU3lzSm9iTG9nIj4KKyAJCWluc2VydCBpbnRvIHN5c19qb2JfbG9nKAorIAkJCTxpZiB0ZXN0PSJqb2JMb2dJZCAhPSBudWxsIGFuZCBqb2JMb2dJZCAhPSAwIj5qb2JfbG9nX2lkLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImpvYk5hbWUgIT0gbnVsbCBhbmQgam9iTmFtZSAhPSAnJyI+am9iX25hbWUsPC9pZj4KKyAJCQk8aWYgdGVzdD0iam9iR3JvdXAgIT0gbnVsbCBhbmQgam9iR3JvdXAgIT0gJyciPmpvYl9ncm91cCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJpbnZva2VUYXJnZXQgIT0gbnVsbCBhbmQgaW52b2tlVGFyZ2V0ICE9ICcnIj5pbnZva2VfdGFyZ2V0LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImpvYk1lc3NhZ2UgIT0gbnVsbCBhbmQgam9iTWVzc2FnZSAhPSAnJyI+am9iX21lc3NhZ2UsPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+c3RhdHVzLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImV4Y2VwdGlvbkluZm8gIT0gbnVsbCBhbmQgZXhjZXB0aW9uSW5mbyAhPSAnJyI+ZXhjZXB0aW9uX2luZm8sPC9pZj4KKyAJCQljcmVhdGVfdGltZQorIAkJKXZhbHVlcygKKyAJCQk8aWYgdGVzdD0iam9iTG9nSWQgIT0gbnVsbCBhbmQgam9iTG9nSWQgIT0gMCI+I3tqb2JMb2dJZH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iam9iTmFtZSAhPSBudWxsIGFuZCBqb2JOYW1lICE9ICcnIj4je2pvYk5hbWV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImpvYkdyb3VwICE9IG51bGwgYW5kIGpvYkdyb3VwICE9ICcnIj4je2pvYkdyb3VwfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJpbnZva2VUYXJnZXQgIT0gbnVsbCBhbmQgaW52b2tlVGFyZ2V0ICE9ICcnIj4je2ludm9rZVRhcmdldH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iam9iTWVzc2FnZSAhPSBudWxsIGFuZCBqb2JNZXNzYWdlICE9ICcnIj4je2pvYk1lc3NhZ2V9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPiN7c3RhdHVzfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJleGNlcHRpb25JbmZvICE9IG51bGwgYW5kIGV4Y2VwdGlvbkluZm8gIT0gJyciPiN7ZXhjZXB0aW9uSW5mb30sPC9pZj4KKyAJCQlzeXNkYXRlKCkKKyAJCSkKKwk8L2luc2VydD4KKworPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3F1YXJ0ei9TeXNKb2JNYXBwZXIueG1sIGIvcnVveWktcXVhcnR6L3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvcXVhcnR6L1N5c0pvYk1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwNWM0NAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXF1YXJ0ei9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3F1YXJ0ei9TeXNKb2JNYXBwZXIueG1sCkBAIC0wLDAgKzEsMTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkucXVhcnR6Lm1hcHBlci5TeXNKb2JNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJTeXNKb2IiIGlkPSJTeXNKb2JSZXN1bHQiPgorCQk8aWQgICAgIHByb3BlcnR5PSJqb2JJZCIgICAgICAgICAgY29sdW1uPSJqb2JfaWQiICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImpvYk5hbWUiICAgICAgICBjb2x1bW49ImpvYl9uYW1lIiAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iam9iR3JvdXAiICAgICAgIGNvbHVtbj0iam9iX2dyb3VwIiAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJpbnZva2VUYXJnZXQiICAgY29sdW1uPSJpbnZva2VfdGFyZ2V0IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyb25FeHByZXNzaW9uIiBjb2x1bW49ImNyb25fZXhwcmVzc2lvbiIgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ibWlzZmlyZVBvbGljeSIgIGNvbHVtbj0ibWlzZmlyZV9wb2xpY3kiICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjb25jdXJyZW50IiAgICAgY29sdW1uPSJjb25jdXJyZW50IiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgICAgICBjb2x1bW49InN0YXR1cyIgICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlQnkiICAgICAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICAgY29sdW1uPSJjcmVhdGVfdGltZSIgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZUJ5IiAgICAgICBjb2x1bW49InVwZGF0ZV9ieSIgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlVGltZSIgICAgIGNvbHVtbj0idXBkYXRlX3RpbWUiICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyZW1hcmsiICAgICAgICAgY29sdW1uPSJyZW1hcmsiICAgICAgICAgIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0Sm9iVm8iPgorICAgICAgICBzZWxlY3Qgam9iX2lkLCBqb2JfbmFtZSwgam9iX2dyb3VwLCBpbnZva2VfdGFyZ2V0LCBjcm9uX2V4cHJlc3Npb24sIG1pc2ZpcmVfcG9saWN5LCBjb25jdXJyZW50LCBzdGF0dXMsIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHJlbWFyayAKKwkJZnJvbSBzeXNfam9iCisgICAgPC9zcWw+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Sm9iTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzSm9iIiByZXN1bHRNYXA9IlN5c0pvYlJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RKb2JWbyIvPgorCQk8d2hlcmU+CisJCQk8aWYgdGVzdD0iam9iTmFtZSAhPSBudWxsIGFuZCBqb2JOYW1lICE9ICcnIj4KKwkJCQlBTkQgam9iX25hbWUgbGlrZSBjb25jYXQoJyUnLCAje2pvYk5hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9ImpvYkdyb3VwICE9IG51bGwgYW5kIGpvYkdyb3VwICE9ICcnIj4KKwkJCQlBTkQgam9iX2dyb3VwID0gI3tqb2JHcm91cH0KKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJpbnZva2VUYXJnZXQgIT0gbnVsbCBhbmQgaW52b2tlVGFyZ2V0ICE9ICcnIj4KKwkJCQlBTkQgaW52b2tlX3RhcmdldCBsaWtlIGNvbmNhdCgnJScsICN7aW52b2tlVGFyZ2V0fSwgJyUnKQorCQkJPC9pZj4KKwkJPC93aGVyZT4KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RKb2JBbGwiIHJlc3VsdE1hcD0iU3lzSm9iUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdEpvYlZvIi8+CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Sm9iQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNKb2JSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0Sm9iVm8iLz4KKwkJd2hlcmUgam9iX2lkID0gI3tqb2JJZH0KKwk8L3NlbGVjdD4KKwkKKwk8ZGVsZXRlIGlkPSJkZWxldGVKb2JCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAJCWRlbGV0ZSBmcm9tIHN5c19qb2Igd2hlcmUgam9iX2lkID0gI3tqb2JJZH0KKyAJPC9kZWxldGU+CisgCQorIAk8ZGVsZXRlIGlkPSJkZWxldGVKb2JCeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQlkZWxldGUgZnJvbSBzeXNfam9iIHdoZXJlIGpvYl9pZCBpbgorIAkJPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09ImpvYklkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje2pvYklkfQorICAgICAgICA8L2ZvcmVhY2g+IAorIAk8L2RlbGV0ZT4KKyAJCisgCTx1cGRhdGUgaWQ9InVwZGF0ZUpvYiIgcGFyYW1ldGVyVHlwZT0iU3lzSm9iIj4KKyAJCXVwZGF0ZSBzeXNfam9iCisgCQk8c2V0PgorIAkJCTxpZiB0ZXN0PSJqb2JOYW1lICE9IG51bGwgYW5kIGpvYk5hbWUgIT0gJyciPmpvYl9uYW1lID0gI3tqb2JOYW1lfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJqb2JHcm91cCAhPSBudWxsIGFuZCBqb2JHcm91cCAhPSAnJyI+am9iX2dyb3VwID0gI3tqb2JHcm91cH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iaW52b2tlVGFyZ2V0ICE9IG51bGwgYW5kIGludm9rZVRhcmdldCAhPSAnJyI+aW52b2tlX3RhcmdldCA9ICN7aW52b2tlVGFyZ2V0fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcm9uRXhwcmVzc2lvbiAhPSBudWxsIGFuZCBjcm9uRXhwcmVzc2lvbiAhPSAnJyI+Y3Jvbl9leHByZXNzaW9uID0gI3tjcm9uRXhwcmVzc2lvbn0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibWlzZmlyZVBvbGljeSAhPSBudWxsIGFuZCBtaXNmaXJlUG9saWN5ICE9ICcnIj5taXNmaXJlX3BvbGljeSA9ICN7bWlzZmlyZVBvbGljeX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iY29uY3VycmVudCAhPSBudWxsIGFuZCBjb25jdXJyZW50ICE9ICcnIj5jb25jdXJyZW50ID0gI3tjb25jdXJyZW50fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT1udWxsIj5zdGF0dXMgPSAje3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+cmVtYXJrID0gI3tyZW1hcmt9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InVwZGF0ZUJ5ICE9IG51bGwgYW5kIHVwZGF0ZUJ5ICE9ICcnIj51cGRhdGVfYnkgPSAje3VwZGF0ZUJ5fSw8L2lmPgorIAkJCXVwZGF0ZV90aW1lID0gc3lzZGF0ZSgpCisgCQk8L3NldD4KKyAJCXdoZXJlIGpvYl9pZCA9ICN7am9iSWR9CisJPC91cGRhdGU+CisgCQorIAk8aW5zZXJ0IGlkPSJpbnNlcnRKb2IiIHBhcmFtZXRlclR5cGU9IlN5c0pvYiIgdXNlR2VuZXJhdGVkS2V5cz0idHJ1ZSIga2V5UHJvcGVydHk9ImpvYklkIj4KKyAJCWluc2VydCBpbnRvIHN5c19qb2IoCisgCQkJPGlmIHRlc3Q9ImpvYklkICE9IG51bGwgYW5kIGpvYklkICE9IDAiPmpvYl9pZCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJqb2JOYW1lICE9IG51bGwgYW5kIGpvYk5hbWUgIT0gJyciPmpvYl9uYW1lLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImpvYkdyb3VwICE9IG51bGwgYW5kIGpvYkdyb3VwICE9ICcnIj5qb2JfZ3JvdXAsPC9pZj4KKyAJCQk8aWYgdGVzdD0iaW52b2tlVGFyZ2V0ICE9IG51bGwgYW5kIGludm9rZVRhcmdldCAhPSAnJyI+aW52b2tlX3RhcmdldCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcm9uRXhwcmVzc2lvbiAhPSBudWxsIGFuZCBjcm9uRXhwcmVzc2lvbiAhPSAnJyI+Y3Jvbl9leHByZXNzaW9uLDwvaWY+CisgCQkJPGlmIHRlc3Q9Im1pc2ZpcmVQb2xpY3kgIT0gbnVsbCBhbmQgbWlzZmlyZVBvbGljeSAhPSAnJyI+bWlzZmlyZV9wb2xpY3ksPC9pZj4KKyAJCQk8aWYgdGVzdD0iY29uY3VycmVudCAhPSBudWxsIGFuZCBjb25jdXJyZW50ICE9ICcnIj5jb25jdXJyZW50LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmssPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPmNyZWF0ZV9ieSw8L2lmPgorIAkJCWNyZWF0ZV90aW1lCisgCQkpdmFsdWVzKAorIAkJCTxpZiB0ZXN0PSJqb2JJZCAhPSBudWxsIGFuZCBqb2JJZCAhPSAwIj4je2pvYklkfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJqb2JOYW1lICE9IG51bGwgYW5kIGpvYk5hbWUgIT0gJyciPiN7am9iTmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iam9iR3JvdXAgIT0gbnVsbCBhbmQgam9iR3JvdXAgIT0gJyciPiN7am9iR3JvdXB9LDwvaWY+CisgCQkJPGlmIHRlc3Q9Imludm9rZVRhcmdldCAhPSBudWxsIGFuZCBpbnZva2VUYXJnZXQgIT0gJyciPiN7aW52b2tlVGFyZ2V0fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcm9uRXhwcmVzc2lvbiAhPSBudWxsIGFuZCBjcm9uRXhwcmVzc2lvbiAhPSAnJyI+I3tjcm9uRXhwcmVzc2lvbn0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibWlzZmlyZVBvbGljeSAhPSBudWxsIGFuZCBtaXNmaXJlUG9saWN5ICE9ICcnIj4je21pc2ZpcmVQb2xpY3l9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNvbmN1cnJlbnQgIT0gbnVsbCBhbmQgY29uY3VycmVudCAhPSAnJyI+I3tjb25jdXJyZW50fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4je3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+I3tyZW1hcmt9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj4je2NyZWF0ZUJ5fSw8L2lmPgorIAkJCXN5c2RhdGUoKQorIAkJKQorCTwvaW5zZXJ0PgorCis8L21hcHBlcj4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3BvbS54bWwgYi9ydW95aS1zeXN0ZW0vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWYzZjNjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3BvbS54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cnVveWk8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPmNvbS5ydW95aTwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+My44Ljg8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+cnVveWktc3lzdGVtPC9hcnRpZmFjdElkPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBzeXN0ZW3ns7vnu5/mqKHlnZcKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8IS0tIOmAmueUqOW3peWFty0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5ydW95aTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJ1b3lpLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNDYWNoZS5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YwNzAzCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzQ2FjaGUuamF2YQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluOworCitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKKworLyoqCisgKiDnvJPlrZjkv6Hmga8KKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzQ2FjaGUKK3sKKyAgICAvKiog57yT5a2Y5ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVOYW1lID0gIiI7CisKKyAgICAvKiog57yT5a2Y6ZSu5ZCNICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVLZXkgPSAiIjsKKworICAgIC8qKiDnvJPlrZjlhoXlrrkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjYWNoZVZhbHVlID0gIiI7CisKKyAgICAvKiog5aSH5rOoICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtYXJrID0gIiI7CisKKyAgICBwdWJsaWMgU3lzQ2FjaGUoKQorICAgIHsKKworICAgIH0KKworICAgIHB1YmxpYyBTeXNDYWNoZShTdHJpbmcgY2FjaGVOYW1lLCBTdHJpbmcgcmVtYXJrKQorICAgIHsKKyAgICAgICAgdGhpcy5jYWNoZU5hbWUgPSBjYWNoZU5hbWU7CisgICAgICAgIHRoaXMucmVtYXJrID0gcmVtYXJrOworICAgIH0KKworICAgIHB1YmxpYyBTeXNDYWNoZShTdHJpbmcgY2FjaGVOYW1lLCBTdHJpbmcgY2FjaGVLZXksIFN0cmluZyBjYWNoZVZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5jYWNoZU5hbWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNhY2hlTmFtZSwgIjoiLCAiIik7CisgICAgICAgIHRoaXMuY2FjaGVLZXkgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNhY2hlS2V5LCBjYWNoZU5hbWUsICIiKTsKKyAgICAgICAgdGhpcy5jYWNoZVZhbHVlID0gY2FjaGVWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENhY2hlTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlTmFtZShTdHJpbmcgY2FjaGVOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5jYWNoZU5hbWUgPSBjYWNoZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYWNoZUtleSgpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGVLZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVLZXkoU3RyaW5nIGNhY2hlS2V5KQorICAgIHsKKyAgICAgICAgdGhpcy5jYWNoZUtleSA9IGNhY2hlS2V5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGVWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZVZhbHVlKFN0cmluZyBjYWNoZVZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5jYWNoZVZhbHVlID0gY2FjaGVWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbWFyaygpCisgICAgeworICAgICAgICByZXR1cm4gcmVtYXJrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbWFyayhTdHJpbmcgcmVtYXJrKQorICAgIHsKKyAgICAgICAgdGhpcy5yZW1hcmsgPSByZW1hcms7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzQ29uZmlnLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUwN2JlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5kb21haW47CisKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90Qmxhbms7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDlj4LmlbDphY3nva7ooaggc3lzX2NvbmZpZworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNDb25maWcgZXh0ZW5kcyBCYXNlRW50aXR5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKiog5Y+C5pWw5Li76ZSuICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Y+C5pWw5Li76ZSuIiwgY2VsbFR5cGUgPSBDb2x1bW5UeXBlLk5VTUVSSUMpCisgICAgcHJpdmF0ZSBMb25nIGNvbmZpZ0lkOworCisgICAgLyoqIOWPguaVsOWQjeensCAqLworICAgIEBFeGNlbChuYW1lID0gIuWPguaVsOWQjeensCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnTmFtZTsKKworICAgIC8qKiDlj4LmlbDplK7lkI0gKi8KKyAgICBARXhjZWwobmFtZSA9ICLlj4LmlbDplK7lkI0iKQorICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ0tleTsKKworICAgIC8qKiDlj4LmlbDplK7lgLwgKi8KKyAgICBARXhjZWwobmFtZSA9ICLlj4LmlbDplK7lgLwiKQorICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ1ZhbHVlOworCisgICAgLyoqIOezu+e7n+WGhee9ru+8iFnmmK8gTuWQpu+8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuezu+e7n+WGhee9riIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiWT3mmK8sTj3lkKYiKQorICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ1R5cGU7CisKKyAgICBwdWJsaWMgTG9uZyBnZXRDb25maWdJZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnSWQoTG9uZyBjb25maWdJZCkKKyAgICB7CisgICAgICAgIHRoaXMuY29uZmlnSWQgPSBjb25maWdJZDsKKyAgICB9CisKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLlj4LmlbDlkI3np7DkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDEwMCwgbWVzc2FnZSA9ICLlj4LmlbDlkI3np7DkuI3og73otoXov4cxMDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdOYW1lKFN0cmluZyBjb25maWdOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5jb25maWdOYW1lID0gY29uZmlnTmFtZTsKKyAgICB9CisKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLlj4LmlbDplK7lkI3plb/luqbkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDEwMCwgbWVzc2FnZSA9ICLlj4LmlbDplK7lkI3plb/luqbkuI3og73otoXov4cxMDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnS2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWdLZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnS2V5KFN0cmluZyBjb25maWdLZXkpCisgICAgeworICAgICAgICB0aGlzLmNvbmZpZ0tleSA9IGNvbmZpZ0tleTsKKyAgICB9CisKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLlj4LmlbDplK7lgLzkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDUwMCwgbWVzc2FnZSA9ICLlj4LmlbDplK7lgLzplb/luqbkuI3og73otoXov4c1MDDkuKrlrZfnrKYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ1ZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ1ZhbHVlKFN0cmluZyBjb25maWdWYWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuY29uZmlnVmFsdWUgPSBjb25maWdWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1R5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ1R5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnVHlwZShTdHJpbmcgY29uZmlnVHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuY29uZmlnVHlwZSA9IGNvbmZpZ1R5cGU7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgiY29uZmlnSWQiLCBnZXRDb25maWdJZCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY29uZmlnTmFtZSIsIGdldENvbmZpZ05hbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNvbmZpZ0tleSIsIGdldENvbmZpZ0tleSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY29uZmlnVmFsdWUiLCBnZXRDb25maWdWYWx1ZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY29uZmlnVHlwZSIsIGdldENvbmZpZ1R5cGUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyZWF0ZUJ5IiwgZ2V0Q3JlYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoImNyZWF0ZVRpbWUiLCBnZXRDcmVhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1cGRhdGVCeSIsIGdldFVwZGF0ZUJ5KCkpCisgICAgICAgICAgICAuYXBwZW5kKCJ1cGRhdGVUaW1lIiwgZ2V0VXBkYXRlVGltZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgicmVtYXJrIiwgZ2V0UmVtYXJrKCkpCisgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNMb2dpbmluZm9yLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNMb2dpbmluZm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkZWEzMAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c0xvZ2luaW5mb3IuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Gb3JtYXQ7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDns7vnu5/orr/pl67orrDlvZXooaggc3lzX2xvZ2luaW5mb3IKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzTG9naW5pbmZvciBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiBJRCAqLworICAgIEBFeGNlbChuYW1lID0gIuW6j+WPtyIsIGNlbGxUeXBlID0gQ29sdW1uVHlwZS5OVU1FUklDKQorICAgIHByaXZhdGUgTG9uZyBpbmZvSWQ7CisKKyAgICAvKiog55So5oi36LSm5Y+3ICovCisgICAgQEV4Y2VsKG5hbWUgPSAi55So5oi36LSm5Y+3IikKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKKworICAgIC8qKiDnmbvlvZXnirbmgIEgMOaIkOWKnyAx5aSx6LSlICovCisgICAgQEV4Y2VsKG5hbWUgPSAi55m75b2V54q25oCBIiwgcmVhZENvbnZlcnRlckV4cCA9ICIwPeaIkOWKnywxPeWksei0pSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzOworCisgICAgLyoqIOeZu+W9lUlQ5Zyw5Z2AICovCisgICAgQEV4Y2VsKG5hbWUgPSAi55m75b2V5Zyw5Z2AIikKKyAgICBwcml2YXRlIFN0cmluZyBpcGFkZHI7CisKKyAgICAvKiog55m75b2V5Zyw54K5ICovCisgICAgQEV4Y2VsKG5hbWUgPSAi55m75b2V5Zyw54K5IikKKyAgICBwcml2YXRlIFN0cmluZyBsb2dpbkxvY2F0aW9uOworCisgICAgLyoqIOa1j+iniOWZqOexu+WeiyAqLworICAgIEBFeGNlbChuYW1lID0gIua1j+iniOWZqCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgYnJvd3NlcjsKKworICAgIC8qKiDmk43kvZzns7vnu58gKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZzns7vnu58iKQorICAgIHByaXZhdGUgU3RyaW5nIG9zOworCisgICAgLyoqIOaPkOekuua2iOaBryAqLworICAgIEBFeGNlbChuYW1lID0gIuaPkOekuua2iOaBryIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbXNnOworCisgICAgLyoqIOiuv+mXruaXtumXtCAqLworICAgIEBKc29uRm9ybWF0KHBhdHRlcm4gPSAieXl5eS1NTS1kZCBISDptbTpzcyIpCisgICAgQEV4Y2VsKG5hbWUgPSAi6K6/6Zeu5pe26Ze0Iiwgd2lkdGggPSAzMCwgZGF0ZUZvcm1hdCA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzIikKKyAgICBwcml2YXRlIERhdGUgbG9naW5UaW1lOworCisgICAgcHVibGljIExvbmcgZ2V0SW5mb0lkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmZvSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5mb0lkKExvbmcgaW5mb0lkKQorICAgIHsKKyAgICAgICAgdGhpcy5pbmZvSWQgPSBpbmZvSWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gdXNlck5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpCisgICAgeworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElwYWRkcigpCisgICAgeworICAgICAgICByZXR1cm4gaXBhZGRyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElwYWRkcihTdHJpbmcgaXBhZGRyKQorICAgIHsKKyAgICAgICAgdGhpcy5pcGFkZHIgPSBpcGFkZHI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2dpbkxvY2F0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luTG9jYXRpb24oU3RyaW5nIGxvZ2luTG9jYXRpb24pCisgICAgeworICAgICAgICB0aGlzLmxvZ2luTG9jYXRpb24gPSBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJvd3NlcigpCisgICAgeworICAgICAgICByZXR1cm4gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCcm93c2VyKFN0cmluZyBicm93c2VyKQorICAgIHsKKyAgICAgICAgdGhpcy5icm93c2VyID0gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcyhTdHJpbmcgb3MpCisgICAgeworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNc2coKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNc2coU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIGdldExvZ2luVGltZSgpCisgICAgeworICAgICAgICByZXR1cm4gbG9naW5UaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luVGltZShEYXRlIGxvZ2luVGltZSkKKyAgICB7CisgICAgICAgIHRoaXMubG9naW5UaW1lID0gbG9naW5UaW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c05vdGljZS5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzTm90aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwM2FkOAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c05vdGljZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluOworCitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnhzcy5Yc3M7CisKKy8qKgorICog6YCa55+l5YWs5ZGK6KGoIHN5c19ub3RpY2UKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzTm90aWNlIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOWFrOWRiklEICovCisgICAgcHJpdmF0ZSBMb25nIG5vdGljZUlkOworCisgICAgLyoqIOWFrOWRiuagh+mimCAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vdGljZVRpdGxlOworCisgICAgLyoqIOWFrOWRiuexu+Wei++8iDHpgJrnn6UgMuWFrOWRiu+8iSAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vdGljZVR5cGU7CisKKyAgICAvKiog5YWs5ZGK5YaF5a65ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm90aWNlQ29udGVudDsKKworICAgIC8qKiDlhazlkYrnirbmgIHvvIgw5q2j5bi4IDHlhbPpl63vvIkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgICBwdWJsaWMgTG9uZyBnZXROb3RpY2VJZCgpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWNlSWQoTG9uZyBub3RpY2VJZCkKKyAgICB7CisgICAgICAgIHRoaXMubm90aWNlSWQgPSBub3RpY2VJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb3RpY2VUaXRsZShTdHJpbmcgbm90aWNlVGl0bGUpCisgICAgeworICAgICAgICB0aGlzLm5vdGljZVRpdGxlID0gbm90aWNlVGl0bGU7CisgICAgfQorCisgICAgQFhzcyhtZXNzYWdlID0gIuWFrOWRiuagh+mimOS4jeiDveWMheWQq+iEmuacrOWtl+espiIpCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi5YWs5ZGK5qCH6aKY5LiN6IO95Li656m6IikKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSA1MCwgbWVzc2FnZSA9ICLlhazlkYrmoIfpopjkuI3og73otoXov4c1MOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXROb3RpY2VUaXRsZSgpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWNlVHlwZShTdHJpbmcgbm90aWNlVHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMubm90aWNlVHlwZSA9IG5vdGljZVR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROb3RpY2VUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBub3RpY2VUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vdGljZUNvbnRlbnQoU3RyaW5nIG5vdGljZUNvbnRlbnQpCisgICAgeworICAgICAgICB0aGlzLm5vdGljZUNvbnRlbnQgPSBub3RpY2VDb250ZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm90aWNlQ29udGVudCgpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlQ29udGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykKKyAgICB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJub3RpY2VJZCIsIGdldE5vdGljZUlkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJub3RpY2VUaXRsZSIsIGdldE5vdGljZVRpdGxlKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJub3RpY2VUeXBlIiwgZ2V0Tm90aWNlVHlwZSgpKQorICAgICAgICAgICAgLmFwcGVuZCgibm90aWNlQ29udGVudCIsIGdldE5vdGljZUNvbnRlbnQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXR1cyIsIGdldFN0YXR1cygpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c09wZXJMb2cuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c09wZXJMb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc2MWRmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzT3BlckxvZy5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkZvcm1hdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRXhjZWw7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsLkNvbHVtblR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5CYXNlRW50aXR5OworCisvKioKKyAqIOaTjeS9nOaXpeW/l+iusOW9leihqCBvcGVyX2xvZworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNPcGVyTG9nIGV4dGVuZHMgQmFzZUVudGl0eQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqIOaXpeW/l+S4u+mUriAqLworICAgIEBFeGNlbChuYW1lID0gIuaTjeS9nOW6j+WPtyIsIGNlbGxUeXBlID0gQ29sdW1uVHlwZS5OVU1FUklDKQorICAgIHByaXZhdGUgTG9uZyBvcGVySWQ7CisKKyAgICAvKiog5pON5L2c5qih5Z2XICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5pON5L2c5qih5Z2XIikKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKworICAgIC8qKiDkuJrliqHnsbvlnovvvIgw5YW25a6DIDHmlrDlop4gMuS/ruaUuSAz5Yig6Zmk77yJICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5Lia5Yqh57G75Z6LIiwgcmVhZENvbnZlcnRlckV4cCA9ICIwPeWFtuWugywxPeaWsOWiniwyPeS/ruaUuSwzPeWIoOmZpCw0PeaOiOadgyw1PeWvvOWHuiw2PeWvvOWFpSw3PeW8uumAgCw4PeeUn+aIkOS7o+eggSw5Pea4heepuuaVsOaNriIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGJ1c2luZXNzVHlwZTsKKworICAgIC8qKiDkuJrliqHnsbvlnovmlbDnu4QgKi8KKyAgICBwcml2YXRlIEludGVnZXJbXSBidXNpbmVzc1R5cGVzOworCisgICAgLyoqIOivt+axguaWueazlSAqLworICAgIEBFeGNlbChuYW1lID0gIuivt+axguaWueazlSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOworCisgICAgLyoqIOivt+axguaWueW8jyAqLworICAgIEBFeGNlbChuYW1lID0gIuivt+axguaWueW8jyIpCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdE1ldGhvZDsKKworICAgIC8qKiDmk43kvZznsbvliKvvvIgw5YW25a6DIDHlkI7lj7DnlKjmiLcgMuaJi+acuuerr+eUqOaIt++8iSAqLworICAgIEBFeGNlbChuYW1lID0gIuaTjeS9nOexu+WIqyIsIHJlYWRDb252ZXJ0ZXJFeHAgPSAiMD3lhbblroMsMT3lkI7lj7DnlKjmiLcsMj3miYvmnLrnq6/nlKjmiLciKQorICAgIHByaXZhdGUgSW50ZWdlciBvcGVyYXRvclR5cGU7CisKKyAgICAvKiog5pON5L2c5Lq65ZGYICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5pON5L2c5Lq65ZGYIikKKyAgICBwcml2YXRlIFN0cmluZyBvcGVyTmFtZTsKKworICAgIC8qKiDpg6jpl6jlkI3np7AgKi8KKyAgICBARXhjZWwobmFtZSA9ICLpg6jpl6jlkI3np7AiKQorICAgIHByaXZhdGUgU3RyaW5nIGRlcHROYW1lOworCisgICAgLyoqIOivt+axgnVybCAqLworICAgIEBFeGNlbChuYW1lID0gIuivt+axguWcsOWdgCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgb3BlclVybDsKKworICAgIC8qKiDmk43kvZzlnLDlnYAgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZzlnLDlnYAiKQorICAgIHByaXZhdGUgU3RyaW5nIG9wZXJJcDsKKworICAgIC8qKiDmk43kvZzlnLDngrkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLmk43kvZzlnLDngrkiKQorICAgIHByaXZhdGUgU3RyaW5nIG9wZXJMb2NhdGlvbjsKKworICAgIC8qKiDor7fmsYLlj4LmlbAgKi8KKyAgICBARXhjZWwobmFtZSA9ICLor7fmsYLlj4LmlbAiKQorICAgIHByaXZhdGUgU3RyaW5nIG9wZXJQYXJhbTsKKworICAgIC8qKiDov5Tlm57lj4LmlbAgKi8KKyAgICBARXhjZWwobmFtZSA9ICLov5Tlm57lj4LmlbAiKQorICAgIHByaXZhdGUgU3RyaW5nIGpzb25SZXN1bHQ7CisKKyAgICAvKiog5pON5L2c54q25oCB77yIMOato+W4uCAx5byC5bi477yJICovCisgICAgQEV4Y2VsKG5hbWUgPSAi54q25oCBIiwgcmVhZENvbnZlcnRlckV4cCA9ICIwPeato+W4uCwxPeW8guW4uCIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIHN0YXR1czsKKworICAgIC8qKiDplJnor6/mtojmga8gKi8KKyAgICBARXhjZWwobmFtZSA9ICLplJnor6/mtojmga8iKQorICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTXNnOworCisgICAgLyoqIOaTjeS9nOaXtumXtCAqLworICAgIEBKc29uRm9ybWF0KHBhdHRlcm4gPSAieXl5eS1NTS1kZCBISDptbTpzcyIpCisgICAgQEV4Y2VsKG5hbWUgPSAi5pON5L2c5pe26Ze0Iiwgd2lkdGggPSAzMCwgZGF0ZUZvcm1hdCA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzIikKKyAgICBwcml2YXRlIERhdGUgb3BlclRpbWU7CisKKyAgICAvKiog5raI6ICX5pe26Ze0ICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5raI6ICX5pe26Ze0Iiwgc3VmZml4ID0gIuavq+enkiIpCisgICAgcHJpdmF0ZSBMb25nIGNvc3RUaW1lOworCisgICAgcHVibGljIExvbmcgZ2V0T3BlcklkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVySWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BlcklkKExvbmcgb3BlcklkKQorICAgIHsKKyAgICAgICAgdGhpcy5vcGVySWQgPSBvcGVySWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKQorICAgIHsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldEJ1c2luZXNzVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gYnVzaW5lc3NUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJ1c2luZXNzVHlwZShJbnRlZ2VyIGJ1c2luZXNzVHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuYnVzaW5lc3NUeXBlID0gYnVzaW5lc3NUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyW10gZ2V0QnVzaW5lc3NUeXBlcygpCisgICAgeworICAgICAgICByZXR1cm4gYnVzaW5lc3NUeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc1R5cGVzKEludGVnZXJbXSBidXNpbmVzc1R5cGVzKQorICAgIHsKKyAgICAgICAgdGhpcy5idXNpbmVzc1R5cGVzID0gYnVzaW5lc3NUeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpCisgICAgeworICAgICAgICByZXR1cm4gbWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXF1ZXN0TWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RNZXRob2QoU3RyaW5nIHJlcXVlc3RNZXRob2QpCisgICAgeworICAgICAgICB0aGlzLnJlcXVlc3RNZXRob2QgPSByZXF1ZXN0TWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9wZXJhdG9yVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gb3BlcmF0b3JUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdG9yVHlwZShJbnRlZ2VyIG9wZXJhdG9yVHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMub3BlcmF0b3JUeXBlID0gb3BlcmF0b3JUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3Blck5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJOYW1lKFN0cmluZyBvcGVyTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMub3Blck5hbWUgPSBvcGVyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcHROYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZXB0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXB0TmFtZShTdHJpbmcgZGVwdE5hbWUpCisgICAgeworICAgICAgICB0aGlzLmRlcHROYW1lID0gZGVwdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcGVyVXJsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVyVXJsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJVcmwoU3RyaW5nIG9wZXJVcmwpCisgICAgeworICAgICAgICB0aGlzLm9wZXJVcmwgPSBvcGVyVXJsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcklwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVySXA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BlcklwKFN0cmluZyBvcGVySXApCisgICAgeworICAgICAgICB0aGlzLm9wZXJJcCA9IG9wZXJJcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJMb2NhdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gb3BlckxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJMb2NhdGlvbihTdHJpbmcgb3BlckxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgdGhpcy5vcGVyTG9jYXRpb24gPSBvcGVyTG9jYXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcGVyUGFyYW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJQYXJhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVyUGFyYW0oU3RyaW5nIG9wZXJQYXJhbSkKKyAgICB7CisgICAgICAgIHRoaXMub3BlclBhcmFtID0gb3BlclBhcmFtOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNvblJlc3VsdCgpCisgICAgeworICAgICAgICByZXR1cm4ganNvblJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKc29uUmVzdWx0KFN0cmluZyBqc29uUmVzdWx0KQorICAgIHsKKyAgICAgICAgdGhpcy5qc29uUmVzdWx0ID0ganNvblJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRTdGF0dXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSW50ZWdlciBzdGF0dXMpCisgICAgeworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTXNnKCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvck1zZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck1zZyhTdHJpbmcgZXJyb3JNc2cpCisgICAgeworICAgICAgICB0aGlzLmVycm9yTXNnID0gZXJyb3JNc2c7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0T3BlclRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJUaW1lKERhdGUgb3BlclRpbWUpCisgICAgeworICAgICAgICB0aGlzLm9wZXJUaW1lID0gb3BlclRpbWU7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0Q29zdFRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvc3RUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvc3RUaW1lKExvbmcgY29zdFRpbWUpCisgICAgeworICAgICAgICB0aGlzLmNvc3RUaW1lID0gY29zdFRpbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzUG9zdC5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzUG9zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGJkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNQb3N0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5kb21haW47CisKK2ltcG9ydCBqYWthcnRhLnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90Qmxhbms7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamFrYXJ0YS52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5hbm5vdGF0aW9uLkV4Y2VsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5FeGNlbC5Db2x1bW5UeXBlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uQmFzZUVudGl0eTsKKworLyoqCisgKiDlspfkvY3ooaggc3lzX3Bvc3QKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgY2xhc3MgU3lzUG9zdCBleHRlbmRzIEJhc2VFbnRpdHkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIC8qKiDlspfkvY3luo/lj7cgKi8KKyAgICBARXhjZWwobmFtZSA9ICLlspfkvY3luo/lj7ciLCBjZWxsVHlwZSA9IENvbHVtblR5cGUuTlVNRVJJQykKKyAgICBwcml2YXRlIExvbmcgcG9zdElkOworCisgICAgLyoqIOWyl+S9jee8lueggSAqLworICAgIEBFeGNlbChuYW1lID0gIuWyl+S9jee8lueggSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgcG9zdENvZGU7CisKKyAgICAvKiog5bKX5L2N5ZCN56ewICovCisgICAgQEV4Y2VsKG5hbWUgPSAi5bKX5L2N5ZCN56ewIikKKyAgICBwcml2YXRlIFN0cmluZyBwb3N0TmFtZTsKKworICAgIC8qKiDlspfkvY3mjpLluo8gKi8KKyAgICBARXhjZWwobmFtZSA9ICLlspfkvY3mjpLluo8iKQorICAgIHByaXZhdGUgSW50ZWdlciBwb3N0U29ydDsKKworICAgIC8qKiDnirbmgIHvvIgw5q2j5bi4IDHlgZznlKjvvIkgKi8KKyAgICBARXhjZWwobmFtZSA9ICLnirbmgIEiLCByZWFkQ29udmVydGVyRXhwID0gIjA95q2j5bi4LDE95YGc55SoIikKKyAgICBwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKyAgICAvKiog55So5oi35piv5ZCm5a2Y5Zyo5q2k5bKX5L2N5qCH6K+GIOm7mOiupOS4jeWtmOWcqCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnID0gZmFsc2U7CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQb3N0SWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvc3RJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3N0SWQoTG9uZyBwb3N0SWQpCisgICAgeworICAgICAgICB0aGlzLnBvc3RJZCA9IHBvc3RJZDsKKyAgICB9CisKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLlspfkvY3nvJbnoIHkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1pbiA9IDAsIG1heCA9IDY0LCBtZXNzYWdlID0gIuWyl+S9jee8lueggemVv+W6puS4jeiDvei2hei/hzY05Liq5a2X56ymIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBvc3RDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwb3N0Q29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3N0Q29kZShTdHJpbmcgcG9zdENvZGUpCisgICAgeworICAgICAgICB0aGlzLnBvc3RDb2RlID0gcG9zdENvZGU7CisgICAgfQorCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi5bKX5L2N5ZCN56ew5LiN6IO95Li656m6IikKKyAgICBAU2l6ZShtaW4gPSAwLCBtYXggPSA1MCwgbWVzc2FnZSA9ICLlspfkvY3lkI3np7Dplb/luqbkuI3og73otoXov4c1MOS4quWtl+espiIpCisgICAgcHVibGljIFN0cmluZyBnZXRQb3N0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9zdE5hbWUoU3RyaW5nIHBvc3ROYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5wb3N0TmFtZSA9IHBvc3ROYW1lOworICAgIH0KKworICAgIEBOb3ROdWxsKG1lc3NhZ2UgPSAi5pi+56S66aG65bqP5LiN6IO95Li656m6IikKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRQb3N0U29ydCgpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdFNvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9zdFNvcnQoSW50ZWdlciBwb3N0U29ydCkKKyAgICB7CisgICAgICAgIHRoaXMucG9zdFNvcnQgPSBwb3N0U29ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKQorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmbGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZsYWcoYm9vbGVhbiBmbGFnKQorICAgIHsKKyAgICAgICAgdGhpcy5mbGFnID0gZmxhZzsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJwb3N0SWQiLCBnZXRQb3N0SWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInBvc3RDb2RlIiwgZ2V0UG9zdENvZGUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInBvc3ROYW1lIiwgZ2V0UG9zdE5hbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInBvc3RTb3J0IiwgZ2V0UG9zdFNvcnQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInN0YXR1cyIsIGdldFN0YXR1cygpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlQnkiLCBnZXRDcmVhdGVCeSgpKQorICAgICAgICAgICAgLmFwcGVuZCgiY3JlYXRlVGltZSIsIGdldENyZWF0ZVRpbWUoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZUJ5IiwgZ2V0VXBkYXRlQnkoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInVwZGF0ZVRpbWUiLCBnZXRVcGRhdGVUaW1lKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJyZW1hcmsiLCBnZXRSZW1hcmsoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1JvbGVEZXB0LmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNSb2xlRGVwdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjIxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNSb2xlRGVwdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5kb21haW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKKworLyoqCisgKiDop5LoibLlkozpg6jpl6jlhbPogZQgc3lzX3JvbGVfZGVwdAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNSb2xlRGVwdAoreworICAgIC8qKiDop5LoibJJRCAqLworICAgIHByaXZhdGUgTG9uZyByb2xlSWQ7CisgICAgCisgICAgLyoqIOmDqOmXqElEICovCisgICAgcHJpdmF0ZSBMb25nIGRlcHRJZDsKKworICAgIHB1YmxpYyBMb25nIGdldFJvbGVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZUlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVJZChMb25nIHJvbGVJZCkKKyAgICB7CisgICAgICAgIHRoaXMucm9sZUlkID0gcm9sZUlkOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldERlcHRJZCgpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdElkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlcHRJZChMb25nIGRlcHRJZCkKKyAgICB7CisgICAgICAgIHRoaXMuZGVwdElkID0gZGVwdElkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgicm9sZUlkIiwgZ2V0Um9sZUlkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJkZXB0SWQiLCBnZXREZXB0SWQoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1JvbGVNZW51LmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNSb2xlTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTBhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi9TeXNSb2xlTWVudS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5kb21haW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKKworLyoqCisgKiDop5LoibLlkozoj5zljZXlhbPogZQgc3lzX3JvbGVfbWVudQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNSb2xlTWVudQoreworICAgIC8qKiDop5LoibJJRCAqLworICAgIHByaXZhdGUgTG9uZyByb2xlSWQ7CisgICAgCisgICAgLyoqIOiPnOWNlUlEICovCisgICAgcHJpdmF0ZSBMb25nIG1lbnVJZDsKKworICAgIHB1YmxpYyBMb25nIGdldFJvbGVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZUlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVJZChMb25nIHJvbGVJZCkKKyAgICB7CisgICAgICAgIHRoaXMucm9sZUlkID0gcm9sZUlkOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldE1lbnVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gbWVudUlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnVJZChMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIHRoaXMubWVudUlkID0gbWVudUlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdCdWlsZGVyKHRoaXMsVG9TdHJpbmdTdHlsZS5NVUxUSV9MSU5FX1NUWUxFKQorICAgICAgICAgICAgLmFwcGVuZCgicm9sZUlkIiwgZ2V0Um9sZUlkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCJtZW51SWQiLCBnZXRNZW51SWQoKSkKKyAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJPbmxpbmUuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJPbmxpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmJkMzE4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzVXNlck9ubGluZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluOworCisvKioKKyAqIOW9k+WJjeWcqOe6v+S8muivnQorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBTeXNVc2VyT25saW5lCit7CisgICAgLyoqIOS8muivnee8luWPtyAqLworICAgIHByaXZhdGUgU3RyaW5nIHRva2VuSWQ7CisKKyAgICAvKiog6YOo6Zeo5ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVwdE5hbWU7CisKKyAgICAvKiog55So5oi35ZCN56ewICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWU7CisKKyAgICAvKiog55m75b2VSVDlnLDlnYAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpcGFkZHI7CisKKyAgICAvKiog55m75b2V5Zyw5Z2AICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9naW5Mb2NhdGlvbjsKKworICAgIC8qKiDmtY/op4jlmajnsbvlnosgKi8KKyAgICBwcml2YXRlIFN0cmluZyBicm93c2VyOworCisgICAgLyoqIOaTjeS9nOezu+e7nyAqLworICAgIHByaXZhdGUgU3RyaW5nIG9zOworCisgICAgLyoqIOeZu+W9leaXtumXtCAqLworICAgIHByaXZhdGUgTG9uZyBsb2dpblRpbWU7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuSWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRva2VuSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG9rZW5JZChTdHJpbmcgdG9rZW5JZCkKKyAgICB7CisgICAgICAgIHRoaXMudG9rZW5JZCA9IHRva2VuSWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXB0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwdE5hbWUoU3RyaW5nIGRlcHROYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5kZXB0TmFtZSA9IGRlcHROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElwYWRkcigpCisgICAgeworICAgICAgICByZXR1cm4gaXBhZGRyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElwYWRkcihTdHJpbmcgaXBhZGRyKQorICAgIHsKKyAgICAgICAgdGhpcy5pcGFkZHIgPSBpcGFkZHI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2dpbkxvY2F0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luTG9jYXRpb24oU3RyaW5nIGxvZ2luTG9jYXRpb24pCisgICAgeworICAgICAgICB0aGlzLmxvZ2luTG9jYXRpb24gPSBsb2dpbkxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJvd3NlcigpCisgICAgeworICAgICAgICByZXR1cm4gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCcm93c2VyKFN0cmluZyBicm93c2VyKQorICAgIHsKKyAgICAgICAgdGhpcy5icm93c2VyID0gYnJvd3NlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcyhTdHJpbmcgb3MpCisgICAgeworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0TG9naW5UaW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpblRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9naW5UaW1lKExvbmcgbG9naW5UaW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5sb2dpblRpbWUgPSBsb2dpblRpbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzVXNlclBvc3QuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJQb3N0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4YzQxNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJQb3N0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLmRvbWFpbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworCisvKioKKyAqIOeUqOaIt+WSjOWyl+S9jeWFs+iBlCBzeXNfdXNlcl9wb3N0CisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN5c1VzZXJQb3N0Cit7CisgICAgLyoqIOeUqOaIt0lEICovCisgICAgcHJpdmF0ZSBMb25nIHVzZXJJZDsKKyAgICAKKyAgICAvKiog5bKX5L2NSUQgKi8KKyAgICBwcml2YXRlIExvbmcgcG9zdElkOworCisgICAgcHVibGljIExvbmcgZ2V0VXNlcklkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcklkKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0UG9zdElkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwb3N0SWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9zdElkKExvbmcgcG9zdElkKQorICAgIHsKKyAgICAgICAgdGhpcy5wb3N0SWQgPSBwb3N0SWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJ1c2VySWQiLCBnZXRVc2VySWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInBvc3RJZCIsIGdldFBvc3RJZCgpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vU3lzVXNlclJvbGUuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJSb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxNTgxMAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL1N5c1VzZXJSb2xlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLmRvbWFpbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ1N0eWxlOworCisvKioKKyAqIOeUqOaIt+WSjOinkuiJsuWFs+iBlCBzeXNfdXNlcl9yb2xlCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGNsYXNzIFN5c1VzZXJSb2xlCit7CisgICAgLyoqIOeUqOaIt0lEICovCisgICAgcHJpdmF0ZSBMb25nIHVzZXJJZDsKKyAgICAKKyAgICAvKiog6KeS6ImySUQgKi8KKyAgICBwcml2YXRlIExvbmcgcm9sZUlkOworCisgICAgcHVibGljIExvbmcgZ2V0VXNlcklkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcklkKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0Um9sZUlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiByb2xlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sZUlkKExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgdGhpcy5yb2xlSWQgPSByb2xlSWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1N0cmluZ0J1aWxkZXIodGhpcyxUb1N0cmluZ1N0eWxlLk1VTFRJX0xJTkVfU1RZTEUpCisgICAgICAgICAgICAuYXBwZW5kKCJ1c2VySWQiLCBnZXRVc2VySWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoInJvbGVJZCIsIGdldFJvbGVJZCgpKQorICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vdm8vTWV0YVZvLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi92by9NZXRhVm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ1ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9kb21haW4vdm8vTWV0YVZvLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4udm87CisKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworCisvKioKKyAqIOi3r+eUseaYvuekuuS/oeaBrworICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhVm8KK3sKKyAgICAvKioKKyAgICAgKiDorr7nva7or6Xot6/nlLHlnKjkvqfovrnmoI/lkozpnaLljIXlsZHkuK3lsZXnpLrnmoTlkI3lrZcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKworICAgIC8qKgorICAgICAqIOiuvue9ruivpei3r+eUseeahOWbvuagh++8jOWvueW6lOi3r+W+hHNyYy9hc3NldHMvaWNvbnMvc3ZnCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaWNvbjsKKworICAgIC8qKgorICAgICAqIOiuvue9ruS4unRydWXvvIzliJnkuI3kvJrooqsgPGtlZXAtYWxpdmU+57yT5a2YCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vQ2FjaGU7CisKKyAgICAvKioKKyAgICAgKiDlhoXpk77lnLDlnYDvvIhodHRwKHMpOi8v5byA5aS077yJCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGluazsKKworICAgIHB1YmxpYyBNZXRhVm8oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YVZvKFN0cmluZyB0aXRsZSwgU3RyaW5nIGljb24pCisgICAgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgfQorCisgICAgcHVibGljIE1ldGFWbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBpY29uLCBib29sZWFuIG5vQ2FjaGUpCisgICAgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgICAgIHRoaXMubm9DYWNoZSA9IG5vQ2FjaGU7CisgICAgfQorCisgICAgcHVibGljIE1ldGFWbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBpY29uLCBTdHJpbmcgbGluaykKKyAgICB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICAgICAgdGhpcy5pY29uID0gaWNvbjsKKyAgICAgICAgdGhpcy5saW5rID0gbGluazsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YVZvKFN0cmluZyB0aXRsZSwgU3RyaW5nIGljb24sIGJvb2xlYW4gbm9DYWNoZSwgU3RyaW5nIGxpbmspCisgICAgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgICAgIHRoaXMubm9DYWNoZSA9IG5vQ2FjaGU7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc2h0dHAobGluaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGluayA9IGxpbms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vQ2FjaGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vQ2FjaGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm9DYWNoZShib29sZWFuIG5vQ2FjaGUpCisgICAgeworICAgICAgICB0aGlzLm5vQ2FjaGUgPSBub0NhY2hlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkKKyAgICB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEljb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGljb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihTdHJpbmcgaWNvbikKKyAgICB7CisgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5rKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsaW5rOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspCisgICAgeworICAgICAgICB0aGlzLmxpbmsgPSBsaW5rOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vZG9tYWluL3ZvL1JvdXRlclZvLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi92by9Sb3V0ZXJWby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmY4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL2RvbWFpbi92by9Sb3V0ZXJWby5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLnZvOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkluY2x1ZGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICog6Lev55Sx6YWN572u5L+h5oGvCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQEpzb25JbmNsdWRlKEpzb25JbmNsdWRlLkluY2x1ZGUuTk9OX0VNUFRZKQorcHVibGljIGNsYXNzIFJvdXRlclZvCit7CisgICAgLyoqCisgICAgICog6Lev55Sx5ZCN5a2XCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIOi3r+eUseWcsOWdgAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKbpmpDol4/ot6/nlLHvvIzlvZPorr7nva4gdHJ1ZSDnmoTml7blgJnor6Xot6/nlLHkuI3kvJrlho3kvqfovrnmoI/lh7rnjrAKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGlkZGVuOworCisgICAgLyoqCisgICAgICog6YeN5a6a5ZCR5Zyw5Z2A77yM5b2T6K6+572uIG5vUmVkaXJlY3Qg55qE5pe25YCZ6K+l6Lev55Sx5Zyo6Z2i5YyF5bGR5a+86Iiq5Lit5LiN5Y+v6KKr54K55Ye7CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVkaXJlY3Q7CisKKyAgICAvKioKKyAgICAgKiDnu4Tku7blnLDlnYAKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnQ7CisKKyAgICAvKioKKyAgICAgKiDot6/nlLHlj4LmlbDvvJrlpoIgeyJpZCI6IDEsICJuYW1lIjogInJ5In0KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeTsKKworICAgIC8qKgorICAgICAqIOW9k+S9oOS4gOS4qui3r+eUseS4i+mdoueahCBjaGlsZHJlbiDlo7DmmI7nmoTot6/nlLHlpKfkuo4x5Liq5pe277yM6Ieq5Yqo5Lya5Y+Y5oiQ5bWM5aWX55qE5qih5byPLS3lpoLnu4Tku7bpobXpnaIKKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gYWx3YXlzU2hvdzsKKworICAgIC8qKgorICAgICAqIOWFtuS7luWFg+e0oAorICAgICAqLworICAgIHByaXZhdGUgTWV0YVZvIG1ldGE7CisKKyAgICAvKioKKyAgICAgKiDlrZDot6/nlLEKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8Um91dGVyVm8+IGNoaWxkcmVuOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKQorICAgIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRIaWRkZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGhpZGRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIaWRkZW4oYm9vbGVhbiBoaWRkZW4pCisgICAgeworICAgICAgICB0aGlzLmhpZGRlbiA9IGhpZGRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZGlyZWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWRpcmVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWRpcmVjdChTdHJpbmcgcmVkaXJlY3QpCisgICAgeworICAgICAgICB0aGlzLnJlZGlyZWN0ID0gcmVkaXJlY3Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudCkKKyAgICB7CisgICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkKKyAgICB7CisgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRBbHdheXNTaG93KCkKKyAgICB7CisgICAgICAgIHJldHVybiBhbHdheXNTaG93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFsd2F5c1Nob3coQm9vbGVhbiBhbHdheXNTaG93KQorICAgIHsKKyAgICAgICAgdGhpcy5hbHdheXNTaG93ID0gYWx3YXlzU2hvdzsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YVZvIGdldE1ldGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0YShNZXRhVm8gbWV0YSkKKyAgICB7CisgICAgICAgIHRoaXMubWV0YSA9IG1ldGE7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Um91dGVyVm8+IGdldENoaWxkcmVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0PFJvdXRlclZvPiBjaGlsZHJlbikKKyAgICB7CisgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNDb25maWdNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c0NvbmZpZ01hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDQ5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNDb25maWdNYXBwZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzQ29uZmlnOworCisvKioKKyAqIOWPguaVsOmFjee9riDmlbDmja7lsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c0NvbmZpZ01hcHBlcgoreworICAgIC8qKgorICAgICAqIOafpeivouWPguaVsOmFjee9ruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWcg5Y+C5pWw6YWN572u5L+h5oGvCisgICAgICogQHJldHVybiDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzQ29uZmlnIHNlbGVjdENvbmZpZyhTeXNDb25maWcgY29uZmlnKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h0lE5p+l6K+i6YWN572uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZ0lkIOWPguaVsElECisgICAgICogQHJldHVybiDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzQ29uZmlnIHNlbGVjdENvbmZpZ0J5SWQoTG9uZyBjb25maWdJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Llj4LmlbDphY3nva7liJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g5Y+C5pWw6YWN572u6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzQ29uZmlnPiBzZWxlY3RDb25maWdMaXN0KFN5c0NvbmZpZyBjb25maWcpOworCisgICAgLyoqCisgICAgICog5qC55o2u6ZSu5ZCN5p+l6K+i5Y+C5pWw6YWN572u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZ0tleSDlj4LmlbDplK7lkI0KKyAgICAgKiBAcmV0dXJuIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNDb25maWcgY2hlY2tDb25maWdLZXlVbmlxdWUoU3RyaW5nIGNvbmZpZ0tleSk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7lj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRDb25maWcoU3lzQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVDb25maWcoU3lzQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTlj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnSWQg5Y+C5pWwSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlQ29uZmlnQnlJZChMb25nIGNvbmZpZ0lkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWPguaVsOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWdJZHMg6ZyA6KaB5Yig6Zmk55qE5Y+C5pWwSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlQ29uZmlnQnlJZHMoTG9uZ1tdIGNvbmZpZ0lkcyk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNEZXB0TWFwcGVyLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNEZXB0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YTliNgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c0RlcHRNYXBwZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLm1hcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RlcHQ7CisKKy8qKgorICog6YOo6Zeo566h55CGIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzRGVwdE1hcHBlcgoreworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOeuoeeQhuaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g6YOo6Zeo5L+h5oGv6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzRGVwdD4gc2VsZWN0RGVwdExpc3QoU3lzRGVwdCBkZXB0KTsKKworICAgIC8qKgorICAgICAqIOagueaNruinkuiJsklE5p+l6K+i6YOo6Zeo5qCR5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEBwYXJhbSBkZXB0Q2hlY2tTdHJpY3RseSDpg6jpl6jmoJHpgInmi6npobnmmK/lkKblhbPogZTmmL7npLoKKyAgICAgKiBAcmV0dXJuIOmAieS4remDqOmXqOWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PExvbmc+IHNlbGVjdERlcHRMaXN0QnlSb2xlSWQoQFBhcmFtKCJyb2xlSWQiKSBMb25nIHJvbGVJZCwgQFBhcmFtKCJkZXB0Q2hlY2tTdHJpY3RseSIpIGJvb2xlYW4gZGVwdENoZWNrU3RyaWN0bHkpOworCisgICAgLyoqCisgICAgICog5qC55o2u6YOo6ZeoSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdElkIOmDqOmXqElECisgICAgICogQHJldHVybiDpg6jpl6jkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzRGVwdCBzZWxlY3REZXB0QnlJZChMb25nIGRlcHRJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja5JROafpeivouaJgOacieWtkOmDqOmXqAorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOmDqOmXqOWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0RlcHQ+IHNlbGVjdENoaWxkcmVuRGVwdEJ5SWQoTG9uZyBkZXB0SWQpOworCisgICAgLyoqCisgICAgICog5qC55o2uSUTmn6Xor6LmiYDmnInlrZDpg6jpl6jvvIjmraPluLjnirbmgIHvvIkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdElkIOmDqOmXqElECisgICAgICogQHJldHVybiDlrZDpg6jpl6jmlbAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdE5vcm1hbENoaWxkcmVuRGVwdEJ5SWQoTG9uZyBkZXB0SWQpOworCisgICAgLyoqCisgICAgICog5piv5ZCm5a2Y5Zyo5a2Q6IqC54K5CisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBoYXNDaGlsZEJ5RGVwdElkKExvbmcgZGVwdElkKTsKKworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOaYr+WQpuWtmOWcqOeUqOaItworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgY2hlY2tEZXB0RXhpc3RVc2VyKExvbmcgZGVwdElkKTsKKworICAgIC8qKgorICAgICAqIOagoemqjOmDqOmXqOWQjeensOaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0TmFtZSDpg6jpl6jlkI3np7AKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQg54i26YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBTeXNEZXB0IGNoZWNrRGVwdE5hbWVVbmlxdWUoQFBhcmFtKCJkZXB0TmFtZSIpIFN0cmluZyBkZXB0TmFtZSwgQFBhcmFtKCJwYXJlbnRJZCIpIExvbmcgcGFyZW50SWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe6YOo6Zeo5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHQg6YOo6Zeo5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydERlcHQoU3lzRGVwdCBkZXB0KTsKKworICAgIC8qKgorICAgICAqIOS/ruaUuemDqOmXqOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEZXB0KFN5c0RlcHQgZGVwdCk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnmiYDlnKjpg6jpl6jmraPluLjnirbmgIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdElkcyDpg6jpl6hJROe7hAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURlcHRTdGF0dXNOb3JtYWwoTG9uZ1tdIGRlcHRJZHMpOworCisgICAgLyoqCisgICAgICog5L+u5pS55a2Q5YWD57Sg5YWz57O7CisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRzIOWtkOWFg+e0oAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEZXB0Q2hpbGRyZW4oQFBhcmFtKCJkZXB0cyIpIExpc3Q8U3lzRGVwdD4gZGVwdHMpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk6YOo6Zeo566h55CG5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVEZXB0QnlJZChMb25nIGRlcHRJZCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNEaWN0RGF0YU1hcHBlci5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzRGljdERhdGFNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQxZjFlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzRGljdERhdGFNYXBwZXIuamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuUGFyYW07CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdERhdGE7CisKKy8qKgorICog5a2X5YW46KGoIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzRGljdERhdGFNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LlrZflhbjmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdERhdGEg5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogQHJldHVybiDlrZflhbjmlbDmja7pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNEaWN0RGF0YT4gc2VsZWN0RGljdERhdGFMaXN0KFN5c0RpY3REYXRhIGRpY3REYXRhKTsKKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei+afpeivouWtl+WFuOaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnosKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0RpY3REYXRhPiBzZWxlY3REaWN0RGF0YUJ5VHlwZShTdHJpbmcgZGljdFR5cGUpOworCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5ZKM5a2X5YW46ZSu5YC85p+l6K+i5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEBwYXJhbSBkaWN0VmFsdWUg5a2X5YW46ZSu5YC8CisgICAgICogQHJldHVybiDlrZflhbjmoIfnrb4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNlbGVjdERpY3RMYWJlbChAUGFyYW0oImRpY3RUeXBlIikgU3RyaW5nIGRpY3RUeXBlLCBAUGFyYW0oImRpY3RWYWx1ZSIpIFN0cmluZyBkaWN0VmFsdWUpOworCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW45pWw5o2uSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdENvZGUg5a2X5YW45pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyBTeXNEaWN0RGF0YSBzZWxlY3REaWN0RGF0YUJ5SWQoTG9uZyBkaWN0Q29kZSk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LlrZflhbjmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDlrZflhbjmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvdW50RGljdERhdGFCeVR5cGUoU3RyaW5nIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+Wtl+WFuElE5Yig6Zmk5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RDb2RlIOWtl+WFuOaVsOaNrklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZURpY3REYXRhQnlJZChMb25nIGRpY3RDb2RlKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0Q29kZXMg6ZyA6KaB5Yig6Zmk55qE5a2X5YW45pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlRGljdERhdGFCeUlkcyhMb25nW10gZGljdENvZGVzKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0RGF0YSDlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0RGljdERhdGEoU3lzRGljdERhdGEgZGljdERhdGEpOworCisgICAgLyoqCisgICAgICog5L+u5pS55a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3REYXRhIOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEaWN0RGF0YShTeXNEaWN0RGF0YSBkaWN0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiDlkIzmraXkv67mlLnlrZflhbjnsbvlnosKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkRGljdFR5cGUg5pen5a2X5YW457G75Z6LCisgICAgICogQHBhcmFtIG5ld0RpY3RUeXBlIOaWsOaXp+Wtl+WFuOexu+WeiworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEaWN0RGF0YVR5cGUoQFBhcmFtKCJvbGREaWN0VHlwZSIpIFN0cmluZyBvbGREaWN0VHlwZSwgQFBhcmFtKCJuZXdEaWN0VHlwZSIpIFN0cmluZyBuZXdEaWN0VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNEaWN0VHlwZU1hcHBlci5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzRGljdFR5cGVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI0OGZiCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzRGljdFR5cGVNYXBwZXIuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdFR5cGU7CisKKy8qKgorICog5a2X5YW46KGoIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzRGljdFR5cGVNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LlrZflhbjnsbvlnosKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogQHJldHVybiDlrZflhbjnsbvlnovpm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNEaWN0VHlwZT4gc2VsZWN0RGljdFR5cGVMaXN0KFN5c0RpY3RUeXBlIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOagueaNruaJgOacieWtl+WFuOexu+WeiworICAgICAqIAorICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6L6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzRGljdFR5cGU+IHNlbGVjdERpY3RUeXBlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnotJROafpeivouS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0SWQg5a2X5YW457G75Z6LSUQKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOexu+WeiworICAgICAqLworICAgIHB1YmxpYyBTeXNEaWN0VHlwZSBzZWxlY3REaWN0VHlwZUJ5SWQoTG9uZyBkaWN0SWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6LCisgICAgICovCisgICAgcHVibGljIFN5c0RpY3RUeXBlIHNlbGVjdERpY3RUeXBlQnlUeXBlKFN0cmluZyBkaWN0VHlwZSk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4flrZflhbhJROWIoOmZpOWtl+WFuOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0SWQg5a2X5YW4SUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlRGljdFR5cGVCeUlkKExvbmcgZGljdElkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWtl+WFuOexu+Wei+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0SWRzIOmcgOimgeWIoOmZpOeahOWtl+WFuElECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZURpY3RUeXBlQnlJZHMoTG9uZ1tdIGRpY3RJZHMpOworCisgICAgLyoqCisgICAgICog5paw5aKe5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+Wei+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnREaWN0VHlwZShTeXNEaWN0VHlwZSBkaWN0VHlwZSk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlrZflhbjnsbvlnovkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZURpY3RUeXBlKFN5c0RpY3RUeXBlIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOagoemqjOWtl+WFuOexu+Wei+ensOaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnosKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBTeXNEaWN0VHlwZSBjaGVja0RpY3RUeXBlVW5pcXVlKFN0cmluZyBkaWN0VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNMb2dpbmluZm9yTWFwcGVyLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNMb2dpbmluZm9yTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ODY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c0xvZ2luaW5mb3JNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTG9naW5pbmZvcjsKKworLyoqCisgKiDns7vnu5/orr/pl67ml6Xlv5fmg4XlhrXkv6Hmga8g5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBTeXNMb2dpbmluZm9yTWFwcGVyCit7CisgICAgLyoqCisgICAgICog5paw5aKe57O757uf55m75b2V5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIGxvZ2luaW5mb3Ig6K6/6Zeu5pel5b+X5a+56LGhCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zZXJ0TG9naW5pbmZvcihTeXNMb2dpbmluZm9yIGxvZ2luaW5mb3IpOworCisgICAgLyoqCisgICAgICog5p+l6K+i57O757uf55m75b2V5pel5b+X6ZuG5ZCICisgICAgICogCisgICAgICogQHBhcmFtIGxvZ2luaW5mb3Ig6K6/6Zeu5pel5b+X5a+56LGhCisgICAgICogQHJldHVybiDnmbvlvZXorrDlvZXpm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNMb2dpbmluZm9yPiBzZWxlY3RMb2dpbmluZm9yTGlzdChTeXNMb2dpbmluZm9yIGxvZ2luaW5mb3IpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk57O757uf55m75b2V5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIGluZm9JZHMg6ZyA6KaB5Yig6Zmk55qE55m75b2V5pel5b+XSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlTG9naW5pbmZvckJ5SWRzKExvbmdbXSBpbmZvSWRzKTsKKworICAgIC8qKgorICAgICAqIOa4heepuuezu+e7n+eZu+W9leaXpeW/lworICAgICAqIAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBjbGVhbkxvZ2luaW5mb3IoKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c01lbnVNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c01lbnVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWMwYzUwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzTWVudU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuUGFyYW07CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzTWVudTsKKworLyoqCisgKiDoj5zljZXooagg5pWw5o2u5bGCCisgKgorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c01lbnVNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/oj5zljZXliJfooagKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IOiPnOWNleS/oeaBrworICAgICAqIEByZXR1cm4g6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzTWVudT4gc2VsZWN0TWVudUxpc3QoU3lzTWVudSBtZW51KTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt+aJgOacieadg+mZkAorICAgICAqCisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNlbGVjdE1lbnVQZXJtcygpOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi35p+l6K+i57O757uf6I+c5Y2V5YiX6KGoCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOiPnOWNleWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IHNlbGVjdE1lbnVMaXN0QnlVc2VySWQoU3lzTWVudSBtZW51KTsKKworICAgIC8qKgorICAgICAqIOagueaNruinkuiJsklE5p+l6K+i5p2D6ZmQCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g5p2D6ZmQ5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBzZWxlY3RNZW51UGVybXNCeVJvbGVJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivouadg+mZkAorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g5p2D6ZmQ5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBzZWxlY3RNZW51UGVybXNCeVVzZXJJZChMb25nIHVzZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivouiPnOWNlQorICAgICAqCisgICAgICogQHJldHVybiDoj5zljZXliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNNZW51PiBzZWxlY3RNZW51VHJlZUFsbCgpOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6Loj5zljZUKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOiPnOWNleWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IHNlbGVjdE1lbnVUcmVlQnlVc2VySWQoTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u6KeS6ImySUTmn6Xor6Loj5zljZXmoJHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHBhcmFtIG1lbnVDaGVja1N0cmljdGx5IOiPnOWNleagkemAieaLqemhueaYr+WQpuWFs+iBlOaYvuekugorICAgICAqIEByZXR1cm4g6YCJ5Lit6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8TG9uZz4gc2VsZWN0TWVudUxpc3RCeVJvbGVJZChAUGFyYW0oInJvbGVJZCIpIExvbmcgcm9sZUlkLCBAUGFyYW0oIm1lbnVDaGVja1N0cmljdGx5IikgYm9vbGVhbiBtZW51Q2hlY2tTdHJpY3RseSk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7oj5zljZVJROafpeivouS/oeaBrworICAgICAqCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g6I+c5Y2V5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c01lbnUgc2VsZWN0TWVudUJ5SWQoTG9uZyBtZW51SWQpOworCisgICAgLyoqCisgICAgICog5piv5ZCm5a2Y5Zyo6I+c5Y2V5a2Q6IqC54K5CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc0NoaWxkQnlNZW51SWQoTG9uZyBtZW51SWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe6I+c5Y2V5L+h5oGvCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0TWVudShTeXNNZW51IG1lbnUpOworCisgICAgLyoqCisgICAgICog5L+u5pS56I+c5Y2V5L+h5oGvCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlTWVudShTeXNNZW51IG1lbnUpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk6I+c5Y2V566h55CG5L+h5oGvCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZU1lbnVCeUlkKExvbmcgbWVudUlkKTsKKworICAgIC8qKgorICAgICAqIOagoemqjOiPnOWNleWQjeensOaYr+WQpuWUr+S4gAorICAgICAqCisgICAgICogQHBhcmFtIG1lbnVOYW1lIOiPnOWNleWQjeensAorICAgICAqIEBwYXJhbSBwYXJlbnRJZCDniLboj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIFN5c01lbnUgY2hlY2tNZW51TmFtZVVuaXF1ZShAUGFyYW0oIm1lbnVOYW1lIikgU3RyaW5nIG1lbnVOYW1lLCBAUGFyYW0oInBhcmVudElkIikgTG9uZyBwYXJlbnRJZCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNOb3RpY2VNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c05vdGljZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGYwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNOb3RpY2VNYXBwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTm90aWNlOworCisvKioKKyAqIOmAmuefpeWFrOWRiuihqCDmlbDmja7lsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c05vdGljZU1hcHBlcgoreworICAgIC8qKgorICAgICAqIOafpeivouWFrOWRiuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2VJZCDlhazlkYpJRAorICAgICAqIEByZXR1cm4g5YWs5ZGK5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c05vdGljZSBzZWxlY3ROb3RpY2VCeUlkKExvbmcgbm90aWNlSWQpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5YWs5ZGK5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZSDlhazlkYrkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWFrOWRiumbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c05vdGljZT4gc2VsZWN0Tm90aWNlTGlzdChTeXNOb3RpY2Ugbm90aWNlKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuWFrOWRigorICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2Ug5YWs5ZGK5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydE5vdGljZShTeXNOb3RpY2Ugbm90aWNlKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueWFrOWRigorICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2Ug5YWs5ZGK5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZU5vdGljZShTeXNOb3RpY2Ugbm90aWNlKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWFrOWRigorICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2VJZCDlhazlkYpJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVOb3RpY2VCeUlkKExvbmcgbm90aWNlSWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk5YWs5ZGK5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZUlkcyDpnIDopoHliKDpmaTnmoTlhazlkYpJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVOb3RpY2VCeUlkcyhMb25nW10gbm90aWNlSWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c09wZXJMb2dNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c09wZXJMb2dNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWU2NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzT3BlckxvZ01hcHBlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNPcGVyTG9nOworCisvKioKKyAqIOaTjeS9nOaXpeW/lyDmlbDmja7lsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c09wZXJMb2dNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDmlrDlop7mk43kvZzml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5flr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRPcGVybG9nKFN5c09wZXJMb2cgb3BlckxvZyk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/mk43kvZzml6Xlv5fpm4blkIgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5flr7nosaEKKyAgICAgKiBAcmV0dXJuIOaTjeS9nOaXpeW/l+mbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c09wZXJMb2c+IHNlbGVjdE9wZXJMb2dMaXN0KFN5c09wZXJMb2cgb3BlckxvZyk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTns7vnu5/mk43kvZzml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlcklkcyDpnIDopoHliKDpmaTnmoTmk43kvZzml6Xlv5dJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVPcGVyTG9nQnlJZHMoTG9uZ1tdIG9wZXJJZHMpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5pON5L2c5pel5b+X6K+m57uGCisgICAgICogCisgICAgICogQHBhcmFtIG9wZXJJZCDmk43kvZxJRAorICAgICAqIEByZXR1cm4g5pON5L2c5pel5b+X5a+56LGhCisgICAgICovCisgICAgcHVibGljIFN5c09wZXJMb2cgc2VsZWN0T3BlckxvZ0J5SWQoTG9uZyBvcGVySWQpOworCisgICAgLyoqCisgICAgICog5riF56m65pON5L2c5pel5b+XCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW5PcGVyTG9nKCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNQb3N0TWFwcGVyLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNQb3N0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliZTIyNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1Bvc3RNYXBwZXIuamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzUG9zdDsKKworLyoqCisgKiDlspfkvY3kv6Hmga8g5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBTeXNQb3N0TWFwcGVyCit7CisgICAgLyoqCisgICAgICog5p+l6K+i5bKX5L2N5pWw5o2u6ZuG5ZCICisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDlspfkvY3mlbDmja7pm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNQb3N0PiBzZWxlY3RQb3N0TGlzdChTeXNQb3N0IHBvc3QpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5omA5pyJ5bKX5L2NCisgICAgICogCisgICAgICogQHJldHVybiDlspfkvY3liJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNQb3N0PiBzZWxlY3RQb3N0QWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4flspfkvY1JROafpeivouWyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0SWQg5bKX5L2NSUQKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNQb3N0IHNlbGVjdFBvc3RCeUlkKExvbmcgcG9zdElkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE6I635Y+W5bKX5L2N6YCJ5oup5qGG5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit5bKX5L2NSUTliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RQb3N0TGlzdEJ5VXNlcklkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOafpeivoueUqOaIt+aJgOWxnuWyl+S9jee7hAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1Bvc3Q+IHNlbGVjdFBvc3RzQnlVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3RJZCDlspfkvY1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVQb3N0QnlJZChMb25nIHBvc3RJZCk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlspfkvY3kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdElkcyDpnIDopoHliKDpmaTnmoTlspfkvY1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVQb3N0QnlJZHMoTG9uZ1tdIHBvc3RJZHMpOworCisgICAgLyoqCisgICAgICog5L+u5pS55bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVwZGF0ZVBvc3QoU3lzUG9zdCBwb3N0KTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuWyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0IOWyl+S9jeS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRQb3N0KFN5c1Bvc3QgcG9zdCk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozlspfkvY3lkI3np7AKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdE5hbWUg5bKX5L2N5ZCN56ewCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzUG9zdCBjaGVja1Bvc3ROYW1lVW5pcXVlKFN0cmluZyBwb3N0TmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozlspfkvY3nvJbnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdENvZGUg5bKX5L2N57yW56CBCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzUG9zdCBjaGVja1Bvc3RDb2RlVW5pcXVlKFN0cmluZyBwb3N0Q29kZSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNSb2xlRGVwdE1hcHBlci5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzUm9sZURlcHRNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQzYTJmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzUm9sZURlcHRNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzUm9sZURlcHQ7CisKKy8qKgorICog6KeS6Imy5LiO6YOo6Zeo5YWz6IGU6KGoIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzUm9sZURlcHRNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDpgJrov4fop5LoibJJROWIoOmZpOinkuiJsuWSjOmDqOmXqOWFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlSWQg6KeS6ImySUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlUm9sZURlcHRCeVJvbGVJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTop5LoibLpg6jpl6jlhbPogZTkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWRzIOmcgOimgeWIoOmZpOeahOaVsOaNrklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVJvbGVEZXB0KExvbmdbXSBpZHMpOworCisgICAgLyoqCisgICAgICog5p+l6K+i6YOo6Zeo5L2/55So5pWw6YePCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3RDb3VudFJvbGVEZXB0QnlEZXB0SWQoTG9uZyBkZXB0SWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5paw5aKe6KeS6Imy6YOo6Zeo5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVEZXB0TGlzdCDop5LoibLpg6jpl6jliJfooagKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgYmF0Y2hSb2xlRGVwdChMaXN0PFN5c1JvbGVEZXB0PiByb2xlRGVwdExpc3QpOworfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzUm9sZU1hcHBlci5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzUm9sZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmJkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNSb2xlTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNSb2xlOworCisvKioKKyAqIOinkuiJsuihqCDmlbDmja7lsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c1JvbGVNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6Lop5LoibLmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOinkuiJsuaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVMaXN0KFN5c1JvbGUgcm9sZSk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivouinkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVQZXJtaXNzaW9uQnlVc2VySWQoTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5omA5pyJ6KeS6ImyCisgICAgICogCisgICAgICogQHJldHVybiDop5LoibLliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNSb2xlPiBzZWxlY3RSb2xlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROiOt+WPluinkuiJsumAieaLqeahhuWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOmAieS4reinkuiJsklE5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8TG9uZz4gc2VsZWN0Um9sZUxpc3RCeVVzZXJJZChMb25nIHVzZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fop5LoibJJROafpeivouinkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlSWQg6KeS6ImySUQKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNSb2xlIHNlbGVjdFJvbGVCeUlkKExvbmcgcm9sZUlkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE5p+l6K+i6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEByZXR1cm4g6KeS6Imy5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzUm9sZT4gc2VsZWN0Um9sZXNCeVVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozop5LoibLlkI3np7DmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZU5hbWUg6KeS6Imy5ZCN56ewCisgICAgICogQHJldHVybiDop5LoibLkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzUm9sZSBjaGVja1JvbGVOYW1lVW5pcXVlKFN0cmluZyByb2xlTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozop5LoibLmnYPpmZDmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUtleSDop5LoibLmnYPpmZAKKyAgICAgKiBAcmV0dXJuIOinkuiJsuS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNSb2xlIGNoZWNrUm9sZUtleVVuaXF1ZShTdHJpbmcgcm9sZUtleSk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnop5LoibLkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlUm9sZShTeXNSb2xlIHJvbGUpOworCisgICAgLyoqCisgICAgICog5paw5aKe6KeS6Imy5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFJvbGUoU3lzUm9sZSByb2xlKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+inkuiJsklE5Yig6Zmk6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTop5LoibLkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkcyDpnIDopoHliKDpmaTnmoTop5LoibJJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZHMoTG9uZ1tdIHJvbGVJZHMpOworfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzUm9sZU1lbnVNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1JvbGVNZW51TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1JvbGVNZW51TWFwcGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLm1hcHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1JvbGVNZW51OworCisvKioKKyAqIOinkuiJsuS4juiPnOWNleWFs+iBlOihqCDmlbDmja7lsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5c1JvbGVNZW51TWFwcGVyCit7CisgICAgLyoqCisgICAgICog5p+l6K+i6I+c5Y2V5L2/55So5pWw6YePCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBjaGVja01lbnVFeGlzdFJvbGUoTG9uZyBtZW51SWQpOworCisgICAgLyoqCisgICAgICog6YCa6L+H6KeS6ImySUTliKDpmaTop5LoibLlkozoj5zljZXlhbPogZQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVJvbGVNZW51QnlSb2xlSWQoTG9uZyByb2xlSWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6KeS6Imy6I+c5Y2V5YWz6IGU5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGlkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVSb2xlTWVudShMb25nW10gaWRzKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+aWsOWinuinkuiJsuiPnOWNleS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlTWVudUxpc3Qg6KeS6Imy6I+c5Y2V5YiX6KGoCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGJhdGNoUm9sZU1lbnUoTGlzdDxTeXNSb2xlTWVudT4gcm9sZU1lbnVMaXN0KTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1VzZXJNYXBwZXIuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1VzZXJNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUxYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzVXNlck1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuUGFyYW07CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKKworLyoqCisgKiDnlKjmiLfooagg5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBTeXNVc2VyTWFwcGVyCit7CisgICAgLyoqCisgICAgICog5qC55o2u5p2h5Lu25YiG6aG15p+l6K+i55So5oi35YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHN5c1VzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnlKjmiLfkv6Hmga/pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNVc2VyPiBzZWxlY3RVc2VyTGlzdChTeXNVc2VyIHN5c1VzZXIpOworCisgICAgLyoqCisgICAgICog5qC55o2u5p2h5Lu25YiG6aG15p+l6K+i5bey6YWN55So5oi36KeS6Imy5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnlKjmiLfkv6Hmga/pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNVc2VyPiBzZWxlY3RBbGxvY2F0ZWRMaXN0KFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LmnKrliIbphY3nlKjmiLfop5LoibLliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOeUqOaIt+S/oeaBr+mbhuWQiOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1VzZXI+IHNlbGVjdFVuYWxsb2NhdGVkTGlzdChTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog6YCa6L+H55So5oi35ZCN5p+l6K+i55So5oi3CisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEByZXR1cm4g55So5oi35a+56LGh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c1VzZXIgc2VsZWN0VXNlckJ5VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+eUqOaIt0lE5p+l6K+i55So5oi3CisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g55So5oi35a+56LGh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c1VzZXIgc2VsZWN0VXNlckJ5SWQoTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe55So5oi35L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFVzZXIoU3lzVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueeUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVVc2VyKFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnnlKjmiLflpLTlg48KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCNCisgICAgICogQHBhcmFtIGF2YXRhciDlpLTlg4/lnLDlnYAKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVXNlckF2YXRhcihAUGFyYW0oInVzZXJOYW1lIikgU3RyaW5nIHVzZXJOYW1lLCBAUGFyYW0oImF2YXRhciIpIFN0cmluZyBhdmF0YXIpOworCisgICAgLyoqCisgICAgICog6YeN572u55So5oi35a+G56CBCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEBwYXJhbSBwYXNzd29yZCDlr4bnoIEKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVzZXRVc2VyUHdkKEBQYXJhbSgidXNlck5hbWUiKSBTdHJpbmcgdXNlck5hbWUsIEBQYXJhbSgicGFzc3dvcmQiKSBTdHJpbmcgcGFzc3dvcmQpOworCisgICAgLyoqCisgICAgICog6YCa6L+H55So5oi3SUTliKDpmaTnlKjmiLcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVVzZXJCeUlkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOeUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWRzIOmcgOimgeWIoOmZpOeahOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVVzZXJCeUlkcyhMb25nW10gdXNlcklkcyk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqoznlKjmiLflkI3np7DmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCN56ewCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzVXNlciBjaGVja1VzZXJOYW1lVW5pcXVlKFN0cmluZyB1c2VyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozmiYvmnLrlj7fnoIHmmK/lkKbllK/kuIAKKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZW51bWJlciDmiYvmnLrlj7fnoIEKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyIGNoZWNrUGhvbmVVbmlxdWUoU3RyaW5nIHBob25lbnVtYmVyKTsKKworICAgIC8qKgorICAgICAqIOagoemqjGVtYWls5piv5ZCm5ZSv5LiACisgICAgICoKKyAgICAgKiBAcGFyYW0gZW1haWwg55So5oi36YKu566xCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzVXNlciBjaGVja0VtYWlsVW5pcXVlKFN0cmluZyBlbWFpbCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNVc2VyUG9zdE1hcHBlci5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzVXNlclBvc3RNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZhNzIwCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9tYXBwZXIvU3lzVXNlclBvc3RNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzVXNlclBvc3Q7CisKKy8qKgorICog55So5oi35LiO5bKX5L2N5YWz6IGU6KGoIOaVsOaNruWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3lzVXNlclBvc3RNYXBwZXIKK3sKKyAgICAvKioKKyAgICAgKiDpgJrov4fnlKjmiLdJROWIoOmZpOeUqOaIt+WSjOWyl+S9jeWFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVXNlclBvc3RCeVVzZXJJZChMb25nIHVzZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4flspfkvY1JROafpeivouWyl+S9jeS9v+eUqOaVsOmHjworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0SWQg5bKX5L2NSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnRVc2VyUG9zdEJ5SWQoTG9uZyBwb3N0SWQpOworCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk55So5oi35ZKM5bKX5L2N5YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIGlkcyDpnIDopoHliKDpmaTnmoTmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVVc2VyUG9zdChMb25nW10gaWRzKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+aWsOWinueUqOaIt+Wyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyUG9zdExpc3Qg55So5oi35bKX5L2N5YiX6KGoCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGJhdGNoVXNlclBvc3QoTGlzdDxTeXNVc2VyUG9zdD4gdXNlclBvc3RMaXN0KTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vbWFwcGVyL1N5c1VzZXJSb2xlTWFwcGVyLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNVc2VyUm9sZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDNlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL21hcHBlci9TeXNVc2VyUm9sZU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNVc2VyUm9sZTsKKworLyoqCisgKiDnlKjmiLfkuI7op5LoibLlhbPogZTooagg5pWw5o2u5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBTeXNVc2VyUm9sZU1hcHBlcgoreworICAgIC8qKgorICAgICAqIOmAmui/h+eUqOaIt0lE5Yig6Zmk55So5oi35ZKM6KeS6Imy5YWz6IGUCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVVc2VyUm9sZUJ5VXNlcklkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOeUqOaIt+WSjOinkuiJsuWFs+iBlAorICAgICAqIAorICAgICAqIEBwYXJhbSBpZHMg6ZyA6KaB5Yig6Zmk55qE5pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVXNlclJvbGUoTG9uZ1tdIGlkcyk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fop5LoibJJROafpeivouinkuiJsuS9v+eUqOaVsOmHjworICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlSWQg6KeS6ImySUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnRVc2VyUm9sZUJ5Um9sZUlkKExvbmcgcm9sZUlkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+aWsOWinueUqOaIt+inkuiJsuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyUm9sZUxpc3Qg55So5oi36KeS6Imy5YiX6KGoCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGJhdGNoVXNlclJvbGUoTGlzdDxTeXNVc2VyUm9sZT4gdXNlclJvbGVMaXN0KTsKKworICAgIC8qKgorICAgICAqIOWIoOmZpOeUqOaIt+WSjOinkuiJsuWFs+iBlOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyUm9sZSDnlKjmiLflkozop5LoibLlhbPogZTkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlVXNlclJvbGVJbmZvKFN5c1VzZXJSb2xlIHVzZXJSb2xlKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WPlua2iOaOiOadg+eUqOaIt+inkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlSWQg6KeS6ImySUQKKyAgICAgKiBAcGFyYW0gdXNlcklkcyDpnIDopoHliKDpmaTnmoTnlKjmiLfmlbDmja5JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVVc2VyUm9sZUluZm9zKEBQYXJhbSgicm9sZUlkIikgTG9uZyByb2xlSWQsIEBQYXJhbSgidXNlcklkcyIpIExvbmdbXSB1c2VySWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzQ29uZmlnU2VydmljZS5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNDb25maWdTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwNzc3NgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzQ29uZmlnU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzQ29uZmlnOworCisvKioKKyAqIOWPguaVsOmFjee9riDmnI3liqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNDb25maWdTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog5p+l6K+i5Y+C5pWw6YWN572u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZ0lkIOWPguaVsOmFjee9rklECisgICAgICogQHJldHVybiDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzQ29uZmlnIHNlbGVjdENvbmZpZ0J5SWQoTG9uZyBjb25maWdJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7plK7lkI3mn6Xor6Llj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnS2V5IOWPguaVsOmUruWQjQorICAgICAqIEByZXR1cm4g5Y+C5pWw6ZSu5YC8CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzZWxlY3RDb25maWdCeUtleShTdHJpbmcgY29uZmlnS2V5KTsKKworICAgIC8qKgorICAgICAqIOiOt+WPlumqjOivgeeggeW8gOWFsworICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZeW8gOWQr++8jGZhbHNl5YWz6ZetCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0Q2FwdGNoYUVuYWJsZWQoKTsKKworICAgIC8qKgorICAgICAqIOafpeivouWPguaVsOmFjee9ruWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWcg5Y+C5pWw6YWN572u5L+h5oGvCisgICAgICogQHJldHVybiDlj4LmlbDphY3nva7pm4blkIgKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNDb25maWc+IHNlbGVjdENvbmZpZ0xpc3QoU3lzQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7lj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRDb25maWcoU3lzQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVDb25maWcoU3lzQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlj4LmlbDkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnSWRzIOmcgOimgeWIoOmZpOeahOWPguaVsElECisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlQ29uZmlnQnlJZHMoTG9uZ1tdIGNvbmZpZ0lkcyk7CisKKyAgICAvKioKKyAgICAgKiDliqDovb3lj4LmlbDnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkaW5nQ29uZmlnQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIOa4heepuuWPguaVsOe8k+WtmOaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ29uZmlnQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIOmHjee9ruWPguaVsOe8k+WtmOaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0Q29uZmlnQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIOagoemqjOWPguaVsOmUruWQjeaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWcg5Y+C5pWw5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmZpZ0tleVVuaXF1ZShTeXNDb25maWcgY29uZmlnKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzRGVwdFNlcnZpY2UuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzRGVwdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjI4MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNEZXB0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uVHJlZVNlbGVjdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNEZXB0OworCisvKioKKyAqIOmDqOmXqOeuoeeQhiDmnI3liqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNEZXB0U2VydmljZQoreworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOeuoeeQhuaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g6YOo6Zeo5L+h5oGv6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzRGVwdD4gc2VsZWN0RGVwdExpc3QoU3lzRGVwdCBkZXB0KTsKKworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOagkee7k+aehOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g6YOo6Zeo5qCR5L+h5oGv6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJlZVNlbGVjdD4gc2VsZWN0RGVwdFRyZWVMaXN0KFN5c0RlcHQgZGVwdCk7CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/miYDpnIDopoHmoJHnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdHMg6YOo6Zeo5YiX6KGoCisgICAgICogQHJldHVybiDmoJHnu5PmnoTliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNEZXB0PiBidWlsZERlcHRUcmVlKExpc3Q8U3lzRGVwdD4gZGVwdHMpOworCisgICAgLyoqCisgICAgICog5p6E5bu65YmN56uv5omA6ZyA6KaB5LiL5ouJ5qCR57uT5p6ECisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRzIOmDqOmXqOWIl+ihqAorICAgICAqIEByZXR1cm4g5LiL5ouJ5qCR57uT5p6E5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJlZVNlbGVjdD4gYnVpbGREZXB0VHJlZVNlbGVjdChMaXN0PFN5c0RlcHQ+IGRlcHRzKTsKKworICAgIC8qKgorICAgICAqIOagueaNruinkuiJsklE5p+l6K+i6YOo6Zeo5qCR5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit6YOo6Zeo5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8TG9uZz4gc2VsZWN0RGVwdExpc3RCeVJvbGVJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7pg6jpl6hJROafpeivouS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOmDqOmXqOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNEZXB0IHNlbGVjdERlcHRCeUlkKExvbmcgZGVwdElkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrklE5p+l6K+i5omA5pyJ5a2Q6YOo6Zeo77yI5q2j5bi454q25oCB77yJCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g5a2Q6YOo6Zeo5pWwCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3ROb3JtYWxDaGlsZHJlbkRlcHRCeUlkKExvbmcgZGVwdElkKTsKKworICAgIC8qKgorICAgICAqIOaYr+WQpuWtmOWcqOmDqOmXqOWtkOiKgueCuQorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkQnlEZXB0SWQoTG9uZyBkZXB0SWQpOworCisgICAgLyoqCisgICAgICog5p+l6K+i6YOo6Zeo5piv5ZCm5a2Y5Zyo55So5oi3CisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g57uT5p6cIHRydWUg5a2Y5ZyoIGZhbHNlIOS4jeWtmOWcqAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRGVwdEV4aXN0VXNlcihMb25nIGRlcHRJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozpg6jpl6jlkI3np7DmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdCDpg6jpl6jkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRGVwdE5hbWVVbmlxdWUoU3lzRGVwdCBkZXB0KTsKKworICAgIC8qKgorICAgICAqIOagoemqjOmDqOmXqOaYr+WQpuacieaVsOaNruadg+mZkAorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja0RlcHREYXRhU2NvcGUoTG9uZyBkZXB0SWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y6YOo6Zeo5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHQg6YOo6Zeo5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydERlcHQoU3lzRGVwdCBkZXB0KTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOmDqOmXqOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEZXB0KFN5c0RlcHQgZGVwdCk7CisKKyAgICAvKioKKyAgICAgKiDliKDpmaTpg6jpl6jnrqHnkIbkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdElkIOmDqOmXqElECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZURlcHRCeUlkKExvbmcgZGVwdElkKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzRGljdERhdGFTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c0RpY3REYXRhU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzRmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c0RpY3REYXRhU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdERhdGE7CisKKy8qKgorICog5a2X5YW4IOS4muWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN5c0RpY3REYXRhU2VydmljZQoreworICAgIC8qKgorICAgICAqIOagueaNruadoeS7tuWIhumhteafpeivouWtl+WFuOaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0RGF0YSDlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0RpY3REYXRhPiBzZWxlY3REaWN0RGF0YUxpc3QoU3lzRGljdERhdGEgZGljdERhdGEpOworCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW457G75Z6L5ZKM5a2X5YW46ZSu5YC85p+l6K+i5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+WeiworICAgICAqIEBwYXJhbSBkaWN0VmFsdWUg5a2X5YW46ZSu5YC8CisgICAgICogQHJldHVybiDlrZflhbjmoIfnrb4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNlbGVjdERpY3RMYWJlbChTdHJpbmcgZGljdFR5cGUsIFN0cmluZyBkaWN0VmFsdWUpOworCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW45pWw5o2uSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdENvZGUg5a2X5YW45pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrgorICAgICAqLworICAgIHB1YmxpYyBTeXNEaWN0RGF0YSBzZWxlY3REaWN0RGF0YUJ5SWQoTG9uZyBkaWN0Q29kZSk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdENvZGVzIOmcgOimgeWIoOmZpOeahOWtl+WFuOaVsOaNrklECisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlRGljdERhdGFCeUlkcyhMb25nW10gZGljdENvZGVzKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS/neWtmOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0RGF0YSDlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0RGljdERhdGEoU3lzRGljdERhdGEgZGljdERhdGEpOworCisgICAgLyoqCisgICAgICog5L+u5pS55L+d5a2Y5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3REYXRhIOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEaWN0RGF0YShTeXNEaWN0RGF0YSBkaWN0RGF0YSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c0RpY3RUeXBlU2VydmljZS5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNEaWN0VHlwZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWMxYzFkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNEaWN0VHlwZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RpY3REYXRhOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c0RpY3RUeXBlOworCisvKioKKyAqIOWtl+WFuCDkuJrliqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNEaWN0VHlwZVNlcnZpY2UKK3sKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LlrZflhbjnsbvlnosKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogQHJldHVybiDlrZflhbjnsbvlnovpm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNEaWN0VHlwZT4gc2VsZWN0RGljdFR5cGVMaXN0KFN5c0RpY3RUeXBlIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOagueaNruaJgOacieWtl+WFuOexu+WeiworICAgICAqIAorICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6L6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzRGljdFR5cGU+IHNlbGVjdERpY3RUeXBlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnovmn6Xor6LlrZflhbjmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDlrZflhbjmlbDmja7pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNEaWN0RGF0YT4gc2VsZWN0RGljdERhdGFCeVR5cGUoU3RyaW5nIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei0lE5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RJZCDlrZflhbjnsbvlnotJRAorICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6LCisgICAgICovCisgICAgcHVibGljIFN5c0RpY3RUeXBlIHNlbGVjdERpY3RUeXBlQnlJZChMb25nIGRpY3RJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnovmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDlrZflhbjnsbvlnosKKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzRGljdFR5cGUgc2VsZWN0RGljdFR5cGVCeVR5cGUoU3RyaW5nIGRpY3RUeXBlKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWtl+WFuOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0SWRzIOmcgOimgeWIoOmZpOeahOWtl+WFuElECisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlRGljdFR5cGVCeUlkcyhMb25nW10gZGljdElkcyk7CisKKyAgICAvKioKKyAgICAgKiDliqDovb3lrZflhbjnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkaW5nRGljdENhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiDmuIXnqbrlrZflhbjnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckRpY3RDYWNoZSgpOworCisgICAgLyoqCisgICAgICog6YeN572u5a2X5YW457yT5a2Y5pWw5o2uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXREaWN0Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS/neWtmOWtl+WFuOexu+Wei+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnovkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0RGljdFR5cGUoU3lzRGljdFR5cGUgZGljdFR5cGUpOworCisgICAgLyoqCisgICAgICog5L+u5pS55L+d5a2Y5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+Wei+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVEaWN0VHlwZShTeXNEaWN0VHlwZSBkaWN0VHlwZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozlrZflhbjnsbvlnovnp7DmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0RpY3RUeXBlVW5pcXVlKFN5c0RpY3RUeXBlIGRpY3RUeXBlKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzTG9naW5pbmZvclNlcnZpY2UuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzTG9naW5pbmZvclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTMxNTFkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNMb2dpbmluZm9yU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTG9naW5pbmZvcjsKKworLyoqCisgKiDns7vnu5/orr/pl67ml6Xlv5fmg4XlhrXkv6Hmga8g5pyN5Yqh5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBJU3lzTG9naW5pbmZvclNlcnZpY2UKK3sKKyAgICAvKioKKyAgICAgKiDmlrDlop7ns7vnu5/nmbvlvZXml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9naW5pbmZvciDorr/pl67ml6Xlv5flr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRMb2dpbmluZm9yKFN5c0xvZ2luaW5mb3IgbG9naW5pbmZvcik7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/nmbvlvZXml6Xlv5fpm4blkIgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9naW5pbmZvciDorr/pl67ml6Xlv5flr7nosaEKKyAgICAgKiBAcmV0dXJuIOeZu+W9leiusOW9lembhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c0xvZ2luaW5mb3I+IHNlbGVjdExvZ2luaW5mb3JMaXN0KFN5c0xvZ2luaW5mb3IgbG9naW5pbmZvcik7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTns7vnu5/nmbvlvZXml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5mb0lkcyDpnIDopoHliKDpmaTnmoTnmbvlvZXml6Xlv5dJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVMb2dpbmluZm9yQnlJZHMoTG9uZ1tdIGluZm9JZHMpOworCisgICAgLyoqCisgICAgICog5riF56m657O757uf55m75b2V5pel5b+XCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW5Mb2dpbmluZm9yKCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c01lbnVTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c01lbnVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2MDY5NgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzTWVudVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uVHJlZVNlbGVjdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNNZW51OworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLnZvLlJvdXRlclZvOworCisvKioKKyAqIOiPnOWNlSDkuJrliqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNNZW51U2VydmljZQoreworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt+afpeivouezu+e7n+iPnOWNleWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOiPnOWNleWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IHNlbGVjdE1lbnVMaXN0KExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt+afpeivouezu+e7n+iPnOWNleWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IOiPnOWNleS/oeaBrworICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOiPnOWNleWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IHNlbGVjdE1lbnVMaXN0KFN5c01lbnUgbWVudSwgTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6LmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc2VsZWN0TWVudVBlcm1zQnlVc2VySWQoTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u6KeS6ImySUTmn6Xor6LmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc2VsZWN0TWVudVBlcm1zQnlSb2xlSWQoTG9uZyByb2xlSWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6Loj5zljZXmoJHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDoj5zljZXliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNNZW51PiBzZWxlY3RNZW51VHJlZUJ5VXNlcklkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOagueaNruinkuiJsklE5p+l6K+i6I+c5Y2V5qCR5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8TG9uZz4gc2VsZWN0TWVudUxpc3RCeVJvbGVJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/ot6/nlLHmiYDpnIDopoHnmoToj5zljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudXMg6I+c5Y2V5YiX6KGoCisgICAgICogQHJldHVybiDot6/nlLHliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSb3V0ZXJWbz4gYnVpbGRNZW51cyhMaXN0PFN5c01lbnU+IG1lbnVzKTsKKworICAgIC8qKgorICAgICAqIOaehOW7uuWJjeerr+aJgOmcgOimgeagkee7k+aehAorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51cyDoj5zljZXliJfooagKKyAgICAgKiBAcmV0dXJuIOagkee7k+aehOWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IGJ1aWxkTWVudVRyZWUoTGlzdDxTeXNNZW51PiBtZW51cyk7CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/miYDpnIDopoHkuIvmi4nmoJHnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudXMg6I+c5Y2V5YiX6KGoCisgICAgICogQHJldHVybiDkuIvmi4nmoJHnu5PmnoTliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUcmVlU2VsZWN0PiBidWlsZE1lbnVUcmVlU2VsZWN0KExpc3Q8U3lzTWVudT4gbWVudXMpOworCisgICAgLyoqCisgICAgICog5qC55o2u6I+c5Y2VSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDoj5zljZXkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzTWVudSBzZWxlY3RNZW51QnlJZChMb25nIG1lbnVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmmK/lkKblrZjlnKjoj5zljZXlrZDoioLngrkKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDnu5PmnpwgdHJ1ZSDlrZjlnKggZmFsc2Ug5LiN5a2Y5ZyoCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRCeU1lbnVJZChMb25nIG1lbnVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Loj5zljZXmmK/lkKblrZjlnKjop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDnu5PmnpwgdHJ1ZSDlrZjlnKggZmFsc2Ug5LiN5a2Y5ZyoCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tNZW51RXhpc3RSb2xlKExvbmcgbWVudUlkKTsKKworICAgIC8qKgorICAgICAqIOaWsOWinuS/neWtmOiPnOWNleS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IOiPnOWNleS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBpbnNlcnRNZW51KFN5c01lbnUgbWVudSk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjoj5zljZXkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlTWVudShTeXNNZW51IG1lbnUpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk6I+c5Y2V566h55CG5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVNZW51QnlJZChMb25nIG1lbnVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozoj5zljZXlkI3np7DmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTWVudU5hbWVVbmlxdWUoU3lzTWVudSBtZW51KTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzTm90aWNlU2VydmljZS5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNOb3RpY2VTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjZTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzTm90aWNlU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTm90aWNlOworCisvKioKKyAqIOWFrOWRiiDmnI3liqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNOb3RpY2VTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog5p+l6K+i5YWs5ZGK5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZUlkIOWFrOWRiklECisgICAgICogQHJldHVybiDlhazlkYrkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzTm90aWNlIHNlbGVjdE5vdGljZUJ5SWQoTG9uZyBub3RpY2VJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LlhazlkYrliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm90aWNlIOWFrOWRiuS/oeaBrworICAgICAqIEByZXR1cm4g5YWs5ZGK6ZuG5ZCICisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzTm90aWNlPiBzZWxlY3ROb3RpY2VMaXN0KFN5c05vdGljZSBub3RpY2UpOworCisgICAgLyoqCisgICAgICog5paw5aKe5YWs5ZGKCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZSDlhazlkYrkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0Tm90aWNlKFN5c05vdGljZSBub3RpY2UpOworCisgICAgLyoqCisgICAgICog5L+u5pS55YWs5ZGKCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZSDlhazlkYrkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlTm90aWNlKFN5c05vdGljZSBub3RpY2UpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk5YWs5ZGK5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZUlkIOWFrOWRiklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZU5vdGljZUJ5SWQoTG9uZyBub3RpY2VJZCk7CisgICAgCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk5YWs5ZGK5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZUlkcyDpnIDopoHliKDpmaTnmoTlhazlkYpJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVOb3RpY2VCeUlkcyhMb25nW10gbm90aWNlSWRzKTsKK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzT3BlckxvZ1NlcnZpY2UuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzT3BlckxvZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ4ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL0lTeXNPcGVyTG9nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzT3BlckxvZzsKKworLyoqCisgKiDmk43kvZzml6Xlv5cg5pyN5Yqh5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBJU3lzT3BlckxvZ1NlcnZpY2UKK3sKKyAgICAvKioKKyAgICAgKiDmlrDlop7mk43kvZzml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5flr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRPcGVybG9nKFN5c09wZXJMb2cgb3BlckxvZyk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/mk43kvZzml6Xlv5fpm4blkIgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlckxvZyDmk43kvZzml6Xlv5flr7nosaEKKyAgICAgKiBAcmV0dXJuIOaTjeS9nOaXpeW/l+mbhuWQiAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c09wZXJMb2c+IHNlbGVjdE9wZXJMb2dMaXN0KFN5c09wZXJMb2cgb3BlckxvZyk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTns7vnu5/mk43kvZzml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3BlcklkcyDpnIDopoHliKDpmaTnmoTmk43kvZzml6Xlv5dJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVPcGVyTG9nQnlJZHMoTG9uZ1tdIG9wZXJJZHMpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5pON5L2c5pel5b+X6K+m57uGCisgICAgICogCisgICAgICogQHBhcmFtIG9wZXJJZCDmk43kvZxJRAorICAgICAqIEByZXR1cm4g5pON5L2c5pel5b+X5a+56LGhCisgICAgICovCisgICAgcHVibGljIFN5c09wZXJMb2cgc2VsZWN0T3BlckxvZ0J5SWQoTG9uZyBvcGVySWQpOworCisgICAgLyoqCisgICAgICog5riF56m65pON5L2c5pel5b+XCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW5PcGVyTG9nKCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1Bvc3RTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1Bvc3RTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NzliZgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzUG9zdFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1Bvc3Q7CisKKy8qKgorICog5bKX5L2N5L+h5oGvIOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN5c1Bvc3RTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog5p+l6K+i5bKX5L2N5L+h5oGv6ZuG5ZCICisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDlspfkvY3liJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNQb3N0PiBzZWxlY3RQb3N0TGlzdChTeXNQb3N0IHBvc3QpOworCisgICAgLyoqCisgICAgICog5p+l6K+i5omA5pyJ5bKX5L2NCisgICAgICogCisgICAgICogQHJldHVybiDlspfkvY3liJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNQb3N0PiBzZWxlY3RQb3N0QWxsKCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4flspfkvY1JROafpeivouWyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0SWQg5bKX5L2NSUQKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNQb3N0IHNlbGVjdFBvc3RCeUlkKExvbmcgcG9zdElkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE6I635Y+W5bKX5L2N6YCJ5oup5qGG5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit5bKX5L2NSUTliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RQb3N0TGlzdEJ5VXNlcklkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOagoemqjOWyl+S9jeWQjeensAorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0IOWyl+S9jeS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQb3N0TmFtZVVuaXF1ZShTeXNQb3N0IHBvc3QpOworCisgICAgLyoqCisgICAgICog5qCh6aqM5bKX5L2N57yW56CBCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1Bvc3RDb2RlVW5pcXVlKFN5c1Bvc3QgcG9zdCk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4flspfkvY1JROafpeivouWyl+S9jeS9v+eUqOaVsOmHjworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0SWQg5bKX5L2NSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnRVc2VyUG9zdEJ5SWQoTG9uZyBwb3N0SWQpOworCisgICAgLyoqCisgICAgICog5Yig6Zmk5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3RJZCDlspfkvY1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVQb3N0QnlJZChMb25nIHBvc3RJZCk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlspfkvY3kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdElkcyDpnIDopoHliKDpmaTnmoTlspfkvY1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVQb3N0QnlJZHMoTG9uZ1tdIHBvc3RJZHMpOworCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFBvc3QoU3lzUG9zdCBwb3N0KTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOWyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0IOWyl+S9jeS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVQb3N0KFN5c1Bvc3QgcG9zdCk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1JvbGVTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1JvbGVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4NWNjZQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzUm9sZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzVXNlclJvbGU7CisKKy8qKgorICog6KeS6Imy5Lia5Yqh5bGCCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworcHVibGljIGludGVyZmFjZSBJU3lzUm9sZVNlcnZpY2UKK3sKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6Lop5LoibLmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOinkuiJsuaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVMaXN0KFN5c1JvbGUgcm9sZSk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivouinkuiJsuWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVzQnlVc2VySWQoTG9uZyB1c2VySWQpOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6Lop5LoibLmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc2VsZWN0Um9sZVBlcm1pc3Npb25CeVVzZXJJZChMb25nIHVzZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LmiYDmnInop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVBbGwoKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE6I635Y+W6KeS6Imy6YCJ5oup5qGG5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit6KeS6ImySUTliJfooagKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RSb2xlTGlzdEJ5VXNlcklkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+inkuiJsklE5p+l6K+i6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g6KeS6Imy5a+56LGh5L+h5oGvCisgICAgICovCisgICAgcHVibGljIFN5c1JvbGUgc2VsZWN0Um9sZUJ5SWQoTG9uZyByb2xlSWQpOworCisgICAgLyoqCisgICAgICog5qCh6aqM6KeS6Imy5ZCN56ew5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1JvbGVOYW1lVW5pcXVlKFN5c1JvbGUgcm9sZSk7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozop5LoibLmnYPpmZDmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrUm9sZUtleVVuaXF1ZShTeXNSb2xlIHJvbGUpOworCisgICAgLyoqCisgICAgICog5qCh6aqM6KeS6Imy5piv5ZCm5YWB6K645pON5L2cCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tSb2xlQWxsb3dlZChTeXNSb2xlIHJvbGUpOworCisgICAgLyoqCisgICAgICog5qCh6aqM6KeS6Imy5piv5ZCm5pyJ5pWw5o2u5p2D6ZmQCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZHMg6KeS6ImyaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja1JvbGVEYXRhU2NvcGUoTG9uZy4uLiByb2xlSWRzKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+inkuiJsklE5p+l6K+i6KeS6Imy5L2/55So5pWw6YePCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBjb3VudFVzZXJSb2xlQnlSb2xlSWQoTG9uZyByb2xlSWQpOworCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y6KeS6Imy5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFJvbGUoU3lzUm9sZSByb2xlKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOinkuiJsuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlIOinkuiJsuS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVSb2xlKFN5c1JvbGUgcm9sZSk7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnop5LoibLnirbmgIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlUm9sZVN0YXR1cyhTeXNSb2xlIHJvbGUpOworCisgICAgLyoqCisgICAgICog5L+u5pS55pWw5o2u5p2D6ZmQ5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGF1dGhEYXRhU2NvcGUoU3lzUm9sZSByb2xlKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+inkuiJsklE5Yig6Zmk6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZChMb25nIHJvbGVJZCk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTop5LoibLkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkcyDpnIDopoHliKDpmaTnmoTop5LoibJJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZHMoTG9uZ1tdIHJvbGVJZHMpOworCisgICAgLyoqCisgICAgICog5Y+W5raI5o6I5p2D55So5oi36KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJSb2xlIOeUqOaIt+WSjOinkuiJsuWFs+iBlOS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCBkZWxldGVBdXRoVXNlcihTeXNVc2VyUm9sZSB1c2VyUm9sZSk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/lj5bmtojmjojmnYPnlKjmiLfop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHBhcmFtIHVzZXJJZHMg6ZyA6KaB5Y+W5raI5o6I5p2D55qE55So5oi35pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVsZXRlQXV0aFVzZXJzKExvbmcgcm9sZUlkLCBMb25nW10gdXNlcklkcyk7CisKKyAgICAvKioKKyAgICAgKiDmibnph4/pgInmi6nmjojmnYPnlKjmiLfop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHBhcmFtIHVzZXJJZHMg6ZyA6KaB5Yig6Zmk55qE55So5oi35pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0QXV0aFVzZXJzKExvbmcgcm9sZUlkLCBMb25nW10gdXNlcklkcyk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1VzZXJPbmxpbmVTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1VzZXJPbmxpbmVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViNTQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzVXNlck9ubGluZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZTsKKworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4ubW9kZWwuTG9naW5Vc2VyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1VzZXJPbmxpbmU7CisKKy8qKgorICog5Zyo57q/55So5oi3IOacjeWKoeWxggorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN5c1VzZXJPbmxpbmVTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog6YCa6L+H55m75b2V5Zyw5Z2A5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGlwYWRkciDnmbvlvZXlnLDlnYAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWcqOe6v+eUqOaIt+S/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyT25saW5lIHNlbGVjdE9ubGluZUJ5SXBhZGRyKFN0cmluZyBpcGFkZHIsIExvZ2luVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+eUqOaIt+WQjeensOafpeivouS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI3np7AKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWcqOe6v+eUqOaIt+S/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyT25saW5lIHNlbGVjdE9ubGluZUJ5VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lLCBMb2dpblVzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fnmbvlvZXlnLDlnYAv55So5oi35ZCN56ew5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGlwYWRkciDnmbvlvZXlnLDlnYAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCN56ewCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDlnKjnur/nlKjmiLfkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzVXNlck9ubGluZSBzZWxlY3RPbmxpbmVCeUluZm8oU3RyaW5nIGlwYWRkciwgU3RyaW5nIHVzZXJOYW1lLCBMb2dpblVzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDorr7nva7lnKjnur/nlKjmiLfkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWcqOe6v+eUqOaItworICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyT25saW5lIGxvZ2luVXNlclRvVXNlck9ubGluZShMb2dpblVzZXIgdXNlcik7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1VzZXJTZXJ2aWNlLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvSVN5c1VzZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiYzJhYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9JU3lzVXNlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNVc2VyOworCisvKioKKyAqIOeUqOaItyDkuJrliqHlsYIKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitwdWJsaWMgaW50ZXJmYWNlIElTeXNVc2VyU2VydmljZQoreworICAgIC8qKgorICAgICAqIOagueaNruadoeS7tuWIhumhteafpeivoueUqOaIt+WIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g55So5oi35L+h5oGv6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzVXNlcj4gc2VsZWN0VXNlckxpc3QoU3lzVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOagueaNruadoeS7tuWIhumhteafpeivouW3suWIhumFjeeUqOaIt+inkuiJsuWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g55So5oi35L+h5oGv6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3lzVXNlcj4gc2VsZWN0QWxsb2NhdGVkTGlzdChTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog5qC55o2u5p2h5Lu25YiG6aG15p+l6K+i5pyq5YiG6YWN55So5oi36KeS6Imy5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnlKjmiLfkv6Hmga/pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNVc2VyPiBzZWxlY3RVbmFsbG9jYXRlZExpc3QoU3lzVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOmAmui/h+eUqOaIt+WQjeafpeivoueUqOaItworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcmV0dXJuIOeUqOaIt+WvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyIHNlbGVjdFVzZXJCeVVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fnlKjmiLdJROafpeivoueUqOaItworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOeUqOaIt+WvueixoeS/oeaBrworICAgICAqLworICAgIHB1YmxpYyBTeXNVc2VyIHNlbGVjdFVzZXJCeUlkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE5p+l6K+i55So5oi35omA5bGe6KeS6Imy57uECisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzZWxlY3RVc2VyUm9sZUdyb3VwKFN0cmluZyB1c2VyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivoueUqOaIt+aJgOWxnuWyl+S9jee7hAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2VsZWN0VXNlclBvc3RHcm91cChTdHJpbmcgdXNlck5hbWUpOworCisgICAgLyoqCisgICAgICog5qCh6aqM55So5oi35ZCN56ew5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1VzZXJOYW1lVW5pcXVlKFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozmiYvmnLrlj7fnoIHmmK/lkKbllK/kuIAKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQaG9uZVVuaXF1ZShTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog5qCh6aqMZW1haWzmmK/lkKbllK/kuIAKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tFbWFpbFVuaXF1ZShTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog5qCh6aqM55So5oi35piv5ZCm5YWB6K645pON5L2cCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tVc2VyQWxsb3dlZChTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog5qCh6aqM55So5oi35piv5ZCm5pyJ5pWw5o2u5p2D6ZmQCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrVXNlckRhdGFTY29wZShMb25nIHVzZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7nlKjmiLfkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0VXNlcihTeXNVc2VyIHVzZXIpOworCisgICAgLyoqCisgICAgICog5rOo5YaM55So5oi35L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclVzZXIoU3lzVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueeUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVVc2VyKFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDnlKjmiLfmjojmnYPop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHBhcmFtIHJvbGVJZHMg6KeS6Imy57uECisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zZXJ0VXNlckF1dGgoTG9uZyB1c2VySWQsIExvbmdbXSByb2xlSWRzKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueeUqOaIt+eKtuaAgQorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCB1cGRhdGVVc2VyU3RhdHVzKFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnnlKjmiLfln7rmnKzkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdXBkYXRlVXNlclByb2ZpbGUoU3lzVXNlciB1c2VyKTsKKworICAgIC8qKgorICAgICAqIOS/ruaUueeUqOaIt+WktOWDjworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcGFyYW0gYXZhdGFyIOWktOWDj+WcsOWdgAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVXNlckF2YXRhcihTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBhdmF0YXIpOworCisgICAgLyoqCisgICAgICog6YeN572u55So5oi35a+G56CBCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlc2V0UHdkKFN5c1VzZXIgdXNlcik7CisKKyAgICAvKioKKyAgICAgKiDph43nva7nlKjmiLflr4bnoIEKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCNCisgICAgICogQHBhcmFtIHBhc3N3b3JkIOWvhueggQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGludCByZXNldFVzZXJQd2QoU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgcGFzc3dvcmQpOworCisgICAgLyoqCisgICAgICog6YCa6L+H55So5oi3SUTliKDpmaTnlKjmiLcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVVzZXJCeUlkKExvbmcgdXNlcklkKTsKKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOeUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWRzIOmcgOimgeWIoOmZpOeahOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlbGV0ZVVzZXJCeUlkcyhMb25nW10gdXNlcklkcyk7CisKKyAgICAvKioKKyAgICAgKiDlr7zlhaXnlKjmiLfmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlckxpc3Qg55So5oi35pWw5o2u5YiX6KGoCisgICAgICogQHBhcmFtIGlzVXBkYXRlU3VwcG9ydCDmmK/lkKbmm7TmlrDmlK/mjIHvvIzlpoLmnpzlt7LlrZjlnKjvvIzliJnov5vooYzmm7TmlrDmlbDmja4KKyAgICAgKiBAcGFyYW0gb3Blck5hbWUg5pON5L2c55So5oi3CisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGltcG9ydFVzZXIoTGlzdDxTeXNVc2VyPiB1c2VyTGlzdCwgQm9vbGVhbiBpc1VwZGF0ZVN1cHBvcnQsIFN0cmluZyBvcGVyTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNDb25maWdTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzQ29uZmlnU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc1MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzQ29uZmlnU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGpha2FydGEuYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRGF0YVNvdXJjZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LkNhY2hlQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuVXNlckNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUucmVkaXMuUmVkaXNDYWNoZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dC5Db252ZXJ0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZW51bXMuRGF0YVNvdXJjZVR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c0NvbmZpZzsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNDb25maWdNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNDb25maWdTZXJ2aWNlOworCisvKioKKyAqIOWPguaVsOmFjee9riDmnI3liqHlsYLlrp7njrAKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c0NvbmZpZ1NlcnZpY2VJbXBsIGltcGxlbWVudHMgSVN5c0NvbmZpZ1NlcnZpY2UKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNDb25maWdNYXBwZXIgY29uZmlnTWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUmVkaXNDYWNoZSByZWRpc0NhY2hlOworCisgICAgLyoqCisgICAgICog6aG555uu5ZCv5Yqo5pe277yM5Yid5aeL5YyW5Y+C5pWw5Yiw57yT5a2YCisgICAgICovCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICAgIGxvYWRpbmdDb25maWdDYWNoZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouWPguaVsOmFjee9ruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWdJZCDlj4LmlbDphY3nva5JRAorICAgICAqIEByZXR1cm4g5Y+C5pWw6YWN572u5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQERhdGFTb3VyY2UoRGF0YVNvdXJjZVR5cGUuTUFTVEVSKQorICAgIHB1YmxpYyBTeXNDb25maWcgc2VsZWN0Q29uZmlnQnlJZChMb25nIGNvbmZpZ0lkKQorICAgIHsKKyAgICAgICAgU3lzQ29uZmlnIGNvbmZpZyA9IG5ldyBTeXNDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldENvbmZpZ0lkKGNvbmZpZ0lkKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ01hcHBlci5zZWxlY3RDb25maWcoY29uZmlnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7plK7lkI3mn6Xor6Llj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnS2V5IOWPguaVsGtleQorICAgICAqIEByZXR1cm4g5Y+C5pWw6ZSu5YC8CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBzZWxlY3RDb25maWdCeUtleShTdHJpbmcgY29uZmlnS2V5KQorICAgIHsKKyAgICAgICAgU3RyaW5nIGNvbmZpZ1ZhbHVlID0gQ29udmVydC50b1N0cihyZWRpc0NhY2hlLmdldENhY2hlT2JqZWN0KGdldENhY2hlS2V5KGNvbmZpZ0tleSkpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoY29uZmlnVmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgU3lzQ29uZmlnIGNvbmZpZyA9IG5ldyBTeXNDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldENvbmZpZ0tleShjb25maWdLZXkpOworICAgICAgICBTeXNDb25maWcgcmV0Q29uZmlnID0gY29uZmlnTWFwcGVyLnNlbGVjdENvbmZpZyhjb25maWcpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHJldENvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzQ2FjaGUuc2V0Q2FjaGVPYmplY3QoZ2V0Q2FjaGVLZXkoY29uZmlnS2V5KSwgcmV0Q29uZmlnLmdldENvbmZpZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldENvbmZpZy5nZXRDb25maWdWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bpqozor4HnoIHlvIDlhbMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWXlvIDlkK/vvIxmYWxzZeWFs+mXrQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENhcHRjaGFFbmFibGVkKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBjYXB0Y2hhRW5hYmxlZCA9IHNlbGVjdENvbmZpZ0J5S2V5KCJzeXMuYWNjb3VudC5jYXB0Y2hhRW5hYmxlZCIpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShjYXB0Y2hhRW5hYmxlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb252ZXJ0LnRvQm9vbChjYXB0Y2hhRW5hYmxlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i5Y+C5pWw6YWN572u5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZyDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWPguaVsOmFjee9rumbhuWQiAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c0NvbmZpZz4gc2VsZWN0Q29uZmlnTGlzdChTeXNDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ01hcHBlci5zZWxlY3RDb25maWdMaXN0KGNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe5Y+C5pWw6YWN572uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZyDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0Q29uZmlnKFN5c0NvbmZpZyBjb25maWcpCisgICAgeworICAgICAgICBpbnQgcm93ID0gY29uZmlnTWFwcGVyLmluc2VydENvbmZpZyhjb25maWcpOworICAgICAgICBpZiAocm93ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXNDYWNoZS5zZXRDYWNoZU9iamVjdChnZXRDYWNoZUtleShjb25maWcuZ2V0Q29uZmlnS2V5KCkpLCBjb25maWcuZ2V0Q29uZmlnVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnlj4LmlbDphY3nva4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIOWPguaVsOmFjee9ruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGVDb25maWcoU3lzQ29uZmlnIGNvbmZpZykKKyAgICB7CisgICAgICAgIFN5c0NvbmZpZyB0ZW1wID0gY29uZmlnTWFwcGVyLnNlbGVjdENvbmZpZ0J5SWQoY29uZmlnLmdldENvbmZpZ0lkKCkpOworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmVxdWFscyh0ZW1wLmdldENvbmZpZ0tleSgpLCBjb25maWcuZ2V0Q29uZmlnS2V5KCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc0NhY2hlLmRlbGV0ZU9iamVjdChnZXRDYWNoZUtleSh0ZW1wLmdldENvbmZpZ0tleSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcm93ID0gY29uZmlnTWFwcGVyLnVwZGF0ZUNvbmZpZyhjb25maWcpOworICAgICAgICBpZiAocm93ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXNDYWNoZS5zZXRDYWNoZU9iamVjdChnZXRDYWNoZUtleShjb25maWcuZ2V0Q29uZmlnS2V5KCkpLCBjb25maWcuZ2V0Q29uZmlnVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlj4LmlbDkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnSWRzIOmcgOimgeWIoOmZpOeahOWPguaVsElECisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsZXRlQ29uZmlnQnlJZHMoTG9uZ1tdIGNvbmZpZ0lkcykKKyAgICB7CisgICAgICAgIGZvciAoTG9uZyBjb25maWdJZCA6IGNvbmZpZ0lkcykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzQ29uZmlnIGNvbmZpZyA9IHNlbGVjdENvbmZpZ0J5SWQoY29uZmlnSWQpOworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhVc2VyQ29uc3RhbnRzLllFUywgY29uZmlnLmdldENvbmZpZ1R5cGUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgi5YaF572u5Y+C5pWw44CQJTEkc+OAkeS4jeiDveWIoOmZpCAiLCBjb25maWcuZ2V0Q29uZmlnS2V5KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ01hcHBlci5kZWxldGVDb25maWdCeUlkKGNvbmZpZ0lkKTsKKyAgICAgICAgICAgIHJlZGlzQ2FjaGUuZGVsZXRlT2JqZWN0KGdldENhY2hlS2V5KGNvbmZpZy5nZXRDb25maWdLZXkoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yqg6L295Y+C5pWw57yT5a2Y5pWw5o2uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbG9hZGluZ0NvbmZpZ0NhY2hlKCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzQ29uZmlnPiBjb25maWdzTGlzdCA9IGNvbmZpZ01hcHBlci5zZWxlY3RDb25maWdMaXN0KG5ldyBTeXNDb25maWcoKSk7CisgICAgICAgIGZvciAoU3lzQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3NMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc0NhY2hlLnNldENhY2hlT2JqZWN0KGdldENhY2hlS2V5KGNvbmZpZy5nZXRDb25maWdLZXkoKSksIGNvbmZpZy5nZXRDb25maWdWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOa4heepuuWPguaVsOe8k+WtmOaVsOaNrgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyQ29uZmlnQ2FjaGUoKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGtleXMgPSByZWRpc0NhY2hlLmtleXMoQ2FjaGVDb25zdGFudHMuU1lTX0NPTkZJR19LRVkgKyAiKiIpOworICAgICAgICByZWRpc0NhY2hlLmRlbGV0ZU9iamVjdChrZXlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDph43nva7lj4LmlbDnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldENvbmZpZ0NhY2hlKCkKKyAgICB7CisgICAgICAgIGNsZWFyQ29uZmlnQ2FjaGUoKTsKKyAgICAgICAgbG9hZGluZ0NvbmZpZ0NhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM5Y+C5pWw6ZSu5ZCN5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZyDlj4LmlbDphY3nva7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQ29uZmlnS2V5VW5pcXVlKFN5c0NvbmZpZyBjb25maWcpCisgICAgeworICAgICAgICBMb25nIGNvbmZpZ0lkID0gU3RyaW5nVXRpbHMuaXNOdWxsKGNvbmZpZy5nZXRDb25maWdJZCgpKSA/IC0xTCA6IGNvbmZpZy5nZXRDb25maWdJZCgpOworICAgICAgICBTeXNDb25maWcgaW5mbyA9IGNvbmZpZ01hcHBlci5jaGVja0NvbmZpZ0tleVVuaXF1ZShjb25maWcuZ2V0Q29uZmlnS2V5KCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGluZm8pICYmIGluZm8uZ2V0Q29uZmlnSWQoKS5sb25nVmFsdWUoKSAhPSBjb25maWdJZC5sb25nVmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuTk9UX1VOSVFVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5VTklRVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6K6+572uY2FjaGUga2V5CisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZ0tleSDlj4LmlbDplK4KKyAgICAgKiBAcmV0dXJuIOe8k+WtmOmUrmtleQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyBjb25maWdLZXkpCisgICAgeworICAgICAgICByZXR1cm4gQ2FjaGVDb25zdGFudHMuU1lTX0NPTkZJR19LRVkgKyBjb25maWdLZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzRGVwdFNlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNEZXB0U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI2MDVkCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzRGVwdFNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwzMzggQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5EYXRhU2NvcGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Vc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uVHJlZVNlbGVjdDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNEZXB0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUudGV4dC5Db252ZXJ0OworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uZXhjZXB0aW9uLlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZWN1cml0eVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcHJpbmcuU3ByaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzRGVwdE1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNSb2xlTWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzRGVwdFNlcnZpY2U7CisKKy8qKgorICog6YOo6Zeo566h55CGIOacjeWKoeWunueOsAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzRGVwdFNlcnZpY2VJbXBsIGltcGxlbWVudHMgSVN5c0RlcHRTZXJ2aWNlCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzRGVwdE1hcHBlciBkZXB0TWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzUm9sZU1hcHBlciByb2xlTWFwcGVyOworCisgICAgLyoqCisgICAgICog5p+l6K+i6YOo6Zeo566h55CG5pWw5o2uCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHQg6YOo6Zeo5L+h5oGvCisgICAgICogQHJldHVybiDpg6jpl6jkv6Hmga/pm4blkIgKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBARGF0YVNjb3BlKGRlcHRBbGlhcyA9ICJkIikKKyAgICBwdWJsaWMgTGlzdDxTeXNEZXB0PiBzZWxlY3REZXB0TGlzdChTeXNEZXB0IGRlcHQpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdE1hcHBlci5zZWxlY3REZXB0TGlzdChkZXB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lpg6jpl6jmoJHnu5PmnoTkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdCDpg6jpl6jkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOmDqOmXqOagkeS/oeaBr+mbhuWQiAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFRyZWVTZWxlY3Q+IHNlbGVjdERlcHRUcmVlTGlzdChTeXNEZXB0IGRlcHQpCisgICAgeworICAgICAgICBMaXN0PFN5c0RlcHQ+IGRlcHRzID0gU3ByaW5nVXRpbHMuZ2V0QW9wUHJveHkodGhpcykuc2VsZWN0RGVwdExpc3QoZGVwdCk7CisgICAgICAgIHJldHVybiBidWlsZERlcHRUcmVlU2VsZWN0KGRlcHRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/miYDpnIDopoHmoJHnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdHMg6YOo6Zeo5YiX6KGoCisgICAgICogQHJldHVybiDmoJHnu5PmnoTliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTeXNEZXB0PiBidWlsZERlcHRUcmVlKExpc3Q8U3lzRGVwdD4gZGVwdHMpCisgICAgeworICAgICAgICBMaXN0PFN5c0RlcHQ+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN5c0RlcHQ+KCk7CisgICAgICAgIExpc3Q8TG9uZz4gdGVtcExpc3QgPSBkZXB0cy5zdHJlYW0oKS5tYXAoU3lzRGVwdDo6Z2V0RGVwdElkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBmb3IgKFN5c0RlcHQgZGVwdCA6IGRlcHRzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyDlpoLmnpzmmK/pobbnuqfoioLngrksIOmBjeWOhuivpeeItuiKgueCueeahOaJgOacieWtkOiKgueCuQorICAgICAgICAgICAgaWYgKCF0ZW1wTGlzdC5jb250YWlucyhkZXB0LmdldFBhcmVudElkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZuKGRlcHRzLCBkZXB0KTsKKyAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChkZXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmV0dXJuTGlzdC5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkxpc3QgPSBkZXB0czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/miYDpnIDopoHkuIvmi4nmoJHnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdHMg6YOo6Zeo5YiX6KGoCisgICAgICogQHJldHVybiDkuIvmi4nmoJHnu5PmnoTliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUcmVlU2VsZWN0PiBidWlsZERlcHRUcmVlU2VsZWN0KExpc3Q8U3lzRGVwdD4gZGVwdHMpCisgICAgeworICAgICAgICBMaXN0PFN5c0RlcHQ+IGRlcHRUcmVlcyA9IGJ1aWxkRGVwdFRyZWUoZGVwdHMpOworICAgICAgICByZXR1cm4gZGVwdFRyZWVzLnN0cmVhbSgpLm1hcChUcmVlU2VsZWN0OjpuZXcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u6KeS6ImySUTmn6Xor6Lpg6jpl6jmoJHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDpgInkuK3pg6jpl6jliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3REZXB0TGlzdEJ5Um9sZUlkKExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgU3lzUm9sZSByb2xlID0gcm9sZU1hcHBlci5zZWxlY3RSb2xlQnlJZChyb2xlSWQpOworICAgICAgICByZXR1cm4gZGVwdE1hcHBlci5zZWxlY3REZXB0TGlzdEJ5Um9sZUlkKHJvbGVJZCwgcm9sZS5pc0RlcHRDaGVja1N0cmljdGx5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrumDqOmXqElE5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g6YOo6Zeo5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c0RlcHQgc2VsZWN0RGVwdEJ5SWQoTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICByZXR1cm4gZGVwdE1hcHBlci5zZWxlY3REZXB0QnlJZChkZXB0SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrklE5p+l6K+i5omA5pyJ5a2Q6YOo6Zeo77yI5q2j5bi454q25oCB77yJCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g5a2Q6YOo6Zeo5pWwCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzZWxlY3ROb3JtYWxDaGlsZHJlbkRlcHRCeUlkKExvbmcgZGVwdElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlcHRNYXBwZXIuc2VsZWN0Tm9ybWFsQ2hpbGRyZW5EZXB0QnlJZChkZXB0SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaYr+WQpuWtmOWcqOWtkOiKgueCuQorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkQnlEZXB0SWQoTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICBpbnQgcmVzdWx0ID0gZGVwdE1hcHBlci5oYXNDaGlsZEJ5RGVwdElkKGRlcHRJZCk7CisgICAgICAgIHJldHVybiByZXN1bHQgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivoumDqOmXqOaYr+WQpuWtmOWcqOeUqOaItworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6YOo6ZeoSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenCB0cnVlIOWtmOWcqCBmYWxzZSDkuI3lrZjlnKgKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0RlcHRFeGlzdFVzZXIoTG9uZyBkZXB0SWQpCisgICAgeworICAgICAgICBpbnQgcmVzdWx0ID0gZGVwdE1hcHBlci5jaGVja0RlcHRFeGlzdFVzZXIoZGVwdElkKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6YOo6Zeo5ZCN56ew5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIGRlcHQg6YOo6Zeo5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0RlcHROYW1lVW5pcXVlKFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIExvbmcgZGVwdElkID0gU3RyaW5nVXRpbHMuaXNOdWxsKGRlcHQuZ2V0RGVwdElkKCkpID8gLTFMIDogZGVwdC5nZXREZXB0SWQoKTsKKyAgICAgICAgU3lzRGVwdCBpbmZvID0gZGVwdE1hcHBlci5jaGVja0RlcHROYW1lVW5pcXVlKGRlcHQuZ2V0RGVwdE5hbWUoKSwgZGVwdC5nZXRQYXJlbnRJZCgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChpbmZvKSAmJiBpbmZvLmdldERlcHRJZCgpLmxvbmdWYWx1ZSgpICE9IGRlcHRJZC5sb25nVmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuTk9UX1VOSVFVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5VTklRVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6YOo6Zeo5piv5ZCm5pyJ5pWw5o2u5p2D6ZmQCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hpZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoZWNrRGVwdERhdGFTY29wZShMb25nIGRlcHRJZCkKKyAgICB7CisgICAgICAgIGlmICghU3lzVXNlci5pc0FkbWluKFNlY3VyaXR5VXRpbHMuZ2V0VXNlcklkKCkpICYmIFN0cmluZ1V0aWxzLmlzTm90TnVsbChkZXB0SWQpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXNEZXB0IGRlcHQgPSBuZXcgU3lzRGVwdCgpOworICAgICAgICAgICAgZGVwdC5zZXREZXB0SWQoZGVwdElkKTsKKyAgICAgICAgICAgIExpc3Q8U3lzRGVwdD4gZGVwdHMgPSBTcHJpbmdVdGlscy5nZXRBb3BQcm94eSh0aGlzKS5zZWxlY3REZXB0TGlzdChkZXB0KTsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGRlcHRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbigi5rKh5pyJ5p2D6ZmQ6K6/6Zeu6YOo6Zeo5pWw5o2u77yBIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7kv53lrZjpg6jpl6jkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVwdCDpg6jpl6jkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0RGVwdChTeXNEZXB0IGRlcHQpCisgICAgeworICAgICAgICBTeXNEZXB0IGluZm8gPSBkZXB0TWFwcGVyLnNlbGVjdERlcHRCeUlkKGRlcHQuZ2V0UGFyZW50SWQoKSk7CisgICAgICAgIC8vIOWmguaenOeItuiKgueCueS4jeS4uuato+W4uOeKtuaAgSzliJnkuI3lhYHorrjmlrDlop7lrZDoioLngrkKKyAgICAgICAgaWYgKCFVc2VyQ29uc3RhbnRzLkRFUFRfTk9STUFMLmVxdWFscyhpbmZvLmdldFN0YXR1cygpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIumDqOmXqOWBnOeUqO+8jOS4jeWFgeiuuOaWsOWiniIpOworICAgICAgICB9CisgICAgICAgIGRlcHQuc2V0QW5jZXN0b3JzKGluZm8uZ2V0QW5jZXN0b3JzKCkgKyAiLCIgKyBkZXB0LmdldFBhcmVudElkKCkpOworICAgICAgICByZXR1cm4gZGVwdE1hcHBlci5pbnNlcnREZXB0KGRlcHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOmDqOmXqOS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOmDqOmXqOS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGVEZXB0KFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIFN5c0RlcHQgbmV3UGFyZW50RGVwdCA9IGRlcHRNYXBwZXIuc2VsZWN0RGVwdEJ5SWQoZGVwdC5nZXRQYXJlbnRJZCgpKTsKKyAgICAgICAgU3lzRGVwdCBvbGREZXB0ID0gZGVwdE1hcHBlci5zZWxlY3REZXB0QnlJZChkZXB0LmdldERlcHRJZCgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChuZXdQYXJlbnREZXB0KSAmJiBTdHJpbmdVdGlscy5pc05vdE51bGwob2xkRGVwdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuZXdBbmNlc3RvcnMgPSBuZXdQYXJlbnREZXB0LmdldEFuY2VzdG9ycygpICsgIiwiICsgbmV3UGFyZW50RGVwdC5nZXREZXB0SWQoKTsKKyAgICAgICAgICAgIFN0cmluZyBvbGRBbmNlc3RvcnMgPSBvbGREZXB0LmdldEFuY2VzdG9ycygpOworICAgICAgICAgICAgZGVwdC5zZXRBbmNlc3RvcnMobmV3QW5jZXN0b3JzKTsKKyAgICAgICAgICAgIHVwZGF0ZURlcHRDaGlsZHJlbihkZXB0LmdldERlcHRJZCgpLCBuZXdBbmNlc3RvcnMsIG9sZEFuY2VzdG9ycyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJlc3VsdCA9IGRlcHRNYXBwZXIudXBkYXRlRGVwdChkZXB0KTsKKyAgICAgICAgaWYgKFVzZXJDb25zdGFudHMuREVQVF9OT1JNQUwuZXF1YWxzKGRlcHQuZ2V0U3RhdHVzKCkpICYmIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZGVwdC5nZXRBbmNlc3RvcnMoKSkKKyAgICAgICAgICAgICAgICAmJiAhU3RyaW5nVXRpbHMuZXF1YWxzKCIwIiwgZGVwdC5nZXRBbmNlc3RvcnMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOWmguaenOivpemDqOmXqOaYr+WQr+eUqOeKtuaAge+8jOWImeWQr+eUqOivpemDqOmXqOeahOaJgOacieS4iue6p+mDqOmXqAorICAgICAgICAgICAgdXBkYXRlUGFyZW50RGVwdFN0YXR1c05vcm1hbChkZXB0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueivpemDqOmXqOeahOeItue6p+mDqOmXqOeKtuaAgQorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0IOW9k+WJjemDqOmXqAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnREZXB0U3RhdHVzTm9ybWFsKFN5c0RlcHQgZGVwdCkKKyAgICB7CisgICAgICAgIFN0cmluZyBhbmNlc3RvcnMgPSBkZXB0LmdldEFuY2VzdG9ycygpOworICAgICAgICBMb25nW10gZGVwdElkcyA9IENvbnZlcnQudG9Mb25nQXJyYXkoYW5jZXN0b3JzKTsKKyAgICAgICAgZGVwdE1hcHBlci51cGRhdGVEZXB0U3RhdHVzTm9ybWFsKGRlcHRJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueWtkOWFg+e0oOWFs+ezuworICAgICAqIAorICAgICAqIEBwYXJhbSBkZXB0SWQg6KKr5L+u5pS555qE6YOo6ZeoSUQKKyAgICAgKiBAcGFyYW0gbmV3QW5jZXN0b3JzIOaWsOeahOeItklE6ZuG5ZCICisgICAgICogQHBhcmFtIG9sZEFuY2VzdG9ycyDml6fnmoTniLZJROmbhuWQiAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURlcHRDaGlsZHJlbihMb25nIGRlcHRJZCwgU3RyaW5nIG5ld0FuY2VzdG9ycywgU3RyaW5nIG9sZEFuY2VzdG9ycykKKyAgICB7CisgICAgICAgIExpc3Q8U3lzRGVwdD4gY2hpbGRyZW4gPSBkZXB0TWFwcGVyLnNlbGVjdENoaWxkcmVuRGVwdEJ5SWQoZGVwdElkKTsKKyAgICAgICAgZm9yIChTeXNEZXB0IGNoaWxkIDogY2hpbGRyZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoaWxkLnNldEFuY2VzdG9ycyhjaGlsZC5nZXRBbmNlc3RvcnMoKS5yZXBsYWNlRmlyc3Qob2xkQW5jZXN0b3JzLCBuZXdBbmNlc3RvcnMpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hpbGRyZW4uc2l6ZSgpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVwdE1hcHBlci51cGRhdGVEZXB0Q2hpbGRyZW4oY2hpbGRyZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk6YOo6Zeo566h55CG5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRlcHRJZCDpg6jpl6hJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVEZXB0QnlJZChMb25nIGRlcHRJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZXB0TWFwcGVyLmRlbGV0ZURlcHRCeUlkKGRlcHRJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCS5b2S5YiX6KGoCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlY3Vyc2lvbkZuKExpc3Q8U3lzRGVwdD4gbGlzdCwgU3lzRGVwdCB0KQorICAgIHsKKyAgICAgICAgLy8g5b6X5Yiw5a2Q6IqC54K55YiX6KGoCisgICAgICAgIExpc3Q8U3lzRGVwdD4gY2hpbGRMaXN0ID0gZ2V0Q2hpbGRMaXN0KGxpc3QsIHQpOworICAgICAgICB0LnNldENoaWxkcmVuKGNoaWxkTGlzdCk7CisgICAgICAgIGZvciAoU3lzRGVwdCB0Q2hpbGQgOiBjaGlsZExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoYXNDaGlsZChsaXN0LCB0Q2hpbGQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZuKGxpc3QsIHRDaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDlvpfliLDlrZDoioLngrnliJfooagKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8U3lzRGVwdD4gZ2V0Q2hpbGRMaXN0KExpc3Q8U3lzRGVwdD4gbGlzdCwgU3lzRGVwdCB0KQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNEZXB0PiB0bGlzdCA9IG5ldyBBcnJheUxpc3Q8U3lzRGVwdD4oKTsKKyAgICAgICAgSXRlcmF0b3I8U3lzRGVwdD4gaXQgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c0RlcHQgbiA9IChTeXNEZXB0KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKG4uZ2V0UGFyZW50SWQoKSkgJiYgbi5nZXRQYXJlbnRJZCgpLmxvbmdWYWx1ZSgpID09IHQuZ2V0RGVwdElkKCkubG9uZ1ZhbHVlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGxpc3QuYWRkKG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0bGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliKTmlq3mmK/lkKbmnInlrZDoioLngrkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2hpbGQoTGlzdDxTeXNEZXB0PiBsaXN0LCBTeXNEZXB0IHQpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRMaXN0KGxpc3QsIHQpLnNpemUoKSA+IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzRGljdERhdGFTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzRGljdERhdGFTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZWQ1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNEaWN0RGF0YVNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdERhdGE7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5EaWN0VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzRGljdERhdGFNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNEaWN0RGF0YVNlcnZpY2U7CisKKy8qKgorICog5a2X5YW4IOS4muWKoeWxguWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzRGljdERhdGFTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElTeXNEaWN0RGF0YVNlcnZpY2UKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNEaWN0RGF0YU1hcHBlciBkaWN0RGF0YU1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOagueaNruadoeS7tuWIhumhteafpeivouWtl+WFuOaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0RGF0YSDlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c0RpY3REYXRhPiBzZWxlY3REaWN0RGF0YUxpc3QoU3lzRGljdERhdGEgZGljdERhdGEpCisgICAgeworICAgICAgICByZXR1cm4gZGljdERhdGFNYXBwZXIuc2VsZWN0RGljdERhdGFMaXN0KGRpY3REYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnovlkozlrZflhbjplK7lgLzmn6Xor6LlrZflhbjmlbDmja7kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHBhcmFtIGRpY3RWYWx1ZSDlrZflhbjplK7lgLwKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOagh+etvgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgc2VsZWN0RGljdExhYmVsKFN0cmluZyBkaWN0VHlwZSwgU3RyaW5nIGRpY3RWYWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0RGF0YU1hcHBlci5zZWxlY3REaWN0TGFiZWwoZGljdFR5cGUsIGRpY3RWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5a2X5YW45pWw5o2uSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdENvZGUg5a2X5YW45pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeXNEaWN0RGF0YSBzZWxlY3REaWN0RGF0YUJ5SWQoTG9uZyBkaWN0Q29kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0RGF0YU1hcHBlci5zZWxlY3REaWN0RGF0YUJ5SWQoZGljdENvZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0Q29kZXMg6ZyA6KaB5Yig6Zmk55qE5a2X5YW45pWw5o2uSUQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVEaWN0RGF0YUJ5SWRzKExvbmdbXSBkaWN0Q29kZXMpCisgICAgeworICAgICAgICBmb3IgKExvbmcgZGljdENvZGUgOiBkaWN0Q29kZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c0RpY3REYXRhIGRhdGEgPSBzZWxlY3REaWN0RGF0YUJ5SWQoZGljdENvZGUpOworICAgICAgICAgICAgZGljdERhdGFNYXBwZXIuZGVsZXRlRGljdERhdGFCeUlkKGRpY3RDb2RlKTsKKyAgICAgICAgICAgIExpc3Q8U3lzRGljdERhdGE+IGRpY3REYXRhcyA9IGRpY3REYXRhTWFwcGVyLnNlbGVjdERpY3REYXRhQnlUeXBlKGRhdGEuZ2V0RGljdFR5cGUoKSk7CisgICAgICAgICAgICBEaWN0VXRpbHMuc2V0RGljdENhY2hlKGRhdGEuZ2V0RGljdFR5cGUoKSwgZGljdERhdGFzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuS/neWtmOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhIOWtl+WFuOaVsOaNruS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBpbnNlcnREaWN0RGF0YShTeXNEaWN0RGF0YSBkYXRhKQorICAgIHsKKyAgICAgICAgaW50IHJvdyA9IGRpY3REYXRhTWFwcGVyLmluc2VydERpY3REYXRhKGRhdGEpOworICAgICAgICBpZiAocm93ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxTeXNEaWN0RGF0YT4gZGljdERhdGFzID0gZGljdERhdGFNYXBwZXIuc2VsZWN0RGljdERhdGFCeVR5cGUoZGF0YS5nZXREaWN0VHlwZSgpKTsKKyAgICAgICAgICAgIERpY3RVdGlscy5zZXREaWN0Q2FjaGUoZGF0YS5nZXREaWN0VHlwZSgpLCBkaWN0RGF0YXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb3c7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55L+d5a2Y5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGEg5a2X5YW45pWw5o2u5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZURpY3REYXRhKFN5c0RpY3REYXRhIGRhdGEpCisgICAgeworICAgICAgICBpbnQgcm93ID0gZGljdERhdGFNYXBwZXIudXBkYXRlRGljdERhdGEoZGF0YSk7CisgICAgICAgIGlmIChyb3cgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PFN5c0RpY3REYXRhPiBkaWN0RGF0YXMgPSBkaWN0RGF0YU1hcHBlci5zZWxlY3REaWN0RGF0YUJ5VHlwZShkYXRhLmdldERpY3RUeXBlKCkpOworICAgICAgICAgICAgRGljdFV0aWxzLnNldERpY3RDYWNoZShkYXRhLmdldERpY3RUeXBlKCksIGRpY3REYXRhcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNEaWN0VHlwZVNlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNEaWN0VHlwZVNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MjhjNAotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c0RpY3RUeXBlU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGpha2FydGEuYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRyYW5zYWN0aW9uLmFubm90YXRpb24uVHJhbnNhY3Rpb25hbDsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdERhdGE7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzRGljdFR5cGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLkRpY3RVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c0RpY3REYXRhTWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c0RpY3RUeXBlTWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzRGljdFR5cGVTZXJ2aWNlOworCisvKioKKyAqIOWtl+WFuCDkuJrliqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c0RpY3RUeXBlU2VydmljZUltcGwgaW1wbGVtZW50cyBJU3lzRGljdFR5cGVTZXJ2aWNlCit7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzRGljdFR5cGVNYXBwZXIgZGljdFR5cGVNYXBwZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNEaWN0RGF0YU1hcHBlciBkaWN0RGF0YU1hcHBlcjsKKworICAgIC8qKgorICAgICAqIOmhueebruWQr+WKqOaXtu+8jOWIneWni+WMluWtl+WFuOWIsOe8k+WtmAorICAgICAqLworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgICBsb2FkaW5nRGljdENhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5p2h5Lu25YiG6aG15p+l6K+i5a2X5YW457G75Z6LCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RUeXBlIOWtl+WFuOexu+Wei+S/oeaBrworICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6L6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzRGljdFR5cGU+IHNlbGVjdERpY3RUeXBlTGlzdChTeXNEaWN0VHlwZSBkaWN0VHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0VHlwZU1hcHBlci5zZWxlY3REaWN0VHlwZUxpc3QoZGljdFR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruaJgOacieWtl+WFuOexu+WeiworICAgICAqIAorICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6L6ZuG5ZCI5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzRGljdFR5cGU+IHNlbGVjdERpY3RUeXBlQWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0VHlwZU1hcHBlci5zZWxlY3REaWN0VHlwZUFsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei+afpeivouWtl+WFuOaVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaWN0VHlwZSDlrZflhbjnsbvlnosKKyAgICAgKiBAcmV0dXJuIOWtl+WFuOaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c0RpY3REYXRhPiBzZWxlY3REaWN0RGF0YUJ5VHlwZShTdHJpbmcgZGljdFR5cGUpCisgICAgeworICAgICAgICBMaXN0PFN5c0RpY3REYXRhPiBkaWN0RGF0YXMgPSBEaWN0VXRpbHMuZ2V0RGljdENhY2hlKGRpY3RUeXBlKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZGljdERhdGFzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRpY3REYXRhczsKKyAgICAgICAgfQorICAgICAgICBkaWN0RGF0YXMgPSBkaWN0RGF0YU1hcHBlci5zZWxlY3REaWN0RGF0YUJ5VHlwZShkaWN0VHlwZSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGRpY3REYXRhcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpY3RVdGlscy5zZXREaWN0Q2FjaGUoZGljdFR5cGUsIGRpY3REYXRhcyk7CisgICAgICAgICAgICByZXR1cm4gZGljdERhdGFzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNruWtl+WFuOexu+Wei0lE5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3RJZCDlrZflhbjnsbvlnotJRAorICAgICAqIEByZXR1cm4g5a2X5YW457G75Z6LCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c0RpY3RUeXBlIHNlbGVjdERpY3RUeXBlQnlJZChMb25nIGRpY3RJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBkaWN0VHlwZU1hcHBlci5zZWxlY3REaWN0VHlwZUJ5SWQoZGljdElkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7lrZflhbjnsbvlnovmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdFR5cGUg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDlrZflhbjnsbvlnosKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3lzRGljdFR5cGUgc2VsZWN0RGljdFR5cGVCeVR5cGUoU3RyaW5nIGRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRpY3RUeXBlTWFwcGVyLnNlbGVjdERpY3RUeXBlQnlUeXBlKGRpY3RUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmibnph4/liKDpmaTlrZflhbjnsbvlnovkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdElkcyDpnIDopoHliKDpmaTnmoTlrZflhbhJRAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZURpY3RUeXBlQnlJZHMoTG9uZ1tdIGRpY3RJZHMpCisgICAgeworICAgICAgICBmb3IgKExvbmcgZGljdElkIDogZGljdElkcykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzRGljdFR5cGUgZGljdFR5cGUgPSBzZWxlY3REaWN0VHlwZUJ5SWQoZGljdElkKTsKKyAgICAgICAgICAgIGlmIChkaWN0RGF0YU1hcHBlci5jb3VudERpY3REYXRhQnlUeXBlKGRpY3RUeXBlLmdldERpY3RUeXBlKCkpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlMSRz5bey5YiG6YWNLOS4jeiDveWIoOmZpCIsIGRpY3RUeXBlLmdldERpY3ROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpY3RUeXBlTWFwcGVyLmRlbGV0ZURpY3RUeXBlQnlJZChkaWN0SWQpOworICAgICAgICAgICAgRGljdFV0aWxzLnJlbW92ZURpY3RDYWNoZShkaWN0VHlwZS5nZXREaWN0VHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOWKoOi9veWtl+WFuOe8k+WtmOaVsOaNrgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxvYWRpbmdEaWN0Q2FjaGUoKQorICAgIHsKKyAgICAgICAgU3lzRGljdERhdGEgZGljdERhdGEgPSBuZXcgU3lzRGljdERhdGEoKTsKKyAgICAgICAgZGljdERhdGEuc2V0U3RhdHVzKCIwIik7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3lzRGljdERhdGE+PiBkaWN0RGF0YU1hcCA9IGRpY3REYXRhTWFwcGVyLnNlbGVjdERpY3REYXRhTGlzdChkaWN0RGF0YSkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoU3lzRGljdERhdGE6OmdldERpY3RUeXBlKSk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTeXNEaWN0RGF0YT4+IGVudHJ5IDogZGljdERhdGFNYXAuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgRGljdFV0aWxzLnNldERpY3RDYWNoZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKS5zb3J0ZWQoQ29tcGFyYXRvci5jb21wYXJpbmcoU3lzRGljdERhdGE6OmdldERpY3RTb3J0KSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmuIXnqbrlrZflhbjnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhckRpY3RDYWNoZSgpCisgICAgeworICAgICAgICBEaWN0VXRpbHMuY2xlYXJEaWN0Q2FjaGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDph43nva7lrZflhbjnvJPlrZjmlbDmja4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldERpY3RDYWNoZSgpCisgICAgeworICAgICAgICBjbGVhckRpY3RDYWNoZSgpOworICAgICAgICBsb2FkaW5nRGljdENhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGRpY3Qg5a2X5YW457G75Z6L5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluc2VydERpY3RUeXBlKFN5c0RpY3RUeXBlIGRpY3QpCisgICAgeworICAgICAgICBpbnQgcm93ID0gZGljdFR5cGVNYXBwZXIuaW5zZXJ0RGljdFR5cGUoZGljdCk7CisgICAgICAgIGlmIChyb3cgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBEaWN0VXRpbHMuc2V0RGljdENhY2hlKGRpY3QuZ2V0RGljdFR5cGUoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjlrZflhbjnsbvlnovkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGljdCDlrZflhbjnsbvlnovkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCB1cGRhdGVEaWN0VHlwZShTeXNEaWN0VHlwZSBkaWN0KQorICAgIHsKKyAgICAgICAgU3lzRGljdFR5cGUgb2xkRGljdCA9IGRpY3RUeXBlTWFwcGVyLnNlbGVjdERpY3RUeXBlQnlJZChkaWN0LmdldERpY3RJZCgpKTsKKyAgICAgICAgZGljdERhdGFNYXBwZXIudXBkYXRlRGljdERhdGFUeXBlKG9sZERpY3QuZ2V0RGljdFR5cGUoKSwgZGljdC5nZXREaWN0VHlwZSgpKTsKKyAgICAgICAgaW50IHJvdyA9IGRpY3RUeXBlTWFwcGVyLnVwZGF0ZURpY3RUeXBlKGRpY3QpOworICAgICAgICBpZiAocm93ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxTeXNEaWN0RGF0YT4gZGljdERhdGFzID0gZGljdERhdGFNYXBwZXIuc2VsZWN0RGljdERhdGFCeVR5cGUoZGljdC5nZXREaWN0VHlwZSgpKTsKKyAgICAgICAgICAgIERpY3RVdGlscy5zZXREaWN0Q2FjaGUoZGljdC5nZXREaWN0VHlwZSgpLCBkaWN0RGF0YXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb3c7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM5a2X5YW457G75Z6L56ew5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIGRpY3Qg5a2X5YW457G75Z6LCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0RpY3RUeXBlVW5pcXVlKFN5c0RpY3RUeXBlIGRpY3QpCisgICAgeworICAgICAgICBMb25nIGRpY3RJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbChkaWN0LmdldERpY3RJZCgpKSA/IC0xTCA6IGRpY3QuZ2V0RGljdElkKCk7CisgICAgICAgIFN5c0RpY3RUeXBlIGRpY3RUeXBlID0gZGljdFR5cGVNYXBwZXIuY2hlY2tEaWN0VHlwZVVuaXF1ZShkaWN0LmdldERpY3RUeXBlKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGRpY3RUeXBlKSAmJiBkaWN0VHlwZS5nZXREaWN0SWQoKS5sb25nVmFsdWUoKSAhPSBkaWN0SWQubG9uZ1ZhbHVlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLk5PVF9VTklRVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuVU5JUVVFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c0xvZ2luaW5mb3JTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzTG9naW5pbmZvclNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YWVjYgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c0xvZ2luaW5mb3JTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTG9naW5pbmZvcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNMb2dpbmluZm9yTWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzTG9naW5pbmZvclNlcnZpY2U7CisKKy8qKgorICog57O757uf6K6/6Zeu5pel5b+X5oOF5Ya15L+h5oGvIOacjeWKoeWxguWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzTG9naW5pbmZvclNlcnZpY2VJbXBsIGltcGxlbWVudHMgSVN5c0xvZ2luaW5mb3JTZXJ2aWNlCit7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNMb2dpbmluZm9yTWFwcGVyIGxvZ2luaW5mb3JNYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7ns7vnu5/nmbvlvZXml6Xlv5cKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9naW5pbmZvciDorr/pl67ml6Xlv5flr7nosaEKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRMb2dpbmluZm9yKFN5c0xvZ2luaW5mb3IgbG9naW5pbmZvcikKKyAgICB7CisgICAgICAgIGxvZ2luaW5mb3JNYXBwZXIuaW5zZXJ0TG9naW5pbmZvcihsb2dpbmluZm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/nmbvlvZXml6Xlv5fpm4blkIgKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbG9naW5pbmZvciDorr/pl67ml6Xlv5flr7nosaEKKyAgICAgKiBAcmV0dXJuIOeZu+W9leiusOW9lembhuWQiAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c0xvZ2luaW5mb3I+IHNlbGVjdExvZ2luaW5mb3JMaXN0KFN5c0xvZ2luaW5mb3IgbG9naW5pbmZvcikKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbmluZm9yTWFwcGVyLnNlbGVjdExvZ2luaW5mb3JMaXN0KGxvZ2luaW5mb3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOezu+e7n+eZu+W9leaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZvSWRzIOmcgOimgeWIoOmZpOeahOeZu+W9leaXpeW/l0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZUxvZ2luaW5mb3JCeUlkcyhMb25nW10gaW5mb0lkcykKKyAgICB7CisgICAgICAgIHJldHVybiBsb2dpbmluZm9yTWFwcGVyLmRlbGV0ZUxvZ2luaW5mb3JCeUlkcyhpbmZvSWRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmuIXnqbrns7vnu5/nmbvlvZXml6Xlv5cKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhbkxvZ2luaW5mb3IoKQorICAgIHsKKyAgICAgICAgbG9naW5pbmZvck1hcHBlci5jbGVhbkxvZ2luaW5mb3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNNZW51U2VydmljZUltcGwuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c01lbnVTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTc4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNNZW51U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDU0MyBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuVXNlckNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLlRyZWVTZWxlY3Q7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzTWVudTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNSb2xlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1VzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TZWN1cml0eVV0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU3RyaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4udm8uTWV0YVZvOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLnZvLlJvdXRlclZvOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c01lbnVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzUm9sZU1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNSb2xlTWVudU1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c01lbnVTZXJ2aWNlOworCisvKioKKyAqIOiPnOWNlSDkuJrliqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c01lbnVTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElTeXNNZW51U2VydmljZQoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRU1JU1NJT05fU1RSSU5HID0gInBlcm1zW1wiezB9XCJdIjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c01lbnVNYXBwZXIgbWVudU1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1JvbGVNYXBwZXIgcm9sZU1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1JvbGVNZW51TWFwcGVyIHJvbGVNZW51TWFwcGVyOworCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi35p+l6K+i57O757uf6I+c5Y2V5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzTWVudT4gc2VsZWN0TWVudUxpc3QoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICByZXR1cm4gc2VsZWN0TWVudUxpc3QobmV3IFN5c01lbnUoKSwgdXNlcklkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6Lns7vnu5/oj5zljZXliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOiPnOWNleWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c01lbnU+IHNlbGVjdE1lbnVMaXN0KFN5c01lbnUgbWVudSwgTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICBMaXN0PFN5c01lbnU+IG1lbnVMaXN0ID0gbnVsbDsKKyAgICAgICAgLy8g566h55CG5ZGY5pi+56S65omA5pyJ6I+c5Y2V5L+h5oGvCisgICAgICAgIGlmIChTeXNVc2VyLmlzQWRtaW4odXNlcklkKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVudUxpc3QgPSBtZW51TWFwcGVyLnNlbGVjdE1lbnVMaXN0KG1lbnUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVudS5nZXRQYXJhbXMoKS5wdXQoInVzZXJJZCIsIHVzZXJJZCk7CisgICAgICAgICAgICBtZW51TGlzdCA9IG1lbnVNYXBwZXIuc2VsZWN0TWVudUxpc3RCeVVzZXJJZChtZW51KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWVudUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6LmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc2VsZWN0TWVudVBlcm1zQnlVc2VySWQoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4gcGVybXMgPSBtZW51TWFwcGVyLnNlbGVjdE1lbnVQZXJtc0J5VXNlcklkKHVzZXJJZCk7CisgICAgICAgIFNldDxTdHJpbmc+IHBlcm1zU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKFN0cmluZyBwZXJtIDogcGVybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBlcm0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcm1zU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBlcm0udHJpbSgpLnNwbGl0KCIsIikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGVybXNTZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u6KeS6ImySUTmn6Xor6LmnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDmnYPpmZDliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc2VsZWN0TWVudVBlcm1zQnlSb2xlSWQoTG9uZyByb2xlSWQpCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4gcGVybXMgPSBtZW51TWFwcGVyLnNlbGVjdE1lbnVQZXJtc0J5Um9sZUlkKHJvbGVJZCk7CisgICAgICAgIFNldDxTdHJpbmc+IHBlcm1zU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKFN0cmluZyBwZXJtIDogcGVybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHBlcm0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcm1zU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBlcm0udHJpbSgpLnNwbGl0KCIsIikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGVybXNTZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u55So5oi3SUTmn6Xor6Loj5zljZUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt+WQjeensAorICAgICAqIEByZXR1cm4g6I+c5Y2V5YiX6KGoCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzTWVudT4gc2VsZWN0TWVudVRyZWVCeVVzZXJJZChMb25nIHVzZXJJZCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzTWVudT4gbWVudXMgPSBudWxsOworICAgICAgICBpZiAoU2VjdXJpdHlVdGlscy5pc0FkbWluKHVzZXJJZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbnVzID0gbWVudU1hcHBlci5zZWxlY3RNZW51VHJlZUFsbCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVudXMgPSBtZW51TWFwcGVyLnNlbGVjdE1lbnVUcmVlQnlVc2VySWQodXNlcklkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0Q2hpbGRQZXJtcyhtZW51cywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u6KeS6ImySUTmn6Xor6Loj5zljZXmoJHkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDpgInkuK3oj5zljZXliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RNZW51TGlzdEJ5Um9sZUlkKExvbmcgcm9sZUlkKQorICAgIHsKKyAgICAgICAgU3lzUm9sZSByb2xlID0gcm9sZU1hcHBlci5zZWxlY3RSb2xlQnlJZChyb2xlSWQpOworICAgICAgICByZXR1cm4gbWVudU1hcHBlci5zZWxlY3RNZW51TGlzdEJ5Um9sZUlkKHJvbGVJZCwgcm9sZS5pc01lbnVDaGVja1N0cmljdGx5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaehOW7uuWJjeerr+i3r+eUseaJgOmcgOimgeeahOiPnOWNlQorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51cyDoj5zljZXliJfooagKKyAgICAgKiBAcmV0dXJuIOi3r+eUseWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJvdXRlclZvPiBidWlsZE1lbnVzKExpc3Q8U3lzTWVudT4gbWVudXMpCisgICAgeworICAgICAgICBMaXN0PFJvdXRlclZvPiByb3V0ZXJzID0gbmV3IExpbmtlZExpc3Q8Um91dGVyVm8+KCk7CisgICAgICAgIGZvciAoU3lzTWVudSBtZW51IDogbWVudXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvdXRlclZvIHJvdXRlciA9IG5ldyBSb3V0ZXJWbygpOworICAgICAgICAgICAgcm91dGVyLnNldEhpZGRlbigiMSIuZXF1YWxzKG1lbnUuZ2V0VmlzaWJsZSgpKSk7CisgICAgICAgICAgICByb3V0ZXIuc2V0TmFtZShnZXRSb3V0ZU5hbWUobWVudSkpOworICAgICAgICAgICAgcm91dGVyLnNldFBhdGgoZ2V0Um91dGVyUGF0aChtZW51KSk7CisgICAgICAgICAgICByb3V0ZXIuc2V0Q29tcG9uZW50KGdldENvbXBvbmVudChtZW51KSk7CisgICAgICAgICAgICByb3V0ZXIuc2V0UXVlcnkobWVudS5nZXRRdWVyeSgpKTsKKyAgICAgICAgICAgIHJvdXRlci5zZXRNZXRhKG5ldyBNZXRhVm8obWVudS5nZXRNZW51TmFtZSgpLCBtZW51LmdldEljb24oKSwgU3RyaW5nVXRpbHMuZXF1YWxzKCIxIiwgbWVudS5nZXRJc0NhY2hlKCkpLCBtZW51LmdldFBhdGgoKSkpOworICAgICAgICAgICAgTGlzdDxTeXNNZW51PiBjTWVudXMgPSBtZW51LmdldENoaWxkcmVuKCk7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShjTWVudXMpICYmIFVzZXJDb25zdGFudHMuVFlQRV9ESVIuZXF1YWxzKG1lbnUuZ2V0TWVudVR5cGUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm91dGVyLnNldEFsd2F5c1Nob3codHJ1ZSk7CisgICAgICAgICAgICAgICAgcm91dGVyLnNldFJlZGlyZWN0KCJub1JlZGlyZWN0Iik7CisgICAgICAgICAgICAgICAgcm91dGVyLnNldENoaWxkcmVuKGJ1aWxkTWVudXMoY01lbnVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc01lbnVGcmFtZShtZW51KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb3V0ZXIuc2V0TWV0YShudWxsKTsKKyAgICAgICAgICAgICAgICBMaXN0PFJvdXRlclZvPiBjaGlsZHJlbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFJvdXRlclZvPigpOworICAgICAgICAgICAgICAgIFJvdXRlclZvIGNoaWxkcmVuID0gbmV3IFJvdXRlclZvKCk7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uc2V0UGF0aChtZW51LmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uc2V0Q29tcG9uZW50KG1lbnUuZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNldE5hbWUoZ2V0Um91dGVOYW1lKG1lbnUuZ2V0Um91dGVOYW1lKCksIG1lbnUuZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uc2V0TWV0YShuZXcgTWV0YVZvKG1lbnUuZ2V0TWVudU5hbWUoKSwgbWVudS5nZXRJY29uKCksIFN0cmluZ1V0aWxzLmVxdWFscygiMSIsIG1lbnUuZ2V0SXNDYWNoZSgpKSwgbWVudS5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5zZXRRdWVyeShtZW51LmdldFF1ZXJ5KCkpOworICAgICAgICAgICAgICAgIGNoaWxkcmVuTGlzdC5hZGQoY2hpbGRyZW4pOworICAgICAgICAgICAgICAgIHJvdXRlci5zZXRDaGlsZHJlbihjaGlsZHJlbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobWVudS5nZXRQYXJlbnRJZCgpLmludFZhbHVlKCkgPT0gMCAmJiBpc0lubmVyTGluayhtZW51KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb3V0ZXIuc2V0TWV0YShuZXcgTWV0YVZvKG1lbnUuZ2V0TWVudU5hbWUoKSwgbWVudS5nZXRJY29uKCkpKTsKKyAgICAgICAgICAgICAgICByb3V0ZXIuc2V0UGF0aCgiLyIpOworICAgICAgICAgICAgICAgIExpc3Q8Um91dGVyVm8+IGNoaWxkcmVuTGlzdCA9IG5ldyBBcnJheUxpc3Q8Um91dGVyVm8+KCk7CisgICAgICAgICAgICAgICAgUm91dGVyVm8gY2hpbGRyZW4gPSBuZXcgUm91dGVyVm8oKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVyUGF0aCA9IGlubmVyTGlua1JlcGxhY2VFYWNoKG1lbnUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5zZXRQYXRoKHJvdXRlclBhdGgpOworICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNldENvbXBvbmVudChVc2VyQ29uc3RhbnRzLklOTkVSX0xJTkspOworICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNldE5hbWUoZ2V0Um91dGVOYW1lKG1lbnUuZ2V0Um91dGVOYW1lKCksIHJvdXRlclBhdGgpKTsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5zZXRNZXRhKG5ldyBNZXRhVm8obWVudS5nZXRNZW51TmFtZSgpLCBtZW51LmdldEljb24oKSwgbWVudS5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbkxpc3QuYWRkKGNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICByb3V0ZXIuc2V0Q2hpbGRyZW4oY2hpbGRyZW5MaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvdXRlcnMuYWRkKHJvdXRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdXRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p6E5bu65YmN56uv5omA6ZyA6KaB5qCR57uT5p6ECisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVzIOiPnOWNleWIl+ihqAorICAgICAqIEByZXR1cm4g5qCR57uT5p6E5YiX6KGoCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzTWVudT4gYnVpbGRNZW51VHJlZShMaXN0PFN5c01lbnU+IG1lbnVzKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNNZW51PiByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdDxTeXNNZW51PigpOworICAgICAgICBMaXN0PExvbmc+IHRlbXBMaXN0ID0gbWVudXMuc3RyZWFtKCkubWFwKFN5c01lbnU6OmdldE1lbnVJZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxTeXNNZW51PiBpdGVyYXRvciA9IG1lbnVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c01lbnUgbWVudSA9IChTeXNNZW51KSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAvLyDlpoLmnpzmmK/pobbnuqfoioLngrksIOmBjeWOhuivpeeItuiKgueCueeahOaJgOacieWtkOiKgueCuQorICAgICAgICAgICAgaWYgKCF0ZW1wTGlzdC5jb250YWlucyhtZW51LmdldFBhcmVudElkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZuKG1lbnVzLCBtZW51KTsKKyAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChtZW51KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmV0dXJuTGlzdC5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkxpc3QgPSBtZW51czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmnoTlu7rliY3nq6/miYDpnIDopoHkuIvmi4nmoJHnu5PmnoQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudXMg6I+c5Y2V5YiX6KGoCisgICAgICogQHJldHVybiDkuIvmi4nmoJHnu5PmnoTliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUcmVlU2VsZWN0PiBidWlsZE1lbnVUcmVlU2VsZWN0KExpc3Q8U3lzTWVudT4gbWVudXMpCisgICAgeworICAgICAgICBMaXN0PFN5c01lbnU+IG1lbnVUcmVlcyA9IGJ1aWxkTWVudVRyZWUobWVudXMpOworICAgICAgICByZXR1cm4gbWVudVRyZWVzLnN0cmVhbSgpLm1hcChUcmVlU2VsZWN0OjpuZXcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u6I+c5Y2VSUTmn6Xor6Lkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudUlkIOiPnOWNlUlECisgICAgICogQHJldHVybiDoj5zljZXkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3lzTWVudSBzZWxlY3RNZW51QnlJZChMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZW51TWFwcGVyLnNlbGVjdE1lbnVCeUlkKG1lbnVJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5a2Y5Zyo6I+c5Y2V5a2Q6IqC54K5CisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRCeU1lbnVJZChMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIGludCByZXN1bHQgPSBtZW51TWFwcGVyLmhhc0NoaWxkQnlNZW51SWQobWVudUlkKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i6I+c5Y2V5L2/55So5pWw6YePCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tNZW51RXhpc3RSb2xlKExvbmcgbWVudUlkKQorICAgIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJvbGVNZW51TWFwcGVyLmNoZWNrTWVudUV4aXN0Um9sZShtZW51SWQpOworICAgICAgICByZXR1cm4gcmVzdWx0ID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7kv53lrZjoj5zljZXkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW5zZXJ0TWVudShTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICByZXR1cm4gbWVudU1hcHBlci5pbnNlcnRNZW51KG1lbnUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueS/neWtmOiPnOWNleS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IOiPnOWNleS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGVNZW51KFN5c01lbnUgbWVudSkKKyAgICB7CisgICAgICAgIHJldHVybiBtZW51TWFwcGVyLnVwZGF0ZU1lbnUobWVudSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk6I+c5Y2V566h55CG5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnVJZCDoj5zljZVJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVNZW51QnlJZChMb25nIG1lbnVJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZW51TWFwcGVyLmRlbGV0ZU1lbnVCeUlkKG1lbnVJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6I+c5Y2V5ZCN56ew5piv5ZCm5ZSv5LiACisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUg6I+c5Y2V5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja01lbnVOYW1lVW5pcXVlKFN5c01lbnUgbWVudSkKKyAgICB7CisgICAgICAgIExvbmcgbWVudUlkID0gU3RyaW5nVXRpbHMuaXNOdWxsKG1lbnUuZ2V0TWVudUlkKCkpID8gLTFMIDogbWVudS5nZXRNZW51SWQoKTsKKyAgICAgICAgU3lzTWVudSBpbmZvID0gbWVudU1hcHBlci5jaGVja01lbnVOYW1lVW5pcXVlKG1lbnUuZ2V0TWVudU5hbWUoKSwgbWVudS5nZXRQYXJlbnRJZCgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChpbmZvKSAmJiBpbmZvLmdldE1lbnVJZCgpLmxvbmdWYWx1ZSgpICE9IG1lbnVJZC5sb25nVmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuTk9UX1VOSVFVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5VTklRVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6Lev55Sx5ZCN56ewCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUg6I+c5Y2V5L+h5oGvCisgICAgICogQHJldHVybiDot6/nlLHlkI3np7AKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvdXRlTmFtZShTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICAvLyDpnZ7lpJbpk77lubbkuJTmmK/kuIDnuqfnm67lvZXvvIjnsbvlnovkuLrnm67lvZXvvIkKKyAgICAgICAgaWYgKGlzTWVudUZyYW1lKG1lbnUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFJvdXRlTmFtZShtZW51LmdldFJvdXRlTmFtZSgpLCBtZW51LmdldFBhdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6Lev55Sx5ZCN56ew77yM5aaC5rKh5pyJ6YWN572u6Lev55Sx5ZCN56ew5YiZ5Y+W6Lev55Sx5Zyw5Z2ACisgICAgICogCisgICAgICogQHBhcmFtIHJvdXRlck5hbWUg6Lev55Sx5ZCN56ewCisgICAgICogQHBhcmFtIHBhdGgg6Lev55Sx5Zyw5Z2ACisgICAgICogQHJldHVybiDot6/nlLHlkI3np7DvvIjpqbzls7DmoLzlvI/vvIkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvdXRlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpCisgICAgeworICAgICAgICBTdHJpbmcgcm91dGVyTmFtZSA9IFN0cmluZ1V0aWxzLmlzTm90RW1wdHkobmFtZSkgPyBuYW1lIDogcGF0aDsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmNhcGl0YWxpemUocm91dGVyTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W6Lev55Sx5Zyw5Z2ACisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUg6I+c5Y2V5L+h5oGvCisgICAgICogQHJldHVybiDot6/nlLHlnLDlnYAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvdXRlclBhdGgoU3lzTWVudSBtZW51KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHJvdXRlclBhdGggPSBtZW51LmdldFBhdGgoKTsKKyAgICAgICAgLy8g5YaF6ZO+5omT5byA5aSW572R5pa55byPCisgICAgICAgIGlmIChtZW51LmdldFBhcmVudElkKCkuaW50VmFsdWUoKSAhPSAwICYmIGlzSW5uZXJMaW5rKG1lbnUpKQorICAgICAgICB7CisgICAgICAgICAgICByb3V0ZXJQYXRoID0gaW5uZXJMaW5rUmVwbGFjZUVhY2gocm91dGVyUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgLy8g6Z2e5aSW6ZO+5bm25LiU5piv5LiA57qn55uu5b2V77yI57G75Z6L5Li655uu5b2V77yJCisgICAgICAgIGlmICgwID09IG1lbnUuZ2V0UGFyZW50SWQoKS5pbnRWYWx1ZSgpICYmIFVzZXJDb25zdGFudHMuVFlQRV9ESVIuZXF1YWxzKG1lbnUuZ2V0TWVudVR5cGUoKSkKKyAgICAgICAgICAgICAgICAmJiBVc2VyQ29uc3RhbnRzLk5PX0ZSQU1FLmVxdWFscyhtZW51LmdldElzRnJhbWUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdXRlclBhdGggPSAiLyIgKyBtZW51LmdldFBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICAvLyDpnZ7lpJbpk77lubbkuJTmmK/kuIDnuqfnm67lvZXvvIjnsbvlnovkuLroj5zljZXvvIkKKyAgICAgICAgZWxzZSBpZiAoaXNNZW51RnJhbWUobWVudSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdXRlclBhdGggPSAiLyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdXRlclBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICog6I635Y+W57uE5Lu25L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUg6I+c5Y2V5L+h5oGvCisgICAgICogQHJldHVybiDnu4Tku7bkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudChTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICBTdHJpbmcgY29tcG9uZW50ID0gVXNlckNvbnN0YW50cy5MQVlPVVQ7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KG1lbnUuZ2V0Q29tcG9uZW50KCkpICYmICFpc01lbnVGcmFtZShtZW51KSkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcG9uZW50ID0gbWVudS5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG1lbnUuZ2V0Q29tcG9uZW50KCkpICYmIG1lbnUuZ2V0UGFyZW50SWQoKS5pbnRWYWx1ZSgpICE9IDAgJiYgaXNJbm5lckxpbmsobWVudSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXBvbmVudCA9IFVzZXJDb25zdGFudHMuSU5ORVJfTElOSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChTdHJpbmdVdGlscy5pc0VtcHR5KG1lbnUuZ2V0Q29tcG9uZW50KCkpICYmIGlzUGFyZW50VmlldyhtZW51KSkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcG9uZW50ID0gVXNlckNvbnN0YW50cy5QQVJFTlRfVklFVzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIOaYr+WQpuS4uuiPnOWNleWGhemDqOi3s+i9rAorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IOiPnOWNleS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNZW51RnJhbWUoU3lzTWVudSBtZW51KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbnUuZ2V0UGFyZW50SWQoKS5pbnRWYWx1ZSgpID09IDAgJiYgVXNlckNvbnN0YW50cy5UWVBFX01FTlUuZXF1YWxzKG1lbnUuZ2V0TWVudVR5cGUoKSkKKyAgICAgICAgICAgICAgICAmJiBtZW51LmdldElzRnJhbWUoKS5lcXVhbHMoVXNlckNvbnN0YW50cy5OT19GUkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5Li65YaF6ZO+57uE5Lu2CisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUg6I+c5Y2V5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lubmVyTGluayhTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICByZXR1cm4gbWVudS5nZXRJc0ZyYW1lKCkuZXF1YWxzKFVzZXJDb25zdGFudHMuTk9fRlJBTUUpICYmIFN0cmluZ1V0aWxzLmlzaHR0cChtZW51LmdldFBhdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5piv5ZCm5Li6cGFyZW50X3ZpZXfnu4Tku7YKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSDoj5zljZXkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUGFyZW50VmlldyhTeXNNZW51IG1lbnUpCisgICAgeworICAgICAgICByZXR1cm4gbWVudS5nZXRQYXJlbnRJZCgpLmludFZhbHVlKCkgIT0gMCAmJiBVc2VyQ29uc3RhbnRzLlRZUEVfRElSLmVxdWFscyhtZW51LmdldE1lbnVUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrueItuiKgueCueeahElE6I635Y+W5omA5pyJ5a2Q6IqC54K5CisgICAgICogCisgICAgICogQHBhcmFtIGxpc3Qg5YiG57G76KGoCisgICAgICogQHBhcmFtIHBhcmVudElkIOS8oOWFpeeahOeItuiKgueCuUlECisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTeXNNZW51PiBnZXRDaGlsZFBlcm1zKExpc3Q8U3lzTWVudT4gbGlzdCwgaW50IHBhcmVudElkKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNNZW51PiByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdDxTeXNNZW51PigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPFN5c01lbnU+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXNNZW51IHQgPSAoU3lzTWVudSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgLy8g5LiA44CB5qC55o2u5Lyg5YWl55qE5p+Q5Liq54i26IqC54K5SUQs6YGN5Y6G6K+l54i26IqC54K555qE5omA5pyJ5a2Q6IqC54K5CisgICAgICAgICAgICBpZiAodC5nZXRQYXJlbnRJZCgpID09IHBhcmVudElkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZuKGxpc3QsIHQpOworICAgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAkuW9kuWIl+ihqAorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXN0IOWIhuexu+ihqAorICAgICAqIEBwYXJhbSB0IOWtkOiKgueCuQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWN1cnNpb25GbihMaXN0PFN5c01lbnU+IGxpc3QsIFN5c01lbnUgdCkKKyAgICB7CisgICAgICAgIC8vIOW+l+WIsOWtkOiKgueCueWIl+ihqAorICAgICAgICBMaXN0PFN5c01lbnU+IGNoaWxkTGlzdCA9IGdldENoaWxkTGlzdChsaXN0LCB0KTsKKyAgICAgICAgdC5zZXRDaGlsZHJlbihjaGlsZExpc3QpOworICAgICAgICBmb3IgKFN5c01lbnUgdENoaWxkIDogY2hpbGRMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzQ2hpbGQobGlzdCwgdENoaWxkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWN1cnNpb25GbihsaXN0LCB0Q2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5b6X5Yiw5a2Q6IqC54K55YiX6KGoCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFN5c01lbnU+IGdldENoaWxkTGlzdChMaXN0PFN5c01lbnU+IGxpc3QsIFN5c01lbnUgdCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzTWVudT4gdGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN5c01lbnU+KCk7CisgICAgICAgIEl0ZXJhdG9yPFN5c01lbnU+IGl0ID0gbGlzdC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXNNZW51IG4gPSAoU3lzTWVudSkgaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKG4uZ2V0UGFyZW50SWQoKS5sb25nVmFsdWUoKSA9PSB0LmdldE1lbnVJZCgpLmxvbmdWYWx1ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRsaXN0LmFkZChuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yik5pat5piv5ZCm5pyJ5a2Q6IqC54K5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NoaWxkKExpc3Q8U3lzTWVudT4gbGlzdCwgU3lzTWVudSB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkTGlzdChsaXN0LCB0KS5zaXplKCkgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWGhemTvuWfn+WQjeeJueauiuWtl+espuabv+aNogorICAgICAqIAorICAgICAqIEByZXR1cm4g5pu/5o2i5ZCO55qE5YaF6ZO+5Z+f5ZCNCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbm5lckxpbmtSZXBsYWNlRWFjaChTdHJpbmcgcGF0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5yZXBsYWNlRWFjaChwYXRoLCBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuSFRUUCwgQ29uc3RhbnRzLkhUVFBTLCBDb25zdGFudHMuV1dXLCAiLiIsICI6IiB9LAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICIiLCAiIiwgIiIsICIvIiwgIi8iIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c05vdGljZVNlcnZpY2VJbXBsLmphdmEgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNOb3RpY2VTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTQzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNOb3RpY2VTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2UgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzTm90aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c05vdGljZU1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c05vdGljZVNlcnZpY2U7CisKKy8qKgorICog5YWs5ZGKIOacjeWKoeWxguWunueOsAorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzTm90aWNlU2VydmljZUltcGwgaW1wbGVtZW50cyBJU3lzTm90aWNlU2VydmljZQoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c05vdGljZU1hcHBlciBub3RpY2VNYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LlhazlkYrkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm90aWNlSWQg5YWs5ZGKSUQKKyAgICAgKiBAcmV0dXJuIOWFrOWRiuS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeXNOb3RpY2Ugc2VsZWN0Tm90aWNlQnlJZChMb25nIG5vdGljZUlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vdGljZU1hcHBlci5zZWxlY3ROb3RpY2VCeUlkKG5vdGljZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LlhazlkYrliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm90aWNlIOWFrOWRiuS/oeaBrworICAgICAqIEByZXR1cm4g5YWs5ZGK6ZuG5ZCICisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzTm90aWNlPiBzZWxlY3ROb3RpY2VMaXN0KFN5c05vdGljZSBub3RpY2UpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlTWFwcGVyLnNlbGVjdE5vdGljZUxpc3Qobm90aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7lhazlkYoKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbm90aWNlIOWFrOWRiuS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBpbnNlcnROb3RpY2UoU3lzTm90aWNlIG5vdGljZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub3RpY2VNYXBwZXIuaW5zZXJ0Tm90aWNlKG5vdGljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS55YWs5ZGKCisgICAgICogCisgICAgICogQHBhcmFtIG5vdGljZSDlhazlkYrkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlTm90aWNlKFN5c05vdGljZSBub3RpY2UpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlTWFwcGVyLnVwZGF0ZU5vdGljZShub3RpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWIoOmZpOWFrOWRiuWvueixoQorICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2VJZCDlhazlkYpJRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVOb3RpY2VCeUlkKExvbmcgbm90aWNlSWQpCisgICAgeworICAgICAgICByZXR1cm4gbm90aWNlTWFwcGVyLmRlbGV0ZU5vdGljZUJ5SWQobm90aWNlSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOWFrOWRiuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBub3RpY2VJZHMg6ZyA6KaB5Yig6Zmk55qE5YWs5ZGKSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlTm90aWNlQnlJZHMoTG9uZ1tdIG5vdGljZUlkcykKKyAgICB7CisgICAgICAgIHJldHVybiBub3RpY2VNYXBwZXIuZGVsZXRlTm90aWNlQnlJZHMobm90aWNlSWRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNPcGVyTG9nU2VydmljZUltcGwuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c09wZXJMb2dTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODk4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNPcGVyTG9nU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c09wZXJMb2c7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzT3BlckxvZ01hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c09wZXJMb2dTZXJ2aWNlOworCisvKioKKyAqIOaTjeS9nOaXpeW/lyDmnI3liqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c09wZXJMb2dTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElTeXNPcGVyTG9nU2VydmljZQoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c09wZXJMb2dNYXBwZXIgb3BlckxvZ01hcHBlcjsKKworICAgIC8qKgorICAgICAqIOaWsOWinuaTjeS9nOaXpeW/lworICAgICAqIAorICAgICAqIEBwYXJhbSBvcGVyTG9nIOaTjeS9nOaXpeW/l+WvueixoQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluc2VydE9wZXJsb2coU3lzT3BlckxvZyBvcGVyTG9nKQorICAgIHsKKyAgICAgICAgb3BlckxvZ01hcHBlci5pbnNlcnRPcGVybG9nKG9wZXJMb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouezu+e7n+aTjeS9nOaXpeW/l+mbhuWQiAorICAgICAqIAorICAgICAqIEBwYXJhbSBvcGVyTG9nIOaTjeS9nOaXpeW/l+WvueixoQorICAgICAqIEByZXR1cm4g5pON5L2c5pel5b+X6ZuG5ZCICisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzT3BlckxvZz4gc2VsZWN0T3BlckxvZ0xpc3QoU3lzT3BlckxvZyBvcGVyTG9nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJMb2dNYXBwZXIuc2VsZWN0T3BlckxvZ0xpc3Qob3BlckxvZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk57O757uf5pON5L2c5pel5b+XCisgICAgICogCisgICAgICogQHBhcmFtIG9wZXJJZHMg6ZyA6KaB5Yig6Zmk55qE5pON5L2c5pel5b+XSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlT3BlckxvZ0J5SWRzKExvbmdbXSBvcGVySWRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJMb2dNYXBwZXIuZGVsZXRlT3BlckxvZ0J5SWRzKG9wZXJJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOafpeivouaTjeS9nOaXpeW/l+ivpue7hgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcGVySWQg5pON5L2cSUQKKyAgICAgKiBAcmV0dXJuIOaTjeS9nOaXpeW/l+WvueixoQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeXNPcGVyTG9nIHNlbGVjdE9wZXJMb2dCeUlkKExvbmcgb3BlcklkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJMb2dNYXBwZXIuc2VsZWN0T3BlckxvZ0J5SWQob3BlcklkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmuIXnqbrmk43kvZzml6Xlv5cKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhbk9wZXJMb2coKQorICAgIHsKKyAgICAgICAgb3BlckxvZ01hcHBlci5jbGVhbk9wZXJMb2coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNQb3N0U2VydmljZUltcGwuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c1Bvc3RTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWZlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNQb3N0U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvbnN0YW50LlVzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1Bvc3Q7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzUG9zdE1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNVc2VyUG9zdE1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c1Bvc3RTZXJ2aWNlOworCisvKioKKyAqIOWyl+S9jeS/oeaBryDmnI3liqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c1Bvc3RTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElTeXNQb3N0U2VydmljZQoreworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1Bvc3RNYXBwZXIgcG9zdE1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1VzZXJQb3N0TWFwcGVyIHVzZXJQb3N0TWFwcGVyOworCisgICAgLyoqCisgICAgICog5p+l6K+i5bKX5L2N5L+h5oGv6ZuG5ZCICisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDlspfkvY3kv6Hmga/pm4blkIgKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTeXNQb3N0PiBzZWxlY3RQb3N0TGlzdChTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdE1hcHBlci5zZWxlY3RQb3N0TGlzdChwb3N0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LmiYDmnInlspfkvY0KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOWyl+S9jeWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c1Bvc3Q+IHNlbGVjdFBvc3RBbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvc3RNYXBwZXIuc2VsZWN0UG9zdEFsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmui/h+Wyl+S9jUlE5p+l6K+i5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3RJZCDlspfkvY1JRAorICAgICAqIEByZXR1cm4g6KeS6Imy5a+56LGh5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c1Bvc3Qgc2VsZWN0UG9zdEJ5SWQoTG9uZyBwb3N0SWQpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdE1hcHBlci5zZWxlY3RQb3N0QnlJZChwb3N0SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE6I635Y+W5bKX5L2N6YCJ5oup5qGG5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit5bKX5L2NSUTliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RQb3N0TGlzdEJ5VXNlcklkKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvc3RNYXBwZXIuc2VsZWN0UG9zdExpc3RCeVVzZXJJZCh1c2VySWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjOWyl+S9jeWQjeensOaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3N0IOWyl+S9jeS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQb3N0TmFtZVVuaXF1ZShTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICBMb25nIHBvc3RJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbChwb3N0LmdldFBvc3RJZCgpKSA/IC0xTCA6IHBvc3QuZ2V0UG9zdElkKCk7CisgICAgICAgIFN5c1Bvc3QgaW5mbyA9IHBvc3RNYXBwZXIuY2hlY2tQb3N0TmFtZVVuaXF1ZShwb3N0LmdldFBvc3ROYW1lKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGluZm8pICYmIGluZm8uZ2V0UG9zdElkKCkubG9uZ1ZhbHVlKCkgIT0gcG9zdElkLmxvbmdWYWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5OT1RfVU5JUVVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLlVOSVFVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozlspfkvY3nvJbnoIHmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdCDlspfkvY3kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrUG9zdENvZGVVbmlxdWUoU3lzUG9zdCBwb3N0KQorICAgIHsKKyAgICAgICAgTG9uZyBwb3N0SWQgPSBTdHJpbmdVdGlscy5pc051bGwocG9zdC5nZXRQb3N0SWQoKSkgPyAtMUwgOiBwb3N0LmdldFBvc3RJZCgpOworICAgICAgICBTeXNQb3N0IGluZm8gPSBwb3N0TWFwcGVyLmNoZWNrUG9zdENvZGVVbmlxdWUocG9zdC5nZXRQb3N0Q29kZSgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChpbmZvKSAmJiBpbmZvLmdldFBvc3RJZCgpLmxvbmdWYWx1ZSgpICE9IHBvc3RJZC5sb25nVmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuTk9UX1VOSVFVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5VTklRVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H5bKX5L2NSUTmn6Xor6LlspfkvY3kvb/nlKjmlbDph48KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdElkIOWyl+S9jUlECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvdW50VXNlclBvc3RCeUlkKExvbmcgcG9zdElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJQb3N0TWFwcGVyLmNvdW50VXNlclBvc3RCeUlkKHBvc3RJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5Yig6Zmk5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3RJZCDlspfkvY1JRAorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGVQb3N0QnlJZChMb25nIHBvc3RJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBwb3N0TWFwcGVyLmRlbGV0ZVBvc3RCeUlkKHBvc3RJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3RJZHMg6ZyA6KaB5Yig6Zmk55qE5bKX5L2NSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlUG9zdEJ5SWRzKExvbmdbXSBwb3N0SWRzKQorICAgIHsKKyAgICAgICAgZm9yIChMb25nIHBvc3RJZCA6IHBvc3RJZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c1Bvc3QgcG9zdCA9IHNlbGVjdFBvc3RCeUlkKHBvc3RJZCk7CisgICAgICAgICAgICBpZiAoY291bnRVc2VyUG9zdEJ5SWQocG9zdElkKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJTEkc+W3suWIhumFjSzkuI3og73liKDpmaQiLCBwb3N0LmdldFBvc3ROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zdE1hcHBlci5kZWxldGVQb3N0QnlJZHMocG9zdElkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y5bKX5L2N5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHBvc3Qg5bKX5L2N5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluc2VydFBvc3QoU3lzUG9zdCBwb3N0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvc3RNYXBwZXIuaW5zZXJ0UG9zdChwb3N0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjlspfkvY3kv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zdCDlspfkvY3kv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlUG9zdChTeXNQb3N0IHBvc3QpCisgICAgeworICAgICAgICByZXR1cm4gcG9zdE1hcHBlci51cGRhdGVQb3N0KHBvc3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c1JvbGVTZXJ2aWNlSW1wbC5qYXZhIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL2phdmEvY29tL3J1b3lpL3N5c3RlbS9zZXJ2aWNlL2ltcGwvU3lzUm9sZVNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMmJiMQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c1JvbGVTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudHJhbnNhY3Rpb24uYW5ub3RhdGlvbi5UcmFuc2FjdGlvbmFsOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uYW5ub3RhdGlvbi5EYXRhU2NvcGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb25zdGFudC5Vc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1JvbGU7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5lbnRpdHkuU3lzVXNlcjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmV4Y2VwdGlvbi5TZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuU2VjdXJpdHlVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlN0cmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24udXRpbHMuc3ByaW5nLlNwcmluZ1V0aWxzOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1JvbGVEZXB0OworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1JvbGVNZW51OworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uZG9tYWluLlN5c1VzZXJSb2xlOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c1JvbGVEZXB0TWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c1JvbGVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzUm9sZU1lbnVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzVXNlclJvbGVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNSb2xlU2VydmljZTsKKworLyoqCisgKiDop5LoibIg5Lia5Yqh5bGC5aSE55CGCisgKiAKKyAqIEBhdXRob3IgcnVveWkKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBTeXNSb2xlU2VydmljZUltcGwgaW1wbGVtZW50cyBJU3lzUm9sZVNlcnZpY2UKK3sKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNSb2xlTWFwcGVyIHJvbGVNYXBwZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNSb2xlTWVudU1hcHBlciByb2xlTWVudU1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFN5c1VzZXJSb2xlTWFwcGVyIHVzZXJSb2xlTWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzUm9sZURlcHRNYXBwZXIgcm9sZURlcHRNYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6Lop5LoibLmlbDmja4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOinkuiJsuaVsOaNrumbhuWQiOS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEYXRhU2NvcGUoZGVwdEFsaWFzID0gImQiKQorICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVMaXN0KFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIHJldHVybiByb2xlTWFwcGVyLnNlbGVjdFJvbGVMaXN0KHJvbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE5p+l6K+i6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6KeS6Imy5YiX6KGoCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3lzUm9sZT4gc2VsZWN0Um9sZXNCeVVzZXJJZChMb25nIHVzZXJJZCkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gdXNlclJvbGVzID0gcm9sZU1hcHBlci5zZWxlY3RSb2xlUGVybWlzc2lvbkJ5VXNlcklkKHVzZXJJZCk7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gcm9sZXMgPSBzZWxlY3RSb2xlQWxsKCk7CisgICAgICAgIGZvciAoU3lzUm9sZSByb2xlIDogcm9sZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU3lzUm9sZSB1c2VyUm9sZSA6IHVzZXJSb2xlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocm9sZS5nZXRSb2xlSWQoKS5sb25nVmFsdWUoKSA9PSB1c2VyUm9sZS5nZXRSb2xlSWQoKS5sb25nVmFsdWUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvbGUuc2V0RmxhZyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByb2xlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7nlKjmiLdJROafpeivouadg+mZkAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcmV0dXJuIOadg+mZkOWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBzZWxlY3RSb2xlUGVybWlzc2lvbkJ5VXNlcklkKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNSb2xlPiBwZXJtcyA9IHJvbGVNYXBwZXIuc2VsZWN0Um9sZVBlcm1pc3Npb25CeVVzZXJJZCh1c2VySWQpOworICAgICAgICBTZXQ8U3RyaW5nPiBwZXJtc1NldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChTeXNSb2xlIHBlcm0gOiBwZXJtcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChwZXJtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZXJtc1NldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwZXJtLmdldFJvbGVLZXkoKS50cmltKCkuc3BsaXQoIiwiKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwZXJtc1NldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LmiYDmnInop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIOinkuiJsuWIl+ihqAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN5c1JvbGU+IHNlbGVjdFJvbGVBbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNwcmluZ1V0aWxzLmdldEFvcFByb3h5KHRoaXMpLnNlbGVjdFJvbGVMaXN0KG5ldyBTeXNSb2xlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagueaNrueUqOaIt0lE6I635Y+W6KeS6Imy6YCJ5oup5qGG5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEByZXR1cm4g6YCJ5Lit6KeS6ImySUTliJfooagKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxMb25nPiBzZWxlY3RSb2xlTGlzdEJ5VXNlcklkKExvbmcgdXNlcklkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVNYXBwZXIuc2VsZWN0Um9sZUxpc3RCeVVzZXJJZCh1c2VySWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmui/h+inkuiJsklE5p+l6K+i6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEByZXR1cm4g6KeS6Imy5a+56LGh5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c1JvbGUgc2VsZWN0Um9sZUJ5SWQoTG9uZyByb2xlSWQpCisgICAgeworICAgICAgICByZXR1cm4gcm9sZU1hcHBlci5zZWxlY3RSb2xlQnlJZChyb2xlSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjOinkuiJsuWQjeensOaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlIOinkuiJsuS/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tSb2xlTmFtZVVuaXF1ZShTeXNSb2xlIHJvbGUpCisgICAgeworICAgICAgICBMb25nIHJvbGVJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbChyb2xlLmdldFJvbGVJZCgpKSA/IC0xTCA6IHJvbGUuZ2V0Um9sZUlkKCk7CisgICAgICAgIFN5c1JvbGUgaW5mbyA9IHJvbGVNYXBwZXIuY2hlY2tSb2xlTmFtZVVuaXF1ZShyb2xlLmdldFJvbGVOYW1lKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGluZm8pICYmIGluZm8uZ2V0Um9sZUlkKCkubG9uZ1ZhbHVlKCkgIT0gcm9sZUlkLmxvbmdWYWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5OT1RfVU5JUVVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLlVOSVFVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozop5LoibLmnYPpmZDmmK/lkKbllK/kuIAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrUm9sZUtleVVuaXF1ZShTeXNSb2xlIHJvbGUpCisgICAgeworICAgICAgICBMb25nIHJvbGVJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbChyb2xlLmdldFJvbGVJZCgpKSA/IC0xTCA6IHJvbGUuZ2V0Um9sZUlkKCk7CisgICAgICAgIFN5c1JvbGUgaW5mbyA9IHJvbGVNYXBwZXIuY2hlY2tSb2xlS2V5VW5pcXVlKHJvbGUuZ2V0Um9sZUtleSgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbChpbmZvKSAmJiBpbmZvLmdldFJvbGVJZCgpLmxvbmdWYWx1ZSgpICE9IHJvbGVJZC5sb25nVmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuTk9UX1VOSVFVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5VTklRVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qCh6aqM6KeS6Imy5piv5ZCm5YWB6K645pON5L2cCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tSb2xlQWxsb3dlZChTeXNSb2xlIHJvbGUpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKHJvbGUuZ2V0Um9sZUlkKCkpICYmIHJvbGUuaXNBZG1pbigpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbigi5LiN5YWB6K645pON5L2c6LaF57qn566h55CG5ZGY6KeS6ImyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozop5LoibLmmK/lkKbmnInmlbDmja7mnYPpmZAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkcyDop5LoibJpZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoZWNrUm9sZURhdGFTY29wZShMb25nLi4uIHJvbGVJZHMpCisgICAgeworICAgICAgICBpZiAoIVN5c1VzZXIuaXNBZG1pbihTZWN1cml0eVV0aWxzLmdldFVzZXJJZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChMb25nIHJvbGVJZCA6IHJvbGVJZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzUm9sZSByb2xlID0gbmV3IFN5c1JvbGUoKTsKKyAgICAgICAgICAgICAgICByb2xlLnNldFJvbGVJZChyb2xlSWQpOworICAgICAgICAgICAgICAgIExpc3Q8U3lzUm9sZT4gcm9sZXMgPSBTcHJpbmdVdGlscy5nZXRBb3BQcm94eSh0aGlzKS5zZWxlY3RSb2xlTGlzdChyb2xlKTsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShyb2xlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZUV4Y2VwdGlvbigi5rKh5pyJ5p2D6ZmQ6K6/6Zeu6KeS6Imy5pWw5o2u77yBIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H6KeS6ImySUTmn6Xor6Lop5LoibLkvb/nlKjmlbDph48KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvdW50VXNlclJvbGVCeVJvbGVJZChMb25nIHJvbGVJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyUm9sZU1hcHBlci5jb3VudFVzZXJSb2xlQnlSb2xlSWQocm9sZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmlrDlop7kv53lrZjop5LoibLkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCBpbnNlcnRSb2xlKFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIC8vIOaWsOWinuinkuiJsuS/oeaBrworICAgICAgICByb2xlTWFwcGVyLmluc2VydFJvbGUocm9sZSk7CisgICAgICAgIHJldHVybiBpbnNlcnRSb2xlTWVudShyb2xlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjop5LoibLkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCB1cGRhdGVSb2xlKFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIC8vIOS/ruaUueinkuiJsuS/oeaBrworICAgICAgICByb2xlTWFwcGVyLnVwZGF0ZVJvbGUocm9sZSk7CisgICAgICAgIC8vIOWIoOmZpOinkuiJsuS4juiPnOWNleWFs+iBlAorICAgICAgICByb2xlTWVudU1hcHBlci5kZWxldGVSb2xlTWVudUJ5Um9sZUlkKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICByZXR1cm4gaW5zZXJ0Um9sZU1lbnUocm9sZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS56KeS6Imy54q25oCBCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGUg6KeS6Imy5L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZVJvbGVTdGF0dXMoU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvbGVNYXBwZXIudXBkYXRlUm9sZShyb2xlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnmlbDmja7mnYPpmZDkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCBhdXRoRGF0YVNjb3BlKFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIC8vIOS/ruaUueinkuiJsuS/oeaBrworICAgICAgICByb2xlTWFwcGVyLnVwZGF0ZVJvbGUocm9sZSk7CisgICAgICAgIC8vIOWIoOmZpOinkuiJsuS4jumDqOmXqOWFs+iBlAorICAgICAgICByb2xlRGVwdE1hcHBlci5kZWxldGVSb2xlRGVwdEJ5Um9sZUlkKHJvbGUuZ2V0Um9sZUlkKCkpOworICAgICAgICAvLyDmlrDlop7op5LoibLlkozpg6jpl6jkv6Hmga/vvIjmlbDmja7mnYPpmZDvvIkKKyAgICAgICAgcmV0dXJuIGluc2VydFJvbGVEZXB0KHJvbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuinkuiJsuiPnOWNleS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlIOinkuiJsuWvueixoQorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0Um9sZU1lbnUoU3lzUm9sZSByb2xlKQorICAgIHsKKyAgICAgICAgaW50IHJvd3MgPSAxOworICAgICAgICAvLyDmlrDlop7nlKjmiLfkuI7op5LoibLnrqHnkIYKKyAgICAgICAgTGlzdDxTeXNSb2xlTWVudT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3lzUm9sZU1lbnU+KCk7CisgICAgICAgIGZvciAoTG9uZyBtZW51SWQgOiByb2xlLmdldE1lbnVJZHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzUm9sZU1lbnUgcm0gPSBuZXcgU3lzUm9sZU1lbnUoKTsKKyAgICAgICAgICAgIHJtLnNldFJvbGVJZChyb2xlLmdldFJvbGVJZCgpKTsKKyAgICAgICAgICAgIHJtLnNldE1lbnVJZChtZW51SWQpOworICAgICAgICAgICAgbGlzdC5hZGQocm0pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvd3MgPSByb2xlTWVudU1hcHBlci5iYXRjaFJvbGVNZW51KGxpc3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByb3dzOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinuinkuiJsumDqOmXqOS/oeaBryjmlbDmja7mnYPpmZApCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSDop5LoibLlr7nosaEKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluc2VydFJvbGVEZXB0KFN5c1JvbGUgcm9sZSkKKyAgICB7CisgICAgICAgIGludCByb3dzID0gMTsKKyAgICAgICAgLy8g5paw5aKe6KeS6Imy5LiO6YOo6Zeo77yI5pWw5o2u5p2D6ZmQ77yJ566h55CGCisgICAgICAgIExpc3Q8U3lzUm9sZURlcHQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN5c1JvbGVEZXB0PigpOworICAgICAgICBmb3IgKExvbmcgZGVwdElkIDogcm9sZS5nZXREZXB0SWRzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c1JvbGVEZXB0IHJkID0gbmV3IFN5c1JvbGVEZXB0KCk7CisgICAgICAgICAgICByZC5zZXRSb2xlSWQocm9sZS5nZXRSb2xlSWQoKSk7CisgICAgICAgICAgICByZC5zZXREZXB0SWQoZGVwdElkKTsKKyAgICAgICAgICAgIGxpc3QuYWRkKHJkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICByb3dzID0gcm9sZURlcHRNYXBwZXIuYmF0Y2hSb2xlRGVwdChsaXN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fop5LoibJJROWIoOmZpOinkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSByb2xlSWQg6KeS6ImySUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZChMb25nIHJvbGVJZCkKKyAgICB7CisgICAgICAgIC8vIOWIoOmZpOinkuiJsuS4juiPnOWNleWFs+iBlAorICAgICAgICByb2xlTWVudU1hcHBlci5kZWxldGVSb2xlTWVudUJ5Um9sZUlkKHJvbGVJZCk7CisgICAgICAgIC8vIOWIoOmZpOinkuiJsuS4jumDqOmXqOWFs+iBlAorICAgICAgICByb2xlRGVwdE1hcHBlci5kZWxldGVSb2xlRGVwdEJ5Um9sZUlkKHJvbGVJZCk7CisgICAgICAgIHJldHVybiByb2xlTWFwcGVyLmRlbGV0ZVJvbGVCeUlkKHJvbGVJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP5Yig6Zmk6KeS6Imy5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZHMg6ZyA6KaB5Yig6Zmk55qE6KeS6ImySUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCBkZWxldGVSb2xlQnlJZHMoTG9uZ1tdIHJvbGVJZHMpCisgICAgeworICAgICAgICBmb3IgKExvbmcgcm9sZUlkIDogcm9sZUlkcykKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tSb2xlQWxsb3dlZChuZXcgU3lzUm9sZShyb2xlSWQpKTsKKyAgICAgICAgICAgIGNoZWNrUm9sZURhdGFTY29wZShyb2xlSWQpOworICAgICAgICAgICAgU3lzUm9sZSByb2xlID0gc2VsZWN0Um9sZUJ5SWQocm9sZUlkKTsKKyAgICAgICAgICAgIGlmIChjb3VudFVzZXJSb2xlQnlSb2xlSWQocm9sZUlkKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJTEkc+W3suWIhumFjSzkuI3og73liKDpmaQiLCByb2xlLmdldFJvbGVOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyDliKDpmaTop5LoibLkuI7oj5zljZXlhbPogZQKKyAgICAgICAgcm9sZU1lbnVNYXBwZXIuZGVsZXRlUm9sZU1lbnUocm9sZUlkcyk7CisgICAgICAgIC8vIOWIoOmZpOinkuiJsuS4jumDqOmXqOWFs+iBlAorICAgICAgICByb2xlRGVwdE1hcHBlci5kZWxldGVSb2xlRGVwdChyb2xlSWRzKTsKKyAgICAgICAgcmV0dXJuIHJvbGVNYXBwZXIuZGVsZXRlUm9sZUJ5SWRzKHJvbGVJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWPlua2iOaOiOadg+eUqOaIt+inkuiJsgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyUm9sZSDnlKjmiLflkozop5LoibLlhbPogZTkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlQXV0aFVzZXIoU3lzVXNlclJvbGUgdXNlclJvbGUpCisgICAgeworICAgICAgICByZXR1cm4gdXNlclJvbGVNYXBwZXIuZGVsZXRlVXNlclJvbGVJbmZvKHVzZXJSb2xlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmibnph4/lj5bmtojmjojmnYPnlKjmiLfop5LoibIKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcm9sZUlkIOinkuiJsklECisgICAgICogQHBhcmFtIHVzZXJJZHMg6ZyA6KaB5Y+W5raI5o6I5p2D55qE55So5oi35pWw5o2uSUQKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlQXV0aFVzZXJzKExvbmcgcm9sZUlkLCBMb25nW10gdXNlcklkcykKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyUm9sZU1hcHBlci5kZWxldGVVc2VyUm9sZUluZm9zKHJvbGVJZCwgdXNlcklkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5om56YeP6YCJ5oup5o6I5p2D55So5oi36KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHJvbGVJZCDop5LoibJJRAorICAgICAqIEBwYXJhbSB1c2VySWRzIOmcgOimgeaOiOadg+eahOeUqOaIt+aVsOaNrklECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluc2VydEF1dGhVc2VycyhMb25nIHJvbGVJZCwgTG9uZ1tdIHVzZXJJZHMpCisgICAgeworICAgICAgICAvLyDmlrDlop7nlKjmiLfkuI7op5LoibLnrqHnkIYKKyAgICAgICAgTGlzdDxTeXNVc2VyUm9sZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3lzVXNlclJvbGU+KCk7CisgICAgICAgIGZvciAoTG9uZyB1c2VySWQgOiB1c2VySWRzKQorICAgICAgICB7CisgICAgICAgICAgICBTeXNVc2VyUm9sZSB1ciA9IG5ldyBTeXNVc2VyUm9sZSgpOworICAgICAgICAgICAgdXIuc2V0VXNlcklkKHVzZXJJZCk7CisgICAgICAgICAgICB1ci5zZXRSb2xlSWQocm9sZUlkKTsKKyAgICAgICAgICAgIGxpc3QuYWRkKHVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXNlclJvbGVNYXBwZXIuYmF0Y2hVc2VyUm9sZShsaXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNVc2VyT25saW5lU2VydmljZUltcGwuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c1VzZXJPbmxpbmVTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGE4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNVc2VyT25saW5lU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDk2IEBACitwYWNrYWdlIGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5pbXBsOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5jb3JlLmRvbWFpbi5tb2RlbC5Mb2dpblVzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNVc2VyT25saW5lOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0uc2VydmljZS5JU3lzVXNlck9ubGluZVNlcnZpY2U7CisKKy8qKgorICog5Zyo57q/55So5oi3IOacjeWKoeWxguWkhOeQhgorICogCisgKiBAYXV0aG9yIHJ1b3lpCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU3lzVXNlck9ubGluZVNlcnZpY2VJbXBsIGltcGxlbWVudHMgSVN5c1VzZXJPbmxpbmVTZXJ2aWNlCit7CisgICAgLyoqCisgICAgICog6YCa6L+H55m75b2V5Zyw5Z2A5p+l6K+i5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIGlwYWRkciDnmbvlvZXlnLDlnYAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWcqOe6v+eUqOaIt+S/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeXNVc2VyT25saW5lIHNlbGVjdE9ubGluZUJ5SXBhZGRyKFN0cmluZyBpcGFkZHIsIExvZ2luVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmVxdWFscyhpcGFkZHIsIHVzZXIuZ2V0SXBhZGRyKCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbG9naW5Vc2VyVG9Vc2VyT25saW5lKHVzZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmAmui/h+eUqOaIt+WQjeensOafpeivouS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI3np7AKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOWcqOe6v+eUqOaIt+S/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeXNVc2VyT25saW5lIHNlbGVjdE9ubGluZUJ5VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lLCBMb2dpblVzZXIgdXNlcikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5lcXVhbHModXNlck5hbWUsIHVzZXIuZ2V0VXNlcm5hbWUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsb2dpblVzZXJUb1VzZXJPbmxpbmUodXNlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H55m75b2V5Zyw5Z2AL+eUqOaIt+WQjeensOafpeivouS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSBpcGFkZHIg55m75b2V5Zyw5Z2ACisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjeensAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g5Zyo57q/55So5oi35L+h5oGvCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c1VzZXJPbmxpbmUgc2VsZWN0T25saW5lQnlJbmZvKFN0cmluZyBpcGFkZHIsIFN0cmluZyB1c2VyTmFtZSwgTG9naW5Vc2VyIHVzZXIpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZXF1YWxzKGlwYWRkciwgdXNlci5nZXRJcGFkZHIoKSkgJiYgU3RyaW5nVXRpbHMuZXF1YWxzKHVzZXJOYW1lLCB1c2VyLmdldFVzZXJuYW1lKCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbG9naW5Vc2VyVG9Vc2VyT25saW5lKHVzZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiuvue9ruWcqOe6v+eUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g5Zyo57q/55So5oi3CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5c1VzZXJPbmxpbmUgbG9naW5Vc2VyVG9Vc2VyT25saW5lKExvZ2luVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyKSB8fCBTdHJpbmdVdGlscy5pc051bGwodXNlci5nZXRVc2VyKCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTeXNVc2VyT25saW5lIHN5c1VzZXJPbmxpbmUgPSBuZXcgU3lzVXNlck9ubGluZSgpOworICAgICAgICBzeXNVc2VyT25saW5lLnNldFRva2VuSWQodXNlci5nZXRUb2tlbigpKTsKKyAgICAgICAgc3lzVXNlck9ubGluZS5zZXRVc2VyTmFtZSh1c2VyLmdldFVzZXJuYW1lKCkpOworICAgICAgICBzeXNVc2VyT25saW5lLnNldElwYWRkcih1c2VyLmdldElwYWRkcigpKTsKKyAgICAgICAgc3lzVXNlck9ubGluZS5zZXRMb2dpbkxvY2F0aW9uKHVzZXIuZ2V0TG9naW5Mb2NhdGlvbigpKTsKKyAgICAgICAgc3lzVXNlck9ubGluZS5zZXRCcm93c2VyKHVzZXIuZ2V0QnJvd3NlcigpKTsKKyAgICAgICAgc3lzVXNlck9ubGluZS5zZXRPcyh1c2VyLmdldE9zKCkpOworICAgICAgICBzeXNVc2VyT25saW5lLnNldExvZ2luVGltZSh1c2VyLmdldExvZ2luVGltZSgpKTsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90TnVsbCh1c2VyLmdldFVzZXIoKS5nZXREZXB0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzeXNVc2VyT25saW5lLnNldERlcHROYW1lKHVzZXIuZ2V0VXNlcigpLmdldERlcHQoKS5nZXREZXB0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3lzVXNlck9ubGluZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNVc2VyU2VydmljZUltcGwuamF2YSBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9qYXZhL2NvbS9ydW95aS9zeXN0ZW0vc2VydmljZS9pbXBsL1N5c1VzZXJTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzMwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vamF2YS9jb20vcnVveWkvc3lzdGVtL3NlcnZpY2UvaW1wbC9TeXNVc2VyU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDU1MCBAQAorcGFja2FnZSBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGpha2FydGEudmFsaWRhdGlvbi5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5hbm5vdGF0aW9uLlRyYW5zYWN0aW9uYWw7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmFubm90YXRpb24uRGF0YVNjb3BlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29uc3RhbnQuVXNlckNvbnN0YW50czsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLmNvcmUuZG9tYWluLmVudGl0eS5TeXNSb2xlOworaW1wb3J0IGNvbS5ydW95aS5jb21tb24uY29yZS5kb21haW4uZW50aXR5LlN5c1VzZXI7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi5leGNlcHRpb24uU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLlNlY3VyaXR5VXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5TdHJpbmdVdGlsczsKK2ltcG9ydCBjb20ucnVveWkuY29tbW9uLnV0aWxzLmJlYW4uQmVhblZhbGlkYXRvcnM7CitpbXBvcnQgY29tLnJ1b3lpLmNvbW1vbi51dGlscy5zcHJpbmcuU3ByaW5nVXRpbHM7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5kb21haW4uU3lzUG9zdDsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNVc2VyUG9zdDsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLmRvbWFpbi5TeXNVc2VyUm9sZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNQb3N0TWFwcGVyOworaW1wb3J0IGNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c1JvbGVNYXBwZXI7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzVXNlck1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNVc2VyUG9zdE1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNVc2VyUm9sZU1hcHBlcjsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c0NvbmZpZ1NlcnZpY2U7CitpbXBvcnQgY29tLnJ1b3lpLnN5c3RlbS5zZXJ2aWNlLklTeXNEZXB0U2VydmljZTsKK2ltcG9ydCBjb20ucnVveWkuc3lzdGVtLnNlcnZpY2UuSVN5c1VzZXJTZXJ2aWNlOworCisvKioKKyAqIOeUqOaItyDkuJrliqHlsYLlpITnkIYKKyAqIAorICogQGF1dGhvciBydW95aQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFN5c1VzZXJTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIElTeXNVc2VyU2VydmljZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTeXNVc2VyU2VydmljZUltcGwuY2xhc3MpOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzVXNlck1hcHBlciB1c2VyTWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzUm9sZU1hcHBlciByb2xlTWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzUG9zdE1hcHBlciBwb3N0TWFwcGVyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgU3lzVXNlclJvbGVNYXBwZXIgdXNlclJvbGVNYXBwZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBTeXNVc2VyUG9zdE1hcHBlciB1c2VyUG9zdE1hcHBlcjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIElTeXNDb25maWdTZXJ2aWNlIGNvbmZpZ1NlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBJU3lzRGVwdFNlcnZpY2UgZGVwdFNlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LnlKjmiLfliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOeUqOaIt+S/oeaBr+mbhuWQiOS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEYXRhU2NvcGUoZGVwdEFsaWFzID0gImQiLCB1c2VyQWxpYXMgPSAidSIpCisgICAgcHVibGljIExpc3Q8U3lzVXNlcj4gc2VsZWN0VXNlckxpc3QoU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJNYXBwZXIuc2VsZWN0VXNlckxpc3QodXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5qC55o2u5p2h5Lu25YiG6aG15p+l6K+i5bey5YiG6YWN55So5oi36KeS6Imy5YiX6KGoCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnlKjmiLfkv6Hmga/pm4blkIjkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBARGF0YVNjb3BlKGRlcHRBbGlhcyA9ICJkIiwgdXNlckFsaWFzID0gInUiKQorICAgIHB1YmxpYyBMaXN0PFN5c1VzZXI+IHNlbGVjdEFsbG9jYXRlZExpc3QoU3lzVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVzZXJNYXBwZXIuc2VsZWN0QWxsb2NhdGVkTGlzdCh1c2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoLnmja7mnaHku7bliIbpobXmn6Xor6LmnKrliIbphY3nlKjmiLfop5LoibLliJfooagKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOeUqOaIt+S/oeaBr+mbhuWQiOS/oeaBrworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEYXRhU2NvcGUoZGVwdEFsaWFzID0gImQiLCB1c2VyQWxpYXMgPSAidSIpCisgICAgcHVibGljIExpc3Q8U3lzVXNlcj4gc2VsZWN0VW5hbGxvY2F0ZWRMaXN0KFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnNlbGVjdFVuYWxsb2NhdGVkTGlzdCh1c2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDpgJrov4fnlKjmiLflkI3mn6Xor6LnlKjmiLcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCNCisgICAgICogQHJldHVybiDnlKjmiLflr7nosaHkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3lzVXNlciBzZWxlY3RVc2VyQnlVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gdXNlck1hcHBlci5zZWxlY3RVc2VyQnlVc2VyTmFtZSh1c2VyTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H55So5oi3SUTmn6Xor6LnlKjmiLcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDnlKjmiLflr7nosaHkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3lzVXNlciBzZWxlY3RVc2VyQnlJZChMb25nIHVzZXJJZCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnNlbGVjdFVzZXJCeUlkKHVzZXJJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5p+l6K+i55So5oi35omA5bGe6KeS6Imy57uECisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBzZWxlY3RVc2VyUm9sZUdyb3VwKFN0cmluZyB1c2VyTmFtZSkKKyAgICB7CisgICAgICAgIExpc3Q8U3lzUm9sZT4gbGlzdCA9IHJvbGVNYXBwZXIuc2VsZWN0Um9sZXNCeVVzZXJOYW1lKHVzZXJOYW1lKTsKKyAgICAgICAgaWYgKENvbGxlY3Rpb25VdGlscy5pc0VtcHR5KGxpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Quc3RyZWFtKCkubWFwKFN5c1JvbGU6OmdldFJvbGVOYW1lKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmn6Xor6LnlKjmiLfmiYDlsZ7lspfkvY3nu4QKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlck5hbWUg55So5oi35ZCNCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHNlbGVjdFVzZXJQb3N0R3JvdXAoU3RyaW5nIHVzZXJOYW1lKQorICAgIHsKKyAgICAgICAgTGlzdDxTeXNQb3N0PiBsaXN0ID0gcG9zdE1hcHBlci5zZWxlY3RQb3N0c0J5VXNlck5hbWUodXNlck5hbWUpOworICAgICAgICBpZiAoQ29sbGVjdGlvblV0aWxzLmlzRW1wdHkobGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5FTVBUWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdC5zdHJlYW0oKS5tYXAoU3lzUG9zdDo6Z2V0UG9zdE5hbWUpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjOeUqOaIt+WQjeensOaYr+WQpuWUr+S4gAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tVc2VyTmFtZVVuaXF1ZShTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBMb25nIHVzZXJJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyLmdldFVzZXJJZCgpKSA/IC0xTCA6IHVzZXIuZ2V0VXNlcklkKCk7CisgICAgICAgIFN5c1VzZXIgaW5mbyA9IHVzZXJNYXBwZXIuY2hlY2tVc2VyTmFtZVVuaXF1ZSh1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGluZm8pICYmIGluZm8uZ2V0VXNlcklkKCkubG9uZ1ZhbHVlKCkgIT0gdXNlcklkLmxvbmdWYWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5OT1RfVU5JUVVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLlVOSVFVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqozmiYvmnLrlj7fnoIHmmK/lkKbllK/kuIAKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja1Bob25lVW5pcXVlKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIExvbmcgdXNlcklkID0gU3RyaW5nVXRpbHMuaXNOdWxsKHVzZXIuZ2V0VXNlcklkKCkpID8gLTFMIDogdXNlci5nZXRVc2VySWQoKTsKKyAgICAgICAgU3lzVXNlciBpbmZvID0gdXNlck1hcHBlci5jaGVja1Bob25lVW5pcXVlKHVzZXIuZ2V0UGhvbmVudW1iZXIoKSk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwoaW5mbykgJiYgaW5mby5nZXRVc2VySWQoKS5sb25nVmFsdWUoKSAhPSB1c2VySWQubG9uZ1ZhbHVlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLk5PVF9VTklRVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFVzZXJDb25zdGFudHMuVU5JUVVFOworICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjGVtYWls5piv5ZCm5ZSv5LiACisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tFbWFpbFVuaXF1ZShTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICBMb25nIHVzZXJJZCA9IFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyLmdldFVzZXJJZCgpKSA/IC0xTCA6IHVzZXIuZ2V0VXNlcklkKCk7CisgICAgICAgIFN5c1VzZXIgaW5mbyA9IHVzZXJNYXBwZXIuY2hlY2tFbWFpbFVuaXF1ZSh1c2VyLmdldEVtYWlsKCkpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3ROdWxsKGluZm8pICYmIGluZm8uZ2V0VXNlcklkKCkubG9uZ1ZhbHVlKCkgIT0gdXNlcklkLmxvbmdWYWx1ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVXNlckNvbnN0YW50cy5OT1RfVU5JUVVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBVc2VyQ29uc3RhbnRzLlVOSVFVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDmoKHpqoznlKjmiLfmmK/lkKblhYHorrjmk43kvZwKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjaGVja1VzZXJBbGxvd2VkKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdE51bGwodXNlci5nZXRVc2VySWQoKSkgJiYgdXNlci5pc0FkbWluKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLkuI3lhYHorrjmk43kvZzotoXnuqfnrqHnkIblkZjnlKjmiLciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOagoemqjOeUqOaIt+aYr+WQpuacieaVsOaNruadg+mZkAorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3aWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjaGVja1VzZXJEYXRhU2NvcGUoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICBpZiAoIVN5c1VzZXIuaXNBZG1pbihTZWN1cml0eVV0aWxzLmdldFVzZXJJZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzVXNlciB1c2VyID0gbmV3IFN5c1VzZXIoKTsKKyAgICAgICAgICAgIHVzZXIuc2V0VXNlcklkKHVzZXJJZCk7CisgICAgICAgICAgICBMaXN0PFN5c1VzZXI+IHVzZXJzID0gU3ByaW5nVXRpbHMuZ2V0QW9wUHJveHkodGhpcykuc2VsZWN0VXNlckxpc3QodXNlcik7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh1c2VycykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oIuayoeacieadg+mZkOiuv+mXrueUqOaIt+aVsOaNru+8gSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog5paw5aKe5L+d5a2Y55So5oi35L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyBpbnQgaW5zZXJ0VXNlcihTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICAvLyDmlrDlop7nlKjmiLfkv6Hmga8KKyAgICAgICAgaW50IHJvd3MgPSB1c2VyTWFwcGVyLmluc2VydFVzZXIodXNlcik7CisgICAgICAgIC8vIOaWsOWinueUqOaIt+Wyl+S9jeWFs+iBlAorICAgICAgICBpbnNlcnRVc2VyUG9zdCh1c2VyKTsKKyAgICAgICAgLy8g5paw5aKe55So5oi35LiO6KeS6Imy566h55CGCisgICAgICAgIGluc2VydFVzZXJSb2xlKHVzZXIpOworICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDms6jlhoznlKjmiLfkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyVXNlcihTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICByZXR1cm4gdXNlck1hcHBlci5pbnNlcnRVc2VyKHVzZXIpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDkv67mlLnkv53lrZjnlKjmiLfkv6Hmga8KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlciDnlKjmiLfkv6Hmga8KKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIGludCB1cGRhdGVVc2VyKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIExvbmcgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKyAgICAgICAgLy8g5Yig6Zmk55So5oi35LiO6KeS6Imy5YWz6IGUCisgICAgICAgIHVzZXJSb2xlTWFwcGVyLmRlbGV0ZVVzZXJSb2xlQnlVc2VySWQodXNlcklkKTsKKyAgICAgICAgLy8g5paw5aKe55So5oi35LiO6KeS6Imy566h55CGCisgICAgICAgIGluc2VydFVzZXJSb2xlKHVzZXIpOworICAgICAgICAvLyDliKDpmaTnlKjmiLfkuI7lspfkvY3lhbPogZQKKyAgICAgICAgdXNlclBvc3RNYXBwZXIuZGVsZXRlVXNlclBvc3RCeVVzZXJJZCh1c2VySWQpOworICAgICAgICAvLyDmlrDlop7nlKjmiLfkuI7lspfkvY3nrqHnkIYKKyAgICAgICAgaW5zZXJ0VXNlclBvc3QodXNlcik7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnVwZGF0ZVVzZXIodXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog55So5oi35o6I5p2D6KeS6ImyCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJJZCDnlKjmiLdJRAorICAgICAqIEBwYXJhbSByb2xlSWRzIOinkuiJsue7hAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIHZvaWQgaW5zZXJ0VXNlckF1dGgoTG9uZyB1c2VySWQsIExvbmdbXSByb2xlSWRzKQorICAgIHsKKyAgICAgICAgdXNlclJvbGVNYXBwZXIuZGVsZXRlVXNlclJvbGVCeVVzZXJJZCh1c2VySWQpOworICAgICAgICBpbnNlcnRVc2VyUm9sZSh1c2VySWQsIHJvbGVJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOS/ruaUueeUqOaIt+eKtuaAgQorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGVVc2VyU3RhdHVzKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnVwZGF0ZVVzZXIodXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS555So5oi35Z+65pys5L+h5oGvCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXIg55So5oi35L+h5oGvCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZVVzZXJQcm9maWxlKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnVwZGF0ZVVzZXIodXNlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICog5L+u5pS555So5oi35aS05YOPCisgICAgICogCisgICAgICogQHBhcmFtIHVzZXJOYW1lIOeUqOaIt+WQjQorICAgICAqIEBwYXJhbSBhdmF0YXIg5aS05YOP5Zyw5Z2ACisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVVc2VyQXZhdGFyKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIGF2YXRhcikKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnVwZGF0ZVVzZXJBdmF0YXIodXNlck5hbWUsIGF2YXRhcikgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmHjee9rueUqOaIt+WvhueggQorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+S/oeaBrworICAgICAqIEByZXR1cm4g57uT5p6cCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZXNldFB3ZChTeXNVc2VyIHVzZXIpCisgICAgeworICAgICAgICByZXR1cm4gdXNlck1hcHBlci51cGRhdGVVc2VyKHVzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOmHjee9rueUqOaIt+WvhueggQorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTmFtZSDnlKjmiLflkI0KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQg5a+G56CBCisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlc2V0VXNlclB3ZChTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBwYXNzd29yZCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyTWFwcGVyLnJlc2V0VXNlclB3ZCh1c2VyTmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinueUqOaIt+inkuiJsuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+WvueixoQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydFVzZXJSb2xlKFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIHRoaXMuaW5zZXJ0VXNlclJvbGUodXNlci5nZXRVc2VySWQoKSwgdXNlci5nZXRSb2xlSWRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinueUqOaIt+Wyl+S9jeS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyIOeUqOaIt+WvueixoQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydFVzZXJQb3N0KFN5c1VzZXIgdXNlcikKKyAgICB7CisgICAgICAgIExvbmdbXSBwb3N0cyA9IHVzZXIuZ2V0UG9zdElkcygpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShwb3N0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIOaWsOWinueUqOaIt+S4juWyl+S9jeeuoeeQhgorICAgICAgICAgICAgTGlzdDxTeXNVc2VyUG9zdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3lzVXNlclBvc3Q+KHBvc3RzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKExvbmcgcG9zdElkIDogcG9zdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzVXNlclBvc3QgdXAgPSBuZXcgU3lzVXNlclBvc3QoKTsKKyAgICAgICAgICAgICAgICB1cC5zZXRVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgICAgICAgICAgdXAuc2V0UG9zdElkKHBvc3RJZCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQodXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNlclBvc3RNYXBwZXIuYmF0Y2hVc2VyUG9zdChsaXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIOaWsOWinueUqOaIt+inkuiJsuS/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWQg55So5oi3SUQKKyAgICAgKiBAcGFyYW0gcm9sZUlkcyDop5LoibLnu4QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRVc2VyUm9sZShMb25nIHVzZXJJZCwgTG9uZ1tdIHJvbGVJZHMpCisgICAgeworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShyb2xlSWRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8g5paw5aKe55So5oi35LiO6KeS6Imy566h55CGCisgICAgICAgICAgICBMaXN0PFN5c1VzZXJSb2xlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTeXNVc2VyUm9sZT4ocm9sZUlkcy5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChMb25nIHJvbGVJZCA6IHJvbGVJZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzVXNlclJvbGUgdXIgPSBuZXcgU3lzVXNlclJvbGUoKTsKKyAgICAgICAgICAgICAgICB1ci5zZXRVc2VySWQodXNlcklkKTsKKyAgICAgICAgICAgICAgICB1ci5zZXRSb2xlSWQocm9sZUlkKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZCh1cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2VyUm9sZU1hcHBlci5iYXRjaFVzZXJSb2xlKGxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICog6YCa6L+H55So5oi3SUTliKDpmaTnlKjmiLcKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdXNlcklkIOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyBpbnQgZGVsZXRlVXNlckJ5SWQoTG9uZyB1c2VySWQpCisgICAgeworICAgICAgICAvLyDliKDpmaTnlKjmiLfkuI7op5LoibLlhbPogZQKKyAgICAgICAgdXNlclJvbGVNYXBwZXIuZGVsZXRlVXNlclJvbGVCeVVzZXJJZCh1c2VySWQpOworICAgICAgICAvLyDliKDpmaTnlKjmiLfkuI7lspfkvY3ooagKKyAgICAgICAgdXNlclBvc3RNYXBwZXIuZGVsZXRlVXNlclBvc3RCeVVzZXJJZCh1c2VySWQpOworICAgICAgICByZXR1cm4gdXNlck1hcHBlci5kZWxldGVVc2VyQnlJZCh1c2VySWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOaJuemHj+WIoOmZpOeUqOaIt+S/oeaBrworICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VySWRzIOmcgOimgeWIoOmZpOeahOeUqOaIt0lECisgICAgICogQHJldHVybiDnu5PmnpwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyBpbnQgZGVsZXRlVXNlckJ5SWRzKExvbmdbXSB1c2VySWRzKQorICAgIHsKKyAgICAgICAgZm9yIChMb25nIHVzZXJJZCA6IHVzZXJJZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrVXNlckFsbG93ZWQobmV3IFN5c1VzZXIodXNlcklkKSk7CisgICAgICAgICAgICBjaGVja1VzZXJEYXRhU2NvcGUodXNlcklkKTsKKyAgICAgICAgfQorICAgICAgICAvLyDliKDpmaTnlKjmiLfkuI7op5LoibLlhbPogZQKKyAgICAgICAgdXNlclJvbGVNYXBwZXIuZGVsZXRlVXNlclJvbGUodXNlcklkcyk7CisgICAgICAgIC8vIOWIoOmZpOeUqOaIt+S4juWyl+S9jeWFs+iBlAorICAgICAgICB1c2VyUG9zdE1hcHBlci5kZWxldGVVc2VyUG9zdCh1c2VySWRzKTsKKyAgICAgICAgcmV0dXJuIHVzZXJNYXBwZXIuZGVsZXRlVXNlckJ5SWRzKHVzZXJJZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIOWvvOWFpeeUqOaIt+aVsOaNrgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyTGlzdCDnlKjmiLfmlbDmja7liJfooagKKyAgICAgKiBAcGFyYW0gaXNVcGRhdGVTdXBwb3J0IOaYr+WQpuabtOaWsOaUr+aMge+8jOWmguaenOW3suWtmOWcqO+8jOWImei/m+ihjOabtOaWsOaVsOaNrgorICAgICAqIEBwYXJhbSBvcGVyTmFtZSDmk43kvZznlKjmiLcKKyAgICAgKiBAcmV0dXJuIOe7k+aenAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgaW1wb3J0VXNlcihMaXN0PFN5c1VzZXI+IHVzZXJMaXN0LCBCb29sZWFuIGlzVXBkYXRlU3VwcG9ydCwgU3RyaW5nIG9wZXJOYW1lKQorICAgIHsKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTnVsbCh1c2VyTGlzdCkgfHwgdXNlckxpc3Quc2l6ZSgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlRXhjZXB0aW9uKCLlr7zlhaXnlKjmiLfmlbDmja7kuI3og73kuLrnqbrvvIEiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3VjY2Vzc051bSA9IDA7CisgICAgICAgIGludCBmYWlsdXJlTnVtID0gMDsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdWNjZXNzTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBmYWlsdXJlTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTeXNVc2VyIHVzZXIgOiB1c2VyTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8g6aqM6K+B5piv5ZCm5a2Y5Zyo6L+Z5Liq55So5oi3CisgICAgICAgICAgICAgICAgU3lzVXNlciB1ID0gdXNlck1hcHBlci5zZWxlY3RVc2VyQnlVc2VyTmFtZSh1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc051bGwodSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCZWFuVmFsaWRhdG9ycy52YWxpZGF0ZVdpdGhFeGNlcHRpb24odmFsaWRhdG9yLCB1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVwdFNlcnZpY2UuY2hlY2tEZXB0RGF0YVNjb3BlKHVzZXIuZ2V0RGVwdElkKCkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBjb25maWdTZXJ2aWNlLnNlbGVjdENvbmZpZ0J5S2V5KCJzeXMudXNlci5pbml0UGFzc3dvcmQiKTsKKyAgICAgICAgICAgICAgICAgICAgdXNlci5zZXRQYXNzd29yZChTZWN1cml0eVV0aWxzLmVuY3J5cHRQYXNzd29yZChwYXNzd29yZCkpOworICAgICAgICAgICAgICAgICAgICB1c2VyLnNldENyZWF0ZUJ5KG9wZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdXNlck1hcHBlci5pbnNlcnRVc2VyKHVzZXIpOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzTnVtKys7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NNc2cuYXBwZW5kKCI8YnIvPiIgKyBzdWNjZXNzTnVtICsgIuOAgei0puWPtyAiICsgdXNlci5nZXRVc2VyTmFtZSgpICsgIiDlr7zlhaXmiJDlip8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNVcGRhdGVTdXBwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQmVhblZhbGlkYXRvcnMudmFsaWRhdGVXaXRoRXhjZXB0aW9uKHZhbGlkYXRvciwgdXNlcik7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVXNlckFsbG93ZWQodSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVXNlckRhdGFTY29wZSh1LmdldFVzZXJJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVwdFNlcnZpY2UuY2hlY2tEZXB0RGF0YVNjb3BlKHVzZXIuZ2V0RGVwdElkKCkpOworICAgICAgICAgICAgICAgICAgICB1c2VyLnNldFVzZXJJZCh1LmdldFVzZXJJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdXNlci5zZXRVcGRhdGVCeShvcGVyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHVzZXJNYXBwZXIudXBkYXRlVXNlcih1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc051bSsrOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzTXNnLmFwcGVuZCgiPGJyLz4iICsgc3VjY2Vzc051bSArICLjgIHotKblj7cgIiArIHVzZXIuZ2V0VXNlck5hbWUoKSArICIg5pu05paw5oiQ5YqfIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVOdW0rKzsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZU1zZy5hcHBlbmQoIjxici8+IiArIGZhaWx1cmVOdW0gKyAi44CB6LSm5Y+3ICIgKyB1c2VyLmdldFVzZXJOYW1lKCkgKyAiIOW3suWtmOWcqCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlTnVtKys7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICI8YnIvPiIgKyBmYWlsdXJlTnVtICsgIuOAgei0puWPtyAiICsgdXNlci5nZXRVc2VyTmFtZSgpICsgIiDlr7zlhaXlpLHotKXvvJoiOworICAgICAgICAgICAgICAgIGZhaWx1cmVNc2cuYXBwZW5kKG1zZyArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmFpbHVyZU51bSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWx1cmVNc2cuaW5zZXJ0KDAsICLlvojmirHmrYnvvIzlr7zlhaXlpLHotKXvvIHlhbEgIiArIGZhaWx1cmVOdW0gKyAiIOadoeaVsOaNruagvOW8j+S4jeato+ehru+8jOmUmeivr+WmguS4i++8miIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VFeGNlcHRpb24oZmFpbHVyZU1zZy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Y2Nlc3NNc2cuaW5zZXJ0KDAsICLmga3llpzmgqjvvIzmlbDmja7lt7Llhajpg6jlr7zlhaXmiJDlip/vvIHlhbEgIiArIHN1Y2Nlc3NOdW0gKyAiIOadoe+8jOaVsOaNruWmguS4i++8miIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWNjZXNzTXNnLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0NvbmZpZ01hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzQ29uZmlnTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZmMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0NvbmZpZ01hcHBlci54bWwKQEAgLTAsMCArMSwxMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c0NvbmZpZ01hcHBlciI+CisgICAgCisgICAgPHJlc3VsdE1hcCB0eXBlPSJTeXNDb25maWciIGlkPSJTeXNDb25maWdSZXN1bHQiPgorICAgIAk8aWQgICAgIHByb3BlcnR5PSJjb25maWdJZCIgICAgICBjb2x1bW49ImNvbmZpZ19pZCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb25maWdOYW1lIiAgICBjb2x1bW49ImNvbmZpZ19uYW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb25maWdLZXkiICAgICBjb2x1bW49ImNvbmZpZ19rZXkiICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb25maWdWYWx1ZSIgICBjb2x1bW49ImNvbmZpZ192YWx1ZSIgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjb25maWdUeXBlIiAgICBjb2x1bW49ImNvbmZpZ190eXBlIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVCeSIgICAgICBjb2x1bW49ImNyZWF0ZV9ieSIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICBjb2x1bW49ImNyZWF0ZV90aW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgICBjb2x1bW49InVwZGF0ZV9ieSIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVUaW1lIiAgICBjb2x1bW49InVwZGF0ZV90aW1lIiAgICAvPgorICAgIDwvcmVzdWx0TWFwPgorICAgIAorICAgIDxzcWwgaWQ9InNlbGVjdENvbmZpZ1ZvIj4KKyAgICAgICAgc2VsZWN0IGNvbmZpZ19pZCwgY29uZmlnX25hbWUsIGNvbmZpZ19rZXksIGNvbmZpZ192YWx1ZSwgY29uZmlnX3R5cGUsIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyayAKKwkJZnJvbSBzeXNfY29uZmlnCisgICAgPC9zcWw+CisgICAgCisgICAgPCEtLSDmn6Xor6LmnaHku7YgLS0+CisJPHNxbCBpZD0ic3Fsd2hlcmVTZWFyY2giPgorCQk8d2hlcmU+CisJCQk8aWYgdGVzdD0iY29uZmlnSWQgIT1udWxsIj4KKwkJCQlhbmQgY29uZmlnX2lkID0gI3tjb25maWdJZH0KKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0iY29uZmlnS2V5ICE9bnVsbCBhbmQgY29uZmlnS2V5ICE9ICcnIj4KKwkJCQlhbmQgY29uZmlnX2tleSA9ICN7Y29uZmlnS2V5fQorCQkJPC9pZj4KKwkJPC93aGVyZT4KKwk8L3NxbD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RDb25maWciIHBhcmFtZXRlclR5cGU9IlN5c0NvbmZpZyIgcmVzdWx0TWFwPSJTeXNDb25maWdSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0Q29uZmlnVm8iLz4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNxbHdoZXJlU2VhcmNoIi8+CisgICAgPC9zZWxlY3Q+CisgICAgCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0Q29uZmlnTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzQ29uZmlnIiByZXN1bHRNYXA9IlN5c0NvbmZpZ1Jlc3VsdCI+CisgICAgICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3RDb25maWdWbyIvPgorICAgICAgICA8d2hlcmU+CisJCQk8aWYgdGVzdD0iY29uZmlnTmFtZSAhPSBudWxsIGFuZCBjb25maWdOYW1lICE9ICcnIj4KKwkJCQlBTkQgY29uZmlnX25hbWUgbGlrZSBjb25jYXQoJyUnLCAje2NvbmZpZ05hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbmZpZ1R5cGUgIT0gbnVsbCBhbmQgY29uZmlnVHlwZSAhPSAnJyI+CisJCQkJQU5EIGNvbmZpZ190eXBlID0gI3tjb25maWdUeXBlfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJjb25maWdLZXkgIT0gbnVsbCBhbmQgY29uZmlnS2V5ICE9ICcnIj4KKwkJCQlBTkQgY29uZmlnX2tleSBsaWtlIGNvbmNhdCgnJScsICN7Y29uZmlnS2V5fSwgJyUnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwYXJhbXMuYmVnaW5UaW1lICE9IG51bGwgYW5kIHBhcmFtcy5iZWdpblRpbWUgIT0gJyciPjwhLS0g5byA5aeL5pe26Ze05qOA57SiIC0tPgorCQkJCWFuZCBkYXRlX2Zvcm1hdChjcmVhdGVfdGltZSwnJVklbSVkJykgJmd0Oz0gZGF0ZV9mb3JtYXQoI3twYXJhbXMuYmVnaW5UaW1lfSwnJVklbSVkJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0icGFyYW1zLmVuZFRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmVuZFRpbWUgIT0gJyciPjwhLS0g57uT5p2f5pe26Ze05qOA57SiIC0tPgorCQkJCWFuZCBkYXRlX2Zvcm1hdChjcmVhdGVfdGltZSwnJVklbSVkJykgJmx0Oz0gZGF0ZV9mb3JtYXQoI3twYXJhbXMuZW5kVGltZX0sJyVZJW0lZCcpCisJCQk8L2lmPgorCQk8L3doZXJlPgorICAgIDwvc2VsZWN0PgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdENvbmZpZ0J5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iU3lzQ29uZmlnUmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdENvbmZpZ1ZvIi8+CisgICAgICAgIHdoZXJlIGNvbmZpZ19pZCA9ICN7Y29uZmlnSWR9CisgICAgPC9zZWxlY3Q+CisJCisgICAgPHNlbGVjdCBpZD0iY2hlY2tDb25maWdLZXlVbmlxdWUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyIgcmVzdWx0TWFwPSJTeXNDb25maWdSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0Q29uZmlnVm8iLz4KKyAgICAgICAgd2hlcmUgY29uZmlnX2tleSA9ICN7Y29uZmlnS2V5fSBsaW1pdCAxCisgICAgPC9zZWxlY3Q+CisgICAgCisgICAgPGluc2VydCBpZD0iaW5zZXJ0Q29uZmlnIiBwYXJhbWV0ZXJUeXBlPSJTeXNDb25maWciPgorICAgICAgICBpbnNlcnQgaW50byBzeXNfY29uZmlnICgKKwkJCTxpZiB0ZXN0PSJjb25maWdOYW1lICE9IG51bGwgYW5kIGNvbmZpZ05hbWUgIT0gJycgIj5jb25maWdfbmFtZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbmZpZ0tleSAhPSBudWxsIGFuZCBjb25maWdLZXkgIT0gJycgIj5jb25maWdfa2V5LDwvaWY+CisJCQk8aWYgdGVzdD0iY29uZmlnVmFsdWUgIT0gbnVsbCBhbmQgY29uZmlnVmFsdWUgIT0gJycgIj5jb25maWdfdmFsdWUsPC9pZj4KKwkJCTxpZiB0ZXN0PSJjb25maWdUeXBlICE9IG51bGwgYW5kIGNvbmZpZ1R5cGUgIT0gJycgIj5jb25maWdfdHlwZSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj5jcmVhdGVfYnksPC9pZj4KKwkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmssPC9pZj4KKyAJCQljcmVhdGVfdGltZQorICAgICAgICApdmFsdWVzKAorCQkJPGlmIHRlc3Q9ImNvbmZpZ05hbWUgIT0gbnVsbCBhbmQgY29uZmlnTmFtZSAhPSAnJyI+I3tjb25maWdOYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbmZpZ0tleSAhPSBudWxsIGFuZCBjb25maWdLZXkgIT0gJyciPiN7Y29uZmlnS2V5fSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbmZpZ1ZhbHVlICE9IG51bGwgYW5kIGNvbmZpZ1ZhbHVlICE9ICcnIj4je2NvbmZpZ1ZhbHVlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNvbmZpZ1R5cGUgIT0gbnVsbCBhbmQgY29uZmlnVHlwZSAhPSAnJyI+I3tjb25maWdUeXBlfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj4je2NyZWF0ZUJ5fSw8L2lmPgorCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCXN5c2RhdGUoKQorCQkpCisgICAgPC9pbnNlcnQ+CisJIAorICAgIDx1cGRhdGUgaWQ9InVwZGF0ZUNvbmZpZyIgcGFyYW1ldGVyVHlwZT0iU3lzQ29uZmlnIj4KKyAgICAgICAgdXBkYXRlIHN5c19jb25maWcgCisgICAgICAgIDxzZXQ+CisgICAgICAgICAgICA8aWYgdGVzdD0iY29uZmlnTmFtZSAhPSBudWxsIGFuZCBjb25maWdOYW1lICE9ICcnIj5jb25maWdfbmFtZSA9ICN7Y29uZmlnTmFtZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJjb25maWdLZXkgIT0gbnVsbCBhbmQgY29uZmlnS2V5ICE9ICcnIj5jb25maWdfa2V5ID0gI3tjb25maWdLZXl9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY29uZmlnVmFsdWUgIT0gbnVsbCBhbmQgY29uZmlnVmFsdWUgIT0gJyciPmNvbmZpZ192YWx1ZSA9ICN7Y29uZmlnVmFsdWV9LDwvaWY+CisgICAgICAgICAgICA8aWYgdGVzdD0iY29uZmlnVHlwZSAhPSBudWxsIGFuZCBjb25maWdUeXBlICE9ICcnIj5jb25maWdfdHlwZSA9ICN7Y29uZmlnVHlwZX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIGFuZCB1cGRhdGVCeSAhPSAnJyI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCI+cmVtYXJrID0gI3tyZW1hcmt9LDwvaWY+CisgCQkJdXBkYXRlX3RpbWUgPSBzeXNkYXRlKCkKKyAgICAgICAgPC9zZXQ+CisgICAgICAgIHdoZXJlIGNvbmZpZ19pZCA9ICN7Y29uZmlnSWR9CisgICAgPC91cGRhdGU+CisJCisgICAgPGRlbGV0ZSBpZD0iZGVsZXRlQ29uZmlnQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIHN5c19jb25maWcgd2hlcmUgY29uZmlnX2lkID0gI3tjb25maWdJZH0KKyAgICA8L2RlbGV0ZT4KKyAgICAKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGVDb25maWdCeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgICAgICAgIGRlbGV0ZSBmcm9tIHN5c19jb25maWcgd2hlcmUgY29uZmlnX2lkIGluIAorICAgICAgICA8Zm9yZWFjaCBpdGVtPSJjb25maWdJZCIgY29sbGVjdGlvbj0iYXJyYXkiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorICAgICAgICAJI3tjb25maWdJZH0KKyAgICAgICAgPC9mb3JlYWNoPgorICAgIDwvZGVsZXRlPgorICAgIAorPC9tYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RlcHRNYXBwZXIueG1sIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RlcHRNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDM5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzRGVwdE1hcHBlci54bWwKQEAgLTAsMCArMSwxNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c0RlcHRNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJTeXNEZXB0IiBpZD0iU3lzRGVwdFJlc3VsdCI+CisJCTxpZCAgICAgcHJvcGVydHk9ImRlcHRJZCIgICAgIGNvbHVtbj0iZGVwdF9pZCIgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InBhcmVudElkIiAgIGNvbHVtbj0icGFyZW50X2lkIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImFuY2VzdG9ycyIgIGNvbHVtbj0iYW5jZXN0b3JzIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRlcHROYW1lIiAgIGNvbHVtbj0iZGVwdF9uYW1lIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Im9yZGVyTnVtIiAgIGNvbHVtbj0ib3JkZXJfbnVtIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImxlYWRlciIgICAgIGNvbHVtbj0ibGVhZGVyIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InBob25lIiAgICAgIGNvbHVtbj0icGhvbmUiICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImVtYWlsIiAgICAgIGNvbHVtbj0iZW1haWwiICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRlbEZsYWciICAgIGNvbHVtbj0iZGVsX2ZsYWciICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InBhcmVudE5hbWUiIGNvbHVtbj0icGFyZW50X25hbWUiIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZUJ5IiAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiIGNvbHVtbj0iY3JlYXRlX3RpbWUiIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZUJ5IiAgIGNvbHVtbj0idXBkYXRlX2J5IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiIGNvbHVtbj0idXBkYXRlX3RpbWUiIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0RGVwdFZvIj4KKyAgICAgICAgc2VsZWN0IGQuZGVwdF9pZCwgZC5wYXJlbnRfaWQsIGQuYW5jZXN0b3JzLCBkLmRlcHRfbmFtZSwgZC5vcmRlcl9udW0sIGQubGVhZGVyLCBkLnBob25lLCBkLmVtYWlsLCBkLnN0YXR1cywgZC5kZWxfZmxhZywgZC5jcmVhdGVfYnksIGQuY3JlYXRlX3RpbWUgCisgICAgICAgIGZyb20gc3lzX2RlcHQgZAorICAgIDwvc3FsPgorICAgIAorCTxzZWxlY3QgaWQ9InNlbGVjdERlcHRMaXN0IiBwYXJhbWV0ZXJUeXBlPSJTeXNEZXB0IiByZXN1bHRNYXA9IlN5c0RlcHRSZXN1bHQiPgorICAgICAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0RGVwdFZvIi8+CisgICAgICAgIHdoZXJlIGQuZGVsX2ZsYWcgPSAnMCcKKwkJPGlmIHRlc3Q9ImRlcHRJZCAhPSBudWxsIGFuZCBkZXB0SWQgIT0gMCI+CisJCQlBTkQgZGVwdF9pZCA9ICN7ZGVwdElkfQorCQk8L2lmPgorICAgICAgICA8aWYgdGVzdD0icGFyZW50SWQgIT0gbnVsbCBhbmQgcGFyZW50SWQgIT0gMCI+CisJCQlBTkQgcGFyZW50X2lkID0gI3twYXJlbnRJZH0KKwkJPC9pZj4KKwkJPGlmIHRlc3Q9ImRlcHROYW1lICE9IG51bGwgYW5kIGRlcHROYW1lICE9ICcnIj4KKwkJCUFORCBkZXB0X25hbWUgbGlrZSBjb25jYXQoJyUnLCAje2RlcHROYW1lfSwgJyUnKQorCQk8L2lmPgorCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQlBTkQgc3RhdHVzID0gI3tzdGF0dXN9CisJCTwvaWY+CisJCTwhLS0g5pWw5o2u6IyD5Zu06L+H5rukIC0tPgorCQkke3BhcmFtcy5kYXRhU2NvcGV9CisJCW9yZGVyIGJ5IGQucGFyZW50X2lkLCBkLm9yZGVyX251bQorICAgIDwvc2VsZWN0PgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdERlcHRMaXN0QnlSb2xlSWQiIHJlc3VsdFR5cGU9IkxvbmciPgorCQlzZWxlY3QgZC5kZXB0X2lkCisJCWZyb20gc3lzX2RlcHQgZAorICAgICAgICAgICAgbGVmdCBqb2luIHN5c19yb2xlX2RlcHQgcmQgb24gZC5kZXB0X2lkID0gcmQuZGVwdF9pZAorICAgICAgICB3aGVyZSByZC5yb2xlX2lkID0gI3tyb2xlSWR9CisgICAgICAgICAgICA8aWYgdGVzdD0iZGVwdENoZWNrU3RyaWN0bHkiPgorICAgICAgICAgICAgICBhbmQgZC5kZXB0X2lkIG5vdCBpbiAoc2VsZWN0IGQucGFyZW50X2lkIGZyb20gc3lzX2RlcHQgZCBpbm5lciBqb2luIHN5c19yb2xlX2RlcHQgcmQgb24gZC5kZXB0X2lkID0gcmQuZGVwdF9pZCBhbmQgcmQucm9sZV9pZCA9ICN7cm9sZUlkfSkKKyAgICAgICAgICAgIDwvaWY+CisJCW9yZGVyIGJ5IGQucGFyZW50X2lkLCBkLm9yZGVyX251bQorCTwvc2VsZWN0PgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdERlcHRCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IlN5c0RlcHRSZXN1bHQiPgorCQlzZWxlY3QgZC5kZXB0X2lkLCBkLnBhcmVudF9pZCwgZC5hbmNlc3RvcnMsIGQuZGVwdF9uYW1lLCBkLm9yZGVyX251bSwgZC5sZWFkZXIsIGQucGhvbmUsIGQuZW1haWwsIGQuc3RhdHVzLAorCQkJKHNlbGVjdCBkZXB0X25hbWUgZnJvbSBzeXNfZGVwdCB3aGVyZSBkZXB0X2lkID0gZC5wYXJlbnRfaWQpIHBhcmVudF9uYW1lCisJCWZyb20gc3lzX2RlcHQgZAorCQl3aGVyZSBkLmRlcHRfaWQgPSAje2RlcHRJZH0KKwk8L3NlbGVjdD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJjaGVja0RlcHRFeGlzdFVzZXIiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdFR5cGU9ImludCI+CisJCXNlbGVjdCBjb3VudCgxKSBmcm9tIHN5c191c2VyIHdoZXJlIGRlcHRfaWQgPSAje2RlcHRJZH0gYW5kIGRlbF9mbGFnID0gJzAnCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iaGFzQ2hpbGRCeURlcHRJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0VHlwZT0iaW50Ij4KKwkJc2VsZWN0IGNvdW50KDEpIGZyb20gc3lzX2RlcHQKKwkJd2hlcmUgZGVsX2ZsYWcgPSAnMCcgYW5kIHBhcmVudF9pZCA9ICN7ZGVwdElkfSBsaW1pdCAxCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Q2hpbGRyZW5EZXB0QnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNEZXB0UmVzdWx0Ij4KKwkJc2VsZWN0ICogZnJvbSBzeXNfZGVwdCB3aGVyZSBmaW5kX2luX3NldCgje2RlcHRJZH0sIGFuY2VzdG9ycykKKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3ROb3JtYWxDaGlsZHJlbkRlcHRCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRUeXBlPSJpbnQiPgorCQlzZWxlY3QgY291bnQoKikgZnJvbSBzeXNfZGVwdCB3aGVyZSBzdGF0dXMgPSAwIGFuZCBkZWxfZmxhZyA9ICcwJyBhbmQgZmluZF9pbl9zZXQoI3tkZXB0SWR9LCBhbmNlc3RvcnMpCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iY2hlY2tEZXB0TmFtZVVuaXF1ZSIgcmVzdWx0TWFwPSJTeXNEZXB0UmVzdWx0Ij4KKwkgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdERlcHRWbyIvPgorCQl3aGVyZSBkZXB0X25hbWU9I3tkZXB0TmFtZX0gYW5kIHBhcmVudF9pZCA9ICN7cGFyZW50SWR9IGFuZCBkZWxfZmxhZyA9ICcwJyBsaW1pdCAxCisJPC9zZWxlY3Q+CisgICAgCisgICAgPGluc2VydCBpZD0iaW5zZXJ0RGVwdCIgcGFyYW1ldGVyVHlwZT0iU3lzRGVwdCI+CisgCQlpbnNlcnQgaW50byBzeXNfZGVwdCgKKyAJCQk8aWYgdGVzdD0iZGVwdElkICE9IG51bGwgYW5kIGRlcHRJZCAhPSAwIj5kZXB0X2lkLDwvaWY+CisgCQkJPGlmIHRlc3Q9InBhcmVudElkICE9IG51bGwgYW5kIHBhcmVudElkICE9IDAiPnBhcmVudF9pZCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkZXB0TmFtZSAhPSBudWxsIGFuZCBkZXB0TmFtZSAhPSAnJyI+ZGVwdF9uYW1lLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImFuY2VzdG9ycyAhPSBudWxsIGFuZCBhbmNlc3RvcnMgIT0gJyciPmFuY2VzdG9ycyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJvcmRlck51bSAhPSBudWxsIj5vcmRlcl9udW0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibGVhZGVyICE9IG51bGwgYW5kIGxlYWRlciAhPSAnJyI+bGVhZGVyLDwvaWY+CisgCQkJPGlmIHRlc3Q9InBob25lICE9IG51bGwgYW5kIHBob25lICE9ICcnIj5waG9uZSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJlbWFpbCAhPSBudWxsIGFuZCBlbWFpbCAhPSAnJyI+ZW1haWwsPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwiPnN0YXR1cyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+Y3JlYXRlX2J5LDwvaWY+CisgCQkJY3JlYXRlX3RpbWUKKyAJCSl2YWx1ZXMoCisgCQkJPGlmIHRlc3Q9ImRlcHRJZCAhPSBudWxsIGFuZCBkZXB0SWQgIT0gMCI+I3tkZXB0SWR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBhcmVudElkICE9IG51bGwgYW5kIHBhcmVudElkICE9IDAiPiN7cGFyZW50SWR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRlcHROYW1lICE9IG51bGwgYW5kIGRlcHROYW1lICE9ICcnIj4je2RlcHROYW1lfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJhbmNlc3RvcnMgIT0gbnVsbCBhbmQgYW5jZXN0b3JzICE9ICcnIj4je2FuY2VzdG9yc30sPC9pZj4KKyAJCQk8aWYgdGVzdD0ib3JkZXJOdW0gIT0gbnVsbCI+I3tvcmRlck51bX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibGVhZGVyICE9IG51bGwgYW5kIGxlYWRlciAhPSAnJyI+I3tsZWFkZXJ9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBob25lICE9IG51bGwgYW5kIHBob25lICE9ICcnIj4je3Bob25lfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJlbWFpbCAhPSBudWxsIGFuZCBlbWFpbCAhPSAnJyI+I3tlbWFpbH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwiPiN7c3RhdHVzfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+I3tjcmVhdGVCeX0sPC9pZj4KKyAJCQlzeXNkYXRlKCkKKyAJCSkKKwk8L2luc2VydD4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVEZXB0IiBwYXJhbWV0ZXJUeXBlPSJTeXNEZXB0Ij4KKyAJCXVwZGF0ZSBzeXNfZGVwdAorIAkJPHNldD4KKyAJCQk8aWYgdGVzdD0icGFyZW50SWQgIT0gbnVsbCBhbmQgcGFyZW50SWQgIT0gMCI+cGFyZW50X2lkID0gI3twYXJlbnRJZH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGVwdE5hbWUgIT0gbnVsbCBhbmQgZGVwdE5hbWUgIT0gJyciPmRlcHRfbmFtZSA9ICN7ZGVwdE5hbWV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImFuY2VzdG9ycyAhPSBudWxsIGFuZCBhbmNlc3RvcnMgIT0gJyciPmFuY2VzdG9ycyA9ICN7YW5jZXN0b3JzfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJvcmRlck51bSAhPSBudWxsIj5vcmRlcl9udW0gPSAje29yZGVyTnVtfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJsZWFkZXIgIT0gbnVsbCI+bGVhZGVyID0gI3tsZWFkZXJ9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBob25lICE9IG51bGwiPnBob25lID0gI3twaG9uZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZW1haWwgIT0gbnVsbCI+ZW1haWwgPSAje2VtYWlsfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj5zdGF0dXMgPSAje3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCBhbmQgdXBkYXRlQnkgIT0gJyciPnVwZGF0ZV9ieSA9ICN7dXBkYXRlQnl9LDwvaWY+CisgCQkJdXBkYXRlX3RpbWUgPSBzeXNkYXRlKCkKKyAJCTwvc2V0PgorIAkJd2hlcmUgZGVwdF9pZCA9ICN7ZGVwdElkfQorCTwvdXBkYXRlPgorCQorCTx1cGRhdGUgaWQ9InVwZGF0ZURlcHRDaGlsZHJlbiIgcGFyYW1ldGVyVHlwZT0iamF2YS51dGlsLkxpc3QiPgorCSAgICB1cGRhdGUgc3lzX2RlcHQgc2V0IGFuY2VzdG9ycyA9CisJICAgIDxmb3JlYWNoIGNvbGxlY3Rpb249ImRlcHRzIiBpdGVtPSJpdGVtIiBpbmRleD0iaW5kZXgiCisJICAgICAgICBzZXBhcmF0b3I9IiAiIG9wZW49ImNhc2UgZGVwdF9pZCIgY2xvc2U9ImVuZCI+CisJICAgICAgICB3aGVuICN7aXRlbS5kZXB0SWR9IHRoZW4gI3tpdGVtLmFuY2VzdG9yc30KKwkgICAgPC9mb3JlYWNoPgorCSAgICB3aGVyZSBkZXB0X2lkIGluCisJICAgIDxmb3JlYWNoIGNvbGxlY3Rpb249ImRlcHRzIiBpdGVtPSJpdGVtIiBpbmRleD0iaW5kZXgiCisJICAgICAgICBzZXBhcmF0b3I9IiwiIG9wZW49IigiIGNsb3NlPSIpIj4KKwkgICAgICAgICN7aXRlbS5kZXB0SWR9CisJICAgIDwvZm9yZWFjaD4KKwk8L3VwZGF0ZT4KKwkgCisJPHVwZGF0ZSBpZD0idXBkYXRlRGVwdFN0YXR1c05vcm1hbCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCSAgICB1cGRhdGUgc3lzX2RlcHQgc2V0IHN0YXR1cyA9ICcwJyB3aGVyZSBkZXB0X2lkIGluIAorIAkgICAgPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09ImRlcHRJZCIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisgICAgICAgIAkje2RlcHRJZH0KKyAgICAgICAgPC9mb3JlYWNoPgorCTwvdXBkYXRlPgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZURlcHRCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKwkJdXBkYXRlIHN5c19kZXB0IHNldCBkZWxfZmxhZyA9ICcyJyB3aGVyZSBkZXB0X2lkID0gI3tkZXB0SWR9CisJPC9kZWxldGU+CisKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzRGljdERhdGFNYXBwZXIueG1sIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RpY3REYXRhTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0YjdmCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RpY3REYXRhTWFwcGVyLnhtbApAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzRGljdERhdGFNYXBwZXIiPgorCQorCTxyZXN1bHRNYXAgdHlwZT0iU3lzRGljdERhdGEiIGlkPSJTeXNEaWN0RGF0YVJlc3VsdCI+CisJCTxpZCAgICAgcHJvcGVydHk9ImRpY3RDb2RlIiAgIGNvbHVtbj0iZGljdF9jb2RlIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRpY3RTb3J0IiAgIGNvbHVtbj0iZGljdF9zb3J0IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRpY3RMYWJlbCIgIGNvbHVtbj0iZGljdF9sYWJlbCIgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRpY3RWYWx1ZSIgIGNvbHVtbj0iZGljdF92YWx1ZSIgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRpY3RUeXBlIiAgIGNvbHVtbj0iZGljdF90eXBlIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNzc0NsYXNzIiAgIGNvbHVtbj0iY3NzX2NsYXNzIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Imxpc3RDbGFzcyIgIGNvbHVtbj0ibGlzdF9jbGFzcyIgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImlzRGVmYXVsdCIgIGNvbHVtbj0iaXNfZGVmYXVsdCIgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZUJ5IiAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZVRpbWUiIGNvbHVtbj0iY3JlYXRlX3RpbWUiIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZUJ5IiAgIGNvbHVtbj0idXBkYXRlX2J5IiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiIGNvbHVtbj0idXBkYXRlX3RpbWUiIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0RGljdERhdGFWbyI+CisgICAgICAgIHNlbGVjdCBkaWN0X2NvZGUsIGRpY3Rfc29ydCwgZGljdF9sYWJlbCwgZGljdF92YWx1ZSwgZGljdF90eXBlLCBjc3NfY2xhc3MsIGxpc3RfY2xhc3MsIGlzX2RlZmF1bHQsIHN0YXR1cywgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgcmVtYXJrIAorCQlmcm9tIHN5c19kaWN0X2RhdGEKKyAgICA8L3NxbD4KKworCTxzZWxlY3QgaWQ9InNlbGVjdERpY3REYXRhTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzRGljdERhdGEiIHJlc3VsdE1hcD0iU3lzRGljdERhdGFSZXN1bHQiPgorCSAgICA8aW5jbHVkZSByZWZpZD0ic2VsZWN0RGljdERhdGFWbyIvPgorCQk8d2hlcmU+CisJCSAgICA8aWYgdGVzdD0iZGljdFR5cGUgIT0gbnVsbCBhbmQgZGljdFR5cGUgIT0gJyciPgorCQkJCUFORCBkaWN0X3R5cGUgPSAje2RpY3RUeXBlfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJkaWN0TGFiZWwgIT0gbnVsbCBhbmQgZGljdExhYmVsICE9ICcnIj4KKwkJCQlBTkQgZGljdF9sYWJlbCBsaWtlIGNvbmNhdCgnJScsICN7ZGljdExhYmVsfSwgJyUnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4KKwkJCQlBTkQgc3RhdHVzID0gI3tzdGF0dXN9CisJCQk8L2lmPgorCQk8L3doZXJlPgorCQlvcmRlciBieSBkaWN0X3NvcnQgYXNjCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0RGljdERhdGFCeVR5cGUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyIgcmVzdWx0TWFwPSJTeXNEaWN0RGF0YVJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3REaWN0RGF0YVZvIi8+CisJCXdoZXJlIHN0YXR1cyA9ICcwJyBhbmQgZGljdF90eXBlID0gI3tkaWN0VHlwZX0gb3JkZXIgYnkgZGljdF9zb3J0IGFzYworCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdERpY3RMYWJlbCIgcmVzdWx0VHlwZT0iU3RyaW5nIj4KKwkJc2VsZWN0IGRpY3RfbGFiZWwgZnJvbSBzeXNfZGljdF9kYXRhCisJCXdoZXJlIGRpY3RfdHlwZSA9ICN7ZGljdFR5cGV9IGFuZCBkaWN0X3ZhbHVlID0gI3tkaWN0VmFsdWV9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0RGljdERhdGFCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IlN5c0RpY3REYXRhUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdERpY3REYXRhVm8iLz4KKwkJd2hlcmUgZGljdF9jb2RlID0gI3tkaWN0Q29kZX0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJjb3VudERpY3REYXRhQnlUeXBlIiByZXN1bHRUeXBlPSJJbnRlZ2VyIj4KKwkgICAgc2VsZWN0IGNvdW50KDEpIGZyb20gc3lzX2RpY3RfZGF0YSB3aGVyZSBkaWN0X3R5cGU9I3tkaWN0VHlwZX0gIAorCTwvc2VsZWN0PgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZURpY3REYXRhQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQlkZWxldGUgZnJvbSBzeXNfZGljdF9kYXRhIHdoZXJlIGRpY3RfY29kZSA9ICN7ZGljdENvZGV9CisgCTwvZGVsZXRlPgorIAkKKyAJPGRlbGV0ZSBpZD0iZGVsZXRlRGljdERhdGFCeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQlkZWxldGUgZnJvbSBzeXNfZGljdF9kYXRhIHdoZXJlIGRpY3RfY29kZSBpbgorIAkJPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09ImRpY3RDb2RlIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje2RpY3RDb2RlfQorICAgICAgICA8L2ZvcmVhY2g+IAorIAk8L2RlbGV0ZT4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVEaWN0RGF0YSIgcGFyYW1ldGVyVHlwZT0iU3lzRGljdERhdGEiPgorIAkJdXBkYXRlIHN5c19kaWN0X2RhdGEKKyAJCTxzZXQ+CisgCQkJPGlmIHRlc3Q9ImRpY3RTb3J0ICE9IG51bGwiPmRpY3Rfc29ydCA9ICN7ZGljdFNvcnR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRpY3RMYWJlbCAhPSBudWxsIGFuZCBkaWN0TGFiZWwgIT0gJyciPmRpY3RfbGFiZWwgPSAje2RpY3RMYWJlbH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGljdFZhbHVlICE9IG51bGwgYW5kIGRpY3RWYWx1ZSAhPSAnJyI+ZGljdF92YWx1ZSA9ICN7ZGljdFZhbHVlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkaWN0VHlwZSAhPSBudWxsIGFuZCBkaWN0VHlwZSAhPSAnJyI+ZGljdF90eXBlID0gI3tkaWN0VHlwZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3NzQ2xhc3MgIT0gbnVsbCI+Y3NzX2NsYXNzID0gI3tjc3NDbGFzc30sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibGlzdENsYXNzICE9IG51bGwiPmxpc3RfY2xhc3MgPSAje2xpc3RDbGFzc30sPC9pZj4KKyAJCQk8aWYgdGVzdD0iaXNEZWZhdWx0ICE9IG51bGwgYW5kIGlzRGVmYXVsdCAhPSAnJyI+aXNfZGVmYXVsdCA9ICN7aXNEZWZhdWx0fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCI+c3RhdHVzID0gI3tzdGF0dXN9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIj5yZW1hcmsgPSAje3JlbWFya30sPC9pZj4KKyAJCQk8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCBhbmQgdXBkYXRlQnkgIT0gJyciPnVwZGF0ZV9ieSA9ICN7dXBkYXRlQnl9LDwvaWY+CisgCQkJdXBkYXRlX3RpbWUgPSBzeXNkYXRlKCkKKyAJCTwvc2V0PgorIAkJd2hlcmUgZGljdF9jb2RlID0gI3tkaWN0Q29kZX0KKwk8L3VwZGF0ZT4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVEaWN0RGF0YVR5cGUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyI+CisgCQl1cGRhdGUgc3lzX2RpY3RfZGF0YSBzZXQgZGljdF90eXBlID0gI3tuZXdEaWN0VHlwZX0gd2hlcmUgZGljdF90eXBlID0gI3tvbGREaWN0VHlwZX0KKwk8L3VwZGF0ZT4KKyAJCisgCTxpbnNlcnQgaWQ9Imluc2VydERpY3REYXRhIiBwYXJhbWV0ZXJUeXBlPSJTeXNEaWN0RGF0YSI+CisgCQlpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhKAorIAkJCTxpZiB0ZXN0PSJkaWN0U29ydCAhPSBudWxsIj5kaWN0X3NvcnQsPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGljdExhYmVsICE9IG51bGwgYW5kIGRpY3RMYWJlbCAhPSAnJyI+ZGljdF9sYWJlbCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkaWN0VmFsdWUgIT0gbnVsbCBhbmQgZGljdFZhbHVlICE9ICcnIj5kaWN0X3ZhbHVlLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRpY3RUeXBlICE9IG51bGwgYW5kIGRpY3RUeXBlICE9ICcnIj5kaWN0X3R5cGUsPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3NzQ2xhc3MgIT0gbnVsbCBhbmQgY3NzQ2xhc3MgIT0gJyciPmNzc19jbGFzcyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJsaXN0Q2xhc3MgIT0gbnVsbCBhbmQgbGlzdENsYXNzICE9ICcnIj5saXN0X2NsYXNzLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImlzRGVmYXVsdCAhPSBudWxsIGFuZCBpc0RlZmF1bHQgIT0gJyciPmlzX2RlZmF1bHQsPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwiPnN0YXR1cyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmssPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPmNyZWF0ZV9ieSw8L2lmPgorIAkJCWNyZWF0ZV90aW1lCisgCQkpdmFsdWVzKAorIAkJICAgIDxpZiB0ZXN0PSJkaWN0U29ydCAhPSBudWxsIj4je2RpY3RTb3J0fSw8L2lmPgorIAkJICAgIDxpZiB0ZXN0PSJkaWN0TGFiZWwgIT0gbnVsbCBhbmQgZGljdExhYmVsICE9ICcnIj4je2RpY3RMYWJlbH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGljdFZhbHVlICE9IG51bGwgYW5kIGRpY3RWYWx1ZSAhPSAnJyI+I3tkaWN0VmFsdWV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRpY3RUeXBlICE9IG51bGwgYW5kIGRpY3RUeXBlICE9ICcnIj4je2RpY3RUeXBlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjc3NDbGFzcyAhPSBudWxsIGFuZCBjc3NDbGFzcyAhPSAnJyI+I3tjc3NDbGFzc30sPC9pZj4KKyAJCQk8aWYgdGVzdD0ibGlzdENsYXNzICE9IG51bGwgYW5kIGxpc3RDbGFzcyAhPSAnJyI+I3tsaXN0Q2xhc3N9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImlzRGVmYXVsdCAhPSBudWxsIGFuZCBpc0RlZmF1bHQgIT0gJyciPiN7aXNEZWZhdWx0fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCI+I3tzdGF0dXN9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+I3tjcmVhdGVCeX0sPC9pZj4KKyAJCQlzeXNkYXRlKCkKKyAJCSkKKwk8L2luc2VydD4KKwkKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzRGljdFR5cGVNYXBwZXIueG1sIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RpY3RUeXBlTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhkNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c0RpY3RUeXBlTWFwcGVyLnhtbApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzRGljdFR5cGVNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJTeXNEaWN0VHlwZSIgaWQ9IlN5c0RpY3RUeXBlUmVzdWx0Ij4KKwkJPGlkICAgICBwcm9wZXJ0eT0iZGljdElkIiAgICAgY29sdW1uPSJkaWN0X2lkIiAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iZGljdE5hbWUiICAgY29sdW1uPSJkaWN0X25hbWUiICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iZGljdFR5cGUiICAgY29sdW1uPSJkaWN0X3R5cGUiICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ic3RhdHVzIiAgICAgY29sdW1uPSJzdGF0dXMiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlQnkiICAgY29sdW1uPSJjcmVhdGVfYnkiICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlVGltZSIgY29sdW1uPSJjcmVhdGVfdGltZSIgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlQnkiICAgY29sdW1uPSJ1cGRhdGVfYnkiICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlVGltZSIgY29sdW1uPSJ1cGRhdGVfdGltZSIgLz4KKwk8L3Jlc3VsdE1hcD4KKwkKKwk8c3FsIGlkPSJzZWxlY3REaWN0VHlwZVZvIj4KKyAgICAgICAgc2VsZWN0IGRpY3RfaWQsIGRpY3RfbmFtZSwgZGljdF90eXBlLCBzdGF0dXMsIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHJlbWFyayAKKwkJZnJvbSBzeXNfZGljdF90eXBlCisgICAgPC9zcWw+CisKKwk8c2VsZWN0IGlkPSJzZWxlY3REaWN0VHlwZUxpc3QiIHBhcmFtZXRlclR5cGU9IlN5c0RpY3RUeXBlIiByZXN1bHRNYXA9IlN5c0RpY3RUeXBlUmVzdWx0Ij4KKwkgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdERpY3RUeXBlVm8iLz4KKwkJPHdoZXJlPgorCQkgICAgPGlmIHRlc3Q9ImRpY3ROYW1lICE9IG51bGwgYW5kIGRpY3ROYW1lICE9ICcnIj4KKwkJCQlBTkQgZGljdF9uYW1lIGxpa2UgY29uY2F0KCclJywgI3tkaWN0TmFtZX0sICclJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJkaWN0VHlwZSAhPSBudWxsIGFuZCBkaWN0VHlwZSAhPSAnJyI+CisJCQkJQU5EIGRpY3RfdHlwZSBsaWtlIGNvbmNhdCgnJScsICN7ZGljdFR5cGV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InBhcmFtcy5iZWdpblRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmJlZ2luVGltZSAhPSAnJyI+PCEtLSDlvIDlp4vml7bpl7Tmo4DntKIgLS0+CisJCQkJYW5kIGRhdGVfZm9ybWF0KGNyZWF0ZV90aW1lLCclWSVtJWQnKSAmZ3Q7PSBkYXRlX2Zvcm1hdCgje3BhcmFtcy5iZWdpblRpbWV9LCclWSVtJWQnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwYXJhbXMuZW5kVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kVGltZSAhPSAnJyI+PCEtLSDnu5PmnZ/ml7bpl7Tmo4DntKIgLS0+CisJCQkJYW5kIGRhdGVfZm9ybWF0KGNyZWF0ZV90aW1lLCclWSVtJWQnKSAmbHQ7PSBkYXRlX2Zvcm1hdCgje3BhcmFtcy5lbmRUaW1lfSwnJVklbSVkJykKKwkJCTwvaWY+CisJICAgIDwvd2hlcmU+CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0RGljdFR5cGVBbGwiIHJlc3VsdE1hcD0iU3lzRGljdFR5cGVSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0RGljdFR5cGVWbyIvPgorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdERpY3RUeXBlQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNEaWN0VHlwZVJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3REaWN0VHlwZVZvIi8+CisJCXdoZXJlIGRpY3RfaWQgPSAje2RpY3RJZH0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3REaWN0VHlwZUJ5VHlwZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IlN5c0RpY3RUeXBlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdERpY3RUeXBlVm8iLz4KKwkJd2hlcmUgZGljdF90eXBlID0gI3tkaWN0VHlwZX0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJjaGVja0RpY3RUeXBlVW5pcXVlIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iU3lzRGljdFR5cGVSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0RGljdFR5cGVWbyIvPgorCQl3aGVyZSBkaWN0X3R5cGUgPSAje2RpY3RUeXBlfSBsaW1pdCAxCisJPC9zZWxlY3Q+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlRGljdFR5cGVCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAJCWRlbGV0ZSBmcm9tIHN5c19kaWN0X3R5cGUgd2hlcmUgZGljdF9pZCA9ICN7ZGljdElkfQorIAk8L2RlbGV0ZT4KKyAJCisgCTxkZWxldGUgaWQ9ImRlbGV0ZURpY3RUeXBlQnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX2RpY3RfdHlwZSB3aGVyZSBkaWN0X2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0iZGljdElkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje2RpY3RJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisKKyAJPHVwZGF0ZSBpZD0idXBkYXRlRGljdFR5cGUiIHBhcmFtZXRlclR5cGU9IlN5c0RpY3RUeXBlIj4KKyAJCXVwZGF0ZSBzeXNfZGljdF90eXBlCisgCQk8c2V0PgorIAkJCTxpZiB0ZXN0PSJkaWN0TmFtZSAhPSBudWxsIGFuZCBkaWN0TmFtZSAhPSAnJyI+ZGljdF9uYW1lID0gI3tkaWN0TmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGljdFR5cGUgIT0gbnVsbCBhbmQgZGljdFR5cGUgIT0gJyciPmRpY3RfdHlwZSA9ICN7ZGljdFR5cGV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMgPSAje3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwiPnJlbWFyayA9ICN7cmVtYXJrfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIGFuZCB1cGRhdGVCeSAhPSAnJyI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKyAJCQl1cGRhdGVfdGltZSA9IHN5c2RhdGUoKQorIAkJPC9zZXQ+CisgCQl3aGVyZSBkaWN0X2lkID0gI3tkaWN0SWR9CisJPC91cGRhdGU+CisgCQorIAk8aW5zZXJ0IGlkPSJpbnNlcnREaWN0VHlwZSIgcGFyYW1ldGVyVHlwZT0iU3lzRGljdFR5cGUiPgorIAkJaW5zZXJ0IGludG8gc3lzX2RpY3RfdHlwZSgKKyAJCQk8aWYgdGVzdD0iZGljdE5hbWUgIT0gbnVsbCBhbmQgZGljdE5hbWUgIT0gJyciPmRpY3RfbmFtZSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkaWN0VHlwZSAhPSBudWxsIGFuZCBkaWN0VHlwZSAhPSAnJyI+ZGljdF90eXBlLDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMsPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+cmVtYXJrLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj5jcmVhdGVfYnksPC9pZj4KKyAJCQljcmVhdGVfdGltZQorIAkJKXZhbHVlcygKKyAJCQk8aWYgdGVzdD0iZGljdE5hbWUgIT0gbnVsbCBhbmQgZGljdE5hbWUgIT0gJyciPiN7ZGljdE5hbWV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRpY3RUeXBlICE9IG51bGwgYW5kIGRpY3RUeXBlICE9ICcnIj4je2RpY3RUeXBlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCI+I3tzdGF0dXN9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+I3tjcmVhdGVCeX0sPC9pZj4KKyAJCQlzeXNkYXRlKCkKKyAJCSkKKwk8L2luc2VydD4KKwkKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTG9naW5pbmZvck1hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTG9naW5pbmZvck1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyZDY2NQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNMb2dpbmluZm9yTWFwcGVyLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNMb2dpbmluZm9yTWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzTG9naW5pbmZvciIgaWQ9IlN5c0xvZ2luaW5mb3JSZXN1bHQiPgorCQk8aWQgICAgIHByb3BlcnR5PSJpbmZvSWQiICAgICAgICBjb2x1bW49ImluZm9faWQiICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ1c2VyTmFtZSIgICAgICBjb2x1bW49InVzZXJfbmFtZSIgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgICAgICBjb2x1bW49InN0YXR1cyIgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJpcGFkZHIiICAgICAgICBjb2x1bW49ImlwYWRkciIgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJsb2dpbkxvY2F0aW9uIiBjb2x1bW49ImxvZ2luX2xvY2F0aW9uIiAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJicm93c2VyIiAgICAgICBjb2x1bW49ImJyb3dzZXIiICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJvcyIgICAgICAgICAgICBjb2x1bW49Im9zIiAgICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJtc2ciICAgICAgICAgICBjb2x1bW49Im1zZyIgICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJsb2dpblRpbWUiICAgICBjb2x1bW49ImxvZ2luX3RpbWUiICAgICAgICAvPgorCTwvcmVzdWx0TWFwPgorCisJPGluc2VydCBpZD0iaW5zZXJ0TG9naW5pbmZvciIgcGFyYW1ldGVyVHlwZT0iU3lzTG9naW5pbmZvciI+CisJCWluc2VydCBpbnRvIHN5c19sb2dpbmluZm9yICh1c2VyX25hbWUsIHN0YXR1cywgaXBhZGRyLCBsb2dpbl9sb2NhdGlvbiwgYnJvd3Nlciwgb3MsIG1zZywgbG9naW5fdGltZSkKKwkJdmFsdWVzICgje3VzZXJOYW1lfSwgI3tzdGF0dXN9LCAje2lwYWRkcn0sICN7bG9naW5Mb2NhdGlvbn0sICN7YnJvd3Nlcn0sICN7b3N9LCAje21zZ30sIHN5c2RhdGUoKSkKKwk8L2luc2VydD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RMb2dpbmluZm9yTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzTG9naW5pbmZvciIgcmVzdWx0TWFwPSJTeXNMb2dpbmluZm9yUmVzdWx0Ij4KKwkJc2VsZWN0IGluZm9faWQsIHVzZXJfbmFtZSwgaXBhZGRyLCBsb2dpbl9sb2NhdGlvbiwgYnJvd3Nlciwgb3MsIHN0YXR1cywgbXNnLCBsb2dpbl90aW1lIGZyb20gc3lzX2xvZ2luaW5mb3IKKwkJPHdoZXJlPgorCQkJPGlmIHRlc3Q9ImlwYWRkciAhPSBudWxsIGFuZCBpcGFkZHIgIT0gJyciPgorCQkJCUFORCBpcGFkZHIgbGlrZSBjb25jYXQoJyUnLCAje2lwYWRkcn0sICclJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJ1c2VyTmFtZSAhPSBudWxsIGFuZCB1c2VyTmFtZSAhPSAnJyI+CisJCQkJQU5EIHVzZXJfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7dXNlck5hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InBhcmFtcy5iZWdpblRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmJlZ2luVGltZSAhPSAnJyI+PCEtLSDlvIDlp4vml7bpl7Tmo4DntKIgLS0+CisJCQkJQU5EIGxvZ2luX3RpbWUgJmd0Oz0gI3twYXJhbXMuYmVnaW5UaW1lfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwYXJhbXMuZW5kVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kVGltZSAhPSAnJyI+PCEtLSDnu5PmnZ/ml7bpl7Tmo4DntKIgLS0+CisJCQkJQU5EIGxvZ2luX3RpbWUgJmx0Oz0gI3twYXJhbXMuZW5kVGltZX0KKwkJCTwvaWY+CisJCTwvd2hlcmU+CisJCW9yZGVyIGJ5IGluZm9faWQgZGVzYworCTwvc2VsZWN0PgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZUxvZ2luaW5mb3JCeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQlkZWxldGUgZnJvbSBzeXNfbG9naW5pbmZvciB3aGVyZSBpbmZvX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0iaW5mb0lkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje2luZm9JZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisgICAgCisgICAgPHVwZGF0ZSBpZD0iY2xlYW5Mb2dpbmluZm9yIj4KKyAgICAgICAgdHJ1bmNhdGUgdGFibGUgc3lzX2xvZ2luaW5mb3IKKyAgICA8L3VwZGF0ZT4KKyAgICAKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTWVudU1hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTWVudU1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlODdjOQotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNNZW51TWFwcGVyLnhtbApAQCAtMCwwICsxLDIwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCisJCVBVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKwkJImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c01lbnVNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJTeXNNZW51IiBpZD0iU3lzTWVudVJlc3VsdCI+CisJCTxpZCAgICAgcHJvcGVydHk9Im1lbnVJZCIgICAgICAgICBjb2x1bW49Im1lbnVfaWQiICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJtZW51TmFtZSIgICAgICAgY29sdW1uPSJtZW51X25hbWUiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icGFyZW50TmFtZSIgICAgIGNvbHVtbj0icGFyZW50X25hbWUiICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InBhcmVudElkIiAgICAgICBjb2x1bW49InBhcmVudF9pZCIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJvcmRlck51bSIgICAgICAgY29sdW1uPSJvcmRlcl9udW0iICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icGF0aCIgICAgICAgICAgIGNvbHVtbj0icGF0aCIgICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImNvbXBvbmVudCIgICAgICBjb2x1bW49ImNvbXBvbmVudCIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJxdWVyeSIgICAgICAgICAgY29sdW1uPSJxdWVyeSIgICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icm91dGVOYW1lIiAgICAgIGNvbHVtbj0icm91dGVfbmFtZSIgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImlzRnJhbWUiICAgICAgICBjb2x1bW49ImlzX2ZyYW1lIiAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJpc0NhY2hlIiAgICAgICAgY29sdW1uPSJpc19jYWNoZSIgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ibWVudVR5cGUiICAgICAgIGNvbHVtbj0ibWVudV90eXBlIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InZpc2libGUiICAgICAgICBjb2x1bW49InZpc2libGUiICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgICAgICAgY29sdW1uPSJzdGF0dXMiICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icGVybXMiICAgICAgICAgIGNvbHVtbj0icGVybXMiICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Imljb24iICAgICAgICAgICBjb2x1bW49Imljb24iICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVCeSIgICAgICAgY29sdW1uPSJjcmVhdGVfYnkiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlVGltZSIgICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiICAgICBjb2x1bW49InVwZGF0ZV90aW1lIiAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgICAgY29sdW1uPSJ1cGRhdGVfYnkiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icmVtYXJrIiAgICAgICAgIGNvbHVtbj0icmVtYXJrIiAgICAgICAgIC8+CisJPC9yZXN1bHRNYXA+CisKKwk8c3FsIGlkPSJzZWxlY3RNZW51Vm8iPgorICAgICAgICBzZWxlY3QgbWVudV9pZCwgbWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBgcXVlcnlgLCByb3V0ZV9uYW1lLCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBpZm51bGwocGVybXMsJycpIGFzIHBlcm1zLCBpY29uLCBjcmVhdGVfdGltZSAKKwkJZnJvbSBzeXNfbWVudQorICAgIDwvc3FsPgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdE1lbnVMaXN0IiBwYXJhbWV0ZXJUeXBlPSJTeXNNZW51IiByZXN1bHRNYXA9IlN5c01lbnVSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0TWVudVZvIi8+CisJCTx3aGVyZT4KKwkJCTxpZiB0ZXN0PSJtZW51TmFtZSAhPSBudWxsIGFuZCBtZW51TmFtZSAhPSAnJyI+CisJCQkJQU5EIG1lbnVfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7bWVudU5hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InZpc2libGUgIT0gbnVsbCBhbmQgdmlzaWJsZSAhPSAnJyI+CisJCQkJQU5EIHZpc2libGUgPSAje3Zpc2libGV9CisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPgorCQkJCUFORCBzdGF0dXMgPSAje3N0YXR1c30KKwkJCTwvaWY+CisJCTwvd2hlcmU+CisJCW9yZGVyIGJ5IHBhcmVudF9pZCwgb3JkZXJfbnVtCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0TWVudVRyZWVBbGwiIHJlc3VsdE1hcD0iU3lzTWVudVJlc3VsdCI+CisJCXNlbGVjdCBkaXN0aW5jdCBtLm1lbnVfaWQsIG0ucGFyZW50X2lkLCBtLm1lbnVfbmFtZSwgbS5wYXRoLCBtLmNvbXBvbmVudCwgbS5gcXVlcnlgLCBtLnJvdXRlX25hbWUsIG0udmlzaWJsZSwgbS5zdGF0dXMsIGlmbnVsbChtLnBlcm1zLCcnKSBhcyBwZXJtcywgbS5pc19mcmFtZSwgbS5pc19jYWNoZSwgbS5tZW51X3R5cGUsIG0uaWNvbiwgbS5vcmRlcl9udW0sIG0uY3JlYXRlX3RpbWUKKwkJZnJvbSBzeXNfbWVudSBtIHdoZXJlIG0ubWVudV90eXBlIGluICgnTScsICdDJykgYW5kIG0uc3RhdHVzID0gMAorCQlvcmRlciBieSBtLnBhcmVudF9pZCwgbS5vcmRlcl9udW0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RNZW51TGlzdEJ5VXNlcklkIiBwYXJhbWV0ZXJUeXBlPSJTeXNNZW51IiByZXN1bHRNYXA9IlN5c01lbnVSZXN1bHQiPgorCQlzZWxlY3QgZGlzdGluY3QgbS5tZW51X2lkLCBtLnBhcmVudF9pZCwgbS5tZW51X25hbWUsIG0ucGF0aCwgbS5jb21wb25lbnQsIG0uYHF1ZXJ5YCwgbS5yb3V0ZV9uYW1lLCBtLnZpc2libGUsIG0uc3RhdHVzLCBpZm51bGwobS5wZXJtcywnJykgYXMgcGVybXMsIG0uaXNfZnJhbWUsIG0uaXNfY2FjaGUsIG0ubWVudV90eXBlLCBtLmljb24sIG0ub3JkZXJfbnVtLCBtLmNyZWF0ZV90aW1lCisJCWZyb20gc3lzX21lbnUgbQorCQlsZWZ0IGpvaW4gc3lzX3JvbGVfbWVudSBybSBvbiBtLm1lbnVfaWQgPSBybS5tZW51X2lkCisJCWxlZnQgam9pbiBzeXNfdXNlcl9yb2xlIHVyIG9uIHJtLnJvbGVfaWQgPSB1ci5yb2xlX2lkCisJCWxlZnQgam9pbiBzeXNfcm9sZSBybyBvbiB1ci5yb2xlX2lkID0gcm8ucm9sZV9pZAorCQl3aGVyZSB1ci51c2VyX2lkID0gI3twYXJhbXMudXNlcklkfQorCQk8aWYgdGVzdD0ibWVudU5hbWUgIT0gbnVsbCBhbmQgbWVudU5hbWUgIT0gJyciPgorICAgICAgICAgICAgQU5EIG0ubWVudV9uYW1lIGxpa2UgY29uY2F0KCclJywgI3ttZW51TmFtZX0sICclJykKKwkJPC9pZj4KKwkJPGlmIHRlc3Q9InZpc2libGUgIT0gbnVsbCBhbmQgdmlzaWJsZSAhPSAnJyI+CisgICAgICAgICAgICBBTkQgbS52aXNpYmxlID0gI3t2aXNpYmxlfQorCQk8L2lmPgorCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisgICAgICAgICAgICBBTkQgbS5zdGF0dXMgPSAje3N0YXR1c30KKwkJPC9pZj4KKwkJb3JkZXIgYnkgbS5wYXJlbnRfaWQsIG0ub3JkZXJfbnVtCisJPC9zZWxlY3Q+CisgICAgCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0TWVudVRyZWVCeVVzZXJJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNNZW51UmVzdWx0Ij4KKwkJc2VsZWN0IGRpc3RpbmN0IG0ubWVudV9pZCwgbS5wYXJlbnRfaWQsIG0ubWVudV9uYW1lLCBtLnBhdGgsIG0uY29tcG9uZW50LCBtLmBxdWVyeWAsIG0ucm91dGVfbmFtZSwgbS52aXNpYmxlLCBtLnN0YXR1cywgaWZudWxsKG0ucGVybXMsJycpIGFzIHBlcm1zLCBtLmlzX2ZyYW1lLCBtLmlzX2NhY2hlLCBtLm1lbnVfdHlwZSwgbS5pY29uLCBtLm9yZGVyX251bSwgbS5jcmVhdGVfdGltZQorCQlmcm9tIHN5c19tZW51IG0KKwkJCSBsZWZ0IGpvaW4gc3lzX3JvbGVfbWVudSBybSBvbiBtLm1lbnVfaWQgPSBybS5tZW51X2lkCisJCQkgbGVmdCBqb2luIHN5c191c2VyX3JvbGUgdXIgb24gcm0ucm9sZV9pZCA9IHVyLnJvbGVfaWQKKwkJCSBsZWZ0IGpvaW4gc3lzX3JvbGUgcm8gb24gdXIucm9sZV9pZCA9IHJvLnJvbGVfaWQKKwkJCSBsZWZ0IGpvaW4gc3lzX3VzZXIgdSBvbiB1ci51c2VyX2lkID0gdS51c2VyX2lkCisJCXdoZXJlIHUudXNlcl9pZCA9ICN7dXNlcklkfSBhbmQgbS5tZW51X3R5cGUgaW4gKCdNJywgJ0MnKSBhbmQgbS5zdGF0dXMgPSAwICBBTkQgcm8uc3RhdHVzID0gMAorCQlvcmRlciBieSBtLnBhcmVudF9pZCwgbS5vcmRlcl9udW0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RNZW51TGlzdEJ5Um9sZUlkIiByZXN1bHRUeXBlPSJMb25nIj4KKwkJc2VsZWN0IG0ubWVudV9pZAorCQlmcm9tIHN5c19tZW51IG0KKyAgICAgICAgICAgIGxlZnQgam9pbiBzeXNfcm9sZV9tZW51IHJtIG9uIG0ubWVudV9pZCA9IHJtLm1lbnVfaWQKKyAgICAgICAgd2hlcmUgcm0ucm9sZV9pZCA9ICN7cm9sZUlkfQorICAgICAgICAgICAgPGlmIHRlc3Q9Im1lbnVDaGVja1N0cmljdGx5Ij4KKyAgICAgICAgICAgICAgYW5kIG0ubWVudV9pZCBub3QgaW4gKHNlbGVjdCBtLnBhcmVudF9pZCBmcm9tIHN5c19tZW51IG0gaW5uZXIgam9pbiBzeXNfcm9sZV9tZW51IHJtIG9uIG0ubWVudV9pZCA9IHJtLm1lbnVfaWQgYW5kIHJtLnJvbGVfaWQgPSAje3JvbGVJZH0pCisgICAgICAgICAgICA8L2lmPgorCQlvcmRlciBieSBtLnBhcmVudF9pZCwgbS5vcmRlcl9udW0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RNZW51UGVybXMiIHJlc3VsdFR5cGU9IlN0cmluZyI+CisJCXNlbGVjdCBkaXN0aW5jdCBtLnBlcm1zCisJCWZyb20gc3lzX21lbnUgbQorCQkJIGxlZnQgam9pbiBzeXNfcm9sZV9tZW51IHJtIG9uIG0ubWVudV9pZCA9IHJtLm1lbnVfaWQKKwkJCSBsZWZ0IGpvaW4gc3lzX3VzZXJfcm9sZSB1ciBvbiBybS5yb2xlX2lkID0gdXIucm9sZV9pZAorCTwvc2VsZWN0PgorCisJPHNlbGVjdCBpZD0ic2VsZWN0TWVudVBlcm1zQnlVc2VySWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdFR5cGU9IlN0cmluZyI+CisJCXNlbGVjdCBkaXN0aW5jdCBtLnBlcm1zCisJCWZyb20gc3lzX21lbnUgbQorCQkJIGxlZnQgam9pbiBzeXNfcm9sZV9tZW51IHJtIG9uIG0ubWVudV9pZCA9IHJtLm1lbnVfaWQKKwkJCSBsZWZ0IGpvaW4gc3lzX3VzZXJfcm9sZSB1ciBvbiBybS5yb2xlX2lkID0gdXIucm9sZV9pZAorCQkJIGxlZnQgam9pbiBzeXNfcm9sZSByIG9uIHIucm9sZV9pZCA9IHVyLnJvbGVfaWQKKwkJd2hlcmUgbS5zdGF0dXMgPSAnMCcgYW5kIHIuc3RhdHVzID0gJzAnIGFuZCB1ci51c2VyX2lkID0gI3t1c2VySWR9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0TWVudVBlcm1zQnlSb2xlSWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdFR5cGU9IlN0cmluZyI+CisJCXNlbGVjdCBkaXN0aW5jdCBtLnBlcm1zCisJCWZyb20gc3lzX21lbnUgbQorCQkJIGxlZnQgam9pbiBzeXNfcm9sZV9tZW51IHJtIG9uIG0ubWVudV9pZCA9IHJtLm1lbnVfaWQKKwkJd2hlcmUgbS5zdGF0dXMgPSAnMCcgYW5kIHJtLnJvbGVfaWQgPSAje3JvbGVJZH0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RNZW51QnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNNZW51UmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdE1lbnVWbyIvPgorCQl3aGVyZSBtZW51X2lkID0gI3ttZW51SWR9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iaGFzQ2hpbGRCeU1lbnVJZCIgcmVzdWx0VHlwZT0iSW50ZWdlciI+CisJICAgIHNlbGVjdCBjb3VudCgxKSBmcm9tIHN5c19tZW51IHdoZXJlIHBhcmVudF9pZCA9ICN7bWVudUlkfSAgCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iY2hlY2tNZW51TmFtZVVuaXF1ZSIgcGFyYW1ldGVyVHlwZT0iU3lzTWVudSIgcmVzdWx0TWFwPSJTeXNNZW51UmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdE1lbnVWbyIvPgorCQl3aGVyZSBtZW51X25hbWU9I3ttZW51TmFtZX0gYW5kIHBhcmVudF9pZCA9ICN7cGFyZW50SWR9IGxpbWl0IDEKKwk8L3NlbGVjdD4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVNZW51IiBwYXJhbWV0ZXJUeXBlPSJTeXNNZW51Ij4KKwkJdXBkYXRlIHN5c19tZW51CisJCTxzZXQ+CisJCQk8aWYgdGVzdD0ibWVudU5hbWUgIT0gbnVsbCBhbmQgbWVudU5hbWUgIT0gJyciPm1lbnVfbmFtZSA9ICN7bWVudU5hbWV9LDwvaWY+CisJCQk8aWYgdGVzdD0icGFyZW50SWQgIT0gbnVsbCI+cGFyZW50X2lkID0gI3twYXJlbnRJZH0sPC9pZj4KKwkJCTxpZiB0ZXN0PSJvcmRlck51bSAhPSBudWxsIj5vcmRlcl9udW0gPSAje29yZGVyTnVtfSw8L2lmPgorCQkJPGlmIHRlc3Q9InBhdGggIT0gbnVsbCBhbmQgcGF0aCAhPSAnJyI+cGF0aCA9ICN7cGF0aH0sPC9pZj4KKwkJCTxpZiB0ZXN0PSJjb21wb25lbnQgIT0gbnVsbCI+Y29tcG9uZW50ID0gI3tjb21wb25lbnR9LDwvaWY+CisJCQk8aWYgdGVzdD0icXVlcnkgIT0gbnVsbCI+YHF1ZXJ5YCA9ICN7cXVlcnl9LDwvaWY+CisJCQk8aWYgdGVzdD0icm91dGVOYW1lICE9IG51bGwiPnJvdXRlX25hbWUgPSAje3JvdXRlTmFtZX0sPC9pZj4KKwkJCTxpZiB0ZXN0PSJpc0ZyYW1lICE9IG51bGwgYW5kIGlzRnJhbWUgIT0gJyciPmlzX2ZyYW1lID0gI3tpc0ZyYW1lfSw8L2lmPgorCQkJPGlmIHRlc3Q9ImlzQ2FjaGUgIT0gbnVsbCBhbmQgaXNDYWNoZSAhPSAnJyI+aXNfY2FjaGUgPSAje2lzQ2FjaGV9LDwvaWY+CisJCQk8aWYgdGVzdD0ibWVudVR5cGUgIT0gbnVsbCBhbmQgbWVudVR5cGUgIT0gJyciPm1lbnVfdHlwZSA9ICN7bWVudVR5cGV9LDwvaWY+CisJCQk8aWYgdGVzdD0idmlzaWJsZSAhPSBudWxsIj52aXNpYmxlID0gI3t2aXNpYmxlfSw8L2lmPgorCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMgPSAje3N0YXR1c30sPC9pZj4KKwkJCTxpZiB0ZXN0PSJwZXJtcyAhPW51bGwiPnBlcm1zID0gI3twZXJtc30sPC9pZj4KKwkJCTxpZiB0ZXN0PSJpY29uICE9bnVsbCBhbmQgaWNvbiAhPSAnJyI+aWNvbiA9ICN7aWNvbn0sPC9pZj4KKwkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmsgPSAje3JlbWFya30sPC9pZj4KKwkJCTxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIGFuZCB1cGRhdGVCeSAhPSAnJyI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKwkJCXVwZGF0ZV90aW1lID0gc3lzZGF0ZSgpCisJCTwvc2V0PgorCQl3aGVyZSBtZW51X2lkID0gI3ttZW51SWR9CisJPC91cGRhdGU+CisKKwk8aW5zZXJ0IGlkPSJpbnNlcnRNZW51IiBwYXJhbWV0ZXJUeXBlPSJTeXNNZW51Ij4KKwkJaW5zZXJ0IGludG8gc3lzX21lbnUoCisJCTxpZiB0ZXN0PSJtZW51SWQgIT0gbnVsbCBhbmQgbWVudUlkICE9IDAiPm1lbnVfaWQsPC9pZj4KKwkJPGlmIHRlc3Q9InBhcmVudElkICE9IG51bGwgYW5kIHBhcmVudElkICE9IDAiPnBhcmVudF9pZCw8L2lmPgorCQk8aWYgdGVzdD0ibWVudU5hbWUgIT0gbnVsbCBhbmQgbWVudU5hbWUgIT0gJyciPm1lbnVfbmFtZSw8L2lmPgorCQk8aWYgdGVzdD0ib3JkZXJOdW0gIT0gbnVsbCI+b3JkZXJfbnVtLDwvaWY+CisJCTxpZiB0ZXN0PSJwYXRoICE9IG51bGwgYW5kIHBhdGggIT0gJyciPnBhdGgsPC9pZj4KKwkJPGlmIHRlc3Q9ImNvbXBvbmVudCAhPSBudWxsIGFuZCBjb21wb25lbnQgIT0gJyciPmNvbXBvbmVudCw8L2lmPgorCQk8aWYgdGVzdD0icXVlcnkgIT0gbnVsbCBhbmQgcXVlcnkgIT0gJyciPmBxdWVyeWAsPC9pZj4KKwkJPGlmIHRlc3Q9InJvdXRlTmFtZSAhPSBudWxsIj5yb3V0ZV9uYW1lLDwvaWY+CisJCTxpZiB0ZXN0PSJpc0ZyYW1lICE9IG51bGwgYW5kIGlzRnJhbWUgIT0gJyciPmlzX2ZyYW1lLDwvaWY+CisJCTxpZiB0ZXN0PSJpc0NhY2hlICE9IG51bGwgYW5kIGlzQ2FjaGUgIT0gJyciPmlzX2NhY2hlLDwvaWY+CisJCTxpZiB0ZXN0PSJtZW51VHlwZSAhPSBudWxsIGFuZCBtZW51VHlwZSAhPSAnJyI+bWVudV90eXBlLDwvaWY+CisJCTxpZiB0ZXN0PSJ2aXNpYmxlICE9IG51bGwiPnZpc2libGUsPC9pZj4KKwkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj5zdGF0dXMsPC9pZj4KKwkJPGlmIHRlc3Q9InBlcm1zICE9bnVsbCBhbmQgcGVybXMgIT0gJyciPnBlcm1zLDwvaWY+CisJCTxpZiB0ZXN0PSJpY29uICE9IG51bGwgYW5kIGljb24gIT0gJyciPmljb24sPC9pZj4KKwkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPnJlbWFyayw8L2lmPgorCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPmNyZWF0ZV9ieSw8L2lmPgorCQljcmVhdGVfdGltZQorCQkpdmFsdWVzKAorCQk8aWYgdGVzdD0ibWVudUlkICE9IG51bGwgYW5kIG1lbnVJZCAhPSAwIj4je21lbnVJZH0sPC9pZj4KKwkJPGlmIHRlc3Q9InBhcmVudElkICE9IG51bGwgYW5kIHBhcmVudElkICE9IDAiPiN7cGFyZW50SWR9LDwvaWY+CisJCTxpZiB0ZXN0PSJtZW51TmFtZSAhPSBudWxsIGFuZCBtZW51TmFtZSAhPSAnJyI+I3ttZW51TmFtZX0sPC9pZj4KKwkJPGlmIHRlc3Q9Im9yZGVyTnVtICE9IG51bGwiPiN7b3JkZXJOdW19LDwvaWY+CisJCTxpZiB0ZXN0PSJwYXRoICE9IG51bGwgYW5kIHBhdGggIT0gJyciPiN7cGF0aH0sPC9pZj4KKwkJPGlmIHRlc3Q9ImNvbXBvbmVudCAhPSBudWxsIGFuZCBjb21wb25lbnQgIT0gJyciPiN7Y29tcG9uZW50fSw8L2lmPgorCQk8aWYgdGVzdD0icXVlcnkgIT0gbnVsbCBhbmQgcXVlcnkgIT0gJyciPiN7cXVlcnl9LDwvaWY+CisJCTxpZiB0ZXN0PSJyb3V0ZU5hbWUgIT0gbnVsbCI+I3tyb3V0ZU5hbWV9LDwvaWY+CisJCTxpZiB0ZXN0PSJpc0ZyYW1lICE9IG51bGwgYW5kIGlzRnJhbWUgIT0gJyciPiN7aXNGcmFtZX0sPC9pZj4KKwkJPGlmIHRlc3Q9ImlzQ2FjaGUgIT0gbnVsbCBhbmQgaXNDYWNoZSAhPSAnJyI+I3tpc0NhY2hlfSw8L2lmPgorCQk8aWYgdGVzdD0ibWVudVR5cGUgIT0gbnVsbCBhbmQgbWVudVR5cGUgIT0gJyciPiN7bWVudVR5cGV9LDwvaWY+CisJCTxpZiB0ZXN0PSJ2aXNpYmxlICE9IG51bGwiPiN7dmlzaWJsZX0sPC9pZj4KKwkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIj4je3N0YXR1c30sPC9pZj4KKwkJPGlmIHRlc3Q9InBlcm1zICE9bnVsbCBhbmQgcGVybXMgIT0gJyciPiN7cGVybXN9LDwvaWY+CisJCTxpZiB0ZXN0PSJpY29uICE9IG51bGwgYW5kIGljb24gIT0gJyciPiN7aWNvbn0sPC9pZj4KKwkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPiN7Y3JlYXRlQnl9LDwvaWY+CisJCXN5c2RhdGUoKQorCQkpCisJPC9pbnNlcnQ+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlTWVudUJ5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorCSAgICBkZWxldGUgZnJvbSBzeXNfbWVudSB3aGVyZSBtZW51X2lkID0gI3ttZW51SWR9CisJPC9kZWxldGU+CisKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTm90aWNlTWFwcGVyLnhtbCBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNOb3RpY2VNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDMwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzTm90aWNlTWFwcGVyLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNOb3RpY2VNYXBwZXIiPgorICAgIAorICAgIDxyZXN1bHRNYXAgdHlwZT0iU3lzTm90aWNlIiBpZD0iU3lzTm90aWNlUmVzdWx0Ij4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0ibm90aWNlSWQiICAgICAgIGNvbHVtbj0ibm90aWNlX2lkIiAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJub3RpY2VUaXRsZSIgICAgY29sdW1uPSJub3RpY2VfdGl0bGUiICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9Im5vdGljZVR5cGUiICAgICBjb2x1bW49Im5vdGljZV90eXBlIiAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0ibm90aWNlQ29udGVudCIgIGNvbHVtbj0ibm90aWNlX2NvbnRlbnQiICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgICAgICAgY29sdW1uPSJzdGF0dXMiICAgICAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImNyZWF0ZUJ5IiAgICAgICBjb2x1bW49ImNyZWF0ZV9ieSIgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlVGltZSIgICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgICAgY29sdW1uPSJ1cGRhdGVfYnkiICAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZVRpbWUiICAgICBjb2x1bW49InVwZGF0ZV90aW1lIiAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icmVtYXJrIiAgICAgICAgIGNvbHVtbj0icmVtYXJrIiAgICAgICAgICAvPgorICAgIDwvcmVzdWx0TWFwPgorICAgIAorICAgIDxzcWwgaWQ9InNlbGVjdE5vdGljZVZvIj4KKyAgICAgICAgc2VsZWN0IG5vdGljZV9pZCwgbm90aWNlX3RpdGxlLCBub3RpY2VfdHlwZSwgY2FzdChub3RpY2VfY29udGVudCBhcyBjaGFyKSBhcyBub3RpY2VfY29udGVudCwgc3RhdHVzLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmsgCisJCWZyb20gc3lzX25vdGljZQorICAgIDwvc3FsPgorICAgIAorICAgIDxzZWxlY3QgaWQ9InNlbGVjdE5vdGljZUJ5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iU3lzTm90aWNlUmVzdWx0Ij4KKyAgICAgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdE5vdGljZVZvIi8+CisgICAgICAgIHdoZXJlIG5vdGljZV9pZCA9ICN7bm90aWNlSWR9CisgICAgPC9zZWxlY3Q+CisgICAgCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0Tm90aWNlTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzTm90aWNlIiByZXN1bHRNYXA9IlN5c05vdGljZVJlc3VsdCI+CisgICAgICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3ROb3RpY2VWbyIvPgorICAgICAgICA8d2hlcmU+CisJCQk8aWYgdGVzdD0ibm90aWNlVGl0bGUgIT0gbnVsbCBhbmQgbm90aWNlVGl0bGUgIT0gJyciPgorCQkJCUFORCBub3RpY2VfdGl0bGUgbGlrZSBjb25jYXQoJyUnLCAje25vdGljZVRpdGxlfSwgJyUnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJub3RpY2VUeXBlICE9IG51bGwgYW5kIG5vdGljZVR5cGUgIT0gJyciPgorCQkJCUFORCBub3RpY2VfdHlwZSA9ICN7bm90aWNlVHlwZX0KKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPgorCQkJCUFORCBjcmVhdGVfYnkgbGlrZSBjb25jYXQoJyUnLCAje2NyZWF0ZUJ5fSwgJyUnKQorCQkJPC9pZj4KKwkJPC93aGVyZT4KKyAgICA8L3NlbGVjdD4KKyAgICAKKyAgICA8aW5zZXJ0IGlkPSJpbnNlcnROb3RpY2UiIHBhcmFtZXRlclR5cGU9IlN5c05vdGljZSI+CisgICAgICAgIGluc2VydCBpbnRvIHN5c19ub3RpY2UgKAorCQkJPGlmIHRlc3Q9Im5vdGljZVRpdGxlICE9IG51bGwgYW5kIG5vdGljZVRpdGxlICE9ICcnICI+bm90aWNlX3RpdGxlLCA8L2lmPgorCQkJPGlmIHRlc3Q9Im5vdGljZVR5cGUgIT0gbnVsbCBhbmQgbm90aWNlVHlwZSAhPSAnJyAiPm5vdGljZV90eXBlLCA8L2lmPgorCQkJPGlmIHRlc3Q9Im5vdGljZUNvbnRlbnQgIT0gbnVsbCBhbmQgbm90aWNlQ29udGVudCAhPSAnJyAiPm5vdGljZV9jb250ZW50LCA8L2lmPgorCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJycgIj5zdGF0dXMsIDwvaWY+CisJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+cmVtYXJrLDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj5jcmVhdGVfYnksPC9pZj4KKyAJCQljcmVhdGVfdGltZQorIAkJKXZhbHVlcygKKwkJCTxpZiB0ZXN0PSJub3RpY2VUaXRsZSAhPSBudWxsIGFuZCBub3RpY2VUaXRsZSAhPSAnJyI+I3tub3RpY2VUaXRsZX0sIDwvaWY+CisJCQk8aWYgdGVzdD0ibm90aWNlVHlwZSAhPSBudWxsIGFuZCBub3RpY2VUeXBlICE9ICcnIj4je25vdGljZVR5cGV9LCA8L2lmPgorCQkJPGlmIHRlc3Q9Im5vdGljZUNvbnRlbnQgIT0gbnVsbCBhbmQgbm90aWNlQ29udGVudCAhPSAnJyI+I3tub3RpY2VDb250ZW50fSwgPC9pZj4KKwkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4je3N0YXR1c30sIDwvaWY+CisJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+I3tyZW1hcmt9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj4je2NyZWF0ZUJ5fSw8L2lmPgorIAkJCXN5c2RhdGUoKQorCQkpCisgICAgPC9pbnNlcnQ+CisJIAorICAgIDx1cGRhdGUgaWQ9InVwZGF0ZU5vdGljZSIgcGFyYW1ldGVyVHlwZT0iU3lzTm90aWNlIj4KKyAgICAgICAgdXBkYXRlIHN5c19ub3RpY2UgCisgICAgICAgIDxzZXQ+CisgICAgICAgICAgICA8aWYgdGVzdD0ibm90aWNlVGl0bGUgIT0gbnVsbCBhbmQgbm90aWNlVGl0bGUgIT0gJyciPm5vdGljZV90aXRsZSA9ICN7bm90aWNlVGl0bGV9LCA8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9Im5vdGljZVR5cGUgIT0gbnVsbCBhbmQgbm90aWNlVHlwZSAhPSAnJyI+bm90aWNlX3R5cGUgPSAje25vdGljZVR5cGV9LCA8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9Im5vdGljZUNvbnRlbnQgIT0gbnVsbCI+bm90aWNlX2NvbnRlbnQgPSAje25vdGljZUNvbnRlbnR9LCA8L2lmPgorICAgICAgICAgICAgPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyA9ICN7c3RhdHVzfSwgPC9pZj4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIGFuZCB1cGRhdGVCeSAhPSAnJyI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKyAJCQl1cGRhdGVfdGltZSA9IHN5c2RhdGUoKQorICAgICAgICA8L3NldD4KKyAgICAgICAgd2hlcmUgbm90aWNlX2lkID0gI3tub3RpY2VJZH0KKyAgICA8L3VwZGF0ZT4KKwkKKyAgICA8ZGVsZXRlIGlkPSJkZWxldGVOb3RpY2VCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gc3lzX25vdGljZSB3aGVyZSBub3RpY2VfaWQgPSAje25vdGljZUlkfQorICAgIDwvZGVsZXRlPgorICAgIAorICAgIDxkZWxldGUgaWQ9ImRlbGV0ZU5vdGljZUJ5SWRzIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAgICAgICAgZGVsZXRlIGZyb20gc3lzX25vdGljZSB3aGVyZSBub3RpY2VfaWQgaW4gCisgICAgICAgIDxmb3JlYWNoIGl0ZW09Im5vdGljZUlkIiBjb2xsZWN0aW9uPSJhcnJheSIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisgICAgICAgICAgICAje25vdGljZUlkfQorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC9kZWxldGU+CisgICAgCis8L21hcHBlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzT3BlckxvZ01hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzT3BlckxvZ01hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZGIwNwotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNPcGVyTG9nTWFwcGVyLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNPcGVyTG9nTWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzT3BlckxvZyIgaWQ9IlN5c09wZXJMb2dSZXN1bHQiPgorCQk8aWQgICAgIHByb3BlcnR5PSJvcGVySWQiICAgICAgICAgY29sdW1uPSJvcGVyX2lkIiAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idGl0bGUiICAgICAgICAgIGNvbHVtbj0idGl0bGUiICAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImJ1c2luZXNzVHlwZSIgICBjb2x1bW49ImJ1c2luZXNzX3R5cGUiICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJtZXRob2QiICAgICAgICAgY29sdW1uPSJtZXRob2QiICAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icmVxdWVzdE1ldGhvZCIgIGNvbHVtbj0icmVxdWVzdF9tZXRob2QiIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Im9wZXJhdG9yVHlwZSIgICBjb2x1bW49Im9wZXJhdG9yX3R5cGUiICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJvcGVyTmFtZSIgICAgICAgY29sdW1uPSJvcGVyX25hbWUiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iZGVwdE5hbWUiICAgICAgIGNvbHVtbj0iZGVwdF9uYW1lIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Im9wZXJVcmwiICAgICAgICBjb2x1bW49Im9wZXJfdXJsIiAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJvcGVySXAiICAgICAgICAgY29sdW1uPSJvcGVyX2lwIiAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ib3BlckxvY2F0aW9uIiAgIGNvbHVtbj0ib3Blcl9sb2NhdGlvbiIgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9Im9wZXJQYXJhbSIgICAgICBjb2x1bW49Im9wZXJfcGFyYW0iICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJqc29uUmVzdWx0IiAgICAgY29sdW1uPSJqc29uX3Jlc3VsdCIgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0ic3RhdHVzIiAgICAgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImVycm9yTXNnIiAgICAgICBjb2x1bW49ImVycm9yX21zZyIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJvcGVyVGltZSIgICAgICAgY29sdW1uPSJvcGVyX3RpbWUiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY29zdFRpbWUiICAgICAgIGNvbHVtbj0iY29zdF90aW1lIiAgICAgIC8+CisJPC9yZXN1bHRNYXA+CisKKwk8c3FsIGlkPSJzZWxlY3RPcGVyTG9nVm8iPgorICAgICAgICBzZWxlY3Qgb3Blcl9pZCwgdGl0bGUsIGJ1c2luZXNzX3R5cGUsIG1ldGhvZCwgcmVxdWVzdF9tZXRob2QsIG9wZXJhdG9yX3R5cGUsIG9wZXJfbmFtZSwgZGVwdF9uYW1lLCBvcGVyX3VybCwgb3Blcl9pcCwgb3Blcl9sb2NhdGlvbiwgb3Blcl9wYXJhbSwganNvbl9yZXN1bHQsIHN0YXR1cywgZXJyb3JfbXNnLCBvcGVyX3RpbWUsIGNvc3RfdGltZQorICAgICAgICBmcm9tIHN5c19vcGVyX2xvZworICAgIDwvc3FsPgorICAgIAorCTxpbnNlcnQgaWQ9Imluc2VydE9wZXJsb2ciIHBhcmFtZXRlclR5cGU9IlN5c09wZXJMb2ciPgorCQlpbnNlcnQgaW50byBzeXNfb3Blcl9sb2codGl0bGUsIGJ1c2luZXNzX3R5cGUsIG1ldGhvZCwgcmVxdWVzdF9tZXRob2QsIG9wZXJhdG9yX3R5cGUsIG9wZXJfbmFtZSwgZGVwdF9uYW1lLCBvcGVyX3VybCwgb3Blcl9pcCwgb3Blcl9sb2NhdGlvbiwgb3Blcl9wYXJhbSwganNvbl9yZXN1bHQsIHN0YXR1cywgZXJyb3JfbXNnLCBjb3N0X3RpbWUsIG9wZXJfdGltZSkKKyAgICAgICAgdmFsdWVzICgje3RpdGxlfSwgI3tidXNpbmVzc1R5cGV9LCAje21ldGhvZH0sICN7cmVxdWVzdE1ldGhvZH0sICN7b3BlcmF0b3JUeXBlfSwgI3tvcGVyTmFtZX0sICN7ZGVwdE5hbWV9LCAje29wZXJVcmx9LCAje29wZXJJcH0sICN7b3BlckxvY2F0aW9ufSwgI3tvcGVyUGFyYW19LCAje2pzb25SZXN1bHR9LCAje3N0YXR1c30sICN7ZXJyb3JNc2d9LCAje2Nvc3RUaW1lfSwgc3lzZGF0ZSgpKQorCTwvaW5zZXJ0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdE9wZXJMb2dMaXN0IiBwYXJhbWV0ZXJUeXBlPSJTeXNPcGVyTG9nIiByZXN1bHRNYXA9IlN5c09wZXJMb2dSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0T3BlckxvZ1ZvIi8+CisJCTx3aGVyZT4KKwkJCTxpZiB0ZXN0PSJvcGVySXAgIT0gbnVsbCBhbmQgb3BlcklwICE9ICcnIj4KKwkJCQlBTkQgb3Blcl9pcCBsaWtlIGNvbmNhdCgnJScsICN7b3BlcklwfSwgJyUnKQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJ0aXRsZSAhPSBudWxsIGFuZCB0aXRsZSAhPSAnJyI+CisJCQkJQU5EIHRpdGxlIGxpa2UgY29uY2F0KCclJywgI3t0aXRsZX0sICclJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0iYnVzaW5lc3NUeXBlICE9IG51bGwiPgorCQkJCUFORCBidXNpbmVzc190eXBlID0gI3tidXNpbmVzc1R5cGV9CisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9ImJ1c2luZXNzVHlwZXMgIT0gbnVsbCBhbmQgYnVzaW5lc3NUeXBlcy5sZW5ndGggPiAwIj4KKwkJCSAgICBBTkQgYnVzaW5lc3NfdHlwZSBpbgorCQkJICAgIDxmb3JlYWNoIGNvbGxlY3Rpb249ImJ1c2luZXNzVHlwZXMiIGl0ZW09ImJ1c2luZXNzVHlwZSIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisJCSAJCQkje2J1c2luZXNzVHlwZX0KKwkJICAgICAgICA8L2ZvcmVhY2g+IAorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJvcGVyTmFtZSAhPSBudWxsIGFuZCBvcGVyTmFtZSAhPSAnJyI+CisJCQkJQU5EIG9wZXJfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7b3Blck5hbWV9LCAnJScpCisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InBhcmFtcy5iZWdpblRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmJlZ2luVGltZSAhPSAnJyI+PCEtLSDlvIDlp4vml7bpl7Tmo4DntKIgLS0+CisJCQkJQU5EIG9wZXJfdGltZSAmZ3Q7PSAje3BhcmFtcy5iZWdpblRpbWV9CisJCQk8L2lmPgorCQkJPGlmIHRlc3Q9InBhcmFtcy5lbmRUaW1lICE9IG51bGwgYW5kIHBhcmFtcy5lbmRUaW1lICE9ICcnIj48IS0tIOe7k+adn+aXtumXtOajgOe0oiAtLT4KKwkJCQlBTkQgb3Blcl90aW1lICZsdDs9ICN7cGFyYW1zLmVuZFRpbWV9CisJCQk8L2lmPgorCQk8L3doZXJlPgorCQlvcmRlciBieSBvcGVyX2lkIGRlc2MKKwk8L3NlbGVjdD4KKwkKKwk8ZGVsZXRlIGlkPSJkZWxldGVPcGVyTG9nQnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX29wZXJfbG9nIHdoZXJlIG9wZXJfaWQgaW4KKyAJCTxmb3JlYWNoIGNvbGxlY3Rpb249ImFycmF5IiBpdGVtPSJvcGVySWQiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorIAkJCSN7b3BlcklkfQorICAgICAgICA8L2ZvcmVhY2g+IAorIAk8L2RlbGV0ZT4KKyAJCisgCTxzZWxlY3QgaWQ9InNlbGVjdE9wZXJMb2dCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIiByZXN1bHRNYXA9IlN5c09wZXJMb2dSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0T3BlckxvZ1ZvIi8+CisJCXdoZXJlIG9wZXJfaWQgPSAje29wZXJJZH0KKwk8L3NlbGVjdD4KKwkKKwk8dXBkYXRlIGlkPSJjbGVhbk9wZXJMb2ciPgorICAgICAgICB0cnVuY2F0ZSB0YWJsZSBzeXNfb3Blcl9sb2cKKyAgICA8L3VwZGF0ZT4KKworPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNQb3N0TWFwcGVyLnhtbCBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNQb3N0TWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdjNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1Bvc3RNYXBwZXIueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNQb3N0TWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzUG9zdCIgaWQ9IlN5c1Bvc3RSZXN1bHQiPgorCQk8aWQgICAgIHByb3BlcnR5PSJwb3N0SWQiICAgICAgICBjb2x1bW49InBvc3RfaWQiICAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InBvc3RDb2RlIiAgICAgIGNvbHVtbj0icG9zdF9jb2RlIiAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icG9zdE5hbWUiICAgICAgY29sdW1uPSJwb3N0X25hbWUiICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJwb3N0U29ydCIgICAgICBjb2x1bW49InBvc3Rfc29ydCIgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0iY3JlYXRlQnkiICAgICAgY29sdW1uPSJjcmVhdGVfYnkiICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICBjb2x1bW49ImNyZWF0ZV90aW1lIiAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9InVwZGF0ZUJ5IiAgICAgIGNvbHVtbj0idXBkYXRlX2J5IiAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0idXBkYXRlVGltZSIgICAgY29sdW1uPSJ1cGRhdGVfdGltZSIgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyZW1hcmsiICAgICAgICBjb2x1bW49InJlbWFyayIgICAgICAgIC8+CisJPC9yZXN1bHRNYXA+CisJCisJPHNxbCBpZD0ic2VsZWN0UG9zdFZvIj4KKyAgICAgICAgc2VsZWN0IHBvc3RfaWQsIHBvc3RfY29kZSwgcG9zdF9uYW1lLCBwb3N0X3NvcnQsIHN0YXR1cywgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgcmVtYXJrIAorCQlmcm9tIHN5c19wb3N0CisgICAgPC9zcWw+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0UG9zdExpc3QiIHBhcmFtZXRlclR5cGU9IlN5c1Bvc3QiIHJlc3VsdE1hcD0iU3lzUG9zdFJlc3VsdCI+CisJICAgIDxpbmNsdWRlIHJlZmlkPSJzZWxlY3RQb3N0Vm8iLz4KKwkJPHdoZXJlPgorCQkJPGlmIHRlc3Q9InBvc3RDb2RlICE9IG51bGwgYW5kIHBvc3RDb2RlICE9ICcnIj4KKwkJCQlBTkQgcG9zdF9jb2RlIGxpa2UgY29uY2F0KCclJywgI3twb3N0Q29kZX0sICclJykKKwkJCTwvaWY+CisJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+CisJCQkJQU5EIHN0YXR1cyA9ICN7c3RhdHVzfQorCQkJPC9pZj4KKwkJCTxpZiB0ZXN0PSJwb3N0TmFtZSAhPSBudWxsIGFuZCBwb3N0TmFtZSAhPSAnJyI+CisJCQkJQU5EIHBvc3RfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7cG9zdE5hbWV9LCAnJScpCisJCQk8L2lmPgorCQk8L3doZXJlPgorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdFBvc3RBbGwiIHJlc3VsdE1hcD0iU3lzUG9zdFJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RQb3N0Vm8iLz4KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RQb3N0QnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNQb3N0UmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFBvc3RWbyIvPgorCQl3aGVyZSBwb3N0X2lkID0gI3twb3N0SWR9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0UG9zdExpc3RCeVVzZXJJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0VHlwZT0iTG9uZyI+CisJCXNlbGVjdCBwLnBvc3RfaWQKKyAgICAgICAgZnJvbSBzeXNfcG9zdCBwCisJICAgICAgICBsZWZ0IGpvaW4gc3lzX3VzZXJfcG9zdCB1cCBvbiB1cC5wb3N0X2lkID0gcC5wb3N0X2lkCisJICAgICAgICBsZWZ0IGpvaW4gc3lzX3VzZXIgdSBvbiB1LnVzZXJfaWQgPSB1cC51c2VyX2lkCisJICAgIHdoZXJlIHUudXNlcl9pZCA9ICN7dXNlcklkfQorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdFBvc3RzQnlVc2VyTmFtZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IlN5c1Bvc3RSZXN1bHQiPgorCQlzZWxlY3QgcC5wb3N0X2lkLCBwLnBvc3RfbmFtZSwgcC5wb3N0X2NvZGUKKwkJZnJvbSBzeXNfcG9zdCBwCisJCQkgbGVmdCBqb2luIHN5c191c2VyX3Bvc3QgdXAgb24gdXAucG9zdF9pZCA9IHAucG9zdF9pZAorCQkJIGxlZnQgam9pbiBzeXNfdXNlciB1IG9uIHUudXNlcl9pZCA9IHVwLnVzZXJfaWQKKwkJd2hlcmUgdS51c2VyX25hbWUgPSAje3VzZXJOYW1lfQorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9ImNoZWNrUG9zdE5hbWVVbmlxdWUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyIgcmVzdWx0TWFwPSJTeXNQb3N0UmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFBvc3RWbyIvPgorCQkgd2hlcmUgcG9zdF9uYW1lPSN7cG9zdE5hbWV9IGxpbWl0IDEKKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJjaGVja1Bvc3RDb2RlVW5pcXVlIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iU3lzUG9zdFJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RQb3N0Vm8iLz4KKwkJIHdoZXJlIHBvc3RfY29kZT0je3Bvc3RDb2RlfSBsaW1pdCAxCisJPC9zZWxlY3Q+CisJCisJPHVwZGF0ZSBpZD0idXBkYXRlUG9zdCIgcGFyYW1ldGVyVHlwZT0iU3lzUG9zdCI+CisgCQl1cGRhdGUgc3lzX3Bvc3QKKyAJCTxzZXQ+CisgCQkJPGlmIHRlc3Q9InBvc3RDb2RlICE9IG51bGwgYW5kIHBvc3RDb2RlICE9ICcnIj5wb3N0X2NvZGUgPSAje3Bvc3RDb2RlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJwb3N0TmFtZSAhPSBudWxsIGFuZCBwb3N0TmFtZSAhPSAnJyI+cG9zdF9uYW1lID0gI3twb3N0TmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icG9zdFNvcnQgIT0gbnVsbCI+cG9zdF9zb3J0ID0gI3twb3N0U29ydH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+c3RhdHVzID0gI3tzdGF0dXN9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIj5yZW1hcmsgPSAje3JlbWFya30sPC9pZj4KKyAJCQk8aWYgdGVzdD0idXBkYXRlQnkgIT0gbnVsbCBhbmQgdXBkYXRlQnkgIT0gJyciPnVwZGF0ZV9ieSA9ICN7dXBkYXRlQnl9LDwvaWY+CisgCQkJdXBkYXRlX3RpbWUgPSBzeXNkYXRlKCkKKyAJCTwvc2V0PgorIAkJd2hlcmUgcG9zdF9pZCA9ICN7cG9zdElkfQorCTwvdXBkYXRlPgorIAkKKyAJPGluc2VydCBpZD0iaW5zZXJ0UG9zdCIgcGFyYW1ldGVyVHlwZT0iU3lzUG9zdCIgdXNlR2VuZXJhdGVkS2V5cz0idHJ1ZSIga2V5UHJvcGVydHk9InBvc3RJZCI+CisgCQlpbnNlcnQgaW50byBzeXNfcG9zdCgKKyAJCQk8aWYgdGVzdD0icG9zdElkICE9IG51bGwgYW5kIHBvc3RJZCAhPSAwIj5wb3N0X2lkLDwvaWY+CisgCQkJPGlmIHRlc3Q9InBvc3RDb2RlICE9IG51bGwgYW5kIHBvc3RDb2RlICE9ICcnIj5wb3N0X2NvZGUsPC9pZj4KKyAJCQk8aWYgdGVzdD0icG9zdE5hbWUgIT0gbnVsbCBhbmQgcG9zdE5hbWUgIT0gJyciPnBvc3RfbmFtZSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJwb3N0U29ydCAhPSBudWxsIj5wb3N0X3NvcnQsPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+c3RhdHVzLDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPnJlbWFyayw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+Y3JlYXRlX2J5LDwvaWY+CisgCQkJY3JlYXRlX3RpbWUKKyAJCSl2YWx1ZXMoCisgCQkJPGlmIHRlc3Q9InBvc3RJZCAhPSBudWxsIGFuZCBwb3N0SWQgIT0gMCI+I3twb3N0SWR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBvc3RDb2RlICE9IG51bGwgYW5kIHBvc3RDb2RlICE9ICcnIj4je3Bvc3RDb2RlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJwb3N0TmFtZSAhPSBudWxsIGFuZCBwb3N0TmFtZSAhPSAnJyI+I3twb3N0TmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icG9zdFNvcnQgIT0gbnVsbCI+I3twb3N0U29ydH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ic3RhdHVzICE9IG51bGwgYW5kIHN0YXR1cyAhPSAnJyI+I3tzdGF0dXN9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+I3tjcmVhdGVCeX0sPC9pZj4KKyAJCQlzeXNkYXRlKCkKKyAJCSkKKwk8L2luc2VydD4KKwkKKwk8ZGVsZXRlIGlkPSJkZWxldGVQb3N0QnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisJCWRlbGV0ZSBmcm9tIHN5c19wb3N0IHdoZXJlIHBvc3RfaWQgPSAje3Bvc3RJZH0KKwk8L2RlbGV0ZT4KKwkKKwk8ZGVsZXRlIGlkPSJkZWxldGVQb3N0QnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX3Bvc3Qgd2hlcmUgcG9zdF9pZCBpbgorIAkJPGZvcmVhY2ggY29sbGVjdGlvbj0iYXJyYXkiIGl0ZW09InBvc3RJZCIgb3Blbj0iKCIgc2VwYXJhdG9yPSIsIiBjbG9zZT0iKSI+CisgCQkJI3twb3N0SWR9CisgICAgICAgIDwvZm9yZWFjaD4gCisgCTwvZGVsZXRlPgorCis8L21hcHBlcj4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1JvbGVEZXB0TWFwcGVyLnhtbCBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNSb2xlRGVwdE1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MTM5YgotLS0gL2Rldi9udWxsCisrKyBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNSb2xlRGVwdE1hcHBlci54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbWFwcGVyCitQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLnJ1b3lpLnN5c3RlbS5tYXBwZXIuU3lzUm9sZURlcHRNYXBwZXIiPgorCisJPHJlc3VsdE1hcCB0eXBlPSJTeXNSb2xlRGVwdCIgaWQ9IlN5c1JvbGVEZXB0UmVzdWx0Ij4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icm9sZUlkIiAgICAgY29sdW1uPSJyb2xlX2lkIiAgICAgIC8+CisJCTxyZXN1bHQgcHJvcGVydHk9ImRlcHRJZCIgICAgIGNvbHVtbj0iZGVwdF9pZCIgICAgICAvPgorCTwvcmVzdWx0TWFwPgorCisJPGRlbGV0ZSBpZD0iZGVsZXRlUm9sZURlcHRCeVJvbGVJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisJCWRlbGV0ZSBmcm9tIHN5c19yb2xlX2RlcHQgd2hlcmUgcm9sZV9pZD0je3JvbGVJZH0KKwk8L2RlbGV0ZT4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RDb3VudFJvbGVEZXB0QnlEZXB0SWQiIHJlc3VsdFR5cGU9IkludGVnZXIiPgorCSAgICBzZWxlY3QgY291bnQoMSkgZnJvbSBzeXNfcm9sZV9kZXB0IHdoZXJlIGRlcHRfaWQ9I3tkZXB0SWR9CisJPC9zZWxlY3Q+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlUm9sZURlcHQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX3JvbGVfZGVwdCB3aGVyZSByb2xlX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0icm9sZUlkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje3JvbGVJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisJCisJPGluc2VydCBpZD0iYmF0Y2hSb2xlRGVwdCI+CisJCWluc2VydCBpbnRvIHN5c19yb2xlX2RlcHQocm9sZV9pZCwgZGVwdF9pZCkgdmFsdWVzCisJCTxmb3JlYWNoIGl0ZW09Iml0ZW0iIGluZGV4PSJpbmRleCIgY29sbGVjdGlvbj0ibGlzdCIgc2VwYXJhdG9yPSIsIj4KKwkJCSgje2l0ZW0ucm9sZUlkfSwje2l0ZW0uZGVwdElkfSkKKwkJPC9mb3JlYWNoPgorCTwvaW5zZXJ0PgorCQorPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNSb2xlTWFwcGVyLnhtbCBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNSb2xlTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVkNGVlCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1JvbGVNYXBwZXIueG1sCkBAIC0wLDAgKzEsMTUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNSb2xlTWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzUm9sZSIgaWQ9IlN5c1JvbGVSZXN1bHQiPgorCQk8aWQgICAgIHByb3BlcnR5PSJyb2xlSWQiICAgICAgICAgICAgIGNvbHVtbj0icm9sZV9pZCIgICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyb2xlTmFtZSIgICAgICAgICAgIGNvbHVtbj0icm9sZV9uYW1lIiAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyb2xlS2V5IiAgICAgICAgICAgIGNvbHVtbj0icm9sZV9rZXkiICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyb2xlU29ydCIgICAgICAgICAgIGNvbHVtbj0icm9sZV9zb3J0IiAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJkYXRhU2NvcGUiICAgICAgICAgIGNvbHVtbj0iZGF0YV9zY29wZSIgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJtZW51Q2hlY2tTdHJpY3RseSIgIGNvbHVtbj0ibWVudV9jaGVja19zdHJpY3RseSIgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJkZXB0Q2hlY2tTdHJpY3RseSIgIGNvbHVtbj0iZGVwdF9jaGVja19zdHJpY3RseSIgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgICAgICAgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJkZWxGbGFnIiAgICAgICAgICAgIGNvbHVtbj0iZGVsX2ZsYWciICAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVCeSIgICAgICAgICAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgICAgICAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgICAgICAgIGNvbHVtbj0idXBkYXRlX2J5IiAgICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVUaW1lIiAgICAgICAgIGNvbHVtbj0idXBkYXRlX3RpbWUiICAgICAgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyZW1hcmsiICAgICAgICAgICAgIGNvbHVtbj0icmVtYXJrIiAgICAgICAgICAgICAgICAvPgorCTwvcmVzdWx0TWFwPgorCQorCTxzcWwgaWQ9InNlbGVjdFJvbGVWbyI+CisJICAgIHNlbGVjdCBkaXN0aW5jdCByLnJvbGVfaWQsIHIucm9sZV9uYW1lLCByLnJvbGVfa2V5LCByLnJvbGVfc29ydCwgci5kYXRhX3Njb3BlLCByLm1lbnVfY2hlY2tfc3RyaWN0bHksIHIuZGVwdF9jaGVja19zdHJpY3RseSwKKyAgICAgICAgICAgIHIuc3RhdHVzLCByLmRlbF9mbGFnLCByLmNyZWF0ZV90aW1lLCByLnJlbWFyayAKKyAgICAgICAgZnJvbSBzeXNfcm9sZSByCisJICAgICAgICBsZWZ0IGpvaW4gc3lzX3VzZXJfcm9sZSB1ciBvbiB1ci5yb2xlX2lkID0gci5yb2xlX2lkCisJICAgICAgICBsZWZ0IGpvaW4gc3lzX3VzZXIgdSBvbiB1LnVzZXJfaWQgPSB1ci51c2VyX2lkCisJICAgICAgICBsZWZ0IGpvaW4gc3lzX2RlcHQgZCBvbiB1LmRlcHRfaWQgPSBkLmRlcHRfaWQKKyAgICA8L3NxbD4KKyAgICAKKyAgICA8c2VsZWN0IGlkPSJzZWxlY3RSb2xlTGlzdCIgcGFyYW1ldGVyVHlwZT0iU3lzUm9sZSIgcmVzdWx0TWFwPSJTeXNSb2xlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFJvbGVWbyIvPgorCQl3aGVyZSByLmRlbF9mbGFnID0gJzAnCisJCTxpZiB0ZXN0PSJyb2xlSWQgIT0gbnVsbCBhbmQgcm9sZUlkICE9IDAiPgorCQkJQU5EIHIucm9sZV9pZCA9ICN7cm9sZUlkfQorCQk8L2lmPgorCQk8aWYgdGVzdD0icm9sZU5hbWUgIT0gbnVsbCBhbmQgcm9sZU5hbWUgIT0gJyciPgorCQkJQU5EIHIucm9sZV9uYW1lIGxpa2UgY29uY2F0KCclJywgI3tyb2xlTmFtZX0sICclJykKKwkJPC9pZj4KKwkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPgorCQkJQU5EIHIuc3RhdHVzID0gI3tzdGF0dXN9CisJCTwvaWY+CisJCTxpZiB0ZXN0PSJyb2xlS2V5ICE9IG51bGwgYW5kIHJvbGVLZXkgIT0gJyciPgorCQkJQU5EIHIucm9sZV9rZXkgbGlrZSBjb25jYXQoJyUnLCAje3JvbGVLZXl9LCAnJScpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJwYXJhbXMuYmVnaW5UaW1lICE9IG51bGwgYW5kIHBhcmFtcy5iZWdpblRpbWUgIT0gJyciPjwhLS0g5byA5aeL5pe26Ze05qOA57SiIC0tPgorCQkJYW5kIGRhdGVfZm9ybWF0KHIuY3JlYXRlX3RpbWUsJyVZJW0lZCcpICZndDs9IGRhdGVfZm9ybWF0KCN7cGFyYW1zLmJlZ2luVGltZX0sJyVZJW0lZCcpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJwYXJhbXMuZW5kVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuZW5kVGltZSAhPSAnJyI+PCEtLSDnu5PmnZ/ml7bpl7Tmo4DntKIgLS0+CisJCQlhbmQgZGF0ZV9mb3JtYXQoci5jcmVhdGVfdGltZSwnJVklbSVkJykgJmx0Oz0gZGF0ZV9mb3JtYXQoI3twYXJhbXMuZW5kVGltZX0sJyVZJW0lZCcpCisJCTwvaWY+CisJCTwhLS0g5pWw5o2u6IyD5Zu06L+H5rukIC0tPgorCQkke3BhcmFtcy5kYXRhU2NvcGV9CisJCW9yZGVyIGJ5IHIucm9sZV9zb3J0CisJPC9zZWxlY3Q+CisgICAgCisJPHNlbGVjdCBpZD0ic2VsZWN0Um9sZVBlcm1pc3Npb25CeVVzZXJJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNSb2xlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFJvbGVWbyIvPgorCQlXSEVSRSByLmRlbF9mbGFnID0gJzAnIGFuZCB1ci51c2VyX2lkID0gI3t1c2VySWR9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0Um9sZUFsbCIgcmVzdWx0TWFwPSJTeXNSb2xlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFJvbGVWbyIvPgorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdFJvbGVMaXN0QnlVc2VySWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdFR5cGU9IkxvbmciPgorCQlzZWxlY3Qgci5yb2xlX2lkCisgICAgICAgIGZyb20gc3lzX3JvbGUgcgorCSAgICAgICAgbGVmdCBqb2luIHN5c191c2VyX3JvbGUgdXIgb24gdXIucm9sZV9pZCA9IHIucm9sZV9pZAorCSAgICAgICAgbGVmdCBqb2luIHN5c191c2VyIHUgb24gdS51c2VyX2lkID0gdXIudXNlcl9pZAorCSAgICB3aGVyZSB1LnVzZXJfaWQgPSAje3VzZXJJZH0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RSb2xlQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyIgcmVzdWx0TWFwPSJTeXNSb2xlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFJvbGVWbyIvPgorCQl3aGVyZSByLnJvbGVfaWQgPSAje3JvbGVJZH0KKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJzZWxlY3RSb2xlc0J5VXNlck5hbWUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyIgcmVzdWx0TWFwPSJTeXNSb2xlUmVzdWx0Ij4KKwkJPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFJvbGVWbyIvPgorCQlXSEVSRSByLmRlbF9mbGFnID0gJzAnIGFuZCB1LnVzZXJfbmFtZSA9ICN7dXNlck5hbWV9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iY2hlY2tSb2xlTmFtZVVuaXF1ZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IlN5c1JvbGVSZXN1bHQiPgorCQk8aW5jbHVkZSByZWZpZD0ic2VsZWN0Um9sZVZvIi8+CisJCSB3aGVyZSByLnJvbGVfbmFtZT0je3JvbGVOYW1lfSBhbmQgci5kZWxfZmxhZyA9ICcwJyBsaW1pdCAxCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iY2hlY2tSb2xlS2V5VW5pcXVlIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iU3lzUm9sZVJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RSb2xlVm8iLz4KKwkJIHdoZXJlIHIucm9sZV9rZXk9I3tyb2xlS2V5fSBhbmQgci5kZWxfZmxhZyA9ICcwJyBsaW1pdCAxCisJPC9zZWxlY3Q+CisJCisgCTxpbnNlcnQgaWQ9Imluc2VydFJvbGUiIHBhcmFtZXRlclR5cGU9IlN5c1JvbGUiIHVzZUdlbmVyYXRlZEtleXM9InRydWUiIGtleVByb3BlcnR5PSJyb2xlSWQiPgorIAkJaW5zZXJ0IGludG8gc3lzX3JvbGUoCisgCQkJPGlmIHRlc3Q9InJvbGVJZCAhPSBudWxsIGFuZCByb2xlSWQgIT0gMCI+cm9sZV9pZCw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyb2xlTmFtZSAhPSBudWxsIGFuZCByb2xlTmFtZSAhPSAnJyI+cm9sZV9uYW1lLDwvaWY+CisgCQkJPGlmIHRlc3Q9InJvbGVLZXkgIT0gbnVsbCBhbmQgcm9sZUtleSAhPSAnJyI+cm9sZV9rZXksPC9pZj4KKyAJCQk8aWYgdGVzdD0icm9sZVNvcnQgIT0gbnVsbCI+cm9sZV9zb3J0LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRhdGFTY29wZSAhPSBudWxsIGFuZCBkYXRhU2NvcGUgIT0gJyciPmRhdGFfc2NvcGUsPC9pZj4KKyAJCQk8aWYgdGVzdD0ibWVudUNoZWNrU3RyaWN0bHkgIT0gbnVsbCI+bWVudV9jaGVja19zdHJpY3RseSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkZXB0Q2hlY2tTdHJpY3RseSAhPSBudWxsIj5kZXB0X2NoZWNrX3N0cmljdGx5LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCBhbmQgcmVtYXJrICE9ICcnIj5yZW1hcmssPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPmNyZWF0ZV9ieSw8L2lmPgorIAkJCWNyZWF0ZV90aW1lCisgCQkpdmFsdWVzKAorIAkJCTxpZiB0ZXN0PSJyb2xlSWQgIT0gbnVsbCBhbmQgcm9sZUlkICE9IDAiPiN7cm9sZUlkfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyb2xlTmFtZSAhPSBudWxsIGFuZCByb2xlTmFtZSAhPSAnJyI+I3tyb2xlTmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icm9sZUtleSAhPSBudWxsIGFuZCByb2xlS2V5ICE9ICcnIj4je3JvbGVLZXl9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJvbGVTb3J0ICE9IG51bGwiPiN7cm9sZVNvcnR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImRhdGFTY29wZSAhPSBudWxsIGFuZCBkYXRhU2NvcGUgIT0gJyciPiN7ZGF0YVNjb3BlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJtZW51Q2hlY2tTdHJpY3RseSAhPSBudWxsIj4je21lbnVDaGVja1N0cmljdGx5fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJkZXB0Q2hlY2tTdHJpY3RseSAhPSBudWxsIj4je2RlcHRDaGVja1N0cmljdGx5fSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4je3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwgYW5kIHJlbWFyayAhPSAnJyI+I3tyZW1hcmt9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImNyZWF0ZUJ5ICE9IG51bGwgYW5kIGNyZWF0ZUJ5ICE9ICcnIj4je2NyZWF0ZUJ5fSw8L2lmPgorIAkJCXN5c2RhdGUoKQorIAkJKQorCTwvaW5zZXJ0PgorCQorCTx1cGRhdGUgaWQ9InVwZGF0ZVJvbGUiIHBhcmFtZXRlclR5cGU9IlN5c1JvbGUiPgorIAkJdXBkYXRlIHN5c19yb2xlCisgCQk8c2V0PgorIAkJCTxpZiB0ZXN0PSJyb2xlTmFtZSAhPSBudWxsIGFuZCByb2xlTmFtZSAhPSAnJyI+cm9sZV9uYW1lID0gI3tyb2xlTmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icm9sZUtleSAhPSBudWxsIGFuZCByb2xlS2V5ICE9ICcnIj5yb2xlX2tleSA9ICN7cm9sZUtleX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icm9sZVNvcnQgIT0gbnVsbCI+cm9sZV9zb3J0ID0gI3tyb2xlU29ydH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGF0YVNjb3BlICE9IG51bGwgYW5kIGRhdGFTY29wZSAhPSAnJyI+ZGF0YV9zY29wZSA9ICN7ZGF0YVNjb3BlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJtZW51Q2hlY2tTdHJpY3RseSAhPSBudWxsIj5tZW51X2NoZWNrX3N0cmljdGx5ID0gI3ttZW51Q2hlY2tTdHJpY3RseX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGVwdENoZWNrU3RyaWN0bHkgIT0gbnVsbCI+ZGVwdF9jaGVja19zdHJpY3RseSA9ICN7ZGVwdENoZWNrU3RyaWN0bHl9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyA9ICN7c3RhdHVzfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJyZW1hcmsgIT0gbnVsbCI+cmVtYXJrID0gI3tyZW1hcmt9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InVwZGF0ZUJ5ICE9IG51bGwgYW5kIHVwZGF0ZUJ5ICE9ICcnIj51cGRhdGVfYnkgPSAje3VwZGF0ZUJ5fSw8L2lmPgorIAkJCXVwZGF0ZV90aW1lID0gc3lzZGF0ZSgpCisgCQk8L3NldD4KKyAJCXdoZXJlIHJvbGVfaWQgPSAje3JvbGVJZH0KKwk8L3VwZGF0ZT4KKwkKKwk8ZGVsZXRlIGlkPSJkZWxldGVSb2xlQnlJZCIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQl1cGRhdGUgc3lzX3JvbGUgc2V0IGRlbF9mbGFnID0gJzInIHdoZXJlIHJvbGVfaWQgPSAje3JvbGVJZH0KKyAJPC9kZWxldGU+CisgCQorIAk8ZGVsZXRlIGlkPSJkZWxldGVSb2xlQnlJZHMiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkgICAgdXBkYXRlIHN5c19yb2xlIHNldCBkZWxfZmxhZyA9ICcyJyB3aGVyZSByb2xlX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0icm9sZUlkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje3JvbGVJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisgCQorPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNSb2xlTWVudU1hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzUm9sZU1lbnVNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjBhODUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzUm9sZU1lbnVNYXBwZXIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c1JvbGVNZW51TWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzUm9sZU1lbnUiIGlkPSJTeXNSb2xlTWVudVJlc3VsdCI+CisJCTxyZXN1bHQgcHJvcGVydHk9InJvbGVJZCIgICAgIGNvbHVtbj0icm9sZV9pZCIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJtZW51SWQiICAgICBjb2x1bW49Im1lbnVfaWQiICAgICAgLz4KKwk8L3Jlc3VsdE1hcD4KKwkKKwk8c2VsZWN0IGlkPSJjaGVja01lbnVFeGlzdFJvbGUiIHJlc3VsdFR5cGU9IkludGVnZXIiPgorCSAgICBzZWxlY3QgY291bnQoMSkgZnJvbSBzeXNfcm9sZV9tZW51IHdoZXJlIG1lbnVfaWQgPSAje21lbnVJZH0KKwk8L3NlbGVjdD4KKworCTxkZWxldGUgaWQ9ImRlbGV0ZVJvbGVNZW51QnlSb2xlSWQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorCQlkZWxldGUgZnJvbSBzeXNfcm9sZV9tZW51IHdoZXJlIHJvbGVfaWQ9I3tyb2xlSWR9CisJPC9kZWxldGU+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlUm9sZU1lbnUiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX3JvbGVfbWVudSB3aGVyZSByb2xlX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0icm9sZUlkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje3JvbGVJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisJCisJPGluc2VydCBpZD0iYmF0Y2hSb2xlTWVudSI+CisJCWluc2VydCBpbnRvIHN5c19yb2xlX21lbnUocm9sZV9pZCwgbWVudV9pZCkgdmFsdWVzCisJCTxmb3JlYWNoIGl0ZW09Iml0ZW0iIGluZGV4PSJpbmRleCIgY29sbGVjdGlvbj0ibGlzdCIgc2VwYXJhdG9yPSIsIj4KKwkJCSgje2l0ZW0ucm9sZUlkfSwje2l0ZW0ubWVudUlkfSkKKwkJPC9mb3JlYWNoPgorCTwvaW5zZXJ0PgorCQorPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNVc2VyTWFwcGVyLnhtbCBiL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNVc2VyTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU2Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1VzZXJNYXBwZXIueG1sCkBAIC0wLDAgKzEsMjIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNVc2VyTWFwcGVyIj4KKworICAgIDxyZXN1bHRNYXAgdHlwZT0iU3lzVXNlciIgaWQ9IlN5c1VzZXJSZXN1bHQiPgorICAgICAgICA8aWQgICAgIHByb3BlcnR5PSJ1c2VySWQiICAgICAgIGNvbHVtbj0idXNlcl9pZCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkZXB0SWQiICAgICAgIGNvbHVtbj0iZGVwdF9pZCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1c2VyTmFtZSIgICAgIGNvbHVtbj0idXNlcl9uYW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJuaWNrTmFtZSIgICAgIGNvbHVtbj0ibmlja19uYW1lIiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJlbWFpbCIgICAgICAgIGNvbHVtbj0iZW1haWwiICAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJwaG9uZW51bWJlciIgIGNvbHVtbj0icGhvbmVudW1iZXIiICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJzZXgiICAgICAgICAgIGNvbHVtbj0ic2V4IiAgICAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJhdmF0YXIiICAgICAgIGNvbHVtbj0iYXZhdGFyIiAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJwYXNzd29yZCIgICAgIGNvbHVtbj0icGFzc3dvcmQiICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJzdGF0dXMiICAgICAgIGNvbHVtbj0ic3RhdHVzIiAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkZWxGbGFnIiAgICAgIGNvbHVtbj0iZGVsX2ZsYWciICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJsb2dpbklwIiAgICAgIGNvbHVtbj0ibG9naW5faXAiICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJsb2dpbkRhdGUiICAgIGNvbHVtbj0ibG9naW5fZGF0ZSIgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVCeSIgICAgIGNvbHVtbj0iY3JlYXRlX2J5IiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJjcmVhdGVUaW1lIiAgIGNvbHVtbj0iY3JlYXRlX3RpbWUiICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVCeSIgICAgIGNvbHVtbj0idXBkYXRlX2J5IiAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJ1cGRhdGVUaW1lIiAgIGNvbHVtbj0idXBkYXRlX3RpbWUiICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJyZW1hcmsiICAgICAgIGNvbHVtbj0icmVtYXJrIiAgICAgICAvPgorICAgICAgICA8YXNzb2NpYXRpb24gcHJvcGVydHk9ImRlcHQiICAgIGphdmFUeXBlPSJTeXNEZXB0IiAgICAgICAgIHJlc3VsdE1hcD0iZGVwdFJlc3VsdCIgLz4KKyAgICAgICAgPGNvbGxlY3Rpb24gIHByb3BlcnR5PSJyb2xlcyIgICBqYXZhVHlwZT0iamF2YS51dGlsLkxpc3QiICByZXN1bHRNYXA9IlJvbGVSZXN1bHQiIC8+CisgICAgPC9yZXN1bHRNYXA+CisJCisgICAgPHJlc3VsdE1hcCBpZD0iZGVwdFJlc3VsdCIgdHlwZT0iU3lzRGVwdCI+CisgICAgICAgIDxpZCAgICAgcHJvcGVydHk9ImRlcHRJZCIgICAgY29sdW1uPSJkZXB0X2lkIiAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icGFyZW50SWQiICBjb2x1bW49InBhcmVudF9pZCIgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkZXB0TmFtZSIgIGNvbHVtbj0iZGVwdF9uYW1lIiAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9ImFuY2VzdG9ycyIgY29sdW1uPSJhbmNlc3RvcnMiICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0ib3JkZXJOdW0iICBjb2x1bW49Im9yZGVyX251bSIgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJsZWFkZXIiICAgIGNvbHVtbj0ibGVhZGVyIiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgY29sdW1uPSJkZXB0X3N0YXR1cyIgLz4KKyAgICA8L3Jlc3VsdE1hcD4KKwkKKyAgICA8cmVzdWx0TWFwIGlkPSJSb2xlUmVzdWx0IiB0eXBlPSJTeXNSb2xlIj4KKyAgICAgICAgPGlkICAgICBwcm9wZXJ0eT0icm9sZUlkIiAgICAgICBjb2x1bW49InJvbGVfaWQiICAgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJyb2xlTmFtZSIgICAgIGNvbHVtbj0icm9sZV9uYW1lIiAgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InJvbGVLZXkiICAgICAgY29sdW1uPSJyb2xlX2tleSIgICAgICAgLz4KKyAgICAgICAgPHJlc3VsdCBwcm9wZXJ0eT0icm9sZVNvcnQiICAgICBjb2x1bW49InJvbGVfc29ydCIgICAgICAvPgorICAgICAgICA8cmVzdWx0IHByb3BlcnR5PSJkYXRhU2NvcGUiICAgIGNvbHVtbj0iZGF0YV9zY29wZSIgICAgIC8+CisgICAgICAgIDxyZXN1bHQgcHJvcGVydHk9InN0YXR1cyIgICAgICAgY29sdW1uPSJyb2xlX3N0YXR1cyIgICAgLz4KKyAgICA8L3Jlc3VsdE1hcD4KKwkKKwk8c3FsIGlkPSJzZWxlY3RVc2VyVm8iPgorICAgICAgICBzZWxlY3QgdS51c2VyX2lkLCB1LmRlcHRfaWQsIHUudXNlcl9uYW1lLCB1Lm5pY2tfbmFtZSwgdS5lbWFpbCwgdS5hdmF0YXIsIHUucGhvbmVudW1iZXIsIHUucGFzc3dvcmQsIHUuc2V4LCB1LnN0YXR1cywgdS5kZWxfZmxhZywgdS5sb2dpbl9pcCwgdS5sb2dpbl9kYXRlLCB1LmNyZWF0ZV9ieSwgdS5jcmVhdGVfdGltZSwgdS5yZW1hcmssIAorICAgICAgICBkLmRlcHRfaWQsIGQucGFyZW50X2lkLCBkLmFuY2VzdG9ycywgZC5kZXB0X25hbWUsIGQub3JkZXJfbnVtLCBkLmxlYWRlciwgZC5zdGF0dXMgYXMgZGVwdF9zdGF0dXMsCisgICAgICAgIHIucm9sZV9pZCwgci5yb2xlX25hbWUsIHIucm9sZV9rZXksIHIucm9sZV9zb3J0LCByLmRhdGFfc2NvcGUsIHIuc3RhdHVzIGFzIHJvbGVfc3RhdHVzCisgICAgICAgIGZyb20gc3lzX3VzZXIgdQorCQkgICAgbGVmdCBqb2luIHN5c19kZXB0IGQgb24gdS5kZXB0X2lkID0gZC5kZXB0X2lkCisJCSAgICBsZWZ0IGpvaW4gc3lzX3VzZXJfcm9sZSB1ciBvbiB1LnVzZXJfaWQgPSB1ci51c2VyX2lkCisJCSAgICBsZWZ0IGpvaW4gc3lzX3JvbGUgciBvbiByLnJvbGVfaWQgPSB1ci5yb2xlX2lkCisgICAgPC9zcWw+CisgICAgCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0VXNlckxpc3QiIHBhcmFtZXRlclR5cGU9IlN5c1VzZXIiIHJlc3VsdE1hcD0iU3lzVXNlclJlc3VsdCI+CisJCXNlbGVjdCB1LnVzZXJfaWQsIHUuZGVwdF9pZCwgdS5uaWNrX25hbWUsIHUudXNlcl9uYW1lLCB1LmVtYWlsLCB1LmF2YXRhciwgdS5waG9uZW51bWJlciwgdS5zZXgsIHUuc3RhdHVzLCB1LmRlbF9mbGFnLCB1LmxvZ2luX2lwLCB1LmxvZ2luX2RhdGUsIHUuY3JlYXRlX2J5LCB1LmNyZWF0ZV90aW1lLCB1LnJlbWFyaywgZC5kZXB0X25hbWUsIGQubGVhZGVyIGZyb20gc3lzX3VzZXIgdQorCQlsZWZ0IGpvaW4gc3lzX2RlcHQgZCBvbiB1LmRlcHRfaWQgPSBkLmRlcHRfaWQKKwkJd2hlcmUgdS5kZWxfZmxhZyA9ICcwJworCQk8aWYgdGVzdD0idXNlcklkICE9IG51bGwgYW5kIHVzZXJJZCAhPSAwIj4KKwkJCUFORCB1LnVzZXJfaWQgPSAje3VzZXJJZH0KKwkJPC9pZj4KKwkJPGlmIHRlc3Q9InVzZXJOYW1lICE9IG51bGwgYW5kIHVzZXJOYW1lICE9ICcnIj4KKwkJCUFORCB1LnVzZXJfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7dXNlck5hbWV9LCAnJScpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4KKwkJCUFORCB1LnN0YXR1cyA9ICN7c3RhdHVzfQorCQk8L2lmPgorCQk8aWYgdGVzdD0icGhvbmVudW1iZXIgIT0gbnVsbCBhbmQgcGhvbmVudW1iZXIgIT0gJyciPgorCQkJQU5EIHUucGhvbmVudW1iZXIgbGlrZSBjb25jYXQoJyUnLCAje3Bob25lbnVtYmVyfSwgJyUnKQorCQk8L2lmPgorCQk8aWYgdGVzdD0icGFyYW1zLmJlZ2luVGltZSAhPSBudWxsIGFuZCBwYXJhbXMuYmVnaW5UaW1lICE9ICcnIj48IS0tIOW8gOWni+aXtumXtOajgOe0oiAtLT4KKwkJCUFORCBkYXRlX2Zvcm1hdCh1LmNyZWF0ZV90aW1lLCclWSVtJWQnKSAmZ3Q7PSBkYXRlX2Zvcm1hdCgje3BhcmFtcy5iZWdpblRpbWV9LCclWSVtJWQnKQorCQk8L2lmPgorCQk8aWYgdGVzdD0icGFyYW1zLmVuZFRpbWUgIT0gbnVsbCBhbmQgcGFyYW1zLmVuZFRpbWUgIT0gJyciPjwhLS0g57uT5p2f5pe26Ze05qOA57SiIC0tPgorCQkJQU5EIGRhdGVfZm9ybWF0KHUuY3JlYXRlX3RpbWUsJyVZJW0lZCcpICZsdDs9IGRhdGVfZm9ybWF0KCN7cGFyYW1zLmVuZFRpbWV9LCclWSVtJWQnKQorCQk8L2lmPgorCQk8aWYgdGVzdD0iZGVwdElkICE9IG51bGwgYW5kIGRlcHRJZCAhPSAwIj4KKwkJCUFORCAodS5kZXB0X2lkID0gI3tkZXB0SWR9IE9SIHUuZGVwdF9pZCBJTiAoIFNFTEVDVCB0LmRlcHRfaWQgRlJPTSBzeXNfZGVwdCB0IFdIRVJFIGZpbmRfaW5fc2V0KCN7ZGVwdElkfSwgYW5jZXN0b3JzKSApKQorCQk8L2lmPgorCQk8IS0tIOaVsOaNruiMg+WbtOi/h+a7pCAtLT4KKwkJJHtwYXJhbXMuZGF0YVNjb3BlfQorCTwvc2VsZWN0PgorCQorCTxzZWxlY3QgaWQ9InNlbGVjdEFsbG9jYXRlZExpc3QiIHBhcmFtZXRlclR5cGU9IlN5c1VzZXIiIHJlc3VsdE1hcD0iU3lzVXNlclJlc3VsdCI+CisJICAgIHNlbGVjdCBkaXN0aW5jdCB1LnVzZXJfaWQsIHUuZGVwdF9pZCwgdS51c2VyX25hbWUsIHUubmlja19uYW1lLCB1LmVtYWlsLCB1LnBob25lbnVtYmVyLCB1LnN0YXR1cywgdS5jcmVhdGVfdGltZQorCSAgICBmcm9tIHN5c191c2VyIHUKKwkJCSBsZWZ0IGpvaW4gc3lzX2RlcHQgZCBvbiB1LmRlcHRfaWQgPSBkLmRlcHRfaWQKKwkJCSBsZWZ0IGpvaW4gc3lzX3VzZXJfcm9sZSB1ciBvbiB1LnVzZXJfaWQgPSB1ci51c2VyX2lkCisJCQkgbGVmdCBqb2luIHN5c19yb2xlIHIgb24gci5yb2xlX2lkID0gdXIucm9sZV9pZAorCSAgICB3aGVyZSB1LmRlbF9mbGFnID0gJzAnIGFuZCByLnJvbGVfaWQgPSAje3JvbGVJZH0KKwkgICAgPGlmIHRlc3Q9InVzZXJOYW1lICE9IG51bGwgYW5kIHVzZXJOYW1lICE9ICcnIj4KKwkJCUFORCB1LnVzZXJfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7dXNlck5hbWV9LCAnJScpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJwaG9uZW51bWJlciAhPSBudWxsIGFuZCBwaG9uZW51bWJlciAhPSAnJyI+CisJCQlBTkQgdS5waG9uZW51bWJlciBsaWtlIGNvbmNhdCgnJScsICN7cGhvbmVudW1iZXJ9LCAnJScpCisJCTwvaWY+CisJCTwhLS0g5pWw5o2u6IyD5Zu06L+H5rukIC0tPgorCQkke3BhcmFtcy5kYXRhU2NvcGV9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0VW5hbGxvY2F0ZWRMaXN0IiBwYXJhbWV0ZXJUeXBlPSJTeXNVc2VyIiByZXN1bHRNYXA9IlN5c1VzZXJSZXN1bHQiPgorCSAgICBzZWxlY3QgZGlzdGluY3QgdS51c2VyX2lkLCB1LmRlcHRfaWQsIHUudXNlcl9uYW1lLCB1Lm5pY2tfbmFtZSwgdS5lbWFpbCwgdS5waG9uZW51bWJlciwgdS5zdGF0dXMsIHUuY3JlYXRlX3RpbWUKKwkgICAgZnJvbSBzeXNfdXNlciB1CisJCQkgbGVmdCBqb2luIHN5c19kZXB0IGQgb24gdS5kZXB0X2lkID0gZC5kZXB0X2lkCisJCQkgbGVmdCBqb2luIHN5c191c2VyX3JvbGUgdXIgb24gdS51c2VyX2lkID0gdXIudXNlcl9pZAorCQkJIGxlZnQgam9pbiBzeXNfcm9sZSByIG9uIHIucm9sZV9pZCA9IHVyLnJvbGVfaWQKKwkgICAgd2hlcmUgdS5kZWxfZmxhZyA9ICcwJyBhbmQgKHIucm9sZV9pZCAhPSAje3JvbGVJZH0gb3Igci5yb2xlX2lkIElTIE5VTEwpCisJICAgIGFuZCB1LnVzZXJfaWQgbm90IGluIChzZWxlY3QgdS51c2VyX2lkIGZyb20gc3lzX3VzZXIgdSBpbm5lciBqb2luIHN5c191c2VyX3JvbGUgdXIgb24gdS51c2VyX2lkID0gdXIudXNlcl9pZCBhbmQgdXIucm9sZV9pZCA9ICN7cm9sZUlkfSkKKwkgICAgPGlmIHRlc3Q9InVzZXJOYW1lICE9IG51bGwgYW5kIHVzZXJOYW1lICE9ICcnIj4KKwkJCUFORCB1LnVzZXJfbmFtZSBsaWtlIGNvbmNhdCgnJScsICN7dXNlck5hbWV9LCAnJScpCisJCTwvaWY+CisJCTxpZiB0ZXN0PSJwaG9uZW51bWJlciAhPSBudWxsIGFuZCBwaG9uZW51bWJlciAhPSAnJyI+CisJCQlBTkQgdS5waG9uZW51bWJlciBsaWtlIGNvbmNhdCgnJScsICN7cGhvbmVudW1iZXJ9LCAnJScpCisJCTwvaWY+CisJCTwhLS0g5pWw5o2u6IyD5Zu06L+H5rukIC0tPgorCQkke3BhcmFtcy5kYXRhU2NvcGV9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0VXNlckJ5VXNlck5hbWUiIHBhcmFtZXRlclR5cGU9IlN0cmluZyIgcmVzdWx0TWFwPSJTeXNVc2VyUmVzdWx0Ij4KKwkgICAgPGluY2x1ZGUgcmVmaWQ9InNlbGVjdFVzZXJWbyIvPgorCQl3aGVyZSB1LnVzZXJfbmFtZSA9ICN7dXNlck5hbWV9IGFuZCB1LmRlbF9mbGFnID0gJzAnCisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0ic2VsZWN0VXNlckJ5SWQiIHBhcmFtZXRlclR5cGU9IkxvbmciIHJlc3VsdE1hcD0iU3lzVXNlclJlc3VsdCI+CisJCTxpbmNsdWRlIHJlZmlkPSJzZWxlY3RVc2VyVm8iLz4KKwkJd2hlcmUgdS51c2VyX2lkID0gI3t1c2VySWR9CisJPC9zZWxlY3Q+CisJCisJPHNlbGVjdCBpZD0iY2hlY2tVc2VyTmFtZVVuaXF1ZSIgcGFyYW1ldGVyVHlwZT0iU3RyaW5nIiByZXN1bHRNYXA9IlN5c1VzZXJSZXN1bHQiPgorCQlzZWxlY3QgdXNlcl9pZCwgdXNlcl9uYW1lIGZyb20gc3lzX3VzZXIgd2hlcmUgdXNlcl9uYW1lID0gI3t1c2VyTmFtZX0gYW5kIGRlbF9mbGFnID0gJzAnIGxpbWl0IDEKKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJjaGVja1Bob25lVW5pcXVlIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iU3lzVXNlclJlc3VsdCI+CisJCXNlbGVjdCB1c2VyX2lkLCBwaG9uZW51bWJlciBmcm9tIHN5c191c2VyIHdoZXJlIHBob25lbnVtYmVyID0gI3twaG9uZW51bWJlcn0gYW5kIGRlbF9mbGFnID0gJzAnIGxpbWl0IDEKKwk8L3NlbGVjdD4KKwkKKwk8c2VsZWN0IGlkPSJjaGVja0VtYWlsVW5pcXVlIiBwYXJhbWV0ZXJUeXBlPSJTdHJpbmciIHJlc3VsdE1hcD0iU3lzVXNlclJlc3VsdCI+CisJCXNlbGVjdCB1c2VyX2lkLCBlbWFpbCBmcm9tIHN5c191c2VyIHdoZXJlIGVtYWlsID0gI3tlbWFpbH0gYW5kIGRlbF9mbGFnID0gJzAnIGxpbWl0IDEKKwk8L3NlbGVjdD4KKwkKKwk8aW5zZXJ0IGlkPSJpbnNlcnRVc2VyIiBwYXJhbWV0ZXJUeXBlPSJTeXNVc2VyIiB1c2VHZW5lcmF0ZWRLZXlzPSJ0cnVlIiBrZXlQcm9wZXJ0eT0idXNlcklkIj4KKyAJCWluc2VydCBpbnRvIHN5c191c2VyKAorIAkJCTxpZiB0ZXN0PSJ1c2VySWQgIT0gbnVsbCBhbmQgdXNlcklkICE9IDAiPnVzZXJfaWQsPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGVwdElkICE9IG51bGwgYW5kIGRlcHRJZCAhPSAwIj5kZXB0X2lkLDwvaWY+CisgCQkJPGlmIHRlc3Q9InVzZXJOYW1lICE9IG51bGwgYW5kIHVzZXJOYW1lICE9ICcnIj51c2VyX25hbWUsPC9pZj4KKyAJCQk8aWYgdGVzdD0ibmlja05hbWUgIT0gbnVsbCBhbmQgbmlja05hbWUgIT0gJyciPm5pY2tfbmFtZSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJlbWFpbCAhPSBudWxsIGFuZCBlbWFpbCAhPSAnJyI+ZW1haWwsPC9pZj4KKyAJCQk8aWYgdGVzdD0iYXZhdGFyICE9IG51bGwgYW5kIGF2YXRhciAhPSAnJyI+YXZhdGFyLDwvaWY+CisgCQkJPGlmIHRlc3Q9InBob25lbnVtYmVyICE9IG51bGwgYW5kIHBob25lbnVtYmVyICE9ICcnIj5waG9uZW51bWJlciw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzZXggIT0gbnVsbCBhbmQgc2V4ICE9ICcnIj5zZXgsPC9pZj4KKyAJCQk8aWYgdGVzdD0icGFzc3dvcmQgIT0gbnVsbCBhbmQgcGFzc3dvcmQgIT0gJyciPnBhc3N3b3JkLDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyw8L2lmPgorIAkJCTxpZiB0ZXN0PSJjcmVhdGVCeSAhPSBudWxsIGFuZCBjcmVhdGVCeSAhPSAnJyI+Y3JlYXRlX2J5LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPnJlbWFyayw8L2lmPgorIAkJCWNyZWF0ZV90aW1lCisgCQkpdmFsdWVzKAorIAkJCTxpZiB0ZXN0PSJ1c2VySWQgIT0gbnVsbCBhbmQgdXNlcklkICE9ICcnIj4je3VzZXJJZH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZGVwdElkICE9IG51bGwgYW5kIGRlcHRJZCAhPSAnJyI+I3tkZXB0SWR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InVzZXJOYW1lICE9IG51bGwgYW5kIHVzZXJOYW1lICE9ICcnIj4je3VzZXJOYW1lfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJuaWNrTmFtZSAhPSBudWxsIGFuZCBuaWNrTmFtZSAhPSAnJyI+I3tuaWNrTmFtZX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iZW1haWwgIT0gbnVsbCBhbmQgZW1haWwgIT0gJyciPiN7ZW1haWx9LDwvaWY+CisgCQkJPGlmIHRlc3Q9ImF2YXRhciAhPSBudWxsIGFuZCBhdmF0YXIgIT0gJyciPiN7YXZhdGFyfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJwaG9uZW51bWJlciAhPSBudWxsIGFuZCBwaG9uZW51bWJlciAhPSAnJyI+I3twaG9uZW51bWJlcn0sPC9pZj4KKyAJCQk8aWYgdGVzdD0ic2V4ICE9IG51bGwgYW5kIHNleCAhPSAnJyI+I3tzZXh9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBhc3N3b3JkICE9IG51bGwgYW5kIHBhc3N3b3JkICE9ICcnIj4je3Bhc3N3b3JkfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzdGF0dXMgIT0gbnVsbCBhbmQgc3RhdHVzICE9ICcnIj4je3N0YXR1c30sPC9pZj4KKyAJCQk8aWYgdGVzdD0iY3JlYXRlQnkgIT0gbnVsbCBhbmQgY3JlYXRlQnkgIT0gJyciPiN7Y3JlYXRlQnl9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InJlbWFyayAhPSBudWxsIGFuZCByZW1hcmsgIT0gJyciPiN7cmVtYXJrfSw8L2lmPgorIAkJCXN5c2RhdGUoKQorIAkJKQorCTwvaW5zZXJ0PgorCQorCTx1cGRhdGUgaWQ9InVwZGF0ZVVzZXIiIHBhcmFtZXRlclR5cGU9IlN5c1VzZXIiPgorIAkJdXBkYXRlIHN5c191c2VyCisgCQk8c2V0PgorIAkJCTxpZiB0ZXN0PSJkZXB0SWQgIT0gbnVsbCBhbmQgZGVwdElkICE9IDAiPmRlcHRfaWQgPSAje2RlcHRJZH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0idXNlck5hbWUgIT0gbnVsbCBhbmQgdXNlck5hbWUgIT0gJyciPnVzZXJfbmFtZSA9ICN7dXNlck5hbWV9LDwvaWY+CisgCQkJPGlmIHRlc3Q9Im5pY2tOYW1lICE9IG51bGwgYW5kIG5pY2tOYW1lICE9ICcnIj5uaWNrX25hbWUgPSAje25pY2tOYW1lfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJlbWFpbCAhPSBudWxsICI+ZW1haWwgPSAje2VtYWlsfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJwaG9uZW51bWJlciAhPSBudWxsICI+cGhvbmVudW1iZXIgPSAje3Bob25lbnVtYmVyfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJzZXggIT0gbnVsbCBhbmQgc2V4ICE9ICcnIj5zZXggPSAje3NleH0sPC9pZj4KKyAJCQk8aWYgdGVzdD0iYXZhdGFyICE9IG51bGwgYW5kIGF2YXRhciAhPSAnJyI+YXZhdGFyID0gI3thdmF0YXJ9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InBhc3N3b3JkICE9IG51bGwgYW5kIHBhc3N3b3JkICE9ICcnIj5wYXNzd29yZCA9ICN7cGFzc3dvcmR9LDwvaWY+CisgCQkJPGlmIHRlc3Q9InN0YXR1cyAhPSBudWxsIGFuZCBzdGF0dXMgIT0gJyciPnN0YXR1cyA9ICN7c3RhdHVzfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJsb2dpbklwICE9IG51bGwgYW5kIGxvZ2luSXAgIT0gJyciPmxvZ2luX2lwID0gI3tsb2dpbklwfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJsb2dpbkRhdGUgIT0gbnVsbCI+bG9naW5fZGF0ZSA9ICN7bG9naW5EYXRlfSw8L2lmPgorIAkJCTxpZiB0ZXN0PSJ1cGRhdGVCeSAhPSBudWxsIGFuZCB1cGRhdGVCeSAhPSAnJyI+dXBkYXRlX2J5ID0gI3t1cGRhdGVCeX0sPC9pZj4KKyAJCQk8aWYgdGVzdD0icmVtYXJrICE9IG51bGwiPnJlbWFyayA9ICN7cmVtYXJrfSw8L2lmPgorIAkJCXVwZGF0ZV90aW1lID0gc3lzZGF0ZSgpCisgCQk8L3NldD4KKyAJCXdoZXJlIHVzZXJfaWQgPSAje3VzZXJJZH0KKwk8L3VwZGF0ZT4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVVc2VyU3RhdHVzIiBwYXJhbWV0ZXJUeXBlPSJTeXNVc2VyIj4KKyAJCXVwZGF0ZSBzeXNfdXNlciBzZXQgc3RhdHVzID0gI3tzdGF0dXN9IHdoZXJlIHVzZXJfaWQgPSAje3VzZXJJZH0KKwk8L3VwZGF0ZT4KKwkKKwk8dXBkYXRlIGlkPSJ1cGRhdGVVc2VyQXZhdGFyIiBwYXJhbWV0ZXJUeXBlPSJTeXNVc2VyIj4KKyAJCXVwZGF0ZSBzeXNfdXNlciBzZXQgYXZhdGFyID0gI3thdmF0YXJ9IHdoZXJlIHVzZXJfbmFtZSA9ICN7dXNlck5hbWV9CisJPC91cGRhdGU+CisJCisJPHVwZGF0ZSBpZD0icmVzZXRVc2VyUHdkIiBwYXJhbWV0ZXJUeXBlPSJTeXNVc2VyIj4KKyAJCXVwZGF0ZSBzeXNfdXNlciBzZXQgcGFzc3dvcmQgPSAje3Bhc3N3b3JkfSB3aGVyZSB1c2VyX25hbWUgPSAje3VzZXJOYW1lfQorCTwvdXBkYXRlPgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZVVzZXJCeUlkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKyAJCXVwZGF0ZSBzeXNfdXNlciBzZXQgZGVsX2ZsYWcgPSAnMicgd2hlcmUgdXNlcl9pZCA9ICN7dXNlcklkfQorIAk8L2RlbGV0ZT4KKyAJCisgCTxkZWxldGUgaWQ9ImRlbGV0ZVVzZXJCeUlkcyIgcGFyYW1ldGVyVHlwZT0iTG9uZyI+CisgCQl1cGRhdGUgc3lzX3VzZXIgc2V0IGRlbF9mbGFnID0gJzInIHdoZXJlIHVzZXJfaWQgaW4KKyAJCTxmb3JlYWNoIGNvbGxlY3Rpb249ImFycmF5IiBpdGVtPSJ1c2VySWQiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorIAkJCSN7dXNlcklkfQorICAgICAgICA8L2ZvcmVhY2g+IAorIAk8L2RlbGV0ZT4KKwkKKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzVXNlclBvc3RNYXBwZXIueG1sIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1VzZXJQb3N0TWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjkwYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvcnVveWktc3lzdGVtL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvc3lzdGVtL1N5c1VzZXJQb3N0TWFwcGVyLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBtYXBwZXIKK1BVQkxJQyAiLS8vbXliYXRpcy5vcmcvL0RURCBNYXBwZXIgMy4wLy9FTiIKKyJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20ucnVveWkuc3lzdGVtLm1hcHBlci5TeXNVc2VyUG9zdE1hcHBlciI+CisKKwk8cmVzdWx0TWFwIHR5cGU9IlN5c1VzZXJQb3N0IiBpZD0iU3lzVXNlclBvc3RSZXN1bHQiPgorCQk8cmVzdWx0IHByb3BlcnR5PSJ1c2VySWQiICAgICBjb2x1bW49InVzZXJfaWQiICAgICAgLz4KKwkJPHJlc3VsdCBwcm9wZXJ0eT0icG9zdElkIiAgICAgY29sdW1uPSJwb3N0X2lkIiAgICAgIC8+CisJPC9yZXN1bHRNYXA+CisKKwk8ZGVsZXRlIGlkPSJkZWxldGVVc2VyUG9zdEJ5VXNlcklkIiBwYXJhbWV0ZXJUeXBlPSJMb25nIj4KKwkJZGVsZXRlIGZyb20gc3lzX3VzZXJfcG9zdCB3aGVyZSB1c2VyX2lkPSN7dXNlcklkfQorCTwvZGVsZXRlPgorCQorCTxzZWxlY3QgaWQ9ImNvdW50VXNlclBvc3RCeUlkIiByZXN1bHRUeXBlPSJJbnRlZ2VyIj4KKwkgICAgc2VsZWN0IGNvdW50KDEpIGZyb20gc3lzX3VzZXJfcG9zdCB3aGVyZSBwb3N0X2lkPSN7cG9zdElkfSAgCisJPC9zZWxlY3Q+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlVXNlclBvc3QiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX3VzZXJfcG9zdCB3aGVyZSB1c2VyX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0idXNlcklkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje3VzZXJJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisJCisJPGluc2VydCBpZD0iYmF0Y2hVc2VyUG9zdCI+CisJCWluc2VydCBpbnRvIHN5c191c2VyX3Bvc3QodXNlcl9pZCwgcG9zdF9pZCkgdmFsdWVzCisJCTxmb3JlYWNoIGl0ZW09Iml0ZW0iIGluZGV4PSJpbmRleCIgY29sbGVjdGlvbj0ibGlzdCIgc2VwYXJhdG9yPSIsIj4KKwkJCSgje2l0ZW0udXNlcklkfSwje2l0ZW0ucG9zdElkfSkKKwkJPC9mb3JlYWNoPgorCTwvaW5zZXJ0PgorCQorPC9tYXBwZXI+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3J1b3lpLXN5c3RlbS9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL3N5c3RlbS9TeXNVc2VyUm9sZU1hcHBlci54bWwgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzVXNlclJvbGVNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzI2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW95aS1zeXN0ZW0vc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9zeXN0ZW0vU3lzVXNlclJvbGVNYXBwZXIueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIG1hcHBlcgorUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorImh0dHA6Ly9teWJhdGlzLm9yZy9kdGQvbXliYXRpcy0zLW1hcHBlci5kdGQiPgorPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5ydW95aS5zeXN0ZW0ubWFwcGVyLlN5c1VzZXJSb2xlTWFwcGVyIj4KKworCTxyZXN1bHRNYXAgdHlwZT0iU3lzVXNlclJvbGUiIGlkPSJTeXNVc2VyUm9sZVJlc3VsdCI+CisJCTxyZXN1bHQgcHJvcGVydHk9InVzZXJJZCIgICAgIGNvbHVtbj0idXNlcl9pZCIgICAgICAvPgorCQk8cmVzdWx0IHByb3BlcnR5PSJyb2xlSWQiICAgICBjb2x1bW49InJvbGVfaWQiICAgICAgLz4KKwk8L3Jlc3VsdE1hcD4KKworCTxkZWxldGUgaWQ9ImRlbGV0ZVVzZXJSb2xlQnlVc2VySWQiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorCQlkZWxldGUgZnJvbSBzeXNfdXNlcl9yb2xlIHdoZXJlIHVzZXJfaWQ9I3t1c2VySWR9CisJPC9kZWxldGU+CisJCisJPHNlbGVjdCBpZD0iY291bnRVc2VyUm9sZUJ5Um9sZUlkIiByZXN1bHRUeXBlPSJJbnRlZ2VyIj4KKwkgICAgc2VsZWN0IGNvdW50KDEpIGZyb20gc3lzX3VzZXJfcm9sZSB3aGVyZSByb2xlX2lkPSN7cm9sZUlkfSAgCisJPC9zZWxlY3Q+CisJCisJPGRlbGV0ZSBpZD0iZGVsZXRlVXNlclJvbGUiIHBhcmFtZXRlclR5cGU9IkxvbmciPgorIAkJZGVsZXRlIGZyb20gc3lzX3VzZXJfcm9sZSB3aGVyZSB1c2VyX2lkIGluCisgCQk8Zm9yZWFjaCBjb2xsZWN0aW9uPSJhcnJheSIgaXRlbT0idXNlcklkIiBvcGVuPSIoIiBzZXBhcmF0b3I9IiwiIGNsb3NlPSIpIj4KKyAJCQkje3VzZXJJZH0KKyAgICAgICAgPC9mb3JlYWNoPiAKKyAJPC9kZWxldGU+CisJCisJPGluc2VydCBpZD0iYmF0Y2hVc2VyUm9sZSI+CisJCWluc2VydCBpbnRvIHN5c191c2VyX3JvbGUodXNlcl9pZCwgcm9sZV9pZCkgdmFsdWVzCisJCTxmb3JlYWNoIGl0ZW09Iml0ZW0iIGluZGV4PSJpbmRleCIgY29sbGVjdGlvbj0ibGlzdCIgc2VwYXJhdG9yPSIsIj4KKwkJCSgje2l0ZW0udXNlcklkfSwje2l0ZW0ucm9sZUlkfSkKKwkJPC9mb3JlYWNoPgorCTwvaW5zZXJ0PgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZVVzZXJSb2xlSW5mbyIgcGFyYW1ldGVyVHlwZT0iU3lzVXNlclJvbGUiPgorCQlkZWxldGUgZnJvbSBzeXNfdXNlcl9yb2xlIHdoZXJlIHVzZXJfaWQ9I3t1c2VySWR9IGFuZCByb2xlX2lkPSN7cm9sZUlkfQorCTwvZGVsZXRlPgorCQorCTxkZWxldGUgaWQ9ImRlbGV0ZVVzZXJSb2xlSW5mb3MiPgorCSAgICBkZWxldGUgZnJvbSBzeXNfdXNlcl9yb2xlIHdoZXJlIHJvbGVfaWQ9I3tyb2xlSWR9IGFuZCB1c2VyX2lkIGluCisgCSAgICA8Zm9yZWFjaCBjb2xsZWN0aW9uPSJ1c2VySWRzIiBpdGVtPSJ1c2VySWQiIG9wZW49IigiIHNlcGFyYXRvcj0iLCIgY2xvc2U9IikiPgorIAkgICAgICAgICN7dXNlcklkfQorICAgICAgICAgICAgPC9mb3JlYWNoPiAKKwk8L2RlbGV0ZT4KKzwvbWFwcGVyPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9yeS5iYXQgYi9yeS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZTQzNwotLS0gL2Rldi9udWxsCisrKyBiL3J5LmJhdApAQCAtMCwwICsxLDY3IEBACitAZWNobyBvZmYKKworcmVtIGphcsa9vLbEv8K8CitzZXQgQXBwTmFtZT1ydW95aS1hZG1pbi5qYXIKKworcmVtIEpWTbLOyv0KK3NldCBKVk1fT1BUUz0iLURuYW1lPSVBcHBOYW1lJSAgLUR1c2VyLnRpbWV6b25lPUFzaWEvU2hhbmdoYWkgLVhtczUxMm0gLVhteDEwMjRtIC1YWDpNZXRhc3BhY2VTaXplPTEyOG0gLVhYOk1heE1ldGFzcGFjZVNpemU9NTEybSAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIC1YWDorUHJpbnRHQ0RhdGVTdGFtcHMgIC1YWDorUHJpbnRHQ0RldGFpbHMgLVhYOk5ld1JhdGlvPTEgLVhYOlN1cnZpdm9yUmF0aW89MzAgLVhYOitVc2VQYXJhbGxlbEdDIC1YWDorVXNlUGFyYWxsZWxPbGRHQyIKKworCitFQ0hPLgorCUVDSE8uICBbMV0gxvS2ryVBcHBOYW1lJQorCUVDSE8uICBbMl0gudix1SVBcHBOYW1lJQorCUVDSE8uICBbM10g1tjG9CVBcHBOYW1lJQorCUVDSE8uICBbNF0gxvS2r9e0zKwgJUFwcE5hbWUlCisJRUNITy4gIFs1XSDNyyCz9gorRUNITy4KKworRUNITy7H68rkyOvRodTxz+7Ev7XE0PK6xToKK3NldCAvcCBJRD0KKwlJRiAiJWlkJSI9PSIxIiBHT1RPIHN0YXJ0CisJSUYgIiVpZCUiPT0iMiIgR09UTyBzdG9wCisJSUYgIiVpZCUiPT0iMyIgR09UTyByZXN0YXJ0CisJSUYgIiVpZCUiPT0iNCIgR09UTyBzdGF0dXMKKwlJRiAiJWlkJSI9PSI1IiBFWElUCitQQVVTRQorOnN0YXJ0CisgICAgZm9yIC9mICJ1c2ViYWNrcSB0b2tlbnM9MS0yIiAlJWEgaW4gKGBqcHMgLWwgXnwgZmluZHN0ciAlQXBwTmFtZSVgKSBkbyAoCisJCXNldCBwaWQ9JSVhCisJCXNldCBpbWFnZV9uYW1lPSUlYgorCSkKKwlpZiAgZGVmaW5lZCBwaWQgKAorCQllY2hvICUlaXMgcnVubmluZworCQlQQVVTRQorCSkKKworc3RhcnQgamF2YXcgJUpWTV9PUFRTJSAtamFyICVBcHBOYW1lJQorCitlY2hvICBzdGFydGluZ6Gtoa0KK2VjaG8gIFN0YXJ0ICVBcHBOYW1lJSBzdWNjZXNzLi4uCitnb3RvOmVvZgorCityZW0guq/K/XN0b3DNqLn9anBzw/zB7rLp1dJwaWSyor3hyvi9+LPMCis6c3RvcAorCWZvciAvZiAidXNlYmFja3EgdG9rZW5zPTEtMiIgJSVhIGluIChganBzIC1sIF58IGZpbmRzdHIgJUFwcE5hbWUlYCkgZG8gKAorCQlzZXQgcGlkPSUlYQorCQlzZXQgaW1hZ2VfbmFtZT0lJWIKKwkpCisJaWYgbm90IGRlZmluZWQgcGlkIChlY2hvIHByb2Nlc3MgJUFwcE5hbWUlIGRvZXMgbm90IGV4aXN0cykgZWxzZSAoCisJCWVjaG8gcHJlcGFyZSB0byBraWxsICVpbWFnZV9uYW1lJQorCQllY2hvIHN0YXJ0IGtpbGwgJXBpZCUgLi4uCisJCXJlbSC4+b7dvfizzElEo6xraWxsvfizzAorCQl0YXNra2lsbCAvZiAvcGlkICVwaWQlCisJKQorZ290bzplb2YKKzpyZXN0YXJ0CisJY2FsbCA6c3RvcAorICAgIGNhbGwgOnN0YXJ0Citnb3RvOmVvZgorOnN0YXR1cworCWZvciAvZiAidXNlYmFja3EgdG9rZW5zPTEtMiIgJSVhIGluIChganBzIC1sIF58IGZpbmRzdHIgJUFwcE5hbWUlYCkgZG8gKAorCQlzZXQgcGlkPSUlYQorCQlzZXQgaW1hZ2VfbmFtZT0lJWIKKwkpCisJaWYgbm90IGRlZmluZWQgcGlkIChlY2hvIHByb2Nlc3MgJUFwcE5hbWUlIGlzIGRlYWQgKSBlbHNlICgKKwkJZWNobyAlaW1hZ2VfbmFtZSUgaXMgcnVubmluZworCSkKK2dvdG86ZW9mCmRpZmYgLS1naXQgYS9yeS5zaCBiL3J5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTljZjMKLS0tIC9kZXYvbnVsbAorKysgYi9yeS5zaApAQCAtMCwwICsxLDg2IEBACisjIS9iaW4vc2gKKyMgLi9yeS5zaCBzdGFydCDlkK/liqggc3RvcCDlgZzmraIgcmVzdGFydCDph43lkK8gc3RhdHVzIOeKtuaAgQorQXBwTmFtZT1ydW95aS1hZG1pbi5qYXIKKworIyBKVk3lj4LmlbAKK0pWTV9PUFRTPSItRG5hbWU9JEFwcE5hbWUgIC1EdXNlci50aW1lem9uZT1Bc2lhL1NoYW5naGFpIC1YbXM1MTJtIC1YbXgxMDI0bSAtWFg6TWV0YXNwYWNlU2l6ZT0xMjhtIC1YWDpNYXhNZXRhc3BhY2VTaXplPTUxMm0gLVhYOitIZWFwRHVtcE9uT3V0T2ZNZW1vcnlFcnJvciAtWFg6K1ByaW50R0NEYXRlU3RhbXBzICAtWFg6K1ByaW50R0NEZXRhaWxzIC1YWDpOZXdSYXRpbz0xIC1YWDpTdXJ2aXZvclJhdGlvPTMwIC1YWDorVXNlUGFyYWxsZWxHQyAtWFg6K1VzZVBhcmFsbGVsT2xkR0MiCitBUFBfSE9NRT1gcHdkYAorTE9HX1BBVEg9JEFQUF9IT01FL2xvZ3MvJEFwcE5hbWUubG9nCisKK2lmIFsgIiQxIiA9ICIiIF07Cit0aGVuCisgICAgZWNobyAtZSAiXDAzM1swOzMxbSDmnKrovpPlhaXmk43kvZzlkI0gXDAzM1swbSAgXDAzM1swOzM0bSB7c3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c30gXDAzM1swbSIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgIiRBcHBOYW1lIiA9ICIiIF07Cit0aGVuCisgICAgZWNobyAtZSAiXDAzM1swOzMxbSDmnKrovpPlhaXlupTnlKjlkI0gXDAzM1swbSIKKyAgICBleGl0IDEKK2ZpCisKK2Z1bmN0aW9uIHN0YXJ0KCkKK3sKKyAgICBQSUQ9YHBzIC1lZiB8Z3JlcCBqYXZhfGdyZXAgJEFwcE5hbWV8Z3JlcCAtdiBncmVwfGF3ayAne3ByaW50ICQyfSdgCisKKwlpZiBbIHgiJFBJRCIgIT0geCIiIF07IHRoZW4KKwkgICAgZWNobyAiJEFwcE5hbWUgaXMgcnVubmluZy4uLiIKKwllbHNlCisJCW5vaHVwIGphdmEgJEpWTV9PUFRTIC1qYXIgJEFwcE5hbWUgPiAvZGV2L251bGwgMj4mMSAmCisJCWVjaG8gIlN0YXJ0ICRBcHBOYW1lIHN1Y2Nlc3MuLi4iCisJZmkKK30KKworZnVuY3Rpb24gc3RvcCgpCit7CisgICAgZWNobyAiU3RvcCAkQXBwTmFtZSIKKworCVBJRD0iIgorCXF1ZXJ5KCl7CisJCVBJRD1gcHMgLWVmIHxncmVwIGphdmF8Z3JlcCAkQXBwTmFtZXxncmVwIC12IGdyZXB8YXdrICd7cHJpbnQgJDJ9J2AKKwl9CisKKwlxdWVyeQorCWlmIFsgeCIkUElEIiAhPSB4IiIgXTsgdGhlbgorCQlraWxsIC1URVJNICRQSUQKKwkJZWNobyAiJEFwcE5hbWUgKHBpZDokUElEKSBleGl0aW5nLi4uIgorCQl3aGlsZSBbIHgiJFBJRCIgIT0geCIiIF0KKwkJZG8KKwkJCXNsZWVwIDEKKwkJCXF1ZXJ5CisJCWRvbmUKKwkJZWNobyAiJEFwcE5hbWUgZXhpdGVkLiIKKwllbHNlCisJCWVjaG8gIiRBcHBOYW1lIGFscmVhZHkgc3RvcHBlZC4iCisJZmkKK30KKworZnVuY3Rpb24gcmVzdGFydCgpCit7CisgICAgc3RvcAorICAgIHNsZWVwIDIKKyAgICBzdGFydAorfQorCitmdW5jdGlvbiBzdGF0dXMoKQoreworICAgIFBJRD1gcHMgLWVmIHxncmVwIGphdmF8Z3JlcCAkQXBwTmFtZXxncmVwIC12IGdyZXB8d2MgLWxgCisgICAgaWYgWyAkUElEICE9IDAgXTt0aGVuCisgICAgICAgIGVjaG8gIiRBcHBOYW1lIGlzIHJ1bm5pbmcuLi4iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkQXBwTmFtZSBpcyBub3QgcnVubmluZy4uLiIKKyAgICBmaQorfQorCitjYXNlICQxIGluCisgICAgc3RhcnQpCisgICAgc3RhcnQ7OworICAgIHN0b3ApCisgICAgc3RvcDs7CisgICAgcmVzdGFydCkKKyAgICByZXN0YXJ0OzsKKyAgICBzdGF0dXMpCisgICAgc3RhdHVzOzsKKyAgICAqKQorCitlc2FjCmRpZmYgLS1naXQgYS9zcWwvbG9nTWVudS5zcWwgYi9zcWwvbG9nTWVudS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxMjYwMAotLS0gL2Rldi9udWxsCisrKyBiL3NxbC9sb2dNZW51LnNxbApAQCAtMCwwICsxLDIyIEBACistLSDoj5zljZUgU1FMCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5cnLCAnMycsICcxJywgJ2xvZycsICdzeXN0ZW0vbG9nL2luZGV4JywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ3N5c3RlbTpsb2c6bGlzdCcsICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+S7u+WKoeaXpeW/l+iPnOWNlScpOworCistLSDmjInpkq7niLboj5zljZVJRAorU0VMRUNUIEBwYXJlbnRJZCA6PSBMQVNUX0lOU0VSVF9JRCgpOworCistLSDmjInpkq4gU1FMCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5fmn6Xor6InLCBAcGFyZW50SWQsICcxJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bG9nOnF1ZXJ5JywgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5fmlrDlop4nLCBAcGFyZW50SWQsICcyJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bG9nOmFkZCcsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5fkv67mlLknLCBAcGFyZW50SWQsICczJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bG9nOmVkaXQnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5fliKDpmaQnLCBAcGFyZW50SWQsICc0JywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bG9nOnJlbW92ZScsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHml6Xlv5flr7zlh7onLCBAcGFyZW50SWQsICc1JywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bG9nOmV4cG9ydCcsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NxbC9wcm9qZWN0TWVudS5zcWwgYi9zcWwvcHJvamVjdE1lbnUuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTU0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvcHJvamVjdE1lbnUuc3FsCkBAIC0wLDAgKzEsMjIgQEAKKy0tIOiPnOWNlSBTUUwKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+mhueebricsICczJywgJzEnLCAncHJvamVjdCcsICdzeXN0ZW0vcHJvamVjdC9pbmRleCcsIDEsIDAsICdDJywgJzAnLCAnMCcsICdzeXN0ZW06cHJvamVjdDpsaXN0JywgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6aG555uu6I+c5Y2VJyk7CisKKy0tIOaMiemSrueItuiPnOWNlUlECitTRUxFQ1QgQHBhcmVudElkIDo9IExBU1RfSU5TRVJUX0lEKCk7CisKKy0tIOaMiemSriBTUUwKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+mhueebruafpeivoicsIEBwYXJlbnRJZCwgJzEnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpwcm9qZWN0OnF1ZXJ5JywgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfpobnnm67mlrDlop4nLCBAcGFyZW50SWQsICcyJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cHJvamVjdDphZGQnLCAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKworaW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn6aG555uu5L+u5pS5JywgQHBhcmVudElkLCAnMycsICAnIycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnByb2plY3Q6ZWRpdCcsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+mhueebruWIoOmZpCcsIEBwYXJlbnRJZCwgJzQnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpwcm9qZWN0OnJlbW92ZScsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfpobnnm67lr7zlh7onLCBAcGFyZW50SWQsICc1JywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cHJvamVjdDpleHBvcnQnLCAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcWwvcXVhcnR6LnNxbCBiL3NxbC9xdWFydHouc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcWwvcXVhcnR6LnNxbApAQCAtMCwwICsxLDE3NCBAQAorRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9GSVJFRF9UUklHR0VSUzsKK0RST1AgVEFCTEUgSUYgRVhJU1RTIFFSVFpfUEFVU0VEX1RSSUdHRVJfR1JQUzsKK0RST1AgVEFCTEUgSUYgRVhJU1RTIFFSVFpfU0NIRURVTEVSX1NUQVRFOworRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9MT0NLUzsKK0RST1AgVEFCTEUgSUYgRVhJU1RTIFFSVFpfU0lNUExFX1RSSUdHRVJTOworRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9TSU1QUk9QX1RSSUdHRVJTOworRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9DUk9OX1RSSUdHRVJTOworRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9CTE9CX1RSSUdHRVJTOworRFJPUCBUQUJMRSBJRiBFWElTVFMgUVJUWl9UUklHR0VSUzsKK0RST1AgVEFCTEUgSUYgRVhJU1RTIFFSVFpfSk9CX0RFVEFJTFM7CitEUk9QIFRBQkxFIElGIEVYSVNUUyBRUlRaX0NBTEVOREFSUzsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMeOAgeWtmOWCqOavj+S4gOS4quW3sumFjee9rueahCBqb2JEZXRhaWwg55qE6K+m57uG5L+h5oGvCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcmVhdGUgdGFibGUgUVJUWl9KT0JfREVUQUlMUyAoCisgICAgc2NoZWRfbmFtZSAgICAgICAgICAgdmFyY2hhcigxMjApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6LCD5bqm5ZCN56ewJywKKyAgICBqb2JfbmFtZSAgICAgICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfku7vliqHlkI3np7AnLAorICAgIGpvYl9ncm91cCAgICAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+S7u+WKoee7hOWQjScsCisgICAgZGVzY3JpcHRpb24gICAgICAgICAgdmFyY2hhcigyNTApICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn55u45YWz5LuL57uNJywKKyAgICBqb2JfY2xhc3NfbmFtZSAgICAgICB2YXJjaGFyKDI1MCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfmiafooYzku7vliqHnsbvlkI3np7AnLAorICAgIGlzX2R1cmFibGUgICAgICAgICAgIHZhcmNoYXIoMSkgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuaMgeS5heWMlicsCisgICAgaXNfbm9uY29uY3VycmVudCAgICAgdmFyY2hhcigxKSAgICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm5bm25Y+RJywKKyAgICBpc191cGRhdGVfZGF0YSAgICAgICB2YXJjaGFyKDEpICAgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfmmK/lkKbmm7TmlrDmlbDmja4nLAorICAgIHJlcXVlc3RzX3JlY292ZXJ5ICAgIHZhcmNoYXIoMSkgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuaOpeWPl+aBouWkjeaJp+ihjCcsCisgICAgam9iX2RhdGEgICAgICAgICAgICAgYmxvYiAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn5a2Y5pS+5oyB5LmF5YyWam9i5a+56LGhJywKKyAgICBwcmltYXJ5IGtleSAoc2NoZWRfbmFtZSwgam9iX25hbWUsIGpvYl9ncm91cCkKKykgZW5naW5lPWlubm9kYiBjb21tZW50ID0gJ+S7u+WKoeivpue7huS/oeaBr+ihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDLjgIEg5a2Y5YKo5bey6YWN572u55qEIFRyaWdnZXIg55qE5L+h5oGvCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcmVhdGUgdGFibGUgUVJUWl9UUklHR0VSUyAoCisgICAgc2NoZWRfbmFtZSAgICAgICAgICAgdmFyY2hhcigxMjApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6LCD5bqm5ZCN56ewJywKKyAgICB0cmlnZ2VyX25hbWUgICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfop6blj5HlmajnmoTlkI3lrZcnLAorICAgIHRyaWdnZXJfZ3JvdXAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+inpuWPkeWZqOaJgOWxnue7hOeahOWQjeWtlycsCisgICAgam9iX25hbWUgICAgICAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAncXJ0el9qb2JfZGV0YWlsc+ihqGpvYl9uYW1l55qE5aSW6ZSuJywKKyAgICBqb2JfZ3JvdXAgICAgICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICdxcnR6X2pvYl9kZXRhaWxz6KGoam9iX2dyb3Vw55qE5aSW6ZSuJywKKyAgICBkZXNjcmlwdGlvbiAgICAgICAgICB2YXJjaGFyKDI1MCkgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICfnm7jlhbPku4vnu40nLAorICAgIG5leHRfZmlyZV90aW1lICAgICAgIGJpZ2ludCgxMykgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+S4iuS4gOasoeinpuWPkeaXtumXtO+8iOavq+enku+8iScsCisgICAgcHJldl9maXJlX3RpbWUgICAgICAgYmlnaW50KDEzKSAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn5LiL5LiA5qyh6Kem5Y+R5pe26Ze077yI6buY6K6k5Li6LTHooajnpLrkuI3op6blj5HvvIknLAorICAgIHByaW9yaXR5ICAgICAgICAgICAgIGludGVnZXIgICAgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+S8mOWFiOe6pycsCisgICAgdHJpZ2dlcl9zdGF0ZSAgICAgICAgdmFyY2hhcigxNikgICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6Kem5Y+R5Zmo54q25oCBJywKKyAgICB0cmlnZ2VyX3R5cGUgICAgICAgICB2YXJjaGFyKDgpICAgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfop6blj5HlmajnmoTnsbvlnosnLAorICAgIHN0YXJ0X3RpbWUgICAgICAgICAgIGJpZ2ludCgxMykgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+W8gOWni+aXtumXtCcsCisgICAgZW5kX3RpbWUgICAgICAgICAgICAgYmlnaW50KDEzKSAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn57uT5p2f5pe26Ze0JywKKyAgICBjYWxlbmRhcl9uYW1lICAgICAgICB2YXJjaGFyKDIwMCkgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICfml6XnqIvooajlkI3np7AnLAorICAgIG1pc2ZpcmVfaW5zdHIgICAgICAgIHNtYWxsaW50KDIpICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+ihpeWBv+aJp+ihjOeahOetlueVpScsCisgICAgam9iX2RhdGEgICAgICAgICAgICAgYmxvYiAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn5a2Y5pS+5oyB5LmF5YyWam9i5a+56LGhJywKKyAgICBwcmltYXJ5IGtleSAoc2NoZWRfbmFtZSwgdHJpZ2dlcl9uYW1lLCB0cmlnZ2VyX2dyb3VwKSwKKyAgICBmb3JlaWduIGtleSAoc2NoZWRfbmFtZSwgam9iX25hbWUsIGpvYl9ncm91cCkgcmVmZXJlbmNlcyBRUlRaX0pPQl9ERVRBSUxTKHNjaGVkX25hbWUsIGpvYl9uYW1lLCBqb2JfZ3JvdXApCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfop6blj5Hlmajor6bnu4bkv6Hmga/ooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAz44CBIOWtmOWCqOeugOWNleeahCBUcmlnZ2Vy77yM5YyF5ous6YeN5aSN5qyh5pWw77yM6Ze06ZqU77yM5Lul5Y+K5bey6Kem5Y+R55qE5qyh5pWwCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjcmVhdGUgdGFibGUgUVJUWl9TSU1QTEVfVFJJR0dFUlMgKAorICAgIHNjaGVkX25hbWUgICAgICAgICAgIHZhcmNoYXIoMTIwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+iwg+W6puWQjeensCcsCisgICAgdHJpZ2dlcl9uYW1lICAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAncXJ0el90cmlnZ2Vyc+ihqHRyaWdnZXJfbmFtZeeahOWklumUricsCisgICAgdHJpZ2dlcl9ncm91cCAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAncXJ0el90cmlnZ2Vyc+ihqHRyaWdnZXJfZ3JvdXDnmoTlpJbplK4nLAorICAgIHJlcGVhdF9jb3VudCAgICAgICAgIGJpZ2ludCg3KSAgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+mHjeWkjeeahOasoeaVsOe7n+iuoScsCisgICAgcmVwZWF0X2ludGVydmFsICAgICAgYmlnaW50KDEyKSAgICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6YeN5aSN55qE6Ze06ZqU5pe26Ze0JywKKyAgICB0aW1lc190cmlnZ2VyZWQgICAgICBiaWdpbnQoMTApICAgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICflt7Lnu4/op6blj5HnmoTmrKHmlbAnLAorICAgIHByaW1hcnkga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApLAorICAgIGZvcmVpZ24ga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApIHJlZmVyZW5jZXMgUVJUWl9UUklHR0VSUyhzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfnroDljZXop6blj5HlmajnmoTkv6Hmga/ooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSA044CBIOWtmOWCqCBDcm9uIFRyaWdnZXLvvIzljIXmi6wgQ3JvbiDooajovr7lvI/lkozml7bljLrkv6Hmga8KKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCitjcmVhdGUgdGFibGUgUVJUWl9DUk9OX1RSSUdHRVJTICgKKyAgICBzY2hlZF9uYW1lICAgICAgICAgICB2YXJjaGFyKDEyMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfosIPluqblkI3np7AnLAorICAgIHRyaWdnZXJfbmFtZSAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX25hbWXnmoTlpJbplK4nLAorICAgIHRyaWdnZXJfZ3JvdXAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX2dyb3Vw55qE5aSW6ZSuJywKKyAgICBjcm9uX2V4cHJlc3Npb24gICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICdjcm9u6KGo6L6+5byPJywKKyAgICB0aW1lX3pvbmVfaWQgICAgICAgICB2YXJjaGFyKDgwKSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfml7bljLonLAorICAgIHByaW1hcnkga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApLAorICAgIGZvcmVpZ24ga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApIHJlZmVyZW5jZXMgUVJUWl9UUklHR0VSUyhzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICdDcm9u57G75Z6L55qE6Kem5Y+R5Zmo6KGoJzsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gNeOAgSBUcmlnZ2VyIOS9nOS4uiBCbG9iIOexu+Wei+WtmOWCqCjnlKjkuo4gUXVhcnR6IOeUqOaIt+eUqCBKREJDIOWIm+W7uuS7luS7rOiHquW3seWumuWItueahCBUcmlnZ2VyIOexu+Wei++8jEpvYlN0b3JlIOW5tuS4jeefpemBk+WmguS9leWtmOWCqOWunuS+i+eahOaXtuWAmSkKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCitjcmVhdGUgdGFibGUgUVJUWl9CTE9CX1RSSUdHRVJTICgKKyAgICBzY2hlZF9uYW1lICAgICAgICAgICB2YXJjaGFyKDEyMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfosIPluqblkI3np7AnLAorICAgIHRyaWdnZXJfbmFtZSAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX25hbWXnmoTlpJbplK4nLAorICAgIHRyaWdnZXJfZ3JvdXAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX2dyb3Vw55qE5aSW6ZSuJywKKyAgICBibG9iX2RhdGEgICAgICAgICAgICBibG9iICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICflrZjmlL7mjIHkuYXljJZUcmlnZ2Vy5a+56LGhJywKKyAgICBwcmltYXJ5IGtleSAoc2NoZWRfbmFtZSwgdHJpZ2dlcl9uYW1lLCB0cmlnZ2VyX2dyb3VwKSwKKyAgICBmb3JlaWduIGtleSAoc2NoZWRfbmFtZSwgdHJpZ2dlcl9uYW1lLCB0cmlnZ2VyX2dyb3VwKSByZWZlcmVuY2VzIFFSVFpfVFJJR0dFUlMoc2NoZWRfbmFtZSwgdHJpZ2dlcl9uYW1lLCB0cmlnZ2VyX2dyb3VwKQorKSBlbmdpbmU9aW5ub2RiIGNvbW1lbnQgPSAnQmxvYuexu+Wei+eahOinpuWPkeWZqOihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDbjgIEg5LulIEJsb2Ig57G75Z6L5a2Y5YKo5a2Y5pS+5pel5Y6G5L+h5oGv77yMIHF1YXJ0euWPr+mFjee9ruS4gOS4quaXpeWOhuadpeaMh+WumuS4gOS4quaXtumXtOiMg+WbtAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKK2NyZWF0ZSB0YWJsZSBRUlRaX0NBTEVOREFSUyAoCisgICAgc2NoZWRfbmFtZSAgICAgICAgICAgdmFyY2hhcigxMjApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6LCD5bqm5ZCN56ewJywKKyAgICBjYWxlbmRhcl9uYW1lICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfml6XljoblkI3np7AnLAorICAgIGNhbGVuZGFyICAgICAgICAgICAgIGJsb2IgICAgICAgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+WtmOaUvuaMgeS5heWMlmNhbGVuZGFy5a+56LGhJywKKyAgICBwcmltYXJ5IGtleSAoc2NoZWRfbmFtZSwgY2FsZW5kYXJfbmFtZSkKKykgZW5naW5lPWlubm9kYiBjb21tZW50ID0gJ+aXpeWOhuS/oeaBr+ihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDfjgIEg5a2Y5YKo5bey5pqC5YGc55qEIFRyaWdnZXIg57uE55qE5L+h5oGvCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorY3JlYXRlIHRhYmxlIFFSVFpfUEFVU0VEX1RSSUdHRVJfR1JQUyAoCisgICAgc2NoZWRfbmFtZSAgICAgICAgICAgdmFyY2hhcigxMjApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6LCD5bqm5ZCN56ewJywKKyAgICB0cmlnZ2VyX2dyb3VwICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICdxcnR6X3RyaWdnZXJz6KGodHJpZ2dlcl9ncm91cOeahOWklumUricsCisgICAgcHJpbWFyeSBrZXkgKHNjaGVkX25hbWUsIHRyaWdnZXJfZ3JvdXApCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfmmoLlgZznmoTop6blj5HlmajooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSA444CBIOWtmOWCqOS4juW3suinpuWPkeeahCBUcmlnZ2VyIOebuOWFs+eahOeKtuaAgeS/oeaBr++8jOS7peWPiuebuOiBlCBKb2Ig55qE5omn6KGM5L+h5oGvCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorY3JlYXRlIHRhYmxlIFFSVFpfRklSRURfVFJJR0dFUlMgKAorICAgIHNjaGVkX25hbWUgICAgICAgICAgIHZhcmNoYXIoMTIwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+iwg+W6puWQjeensCcsCisgICAgZW50cnlfaWQgICAgICAgICAgICAgdmFyY2hhcig5NSkgICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn6LCD5bqm5Zmo5a6e5L6LaWQnLAorICAgIHRyaWdnZXJfbmFtZSAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX25hbWXnmoTlpJbplK4nLAorICAgIHRyaWdnZXJfZ3JvdXAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ3FydHpfdHJpZ2dlcnPooah0cmlnZ2VyX2dyb3Vw55qE5aSW6ZSuJywKKyAgICBpbnN0YW5jZV9uYW1lICAgICAgICB2YXJjaGFyKDIwMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfosIPluqblmajlrp7kvovlkI0nLAorICAgIGZpcmVkX3RpbWUgICAgICAgICAgIGJpZ2ludCgxMykgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+inpuWPkeeahOaXtumXtCcsCisgICAgc2NoZWRfdGltZSAgICAgICAgICAgYmlnaW50KDEzKSAgICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn5a6a5pe25Zmo5Yi25a6a55qE5pe26Ze0JywKKyAgICBwcmlvcml0eSAgICAgICAgICAgICBpbnRlZ2VyICAgICAgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfkvJjlhYjnuqcnLAorICAgIHN0YXRlICAgICAgICAgICAgICAgIHZhcmNoYXIoMTYpICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+eKtuaAgScsCisgICAgam9iX25hbWUgICAgICAgICAgICAgdmFyY2hhcigyMDApICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn5Lu75Yqh5ZCN56ewJywKKyAgICBqb2JfZ3JvdXAgICAgICAgICAgICB2YXJjaGFyKDIwMCkgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICfku7vliqHnu4TlkI0nLAorICAgIGlzX25vbmNvbmN1cnJlbnQgICAgIHZhcmNoYXIoMSkgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuW5tuWPkScsCisgICAgcmVxdWVzdHNfcmVjb3ZlcnkgICAgdmFyY2hhcigxKSAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm5o6l5Y+X5oGi5aSN5omn6KGMJywKKyAgICBwcmltYXJ5IGtleSAoc2NoZWRfbmFtZSwgZW50cnlfaWQpCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICflt7Lop6blj5HnmoTop6blj5HlmajooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSA544CBIOWtmOWCqOWwkemHj+eahOacieWFsyBTY2hlZHVsZXIg55qE54q25oCB5L+h5oGv77yM5YGH5aaC5piv55So5LqO6ZuG576k5Lit77yM5Y+v5Lul55yL5Yiw5YW25LuW55qEIFNjaGVkdWxlciDlrp7kvosKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCitjcmVhdGUgdGFibGUgUVJUWl9TQ0hFRFVMRVJfU1RBVEUgKAorICAgIHNjaGVkX25hbWUgICAgICAgICAgIHZhcmNoYXIoMTIwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+iwg+W6puWQjeensCcsCisgICAgaW5zdGFuY2VfbmFtZSAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAn5a6e5L6L5ZCN56ewJywKKyAgICBsYXN0X2NoZWNraW5fdGltZSAgICBiaWdpbnQoMTMpICAgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfkuIrmrKHmo4Dmn6Xml7bpl7QnLAorICAgIGNoZWNraW5faW50ZXJ2YWwgICAgIGJpZ2ludCgxMykgICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+ajgOafpemXtOmalOaXtumXtCcsCisgICAgcHJpbWFyeSBrZXkgKHNjaGVkX25hbWUsIGluc3RhbmNlX25hbWUpCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfosIPluqblmajnirbmgIHooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAxMOOAgSDlrZjlgqjnqIvluo/nmoTmgrLop4LplIHnmoTkv6Hmga8o5YGH5aaC5L2/55So5LqG5oKy6KeC6ZSBKQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKK2NyZWF0ZSB0YWJsZSBRUlRaX0xPQ0tTICgKKyAgICBzY2hlZF9uYW1lICAgICAgICAgICB2YXJjaGFyKDEyMCkgICAgbm90IG51bGwgICAgICAgICAgICBjb21tZW50ICfosIPluqblkI3np7AnLAorICAgIGxvY2tfbmFtZSAgICAgICAgICAgIHZhcmNoYXIoNDApICAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+aCsuingumUgeWQjeensCcsCisgICAgcHJpbWFyeSBrZXkgKHNjaGVkX25hbWUsIGxvY2tfbmFtZSkKKykgZW5naW5lPWlubm9kYiBjb21tZW50ID0gJ+WtmOWCqOeahOaCsuingumUgeS/oeaBr+ihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDEx44CBIFF1YXJ0eumbhue+pOWunueOsOWQjOatpeacuuWItueahOihjOmUgeihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKK2NyZWF0ZSB0YWJsZSBRUlRaX1NJTVBST1BfVFJJR0dFUlMgKAorICAgIHNjaGVkX25hbWUgICAgICAgICAgIHZhcmNoYXIoMTIwKSAgICBub3QgbnVsbCAgICAgICAgICAgIGNvbW1lbnQgJ+iwg+W6puWQjeensCcsCisgICAgdHJpZ2dlcl9uYW1lICAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAncXJ0el90cmlnZ2Vyc+ihqHRyaWdnZXJfbmFtZeeahOWklumUricsCisgICAgdHJpZ2dlcl9ncm91cCAgICAgICAgdmFyY2hhcigyMDApICAgIG5vdCBudWxsICAgICAgICAgICAgY29tbWVudCAncXJ0el90cmlnZ2Vyc+ihqHRyaWdnZXJfZ3JvdXDnmoTlpJbplK4nLAorICAgIHN0cl9wcm9wXzEgICAgICAgICAgIHZhcmNoYXIoNTEyKSAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ1N0cmluZ+exu+Wei+eahHRyaWdnZXLnmoTnrKzkuIDkuKrlj4LmlbAnLAorICAgIHN0cl9wcm9wXzIgICAgICAgICAgIHZhcmNoYXIoNTEyKSAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ1N0cmluZ+exu+Wei+eahHRyaWdnZXLnmoTnrKzkuozkuKrlj4LmlbAnLAorICAgIHN0cl9wcm9wXzMgICAgICAgICAgIHZhcmNoYXIoNTEyKSAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ1N0cmluZ+exu+Wei+eahHRyaWdnZXLnmoTnrKzkuInkuKrlj4LmlbAnLAorICAgIGludF9wcm9wXzEgICAgICAgICAgIGludCAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ2ludOexu+Wei+eahHRyaWdnZXLnmoTnrKzkuIDkuKrlj4LmlbAnLAorICAgIGludF9wcm9wXzIgICAgICAgICAgIGludCAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ2ludOexu+Wei+eahHRyaWdnZXLnmoTnrKzkuozkuKrlj4LmlbAnLAorICAgIGxvbmdfcHJvcF8xICAgICAgICAgIGJpZ2ludCAgICAgICAgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ2xvbmfnsbvlnovnmoR0cmlnZ2Vy55qE56ys5LiA5Liq5Y+C5pWwJywKKyAgICBsb25nX3Byb3BfMiAgICAgICAgICBiaWdpbnQgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICdsb25n57G75Z6L55qEdHJpZ2dlcueahOesrOS6jOS4quWPguaVsCcsCisgICAgZGVjX3Byb3BfMSAgICAgICAgICAgbnVtZXJpYygxMyw0KSAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAnZGVjaW1hbOexu+Wei+eahHRyaWdnZXLnmoTnrKzkuIDkuKrlj4LmlbAnLAorICAgIGRlY19wcm9wXzIgICAgICAgICAgIG51bWVyaWMoMTMsNCkgICBudWxsICAgICAgICAgICAgICAgIGNvbW1lbnQgJ2RlY2ltYWznsbvlnovnmoR0cmlnZ2Vy55qE56ys5LqM5Liq5Y+C5pWwJywKKyAgICBib29sX3Byb3BfMSAgICAgICAgICB2YXJjaGFyKDEpICAgICAgbnVsbCAgICAgICAgICAgICAgICBjb21tZW50ICdCb29sZWFu57G75Z6L55qEdHJpZ2dlcueahOesrOS4gOS4quWPguaVsCcsCisgICAgYm9vbF9wcm9wXzIgICAgICAgICAgdmFyY2hhcigxKSAgICAgIG51bGwgICAgICAgICAgICAgICAgY29tbWVudCAnQm9vbGVhbuexu+Wei+eahHRyaWdnZXLnmoTnrKzkuozkuKrlj4LmlbAnLAorICAgIHByaW1hcnkga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApLAorICAgIGZvcmVpZ24ga2V5IChzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApIHJlZmVyZW5jZXMgUVJUWl9UUklHR0VSUyhzY2hlZF9uYW1lLCB0cmlnZ2VyX25hbWUsIHRyaWdnZXJfZ3JvdXApCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICflkIzmraXmnLrliLbnmoTooYzplIHooagnOworCitjb21taXQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3FsL3J5X3JlYWN0LnNxbCBiL3NxbC9yeV9yZWFjdC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzOWYzMQotLS0gL2Rldi9udWxsCisrKyBiL3NxbC9yeV9yZWFjdC5zcWwKQEAgLTAsMCArMSw3MDUgQEAKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDHjgIHpg6jpl6jooagKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19kZXB0OworY3JlYXRlIHRhYmxlIHN5c19kZXB0ICgKKyAgZGVwdF9pZCAgICAgICAgICAgYmlnaW50KDIwKSAgICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgIGNvbW1lbnQgJ+mDqOmXqGlkJywKKyAgcGFyZW50X2lkICAgICAgICAgYmlnaW50KDIwKSAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eItumDqOmXqGlkJywKKyAgYW5jZXN0b3JzICAgICAgICAgdmFyY2hhcig1MCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+ellue6p+WIl+ihqCcsCisgIGRlcHRfbmFtZSAgICAgICAgIHZhcmNoYXIoMzApICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfpg6jpl6jlkI3np7AnLAorICBvcmRlcl9udW0gICAgICAgICBpbnQoNCkgICAgICAgICAgZGVmYXVsdCAwICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pi+56S66aG65bqPJywKKyAgbGVhZGVyICAgICAgICAgICAgdmFyY2hhcigyMCkgICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+i0n+i0o+S6uicsCisgIHBob25lICAgICAgICAgICAgIHZhcmNoYXIoMTEpICAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICfogZTns7vnlLXor50nLAorICBlbWFpbCAgICAgICAgICAgICB2YXJjaGFyKDUwKSAgICAgZGVmYXVsdCBudWxsICAgICAgICAgICAgICAgY29tbWVudCAn6YKu566xJywKKyAgc3RhdHVzICAgICAgICAgICAgY2hhcigxKSAgICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+mDqOmXqOeKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iScsCisgIGRlbF9mbGFnICAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICcwJyAgICAgICAgICAgICAgICBjb21tZW50ICfliKDpmaTmoIflv5fvvIgw5Luj6KGo5a2Y5ZyoIDLku6PooajliKDpmaTvvIknLAorICBjcmVhdGVfYnkgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgCSAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu65pe26Ze0JywKKyAgdXBkYXRlX2J5ICAgICAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+abtOaWsOiAhScsCisgIHVwZGF0ZV90aW1lICAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDml7bpl7QnLAorICBwcmltYXJ5IGtleSAoZGVwdF9pZCkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0yMDAgY29tbWVudCA9ICfpg6jpl6jooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt6YOo6Zeo6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnNlcnQgaW50byBzeXNfZGVwdCB2YWx1ZXMoMTAwLCAgMCwgICAnMCcsICAgICAgICAgICfoi6Xkvp3np5HmioAnLCAgIDAsICfoi6Xkvp0nLCAnMTU4ODg4ODg4ODgnLCAncnlAcXEuY29tJywgJzAnLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwpOworaW5zZXJ0IGludG8gc3lzX2RlcHQgdmFsdWVzKDEwMSwgIDEwMCwgJzAsMTAwJywgICAgICAn5rex5Zyz5oC75YWs5Y+4JywgMSwgJ+iLpeS+nScsICcxNTg4ODg4ODg4OCcsICdyeUBxcS5jb20nLCAnMCcsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCk7CitpbnNlcnQgaW50byBzeXNfZGVwdCB2YWx1ZXMoMTAyLCAgMTAwLCAnMCwxMDAnLCAgICAgICfplb/mspnliIblhazlj7gnLCAyLCAn6Iul5L6dJywgJzE1ODg4ODg4ODg4JywgJ3J5QHFxLmNvbScsICcwJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsKTsKK2luc2VydCBpbnRvIHN5c19kZXB0IHZhbHVlcygxMDMsICAxMDEsICcwLDEwMCwxMDEnLCAgJ+eglOWPkemDqOmXqCcsICAgMSwgJ+iLpeS+nScsICcxNTg4ODg4ODg4OCcsICdyeUBxcS5jb20nLCAnMCcsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCk7CitpbnNlcnQgaW50byBzeXNfZGVwdCB2YWx1ZXMoMTA0LCAgMTAxLCAnMCwxMDAsMTAxJywgICfluILlnLrpg6jpl6gnLCAgIDIsICfoi6Xkvp0nLCAnMTU4ODg4ODg4ODgnLCAncnlAcXEuY29tJywgJzAnLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwpOworaW5zZXJ0IGludG8gc3lzX2RlcHQgdmFsdWVzKDEwNSwgIDEwMSwgJzAsMTAwLDEwMScsICAn5rWL6K+V6YOo6ZeoJywgICAzLCAn6Iul5L6dJywgJzE1ODg4ODg4ODg4JywgJ3J5QHFxLmNvbScsICcwJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsKTsKK2luc2VydCBpbnRvIHN5c19kZXB0IHZhbHVlcygxMDYsICAxMDEsICcwLDEwMCwxMDEnLCAgJ+i0ouWKoemDqOmXqCcsICAgNCwgJ+iLpeS+nScsICcxNTg4ODg4ODg4OCcsICdyeUBxcS5jb20nLCAnMCcsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCk7CitpbnNlcnQgaW50byBzeXNfZGVwdCB2YWx1ZXMoMTA3LCAgMTAxLCAnMCwxMDAsMTAxJywgICfov5Dnu7Tpg6jpl6gnLCAgIDUsICfoi6Xkvp0nLCAnMTU4ODg4ODg4ODgnLCAncnlAcXEuY29tJywgJzAnLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwpOworaW5zZXJ0IGludG8gc3lzX2RlcHQgdmFsdWVzKDEwOCwgIDEwMiwgJzAsMTAwLDEwMicsICAn5biC5Zy66YOo6ZeoJywgICAxLCAn6Iul5L6dJywgJzE1ODg4ODg4ODg4JywgJ3J5QHFxLmNvbScsICcwJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsKTsKK2luc2VydCBpbnRvIHN5c19kZXB0IHZhbHVlcygxMDksICAxMDIsICcwLDEwMCwxMDInLCAgJ+i0ouWKoemDqOmXqCcsICAgMiwgJ+iLpeS+nScsICcxNTg4ODg4ODg4OCcsICdyeUBxcS5jb20nLCAnMCcsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMuOAgeeUqOaIt+S/oeaBr+ihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX3VzZXI7CitjcmVhdGUgdGFibGUgc3lzX3VzZXIgKAorICB1c2VyX2lkICAgICAgICAgICBiaWdpbnQoMjApICAgICAgbm90IG51bGwgYXV0b19pbmNyZW1lbnQgICAgY29tbWVudCAn55So5oi3SUQnLAorICBkZXB0X2lkICAgICAgICAgICBiaWdpbnQoMjApICAgICAgZGVmYXVsdCBudWxsICAgICAgICAgICAgICAgY29tbWVudCAn6YOo6ZeoSUQnLAorICB1c2VyX25hbWUgICAgICAgICB2YXJjaGFyKDMwKSAgICAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn55So5oi36LSm5Y+3JywKKyAgbmlja19uYW1lICAgICAgICAgdmFyY2hhcigzMCkgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eUqOaIt+aYteensCcsCisgIHVzZXJfdHlwZSAgICAgICAgIHZhcmNoYXIoMikgICAgICBkZWZhdWx0ICcwMCcgICAgICAgICAgICAgICBjb21tZW50ICfnlKjmiLfnsbvlnovvvIgwMOezu+e7n+eUqOaIt++8iScsCisgIGVtYWlsICAgICAgICAgICAgIHZhcmNoYXIoNTApICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfnlKjmiLfpgq7nrrEnLAorICBwaG9uZW51bWJlciAgICAgICB2YXJjaGFyKDExKSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5omL5py65Y+356CBJywKKyAgc2V4ICAgICAgICAgICAgICAgY2hhcigxKSAgICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eUqOaIt+aAp+WIq++8iDDnlLcgMeWlsyAy5pyq55+l77yJJywKKyAgYXZhdGFyICAgICAgICAgICAgdmFyY2hhcigxMDApICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WktOWDj+WcsOWdgCcsCisgIHBhc3N3b3JkICAgICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflr4bnoIEnLAorICBzdGF0dXMgICAgICAgICAgICBjaGFyKDEpICAgICAgICAgZGVmYXVsdCAnMCcgICAgICAgICAgICAgICAgY29tbWVudCAn5biQ5Y+354q25oCB77yIMOato+W4uCAx5YGc55So77yJJywKKyAgZGVsX2ZsYWcgICAgICAgICAgY2hhcigxKSAgICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIoOmZpOagh+W/l++8iDDku6PooajlrZjlnKggMuS7o+ihqOWIoOmZpO+8iScsCisgIGxvZ2luX2lwICAgICAgICAgIHZhcmNoYXIoMTI4KSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmnIDlkI7nmbvlvZVJUCcsCisgIGxvZ2luX2RhdGUgICAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmnIDlkI7nmbvlvZXml7bpl7QnLAorICBjcmVhdGVfYnkgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICAgdmFyY2hhcig1MDApICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wkh+azqCcsCisgIHByaW1hcnkga2V5ICh1c2VyX2lkKQorKSBlbmdpbmU9aW5ub2RiIGF1dG9faW5jcmVtZW50PTEwMCBjb21tZW50ID0gJ+eUqOaIt+S/oeaBr+ihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIOWIneWni+WMli3nlKjmiLfkv6Hmga/ooajmlbDmja4KKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luc2VydCBpbnRvIHN5c191c2VyIHZhbHVlcygxLCAgMTAzLCAnYWRtaW4nLCAn6Iul5L6dJywgJzAwJywgJ3J5QDE2My5jb20nLCAnMTU4ODg4ODg4ODgnLCAnMScsICcnLCAnJDJhJDEwJDdKQjcyMHl1YlZTWnZVSTByRXFLLy5WcUdPWlRILnVsdTMzZEhPaUJFOEJ5T2hKSXJkQXUyJywgJzAnLCAnMCcsICcxMjcuMC4wLjEnLCBzeXNkYXRlKCksICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfnrqHnkIblkZgnKTsKK2luc2VydCBpbnRvIHN5c191c2VyIHZhbHVlcygyLCAgMTA1LCAncnknLCAgICAn6Iul5L6dJywgJzAwJywgJ3J5QHFxLmNvbScsICAnMTU2NjY2NjY2NjYnLCAnMScsICcnLCAnJDJhJDEwJDdKQjcyMHl1YlZTWnZVSTByRXFLLy5WcUdPWlRILnVsdTMzZEhPaUJFOEJ5T2hKSXJkQXUyJywgJzAnLCAnMCcsICcxMjcuMC4wLjEnLCBzeXNkYXRlKCksICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmtYvor5XlkZgnKTsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAz44CB5bKX5L2N5L+h5oGv6KGoCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkcm9wIHRhYmxlIGlmIGV4aXN0cyBzeXNfcG9zdDsKK2NyZWF0ZSB0YWJsZSBzeXNfcG9zdAorKAorICBwb3N0X2lkICAgICAgIGJpZ2ludCgyMCkgICAgICBub3QgbnVsbCBhdXRvX2luY3JlbWVudCAgICBjb21tZW50ICflspfkvY1JRCcsCisgIHBvc3RfY29kZSAgICAgdmFyY2hhcig2NCkgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wyl+S9jee8lueggScsCisgIHBvc3RfbmFtZSAgICAgdmFyY2hhcig1MCkgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wyl+S9jeWQjeensCcsCisgIHBvc3Rfc29ydCAgICAgaW50KDQpICAgICAgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYvuekuumhuuW6jycsCisgIHN0YXR1cyAgICAgICAgY2hhcigxKSAgICAgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iScsCisgIGNyZWF0ZV9ieSAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuiAhScsCisgIGNyZWF0ZV90aW1lICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycJCQkgICAgICAgY29tbWVudCAn5pu05paw6ICFJywKKyAgdXBkYXRlX3RpbWUgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICB2YXJjaGFyKDUwMCkgICAgZGVmYXVsdCBudWxsICAgICAgICAgICAgICAgY29tbWVudCAn5aSH5rOoJywKKyAgcHJpbWFyeSBrZXkgKHBvc3RfaWQpCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICflspfkvY3kv6Hmga/ooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt5bKX5L2N5L+h5oGv6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnNlcnQgaW50byBzeXNfcG9zdCB2YWx1ZXMoMSwgJ2NlbycsICAn6JGj5LqL6ZW/JywgICAgMSwgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfcG9zdCB2YWx1ZXMoMiwgJ3NlJywgICAn6aG555uu57uP55CGJywgIDIsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX3Bvc3QgdmFsdWVzKDMsICdocicsICAgJ+S6uuWKm+i1hOa6kCcsICAzLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19wb3N0IHZhbHVlcyg0LCAndXNlcicsICfmma7pgJrlkZjlt6UnLCAgNCwgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gNOOAgeinkuiJsuS/oeaBr+ihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX3JvbGU7CitjcmVhdGUgdGFibGUgc3lzX3JvbGUgKAorICByb2xlX2lkICAgICAgICAgICAgICBiaWdpbnQoMjApICAgICAgbm90IG51bGwgYXV0b19pbmNyZW1lbnQgICAgY29tbWVudCAn6KeS6ImySUQnLAorICByb2xlX25hbWUgICAgICAgICAgICB2YXJjaGFyKDMwKSAgICAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn6KeS6Imy5ZCN56ewJywKKyAgcm9sZV9rZXkgICAgICAgICAgICAgdmFyY2hhcigxMDApICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+inkuiJsuadg+mZkOWtl+espuS4sicsCisgIHJvbGVfc29ydCAgICAgICAgICAgIGludCg0KSAgICAgICAgICBub3QgbnVsbCAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmmL7npLrpobrluo8nLAorICBkYXRhX3Njb3BlICAgICAgICAgICBjaGFyKDEpICAgICAgICAgZGVmYXVsdCAnMScgICAgICAgICAgICAgICAgY29tbWVudCAn5pWw5o2u6IyD5Zu077yIMe+8muWFqOmDqOaVsOaNruadg+mZkCAy77ya6Ieq5a6a5pWw5o2u5p2D6ZmQIDPvvJrmnKzpg6jpl6jmlbDmja7mnYPpmZAgNO+8muacrOmDqOmXqOWPiuS7peS4i+aVsOaNruadg+mZkO+8iScsCisgIG1lbnVfY2hlY2tfc3RyaWN0bHkgIHRpbnlpbnQoMSkgICAgICBkZWZhdWx0IDEgICAgICAgICAgICAgICAgICBjb21tZW50ICfoj5zljZXmoJHpgInmi6npobnmmK/lkKblhbPogZTmmL7npLonLAorICBkZXB0X2NoZWNrX3N0cmljdGx5ICB0aW55aW50KDEpICAgICAgZGVmYXVsdCAxICAgICAgICAgICAgICAgICAgY29tbWVudCAn6YOo6Zeo5qCR6YCJ5oup6aG55piv5ZCm5YWz6IGU5pi+56S6JywKKyAgc3RhdHVzICAgICAgICAgICAgICAgY2hhcigxKSAgICAgICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+inkuiJsueKtuaAge+8iDDmraPluLggMeWBnOeUqO+8iScsCisgIGRlbF9mbGFnICAgICAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICcwJyAgICAgICAgICAgICAgICBjb21tZW50ICfliKDpmaTmoIflv5fvvIgw5Luj6KGo5a2Y5ZyoIDLku6PooajliKDpmaTvvIknLAorICBjcmVhdGVfYnkgICAgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgICAgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICAgICAgdmFyY2hhcig1MDApICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wkh+azqCcsCisgIHByaW1hcnkga2V5IChyb2xlX2lkKQorKSBlbmdpbmU9aW5ub2RiIGF1dG9faW5jcmVtZW50PTEwMCBjb21tZW50ID0gJ+inkuiJsuS/oeaBr+ihqCc7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIOWIneWni+WMli3op5LoibLkv6Hmga/ooajmlbDmja4KKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luc2VydCBpbnRvIHN5c19yb2xlIHZhbHVlcygnMScsICfotoXnuqfnrqHnkIblkZgnLCAgJ2FkbWluJywgIDEsIDEsIDEsIDEsICcwJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6LaF57qn566h55CG5ZGYJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZSB2YWx1ZXMoJzInLCAn5pmu6YCa6KeS6ImyJywgICAgJ2NvbW1vbicsIDIsIDIsIDEsIDEsICcwJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5pmu6YCa6KeS6ImyJyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gNeOAgeiPnOWNleadg+mZkOihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX21lbnU7CitjcmVhdGUgdGFibGUgc3lzX21lbnUgKAorICBtZW51X2lkICAgICAgICAgICBiaWdpbnQoMjApICAgICAgbm90IG51bGwgYXV0b19pbmNyZW1lbnQgICAgY29tbWVudCAn6I+c5Y2VSUQnLAorICBtZW51X25hbWUgICAgICAgICB2YXJjaGFyKDUwKSAgICAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn6I+c5Y2V5ZCN56ewJywKKyAgcGFyZW50X2lkICAgICAgICAgYmlnaW50KDIwKSAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eItuiPnOWNlUlEJywKKyAgb3JkZXJfbnVtICAgICAgICAgaW50KDQpICAgICAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYvuekuumhuuW6jycsCisgIHBhdGggICAgICAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfot6/nlLHlnLDlnYAnLAorICBjb21wb25lbnQgICAgICAgICB2YXJjaGFyKDI1NSkgICAgZGVmYXVsdCBudWxsICAgICAgICAgICAgICAgY29tbWVudCAn57uE5Lu26Lev5b6EJywKKyAgcXVlcnkgICAgICAgICAgICAgdmFyY2hhcigyNTUpICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+i3r+eUseWPguaVsCcsCisgIHJvdXRlX25hbWUgICAgICAgIHZhcmNoYXIoNTApICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfot6/nlLHlkI3np7AnLAorICBpc19mcmFtZSAgICAgICAgICBpbnQoMSkgICAgICAgICAgZGVmYXVsdCAxICAgICAgICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm5Li65aSW6ZO+77yIMOaYryAx5ZCm77yJJywKKyAgaXNfY2FjaGUgICAgICAgICAgaW50KDEpICAgICAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpue8k+WtmO+8iDDnvJPlrZggMeS4jee8k+WtmO+8iScsCisgIG1lbnVfdHlwZSAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfoj5zljZXnsbvlnovvvIhN55uu5b2VIEPoj5zljZUgRuaMiemSru+8iScsCisgIHZpc2libGUgICAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0IDAgICAgICAgICAgICAgICAgICBjb21tZW50ICfoj5zljZXnirbmgIHvvIgw5pi+56S6IDHpmpDol4/vvIknLAorICBzdGF0dXMgICAgICAgICAgICBjaGFyKDEpICAgICAgICAgZGVmYXVsdCAwICAgICAgICAgICAgICAgICAgY29tbWVudCAn6I+c5Y2V54q25oCB77yIMOato+W4uCAx5YGc55So77yJJywKKyAgcGVybXMgICAgICAgICAgICAgdmFyY2hhcigxMDApICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+adg+mZkOagh+ivhicsCisgIGljb24gICAgICAgICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0ICcjJyAgICAgICAgICAgICAgICBjb21tZW50ICfoj5zljZXlm77moIcnLAorICBjcmVhdGVfYnkgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICAgdmFyY2hhcig1MDApICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wkh+azqCcsCisgIHByaW1hcnkga2V5IChtZW51X2lkKQorKSBlbmdpbmU9aW5ub2RiIGF1dG9faW5jcmVtZW50PTIwMDAgY29tbWVudCA9ICfoj5zljZXmnYPpmZDooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt6I+c5Y2V5L+h5oGv6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDkuIDnuqfoj5zljZUKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMScsICfns7vnu5/nrqHnkIYnLCAnMCcsICcxJywgJ3N5c3RlbScsICAgICAgICAgICBudWxsLCAnJywgJycsIDEsIDAsICdNJywgJzAnLCAnMCcsICcnLCAnU2V0dGluZ091dGxpbmVkJywgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57O757uf566h55CG55uu5b2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzInLCAn57O757uf55uR5o6nJywgJzAnLCAnMicsICdtb25pdG9yJywgICAgICAgICAgbnVsbCwgJycsICcnLCAxLCAwLCAnTScsICcwJywgJzAnLCAnJywgJ0Rhc2hib2FyZE91dGxpbmVkJywgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfns7vnu5/nm5Hmjqfnm67lvZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMycsICfns7vnu5/lt6XlhbcnLCAnMCcsICczJywgJ3Rvb2wnLCAgICAgICAgICAgICBudWxsLCAnJywgJycsIDEsIDAsICdNJywgJzAnLCAnMCcsICcnLCAnVG9vbE91dGxpbmVkJywgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfns7vnu5/lt6Xlhbfnm67lvZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnNCcsICfoi6Xkvp3lrpjnvZEnLCAnMCcsICc0JywgJ2h0dHA6Ly9ydW95aS52aXAnLCBudWxsLCAnJywgJycsIDAsIDAsICdNJywgJzAnLCAnMCcsICcnLCAnTGlua091dGxpbmVkJywgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+iLpeS+neWumOe9keWcsOWdgCcpOworCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzUnLCAn5o6n5Yi25Y+wJywgICAnMCcsICcwJywgJ2Rhc2hib2FyZCcsICAgICAgIG51bGwsICAnJywgJycsIDEsIDAsICdNJywgJzEnLCAnMCcsICcnLCAnQXBwc3RvcmVPdXRsaW5lZCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmjqfliLblj7AnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnNicsICfkuKrkuronLCAgICAgJzAnLCAnMCcsICdhY2NvdW50JywgICAgICAgICBudWxsLCAgJycsICcnLCAxLCAwLCAnTScsICcxJywgJzAnLCAnJywgJ1Byb2ZpbGVPdXRsaW5lZCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfkuKrkuronKTsKKworLS0g5LqM57qn6I+c5Y2VCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMCcsICAn55So5oi3566h55CGJywgJzEnLCAgICcxJywgJ3VzZXInLCAgICAgICAnc3lzdGVtL3VzZXIvaW5kZXgnLCAgICAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnc3lzdGVtOnVzZXI6bGlzdCcsICAgICAgICAndXNlcicsICAgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfnlKjmiLfnrqHnkIboj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAxJywgICfop5LoibLnrqHnkIYnLCAnMScsICAgJzInLCAncm9sZScsICAgICAgICdzeXN0ZW0vcm9sZS9pbmRleCcsICAgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdzeXN0ZW06cm9sZTpsaXN0JywgICAgICAgICdwZW9wbGVzJywgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+inkuiJsueuoeeQhuiPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDInLCAgJ+iPnOWNleeuoeeQhicsICcxJywgICAnMycsICdtZW51JywgICAgICAgJ3N5c3RlbS9tZW51L2luZGV4JywgICAgICAgICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ3N5c3RlbTptZW51Omxpc3QnLCAgICAgICAgJ3RyZWUtdGFibGUnLCAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6I+c5Y2V566h55CG6I+c5Y2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMycsICAn6YOo6Zeo566h55CGJywgJzEnLCAgICc0JywgJ2RlcHQnLCAgICAgICAnc3lzdGVtL2RlcHQvaW5kZXgnLCAgICAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnc3lzdGVtOmRlcHQ6bGlzdCcsICAgICAgICAndHJlZScsICAgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfpg6jpl6jnrqHnkIboj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0JywgICflspfkvY3nrqHnkIYnLCAnMScsICAgJzUnLCAncG9zdCcsICAgICAgICdzeXN0ZW0vcG9zdC9pbmRleCcsICAgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdzeXN0ZW06cG9zdDpsaXN0JywgICAgICAgICdwb3N0JywgICAgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+Wyl+S9jeeuoeeQhuiPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDUnLCAgJ+Wtl+WFuOeuoeeQhicsICcxJywgICAnNicsICdkaWN0JywgICAgICAgJ3N5c3RlbS9kaWN0L2luZGV4JywgICAgICAgICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ3N5c3RlbTpkaWN0Omxpc3QnLCAgICAgICAgJ2RpY3QnLCAgICAgICAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5a2X5YW4566h55CG6I+c5Y2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNicsICAn5Y+C5pWw6K6+572uJywgJzEnLCAgICc3JywgJ2NvbmZpZycsICAgICAnc3lzdGVtL2NvbmZpZy9pbmRleCcsICAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnc3lzdGVtOmNvbmZpZzpsaXN0JywgICAgICAnZWRpdCcsICAgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICflj4LmlbDorr7nva7oj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA3JywgICfpgJrnn6XlhazlkYonLCAnMScsICAgJzgnLCAnbm90aWNlJywgICAgICdzeXN0ZW0vbm90aWNlL2luZGV4JywgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdzeXN0ZW06bm90aWNlOmxpc3QnLCAgICAgICdtZXNzYWdlJywgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+mAmuefpeWFrOWRiuiPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDgnLCAgJ+aXpeW/l+euoeeQhicsICcxJywgICAnOScsICdsb2cnLCAgICAgICAgJycsICAgICAgICAgICAgICAgICAgICAgICAgICcnLCAnJywgMSwgMCwgJ00nLCAnMCcsICcwJywgJycsICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZycsICAgICAgICAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5pel5b+X566h55CG6I+c5Y2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwOScsICAn5Zyo57q/55So5oi3JywgJzInLCAgICcxJywgJ29ubGluZScsICAgICAnbW9uaXRvci9vbmxpbmUvaW5kZXgnLCAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnbW9uaXRvcjpvbmxpbmU6bGlzdCcsICAgICAnb25saW5lJywgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICflnKjnur/nlKjmiLfoj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTEwJywgICflrprml7bku7vliqEnLCAnMicsICAgJzInLCAnam9iJywgICAgICAgICdtb25pdG9yL2pvYi9pbmRleCcsICAgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdtb25pdG9yOmpvYjpsaXN0JywgICAgICAgICdqb2InLCAgICAgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+WumuaXtuS7u+WKoeiPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMTEnLCAgJ+aVsOaNruebkeaOpycsICcyJywgICAnMycsICdkcnVpZCcsICAgICAgJ21vbml0b3IvZHJ1aWQvaW5kZXgnLCAgICAgICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ21vbml0b3I6ZHJ1aWQ6bGlzdCcsICAgICAgJ2RydWlkJywgICAgICAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5pWw5o2u55uR5o6n6I+c5Y2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzExMicsICAn5pyN5Yqh55uR5o6nJywgJzInLCAgICc0JywgJ3NlcnZlcicsICAgICAnbW9uaXRvci9zZXJ2ZXIvaW5kZXgnLCAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnbW9uaXRvcjpzZXJ2ZXI6bGlzdCcsICAgICAnc2VydmVyJywgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmnI3liqHnm5Hmjqfoj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTEzJywgICfnvJPlrZjnm5HmjqcnLCAnMicsICAgJzUnLCAnY2FjaGUnLCAgICAgICdtb25pdG9yL2NhY2hlL2luZGV4JywgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdtb25pdG9yOmNhY2hlOmxpc3QnLCAgICAgICdyZWRpcycsICAgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+e8k+WtmOebkeaOp+iPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMTQnLCAgJ+e8k+WtmOWIl+ihqCcsICcyJywgICAnNicsICdjYWNoZUxpc3QnLCAgJ21vbml0b3IvY2FjaGUvbGlzdCcsICAgICAgICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ21vbml0b3I6Y2FjaGU6bGlzdCcsICAgICAgJ3JlZGlzLWxpc3QnLCAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57yT5a2Y5YiX6KGo6I+c5Y2VJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzExNScsICAn6KGo5Y2V5p6E5bu6JywgJzMnLCAgICcxJywgJ2J1aWxkJywgICAgICAndG9vbC9idWlsZC9pbmRleCcsICAgICAgICAgJycsICcnLCAxLCAwLCAnQycsICcwJywgJzAnLCAndG9vbDpidWlsZDpsaXN0JywgICAgICAgICAnYnVpbGQnLCAgICAgICAgICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfooajljZXmnoTlu7roj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTE2JywgICfku6PnoIHnlJ/miJAnLCAnMycsICAgJzInLCAnZ2VuJywgICAgICAgICd0b29sL2dlbi9pbmRleCcsICAgICAgICAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICd0b29sOmdlbjpsaXN0JywgICAgICAgICAgICdjb2RlJywgICAgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+S7o+eggeeUn+aIkOiPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMTcnLCAgJ+ezu+e7n+aOpeWPoycsICczJywgICAnMycsICdzd2FnZ2VyJywgICAgJ3Rvb2wvc3dhZ2dlci9pbmRleCcsICAgICAgICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ3Rvb2w6c3dhZ2dlcjpsaXN0JywgICAgICAgJ3N3YWdnZXInLCAgICAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57O757uf5o6l5Y+j6I+c5Y2VJyk7CistLSDkuInnuqfoj5zljZUKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnNTAwJywgICfmk43kvZzml6Xlv5cnLCAnMTA4JywgJzEnLCAnb3BlcmxvZycsICAgICdtb25pdG9yL29wZXJsb2cvaW5kZXgnLCAgICAnJywgJycsIDEsIDAsICdDJywgJzAnLCAnMCcsICdtb25pdG9yOm9wZXJsb2c6bGlzdCcsICAgICdmb3JtJywgICAgICAgICAgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+aTjeS9nOaXpeW/l+iPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCc1MDEnLCAgJ+eZu+W9leaXpeW/lycsICcxMDgnLCAnMicsICdsb2dpbmluZm9yJywgJ21vbml0b3IvbG9naW5pbmZvci9pbmRleCcsICcnLCAnJywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ21vbml0b3I6bG9naW5pbmZvcjpsaXN0JywgJ2xvZ2luaW5mb3InLCAgICAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn55m75b2V5pel5b+X6I+c5Y2VJyk7CistLSDnlKjmiLfnrqHnkIbmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAwMCcsICfnlKjmiLfmn6Xor6InLCAnMTAwJywgJzEnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dXNlcjpxdWVyeScsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDAxJywgJ+eUqOaIt+aWsOWinicsICcxMDAnLCAnMicsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTp1c2VyOmFkZCcsICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMDInLCAn55So5oi35L+u5pS5JywgJzEwMCcsICczJywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnVzZXI6ZWRpdCcsICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAwMycsICfnlKjmiLfliKDpmaQnLCAnMTAwJywgJzQnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dXNlcjpyZW1vdmUnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDA0JywgJ+eUqOaIt+WvvOWHuicsICcxMDAnLCAnNScsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTp1c2VyOmV4cG9ydCcsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMDUnLCAn55So5oi35a+85YWlJywgJzEwMCcsICc2JywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnVzZXI6aW1wb3J0JywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAwNicsICfph43nva7lr4bnoIEnLCAnMTAwJywgJzcnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dXNlcjpyZXNldFB3ZCcsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworLS0g6KeS6Imy566h55CG5oyJ6ZKuCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMDcnLCAn6KeS6Imy5p+l6K+iJywgJzEwMScsICcxJywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnJvbGU6cXVlcnknLCAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAwOCcsICfop5LoibLmlrDlop4nLCAnMTAxJywgJzInLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cm9sZTphZGQnLCAgICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDA5JywgJ+inkuiJsuS/ruaUuScsICcxMDEnLCAnMycsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpyb2xlOmVkaXQnLCAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMTAnLCAn6KeS6Imy5Yig6ZmkJywgJzEwMScsICc0JywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnJvbGU6cmVtb3ZlJywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAxMScsICfop5LoibLlr7zlh7onLCAnMTAxJywgJzUnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cm9sZTpleHBvcnQnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworLS0g6I+c5Y2V566h55CG5oyJ6ZKuCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMTInLCAn6I+c5Y2V5p+l6K+iJywgJzEwMicsICcxJywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOm1lbnU6cXVlcnknLCAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAxMycsICfoj5zljZXmlrDlop4nLCAnMTAyJywgJzInLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bWVudTphZGQnLCAgICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDE0JywgJ+iPnOWNleS/ruaUuScsICcxMDInLCAnMycsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTptZW51OmVkaXQnLCAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMTUnLCAn6I+c5Y2V5Yig6ZmkJywgJzEwMicsICc0JywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOm1lbnU6cmVtb3ZlJywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKy0tIOmDqOmXqOeuoeeQhuaMiemSrgoraW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDE2JywgJ+mDqOmXqOafpeivoicsICcxMDMnLCAnMScsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpkZXB0OnF1ZXJ5JywgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMTcnLCAn6YOo6Zeo5paw5aKeJywgJzEwMycsICcyJywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOmRlcHQ6YWRkJywgICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAxOCcsICfpg6jpl6jkv67mlLknLCAnMTAzJywgJzMnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06ZGVwdDplZGl0JywgICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDE5JywgJ+mDqOmXqOWIoOmZpCcsICcxMDMnLCAnNCcsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpkZXB0OnJlbW92ZScsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDlspfkvY3nrqHnkIbmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAyMCcsICflspfkvY3mn6Xor6InLCAnMTA0JywgJzEnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cG9zdDpxdWVyeScsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDIxJywgJ+Wyl+S9jeaWsOWinicsICcxMDQnLCAnMicsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpwb3N0OmFkZCcsICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMjInLCAn5bKX5L2N5L+u5pS5JywgJzEwNCcsICczJywgICcnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnBvc3Q6ZWRpdCcsICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAyMycsICflspfkvY3liKDpmaQnLCAnMTA0JywgJzQnLCAgJycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06cG9zdDpyZW1vdmUnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDI0JywgJ+Wyl+S9jeWvvOWHuicsICcxMDQnLCAnNScsICAnJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpwb3N0OmV4cG9ydCcsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDlrZflhbjnrqHnkIbmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAyNScsICflrZflhbjmn6Xor6InLCAnMTA1JywgJzEnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06ZGljdDpxdWVyeScsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDI2JywgJ+Wtl+WFuOaWsOWinicsICcxMDUnLCAnMicsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpkaWN0OmFkZCcsICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMjcnLCAn5a2X5YW45L+u5pS5JywgJzEwNScsICczJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOmRpY3Q6ZWRpdCcsICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAyOCcsICflrZflhbjliKDpmaQnLCAnMTA1JywgJzQnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06ZGljdDpyZW1vdmUnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDI5JywgJ+Wtl+WFuOWvvOWHuicsICcxMDUnLCAnNScsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpkaWN0OmV4cG9ydCcsICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDlj4LmlbDorr7nva7mjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAzMCcsICflj4LmlbDmn6Xor6InLCAnMTA2JywgJzEnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06Y29uZmlnOnF1ZXJ5JywgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDMxJywgJ+WPguaVsOaWsOWinicsICcxMDYnLCAnMicsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpjb25maWc6YWRkJywgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMzInLCAn5Y+C5pWw5L+u5pS5JywgJzEwNicsICczJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOmNvbmZpZzplZGl0JywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAzMycsICflj4LmlbDliKDpmaQnLCAnMTA2JywgJzQnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06Y29uZmlnOnJlbW92ZScsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDM0JywgJ+WPguaVsOWvvOWHuicsICcxMDYnLCAnNScsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpjb25maWc6ZXhwb3J0JywgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDpgJrnn6XlhazlkYrmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAzNScsICflhazlkYrmn6Xor6InLCAnMTA3JywgJzEnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bm90aWNlOnF1ZXJ5JywgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDM2JywgJ+WFrOWRiuaWsOWinicsICcxMDcnLCAnMicsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTpub3RpY2U6YWRkJywgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMzcnLCAn5YWs5ZGK5L+u5pS5JywgJzEwNycsICczJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOm5vdGljZTplZGl0JywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTAzOCcsICflhazlkYrliKDpmaQnLCAnMTA3JywgJzQnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06bm90aWNlOnJlbW92ZScsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworLS0g5pON5L2c5pel5b+X5oyJ6ZKuCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwMzknLCAn5pON5L2c5p+l6K+iJywgJzUwMCcsICcxJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnbW9uaXRvcjpvcGVybG9nOnF1ZXJ5JywgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0MCcsICfmk43kvZzliKDpmaQnLCAnNTAwJywgJzInLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOm9wZXJsb2c6cmVtb3ZlJywgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDQxJywgJ+aXpeW/l+WvvOWHuicsICc1MDAnLCAnMycsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ21vbml0b3I6b3BlcmxvZzpleHBvcnQnLCAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDnmbvlvZXml6Xlv5fmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0MicsICfnmbvlvZXmn6Xor6InLCAnNTAxJywgJzEnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOmxvZ2luaW5mb3I6cXVlcnknLCAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDQzJywgJ+eZu+W9leWIoOmZpCcsICc1MDEnLCAnMicsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ21vbml0b3I6bG9naW5pbmZvcjpyZW1vdmUnLCAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNDQnLCAn5pel5b+X5a+85Ye6JywgJzUwMScsICczJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnbW9uaXRvcjpsb2dpbmluZm9yOmV4cG9ydCcsICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0NScsICfotKbmiLfop6PplIEnLCAnNTAxJywgJzQnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOmxvZ2luaW5mb3I6dW5sb2NrJywgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworLS0g5Zyo57q/55So5oi35oyJ6ZKuCitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNDYnLCAn5Zyo57q/5p+l6K+iJywgJzEwOScsICcxJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnbW9uaXRvcjpvbmxpbmU6cXVlcnknLCAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0NycsICfmibnph4/lvLrpgIAnLCAnMTA5JywgJzInLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOm9ubGluZTpiYXRjaExvZ291dCcsICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDQ4JywgJ+WNleadoeW8uumAgCcsICcxMDknLCAnMycsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ21vbml0b3I6b25saW5lOmZvcmNlTG9nb3V0JywgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CistLSDlrprml7bku7vliqHmjInpkq4KK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA0OScsICfku7vliqHmn6Xor6InLCAnMTEwJywgJzEnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOmpvYjpxdWVyeScsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDUwJywgJ+S7u+WKoeaWsOWinicsICcxMTAnLCAnMicsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ21vbml0b3I6am9iOmFkZCcsICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNTEnLCAn5Lu75Yqh5L+u5pS5JywgJzExMCcsICczJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnbW9uaXRvcjpqb2I6ZWRpdCcsICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA1MicsICfku7vliqHliKDpmaQnLCAnMTEwJywgJzQnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdtb25pdG9yOmpvYjpyZW1vdmUnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDUzJywgJ+eKtuaAgeS/ruaUuScsICcxMTAnLCAnNScsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ21vbml0b3I6am9iOmNoYW5nZVN0YXR1cycsICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNTQnLCAn5Lu75Yqh5a+85Ye6JywgJzExMCcsICc2JywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnbW9uaXRvcjpqb2I6ZXhwb3J0JywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKy0tIOS7o+eggeeUn+aIkOaMiemSrgoraW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDU1JywgJ+eUn+aIkOafpeivoicsICcxMTYnLCAnMScsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3Rvb2w6Z2VuOnF1ZXJ5JywgICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNTYnLCAn55Sf5oiQ5L+u5pS5JywgJzExNicsICcyJywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAndG9vbDpnZW46ZWRpdCcsICAgICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA1NycsICfnlJ/miJDliKDpmaQnLCAnMTE2JywgJzMnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICd0b29sOmdlbjpyZW1vdmUnLCAgICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX21lbnUgdmFsdWVzKCcxMDU4JywgJ+WvvOWFpeS7o+eggScsICcxMTYnLCAnNCcsICcjJywgJycsICcnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3Rvb2w6Z2VuOmltcG9ydCcsICAgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CitpbnNlcnQgaW50byBzeXNfbWVudSB2YWx1ZXMoJzEwNTknLCAn6aKE6KeI5Luj56CBJywgJzExNicsICc1JywgJyMnLCAnJywgJycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAndG9vbDpnZW46cHJldmlldycsICAgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19tZW51IHZhbHVlcygnMTA2MCcsICfnlJ/miJDku6PnoIEnLCAnMTE2JywgJzYnLCAnIycsICcnLCAnJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICd0b29sOmdlbjpjb2RlJywgICAgICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDbjgIHnlKjmiLflkozop5LoibLlhbPogZTooaggIOeUqOaIt04tMeinkuiJsgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX3VzZXJfcm9sZTsKK2NyZWF0ZSB0YWJsZSBzeXNfdXNlcl9yb2xlICgKKyAgdXNlcl9pZCAgIGJpZ2ludCgyMCkgbm90IG51bGwgY29tbWVudCAn55So5oi3SUQnLAorICByb2xlX2lkICAgYmlnaW50KDIwKSBub3QgbnVsbCBjb21tZW50ICfop5LoibJJRCcsCisgIHByaW1hcnkga2V5KHVzZXJfaWQsIHJvbGVfaWQpCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfnlKjmiLflkozop5LoibLlhbPogZTooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt55So5oi35ZKM6KeS6Imy5YWz6IGU6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnNlcnQgaW50byBzeXNfdXNlcl9yb2xlIHZhbHVlcyAoJzEnLCAnMScpOworaW5zZXJ0IGludG8gc3lzX3VzZXJfcm9sZSB2YWx1ZXMgKCcyJywgJzInKTsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSA344CB6KeS6Imy5ZKM6I+c5Y2V5YWz6IGU6KGoICDop5LoibIxLU7oj5zljZUKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19yb2xlX21lbnU7CitjcmVhdGUgdGFibGUgc3lzX3JvbGVfbWVudSAoCisgIHJvbGVfaWQgICBiaWdpbnQoMjApIG5vdCBudWxsIGNvbW1lbnQgJ+inkuiJsklEJywKKyAgbWVudV9pZCAgIGJpZ2ludCgyMCkgbm90IG51bGwgY29tbWVudCAn6I+c5Y2VSUQnLAorICBwcmltYXJ5IGtleShyb2xlX2lkLCBtZW51X2lkKQorKSBlbmdpbmU9aW5ub2RiIGNvbW1lbnQgPSAn6KeS6Imy5ZKM6I+c5Y2V5YWz6IGU6KGoJzsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0g5Yid5aeL5YyWLeinkuiJsuWSjOiPnOWNleWFs+iBlOihqOaVsOaNrgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcyJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMycpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzQnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDAnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDInKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDMnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDQnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDUnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDYnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDcnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDgnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDknKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTAnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTInKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTMnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTQnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTUnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTYnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMTcnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICc1MDAnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICc1MDEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDAwJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAwMScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMDInKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDAzJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAwNCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMDUnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDA2Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAwNycpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMDgnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDA5Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAxMCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMTEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDEyJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAxMycpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMTQnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDE1Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAxNicpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMTcnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDE4Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAxOScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMjAnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDIxJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAyMicpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMjMnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDI0Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAyNScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMjYnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDI3Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAyOCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMjknKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDMwJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAzMScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMzInKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDMzJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAzNCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMzUnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDM2Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTAzNycpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwMzgnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDM5Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA0MCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNDEnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDQyJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA0MycpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNDQnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDQ1Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA0NicpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNDcnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDQ4Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA0OScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNTAnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDUxJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA1MicpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNTMnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDU0Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA1NScpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNTYnKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDU3Jyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9tZW51IHZhbHVlcyAoJzInLCAnMTA1OCcpOworaW5zZXJ0IGludG8gc3lzX3JvbGVfbWVudSB2YWx1ZXMgKCcyJywgJzEwNTknKTsKK2luc2VydCBpbnRvIHN5c19yb2xlX21lbnUgdmFsdWVzICgnMicsICcxMDYwJyk7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDjjgIHop5LoibLlkozpg6jpl6jlhbPogZTooaggIOinkuiJsjEtTumDqOmXqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX3JvbGVfZGVwdDsKK2NyZWF0ZSB0YWJsZSBzeXNfcm9sZV9kZXB0ICgKKyAgcm9sZV9pZCAgIGJpZ2ludCgyMCkgbm90IG51bGwgY29tbWVudCAn6KeS6ImySUQnLAorICBkZXB0X2lkICAgYmlnaW50KDIwKSBub3QgbnVsbCBjb21tZW50ICfpg6jpl6hJRCcsCisgIHByaW1hcnkga2V5KHJvbGVfaWQsIGRlcHRfaWQpCispIGVuZ2luZT1pbm5vZGIgY29tbWVudCA9ICfop5LoibLlkozpg6jpl6jlhbPogZTooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt6KeS6Imy5ZKM6YOo6Zeo5YWz6IGU6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnNlcnQgaW50byBzeXNfcm9sZV9kZXB0IHZhbHVlcyAoJzInLCAnMTAwJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9kZXB0IHZhbHVlcyAoJzInLCAnMTAxJyk7CitpbnNlcnQgaW50byBzeXNfcm9sZV9kZXB0IHZhbHVlcyAoJzInLCAnMTA1Jyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gOeOAgeeUqOaIt+S4juWyl+S9jeWFs+iBlOihqCAg55So5oi3MS1O5bKX5L2NCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkcm9wIHRhYmxlIGlmIGV4aXN0cyBzeXNfdXNlcl9wb3N0OworY3JlYXRlIHRhYmxlIHN5c191c2VyX3Bvc3QKKygKKyAgdXNlcl9pZCAgIGJpZ2ludCgyMCkgbm90IG51bGwgY29tbWVudCAn55So5oi3SUQnLAorICBwb3N0X2lkICAgYmlnaW50KDIwKSBub3QgbnVsbCBjb21tZW50ICflspfkvY1JRCcsCisgIHByaW1hcnkga2V5ICh1c2VyX2lkLCBwb3N0X2lkKQorKSBlbmdpbmU9aW5ub2RiIGNvbW1lbnQgPSAn55So5oi35LiO5bKX5L2N5YWz6IGU6KGoJzsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0g5Yid5aeL5YyWLeeUqOaIt+S4juWyl+S9jeWFs+iBlOihqOaVsOaNrgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5zZXJ0IGludG8gc3lzX3VzZXJfcG9zdCB2YWx1ZXMgKCcxJywgJzEnKTsKK2luc2VydCBpbnRvIHN5c191c2VyX3Bvc3QgdmFsdWVzICgnMicsICcyJyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMTDjgIHmk43kvZzml6Xlv5forrDlvZUKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19vcGVyX2xvZzsKK2NyZWF0ZSB0YWJsZSBzeXNfb3Blcl9sb2cgKAorICBvcGVyX2lkICAgICAgICAgICBiaWdpbnQoMjApICAgICAgbm90IG51bGwgYXV0b19pbmNyZW1lbnQgICAgY29tbWVudCAn5pel5b+X5Li76ZSuJywKKyAgdGl0bGUgICAgICAgICAgICAgdmFyY2hhcig1MCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aooeWdl+agh+mimCcsCisgIGJ1c2luZXNzX3R5cGUgICAgIGludCgyKSAgICAgICAgICBkZWZhdWx0IDAgICAgICAgICAgICAgICAgICBjb21tZW50ICfkuJrliqHnsbvlnovvvIgw5YW25a6DIDHmlrDlop4gMuS/ruaUuSAz5Yig6Zmk77yJJywKKyAgbWV0aG9kICAgICAgICAgICAgdmFyY2hhcigyMDApICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aWueazleWQjeensCcsCisgIHJlcXVlc3RfbWV0aG9kICAgIHZhcmNoYXIoMTApICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfor7fmsYLmlrnlvI8nLAorICBvcGVyYXRvcl90eXBlICAgICBpbnQoMSkgICAgICAgICAgZGVmYXVsdCAwICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pON5L2c57G75Yir77yIMOWFtuWugyAx5ZCO5Y+w55So5oi3IDLmiYvmnLrnq6/nlKjmiLfvvIknLAorICBvcGVyX25hbWUgICAgICAgICB2YXJjaGFyKDUwKSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5pON5L2c5Lq65ZGYJywKKyAgZGVwdF9uYW1lICAgICAgICAgdmFyY2hhcig1MCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+mDqOmXqOWQjeensCcsCisgIG9wZXJfdXJsICAgICAgICAgIHZhcmNoYXIoMjU1KSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfor7fmsYJVUkwnLAorICBvcGVyX2lwICAgICAgICAgICB2YXJjaGFyKDEyOCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Li75py65Zyw5Z2AJywKKyAgb3Blcl9sb2NhdGlvbiAgICAgdmFyY2hhcigyNTUpICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aTjeS9nOWcsOeCuScsCisgIG9wZXJfcGFyYW0gICAgICAgIHZhcmNoYXIoMjAwMCkgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfor7fmsYLlj4LmlbAnLAorICBqc29uX3Jlc3VsdCAgICAgICB2YXJjaGFyKDIwMDApICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn6L+U5Zue5Y+C5pWwJywKKyAgc3RhdHVzICAgICAgICAgICAgaW50KDEpICAgICAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aTjeS9nOeKtuaAge+8iDDmraPluLggMeW8guW4uO+8iScsCisgIGVycm9yX21zZyAgICAgICAgIHZhcmNoYXIoMjAwMCkgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfplJnor6/mtojmga8nLAorICBvcGVyX3RpbWUgICAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pON5L2c5pe26Ze0JywKKyAgY29zdF90aW1lICAgICAgICAgYmlnaW50KDIwKSAgICAgIGRlZmF1bHQgMCAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+a2iOiAl+aXtumXtCcsCisgIHByaW1hcnkga2V5IChvcGVyX2lkKSwKKyAga2V5IGlkeF9zeXNfb3Blcl9sb2dfYnQgKGJ1c2luZXNzX3R5cGUpLAorICBrZXkgaWR4X3N5c19vcGVyX2xvZ19zICAoc3RhdHVzKSwKKyAga2V5IGlkeF9zeXNfb3Blcl9sb2dfb3QgKG9wZXJfdGltZSkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0xMDAgY29tbWVudCA9ICfmk43kvZzml6Xlv5forrDlvZUnOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDEx44CB5a2X5YW457G75Z6L6KGoCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkcm9wIHRhYmxlIGlmIGV4aXN0cyBzeXNfZGljdF90eXBlOworY3JlYXRlIHRhYmxlIHN5c19kaWN0X3R5cGUKKygKKyAgZGljdF9pZCAgICAgICAgICBiaWdpbnQoMjApICAgICAgbm90IG51bGwgYXV0b19pbmNyZW1lbnQgICAgY29tbWVudCAn5a2X5YW45Li76ZSuJywKKyAgZGljdF9uYW1lICAgICAgICB2YXJjaGFyKDEwMCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5a2X5YW45ZCN56ewJywKKyAgZGljdF90eXBlICAgICAgICB2YXJjaGFyKDEwMCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5a2X5YW457G75Z6LJywKKyAgc3RhdHVzICAgICAgICAgICBjaGFyKDEpICAgICAgICAgZGVmYXVsdCAnMCcgICAgICAgICAgICAgICAgY29tbWVudCAn54q25oCB77yIMOato+W4uCAx5YGc55So77yJJywKKyAgY3JlYXRlX2J5ICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu65pe26Ze0JywKKyAgdXBkYXRlX2J5ICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw6ICFJywKKyAgdXBkYXRlX3RpbWUgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICB2YXJjaGFyKDUwMCkgICAgZGVmYXVsdCBudWxsICAgICAgICAgICAgICAgY29tbWVudCAn5aSH5rOoJywKKyAgcHJpbWFyeSBrZXkgKGRpY3RfaWQpLAorICB1bmlxdWUgKGRpY3RfdHlwZSkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0xMDAgY29tbWVudCA9ICflrZflhbjnsbvlnovooagnOworCitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcygxLCAgJ+eUqOaIt+aAp+WIqycsICdzeXNfdXNlcl9zZXgnLCAgICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn55So5oi35oCn5Yir5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcygyLCAgJ+iPnOWNleeKtuaAgScsICdzeXNfc2hvd19oaWRlJywgICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6I+c5Y2V54q25oCB5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcygzLCAgJ+ezu+e7n+W8gOWFsycsICdzeXNfbm9ybWFsX2Rpc2FibGUnLCAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57O757uf5byA5YWz5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg0LCAgJ+S7u+WKoeeKtuaAgScsICdzeXNfam9iX3N0YXR1cycsICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5Lu75Yqh54q25oCB5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg1LCAgJ+S7u+WKoeWIhue7hCcsICdzeXNfam9iX2dyb3VwJywgICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5Lu75Yqh5YiG57uE5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg2LCAgJ+ezu+e7n+aYr+WQpicsICdzeXNfeWVzX25vJywgICAgICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57O757uf5piv5ZCm5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg3LCAgJ+mAmuefpeexu+WeiycsICdzeXNfbm90aWNlX3R5cGUnLCAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6YCa55+l57G75Z6L5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg4LCAgJ+mAmuefpeeKtuaAgScsICdzeXNfbm90aWNlX3N0YXR1cycsICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6YCa55+l54q25oCB5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcyg5LCAgJ+aTjeS9nOexu+WeiycsICdzeXNfb3Blcl90eXBlJywgICAgICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5pON5L2c57G75Z6L5YiX6KGoJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF90eXBlIHZhbHVlcygxMCwgJ+ezu+e7n+eKtuaAgScsICdzeXNfY29tbW9uX3N0YXR1cycsICAgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn55m75b2V54q25oCB5YiX6KGoJyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMTLjgIHlrZflhbjmlbDmja7ooagKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19kaWN0X2RhdGE7CitjcmVhdGUgdGFibGUgc3lzX2RpY3RfZGF0YQorKAorICBkaWN0X2NvZGUgICAgICAgIGJpZ2ludCgyMCkgICAgICBub3QgbnVsbCBhdXRvX2luY3JlbWVudCAgICBjb21tZW50ICflrZflhbjnvJbnoIEnLAorICBkaWN0X3NvcnQgICAgICAgIGludCg0KSAgICAgICAgICBkZWZhdWx0IDAgICAgICAgICAgICAgICAgICBjb21tZW50ICflrZflhbjmjpLluo8nLAorICBkaWN0X2xhYmVsICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflrZflhbjmoIfnrb4nLAorICBkaWN0X3ZhbHVlICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflrZflhbjplK7lgLwnLAorICBkaWN0X3R5cGUgICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflrZflhbjnsbvlnosnLAorICBjc3NfY2xhc3MgICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICfmoLflvI/lsZ7mgKfvvIjlhbbku5bmoLflvI/mianlsZXvvIknLAorICBsaXN0X2NsYXNzICAgICAgIHZhcmNoYXIoMTAwKSAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICfooajmoLzlm57mmL7moLflvI8nLAorICBpc19kZWZhdWx0ICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICdOJyAgICAgICAgICAgICAgICBjb21tZW50ICfmmK/lkKbpu5jorqTvvIhZ5pivIE7lkKbvvIknLAorICBzdGF0dXMgICAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICcwJyAgICAgICAgICAgICAgICBjb21tZW50ICfnirbmgIHvvIgw5q2j5bi4IDHlgZznlKjvvIknLAorICBjcmVhdGVfYnkgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfliJvlu7rogIUnLAorICBjcmVhdGVfdGltZSAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfliJvlu7rml7bpl7QnLAorICB1cGRhdGVfYnkgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDml7bpl7QnLAorICByZW1hcmsgICAgICAgICAgIHZhcmNoYXIoNTAwKSAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICflpIfms6gnLAorICBwcmltYXJ5IGtleSAoZGljdF9jb2RlKQorKSBlbmdpbmU9aW5ub2RiIGF1dG9faW5jcmVtZW50PTEwMCBjb21tZW50ID0gJ+Wtl+WFuOaVsOaNruihqCc7CisKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDEsICAxLCAgJ+eUtycsICAgICAgICcwJywgICAgICAgJ3N5c191c2VyX3NleCcsICAgICAgICAnJywgICAnJywgICAgICAgICdZJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5oCn5Yir55S3Jyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygyLCAgMiwgICflpbMnLCAgICAgICAnMScsICAgICAgICdzeXNfdXNlcl9zZXgnLCAgICAgICAgJycsICAgJycsICAgICAgICAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+aAp+WIq+WlsycpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMywgIDMsICAn5pyq55+lJywgICAgICcyJywgICAgICAgJ3N5c191c2VyX3NleCcsICAgICAgICAnJywgICAnJywgICAgICAgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5oCn5Yir5pyq55+lJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcyg0LCAgMSwgICfmmL7npLonLCAgICAgJzAnLCAgICAgICAnc3lzX3Nob3dfaGlkZScsICAgICAgICcnLCAgICdwcmltYXJ5JywgJ1knLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmmL7npLroj5zljZUnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDUsICAyLCAgJ+makOiXjycsICAgICAnMScsICAgICAgICdzeXNfc2hvd19oaWRlJywgICAgICAgJycsICAgJ2RhbmdlcicsICAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+makOiXj+iPnOWNlScpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoNiwgIDEsICAn5q2j5bi4JywgICAgICcwJywgICAgICAgJ3N5c19ub3JtYWxfZGlzYWJsZScsICAnJywgICAncHJpbWFyeScsICdZJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5q2j5bi454q25oCBJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcyg3LCAgMiwgICflgZznlKgnLCAgICAgJzEnLCAgICAgICAnc3lzX25vcm1hbF9kaXNhYmxlJywgICcnLCAgICdkYW5nZXInLCAgJ04nLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICflgZznlKjnirbmgIEnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDgsICAxLCAgJ+ato+W4uCcsICAgICAnMCcsICAgICAgICdzeXNfam9iX3N0YXR1cycsICAgICAgJycsICAgJ3ByaW1hcnknLCAnWScsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+ato+W4uOeKtuaAgScpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoOSwgIDIsICAn5pqC5YGcJywgICAgICcxJywgICAgICAgJ3N5c19qb2Jfc3RhdHVzJywgICAgICAnJywgICAnZGFuZ2VyJywgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5YGc55So54q25oCBJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygxMCwgMSwgICfpu5jorqQnLCAgICAgJ0RFRkFVTFQnLCAnc3lzX2pvYl9ncm91cCcsICAgICAgICcnLCAgICcnLCAgICAgICAgJ1knLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfpu5jorqTliIbnu4QnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDExLCAyLCAgJ+ezu+e7nycsICAgICAnU1lTVEVNJywgICdzeXNfam9iX2dyb3VwJywgICAgICAgJycsICAgJycsICAgICAgICAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+ezu+e7n+WIhue7hCcpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMTIsIDEsICAn5pivJywgICAgICAgJ1knLCAgICAgICAnc3lzX3llc19ubycsICAgICAgICAgICcnLCAgICdwcmltYXJ5JywgJ1knLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfns7vnu5/pu5jorqTmmK8nKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDEzLCAyLCAgJ+WQpicsICAgICAgICdOJywgICAgICAgJ3N5c195ZXNfbm8nLCAgICAgICAgICAnJywgICAnZGFuZ2VyJywgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn57O757uf6buY6K6k5ZCmJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygxNCwgMSwgICfpgJrnn6UnLCAgICAgJzEnLCAgICAgICAnc3lzX25vdGljZV90eXBlJywgICAgICcnLCAgICd3YXJuaW5nJywgJ1knLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfpgJrnn6UnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDE1LCAyLCAgJ+WFrOWRiicsICAgICAnMicsICAgICAgICdzeXNfbm90aWNlX3R5cGUnLCAgICAgJycsICAgJ3N1Y2Nlc3MnLCAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+WFrOWRiicpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMTYsIDEsICAn5q2j5bi4JywgICAgICcwJywgICAgICAgJ3N5c19ub3RpY2Vfc3RhdHVzJywgICAnJywgICAncHJpbWFyeScsICdZJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5q2j5bi454q25oCBJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygxNywgMiwgICflhbPpl60nLCAgICAgJzEnLCAgICAgICAnc3lzX25vdGljZV9zdGF0dXMnLCAgICcnLCAgICdkYW5nZXInLCAgJ04nLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICflhbPpl63nirbmgIEnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDE4LCA5OSwgJ+WFtuS7licsICAgICAnMCcsICAgICAgICdzeXNfb3Blcl90eXBlJywgICAgICAgJycsICAgJ2luZm8nLCAgICAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+WFtuS7luaTjeS9nCcpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMTksIDEsICAn5paw5aKeJywgICAgICcxJywgICAgICAgJ3N5c19vcGVyX3R5cGUnLCAgICAgICAnJywgICAnaW5mbycsICAgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5paw5aKe5pON5L2cJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygyMCwgMiwgICfkv67mlLknLCAgICAgJzInLCAgICAgICAnc3lzX29wZXJfdHlwZScsICAgICAgICcnLCAgICdpbmZvJywgICAgJ04nLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfkv67mlLnmk43kvZwnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDIxLCAzLCAgJ+WIoOmZpCcsICAgICAnMycsICAgICAgICdzeXNfb3Blcl90eXBlJywgICAgICAgJycsICAgJ2RhbmdlcicsICAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+WIoOmZpOaTjeS9nCcpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMjIsIDQsICAn5o6I5p2DJywgICAgICc0JywgICAgICAgJ3N5c19vcGVyX3R5cGUnLCAgICAgICAnJywgICAncHJpbWFyeScsICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5o6I5p2D5pON5L2cJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygyMywgNSwgICflr7zlh7onLCAgICAgJzUnLCAgICAgICAnc3lzX29wZXJfdHlwZScsICAgICAgICcnLCAgICd3YXJuaW5nJywgJ04nLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICflr7zlh7rmk43kvZwnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDI0LCA2LCAgJ+WvvOWFpScsICAgICAnNicsICAgICAgICdzeXNfb3Blcl90eXBlJywgICAgICAgJycsICAgJ3dhcm5pbmcnLCAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+WvvOWFpeaTjeS9nCcpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMjUsIDcsICAn5by66YCAJywgICAgICc3JywgICAgICAgJ3N5c19vcGVyX3R5cGUnLCAgICAgICAnJywgICAnZGFuZ2VyJywgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5by66YCA5pON5L2cJyk7CitpbnNlcnQgaW50byBzeXNfZGljdF9kYXRhIHZhbHVlcygyNiwgOCwgICfnlJ/miJDku6PnoIEnLCAnOCcsICAgICAgICdzeXNfb3Blcl90eXBlJywgICAgICAgJycsICAgJ3dhcm5pbmcnLCAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+eUn+aIkOaTjeS9nCcpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMjcsIDksICAn5riF56m65pWw5o2uJywgJzknLCAgICAgICAnc3lzX29wZXJfdHlwZScsICAgICAgICcnLCAgICdkYW5nZXInLCAgJ04nLCAnMCcsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmuIXnqbrmk43kvZwnKTsKK2luc2VydCBpbnRvIHN5c19kaWN0X2RhdGEgdmFsdWVzKDI4LCAxLCAgJ+aIkOWKnycsICAgICAnMCcsICAgICAgICdzeXNfY29tbW9uX3N0YXR1cycsICAgJycsICAgJ3ByaW1hcnknLCAnTicsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+ato+W4uOeKtuaAgScpOworaW5zZXJ0IGludG8gc3lzX2RpY3RfZGF0YSB2YWx1ZXMoMjksIDIsICAn5aSx6LSlJywgICAgICcxJywgICAgICAgJ3N5c19jb21tb25fc3RhdHVzJywgICAnJywgICAnZGFuZ2VyJywgICdOJywgJzAnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5YGc55So54q25oCBJyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMTPjgIHlj4LmlbDphY3nva7ooagKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19jb25maWc7CitjcmVhdGUgdGFibGUgc3lzX2NvbmZpZyAoCisgIGNvbmZpZ19pZCAgICAgICAgIGludCg1KSAgICAgICAgICBub3QgbnVsbCBhdXRvX2luY3JlbWVudCAgICBjb21tZW50ICflj4LmlbDkuLvplK4nLAorICBjb25maWdfbmFtZSAgICAgICB2YXJjaGFyKDEwMCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Y+C5pWw5ZCN56ewJywKKyAgY29uZmlnX2tleSAgICAgICAgdmFyY2hhcigxMDApICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WPguaVsOmUruWQjScsCisgIGNvbmZpZ192YWx1ZSAgICAgIHZhcmNoYXIoNTAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflj4LmlbDplK7lgLwnLAorICBjb25maWdfdHlwZSAgICAgICBjaGFyKDEpICAgICAgICAgZGVmYXVsdCAnTicgICAgICAgICAgICAgICAgY29tbWVudCAn57O757uf5YaF572u77yIWeaYryBO5ZCm77yJJywKKyAgY3JlYXRlX2J5ICAgICAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuiAhScsCisgIGNyZWF0ZV90aW1lICAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfliJvlu7rml7bpl7QnLAorICB1cGRhdGVfYnkgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw6ICFJywKKyAgdXBkYXRlX3RpbWUgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+abtOaWsOaXtumXtCcsCisgIHJlbWFyayAgICAgICAgICAgIHZhcmNoYXIoNTAwKSAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICflpIfms6gnLAorICBwcmltYXJ5IGtleSAoY29uZmlnX2lkKQorKSBlbmdpbmU9aW5ub2RiIGF1dG9faW5jcmVtZW50PTEwMCBjb21tZW50ID0gJ+WPguaVsOmFjee9ruihqCc7CisKK2luc2VydCBpbnRvIHN5c19jb25maWcgdmFsdWVzKDEsICfkuLvmoYbmnrbpobUt6buY6K6k55qu6IKk5qC35byP5ZCN56ewJywgICAgICdzeXMuaW5kZXguc2tpbk5hbWUnLCAgICAgICAgICAgICdza2luLWJsdWUnLCAgICAgJ1knLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6JOd6ImyIHNraW4tYmx1ZeOAgee7v+iJsiBza2luLWdyZWVu44CB57Sr6ImyIHNraW4tcHVycGxl44CB57qi6ImyIHNraW4tcmVk44CB6buE6ImyIHNraW4teWVsbG93JyApOworaW5zZXJ0IGludG8gc3lzX2NvbmZpZyB2YWx1ZXMoMiwgJ+eUqOaIt+euoeeQhi3otKblj7fliJ3lp4vlr4bnoIEnLCAgICAgICAgICdzeXMudXNlci5pbml0UGFzc3dvcmQnLCAgICAgICAgICcxMjM0NTYnLCAgICAgICAgJ1knLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5Yid5aeL5YyW5a+G56CBIDEyMzQ1NicgKTsKK2luc2VydCBpbnRvIHN5c19jb25maWcgdmFsdWVzKDMsICfkuLvmoYbmnrbpobUt5L6n6L655qCP5Li76aKYJywgICAgICAgICAgICdzeXMuaW5kZXguc2lkZVRoZW1lJywgICAgICAgICAgICd0aGVtZS1kYXJrJywgICAgJ1knLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn5rex6Imy5Li76aKYdGhlbWUtZGFya++8jOa1heiJsuS4u+mimHRoZW1lLWxpZ2h0JyApOworaW5zZXJ0IGludG8gc3lzX2NvbmZpZyB2YWx1ZXMoNCwgJ+i0puWPt+iHquWKqS3pqozor4HnoIHlvIDlhbMnLCAgICAgICAgICAgJ3N5cy5hY2NvdW50LmNhcHRjaGFFbmFibGVkJywgICAgJ3RydWUnLCAgICAgICAgICAnWScsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmmK/lkKblvIDlkK/pqozor4HnoIHlip/og73vvIh0cnVl5byA5ZCv77yMZmFsc2XlhbPpl63vvIknKTsKK2luc2VydCBpbnRvIHN5c19jb25maWcgdmFsdWVzKDUsICfotKblj7foh6rliqkt5piv5ZCm5byA5ZCv55So5oi35rOo5YaM5Yqf6IO9JywgJ3N5cy5hY2NvdW50LnJlZ2lzdGVyVXNlcicsICAgICAgJ2ZhbHNlJywgICAgICAgICAnWScsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfmmK/lkKblvIDlkK/ms6jlhoznlKjmiLflip/og73vvIh0cnVl5byA5ZCv77yMZmFsc2XlhbPpl63vvIknKTsKK2luc2VydCBpbnRvIHN5c19jb25maWcgdmFsdWVzKDYsICfnlKjmiLfnmbvlvZUt6buR5ZCN5Y2V5YiX6KGoJywgICAgICAgICAgICdzeXMubG9naW4uYmxhY2tJUExpc3QnLCAgICAgICAgICcnLCAgICAgICAgICAgICAgJ1knLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAn6K6+572u55m75b2VSVDpu5HlkI3ljZXpmZDliLbvvIzlpJrkuKrljLnphY3pobnku6U75YiG6ZqU77yM5pSv5oyB5Yy56YWN77yIKumAmumFjeOAgee9keaute+8iScpOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDE044CB57O757uf6K6/6Zeu6K6w5b2VCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkcm9wIHRhYmxlIGlmIGV4aXN0cyBzeXNfbG9naW5pbmZvcjsKK2NyZWF0ZSB0YWJsZSBzeXNfbG9naW5pbmZvciAoCisgIGluZm9faWQgICAgICAgIGJpZ2ludCgyMCkgICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgY29tbWVudCAn6K6/6ZeuSUQnLAorICB1c2VyX25hbWUgICAgICB2YXJjaGFyKDUwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eUqOaIt+i0puWPtycsCisgIGlwYWRkciAgICAgICAgIHZhcmNoYXIoMTI4KSAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgY29tbWVudCAn55m75b2VSVDlnLDlnYAnLAorICBsb2dpbl9sb2NhdGlvbiB2YXJjaGFyKDI1NSkgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eZu+W9leWcsOeCuScsCisgIGJyb3dzZXIgICAgICAgIHZhcmNoYXIoNTApICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgY29tbWVudCAn5rWP6KeI5Zmo57G75Z6LJywKKyAgb3MgICAgICAgICAgICAgdmFyY2hhcig1MCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICBjb21tZW50ICfmk43kvZzns7vnu58nLAorICBzdGF0dXMgICAgICAgICBjaGFyKDEpICAgICAgICBkZWZhdWx0ICcwJyAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eZu+W9leeKtuaAge+8iDDmiJDlip8gMeWksei0pe+8iScsCisgIG1zZyAgICAgICAgICAgIHZhcmNoYXIoMjU1KSAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgY29tbWVudCAn5o+Q56S65raI5oGvJywKKyAgbG9naW5fdGltZSAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICforr/pl67ml7bpl7QnLAorICBwcmltYXJ5IGtleSAoaW5mb19pZCksCisgIGtleSBpZHhfc3lzX2xvZ2luaW5mb3JfcyAgKHN0YXR1cyksCisgIGtleSBpZHhfc3lzX2xvZ2luaW5mb3JfbHQgKGxvZ2luX3RpbWUpCispIGVuZ2luZT1pbm5vZGIgYXV0b19pbmNyZW1lbnQ9MTAwIGNvbW1lbnQgPSAn57O757uf6K6/6Zeu6K6w5b2VJzsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAxNeOAgeWumuaXtuS7u+WKoeiwg+W6puihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX2pvYjsKK2NyZWF0ZSB0YWJsZSBzeXNfam9iICgKKyAgam9iX2lkICAgICAgICAgICAgICBiaWdpbnQoMjApICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgIGNvbW1lbnQgJ+S7u+WKoUlEJywKKyAgam9iX25hbWUgICAgICAgICAgICB2YXJjaGFyKDY0KSAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+S7u+WKoeWQjeensCcsCisgIGpvYl9ncm91cCAgICAgICAgICAgdmFyY2hhcig2NCkgICBkZWZhdWx0ICdERUZBVUxUJyAgICAgICAgICBjb21tZW50ICfku7vliqHnu4TlkI0nLAorICBpbnZva2VfdGFyZ2V0ICAgICAgIHZhcmNoYXIoNTAwKSAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn6LCD55So55uu5qCH5a2X56ym5LiyJywKKyAgY3Jvbl9leHByZXNzaW9uICAgICB2YXJjaGFyKDI1NSkgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ2Nyb27miafooYzooajovr7lvI8nLAorICBtaXNmaXJlX3BvbGljeSAgICAgIHZhcmNoYXIoMjApICAgZGVmYXVsdCAnMycgICAgICAgICAgICAgICAgY29tbWVudCAn6K6h5YiS5omn6KGM6ZSZ6K+v562W55Wl77yIMeeri+WNs+aJp+ihjCAy5omn6KGM5LiA5qyhIDPmlL7lvIPmiafooYzvvIknLAorICBjb25jdXJyZW50ICAgICAgICAgIGNoYXIoMSkgICAgICAgZGVmYXVsdCAnMScgICAgICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm5bm25Y+R5omn6KGM77yIMOWFgeiuuCAx56aB5q2i77yJJywKKyAgc3RhdHVzICAgICAgICAgICAgICBjaGFyKDEpICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eKtuaAge+8iDDmraPluLggMeaaguWBnO+8iScsCisgIGNyZWF0ZV9ieSAgICAgICAgICAgdmFyY2hhcig2NCkgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfliJvlu7rogIUnLAorICBjcmVhdGVfdGltZSAgICAgICAgIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu65pe26Ze0JywKKyAgdXBkYXRlX2J5ICAgICAgICAgICB2YXJjaGFyKDY0KSAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+abtOaWsOiAhScsCisgIHVwZGF0ZV90aW1lICAgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDml7bpl7QnLAorICByZW1hcmsgICAgICAgICAgICAgIHZhcmNoYXIoNTAwKSAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5aSH5rOo5L+h5oGvJywKKyAgcHJpbWFyeSBrZXkgKGpvYl9pZCwgam9iX25hbWUsIGpvYl9ncm91cCkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0xMDAgY29tbWVudCA9ICflrprml7bku7vliqHosIPluqbooagnOworCitpbnNlcnQgaW50byBzeXNfam9iIHZhbHVlcygxLCAn57O757uf6buY6K6k77yI5peg5Y+C77yJJywgJ0RFRkFVTFQnLCAncnlUYXNrLnJ5Tm9QYXJhbXMnLCAgICAgICAgJzAvMTAgKiAqICogKiA/JywgJzMnLCAnMScsICcxJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworaW5zZXJ0IGludG8gc3lzX2pvYiB2YWx1ZXMoMiwgJ+ezu+e7n+m7mOiupO+8iOacieWPgu+8iScsICdERUZBVUxUJywgJ3J5VGFzay5yeVBhcmFtcyhcJ3J5XCcpJywgICcwLzE1ICogKiAqICogPycsICczJywgJzEnLCAnMScsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKK2luc2VydCBpbnRvIHN5c19qb2IgdmFsdWVzKDMsICfns7vnu5/pu5jorqTvvIjlpJrlj4LvvIknLCAnREVGQVVMVCcsICdyeVRhc2sucnlNdWx0aXBsZVBhcmFtcyhcJ3J5XCcsIHRydWUsIDIwMDBMLCAzMTYuNTBELCAxMDApJywgICcwLzIwICogKiAqICogPycsICczJywgJzEnLCAnMScsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAxNuOAgeWumuaXtuS7u+WKoeiwg+W6puaXpeW/l+ihqAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgc3lzX2pvYl9sb2c7CitjcmVhdGUgdGFibGUgc3lzX2pvYl9sb2cgKAorICBqb2JfbG9nX2lkICAgICAgICAgIGJpZ2ludCgyMCkgICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgIGNvbW1lbnQgJ+S7u+WKoeaXpeW/l0lEJywKKyAgam9iX25hbWUgICAgICAgICAgICB2YXJjaGFyKDY0KSAgICBub3QgbnVsbCAgICAgICAgICAgICAgICAgICBjb21tZW50ICfku7vliqHlkI3np7AnLAorICBqb2JfZ3JvdXAgICAgICAgICAgIHZhcmNoYXIoNjQpICAgIG5vdCBudWxsICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+S7u+WKoee7hOWQjScsCisgIGludm9rZV90YXJnZXQgICAgICAgdmFyY2hhcig1MDApICAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn6LCD55So55uu5qCH5a2X56ym5LiyJywKKyAgam9iX21lc3NhZ2UgICAgICAgICB2YXJjaGFyKDUwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfml6Xlv5fkv6Hmga8nLAorICBzdGF0dXMgICAgICAgICAgICAgIGNoYXIoMSkgICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aJp+ihjOeKtuaAge+8iDDmraPluLggMeWksei0pe+8iScsCisgIGV4Y2VwdGlvbl9pbmZvICAgICAgdmFyY2hhcigyMDAwKSAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5byC5bi45L+h5oGvJywKKyAgY3JlYXRlX3RpbWUgICAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfliJvlu7rml7bpl7QnLAorICBwcmltYXJ5IGtleSAoam9iX2xvZ19pZCkKKykgZW5naW5lPWlubm9kYiBjb21tZW50ID0gJ+WumuaXtuS7u+WKoeiwg+W6puaXpeW/l+ihqCc7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gMTfjgIHpgJrnn6XlhazlkYrooagKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHN5c19ub3RpY2U7CitjcmVhdGUgdGFibGUgc3lzX25vdGljZSAoCisgIG5vdGljZV9pZCAgICAgICAgIGludCg0KSAgICAgICAgICBub3QgbnVsbCBhdXRvX2luY3JlbWVudCAgICBjb21tZW50ICflhazlkYpJRCcsCisgIG5vdGljZV90aXRsZSAgICAgIHZhcmNoYXIoNTApICAgICBub3QgbnVsbCAgICAgICAgICAgICAgICAgICBjb21tZW50ICflhazlkYrmoIfpopgnLAorICBub3RpY2VfdHlwZSAgICAgICBjaGFyKDEpICAgICAgICAgbm90IG51bGwgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5YWs5ZGK57G75Z6L77yIMemAmuefpSAy5YWs5ZGK77yJJywKKyAgbm90aWNlX2NvbnRlbnQgICAgbG9uZ2Jsb2IgICAgICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WFrOWRiuWGheWuuScsCisgIHN0YXR1cyAgICAgICAgICAgIGNoYXIoMSkgICAgICAgICBkZWZhdWx0ICcwJyAgICAgICAgICAgICAgICBjb21tZW50ICflhazlkYrnirbmgIHvvIgw5q2j5bi4IDHlhbPpl63vvIknLAorICBjcmVhdGVfYnkgICAgICAgICB2YXJjaGFyKDY0KSAgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5Yib5bu66ICFJywKKyAgY3JlYXRlX3RpbWUgICAgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICAgdmFyY2hhcigyNTUpICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wkh+azqCcsCisgIHByaW1hcnkga2V5IChub3RpY2VfaWQpCispIGVuZ2luZT1pbm5vZGIgYXV0b19pbmNyZW1lbnQ9MTAgY29tbWVudCA9ICfpgJrnn6XlhazlkYrooagnOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSDliJ3lp4vljJYt5YWs5ZGK5L+h5oGv6KGo5pWw5o2uCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnNlcnQgaW50byBzeXNfbm90aWNlIHZhbHVlcygnMScsICfmuKnppqjmj5DphpLvvJoyMDE4LTA3LTAxIOiLpeS+neaWsOeJiOacrOWPkeW4g+WVpicsICcyJywgJ+aWsOeJiOacrOWGheWuuScsICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+euoeeQhuWRmCcpOworaW5zZXJ0IGludG8gc3lzX25vdGljZSB2YWx1ZXMoJzInLCAn57u05oqk6YCa55+l77yaMjAxOC0wNy0wMSDoi6Xkvp3ns7vnu5/lh4zmmajnu7TmiqQnLCAnMScsICfnu7TmiqTlhoXlrrknLCAgICcwJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+euoeeQhuWRmCcpOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIDE444CB5Luj56CB55Sf5oiQ5Lia5Yqh6KGoCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkcm9wIHRhYmxlIGlmIGV4aXN0cyBnZW5fdGFibGU7CitjcmVhdGUgdGFibGUgZ2VuX3RhYmxlICgKKyAgdGFibGVfaWQgICAgICAgICAgYmlnaW50KDIwKSAgICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgIGNvbW1lbnQgJ+e8luWPtycsCisgIHRhYmxlX25hbWUgICAgICAgIHZhcmNoYXIoMjAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfooajlkI3np7AnLAorICB0YWJsZV9jb21tZW50ICAgICB2YXJjaGFyKDUwMCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn6KGo5o+P6L+wJywKKyAgc3ViX3RhYmxlX25hbWUgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WFs+iBlOWtkOihqOeahOihqOWQjScsCisgIHN1Yl90YWJsZV9ma19uYW1lIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0IG51bGwgICAgICAgICAgICAgICBjb21tZW50ICflrZDooajlhbPogZTnmoTlpJbplK7lkI0nLAorICBjbGFzc19uYW1lICAgICAgICB2YXJjaGFyKDEwMCkgICAgZGVmYXVsdCAnJyAgICAgICAgICAgICAgICAgY29tbWVudCAn5a6e5L2T57G75ZCN56ewJywKKyAgdHBsX2NhdGVnb3J5ICAgICAgdmFyY2hhcigyMDApICAgIGRlZmF1bHQgJ2NydWQnICAgICAgICAgICAgIGNvbW1lbnQgJ+S9v+eUqOeahOaooeadv++8iGNydWTljZXooajmk43kvZwgdHJlZeagkeihqOaTjeS9nO+8iScsCisgIHRwbF93ZWJfdHlwZSAgICAgIHZhcmNoYXIoMzApICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfliY3nq6/mqKHmnb/nsbvlnovvvIhlbGVtZW50LXVp5qih54mIIGVsZW1lbnQtcGx1c+aooeeJiO+8iScsCisgIHBhY2thZ2VfbmFtZSAgICAgIHZhcmNoYXIoMTAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfnlJ/miJDljIXot6/lvoQnLAorICBtb2R1bGVfbmFtZSAgICAgICB2YXJjaGFyKDMwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn55Sf5oiQ5qih5Z2X5ZCNJywKKyAgYnVzaW5lc3NfbmFtZSAgICAgdmFyY2hhcigzMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eUn+aIkOS4muWKoeWQjScsCisgIGZ1bmN0aW9uX25hbWUgICAgIHZhcmNoYXIoNTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfnlJ/miJDlip/og73lkI0nLAorICBmdW5jdGlvbl9hdXRob3IgICB2YXJjaGFyKDUwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn55Sf5oiQ5Yqf6IO95L2c6ICFJywKKyAgZ2VuX3R5cGUgICAgICAgICAgY2hhcigxKSAgICAgICAgIGRlZmF1bHQgJzAnICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+eUn+aIkOS7o+eggeaWueW8j++8iDB6aXDljovnvKnljIUgMeiHquWumuS5iei3r+W+hO+8iScsCisgIGdlbl9wYXRoICAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBkZWZhdWx0ICcvJyAgICAgICAgICAgICAgICBjb21tZW50ICfnlJ/miJDot6/lvoTvvIjkuI3loavpu5jorqTpobnnm67ot6/lvoTvvIknLAorICBvcHRpb25zICAgICAgICAgICB2YXJjaGFyKDEwMDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5YW25a6D55Sf5oiQ6YCJ6aG5JywKKyAgY3JlYXRlX2J5ICAgICAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuiAhScsCisgIGNyZWF0ZV90aW1lIAkgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcmVtYXJrICAgICAgICAgICAgdmFyY2hhcig1MDApICAgIGRlZmF1bHQgbnVsbCAgICAgICAgICAgICAgIGNvbW1lbnQgJ+Wkh+azqCcsCisgIHByaW1hcnkga2V5ICh0YWJsZV9pZCkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0xIGNvbW1lbnQgPSAn5Luj56CB55Sf5oiQ5Lia5Yqh6KGoJzsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAxOeOAgeS7o+eggeeUn+aIkOS4muWKoeihqOWtl+autQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZHJvcCB0YWJsZSBpZiBleGlzdHMgZ2VuX3RhYmxlX2NvbHVtbjsKK2NyZWF0ZSB0YWJsZSBnZW5fdGFibGVfY29sdW1uICgKKyAgY29sdW1uX2lkICAgICAgICAgYmlnaW50KDIwKSAgICAgIG5vdCBudWxsIGF1dG9faW5jcmVtZW50ICAgIGNvbW1lbnQgJ+e8luWPtycsCisgIHRhYmxlX2lkICAgICAgICAgIGJpZ2ludCgyMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICflvZLlsZ7ooajnvJblj7cnLAorICBjb2x1bW5fbmFtZSAgICAgICB2YXJjaGFyKDIwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5YiX5ZCN56ewJywKKyAgY29sdW1uX2NvbW1lbnQgICAgdmFyY2hhcig1MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIl+aPj+i/sCcsCisgIGNvbHVtbl90eXBlICAgICAgIHZhcmNoYXIoMTAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfliJfnsbvlnosnLAorICBqYXZhX3R5cGUgICAgICAgICB2YXJjaGFyKDUwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAnSkFWQeexu+WeiycsCisgIGphdmFfZmllbGQgICAgICAgIHZhcmNoYXIoMjAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICdKQVZB5a2X5q615ZCNJywKKyAgaXNfcGsgICAgICAgICAgICAgY2hhcigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuS4u+mUru+8iDHmmK/vvIknLAorICBpc19pbmNyZW1lbnQgICAgICBjaGFyKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm6Ieq5aKe77yIMeaYr++8iScsCisgIGlzX3JlcXVpcmVkICAgICAgIGNoYXIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmmK/lkKblv4XloavvvIgx5piv77yJJywKKyAgaXNfaW5zZXJ0ICAgICAgICAgY2hhcigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuS4uuaPkuWFpeWtl+aute+8iDHmmK/vvIknLAorICBpc19lZGl0ICAgICAgICAgICBjaGFyKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5piv5ZCm57yW6L6R5a2X5q6177yIMeaYr++8iScsCisgIGlzX2xpc3QgICAgICAgICAgIGNoYXIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICfmmK/lkKbliJfooajlrZfmrrXvvIgx5piv77yJJywKKyAgaXNfcXVlcnkgICAgICAgICAgY2hhcigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYr+WQpuafpeivouWtl+aute+8iDHmmK/vvIknLAorICBxdWVyeV90eXBlICAgICAgICB2YXJjaGFyKDIwMCkgICAgZGVmYXVsdCAnRVEnICAgICAgICAgICAgICAgY29tbWVudCAn5p+l6K+i5pa55byP77yI562J5LqO44CB5LiN562J5LqO44CB5aSn5LqO44CB5bCP5LqO44CB6IyD5Zu077yJJywKKyAgaHRtbF90eXBlICAgICAgICAgdmFyY2hhcigyMDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+aYvuekuuexu+Wei++8iOaWh+acrOahhuOAgeaWh+acrOWfn+OAgeS4i+aLieahhuOAgeWkjemAieahhuOAgeWNlemAieahhuOAgeaXpeacn+aOp+S7tu+8iScsCisgIGRpY3RfdHlwZSAgICAgICAgIHZhcmNoYXIoMjAwKSAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICflrZflhbjnsbvlnosnLAorICBzb3J0ICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5o6S5bqPJywKKyAgY3JlYXRlX2J5ICAgICAgICAgdmFyY2hhcig2NCkgICAgIGRlZmF1bHQgJycgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuiAhScsCisgIGNyZWF0ZV90aW1lIAkgICAgZGF0ZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgJ+WIm+W7uuaXtumXtCcsCisgIHVwZGF0ZV9ieSAgICAgICAgIHZhcmNoYXIoNjQpICAgICBkZWZhdWx0ICcnICAgICAgICAgICAgICAgICBjb21tZW50ICfmm7TmlrDogIUnLAorICB1cGRhdGVfdGltZSAgICAgICBkYXRldGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCAn5pu05paw5pe26Ze0JywKKyAgcHJpbWFyeSBrZXkgKGNvbHVtbl9pZCkKKykgZW5naW5lPWlubm9kYiBhdXRvX2luY3JlbWVudD0xIGNvbW1lbnQgPSAn5Luj56CB55Sf5oiQ5Lia5Yqh6KGo5a2X5q61JzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcWwvdGFza01lbnUuc3FsIGIvc3FsL3Rhc2tNZW51LnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA3MDYwCi0tLSAvZGV2L251bGwKKysrIGIvc3FsL3Rhc2tNZW51LnNxbApAQCAtMCwwICsxLDIyIEBACistLSDoj5zljZUgU1FMCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqEnLCAnMycsICcxJywgJ3Rhc2snLCAnc3lzdGVtL3Rhc2svaW5kZXgnLCAxLCAwLCAnQycsICcwJywgJzAnLCAnc3lzdGVtOnRhc2s6bGlzdCcsICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJ+S7u+WKoeiPnOWNlScpOworCistLSDmjInpkq7niLboj5zljZVJRAorU0VMRUNUIEBwYXJlbnRJZCA6PSBMQVNUX0lOU0VSVF9JRCgpOworCistLSDmjInpkq4gU1FMCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHmn6Xor6InLCBAcGFyZW50SWQsICcxJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dGFzazpxdWVyeScsICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKworaW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn5Lu75Yqh5paw5aKeJywgQHBhcmVudElkLCAnMicsICAnIycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnRhc2s6YWRkJywgICAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+S7u+WKoeS/ruaUuScsIEBwYXJlbnRJZCwgJzMnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTp0YXNrOmVkaXQnLCAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfku7vliqHliKDpmaQnLCBAcGFyZW50SWQsICc0JywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dGFzazpyZW1vdmUnLCAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKworaW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn5Lu75Yqh5a+85Ye6JywgQHBhcmVudElkLCAnNScsICAnIycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnRhc2s6ZXhwb3J0JywgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3FsL3VzZXJNZW51LnNxbCBiL3NxbC91c2VyTWVudS5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5YmUzOQotLS0gL2Rldi9udWxsCisrKyBiL3NxbC91c2VyTWVudS5zcWwKQEAgLTAsMCArMSwyMiBAQAorLS0g6I+c5Y2VIFNRTAoraW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn6aG555uu5LiO55So5oi35YWz6IGUJywgJzMnLCAnMScsICd1c2VyJywgJ3N5c3RlbS91c2VyL2luZGV4JywgMSwgMCwgJ0MnLCAnMCcsICcwJywgJ3N5c3RlbTp1c2VyOmxpc3QnLCAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICfpobnnm67kuI7nlKjmiLflhbPogZToj5zljZUnKTsKKworLS0g5oyJ6ZKu54i26I+c5Y2VSUQKK1NFTEVDVCBAcGFyZW50SWQgOj0gTEFTVF9JTlNFUlRfSUQoKTsKKworLS0g5oyJ6ZKuIFNRTAoraW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn6aG555uu5LiO55So5oi35YWz6IGU5p+l6K+iJywgQHBhcmVudElkLCAnMScsICAnIycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnVzZXI6cXVlcnknLCAgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+mhueebruS4jueUqOaIt+WFs+iBlOaWsOWinicsIEBwYXJlbnRJZCwgJzInLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTp1c2VyOmFkZCcsICAgICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOworCitpbnNlcnQgaW50byBzeXNfbWVudSAobWVudV9uYW1lLCBwYXJlbnRfaWQsIG9yZGVyX251bSwgcGF0aCwgY29tcG9uZW50LCBpc19mcmFtZSwgaXNfY2FjaGUsIG1lbnVfdHlwZSwgdmlzaWJsZSwgc3RhdHVzLCBwZXJtcywgaWNvbiwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdXBkYXRlX2J5LCB1cGRhdGVfdGltZSwgcmVtYXJrKQordmFsdWVzKCfpobnnm67kuI7nlKjmiLflhbPogZTkv67mlLknLCBAcGFyZW50SWQsICczJywgICcjJywgJycsIDEsIDAsICdGJywgJzAnLCAnMCcsICdzeXN0ZW06dXNlcjplZGl0JywgICAgICAgICAnIycsICdhZG1pbicsIHN5c2RhdGUoKSwgJycsIG51bGwsICcnKTsKKworaW5zZXJ0IGludG8gc3lzX21lbnUgKG1lbnVfbmFtZSwgcGFyZW50X2lkLCBvcmRlcl9udW0sIHBhdGgsIGNvbXBvbmVudCwgaXNfZnJhbWUsIGlzX2NhY2hlLCBtZW51X3R5cGUsIHZpc2libGUsIHN0YXR1cywgcGVybXMsIGljb24sIGNyZWF0ZV9ieSwgY3JlYXRlX3RpbWUsIHVwZGF0ZV9ieSwgdXBkYXRlX3RpbWUsIHJlbWFyaykKK3ZhbHVlcygn6aG555uu5LiO55So5oi35YWz6IGU5Yig6ZmkJywgQHBhcmVudElkLCAnNCcsICAnIycsICcnLCAxLCAwLCAnRicsICcwJywgJzAnLCAnc3lzdGVtOnVzZXI6cmVtb3ZlJywgICAgICAgJyMnLCAnYWRtaW4nLCBzeXNkYXRlKCksICcnLCBudWxsLCAnJyk7CisKK2luc2VydCBpbnRvIHN5c19tZW51IChtZW51X25hbWUsIHBhcmVudF9pZCwgb3JkZXJfbnVtLCBwYXRoLCBjb21wb25lbnQsIGlzX2ZyYW1lLCBpc19jYWNoZSwgbWVudV90eXBlLCB2aXNpYmxlLCBzdGF0dXMsIHBlcm1zLCBpY29uLCBjcmVhdGVfYnksIGNyZWF0ZV90aW1lLCB1cGRhdGVfYnksIHVwZGF0ZV90aW1lLCByZW1hcmspCit2YWx1ZXMoJ+mhueebruS4jueUqOaIt+WFs+iBlOWvvOWHuicsIEBwYXJlbnRJZCwgJzUnLCAgJyMnLCAnJywgMSwgMCwgJ0YnLCAnMCcsICcwJywgJ3N5c3RlbTp1c2VyOmV4cG9ydCcsICAgICAgICcjJywgJ2FkbWluJywgc3lzZGF0ZSgpLCAnJywgbnVsbCwgJycpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK