xiaomianao666

插件名:global_懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、知乎增强、短视频无水印下载、百度网盘直接下载等多功能工具箱,功能可独立开关。长期更新,放心使用。v6

Apr 25th, 2025
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、知乎增强、短视频无水印下载、百度网盘直接下载等多功能工具箱,功能可独立开关。长期更新,放心使用。v6@base64://Ly8gPT1Vc2VyU2NyaXB0PT0NCi8vIEBuYW1lICAgICAgICAg5oeS5Lq65LiT55So77yM5YWo572RVklQ6KeG6aKR5YWN6LS556C06Kej5Y675bm/5ZGK44CB5YWo572R6Z+z5LmQ55u05o6l5LiL6L2944CB55+l5LmO5aKe5by644CB55+t6KeG6aKR5peg5rC05Y2w5LiL6L2944CB55m+5bqm572R55uY55u05o6l5LiL6L29562J5aSa5Yqf6IO95bel5YW3566x77yM5Yqf6IO95Y+v54us56uL5byA5YWz44CC6ZW/5pyf5pu05paw77yM5pS+5b+D5L2/55So44CCdjYNCi8vIEBuYW1lc3BhY2UgCSBsYW5oYWhhDQovLyBAdmVyc2lvbiAgICAgIDYuOC4xDQovLyBAZGVzY3JpcHRpb24gIOiHqueUqOWkmuWKn+iDveiEmuacrOW3peWFt+euse+8jOWujOWFqOWFjei0ueOAgeaXoOW5v+WRiuOAgeaXoOmcgOWFs+azqOWFrOS8l+WPt++8jOmbhuWQiOS6huS8mOmFt+OAgeeIseWlh+iJuuOAgeiFvuiur+OAgULnq5koYmlsaWJpbGkp44CB6IqS5p6c562J5YWo572RVklQ6KeG6aKRKFBDK+enu+WKqOerrynlhY3otLnnoLTop6Pljrvlub/lkYrvvIznvZHmmJPkupHpn7PkuZDjgIFRUemfs+S5kOOAgemFt+eLl+OAgemFt+aIkeOAgeiZvuexs+OAgeicu+ick0ZN44CB6I2U5p6dRk3jgIHllpzpqazmi4npm4XnrYnnvZHnq5npn7PkuZDlkozmnInlo7Dkuabpn7PpopHlhY3lrqLmiLfnq6/kuIvovb3vvIznn6XkuY7lop7lvLoo55+l5LmO6KeG6aKR5LiL6L2944CB5Y675bm/5ZGK44CB5YWz6ZSu6K+N5bGP6JS944CB5Y676Zmk5L6n6L655qCP562JKe+8jOinhumikeaXoOawtOWNsOS4i+i9vShiaWxpYmlsaeOAgeaKlumfs+OAgeW/q+aJi+OAgeilv+eTnOOAgXlvdXR1YmUp77yM55m+5bqm572R55uY55u05o6l5LiL6L2977yM5LyY5oOg5Yi46Ieq5Yqo5p+l6K+i562J5Yeg5Liq6Ieq5bex5bi455So55qE5Yqf6IO977yM5LiU5Yqf6IO95Y+v54us56uL5byA5YWz44CCDQovLyBAYXV0aG9yICAgICAgIGxhbmhhaGHvvIxzeWh5ejE5OTDvvIx6bWZtYw0KLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUdRQUFBQmtDQVlBQUFCdzRwVlVBQUFROEVsRVFWUjRYdTFkQ1hRVVJScithcElRVDF3UXc2RVlCY1NFckNnS0NvUW93b29jTGlyS2VvQW9MRDV4MllEdStoVENQbmRkSmVDNUN0NmdJQnRkbFVNUXhBUEU5NWdNS2tiaG9XR0NLTWdwc1BqVW9Fc0lrTnIzVGFkaE11bWVxZTZ1bmdSSThTQkFWOWZ4Zi9XZjlWZVhnSWNpcGN6eThQcFIvYW9Rb3N6TkJJV1RsNlNVdlFBTUFIQUpnRmJZc1NzZEg1ZTB3aWNsd01wVndLN2RUcG83ZXVwbU5BTzZkUWE2ZERKK3RzallDR0FMZ0dJQTd3b2grRk9wS0FNaTkrMjdHWTBhRGNTVzdkM3h5dXN0RUNwSncyYjIyVkJxVVNDek5aQjN5VDZNdUdrcm1tY3NSMlhsSXBHZVBrK0ZVa3FBeUc4Mi9CbW50N3dXejg2OEFDKzkybFNsNFlZNkFOSWJBYmZjc0F0M0RpdkJ0dS9uaTNadHBpV2lTMXhBNUE4L2RNZTg5d2FnN1ZsOThlRGo1MkxucmhNVE5kanczSUlDelU4cngvMzNyTVdHRFlzeHNPOWljZHBwbjl2UnlSWVF1WHYzSUtTa0RNQ2txVDJ4OElQVElaRGVRR3dQRkpDeUFnT3YvQTczNVMvRmZyRlFOUC9OQjFhdFdRSWlmOTQ3QlBzckJtUFVYN3VqOU91bUVFanhNSlNHVjAwS1NIa0FPZTEzNHNVblBrSnF5bHpSdVBIOFdPTFVBa1R1MjNjakRzb2hHSkdmaXpYaEpnM1U5SUVDSFR2c3hLeW5QMFJhV3BFUTR0M29IbW9BSXFXOERNQkk1RS9vaDJYTFQvVmhLQTFObWhTNHV2OTJGSTUvQzhBTUljUWhuVklUa004K2Z3anJOOTJFQng4L0MwSUVHcWpuSXdVb3ZpWVdoSEZXNjVuaXdvNVBtRDBkQWtUdStya3ZVZy9laFQ2REw4WC85aDN2NDFBYW1qWXBjTUx4NVhqL3pTVVE4a25SdEduRWVUd015TUwzLzRIUFZ3L0ZHMiszZ1JCSy9rbFNLZHY1QXVEMEZzRHBMUTJQbU1YOGQreEFHRFZnS1ZzUGJQc2VLUHNHS0ZtZDFPRXFkU2JsUWR3dzhDdGNkTkUwOGZ2ZlBYTUlFTGxqeDNrUXFlTnc1Zlg5VUhtZ2ZpanlWaTJBWGoyQWl6c0J2UzlWbWwvQ1NnVHFzMVhBc3FBQlVuMG9qZEsreC90dnpFTktZSkpvMW14YmhCTms0V09ESUZQR29taE9Wd2pScU03R2VmSkpCZ2pEL2dCa25lUHZNTWc1czk0RWxoVUQyM2Y0MjFlODFpVit3WWliUDRLUWo0aDdSaGNiZ0hUclB4cFZ1QjNsUDU5WEo4cWMzSEJOUCtDV3dVRGprNU5QbkxjV0E4L09xQnRnSkE2Z1Zjc1NwTWlueFFkelhqVUE2WkJYZ0txcVlSQTRGOGxVSCtTSVB3MDNPS0krbExvQVJsWlZBU2hGVldDNldGYzh4UUFrSi9lZk9JZ2hFS0xOWVRYdk00V3U3Z3VNRytPY0l5aGV0dTB3ZElGWktINElyc2xkNURncWZ5cDkvdDFKS2Q4RC9IdTJ3VEhKS0ZJQ0V1c1FDTXdTYTRPRjFTS3IzMVQ4dUdjUWhHemxPNGVRUUJNTERHV3RVcWg4U1h4VEllLzVSZVd0dzNVSUZLMHk5c2VmV2UzVTNxZUZOcUhRZitVdnlSRnlBMUx3cWlnTjNXOEEwdSttSW16YTNBOFEvb2JXZStVQkU4Y241Z29TZmY2N3dQekYrZ25DQlRGNkJOQTd6K0NxUk9XMk1UVzVNVkY5cDg4SmlNQlduSERjSEZHeTlHNERrTHdCNzJEM2p6MGhBaWM0YlUrNS9uMzVpWFVGeGRFekx4dGcrRjBJQmtFaE9QSEVHa1ZZdC83K2prWmlONW8yV1NSQ0M0Y2JnSFM4L0VOVVZ1WWlJUHdKc1Q4MEhyZzJ6cVRJRVFTQ3Nyc3VDcTA3QW1QSE1UbDUvbzVLeWoxSVRWa212bHgralFGSWR2ZmxrWDF5RWREcmczQ0NVd3JqNndzNmFRV0ZnRlBkb0p0RTVKTHhZd0NLMWVoQ3JyMWlzTzdlYXJZbjVWNUFCa1Y0eFpYVmdQVDRHRUJuQ0tScTdYbkdGSHN3Q01Ea0tja1JUMDRtUlVBSURBSDZiRFZRTU5GLy8wUmlINEJQUkxpNHB3RklWdmVWZ0xnUUFhRnZJeXFlbUtMbE5HR2lmb1h0aFBEMXFhNlUrd0h4cVFnWDU1a2k2M01nY0w2Mm5VSDZGNVRMVm9WZzNKWmY5eUxLRFNBMG1lOGJZM0Q5aDh1QkNaUDB6SVBlT2xBaXdzWGRURUJXUWFJakFnSHZleUJrK2FtRlJ4OFluTkVIYnhvT3Axbm9xMXczd2cyME5kK3BrZ2NCK1lVb1czRnhkZWdrZHpVa3ZNZXhLSGZudm16dFp4ekpuRUh5a1R2bVduanY5T2hwSVhvcEVnUmt0UWlIT3BzY3NnWkFEb1JIRHJGVDRrYzZHQ1EyRjlzU0c3UDh1dUhlOUNIM1JTRFhpUENLQzZzQnlmM1NBTVJEWkpFNmc3b2p0dENhb3M2b0wvc1BYbGF5blc1a1dHZTR4ZHhWKzZxU1ZaQllJOWFGT2xWYldibGZRYUNEYTBEb2IxQytXb1hPR1E5S2h1ZXRPbmt2OVRqUGVUT3NQWHN2SVJZcEdmSDlTb1JENXg4R0JPaUFnRXNPWWJDUSt4bXhoVTVmZm9FWEV0Uy9kKzJNRmk5Y1VoMkNGK0VWSFUybFhncUpiRmNjWWlkYkthcm80ZGExQis0SHBET25BbDB1cU4yeVd5NlJVa0ppclNnTC9iWWFrQjVyd2JNZWJuU0lIWGZRQzYrcjJKUWZJRVMzeVREK3pDbjZKRUlWTjBXaUFjbktEVmZ2RmpyTE5ySFRIVHJpUDJ5Ym9Yb21PSEFEaXFibGd2ZjhKclY2KzFaY3dsQUxEUmluaFJ3aUVCWnJRem1tRGlsenRYMXJaMW5wVU9SV0pqUWRzY2xUL2QyZlVDV21sVi9pMWllSkFDTEt4TnJpRHQ0QW9STVlteDJpZ3p0SWxOS2dQV2tZdGlBd2Raa3R3dEZSd1ROc3o2MWlXcElVMDI2S0ZrRHNsRG4xaHR1QlJVOG1IaUJtUFhNUDVVZzNIQXlsdms2VWhiTGRjd2hYQmpOR1lvdFhyOVZzVHdVUTF1V09IaGRBZmRJdlRybWtPdEZCbElXeXFnSHBzUTVDdG5lVTRHQ2wxT2lORXhBZFJSVVFzeThxZmtaZm83TlJkSXdqR1cxb0FjU0tZTHJFVlNJZEVvOUlkTkJvVkNSYnZ6Q3Q2WnIrd0o0OVJncVJrMUJSTFVDeWUzd05JYytKeXIyT3Z5N3M3SEI2NWZUT2RSUXJ3R2xXcXVaYU1VMlVoRW1HZm9tMU5pbEdHWlpYWFJRUlFNVFhvcXo0WEhNTDF4a2dkdWF1em1RQUswQk1zNUw2aTJOSWxNWkR3bER4RjgzUnNVVHMyN0FTMzQ1TTRBZ2c2MFc0dUwwWjdWMFBvSjJ5RHJGUzZMck0zWGhLUFhxU0JJUFJWNnNZV2l6cC9OWXZWb0RRREtib1ZDcGVBZEhwcGRvTk9CNkhSTDlEQjIzY1dPdllVbXpiMUM4UFQzRW0zMVVJeWgzUzJHd1ZKMTU3SkhLQ2IwUTRkSTY1UWZVTklOb3FjNGhuRmxXWXBTb2dabFBVYTRVRmFybThUS3ArZUtvKy9XSWxNY2lWZlJTVHlEMERFcnUzVEtJNGtwaytBR0kybVNqcHpheW5NNm5hemlkVDFha1JRT1MzSXJ5aW5Uc09jYnA2RmVoZnE0cVhQcWhmVE1XZnFHK3VaSVpodkZpSDFHT01lc2VXT2dWRWQ3amRDeUFtWVJqZUtaeWdybC9HRkxnVFkzWnVRQU1nTnV5Z3FsL2M3dnBwQnlRcjkxdEhoM1Ywck41RW9zU1BQdXo4cCtpeHFLN3E2SGU4K21YVlowUkVXYWl0R1Z3OCtnRmhhQ01TS285S2RJdGRGUFRxdTFya0JpUmFQSjZWdW5Gb3h6MGdWbWF2empnV0NhQ0xReWhPR0pWV09iSGxkbVBOQ2hBbmdWWUxEdGtBZ2JNOStTRk9IS0ZFSzQ3UG1TVVllL3pNU1JJQkZUcUJpSGN1eFJ3SHh6NzVLZmNPb3c3SFVHS2pLQXUxTVVXV00wQzhPa0lxZ01TbTI2aXVPSnE4bE9rcVI2d1o3cGsweFp2SkcxazhGanVuVGtJblJyVFhBeUIyU296eVYyZDBsYXVjSzV5K2drcXlIVUVjbHg5ZlQ1Q0FIQ05GTENQQ09zWnJKVjRkdVFIVmdJUk5Ec25PTlRoRTlVeTBYZUt4enZDN0NoZVpkYUtQQ1NSNmo4QXlBcXdhR2svVW5wM0o2MFM4d2lzZ2RrcFhwMktuNk9GQlVSN01qQndHblZGYnRKaDFWUFVFZ2RDOW8ralZ3aUl0amRESmR5Szg0bXd6ZExJUkVQeEdWcUwxY1BpNWxTSnpFbEJMMUpOVllqTXpJYzJWVFlXdG9pZjhQanBucFQ5VTlaMUpBeTJBMk9rUlhVa09WZ0ZNeW1WK3hVRkZUM0N5REhqcTBoTldDOGd1ODhhUi9pQnpSTmhra3dpSHpuTFBJWFdSQnNRSXJjckhhUmdvcFBXa1MwL1ljYlBkOFFTbmk3STJJTG5mQVNKVFZhY2ZHcCtWcjBDaWNSL0FxL1hpTk91RWc2S280T3JVclNmc0FMSGlZamM3cDhaK3lHWVJEbVdhVzdqdUFMRUxPenRsV2FzSk93SEViejFoTlQ2ZGM5Y0dDSzBjSHZPS1RUYlF3U1dxZ05DeW8vWGtsU01UR1JteHo2MjR3KzBSREF0QU5nRTQwNUdWWlE3UXp1enp1b09ZQ0pCa0hlcTNBc3B1ems2ODgraDJ0UUlTajB1YzVDYkZUdHp1VUF4bE5EL0ZrU3c5RVR1dWVDZU5vODF5Snh5bkZSQjJiTGRpM0c3NHNNM1lXRlpkZjZER0pQQ1VpZFlmNWZRaUVReEF0b2h3NkV4VHFic1hXV3pLamt2NFRJZUNkN0xhL0t3Yjc2U3hsK043QmlEYlJEaDBoaDVBckZaME5HR2MydVYrRXRWdDIzYnhPMjJMVHU1QWFmSGwrZ0Rod096a3ZnNnJ5eTBoZGJ4SENjQVFpZFZ1bzg1OW9OSmc5ZGVBc25NM0EyanR5c3FLbm5BODBlVkZuK2dncXRzMk9DY2U4TFQ2ampEMTJxRGgraUlDcGNIclRRN1JBd2duYlJlTzVqTzNWb2hiWW5wOUx4NFliRnYzZGtOcGNLUUp5RlorU2Qwemg1Z0VzSXZ4SEVtQUpBTERpMVZsdDFCS2czZUx5RjJFT1QwK0FvVEREOXpHV1g2NllqeGVWN2piOTZuQWVRcllMcERwMWdGTU5KN1M0TDBFcEM5eTh2UjlCdFRPR2psU3pOK2gxd1BqeDlxVHppOHcyR05wOE84RTVEcms1T2s3MFhLa2lpdVZEeno3Q1lZQnlHUUNjaXR5OG1ZbTRpYmw1MWJpeW1vSExYb2YzTXhFWjZBdzJVRkNNMHVGMFlaNHhXOHdERUNlSUNDamtKUDNuRExCNDFWVUVWZnhDR0FDdzhuN3ZibmtKRjBvV2VLMk5QZzBBZmtMY3ZJZTF3SklJbkdsbXFiRHdmQnJEUVNHOTN2b0xMeWZoT05RU1l3Z3Q5SzBUVllnc3pUNEFnRVpoNXk4U1ZybWJDZXU4c2NiKytCdWJzb2gxM3pJRzNIV3U3dTZpTHFCbjFLaWY4UU1GcFV0WUJLakxqN3dYQnFjUVVEdXh3VzlIc0QrL2Q0d3NSTlhKQ1NKb2tvSWxWR3d6ZkpmakRQaFZ1ZkJTZnpHSjdtN3BVZFhOcVBLUEtMcnBLVUJxNWNWRVpDSGNPbkFDZmpoUjZkTjFLeHY5OTJzUksyU0FKVG5pWTQ0SjJySDYzTXptOUhyRjBiZGp1UFVKc0R5dC85RFFCN0dvTnZ1eGJwdjNUWmx2UGZ4WXVkY1lLYnA4SDJWbXdxOGpkRDZiUzRJNmlvLzA0VlV4bjF1VzJEZXpEa0U1RW5rangvclNYbkcrM2l5MVdEaWJiOUdGRzQvUStiN3lUWFVFZFJOS2puREtnVDFXcWR2TCtEeEIrWVRrS2N4cldnMG5uekJmWk9xNHNwcGRnakJJZWZ3YklmVHE0dGlaME5PTUcvcElSREo5bmNTVWRlNFgyVVJBWGtlSzFmZDRlbTdzeXJpeXZ6QWwxdENrRnNZQXFmeHdIMko2SEM0eVVuUmJWUHg4OThFZ1NtdWZ2czFpUWllNlBtY2w3NUhkdnQ3ak9CaVplVWlYRFcwYldUZ1RrdThjRHZiU25ieW10UHgxNGY2elRNcXNPVE5sU0kxOVRJai9DN2xYRHcxclRkZW5IV0s0L0hGKzB5c21UUGx1TkZqNkFWK1RXN1VyWnR4OGZtdmkyNlhqRE1BMmJ2M2p5amZNeEpYM3RBSmxmdWRYM3NVcTBPU2xWdDdOT0RXS08wWExKbTlEQUpQaVdiTmxoMDZmeUFYTFoySUwxYmZoTmZleWtTZzRlcnVwR0ROSzd5SERpNURwL05lRWYxN1A4WStEd05TWHA2SEEzSlU1SUxpWC9mV2p3dUtrMEtWT3V6a2xNWTc4VTdSQWh3NDhMekl5SWpjbEZuamhJNzg0c3RiOE4yV2tTaVkyQVVCMFhDbnVwOVk4V2EyU1g5Ympzek02YUpUaC9sbVY3V09UTWxuWGhxSHJkdUhZc0Y3N1FHUjV1ZVlqdG0ycStSZURMcHFGVnEzbUNudUhENHRtZzYxQWZuMTEwNFFhYmRoeE9oQldCTSs0NWdsbWw4VGw3SUNIYlBYNHRRbVJlTFpSLzhWMjQzbG9VTDVVMFVmeU1xaHVQMnVQbGo3ZFhPL3huYk10VXN3Y3JMS0lNUnJZdmIwUjYzbWIzdktVNWFYWDRQVXRNRzRmM0pQTEZyYVhPdVZlc2NjRWhGbmJ5LzZYMUdHbjhyZkVDODk4YkFkQ2VJZXU1VVZGUU9RbnQ0Znl6L3VpWDg4Y2laMi9QZEVWMWRhSElzQVJNODVvOWtlUEhEdmwxaS9jWTRZT2FTV21JcXJRMkpwSjZYc2pBMGJlcU5seTF3OE56TWIwNHN5QUhHaWNlZWhnMlBVeHlJb3ZBNXYxTEFmY01ld0VtemJ0VUMweTN3eEVSbVVLU3IzNysrRkpjRWV5TW5xaUZtdloyTEZ5aWJZdU9Wa0NCd1BpVVlJSUFESjMxSlVaMEJHdDIzOG5YOUdNdStqamJ6cS96QnIxM3B1MXEzeElORzg2dlo1Wm1zZ3Qwc0ZicjF4TTFxM0NxS3ljckZJVDUrbk1paGxRQTZSWmV2V3JwZyt1d015bW1SaVVMK1dDSDZhZ2M5V05jYktMNDdEenQxcGdFd0ZCTUZKUVFBQ1ZlQmxsUUpFaWI4Z3EzOFRuTWlYQ2c2REZlbUV6dzhCVmh0VWxWazVyK09ZRGpXNmFORWM2Tm9KNkhJaDBQVWlvR1h6Q2dDYlVGNGVST1BHaTRVUUphcEQ4allRMVY0YTZpbFQ0UCtHQzVPbCt4SUtud0FBQUFCSlJVNUVya0pnZ2c9PQ0KLy8gQG1hdGNoICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqDQovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoNCi8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9tYWluKg0KLy8gQG1hdGNoICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL21haW4qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3MqDQovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3MqDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlvdWt1LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxaXlpLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxlLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly92LnFxLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9tLnYucXEuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoudHVkb3UuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoubWd0di5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vdHYuc29odS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vZmlsbS5zb2h1LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLjE5MDUuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouYmlsaWJpbGkuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoucHB0di5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vaXRlbS50YW9iYW8uY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL3MudGFvYmFvLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vZGV0YWlsLnRtYWxsLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9kZXRhaWwudG1hbGwuaGsvKg0KLy8gQG1hdGNoICAgICAgICAqOi8vaXRlbS5qZC5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi55aXlhb2pkLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9ucGNpdGVtLmpkLmhrLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGlhbmd4aW55YW8uY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL211c2ljLjE2My5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8veS5xcS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5rdWdvdS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5rdXdvLmNuLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoueGltYWxheWEuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouemhpaHUuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouZG91eWluLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1YWlzaG91LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLml4aWd1YS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi55b3V0dWJlLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly80Ny45OS4xNTguMTE4LyoNCi8vIEBjb25uZWN0ICAgICAgZC5wY3MuYmFpZHUuY29tDQovLyBAY29ubmVjdCAgICAgIGJhaWR1LmNvbQ0KLy8gQGNvbm5lY3QgICAgICBiYWlkdXBjcy5jb20NCi8vIEBjb25uZWN0ICAgICAgeW91eGlhb2hvdS5jb20NCi8vIEBjb25uZWN0ICAgICAgbG9jYWxob3N0DQovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vbGYyNi1jZG4tdG9zLmJ5dGVjZG50cC5jb20vY2RuL2V4cGlyZS0xLU0vY3J5cHRvLWpzLzQuMS4xL2NyeXB0by1qcy5taW4uanMNCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9sZjMtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL2xpbW9udGUtc3dlZXRhbGVydDIvMTEuNC40L3N3ZWV0YWxlcnQyLmFsbC5taW4uanMNCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9sZjktY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL3FyY29kZWpzLzEuMC4wL3FyY29kZS5qcw0KLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzc2MDc4DQovLyBAb3JpZ2luYWwtYXV0aG9yIHpobWFpDQovLyBAb3JpZ2luYWwtbGljZW5zZSBHUEwgTGljZW5zZQ0KLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dpdGh1Yi5jb20vc3loeXoxOTkwL2JhaWR1eXVuL2Jsb2IvbWFzdGVyL2JhaWR1eXVuLnVzZXIuanMNCi8vIEBvcmlnaW5hbC1hdXRob3IgeW91eGlhb2hvdQ0KLy8gQG9yaWdpbmFsLWxpY2Vuc2UgQUdQTCBMaWNlbnNlDQovLyBAb3JpZ2luYWwtY2hhbmdlcyDlsIblvLrliLblhbPms6jlhazkvJflj7fmlLnkuLrpnZ7lvLrliLbjgIINCi8vIEBhbnRpZmVhdHVyZSAgcmVmZXJyYWwtbGluayDmraTmj5DnpLrkuLpHcmVhc3lGb3Jr5Luj56CB6KeE6IyD6KaB5rGC5ZCr5pyJ5p+l5Yi45Yqf6IO955qE6ISa5pys5b+F6aG75re75Yqg77yM5a6e6ZmF5L2/55So5peg5Lu75L2V5by65Yi26Lez6L2s77yM5Luj56CB5Y+v5p+l77yM6K+355+l5oKJ44CCDQovLyBAbGljZW5zZSAgICAgIEFHUEwgTGljZW5zZQ0KLy8gQGdyYW50ICAgICAgICBHTV9kb3dubG9hZA0KLy8gQGdyYW50ICAgICAgICBHTV9vcGVuSW5UYWINCi8vIEBncmFudCAgICAgICAgR01fc2V0VmFsdWUNCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUNCi8vIEBncmFudCAgICAgICAgR01fZGVsZXRlVmFsdWUNCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QNCi8vIEBncmFudCAgICAgICAgR01fYWRkU3R5bGUNCi8vIEBncmFudCAgICAgICAgdW5zYWZlV2luZG93DQovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZA0KLy8gQGdyYW50ICAgICAgICBHTV9nZXRSZXNvdXJjZVVSTA0KLy8gQGdyYW50ICAgICAgICBHTV9nZXRSZXNvdXJjZVRleHQNCi8vIEBncmFudCAgICAgICAgR01faW5mbw0KLy8gQGdyYW50ICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kDQovLyBAZ3JhbnQgICAgICAgIEdNX2Nvb2tpZQ0KLy8gQGNvbm5lY3QgICAgICBpZXNkb3V5aW4uY29tDQovLyBAY29ubmVjdCAgICAgIDQ3Ljk5LjE1OC4xMTgNCi8vID09L1VzZXJTY3JpcHQ9PQ0KDQooZnVuY3Rpb24oKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgdmFyIGRvbUhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOw0KDQogICAgdmFyIGRvbVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCg0KICAgIGRvbVN0eWxlLnR5cGUgPSAndGV4dC9jc3MnOw0KDQogICAgZG9tU3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOw0KICAgIC8v5bmz5Y+w5Yik5patDQogICAgdmFyIGlzTW9iaWxlID0gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQb2R8QmxhY2tCZXJyeS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7DQoNCiAgICBpZihpc01vYmlsZSl7DQoNCiAgICAgICAgbGV0IHBsYXlMaW5lID0gWw0KICAgICAgICAgICAgeyJuYW1lIjoi57qv5YeAMSIsInVybCI6Imh0dHBzOi8vaW0xOTA3LnRvcC8/ang9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJC56uZMSIsInVybCI6Imh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0ifSwNCiAgICAgICAgICAgIHsibmFtZSI6Ik9LIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0ifSwNCiAgICAgICAgICAgIHsibmFtZSI6IuS6uuS6uui/tyIsInVybCI6Imh0dHBzOi8vanguYmxiby5jYzo0NDMzLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiLmgJ3lj6QzIiwidXJsIjoiaHR0cHM6Ly9qc2FwLmF0dGFraWRzLmNvbS8/dXJsPSJ9LA0KICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSJ9LA0KICAgICAgICAgICAgeyJuYW1lIjoiWVQiLCJ1cmwiOiJodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0ifQ0KICAgICAgICBdOw0KDQogICAgICAgIGxldCB1c2VXZWIgPSBbJ20uYmlsaWJpbGkuY29tJywneW91a3UuY29tJywnd3d3LnlvdWt1LmNvbScsJ20ueW91a3UuY29tJywnbS52LnFxLmNvbScsJ20uaXFpeWkuY29tJywnbS5tZ3R2LmNvbScsJ20udHYuc29odS5jb20nLCdtLjE5MDUuY29tJywnbS5wcHR2LmNvbScsJ20ubGUuY29tJ107DQoNCiAgICAgICAgaWYodXNlV2ViLmluZGV4T2YobG9jYXRpb24uaG9zdCkgPT0gLTEpew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4jeaYr+W6lOeUqOe9keermScpO3JldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsNCg0KICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOw0KDQogICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7DQoNCiAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7DQoNCiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0Q29va2llKGNuYW1lKXsNCiAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7DQogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsNCiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvbSxkb21JZCl7DQoNCiAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOw0KDQogICAgICAgICAgICBuZXdFbGVtZW50LmlkID0gZG9tSWQ7DQoNCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7DQoNCiAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnRIdG1sQ29udGVudCk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHRvYXN0KG1zZyxkdXJhdGlvbil7DQoNCiAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOw0KDQogICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOw0KDQogICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycNCg0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0b2FzdERvbSk7DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsNCg0KICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnLXdlYmtpdC10cmFuc2Zvcm0gJyArIGQgKyAncyBlYXNlLWluLCBvcGFjaXR5ICcgKyBkICsgJ3MgZWFzZS1pbic7DQoNCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOw0KDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOw0KDQogICAgICAgICAgICB9LCBkdXJhdGlvbik7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHBsYXlWaWRlb0Z1bmMoKXsNCiAgICAgICAgICAgIC8vY3NzDQogICAgICAgICAgICBsZXQgcGxheVZpZGVvU3R5bGUgPSBgDQogICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsNCiAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7Y3Vyc29yOnBvaW50ZXI7DQogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5Ow0KICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7DQogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGV0OjBweDt0b3A6MzYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb193cmFwew0KICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkO2xlZnQ6NDBweDt0b3A6MzYwcHg7DQogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5Ow0KICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZXsNCiAgICAgICAgICAgICAgICB3aWR0aDozMjBweDsNCiAgICAgICAgICAgICAgICBoZWlnaHQ6MzE2cHg7DQogICAgICAgICAgICAgICAgb3ZlcmZsb3cteTpzY3JvbGw7DQogICAgICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47DQogICAgICAgICAgICB9DQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZV9saW5lX3Vsew0KICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4Ow0KICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Ow0KICAgICAgICAgICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7DQogICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsNCiAgICAgICAgICAgICAgICBwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgICBtYXJnaW46MHB4Ow0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsNCiAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7DQogICAgICAgICAgICAgICAgbWFyZ2luOjJweDsNCiAgICAgICAgICAgICAgICB3aWR0aDozMCU7DQogICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsNCiAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7DQogICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsNCiAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpOmhvdmVyew0KICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7DQogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwDQogICAgICAgICAgICB9DQogICAgICAgICAgICAuemhtX2xpbmVfc2VsZWN0ZWR7DQogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsNCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzANCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ew0KICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7DQogICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7DQogICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO3RvcDowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBgOw0KDQogICAgICAgICAgICBkb21TdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwbGF5VmlkZW9TdHlsZSkpOw0KDQogICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsNCg0KICAgICAgICAgICAgLy90ZW1wbGF0ZTppY29uLHBsYXlMaW5lOw0KICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPScnIGNsYXNzPSdwbGF5QnV0dG9uIHpobV9wbGF5X3ZpZG9lX2ljb24nIGlkPSd6aG1sb2dvJz48aW1nIGNsYXNzPSdpY29uTG9nbycgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUNXQVBjQUFQSkVRL3Y3K2ZuTHlQakN3ZlJuWmZuVDBQSktTZmpHeFB2MjlQblkxL05iV3Z2MTgvYVVrL3JsNC9ydzd2bkt5UGFKaVBycjZmYWFtUFJ5Y2ZhTGl2djU5L0pKU1BydjdmTlZWUG5lM2ZydDYvTlFUL3Y2K1BlbHBQYWdudlIzZHZpNnVQdno4ZmV4ci9uT3pQZWdudnJrNHZSMWMvSkdSZnJxNlBuUXp2akN3UG5TMFBuWjEvdnc3dm5hMmZlb3AvZW1wZnJjMnZOVVUvaXhyL1I0ZHZXSmgvZXNxdkpIUnZ2eDcvcnk4Zk5TVWZOV1ZQakJ3UFY2ZWZhTWl2bmYzZmk4dXZXRGd2djQ5dnJwNlByeThQSlBUdmFZbC9uVDBmblcxUGVycWZSc2EvUnZidldBZi9WOWZQbms0dmkydGZSallmUmhYL3Z1N1BOWVYvSkZSUG5rNGZhSGhmYVhsdnYzOWZyaDMvaTd1dm5OeS9uT3kvcnM2dmVycXZSZ1h2bmQyL2FHaFBXUmtQVi9mZnJpNFByajRQaXdyZm5MeWZhVWt2UmZYZkpOVFBqRncvZXlzZlJsWS9SeGNQdnY3ZmV6c3ZpMHN2djI4L2FibXZlcXFQZXBxUEpNUy9leXNQV09qZk5kWFBSemN2djA4dlJ1YmZybzV2ZWlvZmVsby9OWldQbloyUE5wYVBuVTB2UmZYdm5IeGZpdXJQakF2L25RemZybjVmbmMyL2Uwc3ZhZG5QZTR0L2FTa2ZOWFZ2Um1aUGV0cXZuWTF2aTh1L2Vpb1BpdHEvaS92ZlJ3Yi9SMWRQbmUzUGFlbmZhY212ZTN0dm5Sei9yajRmYVhsZlYrZlBXRmhQSkxTdmFOaS9XTWpQUjBjL2FWay9XUGovYWRtL3JwNS9uSXh2Um9adlJpWWZqRHd2YVZsUEpPVGZlMnRmTnFhZkpSVVBla292YWFtZk5hV2ZWOGV2bmQzUG5OelBuVjFQZXNxL2pFdy9WNmVQUjNkL25nM3ZydzdmYVdsUGVucGZhZm5mV1Bqdml3cnZOV1Zmbk15dmk2dWZWL2Z2VjllL25iMnZydTYvUmtZdmpBdnZuSXhmUmlZUGk5dlBlZ24vVjdlZmVqb2ZlMXRQV0NnZnJtNVBKSVIvbmMydk5jVy9KUVQvakZ4UHZ5OFBXRGdmV0JmL1JzYlBWNWQvTnBhZk5jWFBuZjN2YUlodlJ2Yi9pdnJmblgxdk5SVWZhS2lmUnRiUGFabC9OZVhQZTV1UFdDZ1BScmF2YUloL05vWi9uSngvV0ZnL2k5dS9SMmRmakh4dmpJeHZOVFV2aS92dmUxcy9OZVhRQUFBQUFBQUFBQUFBQUFBQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRRWxnQUFBQ3dBQUFBQVpBQ1dBQUFJL2dBQkNCeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGlseElZRVNBQUNNSWpGeHBVSVdEQUE1VWVGakk0dVRKQkN4ekNzeGhrOGlRaFRadDZzeXB3YWFHREFzSEJPVXhsT1VMSkNXUXZLaXhjQU9EQVFNWWJHaTZVa0dQR2owVUdPQkt0cXpaczJqVHFsM0x0cU1DRTAxTWlLMUtZc1FJRWxzN2ZtRkNhOUVXRjRrUWhDaVRRb1VJVFV6U2ZPeVFna1dLRGtHU0x0V29BOWl1WlVFemF3NGdCWnFWSWh0UjJFU0JVNkZtakRRT0Nkbk1lak1DTFJNeUxyQzU0QUxOb0tVcGpuSFJ1bmZyVHZVdW5wbTk0TUVma2dNY1hCaWdjdUlsM3I2anN6NmpvS0lKQ1I0a21OZ3hFa01qM3lYby9ta0NKYWlXQlRWZjlGaVpNNmxFYndTb1RyUTl5RXNLNndxcVNPVnhLTU5Xa2plc3VkRGNmQUJjUXdkcmZWd2hBMFVXaElISVprTDBRcUFhSzJ6bWlRODNaQVRGRVpvVk1oOEd5bWlHQUNVV2NFVEZGUWdFOVVCRUJtQ2dBQVpqTVVRQUNTUU1xSkFNWldqbWdtSWZmWkhBU1F1VUVoRUVJandoQWdRMkhtUkRVRFlzcEFaMFFkMVJZa2duaU1GQUZCTEZZRk1NUUN6MGtrMjJKWFRDZzVtaFFaWWRWcEJqeDBKeTBCWm1RazRFVllWQ2RXVEdRVHBrRVZKVUFDNkFsdEFQTm1XaXdrSVFmSGtCQkFuMVlxY1ZaZmtScFVJK3hBRkVIRDRvMFJBQlNSYWtBNEJCaldKV0I1bkZocEFCVTBReFJZd1kzWkdaTG1mbHNacE4vbVZNdVZJYkhBU1ZoYXhsTVpMWktUbWxFQlFIc2FSMVFvZzI5U0hmU0tWa1pzWmE2bVJHZ1VZVGlHcFFBVUc5NGVkQ09wZ1VnaGV2Z0xSRlVDNGN0QVFESGpDd0JIY0tGWHFTQTRnU3hFZVpEdWtUMURLT0hNdVJIa0ZwY0pCTE1NbTBVSncyelVrUUhFRjFnZXBDZTJqbVN6SWVOV05UT3dmeGRKSlBYZ2IxSmdBV2hCQVVNQSsxbGdJekhKMVF4eGFickduUW5nRWN0ZENTTmlWQmtEZEJWWEF0UTdXeXhnRW5qK1QwVkZSVHljZ0FBMGtTYkZNckVGWGcyeDZVbUN5U1YyRE5SVkVXUVRINmtOSFJwVElLRlFRYWhFRm1HQlFkVkNHNXRBYUdHeGo5c1VBRmpIeUVURkJsUlBUcVNTOEFFRVlmclJWQ1NFVnVCTVdIL2tlYkJBV0MyMEhWSVpBb3dtaThXUVVpNEROUm5UYjU0ZEYzTnFVTkVSWkIwVUhRSTV6VXJCa09jK0RhVU44MkhVUFFXMHpRNEhSQ0JDZ1ZBSE1ERFJLVU94R2xhSlBsQmNYRElXc05oQUZSS0VFTlFoQmoyQndCMlcwMjVRYTFUWlpDSlB0SkxoOVVqVFd0U2ZLT1ErL2ExQUJCb3AxRUdsQ1pEUlJCVUt6RUhwUVhDVmt3aCtHYkhWTGRRbEVFSlFWQkVnZEFzVUtxbjhTVVFMUFpWRXRFK1o5RXZrSVlXSVRtTW9PRkRtQXRJWUNJR1VIdVFSeDd6RVFoVnNHS1ZnWkN0Wk1zQ0NJSnN3bXJHQUlKWDdFbUVqZjZGVUd1azUzdFVBUUhRY2xHUk5BWEFCQTZCQm51MFV3SUZKS0hvT0RBSTlrN1NSdFdHQlFYTnFRSi9tVFlUQVFVUW9DZ0pNSWppZ2hLT1hob2swbzBCQXBjYU0yekVvS0pvSURCSTJ1SVdrU1NhQk5hTEVRR2Q2aGdac2hBZzRXSUlTaXE4RWdsZ2tLQ2lEakNKaUVvUnZtTWdNTE40TUFJR1ZxSUlZTGl4SUcwNkVVSFE0aFY3REpCZ1p3aUtFU0xTQ2dzWVlpN0lXUU1NZFJNQmRpZ0E0ZDh5eVppSUFpUmpJUWt5ZGprZmdBUVJGQzRjVUNOZExBMVhJRENRMDZ3dkFCSUN3QmFPZ21YdUJlVWdkeUFjallSUkVTNllRbHpxSklnTW9EREFJTkNoakZFNUJKQlFRQ3UyZ1NraXgya0pzVWp5Q1ZQMHNhSDRNRW1DSkFqeGlUQVFodmlVU0tPc29rOENoTExBTXlTaUtwajNVQStnUnVJU0NJb3dnQUFFeUtabVVsV2NpSjAvclBKRlFxeXlTTmw2aUh0Q3dxV0hJS3lBQmpEZzV0SlpVVW04S3VjRWVTUE1Mb0lsQUt3TElkMFFUckZ2TWdoZ3NJRmtWd1RqdHF3cUcvdW1NZUtRQ0l6UGhDSktGajRQNFo4N3o2VXpFZ1diV0t3a1lES0poVUluMHRabzlDTTBDQXpSc2pJakdwMEVCMzBMd0FwYUVpT3htaE1qVmlnQVVGcFFTQUZNb0VyZU9BS0UwQlhRbGgya2lZWlpCYVorUVJEMk9ETmttWWtHSm5KNUVIV3dKTWNyT0dCQ2ZuU1Nad3BFQU1rSXBrN1ZJZ2FkaEdBQmNEaG5odFJ3Z0J2WWErQ3hHOStjSklUUXFvWWxCTE1iQ2l5OEVSbTlvYVFIRzR2WFlacTEwSElHcFJ0a0tVSWdjZ01NUlRTZ1NQOFFIaVJZVWkwRm1LQmNXU0dGMDBwL2tMWWdxSUl6eFZFQVRRSWd1bW1XaEZtWkFZUFE1SEJMVElUQWg1eEpSYVpZWWRPMG5BOG5PckJMQWV5eVRsMHdvUnVCa0IzWnNsaEFOYkJFblRBUWpNY21PSkhWcXNRWkFZRkVBTVJCeXlrRUFFR21OVWlKNkFBcDRLQ0JZWTVCTGU2UFIxQzFBVVR6UnJFREwwVHlBM20wRXBmTk9FaUZoZ0dWRFhUaFZjeTVBV21QVUxQRkFLd2t3ak1JQ2V3ajAxY0FRQWxnSUUxSzhDRExDVHlEVE5vV0RPSXVPQkRVS1l5aGNnMUFIUVZDR050OGdWaURGT1NBbUNBRzlRZ3BtZkFneE9wYUEwQ05GSEtoeHoySndyaGFnQ2FaNUJGUlBXbDBqa0pCN0xnakVuTW9BUEJvTVlhQW9ITDNsQ0hJdno2aGI5SVFxTi9BdUFHZGV4Ti9qTXlFT1UyODhrV0ZobVhCOUJ3TG94SXd6ZWVlQzRBYUdBTU4vY21CVDBnRUFpRVRLS0NFR0FXSC9ielNUU1FoQzlrelFBWjFNd0k5cE9RTkh4aUVtQVFvMllXNElKamlHRVZoWjBQS0RhREF1dzZ4QUxoQU1jOGhvRUtDWkNDQ1c1QWI5WU9nb1o2bXFGYnN5NElSSGxyNkhSbXFnMFZETVFxY24wUUh4UkpCSlVpM2swTzRnZ2hDTUVWUlNiMlFBQjFFa0hSVWlqU2pnZ3oreHBqZ3RRdkFLRE10a1BLZWM2RURISUVoUlMzUS9yWlNYVi9aTmZ1anJlODUwM3Zlay9rM09tMmQwRklxQjJ0SXVUYjRkYjNRSWJUVndFY3h6VGRNNGdBSHNEd0I0aFhJUlJvK0FNR0lKQm9hT0hpV2docVFXQWdjWW1yb0FNZ2wwai8vbXFqN0FEa2hpQlFYbDFEdm8wVUFGRExKZ2RRdUhRaTBJbUhLOFN5Sno5STZrNml6b0o4KzNvN3RjbmZYQjZVbUJkRUFHN3V4QWNZd2hqSERPOGlGTWpNMGhYeUFha0w1T1VuTVRwQmtPN21DRXc5SVcrSmkzNHIwZ0svTFdUUU5tazUwV0V1Y3o4UHNTa1ZpcVpDZmlUMGdXQTlBRm9mQ05kUElvQ0NVR0FHQ1dobEFJYXVFd2trY3lHdC9QcmQ4eTZRdlFlZzd3ZjVRQ3ZmUHBTeTJ3UUdDWUZCVUNpLzlxeTNuZThKTVh4UXZvNlJvWnBaSUhFL3lRb1NrbnFWMjczb24zKzhRbHFKZVlRd0xTeThIb2lTdlhvUXpkdWtCUW14L0VrZXZ2allReDRoQ3o1SjdRK3lNNmxReGNVV20zMVFiQzZRcU51RTg1M0h1L0VWL3BMOEFDei9aRVpSTzBJcUhJQUxINFR1UEQvSXR5bE9rT0lmUFNqSFB3anRFM0prUW1WV0lUTUlDdEFMd21hYlNLQWc3cmQxOEJkNnpwSVFZVFptQzBGZWlEZDZCVkYxdnpjdHNQZCtOaEYvQlpGeTJGY1Fja1puL29ZUjZEZDRCWkYvTnJGNkFCaUJBamlCQnpFRDlDUjdaQUdDeTBZUUhmaC9JOGgyRW5nU0pTQnhrbEFDd29kTnBEY1VEbmdTQ0ZBUXl3TjhFQ2lESmVobU1GZ1cvYWQ4QXlGNkxSaURuamVEMG9FQU16QmVEcFlRYUtkNkE5RjZVemlFVDFpRXZvRUFLN0NEbzFJcXA4SVEvTVV1RE5HREFVQjVVUGFEQnhHQWVoZFZEVENIZEpnQkF2QjlEQkVwazVKc0ZLWllESkdFQWZBczF0ZUVUcWg5VUVpQi9oUkJiUUZnYmRBSEpnMXhoU29IaVZ2SWhZYm9oWWc0RWR0R2Nra1dGRXdHY1VHQkZJQ1lFSERZZUFPSUVlVFdKV1JHVkE2UmNnQ3dQT0pYaUl3SEFJNTNpUkxCYnFkbkVkL1dlb1JIaWJFNGl4a0JieDh4aUpvaGhxOUhoSEZvZ3VxV2NtbW5FS01vaTZVb2JvNVhkNkpJZ3NjSWV1ckdoTlBIak5SSWlzZzRGS256RWozWEVEbTRoZ3ZSakw2SUVmeG1RZ29CVFlUSUVLM25ldE5vak54b2pjSkJIQVozYlNjQkVSSkFoM05JZlFYUkNBa1FrQWxnQ0FZQkF2eTRpeFV4Y3QwMkVBQW5jQWFCYzFYQkFJU1VGdzQ1RU5PQUN5eUFDMzZRV2hVNUVWTXdBVTB3QVdYWWtTUlpraVo1a2g0UlFWbEJrUjI1RDAzUU5Ma25QQkFOV1pKZXdBSTg4M3dKY1JvbHlXS3ZhQkRzYUhJbVdYL294SE8zU0cvNVVCUWFZQWx3aFpJTVlRcUE4Z09tVUpSTU9aVlVXWlZXYVpVQkFRQWgrUVFCbGdBQUFDd0dBQVlBV1FDTEFJY3l6VEx4MFVYeHBVVHlYMFB5U0VQeVZrUHllVVR5Z2tUd3lFVHpUVVB4eWtYeWlrVHd4MFR4dGtYeVVVUHh0MFR4cmtYeHhrWHd2MFR5bUVUeWkwUHh1VVR5YWtQeHlFWHh4RVh5YUVQeHUwVHh6RVh4elVYeWtVVHhsRVR5VWtQeWowVHhoa1R4cEVUeWJrVHh0RVh4dzBYeW5FVHhna1R5VkVQeWUwVHlaVVB4b0VUeHNFVHllVVB5YkVQeHNrVHh1MFh5ZEVUeHJFVHljRVB5WjBQeHYwWHhlVVR4elVUeW1rVHhqMFR4azBQeVkwUHhya1R5alVUeHAwVHlXa1B5YVVQeGhFVHhvMFR4ZFVQeW9VVHlXRVB5Y2tQeHFVVHhxMFR4cWtUeWswUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJL2dBSFFBZ1FBTUlBQUFnVEtseklzS0hEaHhBalJoUndJY0FGQVFzZUVDVFlRS0xIanlCRE5sU3dVVUdKalJ0RnFsekpNbUdFalJGZ0NFQXBvcVhObXhFN2tLaEJva09MQkFjRUNEaVFBS2ZSb3dnTGpMQXhvZ0FCcEZDalNwMUt0YXJWcTFpemF0MEtzWUNGR1JhY0pxQUFBUUtGb2x5eGdtRHhnQVdJR0RNMzFreDdGY05HREExUUVxUjdsY1BHRFJjMGJ1ekl0Nm9Ndnh1UTVCZ2dBQUVEQVFjTFU3VVFZa0VJSUI4a2E5N011YlBuejZBL0UzQlF3TUZUQUFNb1VJZ2MrcWFCQ1NZbUdCamdBYVdIMWpjcmJLeXdBZ0ZLQnJodDN2akxRQUpLQ2NGYmF0aW9RWUFCM3dFWUdFak9NZ1VPSWpoUzdFQTRnRFYxbFFSUS92eEFjZnE3K2ZQbzA0UE9rRUU5U0JVbkZweFE4ZUU1UVFUVDNVK3NlSEdCOFkzSTZRY1JTUVNaQkIxQndBbjQwRXNFeFZUYlJqb28rSkJPUFBtRTJnRUhlQ2ZoUWtveDVkU0dJSVlvNG9na0t1U1ZFUzQ0eFJoQmtKVUl3Rm9WdlBDV1lCeTVhQmRCZU9rVmdJc0VCbUJTWEFUTlJXSVNpQjJ4QUZCQ0VlVWlaWlpoNXVLVFVFWXBaV0dqbGZZVVVHVXBXZUpyc2MwR1pBQkNqcWdiUWJ6cDZPSndCRzNBQUkwQkVFYmltQUh3dG1JQUxXNEptMndhUGxtbGFWUDI2ZWVmT0tXMjJwTTBCTEZBRURSODhDQkJ0NVhvQTBrSytMREFnZEh4V0ZJSi94RVVJSWszQm9DWGZkSGxSeUlJTDJnZ1l3d0lzUWRsQVM0TWtXSjUvb0RHS3V1c0M2bjZKS3V1T2dVcWZpNTJVT29MUG1VYXdLWWpNaGhBVEpRbVNHS1BKaTBhUUlRbFVtUVJScWlwbG1lSThNbEhINjNjZHV1dGlIcytOV2VkSktad3AzWnN1am5pY2dRMVoyYUphQWFnNXBkaGlnZ25iMWhDb0NXSlhPTFpaN2pmQml4d2lQbnVPeUtUSVZqd0FiMHVIaFlBQnpMazhDNkpmcVVaR0VycWl0Z3BYdU5ldStGYWJiM1ZwMWRnZlRqd3lTaWpKNmpIRzNiWUZBSE9Oa29paFQyMWtLeUx4c1lrTExFaU1sc0NxTks1S0cxL3FiYjNaTGJ6WlpieTBreTNacXVMNFkzMzFLNmlqbWdkZHRydDdDSzdBVFIzTTd6RU9RdnRtN3V0VU8yZ0x2WTcyNytrOGRuMDIzQVh4cGh2NUI1Y1djSWZwTnV3VVY4UVM2eVhpeFhMZXhGTk50N1ZRTUZva2RnRER3L3cwQU9xVTZKQXd3dzBrQmYzNVpoZmhlUlFpWTlZeEF3ZUVzQndpVW84VUdFTEV4Y0xFd3g2bCtoenh5NEs4VklFUWl6UTV3SExhWkJoUUFBaC9oVk5ZV1JsSUhkcGRHZ2dVMk55WldWdVZHOUhhV1lBT3c9PScgdGl0bGU9J+eCueWHu+WPs+S+p+WIl+ihqOi/m+ihjOino+aekCcgc3R5bGU9J3dpZHRoOjQwcHgnPiI7DQoNCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0ncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPiINCg0KICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19saW5lJz4iOw0KDQogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPGRpdj48dWwgY2xhc3M9J3pobV9wbGF5X3ZpZGVfbGluZV91bCc+IjsNCg0KICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9ICcnOw0KDQogICAgICAgICAgICAgICAgaWYoZ2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicpID09IGl0ZW0udXJsKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD0nemhtX2xpbmVfc2VsZWN0ZWQnOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9YDxsaSBjbGFzcz0ncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpICR7c2VsZWN0ZWR9JyB1cmw9JyR7aXRlbS51cmx9JyA+JHtpdGVtLm5hbWV9PC9saT5gOw0KDQogICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9kaXY+IjsNCg0KICAgICAgICAgICAgLy90ZW1wbGF0ZTpub2RlO+aSreaUvuWMuuWfnw0KDQogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsNCg0KICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsNCg0KICAgICAgICAgICAgLy/lvqrnjq/liKTmlq3mmK/lkKblnKjmkq3mlL7pobXvvIzmmK/liJnmiafooYzkuIvpnaINCiAgICAgICAgICAgIGxldCBqeFZpZGVvRGF0YSA9IFsNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9wbGF5XC5odG1sXD9jaWQ9LyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvcGxheVwuaHRtbFw/Y2lkXD0vLGFyZWFDbGFzc05hbWU6J3NsaWRlcl9ib3gnfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC9jb3ZlclwvLipodG1sLyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovaHR0cHM/OlwvXC9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD8uKmNpZC4qLyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixtYXRjaDovXmh0dHBzOlwvXC9tLmlxaXlpXC5jb21cL1t2d2FdXF8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnlvdWt1XC5jb21cL2FsaXBheV92aWRlb1wvaWRfLyxhcmVhQ2xhc3NOYW1lOicnfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfLyxhcmVhQ2xhc3NOYW1lOicnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllci1jb250YWluZXIiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLmJpbGliaWxpXC5jb21cL2Jhbmd1bWkvLGFyZWFDbGFzc05hbWU6J2VwLWxpc3QtcHJlLWJvZHknfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii52aWRlby1hcmVhIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5tZ3R2XC5jb21cL2IvLGFyZWFDbGFzc05hbWU6J2NsZWFyZml4J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC5sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J3NpZGVzbGlwX3NsaWRlJ30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXkvLGFyZWFDbGFzc05hbWU6J2p1amknfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovcGxheVwudHVkb3VcLmNvbVwvdl9zaG93XC9pZF8vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3ZvZFBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC4xOTA1LmNvbVwvdm9kXC9wbGF5XC8vfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIC8v5Yib5bu6bG9nb19pY29uDQogICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobUljb24nKTsNCg0KICAgICAgICAgICAgemhtUGxheS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7DQoNCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7DQoNCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICBsZXQganhWaWRlb1dlYiA9IGp4VmlkZW9EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsNCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICBpZihqeFZpZGVvV2ViLmxlbmd0aCA9PSAwKXsNCg0KICAgICAgICAgICAgICAgICAgICB0b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7DQoNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0ganhWaWRlb1dlYlswXTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtX3BsYXlfdmlkZW9fd3JhcCcpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5U2hvdyA9IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXk7DQoNCiAgICAgICAgICAgICAgICAgICAgcGxheVNob3cgPT0gJ25vbmUnPyBwbGF5TGluZURpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzpwbGF5TGluZURpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicsdGhpcy5nZXRBdHRyaWJ1dGUoJ3VybCcpLDMwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vd1dlYk5vZGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1dlYk5vZGUuaW5uZXJIVE1MID0gcGxheUp4SHRtbDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlmcmFtZS5zcmM9IGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2p4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmlkZW9TZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGg+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS50YXJnZXQucGFyZW50Tm9kZS5ocmVmKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSwxMDAwKQ0KDQogICAgICAgIH0NCg0KICAgICAgICBwbGF5VmlkZW9GdW5jKCk7DQoNCiAgICB9ZWxzZXsNCiAgICAgICAgLyotLWNvbmZpZy0tKi8NCiAgICAgICAgdmFyIENvbmZpZyA9ew0KDQogICAgICAgIGNvdXBvblVybDp3aW5kb3cubG9jYXRpb24uaHJlZiwNCg0KICAgICAgICBjb3Vwb25Ib3N0OndpbmRvdy5sb2NhdGlvbi5ob3N0LA0KDQogICAgICAgIHdlYlVybDonaHR0cDovL211c2ljLmxpdXpoaWppbi5jbi8nLA0KDQogICAgICAgIGljb25WaXBUb3A6MzYwLA0KDQogICAgICAgIGljb25WaXBQb3NpdGlvbiA6ICdsZWZ0JywNCg0KICAgICAgICBpY29uVmlwV2lkdGggOiA0MCwNCg0KICAgICAgICBjb3Vwb25UaW1lck51bSA6IDEwMCwvLzEwMOasoeetieS6jjEw56eSDQoNCiAgICAgICAgY291cG9uV2FpdFRpbWUgOiAxMDAsDQoNCiAgICAgICAgaWNvbldhaXRUaW1lIDogMTAwLA0KDQogICAgICAgIGljb25WaXBPcGFjaXR5OjEwMCwNCg0KICAgICAgICBzZWxlY3RlZExlZnQ6J3NlbGVjdGVkJywNCg0KICAgICAgICBzZWxlY3RlZFJpZ2h0OicnLA0KDQogICAgICAgIHZpZGVvUGxheUxpbmVBZGQ6R01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnLDApLA0KDQogICAgICAgIGR5VmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgnZHlWaWRlb0Rvd25sb2FkJywyMiksDQoNCiAgICAgICAga3NWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCdrc1ZpZGVvRG93bmxvYWQnLDIyKSwNCg0KICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ3hpZ3VhVmlkZW9Eb3dubG9hZCcsMjIpLA0KDQogICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCdiaWxpVmlkZW9Eb3dubG9hZCcsMjIpLA0KDQogICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCd5b3V0dWJlVmlkZW9Eb3dubG9hZCcsMjIpLA0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHtjb3Vwb25VcmwsDQogICAgICAgICAgICBjb3Vwb25Ib3N0LA0KICAgICAgICAgICAgd2ViVXJsLA0KICAgICAgICAgICAgaWNvblZpcFRvcCwNCiAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiwNCiAgICAgICAgICAgIGljb25WaXBXaWR0aCwNCiAgICAgICAgICAgIGljb25WaXBPcGFjaXR5LA0KICAgICAgICAgICAgY291cG9uVGltZXJOdW0sDQogICAgICAgICAgICBjb3Vwb25XYWl0VGltZSwNCiAgICAgICAgICAgIGljb25XYWl0VGltZSwNCiAgICAgICAgICAgIHNlbGVjdGVkTGVmdCwNCiAgICAgICAgICAgIHNlbGVjdGVkUmlnaHQsDQogICAgICAgICAgICB2aWRlb1BsYXlMaW5lQWRkLA0KICAgICAgICAgICAgZHlWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAga3NWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAgYmlsaVZpZGVvRG93bmxvYWQsDQogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZA0KICAgICAgICB9ID0gQ29uZmlnOw0KICAgICAgICAvKi0tbGFuZy0tKi8NCiAgICAgICAgdmFyIGxhbmcgPSB7DQogICAgICAgICAgICBzZXQ6J+iuvue9ricsDQogICAgICAgICAgICBpY29uUG9zaXRpb246J+Wbvuagh+S9jee9ricsDQogICAgICAgICAgICBwbGF5VmlkZW86J+inhumikeino+aekCcsDQogICAgICAgICAgICBwbGF5TXVzaWM6J+mfs+S5kOS4i+i9vScsDQogICAgICAgICAgICB6aE5pY2U6J+efpeS5juWinuW8uicsDQogICAgICAgICAgICB2aWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLA0KICAgICAgICAgICAgYmFpZHVEb3dubG9hZDon55m+5bqm5LiL6L29JywNCiAgICAgICAgICAgIGljb25IZWlnaHQ6J+Wbvuagh+mrmOW6picsDQogICAgICAgICAgICBpY29uV2lkdGg6J+Wbvuagh+Wkp+WwjycsDQogICAgICAgICAgICBpY29uTGluZTon5rC05bmz5L2N572uJywNCiAgICAgICAgICAgIGljb25XYWl0VGltZTon562J5b6F5pe26Ze0JywNCiAgICAgICAgICAgIGljb25MZWZ0OifpnaDlt6YnLA0KICAgICAgICAgICAgaWNvblJpZ2h0OifpnaDlj7MnLA0KICAgICAgICAgICAgdGlwSWNvbkhlaWdodDon6buY6K6kMzYwLOW7uuiurjF+NTAwJywNCiAgICAgICAgICAgIHRpcEljb25XaWR0aDon6buY6K6kNDAs5bu66K6uMjB+NTAnLA0KICAgICAgICAgICAgdGlwSWNvbk9wYWNpdHk6J+ivt+Whq+WGmTAtMTAw55qE5pW05pWwJywNCiAgICAgICAgICAgIHRpcEVycm9ySWNvbkhlaWdodDonPOWbvuagh+S9jee9rj7kuK3nmoQ85Zu+5qCH6auY5bqmPuW6lOS4ujEwMDDku6XlhoXmraPmlbTmlbDvvIzlu7rorq4xfjUwMCcsDQogICAgICAgICAgICB0aXBFcnJvckljb25XaWR0aDonPOWbvuagh+S9jee9rj7kuK3nmoQ85Zu+5qCH5aSn5bCPPuW6lOS4ujEwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjIwfjUwJywNCiAgICAgICAgICAgIHRpcEVycm9ySWNvbk9wYWNpdHk6J+Whq+WGmeaVsOWtl+S4jeato+ehricsDQogICAgICAgICAgICBzZXRQbGF5VmlkZW86J+ino+aekOiuvue9ricsDQogICAgICAgICAgICBwbGF5VmlkZW9MaW5lQWRkOifnq5nlpJbop6PmnpAnLA0KICAgICAgICAgICAgdGlwUGxheVZpZGVvTGluZUFkZDon6K+35aGr5YWl57q/6Lev5ZCN56ew5ZKM5Zyw5Z2A77yM5Lit6Ze055So5Y2K6KeS6YCX5Y+36ZqU5byA77yM5q+P57q/6Lev5LiA6KGM44CCJywNCiAgICAgICAgICAgIHpoU2V0Oifnn6XkuY7orr7nva4nLA0KICAgICAgICAgICAgemhWaWRlb0Nsb3NlOiflsY/olL3op4bpopEnLA0KICAgICAgICAgICAgemhWaWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLA0KICAgICAgICAgICAgemhBRENsb3NlOiflsY/olL3lub/lkYonLA0KICAgICAgICAgICAgemhDbG9zZUxlZnQ6J+WFs+mXreS+p+i+ueagjycsDQogICAgICAgICAgICB6aENoYW5nZUxpbms6J+mTvuaOpeebtOaOpei3s+i9rCcsDQogICAgICAgICAgICBzcGVjaWFsQ29sdW1uOifmoIforrDmlofnq6AnLA0KICAgICAgICAgICAgdmlkZW9UaXRsZTon5qCH6K6w6KeG6aKRJywNCiAgICAgICAgICAgIHpoS2V5d29yZENsb3NlOiflsY/olL3lhbPplK7or40nLA0KICAgICAgICAgICAgdGlwS2V5d29yZDon6K+36L6T5YWl5YWz6ZSu6K+NLOeUqCIsIuWPt+malOW8gCcsDQogICAgICAgICAgICBhdXRob3JOYW1lQ2xvc2U6J+Wxj+iUveeUqOaItycsDQogICAgICAgICAgICB0aXBBdXRob3JOYW1lOifor7fovpPlhaXnlKjmiLflkI0s55SoIiwi5Y+36ZqU5byAJywNCiAgICAgICAgICAgIHlhbnh1YW5DbG9zZTon5bGP6JS955uQ6YCJJywNCiAgICAgICAgICAgIGR5VmlkZW9Eb3dubG9hZDon5oqW6Z+z5LiL6L29JywNCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZDon5b+r5omL5LiL6L29JywNCiAgICAgICAgICAgIHhpZ3VhVmlkZW9Eb3dubG9hZDon6KW/55Oc5LiL6L29JywNCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkOidC56uZIChiaWxpYmlsaSkg5LiL6L29JywNCiAgICAgICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkOid5b3V0dWJl5LiL6L29JywNCiAgICAgICAgfTsNCg0KICAgICAgICAvKi0tZGF0YXMtLSovDQogICAgICAgIHZhciBkYXRhcyA9IHsNCg0KICAgICAgICAgICAgZ2V0Q291cG9uOlt7aXNPcGVuOjIyLHdlYjpbDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRhb2JhbyIsbm9kZToiLkpfTGlua0FkZCIsbWF0Y2g6L2l0ZW1cLnRhb2Jhb1wuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsQ2Fvc2hpIixub2RlOiIjSl9MaW5rQnV5IixtYXRjaDovXmh0dHBzPzpcL1wvY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tXC8vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGxDYW9zaGkiLG5vZGU6Ii5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNyIsbWF0Y2g6L15odHRwcz86XC9cL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbVwvL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsIixub2RlOiIuQmFzaWNDb250ZW50LS1hY3Rpb25zLS0xY284c3g4IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsIixub2RlOiIjSl9MaW5rQnV5IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsT3RoZXIiLG5vZGU6Ii50bS1tc2ctYm94IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsIixub2RlOiIuQmFzaWNDb250ZW50LS1hY3Rpb25zLS0xY284c3g4IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuaGsvfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L2l0ZW1cLmpkXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L1wueWl5YW9qZFwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6ImpkIixub2RlOiIjY2hvb3NlLWJ0bnMiLG1hdGNoOi9ucGNpdGVtXC5qZFwuaGsvfSwNCiAgICAgICAgICAgIF19XSwNCiAgICAgICAgICAgIGp4VmlkZW86W3tpc09wZW46R01fZ2V0VmFsdWUoJ21vdmllTGlzdCcsJzIyJyksd2ViOlsNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6L2h0dHBzPzpcL1wvdlwucXFcLmNvbS8sbmFtZToncXFQQyd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbS8sbmFtZToncXFNb2JpbGUnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXFpeWlcLmNvbS8sbmFtZTonaXFpeWlQYyd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXFcLmNvbS99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM/OlwvXC9tLmlxaXlpXC5jb20vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL2FsaXBheV92aWRlb1wvaWRfL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvLip5b3VrdVwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmJpbGliaWxpXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC9tXC5iaWxpYmlsaVwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii52aWRlby1hcmVhIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5tZ3R2XC5jb21cL2IvfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9tZ3R2XC5jb20vLGFyZWFDbGFzc05hbWU6J2VwaXNvZGUtaXRlbXMgY2xlYXJmaXgnfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovLnR2XC5zb2h1XC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbS99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovdHVkb3VcLmNvbS99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9sZVwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6L3BwdHZcLmNvbS99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi8xOTA1XC5jb20vfSwNCg0KICAgICAgICAgICAgXX1dLA0KDQogICAgICAgICAgICBqeE11c2ljOlt7aXNPcGVuOkdNX2dldFZhbHVlKCdtdXNpY0xpc3QnLCcyMicpLHdlYjpbDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J25ldGVhc2UnLG1hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb20vLHRpcDon6K+35Zyo6Z+z5LmQ5Y2V5puy6aG154K55Ye75Zu+5qCH5LiL6L29J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZToncXEnLG1hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOWcqOaSreaUvumhteeCueWHu+Wbvuagh+S4i+i9vSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J2t1Z291JyxtYXRjaDova3Vnb3VcLmNvbS8sdGlwOifor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29Iid9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J2t1d28nLG1hdGNoOi9rdXdvXC5jbi8sdGlwOifor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29Iid9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J3hpbWFsYXlhJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30NCiAgICAgICAgICAgIF19XSwNCg0KICAgICAgICAgICAgcGxheUxpbmU6Ww0KICAgICAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL2ltMTkwNy50b3AvP2p4PSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi54ix6LGGIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiQkwiLCJ1cmwiOiJodHRwczovL3ZpcC5ibGppZXguY29tLz92PSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Yaw6LGGIiwidXJsIjoiaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IueZvuWfnyIsInVybCI6Imh0dHBzOi8vanguNjE4Zy5jb20vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IkNLIiwidXJsIjoiaHR0cHM6Ly93d3cuY2twbGF5ZXIudmlwL2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6ImNrbW92IiwidXJsIjoiaHR0cHM6Ly93d3cuY2ttb3YudmlwL2FwaS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiSDgiLCJ1cmwiOiJodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiSlkiLCJ1cmwiOiJodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QIiwidXJsIjoiaHR0cHM6Ly9ja21vdi5jY3lqamQuY29tL2NrbW92Lz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLop6PmnpBsYSIsInVybCI6Imh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLogIHmnb8iLCJ1cmwiOiJodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Ik1BTyIsInVybCI6Imh0dHBzOi8vd3d3Lm10b3N6LmNvbS9tM3U4LnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJNM1U4IiwidXJsIjoiaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLor7rorq8iLCJ1cmwiOiJodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Ik9LIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9IiwibW9iaWxlIjoxfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJQTSIsInVybCI6Imh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnm5jlj6QiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkuIPlk6UiLCJ1cmwiOiJodHRwczovL2p4Lm5ueHYuY24vdHYucGhwP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IlJESEsiLCJ1cmwiOiJodHRwczovL2p4LnJkaGsubmV0Lz92PSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Lq65Lq66L+3IiwidXJsIjoiaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuaAneS6kSIsInVybCI6Imh0dHBzOi8vanguYXAycC5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5oCd5Y+kMyIsInVybCI6Imh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Iue7tOWkmiIsInVybCI6Imh0dHBzOi8vanguaXZpdG8uY24vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuiZvuexsyIsInVybCI6Imh0dHBzOi8vangueG1mbHYuY29tLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5LqR56uvIiwidXJsIjoiaHR0cHM6Ly9zYi41Z3Nlby5uZXQvP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuS6keaekCIsInVybCI6Imh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMDUyMyIsInVybCI6Imh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTfkupEiLCJ1cmwiOiJodHRwczovL3d3dy4xNzE3eXVuLmNvbS9qeC90eS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTgwIiwidXJsIjoiaHR0cHM6Ly9qeC4wMDAxODAudG9wL2p4Lz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI0SyIsInVybCI6Imh0dHBzOi8vanguNGtkdi5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IjgwOTAiLCJ1cmwiOiJodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPSIsIm1vYmlsZSI6MH0NCiAgICAgICAgICAgIF0sDQoNCiAgICAgICAgICAgIHpoTmljZTpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnemhpaHVMaXN0JywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonemhOaWNlJyxtYXRjaDovXmh0dHBzPzpcL1wvW2Etel0rXC56aGlodVwuY29tL30NCiAgICAgICAgICAgIF19XSwNCiAgICAgICAgICAgIHRhb2Jhbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgndGFvYmFvJywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondGFvYmFvU2VhcmNoJyxtYXRjaDovXmh0dHBzPzpcL1wvc1wudGFvYmFvXC5jb21cL3NlYXJjaFw/LisvfQ0KICAgICAgICAgICAgXX1dLA0KDQogICAgICAgICAgICB2aWRlb0Rvd25sb2FkOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd2aWRlb0Rvd25sb2FkTGlzdCcsJzIyJyksd2ViOlsNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz8uKyQvLGlzV2ViT3BlbjpkeVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTona3NWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5rdWFpc2hvdVwuY29tXC8/LiskLyxpc1dlYk9wZW46a3NWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneGlndWFWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5peGlndWFcLmNvbVwvWzAtOV0rXD8uKyQvLGlzV2ViT3Blbjp4aWd1YVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneGlndWFWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5peGlndWFcLmNvbVwvLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2JpbGlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5iaWxpYmlsaVwuY29tXC8vLGlzV2ViT3BlbjpiaWxpVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOid5b3V0dWJlVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wueW91dHViZVwuY29tLyxpc1dlYk9wZW46eW91dHViZVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgXX1dLA0KDQogICAgICAgICAgICBiYWlkdTpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnYmFpZHVMaXN0JywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonYmFpZHUnLG1hdGNoOi9odHRwcz86XC9cL3BhblwuYmFpZHVcLmNvbS99DQogICAgICAgICAgICBdfV0sDQoNCiAgICAgICAgICAgIGtleUNvZGU6Ww0KICAgICAgICAgICAgICAgIHtjb2RlOjQ4LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzAnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo0OCxpc1NoaWZ0OnRydWUsdmFsdWU6JyknfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OmZhbHNlLHZhbHVlOicxJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NDksaXNTaGlmdDp0cnVlLHZhbHVlOichJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonQCd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjUxLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzMnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1MSxpc1NoaWZ0OnRydWUsdmFsdWU6JyMnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OmZhbHNlLHZhbHVlOic0J30sDQogICAgICAgICAgICAgICAge2NvZGU6NTIsaXNTaGlmdDp0cnVlLHZhbHVlOickJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNSd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonJSd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU0LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzYnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1NCxpc1NoaWZ0OnRydWUsdmFsdWU6J14nfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OmZhbHNlLHZhbHVlOic3J30sDQogICAgICAgICAgICAgICAge2NvZGU6NTUsaXNTaGlmdDp0cnVlLHZhbHVlOicmJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOCd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonKid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU3LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzknfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1Nyxpc1NoaWZ0OnRydWUsdmFsdWU6JygnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OmZhbHNlLHZhbHVlOidmJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NzAsaXNTaGlmdDp0cnVlLHZhbHVlOidGJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonaid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonSid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjc1LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2snfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3NSxpc1NoaWZ0OnRydWUsdmFsdWU6J0snfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OmZhbHNlLHZhbHVlOidsJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NzYsaXNTaGlmdDp0cnVlLHZhbHVlOidMJ30sDQogICAgICAgICAgICBdLA0KDQogICAgICAgICAgICBkb3dubG9hZE9wdGlvbjpbe25hbWU6J+ebtOaOpeS4i+i9vScsaWQ6J3RvRG93bmxvYWQnfSx7bmFtZTon5aSN5Yi26ZO+5o6lJyxpZDondG9Db3B5J30se25hbWU6J+aJk+W8gOaWh+S7ticsaWQ6J3RvTGluayd9XQ0KDQogICAgICAgIH0NCg0KICAgICAgICB2YXIge2dldENvdXBvbixqeFZpZGVvLGp4TXVzaWMscGxheUxpbmUsemhOaWNlLHRhb2Jhbyx2aWRlb0Rvd25sb2FkLGtleUNvZGUsZG93bmxvYWRPcHRpb24sYmFpZHV9ID0gZGF0YXM7DQoNCiAgICAgICAgLyotLUNsYXNzLS0qLw0KICAgICAgICBjbGFzcyBCYXNlQ2xhc3N7DQoNCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7DQoNCiAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uU2V0UGFnZScpICE9IDApew0KDQogICAgICAgICAgICAgICAgICAgIGljb25WaXBUb3AgPSBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpIHx8IEdNX2dldFZhbHVlKCdpY29uVG9wJykgPT0gMD9HTV9nZXRWYWx1ZSgnaWNvblRvcCcpOmljb25WaXBUb3A7DQoNCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcFBvc2l0aW9uID0gR01fZ2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicpP0dNX2dldFZhbHVlKCdpY29uUG9zaXRpb24nKTppY29uVmlwUG9zaXRpb247DQoNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsNCg0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJpZ2h0ID0gaWNvblZpcFBvc2l0aW9uPT0ncmlnaHQnPydzZWxlY3RlZCc6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcFdpZHRoID0gR01fZ2V0VmFsdWUoJ2ljb25XaWR0aCcpP0dNX2dldFZhbHVlKCdpY29uV2lkdGgnKTppY29uVmlwV2lkdGg7DQoNCiAgICAgICAgICAgICAgICAgICAgaWNvbldhaXRUaW1lID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpP0dNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKSoxMDAwOmljb25XYWl0VGltZTsNCg0KICAgICAgICAgICAgICAgICAgICBpY29uVmlwT3BhY2l0eSA9IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpIHx8IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25PcGFjaXR5Jyk6aWNvblZpcE9wYWNpdHk7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLorr7nva4iLCAoKSA9PiB0aGlzLm1lbnVTZXQoKSk7DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbWVudVNldCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGxldCBtZW51U2V0U3R5bGUgPSBgDQogICAgICAgICAgICAgICAgICAgICAgICAuemhtTWFza3sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk5OTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkO3RvcDogMDtyaWdodDogMDtib3R0b206IDA7bGVmdDogMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuODsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC53cmFwLWJveHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7O3RvcDogNTAlO2xlZnQ6IDUwJTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtMjAwcHgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU1NTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzpoaWRkZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDoxNnB4IG51bUZvbnQsUGluZ0ZhbmdTQy1SZWd1bGFyLFRhaG9tYSxNaWNyb3NvZnQgWWFoZWksc2Fucy1zZXJpZiAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjQwMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBIZWFkew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MztoZWlnaHQ6NDBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjQwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcExpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcExpIGxpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMnB4IDIwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcExpQ29udGVudHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBTYXZlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDotMnB4O3JpZ2h0OjEwcHg7Zm9udC1zaXplOjI0cHg7Y3Vyc29yOnBvaW50ZXINCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O3BhZGRpbmc6MTBweCAyMHB4O3dpZHRoOjEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDk7YmFja2dyb3VuZDojZmVmOWVmOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgbGl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggMnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpIGxpIGF7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IzU1NTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpIGE6aG92ZXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZTZkNzM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiNmZmY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFVsSGVhZHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUhlYWR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDo0MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmU2ZDczOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlTGl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpIGxpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo4cHggMjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4O2JhY2tncm91bmQ6I2ZmZjt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUlucHV0ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2VMaXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDozMDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2VDb250ZW50ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLmNpcmN1bGFyew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA0MHB4O2hlaWdodDogMjBweDtib3JkZXItcmFkaXVzOiAxNnB4O3RyYW5zaXRpb246IC4zcztjdXJzb3I6IHBvaW50ZXI7Ym94LXNoYWRvdzogMCAwIDNweCAjOTk5IGluc2V0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnJvdW5kLWJ1dHRvbnsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjBweDtoZWlnaHQ6IDIwcHg7O2JvcmRlci1yYWRpdXM6IDUwJTtib3gtc2hhZG93OiAwIDFweCA1cHggcmdiYSgwLDAsMCwuNSk7dHJhbnNpdGlvbjogLjNzO3Bvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5iYWNrew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogc29saWQgI0ZGRjsgYm9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAzcHg7dHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTsgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTttYXJnaW4tbGVmdDoxMHB4O2N1cnNvcjpwb2ludGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvLXJpZ2h0ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjIwcHg7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogM3B4O3RyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtjdXJzb3I6cG9pbnRlcjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRTYXZlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToyNHB4O2N1cnNvcjpwb2ludGVyO21hcmdpbi1yaWdodDo1cHg7bWFyZ2luLWJvdHRvbTo0cHg7Y29sb3I6I0ZGRjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDowcHg7bGVmdDozMDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiNmZmY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2hlYWRlcnsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDo0MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6I2ZmZjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2NvbnRlbnR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAyODBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA6IDBweDsgIC8q6auY5a695YiG5Yir5a+55bqU5qiq56uW5rua5Yqo5p2h55qE5bC65a+4Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i5bCP5pa55Z2XKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzICAgOiAycHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlNmQ3MzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i6L2o6YGTKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3QgbGl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMnB4IDIwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOm5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGwgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHmlbTkvZPmoLflvI8qLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMXB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1cyAgIDogMnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i6L2o6YGTKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvKi1mb3JtLSovDQogICAgICAgICAgICAgICAgICAgICAgICA6cm9vdCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1iYXNlLWNvbG9yOiAjNDM0YTU2Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2hpdGUtY29sb3ItcHJpbWFyeTogI2Y3ZjhmODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXNlY29uZGFyeTogI2ZlZmVmZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3ItcHJpbWFyeTogI2MyYzJjMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3Itc2Vjb25kYXJ5OiAjYzJjMmMyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci10ZXJ0aWFyeTogIzY3NmY3OTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWFjdGl2ZS1jb2xvcjogIzIyN2M5ZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXZhbGlkLWNvbG9yOiAjYzJjMmMyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1jb2xvcjogI2Y3MmY0NzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWludmFsaWQtaWNvbjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwd2lkdGglM0QlMjIyNCUyMiUyMGhlaWdodCUzRCUyMjI0JTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMjQlMjAyNCUyMiUzRSUyMCUzQ3BhdGglMjBkJTNEJTIyTTEzLjQxJTIwMTJsNC4zLTQuMjlhMSUyMDElMjAwJTIwMSUyMDAtMS40Mi0xLjQyTDEyJTIwMTAuNTlsLTQuMjktNC4zYTElMjAxJTIwMCUyMDAlMjAwLTEuNDIlMjAxLjQybDQuMyUyMDQuMjktNC4zJTIwNC4yOWExJTIwMSUyMDAlMjAwJTIwMCUyMDAlMjAxLjQyJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMGw0LjI5LTQuMyUyMDQuMjklMjA0LjNhMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMCUyMDElMjAxJTIwMCUyMDAlMjAwJTIwMC0xLjQyeiUyMiUyMGZpbGwlM0QlMjIlMjNmNzJmNDclMjIlMjAlMkYlM0UlM0MlMkZzdmclM0UiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEuN2VtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAycHggMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo1NSU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTo6LW1vei1wbGFjZWhvbGRlciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjpwbGFjZWhvbGRlciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICosIDo6YWZ0ZXIsIDo6YmVmb3JlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaXRpYWwgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWRdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OmZvY3VzIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMC41ZW0gY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxLjVlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdICsgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW52YWxpZC1pY29uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjVzIGVhc2Utb3V0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjkwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveDo6YWZ0ZXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiA2cHggNHB4IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvIDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtNzJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxLjdlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoMWVtICsgMTZweCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE0MCU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0taW52YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keS5mb2N1cy12aXNpYmxlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogaW5oZXJpdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6b25seS1jaGlsZCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogdmVydGljYWw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6Zm9jdXMgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWN0aXZlLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW52YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWEgLl9kdW1teS1ib3ggew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjQwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xlZnRNb3Zlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjptb3ZlVG9MZWZ0IDAuNXMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9MZWZ0ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MjAwcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9MZWZ0IC8qU2FmYXJpIGFuZCBDaHJvbWUqL3sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAudG9SaWdodE1vdmV7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgbW92ZVRvUmlnaHR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMDBweDt9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9SaWdodCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMHB4O30NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYDsNCg0KICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtZW51U2V0U3R5bGUpKTsNCg0KICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICAgICAgdmFyIHNldExpc3RKc29uPSBbDQogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcuaWNvblBvc2l0aW9uLCdzZXRMaXN0SUQnOidpY29uUG9zaXRpb25TZXRQYWdlJywnc2V0UGFnZUlEJzonbW92aWVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LA0KICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnBsYXlWaWRlbywnc2V0TGlzdElEJzonbW92aWVMaXN0Jywnc2V0UGFnZUlEJzonbW92aWVWaWRlb1NldFBhZ2UnLCd0YWtlUGxhY2UnOicwcHgnfSwNCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5wbGF5TXVzaWMsJ3NldExpc3RJRCc6J211c2ljTGlzdCcsJ3NldFBhZ2VJRCc6JycsJ3Rha2VQbGFjZSc6JzBweCd9LA0KICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnpoTmljZSwnc2V0TGlzdElEJzonemhpaHVMaXN0Jywnc2V0UGFnZUlEJzonemhpaHVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LA0KICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnZpZGVvRG93bmxvYWQsJ3NldExpc3RJRCc6J3ZpZGVvRG93bmxvYWRMaXN0Jywnc2V0UGFnZUlEJzondmlkZW9Eb3dubG9hZFNldFBhZ2UnLCd0YWtlUGxhY2UnOicwcHgnfSwNCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5iYWlkdURvd25sb2FkLCdzZXRMaXN0SUQnOidiYWlkdUxpc3QnLCdzZXRQYWdlSUQnOicnLCd0YWtlUGxhY2UnOicwcHgnfSwNCiAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgdmFyIHpoaWh1T3B0aW9uSnNvbiA9IFsNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9DbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVWaWRlbycsJ2RlZmF1bHQnOicwJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aFZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonZG93bmxvYWRWaWRlbycsJ2RlZmF1bHQnOicyMid9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhBRENsb3NlLCdvcHRpb25JRCc6J3JlbW92ZUFEJywnZGVmYXVsdCc6JzIyJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENsb3NlTGVmdCwnb3B0aW9uSUQnOidyZW1vdmVSaWdodCcsJ2RlZmF1bHQnOicwJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENoYW5nZUxpbmssJ29wdGlvbklEJzonY2hhbmdlTGluaycsJ2RlZmF1bHQnOicyMid9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuc3BlY2lhbENvbHVtbiwnb3B0aW9uSUQnOidzcGVjaWFsQ29sdW1uJywnZGVmYXVsdCc6MjJ9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcudmlkZW9UaXRsZSwnb3B0aW9uSUQnOid2aWRlb1RpdGxlJywnZGVmYXVsdCc6MjJ9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhLZXl3b3JkQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlS2V5d29yZCcsJ2RlZmF1bHQnOicwJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5hdXRob3JOYW1lQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlQXV0aG9yTmFtZScsJ2RlZmF1bHQnOicyMid9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueWFueHVhbkNsb3NlLCdvcHRpb25JRCc6J3JlbW92ZVlhbnh1YW4nLCdkZWZhdWx0JzonMCd9DQogICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgIHZhciBwbGF5VmlkZW9PcHRpb25Kc29uID17DQogICAgICAgICAgICAgICAgICAgICdvcHRpb25OYW1lJzpsYW5nLnBsYXlWaWRlb0xpbmVBZGQsDQogICAgICAgICAgICAgICAgICAgICdvcHRpb25JRCc6J3ZpZGVvUGxheUxpbmVBZGQnLA0KICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCc6dmlkZW9QbGF5TGluZUFkZCwNCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhJzondmlkZW9QbGF5TGluZUFkZFRleHRhcmVhJywNCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhSWQnOidwbGF5VmlkZW9MaW5lVGV4dGFyZWEnLA0KICAgICAgICAgICAgICAgICAgICAndGlwJzoNCmDnuq/lh4AxLGh0dHBzOi8vaW0xOTA3LnRvcC8/ang9DQpC56uZMSxodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPQ0K54ix6LGGLGh0dHBzOi8vanguYWlkb3Vlci5uZXQvP3VybD0NCkJMLGh0dHBzOi8vdmlwLmJsamlleC5jb20vP3Y9DQrlhrDosYYsaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0NCueZvuWfnyxodHRwczovL2p4LjYxOGcuY29tLz91cmw9DQpDSyxodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0NCkNIb2ssaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0NCmNrbW92LGh0dHBzOi8vd3d3LmNrbW92LnZpcC9hcGkucGhwP3VybD0NCkg4LGh0dHBzOi8vd3d3Lmg4anguY29tL2ppZXhpLnBocD91cmw9DQpKWSxodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPQ0K6Kej5p6QLGh0dHBzOi8vY2ttb3YuY2N5ampkLmNvbS9ja21vdi8/dXJsPQ0K6Kej5p6QbGEsaHR0cHM6Ly9hcGkuamlleGkubGEvP3VybD0NCuiAgeadvyxodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0NCk1BTyxodHRwczovL3d3dy5tdG9zei5jb20vbTN1OC5waHA/dXJsPQ0KTTNVOCxodHRwczovL2p4Lm0zdTgudHYvamlleGkvP3VybD0NCuivuuiuryxodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0NCk9LLGh0dHBzOi8vb2tqeC5jYy8/dXJsPQ0KUE0saHR0cHM6Ly93d3cucGxheW0zdTguY24vamlleGkucGhwP3VybD0NCuebmOWPpCxodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9DQrkuIPlk6UsaHR0cHM6Ly9qeC5ubnh2LmNuL3R2LnBocD91cmw9DQpSREhLLGh0dHBzOi8vangucmRoay5uZXQvP3Y9DQrkurrkurrov7csaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0NCuaAneS6kSxodHRwczovL2p4LmFwMnAuY24vP3VybD0NCuaAneWPpDMsaHR0cHM6Ly9qc2FwLmF0dGFraWRzLmNvbS8/dXJsPQ0K5ZCs5LmQLGh0dHBzOi8vanguZGo2dS5jb20vP3VybD0NCue7tOWkmixodHRwczovL2p4Lml2aXRvLmNuLz91cmw9DQromb7nsbMsaHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0NCllULGh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPQ0K5LqR56uvLGh0dHBzOi8vc2IuNWdzZW8ubmV0Lz91cmw9DQrkupHmnpAsaHR0cHM6Ly9qeC55cGFyc2UuY29tL2luZGV4LnBocD91cmw9DQowNTIzLGh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPQ0KMTfkupEsaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0NCjE4MCxodHRwczovL2p4LjAwMDE4MC50b3AvangvP3VybD0NCjRLLGh0dHBzOi8vanguNGtkdi5jb20vP3VybD0NCjgwOTAsaHR0cHM6Ly93d3cuODA5MGcuY24vP3VybD1gLA0KICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlTmFtZSc6J3BsYXlWaWRlb0xpbmVUZXh0J30NCg0KICAgICAgICAgICAgICAgIHZhciB2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbiA9IFsNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmR5VmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidkeVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0JzpkeVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcua3NWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2tzVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmtzVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy54aWd1YVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzoneGlndWFWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6eGlndWFWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmJpbGlWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2JpbGlWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6YmlsaVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueW91dHViZVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzoneW91dHViZVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp5b3V0dWJlVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgIHZhciBzZXRIdG1sID0gIjxkaXYgaWQ9J3NldE1hc2snIGNsYXNzPSd6aG1NYXNrJz48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd3cmFwLWJveCcgaWQ9J3NldFdyYXAnPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2ljb25TZXRQYWdlJyBpZD0nbW92aWVJY29uU2V0UGFnZSc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4gY2xhc3M9J2JhY2snPjwvc3Bhbj48c3Bhbj4iK2xhbmcuaWNvblBvc2l0aW9uKyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0UGFnZUxpJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IitsYW5nLmljb25IZWlnaHQrIu+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uVG9wJyB2YWx1ZT0nIitpY29uVmlwVG9wKyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbkhlaWdodCsiJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dF9fdmFsaWRhdG9yJz48L3NwYW4+PC9zcGFuPjwvbGk+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uTGluZSsi77yaPC9zcGFuPjxkaXYgY2xhc3M9J3NlbGVjdC1ib3gnPjxzZWxlY3QgY2xhc3M9J3NlbGVjdC1ib3hfX2JvZHknIGlkPSdpY29uUG9zaXRpb24nPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxvcHRpb24gdmFsdWU9J2xlZnQnICIrc2VsZWN0ZWRMZWZ0KyI+IitsYW5nLmljb25MZWZ0KyI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdyaWdodCcgIitzZWxlY3RlZFJpZ2h0KyI+IitsYW5nLmljb25SaWdodCsiPC9vcHRpb24+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iDQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbldpZHRoKyLvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbldpZHRoJyB2YWx1ZT0nIitpY29uVmlwV2lkdGgrIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uV2lkdGgrIic+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXRfX3ZhbGlkYXRvcic+PC9zcGFuPjwvc3Bhbj48L2xpPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8bGkgIHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtZmxleDsnPjxzcGFuIHN0eWxlPSdwYWRkaW5nLXRvcDo0cHg7Jz4iK2xhbmcuaWNvbldhaXRUaW1lKyLvvJo8L3NwYW4+PGRpdiBjbGFzcz0nc2VsZWN0LWJveCc+PHNlbGVjdCBjbGFzcz0nc2VsZWN0LWJveF9fYm9keScgaWQ9J2ljb25XYWl0VGltZSc+IjsNCg0KICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9MTtpPD04O2krKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGljb25TZWxlY3RlZCA9IEdNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKT09aS8yPydzZWxlY3RlZCc6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8b3B0aW9uIHZhbHVlPSIraS8yKyIgIitpY29uU2VsZWN0ZWQrIj4iK2kvMisi56eSPC9vcHRpb24+IjsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+6YCPIOaYjiDluqYg77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25PcGFjaXR5JyB2YWx1ZT0nIitpY29uVmlwT3BhY2l0eSsiJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEljb25PcGFjaXR5KyInPjwvc3Bhbj48L2xpPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlJyBpZD0ndmlkZW9Eb3dubG9hZFNldFBhZ2UnPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSd6aG1fc2V0X3BhZ2VfaGVhZGVyJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy52aWRlb0Rvd25sb2FkKyI8L3NwYW4+PHNwYW4gIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L2xpPjwvdWw+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fc2V0X3BhZ2VfbGlzdCc+IjsNCg0KICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8dmlkZW9Eb3dubG9hZE9wdGlvbkpzb24ubGVuZ3RoO2krKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixzd2l0Y2hCYWNrQ29ybG9yLGRpc3BsYXk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUodmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0ub3B0aW9uSUQsdmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0uZGVmYXVsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSA9ICdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gJ2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZV9jb250ZW50Jz4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxzcGFuPiIrdmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0ub3B0aW9uTmFtZSsiPC9zcGFuPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3ZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLm9wdGlvbklEKyInPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiOyBsZWZ0OiAiK29wdGlvblZhbHVlKyJweDsnPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9kaXY+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2xpPiI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiINCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+Ig0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2UnIGlkPSdtb3ZpZVZpZGVvU2V0UGFnZSc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSdiYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnNldFBsYXlWaWRlbysiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3NldF9wYWdlX2xpc3QnIHN0eWxlPSdvdmVyZmxvdy15OnVuc2V0Jz4iOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcixkaXNwbGF5Ow0KDQogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHBsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uSUQscGxheVZpZGVvT3B0aW9uSnNvbi5kZWZhdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25WYWx1ZSAhPSAnMjInKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOw0KDQogICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2VfY29udGVudCc+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8c3BhbiBjbGFzcz0ncGxheVZpZGVvT3B0aW9uTmFtZSc+IitwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbk5hbWUrIjwvc3Bhbj4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nY2lyY3VsYXInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiIrc3dpdGNoQmFja0NvcmxvcisiJyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbklEKyInPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiOyBsZWZ0OiAiK29wdGlvblZhbHVlKyJweDsnPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9kaXY+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sKz0iPC9saT48bGk+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXY+6Kej5p6Q57q/6LevPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2Zvcm1fX3RleHRhcmVhJz4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ndGV4dGFyZWEganMtZmxleGlibGUtdGV4dGFyZWEnIHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4OycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYSsiJz4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHRleHRhcmVhIHJvd3M9JzknIGNsYXNzPSd0ZXh0YXJlYV9fYm9keSB6aG1fc2Nyb2xsJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcFBsYXlWaWRlb0xpbmVBZGQrIicgc3R5bGU9J3dpZHRoOjI1MHB4O2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NHB4O3Jlc2l6ZTpub25lOycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYUlkKyInPiIrR01fZ2V0VmFsdWUocGxheVZpZGVvT3B0aW9uSnNvbi52YWx1ZU5hbWUscGxheVZpZGVvT3B0aW9uSnNvbi50aXApKyI8L3RleHRhcmVhPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj48L2Rpdj48L2xpPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiINCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiINCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3poaWh1U2V0UGFnZScgaWQ9J3poaWh1SWNvblNldFBhZ2UnPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy56aFNldCsiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0JyBzdHlsZT0naGVpZ2h0OjMwMHB4Jz4iOw0KDQogICAgICAgICAgICAgICAgZm9yKHZhciBvcHRpb25OPTA7b3B0aW9uTjx6aGlodU9wdGlvbkpzb24ubGVuZ3RoO29wdGlvbk4rKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixzd2l0Y2hCYWNrQ29ybG9yOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCx6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0uZGVmYXVsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaSA+PGRpdiBjbGFzcz0nemhpaHVTZXRQYWdlQ29udGVudCc+PHNwYW4+Iit6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uTmFtZSsiPC9zcGFuPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOycgaWQ9Iit6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQrIj48ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiO2xlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+PC9kaXY+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICBpZih6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQgPT0gJ3JlbW92ZUtleXdvcmQnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleXdvcmRTaG93Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlS2V5d29yZCcsJzAnKSA9PSAnMjInKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRTaG93ID0gJ2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZFNob3cgPSAnbm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0nbWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6IitrZXl3b3JkU2hvdysiO3BhZGRpbmc6NXB4IDBweDsnIGlkPSd6aGlodUtleXdvcmQnPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgdmFsdWU9JyIrR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJywnJykrIicgaWQ9J2lucHV0WmhLZXl3b3JkJyBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBLZXl3b3JkKyInIHN0eWxlPSd3aWR0aDo4OCUnPjxzcGFuPjwvZGl2PiI7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZih6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQgPT0gJ3JlbW92ZUF1dGhvck5hbWUnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1dGhvck5hbWVTaG93Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzIyJykgPT0gJzIyJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JOYW1lU2hvdyA9ICdibG9jayc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvck5hbWVTaG93ID0gJ25vbmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J21hcmdpbi10b3A6MTBweDtkaXNwbGF5OiIrYXV0aG9yTmFtZVNob3crIjtwYWRkaW5nOjVweCAwcHg7JyBpZD0nemhpaHVBdXRob3JOYW1lJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IHZhbHVlPSciK0dNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsJycpKyInIGlkPSdpbnB1dFpoQXV0aG9yTmFtZScgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwQXV0aG9yTmFtZSsiJyBzdHlsZT0nd2lkdGg6ODglJz48c3Bhbj48L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9saT4iOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iDQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnPjxzcGFuPjwvc3Bhbj48c3Bhbj4iK2xhbmcuc2V0KyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdzZXRXcmFwTGknPiI7DQoNCiAgICAgICAgICAgICAgICBmb3IodmFyIHNldE49MDtzZXROPHNldExpc3RKc29uLmxlbmd0aDtzZXROKyspew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0VmFsdWUgPSBHTV9nZXRWYWx1ZShzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQsJzIyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixhcnJvd0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3I7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYobGlzdFZhbHVlICE9IDIyKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3I9ICcjRUVFJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7DQogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yID0gJyNDQ0MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCA9PSAnJyl7DQogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yID0gJyNFRUUnOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48c3Bhbj4iK3NldExpc3RKc29uW3NldE5dLmxpc3ROYW1lKyI8L3NwYW4+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3NldFdyYXBMaUNvbnRlbnQnPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgaWQ9JyIrc2V0TGlzdEpzb25bc2V0Tl0uc2V0TGlzdElEKyInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAiK3N3aXRjaEJhY2tDb3Jsb3IrIjsnPjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7bGVmdDogIitsaXN0VmFsdWUrInB4Jz48L2Rpdj48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHNwYW4gY2xhc3M9J3RvLXJpZ2h0JyBkYXRhPSciK3NldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCsiJyB0YWtlUGxhY2U9JyIrc2V0TGlzdEpzb25bc2V0Tl0udGFrZVBsYWNlKyInIHN0eWxlPSdib3JkZXI6IHNvbGlkICIrYXJyb3dDb2xvcisiOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyc+PC9zcGFuPjwvZGl2PjwvbGk+IjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0naGVpZ2h0OjQwcHg7JyBpZD0nemhtVGFrZVBsYWNlJz48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdpY29uU2V0Rm9vdCcgc3R5bGU9Jyc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0Rm9vdExpJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+PC9saT4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSc8L3VsPic7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9JzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NldE1hc2snKSkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1NZW51Jyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgemhtTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1NZW51Jyk7DQoNCiAgICAgICAgICAgICAgICB6aG1NZW51LmlubmVySFRNTCA9IHNldEh0bWw7DQoNCiAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobU1lbnUnKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy8g5Y+W5raI5a6a5pe25ZmoDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaXJjdWxhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaXJjdWxhcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKF9lKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uU3R5bGUgPSBpdGVtLmNoaWxkcmVuWzBdLnN0eWxlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gYnV0dG9uU3R5bGUubGVmdDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RMZWZ0VmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVmdD09MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMjJweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmJhY2tncm91bmQgPSAnI2ZlNmQ3Myc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZD0nI2ZmRTVFNSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmV4dFNpYmxpbmcgJiYgaXRlbS5uZXh0U2libGluZy5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm5leHRTaWJsaW5nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCdib3JkZXI6IHNvbGlkICNjY2M7Ym9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGVmdFZhbHVlID0gMjI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZmJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5uZXh0U2libGluZyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm5leHRTaWJsaW5nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCdib3JkZXI6IHNvbGlkICNFRUU7Ym9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldExpc3RJRCA9IGl0ZW0uaWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVLZXl3b3JkJyAmJiBsaXN0TGVmdFZhbHVlPT0yMil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUtleXdvcmQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSAnaGVpZ2h0OjIyMHB4JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlS2V5d29yZCcgJiYgbGlzdExlZnRWYWx1ZT09MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUtleXdvcmQnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MTgwcHgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVBdXRob3JOYW1lJyAmJiBsaXN0TGVmdFZhbHVlPT0yMil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUF1dGhvck5hbWUnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlQXV0aG9yTmFtZScgJiYgbGlzdExlZnRWYWx1ZT09MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUF1dGhvck5hbWUnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShzZXRMaXN0SUQsbGlzdExlZnRWYWx1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvUmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG8tcmlnaHQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9SaWdodC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gaXRlbS5wcmV2aW91c1NpYmxpbmcuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVmdCAhPSAyMikgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRQYWdlSUQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXRQYWdlSUQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJZC5jbGFzc05hbWU9J2ljb25TZXRQYWdlIHRvTGVmdE1vdmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v55+l5LmO6K6+572u5pqC5L2N6auY5bqmDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEPT0nemhpaHVJY29uU2V0UGFnZScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9IGBoZWlnaHQ6NjhweGA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WunuaXtuWbvuagh+mrmOW6pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllSWNvblNldFBhZ2UnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb25Ub3AnKS52YWx1ZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjemhtbG9nbyIpLm9mZnNldFRvcDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9CYWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhY2snKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9CYWNrLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudERvbSA9IGl0ZW0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9SaWdodE1vdmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0naGVpZ2h0OjQwcHg7Jw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFNhdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvblNldFNhdmUnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2F2ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25PcGFjaXR5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uT3BhY2l0eScpLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uUG9zaXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblBvc2l0aW9uJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbldhaXRUaW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25XYWl0VGltZScpLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9MaW5lVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKS52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9MaW5lTGVmdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWRlb1BsYXlMaW5lQWRkJykuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRaaEtleXdvcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXRaaEtleXdvcmQnKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRBdXRob3JOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0WmhBdXRob3JOYW1lJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvblRvcCAhPSAnJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheWzAtOV1bMC05XXswLDJ9JCkvLnRlc3QoaWNvblRvcCkpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uSGVpZ2h0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Ub3AnLGljb25Ub3ApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvbk9wYWNpdHkgIT0gJycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC9eKD86MHxbMS05XVswLTldP3wxMDApJC8udGVzdChpY29uT3BhY2l0eSkpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uT3BhY2l0eSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uT3BhY2l0eScsaWNvbk9wYWNpdHkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvblBvc2l0aW9uICE9ICcnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25XYWl0VGltZSAhPSAnJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uV2FpdFRpbWUnLGljb25XYWl0VGltZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2lkdGggIT0nJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheKFsxLTldWzAtOV0/KSQpLy50ZXN0KGljb25XaWR0aCkpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uV2lkdGgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldpZHRoJyxpY29uV2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSA9PSAyMil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYXlWaWRlb0xpbmVUZXh0KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gX3RoaXMuZ2V0TGluZShwbGF5VmlkZW9MaW5lVGV4dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lT2JqLmxlbmd0aD4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnLHBsYXlWaWRlb0xpbmVUZXh0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgn57q/6Lev6L6T5YWl5LiN5q2j56GuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JywnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcscGxheVZpZGVvTGluZVRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5wdXRaaEtleXdvcmQgIT0gJycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLGlucHV0WmhLZXl3b3JkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhLZXl3b3JkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlucHV0QXV0aG9yTmFtZSAhPSAnJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsaW5wdXRBdXRob3JOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSB0aGlzLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25Ub3ApKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCdmYWxzZScpDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldpZHRoJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IHRoaXMudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlsxLTldXGQqJCkvLnRlc3QoaWNvbldpZHRoKSkpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywnZmFsc2UnKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ3RydWUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6IW+6K6v6KeG6aKR5b+r5o236ZSu5Yay56qBDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwubWF0Y2goL3ZcLnFxXC5jb21cL3hcL2NvdmVyLykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZExpbmVUZXh0ID1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheVZpZGVvTGluZVRleHRhcmVhJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBhZGRMaW5lVGV4dC5zZWxlY3Rpb25TdGFydDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcyA9PT0gdW5kZWZpbmVkIHx8IGVuZFBvcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q29kZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmtleUNvZGUgPT0gaXRlbS5jb2RlICYmIGUuc2hpZnRLZXk9PWl0ZW0uaXNTaGlmdCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFZhbHVlID0gYWRkTGluZVRleHQudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRWYWx1ZSA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoMCxzdGFydFBvcyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kVmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKHN0YXJ0UG9zKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxWYWx1ZSA9IHN0YXJ0VmFsdWUraXRlbS52YWx1ZStlbmRWYWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnZhbHVlPWFsbFZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcysxOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kID0gZW5kUG9zKzE7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoZG9tLGRvbUlkKXsNCg0KICAgICAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZG9tKTsNCg0KICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQgPSBkb21JZDsNCg0KICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7DQoNCiAgICAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudEh0bWxDb250ZW50KTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXF1ZXN0KG1ldGhvZCx1cmwsZGF0YSxpc0Nvb2tpZT0nJyl7DQoNCiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnJlYWR5U3RhdGU9PTQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdC5zdGF0dXM9PTIwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxdWVzdC5zdGF0dXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCx1cmwpOw0KICAgICAgICAgICAgICAgICAgICBpZihpc0Nvb2tpZSl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChkYXRhKTsNCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2V0Q29va2llKGNuYW1lLGN2YWx1ZSxleGRheXMpew0KDQogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOw0KDQogICAgICAgICAgICAgICAgZC5zZXRUaW1lKGQuZ2V0VGltZSgpKyhleGRheXMqMjQqNjAqNjAqMTAwMCkpOw0KDQogICAgICAgICAgICAgICAgdmFyIGV4cGlyZXMgPSAiZXhwaXJlcz0iK2QudG9HTVRTdHJpbmcoKTsNCg0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnZXRDb29raWUoY25hbWUpew0KICAgICAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7DQogICAgICAgICAgICAgICAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8Y2EubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZSk9PTApIHsgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWUubGVuZ3RoLGMubGVuZ3RoKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGdldFF1ZXJ5U3RyaW5nKGUpIHsNCiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBSZWdFeHAoIihefCYpIiArIGUgKyAiPShbXiZdKikoJnwkKSIpOw0KICAgICAgICAgICAgICAgIHZhciBhID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkubWF0Y2godCk7DQogICAgICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgcmV0dXJuIGFbMl07DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnZXRVcmxQYXJhbXModXJsKXsNCiAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbXj8mKyNdKyk9KFtePyYrI10rKS9nOw0KICAgICAgICAgICAgICAgIGxldCBvYmo9e307DQogICAgICAgICAgICAgICAgdXJsLnJlcGxhY2UocmVnLChyZXMsJDEsJDIpPT57b2JqWyQxXT0kMn0pOw0KICAgICAgICAgICAgICAgIHJldHVybiBvYmo7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGdldExpbmUodGV4dCl7DQoNCiAgICAgICAgICAgICAgICBsZXQgdGV4dEFyciA9IHRleHQuc3BsaXQoJ1xuJyk7DQoNCiAgICAgICAgICAgICAgICBpZih0ZXh0QXJyLmxlbmd0aCA+IDApew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gW107DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gL14oLispKGh0dHBzPzpcL1wvLispJC87DQoNCiAgICAgICAgICAgICAgICAgICAgdGV4dEFyci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9ccyosKi9nLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0pIHJldHVybiB0cnVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU1hdGNoID0gaXRlbS5tYXRjaChtYXRjaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmVNYXRjaCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2JqLnB1c2goeyduYW1lJzpsaW5lTWF0Y2hbMV0uc3Vic3RyaW5nKDAsNCksJ3VybCc6bGluZU1hdGNoWzJdfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iaj1bXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lT2JqOw0KDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzdGF0aWMgZ2V0RWxlbWVudChjc3MsYWxsPScnKXsNCg0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbnVtKysNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWxsID09IGZhbHNlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3NzKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkb20pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3NzKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbS5sZW5ndGg+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkb20pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihudW09PTIwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICB9LDMwMCkNCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHN0YXRpYyB0b2FzdChtc2csZHVyYXRpb24pew0KDQogICAgICAgICAgICAgICAgZHVyYXRpb249aXNOYU4oZHVyYXRpb24pPzMwMDA6ZHVyYXRpb247DQoNCiAgICAgICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgICAgIHRvYXN0RG9tLmlubmVySFRNTCA9IG1zZzsNCg0KICAgICAgICAgICAgICAgIC8vdG9hc3REb20uc3R5bGUuY3NzVGV4dD0id2lkdGg6IDYwJTttaW4td2lkdGg6IDE1MHB4O29wYWNpdHk6IDAuNztoZWlnaHQ6IDMwcHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtsaW5lLWhlaWdodDogMzBweDt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogNXB4O3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDQwJTtsZWZ0OiAyMCU7ei1pbmRleDogOTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDEycHg7IjsNCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycNCg0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOw0KDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsNCg0KICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOw0KDQogICAgICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLm9wYWNpdHkgPSAnMCc7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOw0KDQogICAgICAgICAgICAgICAgfSwgZHVyYXRpb24pOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL2NyZWF0ZSB6aG1Mb2dvSWNvbg0KICAgICAgICAgICAgemhtTG9nbygpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGxldCBzb3J0RGl2ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3Jvdyc6J3Jvdy1yZXZlcnNlJzsNCg0KICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGANCiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsNCiAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7DQogICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7DQogICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7DQogICAgICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7JHtpY29uVmlwUG9zaXRpb259OjVweDt0b3A6JHtpY29uVmlwVG9wfXB4Ow0KICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOw0KICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OnZpc2libGU7DQogICAgICAgICAgICAgICAgICAgZGlzcGxheTpmbGV4Ow0KICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiR7c29ydERpdn07DQogICAgICAgICAgICAgICAgICAgd2lkdGg6YXV0bzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7DQogICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5Ow0KICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5pY29uTG9nb3sNCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eToke2ljb25WaXBPcGFjaXR5LzEwMH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lew0KICAgICAgICAgICAgICAgICAgIHdpZHRoOjMyMHB4Ow0KICAgICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsNCiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsNCiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVfbGluZV91bHsNCiAgICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsNCiAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsNCiAgICAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOw0KICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsNCiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7DQogICAgICAgICAgICAgICAgICAgbWFyZ2luOjJweDsNCiAgICAgICAgICAgICAgICAgICB3aWR0aDozMCU7DQogICAgICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsNCiAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7DQogICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsNCiAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7DQogICAgICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsNCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkew0KICAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7DQogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ew0KICAgICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7DQogICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7DQogICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO3RvcDowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGA7DQoNCiAgICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7DQoNCiAgICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7DQoNCiAgICAgICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPScnIGNsYXNzPSdwbGF5QnV0dG9uIHpobV9wbGF5X3ZpZG9lX2ljb24nIGlkPSd6aG1sb2dvJz4iOw0KDQogICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGltZyBjbGFzcz0naWNvbkxvZ28nIHN0eWxlPSd3aWR0aDoiK2ljb25WaXBXaWR0aCsicHg7aGVpZ2h0OiIraWNvblZpcFdpZHRoKjEuNSsicHgnIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nPiINCg0KICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXY+IjsNCg0KICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOw0KDQogICAgICAgICAgICAgICAgIHpobVBsYXkuaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOw0KDQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIC8v5bem6ZSu5oyJ5LiL5ouW5YqoDQogICAgICAgICAgICAgLy90eXBlOuagueaNruS4jeWQjOexu+Wei++8jOWkhOeQhuWbvuagh+WNleWHu+S6i+WKoQ0KICAgICAgICAgICAgIHpobUxvZ29EcmFnKHR5cGUsd2ViKXsNCg0KICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgIHZhcsKgemhtTG9nb0RyYWc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKTsNCg0KICAgICAgICAgICAgICAgICB2YXIgemhtTG9nb0ljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaWNvbkxvZ28iKTsNCg0KICAgICAgICAgICAgICAgICBpZighemhtTG9nb0RyYWcgfHwgIXpobUxvZ29JY29uKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNlZG93biA9IGZ1bmN0aW9uKGV2ZW50KXsNCg0KICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQud2hpY2g9PTMpcmV0dXJuIGZhbHNlOy8v5bGP6JS95Y+z6ZSuDQoNCiAgICAgICAgICAgICAgICAgICAgIGxldCBzZWRvd25Ub3AgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A7DQoNCiAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1Mb2dvSWNvbkhlaWdodCA9IHpobUxvZ29JY29uLm9mZnNldEhlaWdodDsNCg0KICAgICAgICAgICAgICAgICAgICAgbGV0IGJvdHRvbVNwYWNlID0gMTA7DQoNCiAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT0gJ2ljb25Mb2dvJylyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgIC8vbGV0wqBzaGlmdFjCoD3CoGV2ZW50LmNsaWVudFjCoC3CoHpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7DQogICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsNCg0KICAgICAgICAgICAgICAgICAgICAgbGV0wqBzaGlmdFkgPSBldmVudC5jbGllbnRZLXpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsNCg0KICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUucG9zaXRpb27CoD3CoCdmaXhlZCc7DQoNCiAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsNCg0KICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoemhtTG9nb0RyYWcpOw0KDQogICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbsKgb25Nb3VzZU1vdmUoZXZlbnQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLmxlZnTCoD3CoCc1cHgnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWS1zaGlmdFk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIGhlaWdodCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPSB5KydweCc7DQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAvL+WcqG1vdXNlbW92ZeS6i+S7tuS4iuenu+WKqOWbvuaghw0KICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxvbk1vdXNlTW92ZSk7DQogICAgICAgICAgICAgICAgICAgICAvL+advuW8gOS6i+S7tg0KICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsemhtTG9nb0RyYWcub2Zmc2V0VG9wKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wK3pobUxvZ29JY29uSGVpZ2h0K2JvdHRvbVNwYWNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wIDwgMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0nMHB4JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cuaW5uZXJIZWlnaHQgPCBoZWlnaHQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9d2luZG93LmlubmVySGVpZ2h0LXpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlKydweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGlja+S6i+S7tuWkhOeQhg0KICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2aWRlbyc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIHdlYi5sZW5ndGggPT0gMCAmJiB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A+MCAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPiBoZWlnaHQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7flnKjop4bpopHmkq3mlL7pobXngrnlh7vlm77moIcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ211c2ljJzoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYgZS50YXJnZXQuY2xhc3NOYW1lID09ICdpY29uTG9nbycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmxEYXRhID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbVwvI1wvKD86c29uZ3xkailcP2lkL30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wveVwubXVzaWNcLjE2M1wuY29tXC9tXC8oPzpzb25nfGRqKVw/aWQvfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyg/OnNvbmd8ZGopXD9pZC99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLnFxXC5jb21cL25cL3J5cXFcL3BsYXllci99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L2t1Z291XC5jb20vfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdXdvXC5jbi99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3d3d1wueGltYWxheWFcLmNvbS99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybCA9IG11c2ljVXJsRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobXVzaWNVcmwubGVuZ3RoPT0wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3Qod2ViWzBdLnRpcCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh3ZWJbMF0ubmFtZSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ldGVhc2UnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0ZWFzZUZ1bigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3FxJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxRnVuKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3Vnb3UnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Vnb3VGdW4oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrdXdvJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1d29GdW4oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4aW1hbGF5YSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hbGF5YUZ1bigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV0ZWFzZUZ1bigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBfdGhpcy5nZXRVcmxQYXJhbXMobG9jYXRpb24uaHJlZik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsUGFyYW1zLmlkID09IHVuZGVmaW5lZCkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXRlYXNlVXJsRW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50KCdodHRwczovL211c2ljLjE2My5jb20vc29uZz9pZD0nK3VybFBhcmFtcy5pZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrIj9pZD0iK3VybFBhcmFtcy5pZCsiJnR5cGU9bmV0ZWFzZSINCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHFxRnVuKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHFxU29uZ01hdGNoOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5ZXJfbXVzaWNfX2luZm8iKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpLmNoaWxkTm9kZXNbMF0uaHJlZi5tYXRjaCgvc29uZ0RldGFpbFwvKFxTKilcPy8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nXC8oXFMqKS5odG1sLyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcXFTb25nTWF0Y2hbMV0pe2NvbnNvbGUubG9nKCfmsqHmnInojrflj5bliLDmrYzmm7JJRCcpOyByZXR1cm59Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb0xpbmsgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9JytxcVNvbmdNYXRjaFsxXSsnJnR5cGU9cXEmcGxheVVybD0nK2F1ZGlvTGluazsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1Z291RnVuKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTW9kdWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXVkaW9Nb2R1bGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXVkaW9Nb2R1bGUnKS5zdHlsZT0nYm90dG9tOjBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2hvd0hpZGVfcGxheWJhcicpLmNsYXNzTmFtZSA9ICdpY29uIHNob3ctcGxheWJhci1idG4nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1d29GdW4oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2wnKS5zdHlsZT0nYm90dG9tOjBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhpbWFsYXlhRnVuKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhtLXBsYXllcicpLnN0eWxlPSdib3R0b206MHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lvdXR1YmUnOg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9uZHJhZ3N0YXJ0wqA9wqBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuwqBmYWxzZTsNCiAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAvL+S4i+i9vQ0KICAgICAgICAgICAgc3RhdGljIExSX2Rvd25sb2FkKHVybCxmaWxlbmFtZSl7DQoNCiAgICAgICAgICAgICAgICBsZXQgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2codWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSk7DQoNCiAgICAgICAgICAgICAgICBpZih1YS5tYXRjaCgvdmVyc2lvblwvKFtcZC5dKykuKnNhZmFyaS8pKXsNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih1cmwpOw0KDQogICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQodXJsLGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBjbGFzcyBDb3Vwb25DbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCg0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCg0KICAgICAgICAgICAgICAgIHN1cGVyKCk7DQoNCiAgICAgICAgICAgICAgICB0aGlzLmRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudC5pZD0nemhtX2Rpdl9zJzsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGFvYmFvKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9qdVZhbGlkJyk7DQoNCiAgICAgICAgICAgICAgICBub2RlLnN0eWxlPSdvdmVyZmxvdzppbmhlcml0OycNCg0KICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90YW9iYW8nOw0KDQogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcudGItbWFpbi10aXRsZScsJy50Yi1zaG9wLW5hbWUgPiBkbCA+IGRkID4gc3Ryb25nID4gYScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7DQoNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG1hbGwoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX0xpbmtCdXknKS5wYXJlbnROb2RlOw0KDQogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsNCg0KICAgICAgICAgICAgICAgIF90aGlzLmdldFRpdGxlU2hvcCgnLkl0ZW1IZWFkZXItLW1haW5UaXRsZS0tM0NJanFXNScsJy5TaG9wSGVhZGVyLS10aXRsZS0tMnFzQkUxQScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7DQoNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0bWFsbENhb3NoaSgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0pfTGlua0J1eScpLnBhcmVudE5vZGU7DQoNCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOw0KDQogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcuSXRlbUhlYWRlci0tbWFpblRpdGxlLS0zQ0lqcVc1JywnLlNob3BIZWFkZXItLXRpdGxlLS0ycXNCRTFBJykudGhlbihmdW5jdGlvbihyZXNwKXsNCg0KICAgICAgICAgICAgICAgICAgIF90aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUscmVzcC5nb29kc1RpdGxlLHJlc3Auc2hvcE5hbWUpOw0KDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0bWFsbE90aGVyKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG0tbXNnLWJveCcpOw0KDQogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsNCg0KICAgICAgICAgICAgICAgIF90aGlzLmdldFRpdGxlU2hvcCgnLkl0ZW1IZWFkZXItLW1haW5UaXRsZS0tM0NJanFXNScsJy5TaG9wSGVhZGVyLS10aXRsZS0tMnFzQkUxQScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLHJlc3AuZ29vZHNUaXRsZSxyZXNwLnNob3BOYW1lKTsNCg0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICBqZCgpew0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgamRHb29kc0lkID0gY291cG9uVXJsLm1hdGNoKC9qZFwuKGhrfGNvbSlcLyhcUyopLmh0bWwvKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Nob29zZS1idG5zJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbm9kZS5iZWZvcmUodGhpcy5kaXZFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QoJ2dldCcsYGh0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL2luZGV4X2pkX25ldy5waHA/Z29vZHNfaWQ9JHtqZEdvb2RzSWRbMl19YCkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcD0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbD0nJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgDQogICAgICAgIDxkaXYgY2xhc3M9InpobV9jb3Vwb24iIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4OyI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGVmdCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2ltZ19pY29uIj4NCiAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQmtBSGovQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpMQUgvQUN3QUFBQUFaQUJrQUtmNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QmpyNkJqcjZCanY2Qmp2NkJqdjZCanY2Qnp2NkJ6djZDRHo2Q0R6NkNUMzZDVDM2Q1QzNkNqNzZDejc2Q3ovNkN6LzZERC82REVENkRVRDZEVUQ2RGtINkRrSDZEa0g2RDBMNkVFTDZFVVA2RVVUNkVrVDdFMFg3RkVYN0ZFYjdGRWI3RlViN0ZVZjdGVWY3RmtmN0ZrZjdGMGo3RjBqN0YwajdGMGo3R0VqN0dFbjdHVXI3R2t2N0cwdjdIRXo3SFUzN0gwLzdJVkQ3STFIN0pGTDdKbFQ3SjFUN0tGYjdLVmI3S2xmN0sxajdMbHI3TUZ6N01sMzdORi84Tm1EOE9HTDhPbVQ4UEdYOFAyZjhRV244UTJyOFJHdjhSbTM4Um0zOFIyNzhTRy84U1hEOFNuRDhUSEw4VG5QOFQzVDhVSFg4VW5mOFZIajhWM3Y4VzM3OFlJTDhaSVg4YW9uOGI0MzhjWS83Y0k3NmJZdjRhNG4xYVlmdVo0VGpaSC9VWkh6SFpudThhWHF0YkhxaWIzcVdjM3FJZDN1QWVIcDVlWGw2ZW5wN2UzdDhmSHg5ZlgxK2ZuNS9mMytBZ0lDQmdZR0Nnb0tEZzRPRWhJU0ZoWVdHaG9hSGg0ZUlpSWlKaVltS2lvcUxpNHVNakl5TmpZMk9qbzZQajQrUWtKQ1JrWkdTa3BLVGs1T1VsSlNWbFpXV2xwYVhsNWVZbUppWm1abWFtcHFibTV1Y25KeWRuWjJlbnA2Zm41K2dvS0Nob2FHaW9xS2pvNk9rcEtTbHBhV3JwcWUycUt2QXFhN0pxckhRcTdQWHJMWGRyTGZpcmJqb3JMbnVxcm55cUxqMXA3ajNwYmY1cExiNm9yYjdvclg4b2JYOG9MVDlvTFQ5b0xUOW9iWDlvcmI5bzdmOXBiajlwcm45cDduOXFMcjlxTHY5cWJ2OXFidjlxcno5cXJ6OXFyejlxN3o5cTczOXE3MzlyYjc5cnIvOXNNSDhzc0w4dE1UOHRzWDh1TWY3dXNuNnZjcjZ3TXo1d3M3NHc4LzR4ZEQzeDlIM3lOTDJ5dFQxeTlYMHpkYnowTmZ5MHRueDFOcngxTnZ4MWR2eDF0engxOTN3Mk4zeDJkL3cyOS92M09IdjN1THY0T1B2NHVYdTVlZnU1K251NnV2dDdlM3U3dTd2NysvdzhQRHg4Zkh5OHZMejgvUDA5UFQxOWZYMjl2YjQrUGo1K2ZuNysvdjgvUHo5L2YzKy92NysvdjcrL3Y0eXpUSUkvZ0QvQ1J4SXNLREJnd2dUS2x6SXNLSERoeEFacWx2U0pLTEZpeGd6L2l0RDVNUUpJMm8waWh4Sk1na0hCd284UENISnN1VkRZa0ljeUpSUXhKL0xtemdMNG9vNWs0ak5uRUJkNGhvaTA0RUVuMEdUR2pRSFJVbVNMdzZIRmozNmsyR1hKVW1nVkZVS3NVa0tDaGg2akdrb3RlZldoR0o4YUtDUXdnblhpR1Y2Rk1WUWsyRlpvMGdYK2p1aVFhYUNIcmplUHFUaW9xaURGRmNZYmlNcWt3S1NobFpXS0pCWklFZEl3UTIzRWFGUWxJSVFad3lqcUtCQVFjVVV1MEk0Tng1eUZuUENLaXNNZzRqQ3NCc1VJa1drTklSU3dyQ0tMYTRkK2pPQ3dYQ1B5eXpSL0RDTTRVandoMXdLRngxUnhlV1lGZ1dLd2lqei9LR1NrdzRLL3NBdzQ1SU1qT3dwSzNaM1NDYkkyaFRxVy9wYlVvS0NoeUhJMXpNc1UyU0lWcHkvTkRGRUVtbm9oeE11VkVDUlJSWllYQ0VFRnI0WTZKb2FVaGpod3d3c2VBQkNDU1dJb0lFTExnaVJ4QlM4U0FpVVAxTVFNY01JR2toZzJJc09VS0JCQ1R3a0VZYUpCWkhUMmtOU0NKRkNjVEFHYVJnSExSZ2hSa2IreEpPY0VqUFl3RVJnRUhVeHhGZENWdmtpQmk0c2tWOURhQ3lSZ3cxTFFLblJFaURJQk1JUFZPeG9rRDlRMkFCa2tCSndCbGFNTGdySmdRK0pOV1RORXp4NElKTUk4V0drbkdFVW5FQ0VGd3VwY1VSdlFjN1lRZzlHbkZDQ0NqQWcwUU1NSi9RRkl3VXRQS0htUUZVRU1jS0xPY0NqMGFCWHVxQWJRbWNRNGVlTC9oU00wTU1SVTJ3NWtCcFVHSkhEQ0tvWmRzSVNuemJCUXE5RjhmQ3BRMHlVQ2VOeEI1MGhoS2FHbFNCRUZNcEVCVVVRakJvbXdoSG1IRlJHRGtHZVFKdElhaVRSd3B0bWprc1FHcysrcUVFT1VoeUxrRDlSOEFDdFRCOEFhNUFYS21SWGxBWXdPS0VOUzFvTWNZSnFDcmhBUmtIZ0hBRmVVU0lVY1laR1poaVJyVXppR3ZUdFpER3FZTVJZTjBrQnhBa2dzTEJTUVUyTTZtc1Q4amJrajFjdnVvQm9RVTZvQU1JSlFsUUhWREJVUE1HRlFWM0E4R0lLVUxqMFJHeWRBYkhsT2xVNGtXWjN0d3lCcmdodTNkVEVDVU15Z1NOQnZCbW1nUkV0QzZTR3JRa3A4YXBNTGN5TW94cEJ2UGdEMlFhUlFVUU9PUndCZDBGcXBEYVgvaEZiL3hQRnhTZm92TkF5UkdoUVFFcEpPSlJGQzBVcHdNS1JKcEt6V1dkNUxUU0dDLzVXZG5kQmZQMnJ0WWxkdU1DeEF5cDA0ZEFZTEdTK25VTmVTQ2NURDVzTDVzVFpFckIyT25hVXljQ2R5OFJOSi9oNi9nelJxd2ZxTW5SZDVqS1E1MUFWV011RXdSSVNmdHU0QzdzM2RIenV5amQwQmcrRytaQ09nV0d3TURvUTM5K09mUFlNK1RONWVET3dZZUFUMlRvRzBmWGhKZC9Wd3lOb2daTVpUaW5odjFOSlFKOUFuUEF3RG56T2ZOaURDUHlta3dXRGZDRUovL05mRXBvUU83RVJnUU9reVNBRk9JQ2Zna0FCV2lYUTMwUG9Wd0Q3UFFRTXFaT0pBUXN5QnZkb2tEUWdNRUkyR0pLRUVveXVLQVdnRHNwQUNKVVI0cTUrL2dKY0NCbCtLQUVnZVBCc0wvSkFEeGhpZzN2SlpsVURXY0tiU3RCREJBSVJJa1AwVnhFTDhvU0h3WW9EREFrRHVCUkF4aklxb0FVZ0c4Z1RRS2cyNi8yd2hFRlVpQmRXb0VVakVvUUtMVEJqR1IyUWd5b3FSQW8vQUpFZ1haQ0RrM0VOV2lDQW9odlBCNUZrRldXRkJIa1pEd1lKSWg5UTRTRnEyQUlXTm9rRkxaRE5KSHViM3h2SDB4Vm9qUUFMQjFFRGd6alpCVEc1aEFvcDRCZ0ZpaUJLUmdwbmZRNFFBU3IxQXdiUkZjVUdGUnlJZVRJSHU0ZWdRUzY1UTRPQjJPYXJuem5rRzBoNGxRZWc5NUFxeExJb1B3aGJVcER3SmcxUTB5Rm1PQUlNWm9BRVZ6SUVDZEI2bm9ta2NESExSR1FiNVJ1aERhSWxRZ09kQVpreS9sRUpWNWlBUkIrWWN6MUx1QmNQM09jeUtCakJDSXEwSExnOHQ3WFFlUzF4NmZNS1dGUlF0UFFaNFY3VTYxdm5pcEtDU3k0RURPZnhpdzNpV0pBb05FOG1HbEJDMy83eGhYa2FoNlFEUWNJSERET0NOaDRrQ3pONDBReGdxaFIvRU9NZ1RsQ1c4NGdnRFlWQTRRUWNVMEFLd0tBUU5BU0JXQ0NvYUVHQ29VMk1WQ01LUDdEQkVCWkdFRFZJelRBZkNKUkIyQ0FFREpBUkEwT28xcnhBU1RsbUZNUUxROGdCRU9LVkV5b0lvVGNLd0lBUXpCa0dseFlsYlFycGdoQlVvQUloUUE0aFUxQUJxYmg2cTdJcWdBTFNzb0pMdkVBRUt2bWxCTUFwaUJSU1FDZ2hIRU1oNkpEQzB4SmlCaDhNN1RRRkNaKy9PbGFFNm1ta0NqbEEvaGRLVHBEWlNKcE5ObExOeUJLODZJRURFa1FNUC94WER3NkxrVjBJRDBZYUtNSlBEWktHcHhyR0JoUExpRU03czlkVUZnNUdHQ0NDU09KeVE3Wkk3RFZJUStrM0xlS1BJcURMQmNRdENCbU1NSnFZelRBanZOQ2JtZERFa084WXhnVnBqRWhrUmdkSmhWaEJDQ3FMa1JDcWloQXAyRUFFSThpQkU3clJrREp3NzE4cUphOTVEZk8yaGt6akNUa1FnUWg2WUZPTWpFRUtVZ2ptUUpvZ1ZBZkFRSmtSNlVJZUlaYlFoWndCeEs1OVRocE0reThidlBER053N0x2WURRakpVK3hBa3p0WktRWVNTQ0Z2dVl0QXNkc3BJZDRNOGpQd1NkU3g0eUI4VHFaSVZVUVFVM2pQS0x6c2pZS2krRXUzUDVBQWpHVE9ZeWw5a0RieXBBL2crQTRlV0dsSFo4VGxpQ25PZE1aenBEQVo4RjRNRnkyNnlRTjgrRWxnN3BCbVBDMDRNOTh4a2hmc2FMTnUraVprTWYyaUNKcGtwVUJ0M29SNVBXQnh5VE5Ga29YV2hMSTVyR2VIbUlNemp0YUU4THBMU0dFVUlZcm9DRkJTMklrNXk4d2hYRTBEYks2Tm5Va0FhMUF6aGc1bDZYMlVNNHZEV3VDWUpxTFFzcHo2VTI5Umt3YmV3Z0tjQUdiaDMyUUhiUzdDQjVoc0JPaGtJTDZsUnRCMmpBQnZXVXRrQlE5SVBoelVBQ0dFaTN1dE10Z1J6UURnZ3hGdmNBb2NXQjNCb2tvRVh4Z0wzbExaQy9HU1lIMFRYSUdQeXFWRC95V3lEM1pNNFFDbFNRTXBUVk1FQ0k5c0VKd2dRdmFvQUhUbkNmUDg3UWhOaUNkZDhUand1TVNVRGdBZzk0d0FWQm5vclNKbjZRS1lSWHlTNm9MY3RSZGxJaHE4RElNLy9IeTFwQWdTd3pCd2JGeTdsQnJEQWwyWHBiQlVOZ3F0QVY0ZzhxRktIbUxUakNMcGRPOWFvbkpDQUFJZmtFQ1RJQS93QXNCZ0FCQUZnQVlRQ25BQUFBQVFFQkFnSUNBd01EQkFRRUJRVUZCZ1lHQndjSENBZ0lDUWtKQ2dvS0N3c0xEQXdNRFEwTkRnNE9EdzhQRUJBUUVSRVJFaElTRXhNVEZCUVVGUlVWRmhZV0Z4Y1hHQmdZR1JrWkdob2FHeHNiSEJ3Y0hSMGRIaDRlSHg4ZklDQWdJU0VoSWlJaUl5TWpKQ1FrSlNVbEppWW1KeWNuS0Nnb0tTa3BLaW9xS3lzckxDd3NMUzB0TGk0dUx5OHZNREF3TVRFeE1qSXlNek16TkRRME5UVTFOalkyTnpjM09EZzRPVGs1T2pvNk96czdQRHc4UFQwOVBqNCtQejgvUUVCQVFVRkJRa0pDUTBORFJFUkVSVVZGUmtaR1IwZEhTRWhJU1VsSlNrcEtTMHRMVEV4TVRVMU5UazVPVDA5UFVGQlFVVkZSVWxKU1UxTlRWRlJVVlZWVlZsWldWMWRYV0ZoWVdWbFpXbHBhVzF0YlhGeGNYVjFkWGw1ZVgxOWZZR0JnWVdGaFltSmlZMk5qWkdSa1pXVmxabVptWjJkbmFHaG9hV2xwYW1wcWEydHJiR3hzYlcxdGJtNXViMjl2Y0hCd2NYRnhjbkp5YzNOemRIUjBkWFYxZG5aMmQzZDNlSGg0ZVhsNWVucDZlM3Q3Zkh4OGZYMTlmbjUrZjM5L2dJQ0FnWUdCZ29LQ2c0T0RoSVNFaFlXRmhvYUdoNGVIaUlpSWlZbUppb3FLaTR1TGpJeU1qWTJOam82T2o0K1BrSkNRa1pHUmtwS1NrNU9UbEpTVWxaV1ZscGFXbDVlWG1KaVluNTJUcXFTS3VLMSt6THByM3NWWTZjeE43czlIOE5CRjhOQkY4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThORkU4TkZFOE5GRThORkU4TkZFOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkc4ZEZHOGRGRzhkRkc4ZEZIOGRGSDhkRkg4ZEZJOGRGSThkRko4ZEpKOGRKSjhkSks4ZEpLOGRKTDhkSkw4ZEpNOGRKTThkTk44ZE5POGROUDhkTlA4ZE5ROGROUThkTlI4dFJTOHRSUzh0UlQ4dFJWOHRWVzh0Vlk4dFpaOHRaYjh0ZGU4OWRnODloaTg5aGo4OWhqODloazg5bG04OWxvOU5wcTlOcHI5TnBzOU50dDlOdHc5Tnh5OU54ejlOMTE5TjEyOU4xMzlOMTU5ZDU3OWQ5KzlkK0E5ZUNEOWVHRzl1S0s5dU9OOXVPUTkrV1grT2lrK091dStlMjQrdS9DK3ZISit2SElNczB5Q1A0QS93a2NTTENnd1lNSURmWUxOeTZodzRjUUkwcWNXSS9iTW1mZDhrM2N5TEhqUm0vSGN1VTZWczZqeVpNbitXMFRLYkpiUDVRd1l6N2N4NDFsTG00dlplcmMrWSttVFpjOGd4THNaKzdidDNnU2ZiTEVLUkhlTjIvbGNncDFPTTVaTDJEWjVrVlVLcElwUkhuWmdQVnlWbkpxUW5yWldQWUNPclBtVXFrSisza0R4aktiUHJNSTFVV3o2YXdkeEg1dWMvWHlGcEhkTTVheHJtbkVxNUJiTDdYYjRDSTBaM1ZzT29qNnRqMFcyY3NyNDRMcURyTk1odTV2T1c3ZFNrTXNwNHd2dk04SCszV2pXM2V4VG54cFdRTHJCaHNoUEdzMms2bmpPZTlaTEpiVzZQVkcrQzFrcmxqSmVkS3pkbnhrdytVSDZXa1ROdmI2em43ZmxQNzFPc2JOTnZhQzlMcHhpeXFVM3podTMvQ2RoN2xQSFRwNDd0cTE0K2FPMzN5OCtLRFRUVGJXUEhOTU1zb29rNHd3MFZpenpUZnArUGRmVFAyazA0MDF5dEJtMDRiakxaUE5OL0xNMTQ5a0c2R3pqVlVicHFqaU1kRjBFNkpKSTBwMHp6ZldXRFBPWFJ2Qnd3MktLdmFZb2pEV2hHTmVSUGpRYU0wMyswQVVUaklpSFpPTk9pVEdWbzQxR3FyNFdDOVgramhTTnV4STFFODUxemlYakhjSTNaTWJTeGk5NWxBKzNyU21vakRLUkpOTk44NDQ4NHcxM2hDNFRKVnFSY09lUSt0c3c2Uk4xMFE1a0prcDltS05hZ2ZadzQxek52V2lURGJlb0NQZlFmbW8wODAxeVd6R1Z6aUcvalBPTTU3V0ZhcEFTNnFZelpBQzJiT05NUDRwS3JNTk9oSmlaczQyeTZTWWpEZFJUcWVpTStaQWxNODMwWlNhaTNBRzNjTU5yRFlCY3cwNnB5TFVEenJYTU12U01kK1FDSTh6MVlrRWpEVi9RcVFqajdsRU54UklHeWJUalQwbzFkT05tMmdHaXg1d25HR2tGVWZvWkxQTU1jK1VSZEE0OElya3pEalJSdFJQVlJ0YW8rYS96aHl6ekRaZG1zU1BPdVFzUE5Cdkd3TExVem1pY2JiTmtQMnNNdzZVVStualdIQms2b1R3dGVITVowN0F3ckFGRVQ2c1N0dWNUZEVndFJ3KzJteVl6YVVQemNQTk5kZDRVN05CK0dpbUZtL0xvUk93TThOQjVNK3lUWDRqa1R0N3NmVE1pNThCNXVsYUJmOHpEM1VpSlFiMFEzUHAxakpzOEdRdHNNVU95V01jY3NwRmhERkxpc0ZHRHY2a040WDlqenpSZEd2dVg5MTRta3pFZUhsOUxhTmZCVTczUk9vNG81dlZqTlZEcjBqVzFETVI0SUxYSFZFOTE5aVVqZDhteVMwNjZady83dVhKejFsenRsQ3NxVVhZNW5OajdubEU0MENhRE55ZkcrVzc3K3dXdFBlMUtUOGtkK2NieFM1U01uNFZGTS92dnBPakVUNlBZbW45ZU9VVlZBNmt5dkFldCtPMmJ4UlB4OGVJVTlBOHIxNlA1VEc4aHRlak11c1VOSTYxM1c4MEQvamwzZzRSUFIzbnNvMzJmTFBKTWJSaERXdHQ2QmlNKzhjM05LUU1uVW5rZnNpYkNBUlpvZzBBOW1nODhiamNocUp4cjRHVWczN2VTOGdFd3pjUmVQU3ZnZ1RSUzQrc2daUjgxZWlGMXJpR3Z6eW91OHRJRUgrRGk0ZzRCalVTOHcxbEhQN1hzRWFEb3RHZ0p3MGtIL25SVHp2YzhUcUIzSXd6czVOSTZrZ29rZm1OeGgwSHdVY1M5UU9QSkhVa0haTGpETk1lV0x2OFRVUnh5d3VoVHVMaHRuTGhLQ0pqcTA0c1ZqVVJSQ0duaVR6SngwclFwRWFGb0dza2xKUElPc0lva3RGOUptM2VDdVRudkZFamI3d3hJb2pNQlREV3hoaW5FUXFQRG9tUi9UUzRqRDdxeEI1bkdza016U0lPdnRtbE45OHc0TSs4WkE1dnBFYUNHaFNHRDluV1JtRW9NaTVWd1pJekVpaXQyZGdraDRlc0V0UWdra0hCQmM4aDZDQ2tKRy81bVF6NlRITU8rYU5JNnVjUWQyaXdYTkFVU2o5cTlTOGVTbEptQnlsSHJ0RGt3SVBjUTJtakdhVkErRUc2MkppRFFOem9vRUR5d2JvbUZZOGdTZjdiVEdlNFdSRHc4SzB6L25BZU42eVJEV2g1UkIzYmNCTXd0dkhJdjEwelp3NkJ4NG1jRVUrSGdERmgra3NhWFhyeE1NVFpiVWVsNnFSQmtoa3BidkN6bitrZ1dVSkFtVEViRW1SODNScExOL1NIa0hWUUtVWE80SjAvZzZQT2pqeXhTYk44S2Y1RUlveXN0TVZZdVlqWlNmL0JzMUpaNHg0b3Vadkh2RmdRZWhwUWpBOUJDNGN3a2syRGhNWW13cUJrUjJSVEpSYWVoVTdHc3NhcDlvSE9ZeG54SVQ4MW8wY01JOENnMWxSUWF2RU1RdEJoaldRa1E0WmhBeDFZbVdtd3dvbnVhUDBFazErejRVbUJ6QU1kbHRwSTduNkp5WWoyanpRYnVRZGt1eW9VM0lEMUdsZ0NobWhIUzlyU1lxVksyZ2pvaEI0eVdTMjVWbGN1WGY1dFFnVDcydG9Xc3FHeVBVZ2tiZXVqWTl3enR3VVpKRzlkeTBIZ1pqVjB1am1HY3BmTDNPWWV3MU56WEtweEI4TFN1cERqRytISXJuYTNtOTF2bENPVTJaRHVkUDlSM2E2Y01UQzVDTzk0RVZMZXZpVUZ2ZXBkcjBIYXExZUhjQ1c5NHAwdWZmMTIzL2pLbHlEMFBhL284bXZjOW01REhrdDBoNElYek9EOHlLTm5lQ013Y050N0lMOWErTUlZWGhDaEpKemJlb1J5dUNueTczOWI5V0VRLzFLMUl4Wklaa3hzcGNpa21DRGxhQ09MdjRYRkZ3K2tRdG53MURHdVlWclNoc2ttMnFDcGpjbGhyV1BJaXpsRlByS05DZkl5UWtIMUlHUGpTem1YVE9KbWNhT0o5ZGdHYWxGTTVZR1VFcXpaS0FjK1JuUVBjdkJZZ0QybHNqbFcwMlVONWJZNXhJaGRNanI2OTlwbzFMakxCeEdITXJXMFN6empzbGhhVWhRdi9Wd1Fkb0EwUmNDZzZKUUpIUnROS2JORkh2MU1RQUFBSWY0VlRXRmtaU0IzYVhSb0lGTmpjbVZsYmxSdlIybG1BRHM9IiA+ICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29udGVudCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leSIgc3R5bGU9J21hcmdpbi10b3A6N3B4Oyc+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fYW1vdW50X21vbmV5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfc2lnbiIgc3R5bGU9J21hcmdpbi10b3A6LTEwcHg7Jz7CpTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9udW0iPiR7aXRlbS5kaXNjb3VudH08L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvbmRpdGlvbiI+5ruhJHtpdGVtLnF1b3RhfeWFg+WPr+eUqDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3RpbWUiIHN0eWxlPSdtYXJnaW4tdG9wOjEwcHg7Jz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90ZXJtIj7mnInmlYjmnJ88L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9kYXRlIj4ke2l0ZW0uZW5kVGltZX08L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jaXJjbGUiIHN0eWxlPSJyaWdodDo0NHB4OyI+PC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGlua19jb3Vwb24iIHN0eWxlPSJwYWRkaW5nOjBweCAxNnB4IDBweCAxNnB4OyI+DQogICAgICAgICAgICAgICAgPGEgY2xhc3M9InpobV9nZXRfbGlua190ZXh0IiBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IDEwcHg7Zm9udC1zaXplOjE2cHg7bWFyZ2luLXRvcDoxMHB4OyIgaHJlZj0iJHtpdGVtLmNvdXBvbl9saW5rfSIgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdycgc3R5bGU9Im1hcmdpbi1sZWZ0OjE2cHg7d2lkdGg6MzRweDsiPumihuWPljwvYT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgYA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1fZGl2X3MnKS5pbm5lckhUTUwgPSBodG1sOw0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCg0KDQogICAgICAgICAgICAgICAgfSxjb3Vwb25XYWl0VGltZSkNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxnb29kc1RpdGxlLHNob3BOYW1lKXsNCg0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNfaWQgPSB0aGlzLmdldFF1ZXJ5U3RyaW5nKCdpZCcpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKCFnb29kc19pZCl7Y29uc29sZS5sb2coJ2dvb2RzX2lkJyk7cmV0dXJufTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUgPT0gJ3pobV90YWJfdGFvYmFvJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucXVlcnlTZWxlY3RvcignZGl2Om50aC1vZi10eXBlKDEpJykuYmVmb3JlKHRoaXMuZGl2RWxlbWVudCk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICBub2RlLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGBodHRwczovL2FwaS50eXBlY2hyb21lLmNvbS9nZXRjb3Vwb24ucGhwP2dvb2RzX2lkPSR7Z29vZHNfaWR9Jmdvb2RzX3RpdGxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGdvb2RzVGl0bGUpfSZzaG9wX25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoc2hvcE5hbWUpfWA7DQoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcD0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGU9PTIwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbCA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGANCiAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvdXBvbiI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGVmdCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2ltZ19pY29uIj4NCiAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQmtBSGovQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpMQUgvQUN3QUFBQUFaQUJrQUtmNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QmpyNkJqcjZCanY2Qmp2NkJqdjZCanY2Qnp2NkJ6djZDRHo2Q0R6NkNUMzZDVDM2Q1QzNkNqNzZDejc2Q3ovNkN6LzZERC82REVENkRVRDZEVUQ2RGtINkRrSDZEa0g2RDBMNkVFTDZFVVA2RVVUNkVrVDdFMFg3RkVYN0ZFYjdGRWI3RlViN0ZVZjdGVWY3RmtmN0ZrZjdGMGo3RjBqN0YwajdGMGo3R0VqN0dFbjdHVXI3R2t2N0cwdjdIRXo3SFUzN0gwLzdJVkQ3STFIN0pGTDdKbFQ3SjFUN0tGYjdLVmI3S2xmN0sxajdMbHI3TUZ6N01sMzdORi84Tm1EOE9HTDhPbVQ4UEdYOFAyZjhRV244UTJyOFJHdjhSbTM4Um0zOFIyNzhTRy84U1hEOFNuRDhUSEw4VG5QOFQzVDhVSFg4VW5mOFZIajhWM3Y4VzM3OFlJTDhaSVg4YW9uOGI0MzhjWS83Y0k3NmJZdjRhNG4xYVlmdVo0VGpaSC9VWkh6SFpudThhWHF0YkhxaWIzcVdjM3FJZDN1QWVIcDVlWGw2ZW5wN2UzdDhmSHg5ZlgxK2ZuNS9mMytBZ0lDQmdZR0Nnb0tEZzRPRWhJU0ZoWVdHaG9hSGg0ZUlpSWlKaVltS2lvcUxpNHVNakl5TmpZMk9qbzZQajQrUWtKQ1JrWkdTa3BLVGs1T1VsSlNWbFpXV2xwYVhsNWVZbUppWm1abWFtcHFibTV1Y25KeWRuWjJlbnA2Zm41K2dvS0Nob2FHaW9xS2pvNk9rcEtTbHBhV3JwcWUycUt2QXFhN0pxckhRcTdQWHJMWGRyTGZpcmJqb3JMbnVxcm55cUxqMXA3ajNwYmY1cExiNm9yYjdvclg4b2JYOG9MVDlvTFQ5b0xUOW9iWDlvcmI5bzdmOXBiajlwcm45cDduOXFMcjlxTHY5cWJ2OXFidjlxcno5cXJ6OXFyejlxN3o5cTczOXE3MzlyYjc5cnIvOXNNSDhzc0w4dE1UOHRzWDh1TWY3dXNuNnZjcjZ3TXo1d3M3NHc4LzR4ZEQzeDlIM3lOTDJ5dFQxeTlYMHpkYnowTmZ5MHRueDFOcngxTnZ4MWR2eDF0engxOTN3Mk4zeDJkL3cyOS92M09IdjN1THY0T1B2NHVYdTVlZnU1K251NnV2dDdlM3U3dTd2NysvdzhQRHg4Zkh5OHZMejgvUDA5UFQxOWZYMjl2YjQrUGo1K2ZuNysvdjgvUHo5L2YzKy92NysvdjcrL3Y0eXpUSUkvZ0QvQ1J4SXNLREJnd2dUS2x6SXNLSERoeEFacWx2U0pLTEZpeGd6L2l0RDVNUUpJMm8waWh4Sk1na0hCd284UENISnN1VkRZa0ljeUpSUXhKL0xtemdMNG9vNWs0ak5uRUJkNGhvaTA0RUVuMEdUR2pRSFJVbVNMdzZIRmozNmsyR1hKVW1nVkZVS3NVa0tDaGg2akdrb3RlZldoR0o4YUtDUXdnblhpR1Y2Rk1WUWsyRlpvMGdYK2p1aVFhYUNIcmplUHFUaW9xaURGRmNZYmlNcWt3S1NobFpXS0pCWklFZEl3UTIzRWFGUWxJSVFad3lqcUtCQVFjVVV1MEk0Tng1eUZuUENLaXNNZzRqQ3NCc1VJa1drTklSU3dyQ0tMYTRkK2pPQ3dYQ1B5eXpSL0RDTTRVandoMXdLRngxUnhlV1lGZ1dLd2lqei9LR1NrdzRLL3NBdzQ1SU1qT3dwSzNaM1NDYkkyaFRxVy9wYlVvS0NoeUhJMXpNc1UyU0lWcHkvTkRGRUVtbm9oeE11VkVDUlJSWllYQ0VFRnI0WTZKb2FVaGpod3d3c2VBQkNDU1dJb0lFTExnaVJ4QlM4U0FpVVAxTVFNY01JR2toZzJJc09VS0JCQ1R3a0VZYUpCWkhUMmtOU0NKRkNjVEFHYVJnSExSZ2hSa2IreEpPY0VqUFl3RVJnRUhVeHhGZENWdmtpQmk0c2tWOURhQ3lSZ3cxTFFLblJFaURJQk1JUFZPeG9rRDlRMkFCa2tCSndCbGFNTGdySmdRK0pOV1RORXp4NElKTUk4V0drbkdFVW5FQ0VGd3VwY1VSdlFjN1lRZzlHbkZDQ0NqQWcwUU1NSi9RRkl3VXRQS0htUUZVRU1jS0xPY0NqMGFCWHVxQWJRbWNRNGVlTC9oU00wTU1SVTJ3NWtCcFVHSkhEQ0tvWmRzSVNuemJCUXE5RjhmQ3BRMHlVQ2VOeEI1MGhoS2FHbFNCRUZNcEVCVVVRakJvbXdoSG1IRlJHRGtHZVFKdElhaVRSd3B0bWprc1FHcysrcUVFT1VoeUxrRDlSOEFDdFRCOEFhNUFYS21SWGxBWXdPS0VOUzFvTWNZSnFDcmhBUmtIZ0hBRmVVU0lVY1laR1poaVJyVXppR3ZUdFpER3FZTVJZTjBrQnhBa2dzTEJTUVUyTTZtc1Q4amJrajFjdnVvQm9RVTZvQU1JSlFsUUhWREJVUE1HRlFWM0E4R0lLVUxqMFJHeWRBYkhsT2xVNGtXWjN0d3lCcmdodTNkVEVDVU15Z1NOQnZCbW1nUkV0QzZTR3JRa3A4YXBNTGN5TW94cEJ2UGdEMlFhUlFVUU9PUndCZDBGcXBEYVgvaEZiL3hQRnhTZm92TkF5UkdoUVFFcEpPSlJGQzBVcHdNS1JKcEt6V1dkNUxUU0dDLzVXZG5kQmZQMnJ0WWxkdU1DeEF5cDA0ZEFZTEdTK25VTmVTQ2NURDVzTDVzVFpFckIyT25hVXljQ2R5OFJOSi9oNi9nelJxd2ZxTW5SZDVqS1E1MUFWV011RXdSSVNmdHU0QzdzM2RIenV5amQwQmcrRytaQ09nV0d3TURvUTM5K09mUFlNK1RONWVET3dZZUFUMlRvRzBmWGhKZC9Wd3lOb2daTVpUaW5odjFOSlFKOUFuUEF3RG56T2ZOaURDUHlta3dXRGZDRUovL05mRXBvUU83RVJnUU9reVNBRk9JQ2Zna0FCV2lYUTMwUG9Wd0Q3UFFRTXFaT0pBUXN5QnZkb2tEUWdNRUkyR0pLRUVveXVLQVdnRHNwQUNKVVI0cTUrL2dKY0NCbCtLQUVnZVBCc0wvSkFEeGhpZzN2SlpsVURXY0tiU3RCREJBSVJJa1AwVnhFTDhvU0h3WW9EREFrRHVCUkF4aklxb0FVZ0c4Z1RRS2cyNi8yd2hFRlVpQmRXb0VVakVvUUtMVEJqR1IyUWd5b3FSQW8vQUpFZ1haQ0RrM0VOV2lDQW9odlBCNUZrRldXRkJIa1pEd1lKSWg5UTRTRnEyQUlXTm9rRkxaRE5KSHViM3h2SDB4Vm9qUUFMQjFFRGd6alpCVEc1aEFvcDRCZ0ZpaUJLUmdwbmZRNFFBU3IxQXdiUkZjVUdGUnlJZVRJSHU0ZWdRUzY1UTRPQjJPYXJuem5rRzBoNGxRZWc5NUFxeExJb1B3aGJVcER3SmcxUTB5Rm1PQUlNWm9BRVZ6SUVDZEI2bm9ta2NESExSR1FiNVJ1aERhSWxRZ09kQVpreS9sRUpWNWlBUkIrWWN6MUx1QmNQM09jeUtCakJDSXEwSExnOHQ3WFFlUzF4NmZNS1dGUlF0UFFaNFY3VTYxdm5pcEtDU3k0RURPZnhpdzNpV0pBb05FOG1HbEJDMy83eGhYa2FoNlFEUWNJSERET0NOaDRrQ3pONDBReGdxaFIvRU9NZ1RsQ1c4NGdnRFlWQTRRUWNVMEFLd0tBUU5BU0JXQ0NvYUVHQ29VMk1WQ01LUDdEQkVCWkdFRFZJelRBZkNKUkIyQ0FFREpBUkEwT28xcnhBU1RsbUZNUUxROGdCRU9LVkV5b0lvVGNLd0lBUXpCa0dseFlsYlFycGdoQlVvQUloUUE0aFUxQUJxYmg2cTdJcWdBTFNzb0pMdkVBRUt2bWxCTUFwaUJSU1FDZ2hIRU1oNkpEQzB4SmlCaDhNN1RRRkNaKy9PbGFFNm1ta0NqbEEvaGRLVHBEWlNKcE5ObExOeUJLODZJRURFa1FNUC94WER3NkxrVjBJRDBZYUtNSlBEWktHcHhyR0JoUExpRU03czlkVUZnNUdHQ0NDU09KeVE3Wkk3RFZJUStrM0xlS1BJcURMQmNRdENCbU1NSnFZelRBanZOQ2JtZERFa084WXhnVnBqRWhrUmdkSmhWaEJDQ3FMa1JDcWloQXAyRUFFSThpQkU3clJrREp3NzE4cUphOTVEZk8yaGt6akNUa1FnUWg2WUZPTWpFRUtVZ2ptUUpvZ1ZBZkFRSmtSNlVJZUlaYlFoWndCeEs1OVRocE0reThidlBER053N0x2WURRakpVK3hBa3p0WktRWVNTQ0Z2dVl0QXNkc3BJZDRNOGpQd1NkU3g0eUI4VHFaSVZVUVFVM2pQS0x6c2pZS2krRXUzUDVBQWpHVE9ZeWw5a0RieXBBL2crQTRlV0dsSFo4VGxpQ25PZE1aenBEQVo4RjRNRnkyNnlRTjgrRWxnN3BCbVBDMDRNOTh4a2hmc2FMTnUraVprTWYyaUNKcGtwVUJ0M29SNVBXQnh5VE5Ga29YV2hMSTVyR2VIbUlNemp0YUU4THBMU0dFVUlZcm9DRkJTMklrNXk4d2hYRTBEYks2Tm5Va0FhMUF6aGc1bDZYMlVNNHZEV3VDWUpxTFFzcHo2VTI5Umt3YmV3Z0tjQUdiaDMyUUhiUzdDQjVoc0JPaGtJTDZsUnRCMmpBQnZXVXRrQlE5SVBoelVBQ0dFaTN1dE10Z1J6UURnZ3hGdmNBb2NXQjNCb2tvRVh4Z0wzbExaQy9HU1lIMFRYSUdQeXFWRC95V3lEM1pNNFFDbFNRTXBUVk1FQ0k5c0VKd2dRdmFvQUhUbkNmUDg3UWhOaUNkZDhUand1TVNVRGdBZzk0d0FWQm5vclNKbjZRS1lSWHlTNm9MY3RSZGxJaHE4RElNLy9IeTFwQWdTd3pCd2JGeTdsQnJEQWwyWHBiQlVOZ3F0QVY0ZzhxRktIbUxUakNMcGRPOWFvbkpDQUFJZmtFQ1RJQS93QXNCZ0FCQUZnQVlRQ25BQUFBQVFFQkFnSUNBd01EQkFRRUJRVUZCZ1lHQndjSENBZ0lDUWtKQ2dvS0N3c0xEQXdNRFEwTkRnNE9EdzhQRUJBUUVSRVJFaElTRXhNVEZCUVVGUlVWRmhZV0Z4Y1hHQmdZR1JrWkdob2FHeHNiSEJ3Y0hSMGRIaDRlSHg4ZklDQWdJU0VoSWlJaUl5TWpKQ1FrSlNVbEppWW1KeWNuS0Nnb0tTa3BLaW9xS3lzckxDd3NMUzB0TGk0dUx5OHZNREF3TVRFeE1qSXlNek16TkRRME5UVTFOalkyTnpjM09EZzRPVGs1T2pvNk96czdQRHc4UFQwOVBqNCtQejgvUUVCQVFVRkJRa0pDUTBORFJFUkVSVVZGUmtaR1IwZEhTRWhJU1VsSlNrcEtTMHRMVEV4TVRVMU5UazVPVDA5UFVGQlFVVkZSVWxKU1UxTlRWRlJVVlZWVlZsWldWMWRYV0ZoWVdWbFpXbHBhVzF0YlhGeGNYVjFkWGw1ZVgxOWZZR0JnWVdGaFltSmlZMk5qWkdSa1pXVmxabVptWjJkbmFHaG9hV2xwYW1wcWEydHJiR3hzYlcxdGJtNXViMjl2Y0hCd2NYRnhjbkp5YzNOemRIUjBkWFYxZG5aMmQzZDNlSGg0ZVhsNWVucDZlM3Q3Zkh4OGZYMTlmbjUrZjM5L2dJQ0FnWUdCZ29LQ2c0T0RoSVNFaFlXRmhvYUdoNGVIaUlpSWlZbUppb3FLaTR1TGpJeU1qWTJOam82T2o0K1BrSkNRa1pHUmtwS1NrNU9UbEpTVWxaV1ZscGFXbDVlWG1KaVluNTJUcXFTS3VLMSt6THByM3NWWTZjeE43czlIOE5CRjhOQkY4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThORkU4TkZFOE5GRThORkU4TkZFOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkc4ZEZHOGRGRzhkRkc4ZEZIOGRGSDhkRkg4ZEZJOGRGSThkRko4ZEpKOGRKSjhkSks4ZEpLOGRKTDhkSkw4ZEpNOGRKTThkTk44ZE5POGROUDhkTlA4ZE5ROGROUThkTlI4dFJTOHRSUzh0UlQ4dFJWOHRWVzh0Vlk4dFpaOHRaYjh0ZGU4OWRnODloaTg5aGo4OWhqODloazg5bG04OWxvOU5wcTlOcHI5TnBzOU50dDlOdHc5Tnh5OU54ejlOMTE5TjEyOU4xMzlOMTU5ZDU3OWQ5KzlkK0E5ZUNEOWVHRzl1S0s5dU9OOXVPUTkrV1grT2lrK091dStlMjQrdS9DK3ZISit2SElNczB5Q1A0QS93a2NTTENnd1lNSURmWUxOeTZodzRjUUkwcWNXSS9iTW1mZDhrM2N5TEhqUm0vSGN1VTZWczZqeVpNbitXMFRLYkpiUDVRd1l6N2N4NDFsTG00dlplcmMrWSttVFpjOGd4THNaKzdidDNnU2ZiTEVLUkhlTjIvbGNncDFPTTVaTDJEWjVrVlVLcElwUkhuWmdQVnlWbkpxUW5yWldQWUNPclBtVXFrSisza0R4aktiUHJNSTFVV3o2YXdkeEg1dWMvWHlGcEhkTTVheHJtbkVxNUJiTDdYYjRDSTBaM1ZzT29qNnRqMFcyY3NyNDRMcURyTk1odTV2T1c3ZFNrTXNwNHd2dk04SCszV2pXM2V4VG54cFdRTHJCaHNoUEdzMms2bmpPZTlaTEpiVzZQVkcrQzFrcmxqSmVkS3pkbnhrdytVSDZXa1ROdmI2em43ZmxQNzFPc2JOTnZhQzlMcHhpeXFVM3podTMvQ2RoN2xQSFRwNDd0cTE0K2FPMzN5OCtLRFRUVGJXUEhOTU1zb29rNHd3MFZpenpUZnArUGRmVFAyazA0MDF5dEJtMDRiakxaUE5OL0xNMTQ5a0c2R3pqVlVicHFqaU1kRjBFNkpKSTBwMHp6ZldXRFBPWFJ2Qnd3MktLdmFZb2pEV2hHTmVSUGpRYU0wMyswQVVUaklpSFpPTk9pVEdWbzQxR3FyNFdDOVgramhTTnV4STFFODUxemlYakhjSTNaTWJTeGk5NWxBKzNyU21vakRLUkpOTk44NDQ4NHcxM2hDNFRKVnFSY09lUSt0c3c2Uk4xMFE1a0prcDltS05hZ2ZadzQxek52V2lURGJlb0NQZlFmbW8wODAxeVd6R1Z6aUcvalBPTTU3V0ZhcEFTNnFZelpBQzJiT05NUDRwS3JNTk9oSmlaczQyeTZTWWpEZFJUcWVpTStaQWxNODMwWlNhaTNBRzNjTU5yRFlCY3cwNnB5TFVEenJYTU12U01kK1FDSTh6MVlrRWpEVi9RcVFqajdsRU54UklHeWJUalQwbzFkT05tMmdHaXg1d25HR2tGVWZvWkxQTU1jK1VSZEE0OElya3pEalJSdFJQVlJ0YW8rYS96aHl6ekRaZG1zU1BPdVFzUE5Cdkd3TExVem1pY2JiTmtQMnNNdzZVVStualdIQms2b1R3dGVITVowN0F3ckFGRVQ2c1N0dWNUZEVndFJ3KzJteVl6YVVQemNQTk5kZDRVN05CK0dpbUZtL0xvUk93TThOQjVNK3lUWDRqa1R0N3NmVE1pNThCNXVsYUJmOHpEM1VpSlFiMFEzUHAxakpzOEdRdHNNVU95V01jY3NwRmhERkxpc0ZHRHY2a040WDlqenpSZEd2dVg5MTRta3pFZUhsOUxhTmZCVTczUk9vNG81dlZqTlZEcjBqVzFETVI0SUxYSFZFOTE5aVVqZDhteVMwNjZady83dVhKejFsenRsQ3NxVVhZNW5OajdubEU0MENhRE55ZkcrVzc3K3dXdFBlMUtUOGtkK2NieFM1U01uNFZGTS92dnBPakVUNlBZbW45ZU9VVlZBNmt5dkFldCtPMmJ4UlB4OGVJVTlBOHIxNlA1VEc4aHRlak11c1VOSTYxM1c4MEQvamwzZzRSUFIzbnNvMzJmTFBKTWJSaERXdHQ2QmlNKzhjM05LUU1uVW5rZnNpYkNBUlpvZzBBOW1nODhiamNocUp4cjRHVWczN2VTOGdFd3pjUmVQU3ZnZ1RSUzQrc2daUjgxZWlGMXJpR3Z6eW91OHRJRUgrRGk0ZzRCalVTOHcxbEhQN1hzRWFEb3RHZ0p3MGtIL25SVHp2YzhUcUIzSXd6czVOSTZrZ29rZm1OeGgwSHdVY1M5UU9QSkhVa0haTGpETk1lV0x2OFRVUnh5d3VoVHVMaHRuTGhLQ0pqcTA0c1ZqVVJSQ0duaVR6SngwclFwRWFGb0dza2xKUElPc0lva3RGOUptM2VDdVRudkZFamI3d3hJb2pNQlREV3hoaW5FUXFQRG9tUi9UUzRqRDdxeEI1bkdza016U0lPdnRtbE45OHc0TSs4WkE1dnBFYUNHaFNHRDluV1JtRW9NaTVWd1pJekVpaXQyZGdraDRlc0V0UWdra0hCQmM4aDZDQ2tKRy81bVF6NlRITU8rYU5JNnVjUWQyaXdYTkFVU2o5cTlTOGVTbEptQnlsSHJ0RGt3SVBjUTJtakdhVkErRUc2MkppRFFOem9vRUR5d2JvbUZZOGdTZjdiVEdlNFdSRHc4SzB6L25BZU42eVJEV2g1UkIzYmNCTXd0dkhJdjEwelp3NkJ4NG1jRVUrSGdERmgra3NhWFhyeE1NVFpiVWVsNnFSQmtoa3BidkN6bitrZ1dVSkFtVEViRW1SODNScExOL1NIa0hWUUtVWE80SjAvZzZQT2pqeXhTYk44S2Y1RUlveXN0TVZZdVlqWlNmL0JzMUpaNHg0b3Vadkh2RmdRZWhwUWpBOUJDNGN3a2syRGhNWW13cUJrUjJSVEpSYWVoVTdHc3NhcDlvSE9ZeG54SVQ4MW8wY01JOENnMWxSUWF2RU1RdEJoaldRa1E0WmhBeDFZbVdtd3dvbnVhUDBFazErejRVbUJ6QU1kbHRwSTduNkp5WWoyanpRYnVRZGt1eW9VM0lEMUdsZ0NobWhIUzlyU1lxVksyZ2pvaEI0eVdTMjVWbGN1WGY1dFFnVDcydG9Xc3FHeVBVZ2tiZXVqWTl3enR3VVpKRzlkeTBIZ1pqVjB1am1HY3BmTDNPWWV3MU56WEtweEI4TFN1cERqRytISXJuYTNtOTF2bENPVTJaRHVkUDlSM2E2Y01UQzVDTzk0RVZMZXZpVUZ2ZXBkcjBIYXExZUhjQ1c5NHAwdWZmMTIzL2pLbHlEMFBhL284bXZjOW01REhrdDBoNElYek9EOHlLTm5lQ013Y050N0lMOWErTUlZWGhDaEpKemJlb1J5dUNueTczOWI5V0VRLzFLMUl4Wklaa3hzcGNpa21DRGxhQ09MdjRYRkZ3K2tRdG53MURHdVlWclNoc2ttMnFDcGpjbGhyV1BJaXpsRlByS05DZkl5UWtIMUlHUGpTem1YVE9KbWNhT0o5ZGdHYWxGTTVZR1VFcXpaS0FjK1JuUVBjdkJZZ0QybHNqbFcwMlVONWJZNXhJaGRNanI2OTlwbzFMakxCeEdITXJXMFN6empzbGhhVWhRdi9Wd1Fkb0EwUmNDZzZKUUpIUnROS2JORkh2MU1RQUFBSWY0VlRXRmtaU0IzYVhSb0lGTmpjbVZsYmxSdlIybG1BRHM9IiA+ICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29udGVudCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fYW1vdW50X21vbmV5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfc2lnbiI+wqU8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfbnVtIj4ke3Jlc3AuZGF0YS55b3VodWlxdWFufTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29uZGl0aW9uIj4ke3Jlc3AuZGF0YS5jb3Vwb25faW5mb308L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90aW1lIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90ZXJtIj7mnInmlYjmnJ88L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9kYXRlIj4ke3Jlc3AuZGF0YS5jb3Vwb25fZW5kX3RpbWV9PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY2lyY2xlIj48L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9saW5rX2NvdXBvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDoiPg0KICAgICAgICAgICAgPGEgY2xhc3M9InpobV9nZXRfbGlua190ZXh0IiBvbmNsaWNrPSJ3aW5kb3cub3BlbignaHR0cHM6Ly9hcGkudHlwZWNocm9tZS5jb20vY29kZS5waHA/bGluaz0ke3Jlc3AuZGF0YS5jb2RlX3VybH0nKSI+54K55Ye76aKG5Y+WPC9hPg0KICAgICAgICAgICAgPGRpdiBpZD0idGJxcmNvZGUiIGNsYXNzPSJ6aG1fcXJjb2RlIj48L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgYDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtX2Rpdl9zJykuaW5uZXJIVE1MPWh0bWw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXJjb2RlID0gbmV3IFFSQ29kZSgidGJxcmNvZGUiLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA2NywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2NywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEYXJrIDogIiMxMjEyMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxpZ2h0IDogIiNmZmZmZmYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0TGV2ZWwgOiBRUkNvZGUuQ29ycmVjdExldmVsLk0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyY29kZS5tYWtlQ29kZShyZXNwLmRhdGEuY29kZV91cmwpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLXJvb3QtLWh3RXVqZ2MnKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLXJvb3QtLWh3RXVqZ2MnKS5zdHlsZT0icG9zaXRpb246dW5zZXQiOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZ2V0VGl0bGVTaG9wKHRpdGxlLHNob3Apew0KDQogICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gcmVzcCgpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc1RpdGxlRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQodGl0bGUpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZURvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KHNob3ApOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc1RpdGxlPWdvb2RzVGl0bGVEb20/Z29vZHNUaXRsZURvbS5pbm5lclRleHQ6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNob3BOYW1lID0gc2hvcE5hbWVEb20/c2hvcE5hbWVEb20uaW5uZXJUZXh0OicnOw0KDQogICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307DQoNCiAgICAgICAgICAgICAgICAgICAgZGF0YS5nb29kc1RpdGxlID0gZ29vZHNUaXRsZTsNCg0KICAgICAgICAgICAgICAgICAgICBkYXRhLnNob3BOYW1lID0gc2hvcE5hbWU7DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcCgpOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGNsYXNzIFBsYXlWaWRlb0NsYXNzIGV4dGVuZHMgQmFzZUNsYXNzew0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCiAgICAgICAgICAgICAgICBzdXBlcigpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBjbGFzcyBQbGF5TXVzaWNDbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7DQogICAgICAgICAgICAgICAgc3VwZXIoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgeG1seUNyZWF0ZUNoZWNrYm94KCl7DQoNCiAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0bGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc291bmQtbGlzdCB1bCBsaScpOw0KDQogICAgICAgICAgICAgICAgc291bmRMaXN0bGkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tib3hlZCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignaW5wdXQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihjaGVja2JveGVkKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLnRleHQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgICAgIHRpdGxlLnN0eWxlID0gIndpZHRoOjM2MHB4IjsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gdGl0bGUucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgnaHJlZicpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdERvbSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLmljb24td3JhcHBlcicpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dERvbSA9IGZpcnN0RG9tLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICBpbnB1dERvbS5zdHlsZT0gJ21pbi13aWR0aDogMHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgaW5wdXREb20uaW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nemhtQ2hlY2tib3gnIHZhbHVlPSIrc3JjKyIgIGNsYXNzPSd6aG1DaGVja2JveCc+IjsNCg0KICAgICAgICAgICAgICAgICAgICBmaXJzdERvbS5iZWZvcmUoaW5wdXREb20pOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY2xhc3MgWmhDbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCg0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCiAgICAgICAgICAgICAgICBzdXBlcigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2hvd1NwZWNpYWxDb2x1bW4oKXsNCg0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFJlY29tbWVuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5GZWVkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFJlY29tbWVuZC5sZW5ndGggPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5zcGVjaWFsQ29sdW1uJykpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhWm9wKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudHlwZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRpdGxlKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3NwZWNpYWxDb2x1bW4gQnV0dG9uIFZvdGVCdXR0b24gVm90ZUJ1dHRvbi0tdXAnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnbGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjBweCA1cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+aWh+eroCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7DQogICAgICAgICAgICAgICAgICAgIGxldCBuPTA7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihuKys+NjAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkU2VhcmNoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudHlwZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlID09ICdQb3N0Jyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aXRsZSlyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3NwZWNpYWxDb2x1bW4gQnV0dG9uIFZvdGVCdXR0b24gVm90ZUJ1dHRvbi0tdXAnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlID0gJ2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzowcHggNXB4O21hcmdpbi1yaWdodDo1cHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn5paH56ugJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2hvd1ZpZGVvVGl0bGUoKXsNCg0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFJlY29tbWVuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5GZWVkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFJlY29tbWVuZC5sZW5ndGggPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlJykpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhWm9wKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNWaWRlbyA9IGRhdGFab3AuY2FyZC5oYXNfdmlkZW87DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihoYXNWaWRlbyA9PSB0cnVlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPmRpdj5hJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5kaXY+YScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmEnKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+YScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3ZpZGVvVGl0bGUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnYmFja2dyb3VuZDogcmdiYSgyNTUsIDEzMSwgODYsIDAuMTIpO2NvbG9yOiByZ2IoMjU1LCA3MywgMTIpO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfop4bpopEnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBuPTA7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihuKys+NjAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkU2VhcmNoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZScpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudHlwZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlID09ICdadmlkZW8nICl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aXRsZSlyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3ZpZGVvVGl0bGUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlID0gJ2JhY2tncm91bmQ6IHJnYmEoMjU1LCAxMzEsIDg2LCAwLjEyKTtjb2xvcjogcmdiKDI1NSwgNzMsIDEyKTtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZToxNHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+inhumikSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVtb3ZlVmlkZW8oKXsNCg0KICAgICAgICAgICAgICAgIGxldCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkZlZWQnKTsNCg0KICAgICAgICAgICAgICAgIGNhcmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRhdGFab3AuY2FyZC5jb250ZW50LnZpZGVvX2lkOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnROb2RlLnN0eWxlPSdkaXNwbGF5Om5vbmU7JzsNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVtb3ZlQUQoKXsNCg0KICAgICAgICAgICAgICAgIGxldCB6aEhpZGVBRCA9IGAuUGMtY2FyZCwuUGMtd29yZHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9LlRvcHN0b3J5SXRlbS0tYWR2ZXJ0Q2FyZHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH1gOw0KDQogICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHpoSGlkZUFEKSk7DQoNCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZG93bmxvYWRWaWRlbygpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzOlwvXC93d3dcLnpoaWh1XC5jb21cL3p2aWRlb1wvLisvKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtRG93bmxvYWQnKSlyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5fZTI5NnBnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1dHRvbi5sZW5ndGg8MilyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZEJ1dCA9IGJ1dHRvblsxXS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb3dubG9hZEJ1dC5xdWVyeVNlbGVjdG9yKCcuXzF0ZzhvaXInKSlyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpLmlubmVyVGV4dD0n5LiL6L29JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQuc2V0QXR0cmlidXRlKCdpZCcsJ2Rvd25sb2FkVmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uWzFdLmJlZm9yZShkb3dubG9hZEJ1dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkb3dubG9hZFZpZGVvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmlkZW9JZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5aVmlkZW8tcGxheWVyJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6VmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuWlZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRGF0YSA9IEpTT04ucGFyc2UoelZpZGVvLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JZCA9IHZpZGVvRGF0YS5jYXJkLmNvbnRlbnQudmlkZW9faWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9VcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9PYmogPSB2aWRlb1VybC5zcGxpdCgnPycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSWQgPSB2aWRlb09ialswXS5zcGxpdCgnLycpLnBvcCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0lkKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquiOt+WPluinhumikWlkJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpoRG93bmxvYWQodmlkZW9JZCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMjAwMCk7DQoNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLChlKSA9PiB7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoIWUucmVsYXRlZE5vZGUucXVlcnlTZWxlY3RvcikgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5QmFyID0gZS5yZWxhdGVkTm9kZS5xdWVyeVNlbGVjdG9yKCc6c2NvcGUgPiBkaXY6bGFzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpudGgtb2YtdHlwZSgyKScpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5QmFyIHx8IHBsYXlCYXIucXVlcnlTZWxlY3RvcignLnpobURvd25sb2FkJykpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICBpZihwbGF5QmFyLmNsYXNzTmFtZSAhPSAnY3NzLTE5OXF4N20nKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5QnV0PSBwbGF5QmFyLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignLl8xYzFjdnVnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5QnV0TGkgPSBwbGF5QnV0LnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IGRpdjpsYXN0LWNoaWxkID4gZGl2OmZpcnN0LWNoaWxkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5QnV0TGkpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvd25sb2FkQnV0ID0gcGxheUJ1dExpLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQuY2xhc3NOYW1lID0gcGxheUJ1dExpLmNsYXNzTmFtZSArICcgemhtRG93bmxvYWQnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5QnV0TGkuYmVmb3JlKGRvd25sb2FkQnV0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmlkZW9JZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZpZGVvRGF0YShkb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnREb20gPSBkb20ucGFyZW50Tm9kZQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmVudERvbS5jbGFzc05hbWUgJiYgcGFyZW50RG9tLmNsYXNzTmFtZT09J0ZlZWQnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyZW50RG9tLmNsYXNzTmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RhdGEgPSBKU09OLnBhcnNlKHBhcmVudERvbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0lkID0gdmlkZW9EYXRhLmNhcmQuY29udGVudC52aWRlb19pZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RhdGEocGFyZW50RG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmlkZW9EYXRhKHBsYXlCdXQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvSWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5bop4bpopFpZCcpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aERvd25sb2FkKHZpZGVvSWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZnVuY3Rpb24gemhEb3dubG9hZCh2aWRlb0lkKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbGVucy56aGlodS5jb20vYXBpL3Y0L3ZpZGVvcy8nK3ZpZGVvSWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucGxheWxpc3QgIT0gdW5kZWZpbmVkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5X3VybCA9IGRhdGEucGxheWxpc3QuTEQucGxheV91cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9OYW1lID0gdmlkZW9JZCsiLm1wNCI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwbGF5X3VybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQocGxheV91cmwsdmlkZW9OYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+S4i+i9veWksei0pe+8gScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVtb3ZlUmlnaHQoKXsNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLnpoaWh1XC5jb21cL3Blb3BsZVwvLiovKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgemhGdWxsU2NyZWVuID0gYC5HbG9iYWxTaWRlQmFyIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fQ0KICAgICAgICAgICAgICAgICAgICAuY3NzLTFxeXl0ajd7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30NCiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uLXNpZGVDb2x1bW57ZGlzcGxheTpub25lICFpbXBvcnRhbnR9DQogICAgICAgICAgICAgICAgICAgIC5Ub3BzdG9yeS1tYWluQ29sdW1ue3dpZHRoOjEwMCUgIWltcG9ydGFudH0NCiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uLW1haW5Db2x1bW57d2lkdGg6MTAwMHB4ICFpbXBvcnRhbnR9DQogICAgICAgICAgICAgICAgICAgIC5jc3MtY2F6ZzQ4e21hcmdpbjogMHB4IDE2cHggMHB4IDBweCAhaW1wb3J0YW50O30NCiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uV2FpdGluZy1tYWluQ29sdW1ue3dpZHRoOjEwMCUgIWltcG9ydGFudDt9DQogICAgICAgICAgICAgICAgICAgIC5jc3MtMWo1ZDNsbHtwYWRkaW5nLWxlZnQ6MTBweDt9DQogICAgICAgICAgICAgICAgICAgIC5jc3MteWhqd29le2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50O30NCiAgICAgICAgICAgICAgICAgICAgLkF1dGhvckluZm97bWF4LXdpZHRoOjEwMDBweCAhaW1wb3J0YW50O307DQogICAgICAgICAgICAgICAgICAgIGA7DQogICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHpoRnVsbFNjcmVlbikpOw0KDQogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjaGFuZ2VMaW5rKCl7DQoNCiAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwuaW5kZXhPZigndGFyZ2V0JykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLmdldFVybFBhcmFtcyhjb3Vwb25VcmwpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKG9iai50YXJnZXQgPT0gdW5kZWZpbmVkKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBkZWNvZGVVUklDb21wb25lbnQob2JqLnRhcmdldCk7DQoNCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1saW5rOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJlbW92ZUtleXdvcmQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBHTUtleXdvcmQgPSBHTV9nZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLCcwJyk7DQoNCiAgICAgICAgICAgICAgICBpZihHTUtleXdvcmQgPT0gJzAnIHx8IEdNS2V5d29yZCA9PSAnJykgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgbGV0IGtleXdvcmQgPSBHTUtleXdvcmQuc3BsaXQoJywnKTsNCg0KICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnRJdGVtJyk7DQoNCiAgICAgICAgICAgICAgICBrZXl3b3JkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKHZhbHVlLmdldEF0dHJpYnV0ZSgnZGF0YS16b3AnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFab3AgJiYgZGF0YVpvcC50aXRsZS5pbmRleE9mKGl0ZW0pICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZCA9IHZhbHVlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1DYXJkQ2xhc3M9IGl0ZW1DYXJkLmNsYXNzTmFtZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1DYXJkQ2xhc3MuaW5kZXhPZignVG9wc3RvcnlJdGVtLWlzUmVjb21tZW5kJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1DYXJkLnN0eWxlPSdkaXNwbGF5Om5vbmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZW1vdmVBdXRob3JOYW1lKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgR01BdXRob3JOYW1lID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJywnMCcpOw0KDQogICAgICAgICAgICAgICAgaWYoR01BdXRob3JOYW1lID09ICcwJyB8fCBHTUF1dGhvck5hbWUgPT0gJycpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgIGxldCBhdXRob3JOYW1lID0gR01BdXRob3JOYW1lLnNwbGl0KCcsJyk7DQoNCiAgICAgICAgICAgICAgICAvL+aQnOe0oumhtQ0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3dy56aGlodS5jb21cL3NlYXJjaC8pKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJMaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNhcmQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih1c2VyTGluay5sZW5ndGggPiA1KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaW5rLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihhdXRob3IuaW5uZXJUZXh0KSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobj4zMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKys7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwxMDApDQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/lm57nrZTpobUNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9xdWVzdGlvblwvLiovKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1Eb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuTGlzdC1pdGVtJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbURvbS5sZW5ndGg+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Eb20uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuQ29udGVudEl0ZW0nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShjb250ZW50LmdldEF0dHJpYnV0ZSgnZGF0YS16b3AnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGRhdGFab3AuYXV0aG9yTmFtZSkgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvL+etieS9oOWbnuetlOmhtQ0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS9xdWVzdGlvbi93YWl0aW5nJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVlc3Rpb25MaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzTmF2aWdhYmxlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1ZXN0aW9uTGlzdC5sZW5ndGg+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbkxpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yRG9tVGV4dCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLmNzcy10bnNheGgnKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yRG9tVGV4dCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBhdXRob3JEb21UZXh0LnJlcGxhY2UoJyInLCcnKS5yZXBsYWNlKCfnmoTmj5Dpl64nLCcnKS5yZXBsYWNlKC8oXlxzKyl8KFxzKyQpL2csJycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3Ipew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvcikgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGU9J2Rpc3BsYXk6bm9uZTsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMzAwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvL+aOqOiNkOmhtQ0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZSh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JOYW1lLmluZGV4T2YoZGF0YVpvcC5hdXRob3JOYW1lKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUNhcmQgPSB2YWx1ZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1DYXJkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ2FyZC5zdHlsZT0nZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGxldCBuPTA7DQoNCiAgICAgICAgICAgICAgICBsZXQgdGltZXJDbG9zZUF1dGhvciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQ29tbWVudHMtY29udGFpbmVyJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkNvbW1lbnRzLWNvbnRhaW5lcicpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMzRwb2RyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoY29tbWVudERvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50TGkgPSBjb21tZW50RG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jc3MtMWZybjkzeD5kaXY+ZGl2Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbW1lbnRMaVswXS5jbGFzc05hbWU9PSdjc3MtMTk0djczbScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRBdXRob3JOYW1lRG9tID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuY3NzLTFyZDBoNmYnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudEF1dGhvck5hbWUgPSBjb21tZW50QXV0aG9yTmFtZURvbS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGNvbW1lbnRBdXRob3JOYW1lKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJlbW92ZVlhbnh1YW4oKXsNCg0KICAgICAgICAgICAgICAgIC8v5Zue562U6aG1DQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBpdGVtRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkxpc3QtaXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1Eb20ubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tT3JkaW5hcnlMYWJlbC1jb250ZW50Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYW5zd2VyQ2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BbnN3ZXJDYXJkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoYW5zd2VyQ2FyZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYW5zd2VyQ2FyZC5xdWVyeVNlbGVjdG9yKCcuS2ZlQ29sbGVjdGlvbi1PcmRpbmFyeUxhYmVsLWNvbnRlbnQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCAmJiBjb250ZW50LmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgIknKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJDYXJkLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8v5pCc57Si6aG1DQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpew0KDQogICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkTGlzdC5sZW5ndGggPiA1KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZExpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tUGNDb2xsZWdlQ2FyZC10eXBlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZSAmJiB0eXBlLmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgInkuJPmoI8nKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yWWFueHVhbiA9IFsn5pWF5LqL5qGj5qGI5bGAJywgJ+ebkOmAieaOqOiNkCcsICfnm5DpgInnp5Hmma4nLCAn55uQ6YCJ5oiQ6ZW/6K6h5YiSJywgJ+efpeS5juebkOmAieS8muWRmCcsICfnn6XkuY7nm5DpgInliJvkvZzogIUnLCAn55uQ6YCJ5b+D55CGJywgJ+ebkOmAieWBpeW6t+W/heS/ruivvicsICfnm5DpgInlpYflppnnianor60nLCAn55uQ6YCJ55Sf5rS76aaGJywgJ+ebkOmAieiBjOWcuicsICfnm5DpgInmloflrabnlITpgIknLCAn55uQ6YCJ5L2c6ICF5bCP566h5a62JywgJ+ebkOmAieWNmueJqemmhicsICfnm5DpgInngrnph5EnLCAn55uQ6YCJ5rWL6K+E5a6kJywgJ+ebkOmAieenkeaKgOWJjeayvycsICfnm5DpgInkvJrlkZjnsr7lk4EnLCAn5Y6G5Y+y546v5ri46K6wJ107DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yICYmIGF1dGhvcllhbnh1YW4uaW5kZXhPZihhdXRob3IuaW5uZXJUZXh0KSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihudW0+MzApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtKys7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwxMDApDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvL+aOqOiNkOmhtQ0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjbG9zZUF1dGhvcigpew0KICAgICAgICAgICAgICAgIC8v6YCa6L+H5a6a5pe25Zmo6I635Y+WDQoNCiAgICAgICAgICAgICAgICBsZXQgdGltZXJDbG9zZUF1dGhvciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNsb3NlQXV0aG9yQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUNsb3NlQXV0aG9yQnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoemhtQ2xvc2VBdXRob3JCdXR0b24pcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JJbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNzcy0xcmFzYW1yJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9ySW5mbyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyTmFtZUluZm8gPSBhdXRob3JJbmZvLnF1ZXJ5U2VsZWN0b3IoJy5Vc2VyTGluaycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyTmFtZUluZm8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJMaW5rSW5mbyA9IHVzZXJOYW1lSW5mby5xdWVyeVNlbGVjdG9yKCcuVXNlckxpbmstbGluaycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvck5hbWVMaW5rID0gdXNlckxpbmtJbmZvLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBHTUF1dGhvck5hbWUgPSBHTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JBcnJheSA9IEdNQXV0aG9yTmFtZT9HTUF1dGhvck5hbWUuc3BsaXQoJywnKTonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25DbG9zZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID0gYXV0aG9yQXJyYXkuaW5kZXhPZihhdXRob3JOYW1lTGluaykgIT0gLTE/J+W3suWxj+iUvSc6J+Wxj+iUveeUqOaItyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zdHlsZSA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8ncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjJlNGQ7Ym9yZGVyLWNvbG9yOiNmZjJlNGQnOidwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmNsYXNzTmFtZT0nQnV0dG9uIEZvbGxvd0J1dHRvbiBGRWZVcmRmTUlLcFFESkRxa2p0ZSBCdXR0b24tLXByaW1hcnkgQnV0dG9uLS1ibHVlIGVwTUpsMGxGUXVZYkM3anJ3cl9vIEptWXpha3k3TUVQTUZjSkRMTk1HJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLnNldEF0dHJpYnV0ZSgnaWQnLCd6aG1DbG9zZUF1dGhvckJ1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWVJbmZvLmFwcGVuZENoaWxkKGJ1dHRvbkNsb3NlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lSW5mby5wYXJlbnROb2RlLnN0eWxlPSdsaW5lLWhlaWdodDozNXB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1BdXRob3JOYW1lOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkNsb3NlLmlubmVySFRNTD09J+W3suWxj+iUvScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGF1dGhvckFycmF5Lmxlbmd0aDtpKyspew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yQXJyYXlbaV0gPT0gYXV0aG9yTmFtZUxpbmspew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvckFycmF5LnNwbGljZShpLDEpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1BdXRob3JOYW1lID0gYXV0aG9yQXJyYXkudG9TdHJpbmcoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQXV0aG9yTmFtZT0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyk/R01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJykrJywnK2F1dGhvck5hbWVMaW5rOmF1dGhvck5hbWVMaW5rOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyx6aG1BdXRob3JOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzIyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID0gYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID09ICflt7LlsY/olL0nPyflsY/olL3nlKjmiLcnOiflt7LlsY/olL0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLnN0eWxlID0gYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID09ICflt7LlsY/olL0nPydwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6I2ZmMmU0ZDtib3JkZXItY29sb3I6I2ZmMmU0ZCc6J3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHgnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBjbGFzcyBWaWRlb0Rvd25sb2FkQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7DQoNCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7DQoNCiAgICAgICAgICAgICAgICBzdXBlcigpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnhnLXZpZGVvLWNvbnRhaW5lcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZzTmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZ1eV93bWN0Om50aC1vZi10eXBlKDUpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwuaW5kZXhPZigndnNkZXRhaWwnKSAhPSAtMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+e7vOiJuuagj+ebruWFs+mXreS4i+i9vScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRHlWaWRlb0Rvd25sb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1BsYXlEb21BbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JbmRleCA9IHZpZGVvUGxheURvbUFsbC5sZW5ndGg+MT92aWRlb1BsYXlEb21BbGwubGVuZ3RoLTI6dmlkZW9QbGF5RG9tQWxsLmxlbmd0aC0xOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tID0gdmlkZW9QbGF5RG9tQWxsW3ZpZGVvSW5kZXhdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXlEb20uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+57uT5p2fIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctc3dpdGNoLWNoZWNrZWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuUHo4dDJtZVAnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm8ubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhY2NvdW50Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9bdmlkZW9JbmRleF0uaW5uZXJUZXh0KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCA9IGluZm9bdmlkZW9JbmRleF0uaW5uZXJUZXh0LnJlcGxhY2VBbGwoJy4nLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnhoRG9wY1FfJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdnRbdmlkZW9JbmRleF0uaW5uZXJUZXh0LnNwbGl0KCcjJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGl0bGVbMF0gfHwgdGl0bGVbMV0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHRpdGxlWzBdP3RpdGxlWzBdLnJlcGxhY2VBbGwoJy4nLCcnKSthY2NvdW50KycubXA0Jzp0aXRsZVsxXS5yZXBsYWNlQWxsKCcuJywnJykrYWNjb3VudCsnLm1wNCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoYWNjb3VudCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYWNjb3VudCsnLm1wNCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpKycubXA0JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZCh2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjLGZpbGVuYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHZpZGVvUGxheURvbS5jaGlsZHJlblswXS5zcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZ2V0Q29udHJvbHMpOw0KDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5jb2RlPT0nQXJyb3dEb3duJyB8fCBlLmNvZGU9PSdBcnJvd1VwJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0ZWREb20oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJ3ZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RvbS5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLChlKSA9PiB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZERvbSgpOw0KDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZ2V0Q29udHJvbHMpOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcmVhdGVEeVZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIGxldCBjb250cm9sQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnhnLXJpZ2h0LWdyaWQnKTsNCg0KICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGNvbnRyb2xBbGwubGVuZ3RoPjE/Y29udHJvbEFsbFtjb250cm9sQWxsLmxlbmd0aC0yXTpjb250cm9sQWxsW2NvbnRyb2xBbGwubGVuZ3RoLTFdOw0KDQogICAgICAgICAgICAgICAgbGV0IHZpZGVvRG93bmxvYWREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtRG91eWluRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgIGlmKHZpZGVvRG93bmxvYWREb20pew0KDQogICAgICAgICAgICAgICAgICAgIHZpZGVvRG93bmxvYWREb20ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvRG93bmxvYWREb20ucGFyZW50Tm9kZSk7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgcGxheVNldGluZyA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWREb20gPSBwbGF5U2V0aW5nLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOw0KDQogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVGV4dCA9IGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpmaXJzdC1jaGlsZCcpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LmlubmVyVGV4dD0n5LiL6L29JzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zdHlsZSA9ICdmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7JzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtRG91eWluRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkZXRhaWwgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCd4Zy1pY29uOm50aC1vZi10eXBlKDEpJykuY2hpbGRyZW5bMF07DQoNCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKT9kZXRhaWwuZ2V0QXR0cmlidXRlKCdocmVmJyk6bG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgIGlmKGxpbmtVcmwuaW5kZXhPZignd3d3LmRvdXlpbi5jb20nKT09LTEpew0KDQogICAgICAgICAgICAgICAgICAgIGxpbmtVcmw9Jy8vd3d3LmRvdXlpbi5jb20nK2xpbmtVcmw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnZGF0YS11cmwnLGxpbmtVcmwpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdocmVmJywnamF2YXNjcmlwdDp2b2lkKDApOycpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5jbGFzc05hbWU9J3hncGxheWVyLXBsYXliYWNrLXNldHRpbmcgc2xpZGUtc2hvdyc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uY2xhc3NOYW1lPSd4Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRIdG1sID0gJyc7DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkSHRtbCArPSBgPGRpdiBjbGFzcz0ieGdwbGF5ZXItcGxheXJhdGlvLWl0ZW0gJHtpdGVtLmlkfSIgaWQ9IiR7aXRlbS5pZH0iPiR7aXRlbS5uYW1lfTwvZGl2PmA7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXlyYXRpby13cmFwJykuaW5uZXJIVE1MID0gZG93bmxvYWRIdG1sOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXNsaWRlcicpLnN0eWxlPSd3aWR0aDo2MHB4IGltcG9ydGFudDsnOw0KDQogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWF1dG9wbGF5LXNldHRpbmcnKTsNCg0KICAgICAgICAgICAgICAgIGF1dG9QbGF5LmFmdGVyKGRvd25sb2FkRG9tKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgICAgIGRpdkRvbS5zdHlsZT0icG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6LTk5OTtoZWlnaHQ6ODBweDt3aWR0aDo0MHB4O21hcmdpbi10b3A6LTgwcHg7Ig0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20uYXBwZW5kQ2hpbGQoZGl2RG9tKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBrc1ZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb21BcnIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnBsYXllci12aWRlbycsMSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbUFycil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IHZpZGVvRG9tQXJyLmxlbmd0aD4yP3ZpZGVvRG9tQXJyWzFdOnZpZGVvRG9tQXJyWzBdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb0RvbS5nZXRBdHRyaWJ1dGUoJ3NyYycpLm1hdGNoKC9eYmxvYi8pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYmxvYuinhumikeaXoOazleS4i+i9vScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb20uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsZnVuY3Rpb24oKXsgLy/mkq3mlL7kuK0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+5LitIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb20uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+57uT5p2fIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXV0by13YXJwcGVyJykuZ2V0QXR0cmlidXRlKCdhdXRvcGxheScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0b1BsYXkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5q2j5Zyo5LiL6L296K+356iN5L6vJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVRpbWVUb3RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RhbCcpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWNvbmQgPSBwbGF5VGltZVRvdGFsLm1hdGNoKC8oLispOiguKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWNvbmRUb3RhbCA9IHNlY29uZFsxXSo2MCtwYXJzZUludChzZWNvbmRbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NEb3dubG9hZCcpLmdldEF0dHJpYnV0ZSgnZGF0YS11cmwnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhY2NvdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2ZpbGUtdXNlci1uYW1lLXRpdGxlJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2ZpbGUtdXNlci1uYW1lLXRpdGxlJykuaW5uZXJUZXh0OmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkLWF1dGhvcicpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1pbmZvLXRpdGxlJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWluZm8tdGl0bGUnKS5pbm5lclRleHQ6bmV3IERhdGUoKS5nZXRUaW1lKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9GaWxlTmFtZSA9IChhY2NvdW50ICYmIHRpdGxlKT9hY2NvdW50KyctJyt0aXRsZSsnLm1wNCc6bmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKGRhdGFVcmwsdmlkZW9GaWxlTmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0NvcHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9MaW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb0RvbS5nZXRBdHRyaWJ1dGUoJ3NyYycpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGdldENvbnRyb2xzKTsNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuY29kZT09J0Fycm93RG93bicgfHwgZS5jb2RlPT0nQXJyb3dVcCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9KQ0KDQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKXsNCg0KICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eaHR0cHM/OlwvXC93d3dcLmt1YWlzaG91XC5jb21cLyguKykvOw0KDQogICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKG1hdGNoKTsNCg0KICAgICAgICAgICAgICAgIGlmKCFyZXNwIHx8IChyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgPT0gLTEgJiYgcmVzcFsxXS5pbmRleE9mKCd2aWRlbycpID09LTEgJiYgcmVzcFsxXS5pbmRleE9mKCduZXctcmVjbycpID09IC0xKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjeS4jeaYr+inhumikeaSreaUvumhtScpO3JldHVybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZihyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJBcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWNvbnRhaW5lci1wbGF5ZXInKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyQXJlYVdpZHRoID0gcGxheWVyQXJlYS5zdHlsZS53aWR0aC5tYXRjaCgvKC4rKXB4Lyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXllckJhclByb2dyZXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXllci1iYXItcHJvZ3Jlc3MnKTsNCg0KICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCYXJQcm9ncmVzcy5zdHlsZS53aWR0aCA9IHBsYXllckFyZWFXaWR0aFsxXS0zMjArJ3B4JzsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdGFsJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdGltZVRvdGFsLnN0eWxlLnJpZ2h0PScxODBweCc7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJpZ2h0Jyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb3dubG9hZERvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1Lc0Rvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlkZW9Eb3dubG9hZERvbSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgbGV0IGRldGFpbERvbSA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgxKScpOw0KDQogICAgICAgICAgICAgICAgbGV0IHhnSWNvbiA9IGRldGFpbERvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJyk7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24ucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXZvbHVtZS1zb3VuZCcpLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7Jz7kuIvovb08L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgbGV0IHNsaWRlciA9IHhnSWNvbi5xdWVyeVNlbGVjdG9yKCcucGwtc2xpZGVyJyk7DQoNCiAgICAgICAgICAgICAgICBzbGlkZXIuc3R5bGUgPSAnd2lkdGg6NDlweDtwYWRkaW5nOjEwcHggNXB4IDIwcHg7JzsNCg0KICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpc3QgPSAnJzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Y29sb3I6I0ZGRjtjdXJzb3I6cG9pbnRlcjsiIGlkPSIke2l0ZW0uaWR9Ij4ke2l0ZW0ubmFtZX08L2Rpdj5gOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIHNsaWRlci5pbm5lckhUTUwgPSBkb3dubG9hZExpc3Q7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdkYXRhLXVybCcsbGlua1VybCk7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgIGRldGFpbERvbS5iZWZvcmUoeGdJY29uKTsNCg0KICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgIC8v6YeN5p6E5pKt5pS+5pON5L2c5oyJ6ZKuDQoNCiAgICAgICAgICAgICAgICBsZXQgemhtS3NCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NCdXR0b24nKTsNCg0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coemhtS3NCdXR0b24pOw0KDQogICAgICAgICAgICAgICAgaWYoemhtS3NCdXR0b24pew0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uSWNvbiA9IGRldGFpbERvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBidXR0b25JY29uLnNldEF0dHJpYnV0ZSgnaWQnLCd6aG1Lc0J1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkljb25JbWcgPSBidXR0b25JY29uLnF1ZXJ5U2VsZWN0b3IoJy51bm11dGVkLWljb24nKTsNCg0KICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkljb25JbWcpew0KICAgICAgICAgICAgICAgICAgICBidXR0b25JY29uSW1nLnN0eWxlID0gJ2JhY2tncm91bmQ6IHVybChodHRwczovL3MyLTEwNjIzLmt3aW1ncy5jb20vdWRhdGEvcGtnL2Nsb3VkY2RuL2ltZy9wbGF5ZXItc2V0dGluZy5hZDFmNWNlOC5zdmcpIG5vLXJlcGVhdCc7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmFmdGVyKGJ1dHRvbkljb24pOw0KDQogICAgICAgICAgICAgICAgbGV0IHBsU2xpZGVyID0gYnV0dG9uSWNvbi5xdWVyeVNlbGVjdG9yKCcucGwtc2xpZGVyJyk7DQoNCiAgICAgICAgICAgICAgICBwbFNsaWRlci5zdHlsZT0nd2lkdGg6YXV0bztwYWRkaW5nOjEwcHggMTBweCAyNXB4IDEwcHg7JzsNCg0KICAgICAgICAgICAgICAgIHBsU2xpZGVyLmlubmVySFRNTCA9ICIiOw0KDQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkZvdXIgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoNCknKTsNCg0KICAgICAgICAgICAgICAgIGJ1dHRvbkZvdXIuc3R5bGUubWFyZ2luPScwcHgnOw0KDQogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXktc2V0dGluZy1jb250YWluZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXkuc3R5bGUubWFyZ2luPScwcHggNDBweCAwcHggMHB4JzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uRml2ZSA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg1KScpOw0KDQogICAgICAgICAgICAgICAgaWYoYnV0dG9uRml2ZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRml2ZS5zdHlsZS5tYXJnaW49JzE1cHggMHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICBidXR0b25GaXZlLm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXJvdGF0ZS10b29sdGlwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0b29sVGlwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9vbFRpcCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sMzApDQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHBsU2xpZGVyLmFwcGVuZENoaWxkKGJ1dHRvbkZpdmUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uU2l4ID0gY29udHJvbHMucXVlcnlTZWxlY3RvcignZGl2Om50aC1vZi10eXBlKDYpJyk7DQoNCiAgICAgICAgICAgICAgICBpZihidXR0b25TaXgpew0KDQogICAgICAgICAgICAgICAgICAgIGJ1dHRvblNpeC5zdHlsZS5tYXJnaW49JzE1cHggMHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbFRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rd2FpLXBsYXllci1mdWxsc2NyZWVuLXRvb2x0aXAnKTsNCg0KICAgICAgICAgICAgICAgICAgICBidXR0b25TaXgub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItZnVsbHNjcmVlbi10b29sdGlwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0b29sVGlwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9vbFRpcCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sMzApDQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHBsU2xpZGVyLmFwcGVuZENoaWxkKGJ1dHRvblNpeCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHBsU2xpZGVyLmFwcGVuZENoaWxkKGJ1dHRvbkZvdXIpOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHhpZ3VhVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCd2aWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVYaWd1YVZpZGVvRG93bmxvYWQoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3Qoew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiZ2V0IiwNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHA6Ly80Ny45OS4xNTguMTE4L3ZpZGVvLWNyYWNrL3YyL3BhcnNlP2NvbnRlbnQ9JytlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZiksDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJywNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnQWNjZXB0JzogJ3RleHQvcGxhaW4sIHRleHQvaHRtbCxhcHBsaWNhdGlvbi9qc29uJ30sDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cz09MjAwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcy5yZXNwb25zZVRleHQpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NyYyA9ICcnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU3JjID0gcmVzcC5kYXRhLnVybDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeaXoOazleS4i+i9vScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9UaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlIGgxJykuaW5uZXJUZXh0Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0F1dGhvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hdXRob3JfX3VzZXJOYW1lJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfmraPlnKjkuIvovb3or7fnqI3kvq8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQodmlkZW9TcmMsdmlkZW9UaXRsZSsnQCcrdmlkZW9BdXRob3IrJy5tcDQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0NvcHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeS4jeiDveWkjeWItuWcsOWdgCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W3suWkjeWItuWIsOWJqui0tOadvycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh2aWRlb1NyYyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeS4jeiDveebtOaOpeaJk+W8gCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb1NyYyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmNsYXNzTmFtZSA9PSAneGdwbGF5ZXItY29udHJvbC1pdGVtIGNvbnRyb2xfcGxheW5leHQgY29tbW9uLWNvbnRyb2wtaXRlbScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmpMaW5rID0ge307DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaHJlZil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLmhyZWYgPSBpdGVtLmhyZWY/aXRlbS5ocmVmOicnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay50YXJnZXQgPSBpdGVtLnRhcmdldD9pdGVtLnRhcmdldDonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakxpbmsuaHJlZiAmJiBvYmpMaW5rLnRhcmdldCAhPSAnX2JsYW5rJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBvYmpMaW5rLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IgOiBmdW5jdGlvbihlcnIpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+57uT5p2fIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDU1MDApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3JlYXRlWGlndWFWaWRlb0Rvd25sb2FkKCl7DQoNCiAgICAgICAgICAgICAgICBsZXQgcmlnaHRHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhnLXJpZ2h0LWdyaWQnKTsNCg0KICAgICAgICAgICAgICAgIGxldCBwbGF5Q29udHJvbCA9IHJpZ2h0R3JpZC5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMiknKTsNCg0KICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcGxheUNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgbGV0IGVudHJ5PSBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1jb250cm9sLWl0ZW1fX2VudHJ5Jyk7DQoNCiAgICAgICAgICAgICAgICBlbnRyeS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0ieGdwY1BsYXllcl90ZXh0RW50cnkiPjxzcGFuPuS4i+i9vTwvc3Bhbj48L2Rpdj4nOw0KDQogICAgICAgICAgICAgICAgbGV0IHBvcG92ZXIgPSBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1jb250cm9sLWl0ZW1fX3BvcG92ZXInKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpc3QgPSAnPHVsPic7DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGlzdCArPSBgPGxpIHRhYmluZGV4PSIwIiByb2xlPSJtZW51aXRlbXJhZGlvIiBhcmlhLWNoZWNrZWQ9ImZhbHNlIiBpZD0iJHtpdGVtLmlkfSI+JHtpdGVtLm5hbWV9PC9saT5gOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkTGlzdCArPSAnPC91bD4nOw0KDQogICAgICAgICAgICAgICAgcG9wb3Zlci5pbm5lckhUTUwgPSBkb3dubG9hZExpc3Q7DQoNCiAgICAgICAgICAgICAgICBwbGF5Q29udHJvbC5iZWZvcmUoY29udHJvbCk7DQoNCiAgICAgICAgICAgICAgICBsZXQgZGl2RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoNCiAgICAgICAgICAgICAgICBkaXZEb20uc3R5bGU9IndpZHRoOiA4MHB4OyBoZWlnaHQ6IDE0MHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo0MHB4O2xlZnQ6MjBweDt6LWluZGV4Oi0xIjsNCg0KICAgICAgICAgICAgICAgIGNvbnRyb2wuYXBwZW5kQ2hpbGQoZGl2RG9tKTsNCg0KICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBwb3BvdmVyLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW91dD1mdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIHBvcG92ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByaWdodENvbnRyb2wgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnNxdWlydGxlLWNvbnRyb2xsZXItd3JhcC1yaWdodCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJpZ2h0Q29udHJvbCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuPTA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYmlsaWJpbGktcGxheWVyLXZpZGVvLWJ0bi1xdWFsaXR5Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbU90aGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJweC1wbGF5ZXItY3RybC1xdWFsaXR5Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkb21PdGhlcil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKz4zMCljbGVhckludGVydmFsKHRpbWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IFt7bmFtZTondmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOidid3BfdmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOicuYmlsaWJpbGktcGxheWVyLXZpZGVvJyx0eXBlOidjbGFzcyd9XTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7aTx2aWRlb0RvbS5sZW5ndGg7aSsrKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSB2aWRlb0RvbVtpXS50eXBlID09ICdkb20nP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodmlkZW9Eb21baV0ubmFtZSk6ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih2aWRlb0RvbVtpXS5uYW1lKS5maXJzdENoaWxkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclpobUljb24pOyAvL+WPlua2iOWumuaXtuWZqA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5JyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuW8gOWniyIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsZnVuY3Rpb24oKXsgLy/nu5PmnZ8NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmlsaURvd25sb2FkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJpbGlEb3dubG9hZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlsaURvd25sb2FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmlsaURvd25sb2FkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pqC5YGcIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYmlsaS1taW5pLWNsb3NlLWljb24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjbG9zZUljb24pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsb3NlSWNvbil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSWNvbi5jbGljaygpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihkb3dubG9hZEljb24pew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4i+i9veaMiemSruW3suWtmOWcqCcpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnNxdWlydGxlLXF1YWxpdHktd3JhcCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighcXVhbGl0eSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHF1YWxpdHkuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKS5pbm5lclRleHQ9J+S4i+i9vSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LmJlZm9yZShjb250cm9sKTsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b0ljb25Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLmJpbGliaWxpLXBsYXllci12aWRlby1idG4tcXVhbGl0eScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYXV0b0ljb25Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGF1dG9JY29uRG9tLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zdHlsZT0nbWFyZ2luLXJpZ2h0OjIwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnVpLXNlbGVjdC1yZXN1bHQnKS5pbm5lclRleHQ9J+S4i+i9vSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLmJ1aS1zZWxlY3QtcmVzdWx0Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBhdXRvSWNvbkRvbS5iZWZvcmUoY29udHJvbCk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pobXpnaLkuI3mmK/op4bpopHmiJbnlarliacnKTtyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ2aWQgPSAnJyxhdmlkPScnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2Jhbmd1bWknKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF2LWxpbmsnKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM6XC9cL3d3dy5iaWxpYmlsaS5jb21cL3ZpZGVvXC8oLispXD8vKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+WYnZpZOaIlmF2aWQnKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3P2J2aWQ9IitidmlkKyImYWlkPSIrYXZpZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3AuY29kZSA8IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VJZCA9IF90aGlzLmdldFF1ZXJ5U3RyaW5nKCdwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5wYWdlc1twYWdlSWQtMV0uY2lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSAnaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvcGxheWVyL3BsYXl1cmw/YXZpZD0nK3Jlc3AuZGF0YS5haWQrJyZjaWQ9JytjaWQrJyZxbj0xMTInOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IF90aGlzLnJlcXVlc3QoJ2dldCcsbGluaykudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuY29kZSA8IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHlnLDlnYDmjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBkYXRhLmRhdGEuZHVybFswXS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGRvd25sb2FkSWNvbil7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5LiL6L295oyJ6ZKu5bey5a2Y5ZyoJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVhbGl0eSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuc3F1aXJ0bGUtcXVhbGl0eS13cmFwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFxdWFsaXR5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcXVhbGl0eS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnNxdWlydGxlLXZpZGVvLXF1YWxpdHktdGV4dCcpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eS5iZWZvcmUoY29udHJvbCk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9JY29uRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYXV0b0ljb25Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGF1dG9JY29uRG9tLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zdHlsZT0nbWFyZ2luLXJpZ2h0OjIwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktcmVzdWx0JykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW1zID0gY29udHJvbC5xdWVyeVNlbGVjdG9yQWxsKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktbWVudS1pdGVtJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZSA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLVZhbHVlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhVmFsdWUgIT0gMTYgJiYgZGF0YVZhbHVlICE9IDgwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaXRlbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ljb25Eb20uYmVmb3JlKGNvbnRyb2wpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9ubW91c2VvdmVyPSgpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW91dD0oKT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemhtemdouS4jeaYr+inhumikeaIlueVquWJpycpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJpbGlEYXRhVmFsdWUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKT9lLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKTonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJpbGlEYXRhVmFsdWUpcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnZpZCA9ICcnLGF2aWQ9Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dVcmwgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCc/Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gbm93VXJsWzBdLm1hdGNoKC9odHRwczpcL1wvd3d3LmJpbGliaWxpLmNvbVwvdmlkZW9cLyguKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+WYnZpZOaIlmF2aWQnKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3P2J2aWQ9IitidmlkKyImYWlkPSIrYXZpZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3AuY29kZSA8IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VJZCA9IF90aGlzLmdldFF1ZXJ5U3RyaW5nKCdwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5wYWdlc1twYWdlSWQtMV0uY2lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPScrYmlsaURhdGFWYWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSBfdGhpcy5yZXF1ZXN0KCdnZXQnLGxpbmssJycsdHJ1ZSkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuY29kZSA8IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHlnLDlnYDmjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBkYXRhLmRhdGEuZHVybFswXS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wueW91dHViZVwuY29tXC8od2F0Y2hcP3Y9Lit8c2hvcnRzXC8uKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih1cmwpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeW91dHViZUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih5b3V0dWJlSWNvbil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91dHViZUljb24uc3R5bGUub3BhY2l0eT0xOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy56aG1Mb2dvKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmUgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzEnLHVybDonaHR0cHM6Ly96aC5zYXZlZnJvbS5uZXQvMTc2LyN1cmw9J30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzInLHVybDonaHR0cHM6Ly9teWRvd25kb3duLmNvbS95MiMnfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMycsdXJsOidodHRwczovL3d3dy55dGRvd25may5jb20vc2VhcmNoP3VybD0nfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevNCcsdXJsOidodHRwczovL3lvdXQuY29tL3ZpZGVvLz91cmw9J30NCiAgICAgICAgICAgICAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8L3VsPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobWxvZ28nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lRG9tLmNsYXNzTmFtZSA9ICdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB6aG1QbGF5LmFwcGVuZENoaWxkKHBsYXlMaW5lRG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnpobUxvZ29EcmFnKCd5b3V0dWJlJywnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtSWNvbil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1JY29uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtSWNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobWxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1sb2dvKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobWxvZ28uc3R5bGUub3BhY2l0eT0wOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0sNTAwKQ0KDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYWxsV2ViID0gWy4uLmdldENvdXBvbiwuLi5qeFZpZGVvLC4uLmp4TXVzaWMsLi4uemhOaWNlLC4uLnRhb2JhbywuLi52aWRlb0Rvd25sb2FkLC4uLmJhaWR1XTsNCg0KICAgICAgICB2YXIgbm93V2ViPVtdOw0KDQogICAgICAgIGFsbFdlYi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICBpZihpdGVtLmlzT3BlbiA9PSAwKSByZXR1cm4gdHJ1ZTsNCg0KICAgICAgICAgICAgaXRlbS53ZWIuZm9yRWFjaChmdW5jdGlvbih2YWwpew0KDQogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGxvY2F0aW9uLmhyZWYubWF0Y2godmFsLm1hdGNoKTsNCg0KICAgICAgICAgICAgICAgIGlmKHJlc3VsdCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbm93V2ViLnB1c2godmFsKTsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgfSkNCg0KICAgICAgICBpZihub3dXZWIubGVuZ3RoPT0wKXsNCg0KICAgICAgICAgICAgbGV0IGJhc2VDbGFzcyA9IG5ldyBCYXNlQ2xhc3MoKTsNCg0KICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieWMuemFjeivpee9keermeaIluivpeaooeWdl+W3suWFs+mXrScpO3JldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIG5vd1dlYi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICBzd2l0Y2goaXRlbS5mdW5jTmFtZSl7DQogICAgICAgICAgICAgICAgY2FzZSAnY291cG9uJzoNCg0KICAgICAgICAgICAgICAgICAgICBjb3Vwb25GdW5jKGl0ZW0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdwbGF5VmlkZW8nOg0KICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW9GdW5jKCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXlNdXNpYyc6DQogICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0Z1bmMoaXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3poTmljZSc6DQogICAgICAgICAgICAgICAgICAgIHpoTmljZUZ1bmMoKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnYmFpZHUnOg0KICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZUNsYXNzID0gbmV3IEJhc2VDbGFzczsNCiAgICAgICAgICAgICAgICAgICAgYmFpZHVGdW5jKCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvRG93bmxvYWQnOg0KDQogICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb0Rvd25sb2FkQ2xhc3MgPSBuZXcgVmlkZW9Eb3dubG9hZENsYXNzKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGl0ZW07DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5pc1dlYk9wZW4gPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0ubmFtZSsn5bey5YWz6ZetJyk7cmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkQ2xhc3Nbbm93TmFtZV0oKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgY2FzZSAndGFvYmFvU2VhcmNoJzoNCiAgICAgICAgICAgICAgICAgICAgdGFvYmFvU2VhcmNoRnVuYyhpdGVtKQ0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9KQ0KDQogICAgICAgIGZ1bmN0aW9uIGNvdXBvbkZ1bmMoaXRlbSl7DQoNCiAgICAgICAgICAgIHZhciBjb3Vwb25DbGFzcyA9IG5ldyBDb3Vwb25DbGFzcygpOw0KDQogICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0gaXRlbTsNCg0KICAgICAgICAgICAgdmFyIGNvdXBvblN0eWxlID1gDQogICAgICAgICAgICAgICAgICAgIGh0bWx7DQogICAgICAgICAgICAgICAgICAgIC0tcmlnaHQ6MTAwJTsNCiAgICAgICAgICAgICAgICAgICAgLS1sZWZ0OjEwMCU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fY291cG9uew0KICAgICAgICAgICAgICAgICAgICB3aWR0aDpmaXQtY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93Ow0KICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4Ow0KICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206MTVweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9sZWZ0ew0KICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7DQogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCByaWdodCB0b3AsIHRyYW5zcGFyZW50IDhweCwjZmZmIDApIHRvcCBsZWZ0IC92YXIoLS1yaWdodCkgNTElIG5vLXJlcGVhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCByaWdodCBib3R0b20sIHRyYW5zcGFyZW50IDhweCwgI2ZmZiAwKSBib3R0b20gbGVmdCAvdmFyKC0tcmlnaHQpIDUxJSBuby1yZXBlYXQ7DQogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMnB4IDJweCAzcHggIzg4OCk7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodDo4NHB4Ow0KICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2ltZ19pY29uew0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHggMHB4IDVweDsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OjVweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9pbWdfaWNvbiBpbWd7DQogICAgICAgICAgICAgICAgICAgIHdpZHRoOjQ3cHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fY29udGVudHsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246Y29sdW1uOw0KICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDE4cHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fbW9uZXl7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsNCiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2Ftb3VudF9tb25leXsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fbW9uZXlfc2lnbnsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4Ow0KICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fbW9uZXlfbnVtew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjojZjIzMDMwOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MzZweDsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9jb25kaXRpb257DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmYjBmM2E7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY0ZWM7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4Ow0KICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjJweCA1cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX3RpbWV7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogLTVweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX3Rlcm17DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmYjBmM2E7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmYjBmM2E7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MnB4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweCA0cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4Ow0KICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fZGF0ZXsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6OHB4Ow0KDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fY2lyY2xlew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmIwZjNhIHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQXpVbEVRVlFZbFMzTk1Vb0RRUmlHNFhjbXU5bEFYQlFicSsxQ0NxdWN3c2JPTzNnQVMyOWg0UW04Z1JkSU1LVmdsUVZCRmlTRmpZS0JxV1oyZC83UEl2WVBQRTZTTUNIdmNEOEh1THpCVXNJS0R5WThBTjRSVStKOS84bkg4b0xZSjN3V2NoeEJqSkh0WmtOMWZzYnA5b212aHp2NmNjRGpRSkxhdGxYWGRaSWs1YXdrS1Z6ZEtrOVc4Z0JGVVZEWE5RQTJqSlRBN0dTT21SMkxwbWtJSVdBNTQ2c3B2TzV3TDI5UXozR1NCQkNIbm53SXpPNGYwZk1hWW9LeS9BY204QTYrZnhrWDE1QU5xaW1ZOFFlbUNtOTIwcjFhVUFBQUFBQkpSVTVFcmtKZ2dnPT0pIHJlcGVhdC15Ow0KICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOjEwcHg7DQogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMHB4Ow0KICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NjZweDsNCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICByaWdodDo5N3B4Ow0KICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjI7DQogICAgICAgICAgICAgICAgICAgIGZpbHRlcjpub25lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2xpbmtfY291cG9uew0KICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygycHggMnB4IDNweCAjODg4KTsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIHRvcCByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IGJvdHRvbSwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIGJvdHRvbSByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdDsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA4NHB4Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweCA2cHggMHB4IDRweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9nZXRfbGlua190ZXh0ew0KICAgICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgICAgICAgICAgICAgICAgICB3cml0aW5nLW1vZGU6dmVydGljYWwtbHI7DQogICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiOw0KICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIHRvcCByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IGJvdHRvbSwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIGJvdHRvbSByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdDsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2dldF9saW5rX3RleHQ6aG92ZXJ7DQogICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7DQogICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ODAwOw0KICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX3FyY29kZXsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOjNweCBzb2xpZCAjZmZmOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYDsNCg0KICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvdXBvblN0eWxlKSk7DQoNCiAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICBsZXQgbj0wOw0KDQogICAgICAgICAgICBsZXQgY291cG9uVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgbisrOw0KDQogICAgICAgICAgICAgICAgbGV0IHBhZ2VOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKQ0KDQogICAgICAgICAgICAgICAgaWYocGFnZU5vZGUpew0KDQogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY291cG9uVGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgIGNvdXBvbkNsYXNzW25vd05hbWVdKCk7DQoNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICBpZihuPT1jb3Vwb25UaW1lck51bSkgY2xlYXJJbnRlcnZhbChjb3Vwb25UaW1lcik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9LDEwMCkNCiAgICAgICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBwbGF5VmlkZW9GdW5jKCl7DQoNCiAgICAgICAgICAgIHZhciBwbGF5VmlkZW9DbGFzcyA9IG5ldyBQbGF5VmlkZW9DbGFzcygpOw0KDQogICAgICAgICAgICBwbGF5VmlkZW9DbGFzcy56aG1Mb2dvKCk7DQoNCiAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcpKXsNCg0KICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gcGxheVZpZGVvQ2xhc3MuZ2V0TGluZShHTV9nZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnKSk7DQoNCiAgICAgICAgICAgICAgICBpZihsaW5lT2JqKXsNCg0KICAgICAgICAgICAgICAgICAgICBwbGF5TGluZSA9IGxpbmVPYmoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy90ZW1wbGF0ZTppY29uLHBsYXlMaW5lOw0KICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19saW5lJz4iOw0KDQogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPGRpdj48dWwgY2xhc3M9J3pobV9wbGF5X3ZpZGVfbGluZV91bCc+IjsNCg0KICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9ICcnOw0KDQogICAgICAgICAgICAgICAgaWYocGxheVZpZGVvQ2xhc3MuZ2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicpID09IGl0ZW0udXJsKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9ICd6aG1fbGluZV9zZWxlY3RlZCc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7DQoNCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPC9kaXY+IjsNCg0KICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtbG9nbycpOw0KDQogICAgICAgICAgICBsZXQgcGxheUxpbmVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgcGxheUxpbmVEb20uY2xhc3NOYW1lID0gJ3BsYXlMaW5lRGl2IHpobV9wbGF5X3ZpZGVvX3dyYXAnOw0KDQogICAgICAgICAgICBwbGF5TGluZURvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQogICAgICAgICAgICBwbGF5TGluZURvbS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7DQoNCiAgICAgICAgICAgIHpobVBsYXkuYXBwZW5kQ2hpbGQocGxheUxpbmVEb20pOw0KDQogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fDQoNCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOw0KDQogICAgICAgICAgICBwbGF5SnhIdG1sICs9ICI8aWZyYW1lIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nbm8nIGFsbG93ZnVsbHNjcmVlbj10cnVlIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgbmFtZT0nanhfcGxheScgc3R5bGU9J2hlaWdodDoxMDAlO3dpZHRoOjEwMCUnIGlkPSdwbGF5SWZyYW1lJz48L2lmcmFtZT48L2Rpdj4iOw0KDQogICAgICAgICAgICAvL+W+queOr+WIpOaWreaYr+WQpuWcqOaSreaUvumhte+8jOaYr+WImeaJp+ihjOS4i+mdog0KICAgICAgICAgICAgbGV0IGp4VmlkZW9EYXRhID0gWw0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllcl9fY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyLWNvbnRhaW5lciIgLG1hdGNoOi9odHRwczpcL1wvdi5xcS5jb21cL3hcL2NvdmVyXC9bYS16QS1aMC05XStcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuY29udGFpbmVyLXBsYXllciIgLG1hdGNoOi92XC5xcVwuY29tXC94XC9wYWdlLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjZmxhc2hib3giLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixtYXRjaDovXmh0dHBzOlwvXC9tLmlxaXlpXC5jb21cL1t2d2FdXF8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3Zfc2hvd1wvaWRfLyxhcmVhQ2xhc3NOYW1lOiduZXctYm94LWFudGhvbG9neS1pdGVtcyd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3ZfcGxheVwvaWRfL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNiaWxpYmlsaS1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvdmlkZW8vLG5hbWU6J2JpbGlQYycsYXJlYUNsYXNzTmFtZTondmlkZW8tZXBpc29kZS1jYXJkJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuYnB4LXBsYXllci1wcmltYXJ5LWFyZWEiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXBsaXN0X2VwX2xpc3Rfd3JhcHBlcl9fUHpMSGEnfSwNCiAgICAgICAgICANCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtZ3R2LXBsYXllci13cmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3cubWd0dlwuY29tXC9ifGxcL1swLTldLyxhcmVhQ2xhc3NOYW1lOidlcGlzb2RlLWl0ZW1zJ30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovdHZcLnNvaHVcLmNvbVwvdi8sYXJlYUNsYXNzTmFtZTonc2VyaWVzLXRhYl9wYW5lJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyV3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovZmlsbVwuc29odVwuY29tXC9hbGJ1bVwvL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnBwdHZcLmNvbVwvc2hvd1wvL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwuMTkwNS5jb21cL3BsYXlcLy99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjdm9kUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLjE5MDUuY29tXC92b2RcL3BsYXlcLy99LA0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsNCg0KICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3MuemhtTG9nb0RyYWcoJ3ZpZGVvJyxqeFZpZGVvV2ViKTsNCg0KICAgICAgICAgICAgLy/mmK/lkKblnKjmkq3mlL7pobUNCiAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoID4gMCl7DQoNCiAgICAgICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0ganhWaWRlb1dlYlswXTsNCg0KICAgICAgICAgICAgICAgIC8v6byg5qCH57uP6L+H5pi+56S657q/6LevDQogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlCdXR0b24nKS5vbm1vdXNlb3Zlcj0oKT0+ew0KDQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW91dD0oKT0+ew0KDQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy/pgInmi6nnur/ot6/op6PmnpDmkq3mlL4NCg0KICAgICAgICAgICAgICAgIHZhciBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsNCg0KICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW9DbGFzcy5zZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJyx0aGlzLmdldEF0dHJpYnV0ZSgndXJsJyksMzApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgndmlkZW9QbGF5TGluZUFkZCcpICE9IDIyKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vd1dlYk5vZGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1dlYk5vZGUuaW5uZXJIVE1MID0gcGxheUp4SHRtbDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlmcmFtZS5zcmM9IGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgLyotLeeJueauiuWkhOeQhi0tKi8NCiAgICAgICAgICAgICAgICAvL+S8mOmFt+WOu+W5v+WRig0KICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjcGxheWVyIil7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeW91a3VBZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZHZlcnRpc2UtbGF5ZXInKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlrQWQgPSB5b3VrdUFkLmxhc3RDaGlsZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgeWtBZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHlrQWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLWRhc2hib2FyZC0wJykuc3R5bGU9J2Rpc3BsYXk6ZmxleCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvLnBsYXkoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy/mmoLlgZwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktcGxheS1pY29uLTAnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrJTIgPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGF1c2UoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsZnVuY3Rpb24oKXsgLy/mkq3mlL7ml7bpl7TmlLnlj5gNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5b3VrdUFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkdmVydGlzZS1sYXllcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlrQWQgPSB5b3VrdUFkLmxhc3RDaGlsZDsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeWtBZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWtBZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHlrQWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktZGFzaGJvYXJkLTAnKS5zdHlsZT0nZGlzcGxheTpmbGV4JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5vbmtleWRvd24gPSBmdW5jdGlvbihldmVudCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LmtleUNvZGU9PTM5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmN1cnJlbnRUaW1lICsgNTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihldmVudC5rZXlDb2RlPT0zNyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZSAtIDU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvL+eIseWlh+iJuuWOu+W5v+WRig0KICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjZmxhc2hib3giKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2tpcHBhYmxlLWFmdGVyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uY2xpY2soKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8v6IW+6K6v5Y67dmlw5by556qXDQogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXItY29udGFpbmVyIil7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyA8IDEwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFuZWxUaXBWaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFuZWwtb3ZlcmxheScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFuZWxUaXBWaXApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVGlwVmlwLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMTAwKQ0KDQoNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/kuZDop4bpgInpm4blpITnkIYNCiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIjbGVfcGxheWJveCIpew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX2Jsb2NrJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFqQmxvY2spIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxqQmxvY2subGVuZ3RoO2krKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JZCA9IGpCbG9ja1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGBodHRwczovL3d3dy5sZS5jb20vcHR2L3ZwbGF5LyR7dmlkZW9JZH0uaHRtbGA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqQmxvY2tbaV0uZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLGxpbmspOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LDMwMDApDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy9C56uZ5aSn5Lya5ZGYdXJs5aSE55CG77yM6aG16Z2iY2xhc3PkuI3kuIDoh7QNCiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIucGxheWVyLWNvbnRhaW5lciIpew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItY29udGFpbmVyJykgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWNvbnRhaW5lcicpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd05vZGUgPSAnLnBsYXllci1tYXNrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dOb2RlID0gJy5icHgtcGxheWVyLWNvbnRhaW5lcic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8q6IW+6K6v6KeG6aKR54K55Ye75YW25a6D6KeG6aKR6Lez6L2sKi8NCiAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0ncXFQQycpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZ3VyZURldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWd1cmVfZGV0YWlsJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RJdGVtID0gWy4uLmZpZ3VyZSwuLi5maWd1cmVEZXRhaWxdOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RJdGVtLmxlbmd0aCA+IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluayl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsaW5rOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdC5sZW5ndGg9PTApe2NvbnNvbGUubG9nKCfor6XnvZHnq5nmkq3mlL7ljLrnsbvlkI3mlLnlj5gnKTtyZXR1cm47fQ0KDQogICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfSwyMDAwKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcGxheU11c2ljRnVuYygpew0KDQogICAgICAgICAgICBpZihzZWxmLmZyYW1lRWxlbWVudCAmJiBzZWxmLmZyYW1lRWxlbWVudC50YWdOYW1lID09ICJJRlJBTUUiKXsNCg0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHBsYXlNdXNpY0NsYXNzID0gbmV3IFBsYXlNdXNpY0NsYXNzKCk7DQoNCiAgICAgICAgICAgIHZhciBtdXNpY0lkID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKTsNCg0KICAgICAgICAgICAgLy9uZXRlYXNlIOi3r+eUseS4pOasoe+8jOmcgOmHjeWumuS5iQ0KICAgICAgICAgICAgdmFyIG5ld1VybCA9IGxvY2F0aW9uLmhyZWY7DQoNCiAgICAgICAgICAgIGxldCBqeE11c2ljV2ViID0ganhNdXNpY1swXS53ZWIuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VybC5tYXRjaChpdGVtLm1hdGNoKTsNCg0KICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgaWYoanhNdXNpY1dlYi5sZW5ndGgpew0KDQogICAgICAgICAgICAgICAgbGV0IHRpbWVyWmhtSWNvbiA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1JY29uJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8vIOWPlua2iOWumuaXtuWZqA0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihqeE11c2ljV2ViWzBdLm5hbWU9PSdrdXdvJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaWNvbi1iYXJfaWNvbl9kb3dubG9hZF8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbiA9IGNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uY2xhc3NOYW1lID0gJyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5zdHlsZT0nbWFyZ2luLWxlZnQ6MTBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gIjxhIHN0eWxlPSdmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTogbm93cmFwO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM1NTU7JyBpZD0na3V3b0Rvd25sb2FkJz7kuIvovb08L2E+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sX3InKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scy5iZWZvcmUoaWNvbik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2t1d29Eb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdOYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRyb2wgLnNvbmdfbmFtZScpLnRpdGxlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJ0aXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRyb2wgLmFydGlzdCcpLnRpdGxlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoYXVkaW9TcmMsc29uZ05hbWUrJy0nK2FydGlzdCsnLm1wMycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J3hpbWFsYXlhJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5pKt5pS+5Zmo5Yib5bu65LiL6L29aWNvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeG1Db250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItb3ByYXRpb25zJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSB4bUNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2E6bnRoLW9mLXR5cGUoMiknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbiA9IGNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gIjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTogbm93cmFwO2N1cnNvcjpwb2ludGVyO2NvbG9yOiNGRkY7JyBpZD0neGltYURvd25sb2FkJz7kuIvovb08L3NwYW4+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bUNvbnRyb2xzLnN0eWxlPSdwb3NpdGlvbjogcmVsYXRpdmU7bWFyZ2luLWxlZnQ6LTIwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLXByb2dyZXNzJykuc3R5bGUud2lkdGg9JzQ1MHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLXBsYXl0aW1lJykuc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDo0MHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1Db250cm9scy5wcmVwZW5kKGljb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aSreaUvuWZqOS4i+i9veS6i+S7tg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjeGltYURvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbVRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZtLXRpdGxlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbVRpdGxlTWF0Y2ggPSBmbVRpdGxlLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wueGltYWxheWFcLmNvbVwvc291bmRcLyhcUyopJC8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbW9iaWxlLnhpbWFsYXlhLmNvbS9tb2JpbGUtcGxheXBhZ2UvdHJhY2svdjMvYmFzZUluZm8vJytuZXcgRGF0ZSgpLmdldFRpbWUoKSsnP2RldmljZT13ZWImdHJhY2tJZD0nK2ZtVGl0bGVNYXRjaFsxXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBkYXRhLnRyYWNrSW5mby5wbGF5VXJsTGlzdFsxXS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIyID0gc3RyMS5yZXBsYWNlQWxsKCdfJywnLycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHN0cjIubGVuZ3RoJTQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjIgKz0gJz09PT0nLnN1YnN0cihudW0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIyKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ3J5cHRvSlMuZW5jLkhleC5wYXJzZSgiYWFhZDNlNGZkNTQwYjBmNzlkY2E5NTYwNmU3MmJmOTMiKSwgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuRUNCLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzNw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGVjcnlwdGVkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRlY3J5cHRlZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKGRlY3J5cHRlZCxkYXRhLnRyYWNrSW5mby50aXRsZSsnLm1wMycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop6Plr4blnLDlnYDlpLHotKUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mhtemdouWIl+ihqOWIm+W7uuaJuemHj+S4i+i9vQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsTWF0Y2ggPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM6XC9cL3d3dy54aW1hbGF5YS5jb21cL2FsYnVtXC9bMC05XSsvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsTWF0Y2gpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhbmNob3Jfc291bmRfbGlzdCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc291bmRMaXN0KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0SGVhZCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yKCcuaGVhZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VuZExpc3RIZWFkVGl0bGUgPSBzb3VuZExpc3RIZWFkLnF1ZXJ5U2VsZWN0b3IoJy5zb3J0JykubGFzdENoaWxkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYXRjaERvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhdGNoRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighYmF0Y2hEb3dubG9hZERvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW3tuYW1lOifmibnph4/kuIvovb0nLGlkOidiYXRjaERvd25sb2FkJ30se25hbWU6J+mHjee9ricsaWQ6J3Jlc2V0J30se25hbWU6J+WFqOmAiScsaWQ6J3NlbGVjdEFsbCd9XTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBzb3VuZExpc3RIZWFkVGl0bGUuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2lkJyxpdGVtLmlkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuaW5uZXJUZXh0ID0gaXRlbS5uYW1lOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRMaXN0SGVhZFRpdGxlLmFmdGVyKGNvbnRyb2wpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5iZWZvcmUoIiB8ICIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbGVjdEFsbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94ID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J3pobUNoZWNrYm94J10iKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUNoZWNrYm94LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0uY2hlY2tlZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZD10cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2V0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQgPSBmYWxzZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+ato+W6j+WAkuW6j+S6i+S7tg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRMaXN0SGVhZC5xdWVyeVNlbGVjdG9yKCcuc29ydCcpLmZpcnN0Q2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmF0Y2hEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94ID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J3pobUNoZWNrYm94J10iKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUNoZWNrYm94LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jaGVja2VkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjck1hdGNoID0gaXRlbS52YWx1ZS5tYXRjaCgvXC9zb3VuZFwvKFswLTldKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICdodHRwczovL21vYmlsZS54aW1hbGF5YS5jb20vbW9iaWxlLXBsYXlwYWdlL3RyYWNrL3YzL2Jhc2VJbmZvLycrbmV3IERhdGUoKS5nZXRUaW1lKCkrJz9kZXZpY2U9d2ViJnRyYWNrSWQ9JytzY3JNYXRjaFsxXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBkYXRhLnRyYWNrSW5mby5wbGF5VXJsTGlzdFsxXS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIyID0gc3RyMS5yZXBsYWNlQWxsKCdfJywnLycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHN0cjIubGVuZ3RoJTQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjIgKz0gJz09PT0nLnN1YnN0cihudW0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIyKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ3J5cHRvSlMuZW5jLkhleC5wYXJzZSgiYWFhZDNlNGZkNTQwYjBmNzlkY2E5NTYwNmU3MmJmOTMiKSwgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuRUNCLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzNw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjcnlwdGVkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoZGVjcnlwdGVkLGRhdGEudHJhY2tJbmZvLnRpdGxlKycubXAzJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuemhtQ2hlY2tib3gnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1DaGVja2JveC5sZW5ndGggPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v57+76aG15LqL5Lu2DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFnaW5hdGlvbi1wYWdlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUJhcil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VCYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6Lez6aG15LqL5Lu2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvblt0eXBlPXN1Ym1pdF0nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlTGluayl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquWMuemFjeWIsOWIl+ihqOWcsOWdgCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5YWo5bGA54K55Ye75LqL5Lu2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmpMaW5rID0ge307DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaHJlZil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLmhyZWYgPSBpdGVtLmhyZWY/aXRlbS5ocmVmOicnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay50YXJnZXQgPSBpdGVtLnRhcmdldD9pdGVtLnRhcmdldDonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakxpbmsuaHJlZiAmJiBvYmpMaW5rLnRhcmdldCAhPSAnX2JsYW5rJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBvYmpMaW5rLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0na3Vnb3UnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYURvbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhT2JqID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGFvYmonKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhT2JqKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGFvYmonKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsJ19ibGFuaycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwuaW5kZXhPZignbWl4c29uZycpIT0tMSB8fCBjb3Vwb25VcmwuaW5kZXhPZignc29uZycpICE9IC0xIHx8IGNvdXBvblVybC5pbmRleE9mKCdzaGFyZScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2b2x1bWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdm9sdW1lJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZERvbSA9IHZvbHVtZURvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi10b3A6MzBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLmlubmVySFRNTCA9ICI8YSBzdHlsZT0nY29sb3I6I2ZmZjtmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXI7JyBpZD0na3Vnb3VEb3dubG9hZCcgamF2YXNjcmlwdDp2b2lkKDApOz7kuIvovb08L2E+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRG9tLmJlZm9yZShkb3dubG9hZERvbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURvbS5zdHlsZT0nbGVmdDo1MHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb2RlJykuc3R5bGU9J21hcmdpbi1sZWZ0OjkwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BiX2Rvd25sb2FkJykuc3R5bGU9J21hcmdpbi1sZWZ0OjEzMHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYl9zaGFyZScpLnN0eWxlPSdtYXJnaW4tbGVmdDoxNzBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdCcpLnN0eWxlPSdyaWdodDotMjBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3Vnb3VEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI215QXVkaW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGF1ZGlvLmdldEF0dHJpYnV0ZSgnc3JjJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2luZ2VyTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaW5nZXJOYW1lJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ05hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc29uZ05hbWVUZW1wJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoYXVkaW9TcmMsc29uZ05hbWUrJy0nK3Npbmdlck5hbWUuc3Vic3RyKDAsc2luZ2VyTmFtZS5sZW5ndGgtMSkrJy5tcDMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvdXBvblVybCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J25ldGVhc2UnICYmIGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zdC9kb3dubG9hZCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnpobUxvZ28oKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnpobUxvZ29EcmFnKCdtdXNpYycsanhNdXNpY1dlYik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0saWNvbldhaXRUaW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXlEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtSWNvbicpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHpobVBsYXlEb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICB6aG1QbGF5RG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtUGxheURvbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pn7PpopHnvZHlnYDmsqHmnInmt7vliqDljLnphY3miJbljLnphY3plJnor68nKTsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gemhOaWNlRnVuYygpew0KDQogICAgICAgICAgICB2YXIgemhDbGFzcyA9IG5ldyBaaENsYXNzKCk7DQoNCiAgICAgICAgICAgIC8v5YWz6Zet55m75b2V5by55qGGDQogICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgIGxldCBsb2dpbk1vZGFsV3JhcHBlciA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCIuTW9kYWwtd3JhcHBlciIpOw0KDQogICAgICAgICAgICAgICAgaWYobG9naW5Nb2RhbFdyYXBwZXIpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZUJ1dHRvbiA9IGxvZ2luTW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5Nb2RhbC1jbG9zZUJ1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGNsb3NlQnV0dG9uKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdXR0b24uY2xpY2soKTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0pKCkNCg0KICAgICAgICAgICAgdmFyIHpoRGF0YSA9IFsNCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlVmlkZW8nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlVmlkZW8nLCcwJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlQUQnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlQUQnLCcyMicpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sDQogICAgICAgICAgICAgICAge2Z1bmM6J2Rvd25sb2FkVmlkZW8nLGlzT3BlbjpHTV9nZXRWYWx1ZSgnZG93bmxvYWRWaWRlbycsJzIyJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlUmlnaHQnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlUmlnaHQnLCcwJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzonY2hhbmdlTGluaycsaXNPcGVuOkdNX2dldFZhbHVlKCdjaGFuZ2VMaW5rJywnMjInKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LA0KICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVLZXl3b3JkJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUtleXdvcmQnLCcwJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzonc2hvd1NwZWNpYWxDb2x1bW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgnc3BlY2lhbENvbHVtbicsJzIyJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzonc2hvd1ZpZGVvVGl0bGUnLGlzT3BlbjpHTV9nZXRWYWx1ZSgndmlkZW9UaXRsZScsJzIyJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlQXV0aG9yTmFtZScsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVBdXRob3JOYW1lJywnMjInKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LA0KICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVZYW54dWFuJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZVlhbnh1YW4nLCcwJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzonY2xvc2VBdXRob3InLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsMjIpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MX0sDQogICAgICAgICAgICBdDQoNCiAgICAgICAgICAgIHpoRGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLm9ubG9hZD09MCl7DQogICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIHdpbmRvdy5vbmxvYWQ9ZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5pc09wZW49PTIyICYmIGl0ZW0ub25sb2FkPT0xKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCg0KICAgICAgICAgICAgICAgIGlmKHNjcm9sbFRvcCA+IDIwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgemhEYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT3Blbj09MjIgJiYgaXRlbS5pc09uc2Nyb2xsPT0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHRhb2Jhb1NlYXJjaEZ1bmMoaXRlbSl7DQoNCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgKGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdHNEb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLm5leHQtY2hlY2tib3gtZ3JvdXAnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihzZWxlY3RzRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVscyA9IHNlbGVjdHNEb20ucXVlcnlTZWxlY3RvckFsbCgnbGFiZWwnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFiZWxzLmxlbmd0aD4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtVGV4dCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLm5leHQtY2hlY2tib3gtbGFiZWwnKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbVRleHQ9PSflpKnnjKsnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRiTGFiZWxzID0gaXRlbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dERvbSA9IHRiTGFiZWxzLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLnZhbHVlPSdzZXJ2aWNlOnRhb2Jhbyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLnF1ZXJ5U2VsZWN0b3IoJy5uZXh0LWNoZWNrYm94LWxhYmVsJykuaW5uZXJUZXh0PSfmt5jlrp0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmJlZm9yZSh0YkxhYmVscyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxzZWxlY3RUYW9iYW8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3RUYW9iYW8oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTSA+IGRpdiA+IGEnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTmFtZT09J25leHQtY2hlY2tib3gtbGFiZWwnKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRiTGFiZWxzLmNsYXNzTmFtZT09J25leHQtY2hlY2tib3gtd3JhcHBlciAnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5jbGFzc05hbWU9J25leHQtY2hlY2tib3gtd3JhcHBlciBjaGVja2VkJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kc0xpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0uaHJlZi5tYXRjaCgvXC9cL2l0ZW1cLnRhb2Jhb1wuY29tXC9pdGVtXC5odG0vKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlPSdkaXNwbGF5Om5vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLmNsYXNzTmFtZT0nbmV4dC1jaGVja2JveC13cmFwcGVyICc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNMaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGU9J2Rpc3BsYXk6YmxvY2snOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5YiG6aG1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXh0LXBhZ2luYXRpb24tcGFnZXMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUJhci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ojrflj5bmj5LlhaXllYblk4HlhYPntKDmlrnms5UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTScpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsKGUpID0+IHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFEb20gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCdkaXYgPiBhJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFEb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGJMYWJlbHMuY2xhc3NOYW1lPT0nbmV4dC1jaGVja2JveC13cmFwcGVyIGNoZWNrZWQnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighYURvbS5ocmVmLm1hdGNoKC9cL1wvaXRlbVwudGFvYmFvXC5jb21cL2l0ZW1cLmh0bS8pKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURvbS5zdHlsZT0nZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhRG9tLnN0eWxlPSdkaXNwbGF5OmJsb2NrJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+W7tui/n+etieW+heaWueazlQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnb29kc0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudC0tY29udGVudElubmVyLS1RVlRjVTBNID4gZGl2ID4gYScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0YkxhYmVscy5jbGFzc05hbWU9PSduZXh0LWNoZWNrYm94LXdyYXBwZXIgY2hlY2tlZCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWUuaHJlZi5tYXRjaCgvXC9cL2l0ZW1cLnRhb2Jhb1wuY29tXC9pdGVtXC5odG0vKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3R5bGU9J2Rpc3BsYXk6bm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kc0xpc3QuZm9yRWFjaChmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlPSdkaXNwbGF5OmJsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfSkoKTsNCg0KICAgICAgICAgICAgfSkNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGJhaWR1RnVuYygpew0KICAgICAgICBsZXQgcHQgPSAnJywgc2VsZWN0TGlzdCA9IFtdLCBwYXJhbXMgPSB7fSwgbW9kZSA9ICcnLCB3aWR0aCA9IDgwMCwgcGFuID0ge30sIGNvbG9yID0gJycsDQogICAgICAgIGRvYyA9ICQoZG9jdW1lbnQpLCBwcm9ncmVzcyA9IHt9LCByZXF1ZXN0ID0ge30sIGlucyA9IHt9LCBpZG0gPSB7fTsNCiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICc2LjEuMSc7DQogICAgICAgIGNvbnN0IGF1dGhvciA9ICdHcmVhc3lGb3JrJzsNCiAgICAgICAgY29uc3QgbmFtZSA9ICfnvZHnm5jnm7Tpk77kuIvovb3liqnmiYsnOw0KICAgICAgICBjb25zdCBjdXN0b21DbGFzcyA9IHsNCiAgICAgICAgcG9wdXA6ICdwbC1wb3B1cCcsDQogICAgICAgIGhlYWRlcjogJ3BsLWhlYWRlcicsDQogICAgICAgIHRpdGxlOiAncGwtdGl0bGUnLA0KICAgICAgICBjbG9zZUJ1dHRvbjogJ3BsLWNsb3NlJywNCiAgICAgICAgY29udGVudDogJ3BsLWNvbnRlbnQnLA0KICAgICAgICBpbnB1dDogJ3BsLWlucHV0JywNCiAgICAgICAgZm9vdGVyOiAncGwtZm9vdGVyJw0KICAgIH07DQoNCiAgICBjb25zdCB0ZXJtaW5hbFR5cGUgPSB7DQogICAgICAgIHdjOiAiV2luZG93cyBDTUQiLA0KICAgICAgICB3cDogIldpbmRvd3MgUG93ZXJTaGVsbCIsDQogICAgICAgIGx0OiAiTGludXgg57uI56uvIiwNCiAgICAgICAgbHM6ICJMaW51eCBTaGVsbCIsDQogICAgICAgIG10OiAiTWFjT1Mg57uI56uvIiwNCiAgICB9Ow0KDQogICAgbGV0IHRvYXN0ID0gU3dhbC5taXhpbih7DQogICAgICAgIHRvYXN0OiB0cnVlLA0KICAgICAgICBwb3NpdGlvbjogJ3RvcCcsDQogICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwNCiAgICAgICAgdGltZXI6IDM1MDAsDQogICAgICAgIHRpbWVyUHJvZ3Jlc3NCYXI6IGZhbHNlLA0KICAgICAgICBkaWRPcGVuOiAodG9hc3QpID0+IHsNCiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBTd2FsLnN0b3BUaW1lcik7DQogICAgICAgICAgICB0b2FzdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgU3dhbC5yZXN1bWVUaW1lcik7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIGNvbnN0IG1lc3NhZ2UgPSB7DQogICAgICAgIHN1Y2Nlc3M6ICh0ZXh0KSA9PiB7DQogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3N1Y2Nlc3MnfSk7DQogICAgICAgIH0sDQogICAgICAgIGVycm9yOiAodGV4dCkgPT4gew0KICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdlcnJvcid9KTsNCiAgICAgICAgfSwNCiAgICAgICAgd2FybmluZzogKHRleHQpID0+IHsNCiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnd2FybmluZyd9KTsNCiAgICAgICAgfSwNCiAgICAgICAgaW5mbzogKHRleHQpID0+IHsNCiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnaW5mbyd9KTsNCiAgICAgICAgfSwNCiAgICAgICAgcXVlc3Rpb246ICh0ZXh0KSA9PiB7DQogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3F1ZXN0aW9uJ30pOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIGxldCBiYXNlID0gew0KDQogICAgICAgIGdldENvb2tpZShuYW1lKSB7DQogICAgICAgICAgICBsZXQgYXJyID0gZG9jdW1lbnQuY29va2llLnJlcGxhY2UoL1xzL2csICIiKS5zcGxpdCgnOycpOw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcnIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IHRlbXBBcnIgPSBhcnJbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICBpZiAodGVtcEFyclswXSA9PT0gbmFtZSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRlbXBBcnJbMV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAnJzsNCiAgICAgICAgfSwNCg0KICAgICAgICBpc1R5cGUob2JqKSB7DQogICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikucmVwbGFjZSgvXlxbb2JqZWN0ICguKylcXSQvLCAnJDEnKS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldFZhbHVlKG5hbWUpIHsNCiAgICAgICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBzZXRWYWx1ZShuYW1lLCB2YWx1ZSkgew0KICAgICAgICAgICAgR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldFN0b3JhZ2Uoa2V5KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIHNldFN0b3JhZ2Uoa2V5LCB2YWx1ZSkgew0KICAgICAgICAgICAgaWYgKHRoaXMuaXNUeXBlKHZhbHVlKSA9PT0gJ29iamVjdCcgfHwgdGhpcy5pc1R5cGUodmFsdWUpID09PSAnYXJyYXknKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBzZXRDbGlwYm9hcmQodGV4dCkgew0KICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHRleHQsICd0ZXh0Jyk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZShzdHIpIHsNCiAgICAgICAgICAgIHJldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZChzdHIpIHsNCiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGF0b2Ioc3RyKSkpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldEV4dGVuc2lvbihuYW1lKSB7DQogICAgICAgICAgICBjb25zdCByZWcgPSAvKD8hXC4pXHcrJC87DQogICAgICAgICAgICBpZiAocmVnLnRlc3QobmFtZSkpIHsNCiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLm1hdGNoKHJlZyk7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0sDQoNCiAgICAgICAgc2l6ZUZvcm1hdCh2YWx1ZSkgew0KICAgICAgICAgICAgaWYgKHZhbHVlID09PSArdmFsdWUpIHsNCiAgICAgICAgICAgICAgICBsZXQgdW5pdCA9IFsiQiIsICJLQiIsICJNQiIsICJHQiIsICJUQiIsICJQQiIsICJFQiIsICJaQiIsICJZQiJdOw0KICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5sb2coMTAyNCkpOw0KICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmFsdWUgLyBNYXRoLnBvdygxMDI0LCBpbmRleCk7DQogICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUudG9GaXhlZCgxKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSArIHVuaXRbaW5kZXhdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICB9LA0KDQogICAgICAgIHNvcnRCeU5hbWUoYXJyKSB7DQogICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChhLCBiKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gYS5maWxlbmFtZSA/IGEuZmlsZW5hbWUgOiBhLnNlcnZlcl9maWxlbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDIgPSBiLmZpbGVuYW1lID8gYi5maWxlbmFtZSA6IGIuc2VydmVyX2ZpbGVuYW1lOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEubG9jYWxlQ29tcGFyZShwMiwgInpoLUNOIik7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBhcnIuc29ydChoYW5kbGUoKSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZml4RmlsZW5hbWUobmFtZSkgew0KICAgICAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvWyE/JnxgIicqXC86PD5cXF0vZywgJ18nKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBibG9iRG93bmxvYWQoYmxvYiwgZmlsZW5hbWUpIHsNCiAgICAgICAgICAgIGlmIChibG9iIGluc3RhbmNlb2YgQmxvYikgew0KICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7DQogICAgICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7DQogICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lOw0KICAgICAgICAgICAgICAgIGEuY2xpY2soKTsNCiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIHR5cGUpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHsNCiAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsNCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsIHVybCwgaGVhZGVycywgZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywNCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnYmxvYicgPyByZXNvbHZlKHJlcykgOiByZXNvbHZlKHJlcy5yZXNwb25zZSB8fCByZXMucmVzcG9uc2VUZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogKGVycikgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXQodXJsLCBoZWFkZXJzLCB0eXBlLCBleHRyYSkgew0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdE9iaiA9IEdNX3htbGh0dHBSZXF1ZXN0KHsNCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLA0KICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLA0KICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0T2JqLmFib3J0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRtW2V4dHJhLmluZGV4XSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gMjAwICYmIGJhc2UuYmxvYkRvd25sb2FkKHJlcy5yZXNwb25zZSwgZXh0cmEuZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9ucHJvZ3Jlc3M6IChyZXMpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy50b3RhbCA+IDAgPyBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAocmVzLmxvYWRlZCAqIDEwMCAvIHJlcy50b3RhbCkudG9GaXhlZCgyKSA6IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IDAuMDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9ubG9hZHN0YXJ0KCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEgJiYgZXh0cmEuZmlsZW5hbWUgJiYgZXh0cmEuaW5kZXggJiYgKHJlcXVlc3RbZXh0cmEuaW5kZXhdID0gcmVxdWVzdE9iaik7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0RmluYWxVcmwodXJsLCBoZWFkZXJzKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3Qoew0KICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLCB1cmwsIGhlYWRlcnMsDQogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogKHJlcykgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZmluYWxVcmwpOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9LA0KDQogICAgICAgIHN0cmluZ2lmeShvYmopIHsNCiAgICAgICAgICAgIGxldCBzdHIgPSAnJzsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsNCiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07DQogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZVtpXSkgKyAnJic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgJyYnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCAtMSk7IC8vIOWOu+aOieacq+WwvueahCAiJiINCiAgICAgICAgfSwNCg0KICAgICAgICBzbGVlcCh0aW1lKSB7DQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBhZGRTdHlsZShpZCwgdGFnLCBjc3MpIHsNCiAgICAgICAgICAgIHRhZyA9IHRhZyB8fCAnc3R5bGUnOw0KICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LCBzdHlsZURvbSA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7DQogICAgICAgICAgICBpZiAoc3R5bGVEb20pIHJldHVybjsNCiAgICAgICAgICAgIGxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7DQogICAgICAgICAgICBzdHlsZS5yZWwgPSAnc3R5bGVzaGVldCc7DQogICAgICAgICAgICBzdHlsZS5pZCA9IGlkOw0KICAgICAgICAgICAgdGFnID09PSAnc3R5bGUnID8gc3R5bGUuaW5uZXJIVE1MID0gY3NzIDogc3R5bGUuaHJlZiA9IGNzczsNCiAgICAgICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBmaW5kUmVhY3QoZG9tLCB0cmF2ZXJzZVVwID0gMCkgew0KICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZG9tKS5maW5kKGtleSA9PiB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKCJfX3JlYWN0RmliZXIkIikNCiAgICAgICAgICAgICAgICAgICAgfHwga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjb25zdCBkb21GaWJlciA9IGRvbVtrZXldOw0KICAgICAgICAgICAgaWYgKGRvbUZpYmVyID09IG51bGwpIHJldHVybiBudWxsOw0KDQogICAgICAgICAgICBpZiAoZG9tRmliZXIuX2N1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgbGV0IGNvbXBGaWJlciA9IGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXI7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgY29tcEZpYmVyID0gY29tcEZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBjb21wRmliZXIuX2luc3RhbmNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjb25zdCBHZXRDb21wRmliZXIgPSBmaWJlciA9PiB7DQogICAgICAgICAgICAgICAgbGV0IHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuOw0KICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgcGFyZW50RmliZXIudHlwZSA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEZpYmVyOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGxldCBjb21wRmliZXIgPSBHZXRDb21wRmliZXIoZG9tRmliZXIpOw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsNCiAgICAgICAgICAgICAgICBjb21wRmliZXIgPSBHZXRDb21wRmliZXIoY29tcEZpYmVyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjb21wRmliZXIuc3RhdGVOb2RlIHx8IGNvbXBGaWJlcjsNCiAgICAgICAgfSwNCg0KICAgICAgICBpbml0RGVmYXVsdENvbmZpZygpIHsNCiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFt7DQogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX2RvbWFpbicsDQogICAgICAgICAgICAgICAgdmFsdWU6ICdodHRwOi8vbG9jYWxob3N0Jw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3JwY19wb3J0JywNCiAgICAgICAgICAgICAgICB2YWx1ZTogJzE2ODAwJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3JwY19wYXRoJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogJy9qc29ucnBjJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3JwY190b2tlbicsDQogICAgICAgICAgICAgICAgdmFsdWU6ICcnDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX2RpcicsDQogICAgICAgICAgICAgICAgdmFsdWU6ICdEOicNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ190ZXJtaW5hbF90eXBlJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogJ3djJw0KICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3RoZW1lX2NvbG9yJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogJyMwOUFBRkYnDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfaW5pdF9jb2RlJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogJycNCiAgICAgICAgICAgIH1dOw0KDQogICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7DQogICAgICAgICAgICAgICAgYmFzZS5nZXRWYWx1ZSh2Lm5hbWUpID09PSB1bmRlZmluZWQgJiYgYmFzZS5zZXRWYWx1ZSh2Lm5hbWUsIHYudmFsdWUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgc2hvd1NldHRpbmcoKSB7DQogICAgICAgICAgICBsZXQgZG9tID0gJycsIGJ0biA9ICcnLA0KICAgICAgICAgICAgICAgIGNvbG9yTGlzdCA9IFsnIzA5QUFGRicsICcjY2MzMjM1JywgJyM1MjZlZmEnLCAnIzUxOGMxNycsICcjZWQ5NDRiJywgJyNmOTY5YTUnLCAnI2JjYTI4MCddOw0KICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPkuLvmnLo8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgIHBsYWNlaG9sZGVyPSLkuLvmnLrlnLDlnYDvvIzpnIDluKbkuIpodHRwKHMpOi8vIiBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItZG9tYWluIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX0iPjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD56uv5Y+jPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLnq6/lj6Plj7fvvIzkvovlpoLvvJpNb3RyaXjkuLoxNjgwMCIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXBvcnQiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKX0iPjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLot6/lvoTvvIzpu5jorqTkuLovanNvbnJwYyIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXBhdGgiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX0iPjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5a+G6ZKlPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLml6Dlr4bpkqXml6DpnIDloavlhpkiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci10b2tlbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX0iPjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L+d5a2Y6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLmlofku7bkuIvovb3lkI7kv53lrZjot6/lvoTvvIzkvovlpoLvvJpEOiIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLWRpciIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyl9Ij48L2xhYmVsPmA7DQoNCiAgICAgICAgICAgIGNvbG9yTGlzdC5mb3JFYWNoKCh2KSA9PiB7DQogICAgICAgICAgICAgICAgYnRuICs9IGA8ZGl2IGRhdGEtY29sb3I9IiR7dn0iIHN0eWxlPSJiYWNrZ3JvdW5kOiAke3Z9O2JvcmRlcjogMXB4IHNvbGlkICR7dn0iIGNsYXNzPSJwbC1jb2xvci1ib3ggbGlzdGVuZXItY29sb3IgJHt2ID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJykgPyAnY2hlY2tlZCcgOiAnJ30iPjwvZGl2PmA7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+57uI56uv57G75Z6LPC9kaXY+PHNlbGVjdCBjbGFzcz0icGwtaW5wdXQgbGlzdGVuZXItdGVybWluYWwiPmA7DQogICAgICAgICAgICBPYmplY3Qua2V5cyh0ZXJtaW5hbFR5cGUpLmZvckVhY2goayA9PiB7DQogICAgICAgICAgICAgICAgZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpID09PSBrID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3Rlcm1pbmFsVHlwZVtrXX08L29wdGlvbj5gOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08ZGl2PjwvbGFiZWw+YDsNCiAgICAgICAgICAgIGRvbSA9ICc8ZGl2PicgKyBkb20gKyAnPC9kaXY+JzsNCg0KICAgICAgICAgICAgU3dhbC5maXJlKHsNCiAgICAgICAgICAgICAgICB0aXRsZTogJ+WKqeaJi+mFjee9ricsDQogICAgICAgICAgICAgICAgaHRtbDogZG9tLA0KICAgICAgICAgICAgICAgIGljb246ICdpbmZvJywNCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsDQogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLA0KICAgICAgICAgICAgICAgIGZvb3RlcjogcGFuLmZvb3RlciwNCiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn6K6+572u5oiQ5Yqf77yBJyk7DQogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb2xvcicsIGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicsIGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpOw0KICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2Vzcygn6K6+572u5oiQ5Yqf77yBJyk7DQogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZG9tYWluJywgYXN5bmMgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nLCBlLnRhcmdldC52YWx1ZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBvcnQnLCBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnLCBlLnRhcmdldC52YWx1ZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBhdGgnLCBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXRva2VuJywgYXN5bmMgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicsIGUudGFyZ2V0LnZhbHVlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZGlyJywgYXN5bmMgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInLCBlLnRhcmdldC52YWx1ZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignY2hhbmdlJywgJy5saXN0ZW5lci10ZXJtaW5hbCcsIGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJywgZS50YXJnZXQudmFsdWUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgcmVnaXN0ZXJNZW51Q29tbWFuZCgpIHsNCiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ+Kame+4jyDorr7nva4nLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgdGhpcy5zaG93U2V0dGluZygpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgY3JlYXRlVGlwKCkgew0KICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBjbGFzcz0icGwtdG9vbHRpcCI+PC9kaXY+Jyk7DQoNCiAgICAgICAgICAgIGRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgJy5saXN0ZW5lci10aXAnLCAoZSkgPT4gew0KICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdtb3VzZWVudGVyJykgew0KICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuaW5uZXJUZXh0Ow0KICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnNpemU7DQogICAgICAgICAgICAgICAgICAgIGxldCB0aXAgPSBgJHtmaWxlbmFtZX08c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Y29sb3I6ICNmNTZjNmM7Ij4ke3NpemV9PC9zcGFuPmA7DQogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcwLjUnfSk7DQogICAgICAgICAgICAgICAgICAgICQoJy5wbC10b29sdGlwJykuaHRtbCh0aXApLmNzcyh7DQogICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCc6IGUucGFnZVggKyAxMCArICdweCcsDQogICAgICAgICAgICAgICAgICAgICAgICAndG9wJzogZS5wYWdlWSAtIGUuY3VycmVudFRhcmdldC5vZmZzZXRUb3AgPiAxNCA/IGUucGFnZVkgKyAncHgnIDogZS5wYWdlWSArIDIwICsgJ3B4Jw0KICAgICAgICAgICAgICAgICAgICB9KS5zaG93KCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzEnfSk7DQogICAgICAgICAgICAgICAgICAgICQoJy5wbC10b29sdGlwJykuaGlkZSgwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjcmVhdGVMb2FkaW5nKCkgew0KICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgY2xhc3M9InBsLWxvYWRpbmciPjxkaXYgY2xhc3M9InBsLWxvYWRpbmctYm94Ij48ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBjcmVhdGVEb3dubG9hZElmcmFtZSgpIHsNCiAgICAgICAgICAgIGxldCAkZGl2ID0gJCgnPGRpdiBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2Rpc3BsYXk6YmxvY2siPjwvZGl2PicpOw0KICAgICAgICAgICAgbGV0ICRpZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDo7IiBpZD0iZG93bmxvYWRJZnJhbWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicpOw0KICAgICAgICAgICAgJGRpdi5hcHBlbmQoJGlmcmFtZSk7DQogICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKCRkaXYpOw0KICAgICAgICB9LA0KDQogICAgICAgIGdldE1pcnJvckxpc3QobGluaywgbWlycm9yLCB0aHJlYWQgPSAyKSB7DQogICAgICAgICAgICBsZXQgaG9zdCA9IG5ldyBVUkwobGluaykuaG9zdDsNCiAgICAgICAgICAgIGxldCBtaXJyb3JzID0gW107DQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pcnJvci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhyZWFkOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaW5rLnJlcGxhY2UoaG9zdCwgbWlycm9yW2ldKSArICcmJy5yZXBlYXQoaik7DQogICAgICAgICAgICAgICAgICAgIG1pcnJvcnMucHVzaChpdGVtKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbWlycm9ycy5qb2luKCdcbicpOw0KICAgICAgICB9LA0KDQogICAgICAgIGFkZFBhbkxpbmtlclN0eWxlKCkgew0KICAgICAgICAgICAgY29sb3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJyk7DQogICAgICAgICAgICBsZXQgY3NzID0gYA0KICAgICAgICAgICAgYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lIH0NCiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNnB4OyBoZWlnaHQ6IDEwcHggfQ0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJvcmRlci1yYWRpdXM6IDA7IGJhY2tncm91bmQ6IG5vbmUgfQ0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjQpIH0NCiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjIpIH0NCiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDg1LDg1LDg1LC4zKSB9DQogICAgICAgICAgICAuc3dhbDItcG9wdXAgeyBmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgLnBsLXBvcHVwIHsgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC5wbC1wb3B1cCBhIHsgY29sb3I6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC5wbC1oZWFkZXIgeyBwYWRkaW5nOiAwIWltcG9ydGFudDthbGlnbi1pdGVtczogZmxleC1zdGFydCFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlIWltcG9ydGFudDsgbWFyZ2luOiAwIDAgMTBweCFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgMCA1cHghaW1wb3J0YW50OyB9DQogICAgICAgICAgICAucGwtdGl0bGUgeyBmb250LXNpemU6IDE2cHghaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMSFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcCFpbXBvcnRhbnQ7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzIWltcG9ydGFudDt9DQogICAgICAgICAgICAucGwtY29udGVudCB7IHBhZGRpbmc6IDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxMnB4IWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgLnBsLW1haW4geyBtYXgtaGVpZ2h0OiA0MDBweDtvdmVyZmxvdy15OnNjcm9sbDsgfQ0KICAgICAgICAgICAgLnBsLWZvb3RlciB7Zm9udC1zaXplOiAxMnB4IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQhaW1wb3J0YW50OyBtYXJnaW46IDEwcHggMCAwIWltcG9ydGFudDsgcGFkZGluZzogNXB4IDAgMCFpbXBvcnRhbnQ7IGNvbG9yOiAjZjU2YzZjIWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgLnBsLWl0ZW0geyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBsaW5lLWhlaWdodDogMjJweDsgfQ0KICAgICAgICAgICAgLnBsLWl0ZW0tbmFtZSB7IGZsZXg6IDAgMCAxNTBweDsgdGV4dC1hbGlnbjogbGVmdDttYXJnaW4tcmlnaHQ6IDEwcHg7IG92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBjdXJzb3I6ZGVmYXVsdDsgfQ0KICAgICAgICAgICAgLnBsLWl0ZW0tbGluayB7IGZsZXg6IDE7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtYWxpZ246IGxlZnQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO2N1cnNvcjpwb2ludGVyIH0NCiAgICAgICAgICAgIC5wbC1pdGVtLWJ0biB7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBwYWRkaW5nOiA0cHggNXB4OyBib3JkZXItcmFkaXVzOiAzcHg7IGxpbmUtaGVpZ2h0OiAxOyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiAjZmZmOyB9DQogICAgICAgICAgICAucGwtaXRlbS10aXAgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47ZmxleDogMTsgfQ0KICAgICAgICAgICAgLnBsLWJhY2sgeyB3aWR0aDogNzBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6cG9pbnRlcjsgbWFyZ2luOjFweCAwOyB9DQogICAgICAgICAgICAucGwtZXh0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNDRweDsgYmFja2dyb3VuZDogIzk5OTsgY29sb3I6ICNmZmY7IGhlaWdodDogMTZweDsgbGluZS1oZWlnaHQ6IDE2cHg7IGZvbnQtc2l6ZTogMTJweDsgYm9yZGVyLXJhZGl1czogM3B4O30NCiAgICAgICAgICAgIC5wbC1yZXRyeSB7cGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9DQogICAgICAgICAgICAucGwtYnJvd3NlcmRvd25sb2FkIHsgcGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQ0KICAgICAgICAgICAgLnBsLWl0ZW0tcHJvZ3Jlc3MgeyBkaXNwbGF5OmZsZXg7ZmxleDogMTthbGlnbi1pdGVtczpjZW50ZXJ9DQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTt3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDtsaW5lLWhlaWdodDogMTtwb3NpdGlvbjogcmVsYXRpdmU7aGVpZ2h0OjE1cHg7IGZsZXg6IDF9DQogICAgICAgICAgICAucGwtcHJvZ3Jlc3Mtb3V0ZXIgeyBoZWlnaHQ6IDE1cHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI2ViZWVmNTtvdmVyZmxvdzogaGlkZGVuO3Bvc2l0aW9uOiByZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30NCiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lcnsgcG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7dG9wOiAwO2JhY2tncm91bmQtY29sb3I6ICM0MDllZmY7dGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyLXJhZGl1czogMTAwcHg7bGluZS1oZWlnaHQ6IDE7d2hpdGUtc3BhY2U6IG5vd3JhcDt0cmFuc2l0aW9uOiB3aWR0aCAuNnMgZWFzZTt9DQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2NvbG9yOiAjZDFkMWQxO2ZvbnQtc2l6ZTogMTJweDttYXJnaW46IDAgNXB4O2hlaWdodDogMTVweH0NCiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy10aXB7IGZsZXg6MTt0ZXh0LWFsaWduOnJpZ2h0fQ0KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWhvd3sgZmxleDogMCAwIDkwcHg7IGJhY2tncm91bmQ6ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luLWxlZnQ6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1hbGlnbjogY2VudGVyO30NCiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1zdG9weyBmbGV4OiAwIDAgNTBweDsgcGFkZGluZzogMCAxMHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7bWFyZ2luLWxlZnQ6MTBweDtoZWlnaHQ6MjBweH0NCiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lci10ZXh0OmFmdGVyIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbnRlbnQ6ICIiO2hlaWdodDogMTAwJTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30NCiAgICAgICAgICAgIC5wbC1idG4tcHJpbWFyeSB7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmZmZmY7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxMnB4OyBvdXRsaW5lOiBub25lOyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBtYXJnaW46IDJweCAwOyBwYWRkaW5nOiA2cHggMDt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0NCiAgICAgICAgICAgIC5wbC1idG4tcHJpbWFyeTpob3ZlciB7IG9wYWNpdHk6IDAuOTt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0NCiAgICAgICAgICAgIC5wbC1idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICM1NWFmMjg7IGFuaW1hdGlvbjogZWFzZU9wYWNpdHkgMS4ycyAyOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0NCiAgICAgICAgICAgIC5wbC1idG4taW5mbyB7IGJhY2tncm91bmQ6ICM2MDYyNjY7IH0NCiAgICAgICAgICAgIC5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0NCiAgICAgICAgICAgIC5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0NCiAgICAgICAgICAgIC5wbC1idG4tZGFuZ2VyIHsgYmFja2dyb3VuZDogI2NjMzIzNTsgfQ0KICAgICAgICAgICAgLnBsLWRyb3Bkb3duLW1lbnUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMDt0b3A6IDMwcHg7cGFkZGluZzogNXB4IDA7Y29sb3I6IHJnYigzNywgMzgsIDQzKTtiYWNrZ3JvdW5kOiAjZmZmO3otaW5kZXg6IDk5OTt3aWR0aDogMTAycHg7Ym9yZGVyOiAxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOiAxMHB4OyBib3gtc2hhZG93OiAwIDAgMXB4IDFweCByZ2IoMjggMjggMzIgLyA1JSksIDAgOHB4IDI0cHggcmdiKDI4IDI4IDMyIC8gMTIlKTt9DQogICAgICAgICAgICAucGwtZHJvcGRvd24tbWVudS1pdGVtIHsgaGVpZ2h0OiAzMHB4O2Rpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgfQ0KICAgICAgICAgICAgLnBsLWRyb3Bkb3duLW1lbnUtaXRlbTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTMyLDEzMywxNDEsMC4wOCk7fQ0KICAgICAgICAgICAgLnBsLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudSB7IGRpc3BsYXk6IG5vbmU7IH0NCiAgICAgICAgICAgIC5wbC1idXR0b246aG92ZXIgLnBsLWRyb3Bkb3duLW1lbnUgeyBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC5wbC1idXR0b24taW5pdCB7IG9wYWNpdHk6IDAuNTsgYW5pbWF0aW9uOiBlYXNlSW5pdE9wYWNpdHkgMS4ycyAzOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0NCiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGVhc2VJbml0T3BhY2l0eSB7IGZyb20geyBvcGFjaXR5OiAwLjU7IH0gNTAlIHsgb3BhY2l0eTogMSB9IHRvIHsgb3BhY2l0eTogMC41OyB9IH0NCiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGVhc2VPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDE7IH0gNTAlIHsgb3BhY2l0eTogMC4zNSB9IHRvIHsgb3BhY2l0eTogMTsgfSB9DQogICAgICAgICAgICAuZWxlbWVudC1jbGlja2VkIHsgb3BhY2l0eTogMC41OyB9DQogICAgICAgICAgICAucGwtZXh0cmEgeyBtYXJnaW4tdG9wOiAxMHB4O2Rpc3BsYXk6ZmxleH0NCiAgICAgICAgICAgIC5wbC1leHRyYSBidXR0b24geyBmbGV4OiAxfQ0KICAgICAgICAgICAgLnBvaW50ZXIgeyBjdXJzb3I6cG9pbnRlciB9DQogICAgICAgICAgICAucGwtc2V0dGluZy1sYWJlbCB7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDEwcHg7IH0NCiAgICAgICAgICAgIC5wbC1sYWJlbCB7IGZsZXg6IDAgMCAxMDBweDt0ZXh0LWFsaWduOmxlZnQ7IH0NCiAgICAgICAgICAgIC5wbC1pbnB1dCB7IGZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjYzJjMmMyOyBib3JkZXItcmFkaXVzOiA1cHg7IGZvbnQtc2l6ZTogMTRweCB9DQogICAgICAgICAgICAucGwtY29sb3IgeyBmbGV4OiAxO2Rpc3BsYXk6IGZsZXg7ZmxleC13cmFwOiB3cmFwOyBtYXJnaW4tcmlnaHQ6IC0xMHB4O30NCiAgICAgICAgICAgIC5wbC1jb2xvci1ib3ggeyB3aWR0aDogMzVweDtoZWlnaHQ6IDM1cHg7bWFyZ2luOjEwcHggMTBweCAwIDA7OyBib3gtc2l6aW5nOiBib3JkZXItYm94O2JvcmRlcjoxcHggc29saWQgI2ZmZjtjdXJzb3I6cG9pbnRlciB9DQogICAgICAgICAgICAucGwtY29sb3ItYm94LmNoZWNrZWQgeyBib3JkZXI6M3B4IGRhc2hlZCAjMTExIWltcG9ydGFudCB9DQogICAgICAgICAgICAucGwtY2xvc2U6Zm9jdXMgeyBvdXRsaW5lOiAwOyBib3gtc2hhZG93OiBub25lOyB9DQogICAgICAgICAgICAudGFnLWRhbmdlciB7Y29sb3I6I2NjMzIzNTttYXJnaW46IDAgNXB4O30NCiAgICAgICAgICAgIC5wbC10b29sdGlwIHsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogI2ZmZmZmZjsgbWF4LXdpZHRoOiA2MDBweDsgZm9udC1zaXplOiAxMnB4OyBwYWRkaW5nOiA1cHggMTBweDsgYmFja2dyb3VuZDogIzMzMzsgYm9yZGVyLXJhZGl1czogNXB4OyB6LWluZGV4OiAxMTAwMDA7IGxpbmUtaGVpZ2h0OiAxLjM7IGRpc3BsYXk6bm9uZTsgd29yZC1icmVhazogYnJlYWstYWxsO30NCiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGxvYWQgeyAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIH0gMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfSB9DQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7Ym9yZGVyLXJhZGl1czogNTAlO30NCiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMSkgeyB0b3A6IDlweDtsZWZ0OiA5cHg7d2lkdGg6IDgycHg7aGVpZ2h0OiA4MnB4O2JhY2tncm91bmQ6ICNmZmZmZmY7fQ0KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2Om50aC1jaGlsZCgyKSB7IHRvcDogMTRweDtsZWZ0OiAzOHB4O3dpZHRoOiAyNXB4O2hlaWdodDogMjVweDtiYWNrZ3JvdW5kOiAjNjY2NjY2O2FuaW1hdGlvbjogbG9hZCAxcyBsaW5lYXIgaW5maW5pdGU7dHJhbnNmb3JtLW9yaWdpbjogMTJweCAzNnB4O30NCiAgICAgICAgICAgIC5wbC1sb2FkaW5nIHsgd2lkdGg6IDE2cHg7aGVpZ2h0OiAxNnB4O2Rpc3BsYXk6IGlubGluZS1ibG9jaztvdmVyZmxvdzogaGlkZGVuO2JhY2tncm91bmQ6IG5vbmU7fQ0KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94IHsgd2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO3Bvc2l0aW9uOiByZWxhdGl2ZTt0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCkgc2NhbGUoMC4xNik7YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO3RyYW5zZm9ybS1vcmlnaW46IDAgMDt9DQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggZGl2IHsgYm94LXNpemluZzogY29udGVudC1ib3g7IH0NCiAgICAgICAgICAgIC5zd2FsMi1jb250YWluZXIgeyB6LWluZGV4OjEwMDAwMCFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIGJvZHkuc3dhbDItaGVpZ2h0LWF1dG8geyBoZWlnaHQ6IGluaGVyaXQhaW1wb3J0YW50OyB9DQogICAgICAgICAgICAuYnRuLW9wZXJhdGUgLmJ0bi1tYWluIHsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IH0NCiAgICAgICAgICAgIGA7DQogICAgICAgICAgICB0aGlzLmFkZFN0eWxlKCdwYW5saW5rZXItc3R5bGUnLCAnc3R5bGUnLCBjc3MpOw0KICAgICAgICB9LA0KDQogICAgICAgIGFzeW5jIGluaXREaWFsb2coKSB7DQogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFN3YWwuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgIHRpdGxlOiAi6K+35pSv5oyB5Y6f5YibIiwNCiAgICAgICAgICAgICAgICAgICAgaHRtbDogYDxkaXY+PGltZyBzdHlsZT0id2lkdGg6IDI1MHB4O21hcmdpbi1ib3R0b206IDEwcHg7IiBzcmM9IiR7cGFuLmltZ30iIGFsdD0iJHtwYW4uaW1nfSI+PGlucHV0IGNsYXNzPSJzd2FsMi1pbnB1dCIgaWQ9ImluaXQiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLor7fpmo/kvr/ovpPlhaXmmpflj7ciPjwvZGl2PmAsDQogICAgICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+egtOinoycNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzRGlzbWlzc2VkICYmIHJlc3VsdC5kaXNtaXNzID09PSAnY2xvc2UnKSByZXR1cm47DQogICAgICAgICAgICAgICAgaWYgKHBhbi5udW0gPT0gcGFuLm51bSkgew0KICAgICAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOw0KICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoIuaal+WPt+ato+ehriIpOw0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7DQogICAgICAgICAgICAgICAgICAgIH0sIDE1MDApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGF3YWl0IFN3YWwuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToi5pqX5Y+35LiN5q2j56GuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICLmmpflj7fkuI3mraPnoa4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfph43mlrDovpPlhaUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6IHBhbi5pbWcsDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREaWFsb2coKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICB9Ow0KDQogICAgbGV0IGJhaWR1ID0gew0KDQogICAgICAgIF9nZXRFeHRyYSgpIHsNCiAgICAgICAgICAgIGxldCBzZUtleSA9IGRlY29kZVVSSUNvbXBvbmVudChiYXNlLmdldENvb2tpZSgnQkRDTE5EJykpOw0KICAgICAgICAgICAgcmV0dXJuICd7JyArICcic2VrZXkiOiInICsgc2VLZXkgKyAnIicgKyAifSI7DQogICAgICAgIH0sDQoNCiAgICAgICAgX2dldFN1cmwoKSB7DQoNCiAgICAgICAgICAgIGxldCByZWcgPSAvKD88PXNcL3xzdXJsPSkoW2EtekEtWjAtOV8tXSspL2c7DQogICAgICAgICAgICBpZiAocmVnLnRlc3QobG9jYXRpb24uaHJlZikpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChyZWcpWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICcnOw0KDQogICAgICAgIH0sDQoNCiAgICAgICAgX2dldEZpZExpc3QoKSB7DQogICAgICAgICAgICBsZXQgZmlkbGlzdCA9IFtdOw0KICAgICAgICAgICAgc2VsZWN0TGlzdC5mb3JFYWNoKHYgPT4gew0KICAgICAgICAgICAgICAgIGlmICgrdi5pc2RpciA9PT0gMSkgcmV0dXJuOw0KICAgICAgICAgICAgICAgIGZpZGxpc3QucHVzaCh2LmZzX2lkKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuICdbJyArIGZpZGxpc3QgKyAnXSc7DQogICAgICAgIH0sDQoNCiAgICAgICAgX3Jlc2V0RGF0YSgpIHsNCiAgICAgICAgICAgIHByb2dyZXNzID0ge307DQogICAgICAgICAgICAkLmVhY2gocmVxdWVzdCwgKGtleSkgPT4gew0KICAgICAgICAgICAgICAgIChyZXF1ZXN0W2tleV0pLmFib3J0KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICQuZWFjaChpbnMsIChrZXkpID0+IHsNCiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1trZXldKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgaWRtID0ge307DQogICAgICAgICAgICBpbnMgPSB7fTsNCiAgICAgICAgICAgIHJlcXVlc3QgPSB7fTsNCiAgICAgICAgfSwNCg0KICAgICAgICBzZXRCRFVTUygpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgR01fY29va2llICYmIEdNX2Nvb2tpZSgnbGlzdCcsIHtuYW1lOiAnQkRVU1MnfSwgKGNvb2tpZXMsIGVycm9yKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Uuc2V0U3RvcmFnZSgiYmFpZHV5dW5QbHVnaW5fQkRVU1MiLCB7QkRVU1M6IGNvb2tpZXNbMF0udmFsdWV9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIGdldEJEVVNTKCkgew0KICAgICAgICAgICAgbGV0IGJhaWR1eXVuUGx1Z2luX0JEVVNTID0gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpID8gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpIDogJ3siYmFpZHV5dW5QbHVnaW5fQkRVU1MiOiIifSc7DQogICAgICAgICAgICByZXR1cm4gYmFpZHV5dW5QbHVnaW5fQkRVU1MuQkRVU1MgfHwgJyc7DQogICAgICAgIH0sDQoNCiAgICAgICAgY29udmVydExpbmtUb0FyaWEobGluaywgZmlsZW5hbWUsIHVhKSB7DQogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7DQogICAgICAgICAgICBpZiAoISFCRFVTUykgew0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJVc2VyLUFnZW50OiAke3VhfSIgLS1oZWFkZXIgIkNvb2tpZTogQkRVU1M9JHtCRFVTU30iYCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsDQogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0NCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgew0KICAgICAgICAgICAgbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOw0KICAgICAgICAgICAgaWYgKCEhQkRVU1MpIHsNCiAgICAgICAgICAgICAgICBsZXQgY29va2llID0gYEJEVVNTPSR7QkRVU1N9YDsNCiAgICAgICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfSZjb29raWU9JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llKX0mdXNlcl9hZ2VudD0ke2VuY29kZVVSSUNvbXBvbmVudCh1YSl9WlpgOw0KICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZShiYyl9YCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsDQogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0NCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7DQogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7DQogICAgICAgICAgICBpZiAoISFCRFVTUykgew0KICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOw0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSIgLUEgIiR7dWF9IiAtYiAiQkRVU1M9JHtCRFVTU30iYCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsDQogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0NCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZhY3RvcnkoZSkgew0KICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTsNCiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRhcmdldC5wYXJlbnRzKCcucGwtaXRlbScpOw0KICAgICAgICAgICAgICAgIGxldCBsaW5rID0gaXRlbS5maW5kKCcucGwtaXRlbS1saW5rJyk7DQogICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gaXRlbS5maW5kKCcucGwtaXRlbS1wcm9ncmVzcycpOw0KICAgICAgICAgICAgICAgIGxldCB0aXAgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXRpcCcpOw0KICAgICAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgICAgIGl0ZW0sIGxpbmssIHByb2dyZXNzLCB0aXAsIHRhcmdldCwNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBfcmVzZXQoaSkgew0KICAgICAgICAgICAgICAgIGluc1tpXSAmJiBjbGVhckludGVydmFsKGluc1tpXSk7DQogICAgICAgICAgICAgICAgcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7DQogICAgICAgICAgICAgICAgcHJvZ3Jlc3NbaV0gPSAwOw0KICAgICAgICAgICAgICAgIGlkbVtpXSA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBkb2Mub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBjbGljaycsICcucGwtYnV0dG9uLmctZHJvcGRvd24tYnV0dG9uJywgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VsZWF2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCdidXR0b24tb3BlbicpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYnV0dG9uLW9wZW4nKTsNCiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJy5wbC1kcm9wZG93bi1tZW51Jykuc2hvdygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWxlYXZlJywgJy5wbC1idXR0b24uZy1kcm9wZG93bi1idXR0b24gLnBsLWRyb3Bkb3duLW1lbnUnLCAoZSkgPT4gew0KICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5oaWRlKCk7DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gew0KICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7DQogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOw0KICAgICAgICAgICAgICAgIHRoaXMuZ2V0UENTTGluaygpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7DQogICAgICAgICAgICAgICAgbGV0ICR3aWR0aCA9IG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXInKTsNCiAgICAgICAgICAgICAgICBsZXQgJHRleHQgPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKTsNCiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsNCiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsNCiAgICAgICAgICAgICAgICBfcmVzZXQoaW5kZXgpOw0KICAgICAgICAgICAgICAgIGJhc2UuZ2V0KG8ubGlua1swXS5kYXRhc2V0LmxpbmssIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOw0KICAgICAgICAgICAgICAgIGluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGxldCBwcm9nID0gK3Byb2dyZXNzW2luZGV4XSB8fCAwOw0KICAgICAgICAgICAgICAgICAgICBsZXQgaXNJRE0gPSBpZG1baW5kZXhdIHx8IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNJRE0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3MuaGlkZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgby5saW5rLnRleHQoJ+W3suaIkOWKn+WUpOi1t0lETe+8jOivt+afpeeci0lETeS4i+i9veahhu+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKS5zaG93KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWRtW2luZGV4XSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgby5saW5rLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3Muc2hvdygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHdpZHRoLmNzcygnd2lkdGgnLCBwcm9nICsgJyUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXh0LnRleHQocHJvZyArICclJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZyA9PT0gMTAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1tpbmRleF0gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLXRpcCcpLmh0bWwoJ+S4i+i9veWujOaIkO+8jOato+WcqOW8ueWHuua1j+iniOWZqOS4i+i9veahhu+8gScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmV0cnknLCBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7DQogICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOw0KICAgICAgICAgICAgICAgIG8ubGluay5zaG93KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsNCiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsNCiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFtpbmRleF0pIHsNCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsNCiAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5oaWRlKCk7DQogICAgICAgICAgICAgICAgICAgIG8udGlwLnNob3coKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc3RvcCcsIGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsNCiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsNCiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFtpbmRleF0pIHsNCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsNCiAgICAgICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOw0KICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgby5saW5rLnNob3coMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1iYWNrJywgYXN5bmMgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOw0KICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsNCiAgICAgICAgICAgICAgICBvLmxpbmsuc2hvdygpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7DQogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgIGlmICghZS50YXJnZXQuZGF0YXNldC5saW5rKSB7DQogICAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdsaXN0ZW5lci1jb3B5LWFsbCcpLmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsNCiAgICAgICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOw0KICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOw0KICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgew0KICAgICAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn++8jOW/q+WOu+eci+eci+WQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PT0gJ2Fzc2lzdGFudCcpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsNCiAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItbGluay1ycGMnKS5jbGljaygpOw0KICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSru+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gew0KICAgICAgICAgICAgICAgIGJhc2Uuc2hvd1NldHRpbmcoKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwNCiAgICAgICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLA0KICAgICAgICAgICAgICAgIH0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsNCiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGUpID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgew0KICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sIHRydWUpOw0KICAgICAgICB9LA0KDQogICAgICAgIGFkZEJ1dHRvbigpIHsNCiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsNCiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7DQogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uIj48ZGl2IHN0eWxlPSJjb2xvcjojZmZmO2JhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibWVudSIgc3R5bGU9IndpZHRoOmF1dG87ei1pbmRleDo0MTtib3JkZXItY29sb3I6JHtjb2xvcn0iPjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2Rpdj48ZGl2IHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9kaXY+PC9kaXY+PC9kaXY+YCk7DQogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOw0KICAgICAgICAgICAgaWYgKHB0ID09PSAnbWFpbicpIHsNCiAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7DQogICAgICAgICAgICAgICAgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InBsLWJ1dHRvbiIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6IDhweDsiPjxidXR0b24gY2xhc3M9InUtYnV0dG9uIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImJhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjogJHtjb2xvcn07Zm9udC1zaXplOiAxNHB4OyBwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyOiBub25lOyI+PGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9idXR0b24+PHVsIGNsYXNzPSJkcm9wZG93bi1saXN0IG5kLWNvbW1vbi1mbG9hdC1tZW51IHBsLWRyb3Bkb3duLW1lbnUiPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+PC91bD48L2Rpdj5gKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsNCiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOw0KICAgICAgICAgICAgdGhpcy5zZXRCRFVTUygpOw0KICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBhZGRJbml0QnV0dG9uKCkgew0KICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOw0KICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsNCiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24taW5pdCIgc3R5bGU9Im9wYWNpdHk6LjUiPjxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7YmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiA2MHB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvc3Bhbj48L2Rpdj48L2Rpdj5gKTsNCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7DQogICAgICAgICAgICBpZiAocHQgPT09ICdtYWluJykgew0KICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5tYWluKTsNCiAgICAgICAgICAgICAgICAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uLWluaXQiIHN0eWxlPSJvcGFjaXR5Oi41OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0idS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iYmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiAke2NvbG9yfTtmb250LXNpemU6IDE0cHg7IHBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsNCiAgICAgICAgICAgICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOw0KICAgICAgICAgICAgJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgYXN5bmMgZ2V0VG9rZW4oKSB7DQogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsNCiAgICAgICAgICAgIGlmIChyZXMuaW5kZXhPZignYWNjZXNzX3Rva2VuJykgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCBiYXNlLmdldChwYW4ucGNzWzNdLCB7fSwgJ3RleHQnKTsNCiAgICAgICAgICAgICAgICBsZXQgYmRzdG9rZW4gPSBodG1sLm1hdGNoKC9uYW1lPSJiZHN0b2tlbiJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOw0KICAgICAgICAgICAgICAgIGxldCBjbGllbnRfaWQgPSBodG1sLm1hdGNoKC9uYW1lPSJjbGllbnRfaWQiXHMrdmFsdWU9IihbXiJdKykiLyk/LlsxXTsNCiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgICAgICAgZ3JhbnRfcGVybWlzc2lvbnNfYXJyOiAnbmV0ZGlzaycsDQogICAgICAgICAgICAgICAgICAgIGJkc3Rva2VuOiBiZHN0b2tlbiwNCiAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRfaWQsDQogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6ICJ0b2tlbiIsDQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICJwYWdlIiwNCiAgICAgICAgICAgICAgICAgICAgZ3JhbnRfcGVybWlzc2lvbnM6ICJiYXNpYyxuZXRkaXNrIg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1szXSwgYmFzZS5zdHJpbmdpZnkoZGF0YSksIHsNCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLA0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgbGV0IHJlczIgPSBhd2FpdCBiYXNlLmdldEZpbmFsVXJsKHBhbi5wY3NbM10pOw0KICAgICAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHJlczIubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsNCiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOw0KICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzX3Rva2VuPShbXiZdKykvKT8uWzFdOw0KICAgICAgICAgICAgYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsNCiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjsNCiAgICAgICAgfSwNCg0KICAgICAgICBhc3luYyBnZXRQQ1NMaW5rKG1heFJlcXVlc3RUaW1lID0gMikgew0KICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7DQogICAgICAgICAgICBsZXQgZmlkTGlzdCA9IHRoaXMuX2dldEZpZExpc3QoKSwgdXJsLCByZXM7DQoNCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnIHx8IHB0ID09PSAnbWFpbicpIHsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tu+8gScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+aJk+W8gOaWh+S7tuWkueWQjuWLvumAieaWh+S7tu+8gScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmaWRMaXN0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGZpZExpc3QpOw0KICAgICAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IGJhc2UuZ2V0U3RvcmFnZSgnYWNjZXNzVG9rZW4nKSB8fCBhd2FpdCB0aGlzLmdldFRva2VuKCk7DQogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1swXX0mZnNpZHM9JHtmaWRMaXN0fSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gOw0KICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGJhc2UuZ2V0KHVybCwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmdldFNoYXJlRGF0YSgpOw0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChmaWRMaXN0Lmxlbmd0aCA9PT0gMikgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLnNpZ24pIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3Bhbi5wY3NbMl19JnN1cmw9JHtwYXJhbXMuc3VybH0mbG9naWQ9JHtwYXJhbXMubG9naWR9YDsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBiYXNlLmdldCh1cmwpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoci5lcnJubyA9PT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNpZ24gPSByLmRhdGEuc2lnbjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy50aW1lc3RhbXAgPSByLmRhdGEudGltZXN0YW1wOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpYWxvZyA9IGF3YWl0IFN3YWwuZmlyZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3Q6IHRydWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBg5o+Q56S677ya6K+35bCG5paH5Lu2PHNwYW4gY2xhc3M9InRhZy1kYW5nZXIiPlvkv53lrZjliLDnvZHnm5hdPC9zcGFuPvCfkYnliY3lvoA8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+aIkeeahOe9keebmF08L3NwYW4+5Lit5LiL6L2977yBYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+eCueWHu+S/neWtmCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLA0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLmlzQ29uZmlybWVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRvb2xzLXNoYXJlLXNhdmUtaGInKVswXS5jbGljaygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmJkc3Rva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjnmbvlvZXnvZHnm5jvvIEnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7DQogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbmNyeXB0JywgcGFyYW1zLmVuY3J5cHQpOw0KICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZHVjdCcsIHBhcmFtcy5wcm9kdWN0KTsNCiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VrJywgcGFyYW1zLnVrKTsNCiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3ByaW1hcnlpZCcsIHBhcmFtcy5wcmltYXJ5aWQpOw0KICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlkX2xpc3QnLCBmaWRMaXN0KTsNCiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2xvZ2lkJywgcGFyYW1zLmxvZ2lkKTsNCiAgICAgICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyA/IGZvcm1EYXRhLmFwcGVuZCgnZXh0cmEnLCBwYXJhbXMuZXh0cmEpIDogJyc7DQogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1sxXX0mc2lnbj0ke3BhcmFtcy5zaWdufSZ0aW1lc3RhbXA9JHtwYXJhbXMudGltZXN0YW1wfWA7DQogICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgZm9ybURhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJlcy5lcnJubyA9PT0gMCkgew0KICAgICAgICAgICAgICAgIGxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShyZXMubGlzdCk7DQogICAgICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5lcnJubyA9PT0gMTEyKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mumhtemdoui/h+acn++8jOivt+WIt+aWsOmHjeivle+8gScpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJybm8gPT09IDkwMTkpIHsNCiAgICAgICAgICAgICAgICBtYXhSZXF1ZXN0VGltZS0tOw0KICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTsNCiAgICAgICAgICAgICAgICBpZiAobWF4UmVxdWVzdFRpbWUgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yB6K+35Yi35paw572R6aG15ZCO6YeN6K+V77yBJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIHor7fliLfmlrDnvZHpobXlkI7ph43or5XvvIEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7DQogICAgICAgICAgICBsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOw0KICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOw0KICAgICAgICAgICAgYmFzZS5zb3J0QnlOYW1lKGxpc3QpOw0KICAgICAgICAgICAgbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHYuaXNkaXIgPT09IDEpIHJldHVybjsNCiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LnNlcnZlcl9maWxlbmFtZSB8fCB2LmZpbGVuYW1lOw0KICAgICAgICAgICAgICAgIGxldCBleHQgPSBiYXNlLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7DQogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsNCiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRsaW5rOw0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXBpJykgew0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcGkiIGhyZWY9IiR7ZGxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PHNwYW4+6Iul5rKh5pyJ5by55Ye6SURN5LiL6L295qGG77yM5om+5YiwSURNIDxiPumAiemhuTwvYj4gLT4gPGI+5paH5Lu257G75Z6LPC9iPiAtPiA8Yj7nrKzkuIDkuKrmoYY8L2I+IOS4rea3u+WKoOWQjue8gCA8c3BhbiBjbGFzcz0icGwtZXh0Ij4ke2V4dH08L3NwYW4+77yMPGEgaHJlZj0iJHtwYW4uaWRtfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7or6bop4HmraTlpIQ8L2E+PC9zcGFuPiA8c3BhbiBjbGFzcz0icGwtYmFjayBsaXN0ZW5lci1iYWNrIj7ov5Tlm548L3NwYW4+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1vdXRlciI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1pbm5lci10ZXh0Ij4wJTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3Mtc3RvcCBsaXN0ZW5lci1zdG9wIj7lj5bmtojkuIvovb08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIj7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L2Rpdj5gOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluay5saW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjb250ZW50ICs9ICc8L2Rpdj4nOw0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykNCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOw0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7DQogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOw0KICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykNCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOw0KICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7DQogICAgICAgIH0sDQoNCiAgICAgICAgYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgew0KICAgICAgICAgICAgbGV0IHJwYyA9IHsNCiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLA0KICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwNCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksDQogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksDQogICAgICAgICAgICAgICAgZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7DQogICAgICAgICAgICBpZiAoIUJEVVNTKSByZXR1cm4gJ2Fzc2lzdGFudCc7DQoNCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsNCiAgICAgICAgICAgIGxldCBycGNEYXRhID0gew0KICAgICAgICAgICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwNCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywNCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLA0KICAgICAgICAgICAgICAgIHBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsNCiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLA0KICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLA0KICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IFtgVXNlci1BZ2VudDogJHtwYW4udWF9YCwgYENvb2tpZTogQkRVU1M9JHtCRFVTU31gXQ0KICAgICAgICAgICAgICAgIH1dDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJycpOw0KICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOw0KICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCdzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMnKS5pbnN0YW5jZUZvclN5c3RlbS5saXN0LmdldFNlbGVjdGVkKCk7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53cC1zLWNvcmUtcGFuJykuX192dWVfXy5zZWxlY3RlZExpc3Q7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0TG9naWQoKSB7DQogICAgICAgICAgICBsZXQgdXQgPSByZXF1aXJlKCJzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMiKS5pbnN0YW5jZUZvclN5c3RlbS50b29scy5iYXNlU2VydmljZTsNCiAgICAgICAgICAgIHJldHVybiB1dC5iYXNlNjRFbmNvZGUoYmFzZS5nZXRDb29raWUoIkJBSURVSUQiKSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgZ2V0U2hhcmVEYXRhKCkgew0KICAgICAgICAgICAgbGV0IHJlcyA9IGxvY2Fscy5kdW1wKCk7DQogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID0gJ3NlY3JldCc7DQogICAgICAgICAgICBwYXJhbXMuc2lnbiA9ICcnOw0KICAgICAgICAgICAgcGFyYW1zLnRpbWVzdGFtcCA9ICcnOw0KICAgICAgICAgICAgcGFyYW1zLmJkc3Rva2VuID0gcmVzLmJkc3Rva2VuLnZhbHVlOw0KICAgICAgICAgICAgcGFyYW1zLmNoYW5uZWwgPSAnY2h1bmxlaSc7DQogICAgICAgICAgICBwYXJhbXMuY2xpZW50dHlwZSA9IDA7DQogICAgICAgICAgICBwYXJhbXMud2ViID0gMTsNCiAgICAgICAgICAgIHBhcmFtcy5hcHBfaWQgPSAyNTA1Mjg7DQogICAgICAgICAgICBwYXJhbXMuZW5jcnlwdCA9IDA7DQogICAgICAgICAgICBwYXJhbXMucHJvZHVjdCA9ICdzaGFyZSc7DQogICAgICAgICAgICBwYXJhbXMubG9naWQgPSB0aGlzLmdldExvZ2lkKCk7DQogICAgICAgICAgICBwYXJhbXMucHJpbWFyeWlkID0gcmVzLnNoYXJlaWQudmFsdWU7DQogICAgICAgICAgICBwYXJhbXMudWsgPSByZXMuc2hhcmVfdWsudmFsdWU7DQogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyAmJiAocGFyYW1zLmV4dHJhID0gdGhpcy5fZ2V0RXh0cmEoKSk7DQogICAgICAgICAgICBwYXJhbXMuc3VybCA9IHRoaXMuX2dldFN1cmwoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICBkZXRlY3RQYWdlKCkgew0KICAgICAgICAgICAgbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsNCiAgICAgICAgICAgIGlmICgvXlwvZGlza1wvaG9tZS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsNCiAgICAgICAgICAgIGlmICgvXlwvZGlza1wvbWFpbi8udGVzdChwYXRoKSkgcmV0dXJuICdtYWluJzsNCiAgICAgICAgICAgIGlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOw0KICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICB9LA0KDQogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsNCiAgICAgICAgICAgIFN3YWwuZmlyZSh7DQogICAgICAgICAgICAgICAgdGl0bGUsDQogICAgICAgICAgICAgICAgaHRtbCwNCiAgICAgICAgICAgICAgICBmb290ZXIsDQogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLA0KICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwNCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsDQogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLA0KICAgICAgICAgICAgICAgIHdpZHRoLA0KICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywNCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywNCiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0RGF0YSgpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsNCiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsNCiAgICAgICAgICAgIGJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsNCiAgICAgICAgICAgIHB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7DQogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0DQogICAgICAgICAgICAoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsNCiAgICAgICAgICAgIHBhbiA9IEpTT04ucGFyc2UoYmFzZS5kKHJlcykpOw0KICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7DQogICAgICAgICAgICBjb25zb2xlLmxvZyhwYW4pOw0KICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsNCiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7DQogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICBsZXQgbWFpbiA9IHsNCiAgICAgICAgaW5pdCgpIHsNCiAgICAgICAgICAgIGlmICgvKHBhbnx5dW4pLmJhaWR1LmNvbS8udGVzdChsb2NhdGlvbi5ob3N0KSkgew0KICAgICAgICAgICAgICAgIGJhaWR1LmluaXRQYW5MaW5rZXIoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICBtYWluLmluaXQoKTsNCiAgICB9DQogICAgfQ0KfSkoKTs=
Add Comment
Please, Sign In to add comment