xiaomianao666

插件名:global_懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、知乎增

Mar 28th, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、知乎增@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDmh5LkurrkuJPnlKjvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrjgIHlhajnvZHpn7PkuZDnm7TmjqXkuIvovb3jgIHnn6XkuY7lop7lvLrjgIHnn63op4bpopHml6DmsLTljbDkuIvovb3nrYnlpJrlip/og73lt6XlhbfnrrHvvIzlip/og73lj6/ni6znq4vlvIDlhbPjgILplb/mnJ/mm7TmlrDvvIzmlL7lv4Pkvb/nlKjjgIJ2NgovLyBAbmFtZXNwYWNlICAgIGxhbmhhaGEKLy8gQHZlcnNpb24gICAgICA2LjguMjgKLy8gQGRlc2NyaXB0aW9uICDoh6rnlKjlpJrlip/og73ohJrmnKzlt6XlhbfnrrHvvIzlrozlhajlhY3otLnjgIHml6Dlub/lkYrjgIHml6DpnIDlhbPms6jlhazkvJflj7fvvIzpm4blkIjkuobkvJjphbfjgIHniLHlpYfoibrjgIHohb7orq/jgIFC56uZKGJpbGliaWxpKeOAgeiKkuaenOetieWFqOe9kVZJUOinhumikShQQyvnp7vliqjnq68p5YWN6LS556C06Kej5Y675bm/5ZGK77yM572R5piT5LqR6Z+z5LmQ44CBUVHpn7PkuZDjgIHphbfni5fjgIHphbfmiJHjgIHomb7nsbPjgIHonLvonJNGTeOAgeiNlOaenUZN44CB5Zac6ams5ouJ6ZuF562J572R56uZ6Z+z5LmQ5ZKM5pyJ5aOw5Lmm6Z+z6aKR5YWN5a6i5oi356uv5LiL6L2977yM55+l5LmO5aKe5by6KOefpeS5juinhumikeS4i+i9veOAgeWOu+W5v+WRiuOAgeWFs+mUruivjeWxj+iUveOAgeWOu+mZpOS+p+i+ueagj+etiSnvvIzop4bpopHml6DmsLTljbDkuIvovb0oYmlsaWJpbGnjgIHmipbpn7PjgIHlv6vmiYvjgIHopb/nk5zjgIF5b3V0dWJlKeetieWHoOS4quiHquW3seW4uOeUqOeahOWKn+iDve+8jOS4lOWKn+iDveWPr+eLrOeri+W8gOWFs+OAggovLyBAYXV0aG9yICAgICAgIGxhbmhhaGEKLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUdRQUFBQmtDQVlBQUFCdzRwVlVBQUFROEVsRVFWUjRYdTFkQ1hRVVJScithcElRVDF3UXc2RVlCY1NFckNnS0NvUW93b29jTGlyS2VvQW9MRDV4MllEdStoVENQbmRkSmVDNUN0NmdJQnRkbFVNUXhBUEU5NWdNS2tiaG9XR0NLTWdwc1BqVW9Fc0lrTnIzVGFkaE11bWVxZTZ1bmdSSThTQkFWOWZ4Zi9XZjlWZVhnSWNpcGN6eThQcFIvYW9Rb3N6TkJJV1RsNlNVdlFBTUFIQUpnRmJZc1NzZEg1ZTB3aWNsd01wVndLN2RUcG83ZXVwbU5BTzZkUWE2ZERKK3RzallDR0FMZ0dJQTd3b2grRk9wS0FNaTkrMjdHWTBhRGNTVzdkM3h5dXN0RUNwSncyYjIyVkJxVVNDek5aQjN5VDZNdUdrcm1tY3NSMlhsSXBHZVBrK0ZVa3FBeUc4Mi9CbW50N3dXejg2OEFDKzkybFNsNFlZNkFOSWJBYmZjc0F0M0RpdkJ0dS9uaTNadHBpV2lTMXhBNUE4L2RNZTg5d2FnN1ZsOThlRGo1MkxucmhNVE5kanczSUlDelU4cngvMzNyTVdHRFlzeHNPOWljZHBwbjl2UnlSWVF1WHYzSUtTa0RNQ2txVDJ4OElQVElaRGVRR3dQRkpDeUFnT3YvQTczNVMvRmZyRlFOUC9OQjFhdFdRSWlmOTQ3QlBzckJtUFVYN3VqOU91bUVFanhNSlNHVjAwS1NIa0FPZTEzNHNVblBrSnF5bHpSdVBIOFdPTFVBa1R1MjNjakRzb2hHSkdmaXpYaEpnM1U5SUVDSFR2c3hLeW5QMFJhV3BFUTR0M29IbW9BSXFXOERNQkk1RS9vaDJYTFQvVmhLQTFObWhTNHV2OTJGSTUvQzhBTUljUWhuVklUa004K2Z3anJOOTJFQng4L0MwSUVHcWpuSXdVb3ZpWVdoSEZXNjVuaXdvNVBtRDBkQWtUdStya3ZVZy9laFQ2REw4WC85aDN2NDFBYW1qWXBjTUx4NVhqL3pTVVE4a25SdEduRWVUd015TUwzLzRIUFZ3L0ZHMiszZ1JCSy9rbFNLZHY1QXVEMEZzRHBMUTJQbU1YOGQreEFHRFZnS1ZzUGJQc2VLUHNHS0ZtZDFPRXFkU2JsUWR3dzhDdGNkTkUwOGZ2ZlBYTUlFTGxqeDNrUXFlTnc1Zlg5VUhtZ2ZpanlWaTJBWGoyQWl6c0J2UzlWbWwvQ1NnVHFzMVhBc3FBQlVuMG9qZEsreC90dnpFTktZSkpvMW14YmhCTms0V09ESUZQR29taE9Wd2pScU03R2VmSkpCZ2pEL2dCa25lUHZNTWc1czk0RWxoVUQyM2Y0MjFlODFpVit3WWliUDRLUWo0aDdSaGNiZ0hUclB4cFZ1QjNsUDU5WEo4cWMzSEJOUCtDV3dVRGprNU5QbkxjV0E4L09xQnRnSkE2Z1Zjc1NwTWlueFFkelhqVUE2WkJYZ0txcVlSQTRGOGxVSCtTSVB3MDNPS0krbExvQVJsWlZBU2hGVldDNldGYzh4UUFrSi9lZk9JZ2hFS0xOWVRYdk00V3U3Z3VNRytPY0l5aGV0dTB3ZElGWktINElyc2xkNURncWZ5cDkvdDFKS2Q4RC9IdTJ3VEhKS0ZJQ0V1c1FDTXdTYTRPRjFTS3IzMVQ4dUdjUWhHemxPNGVRUUJNTERHV3RVcWg4U1h4VEllLzVSZVd0dzNVSUZLMHk5c2VmV2UzVTNxZUZOcUhRZitVdnlSRnlBMUx3cWlnTjNXOEEwdSttSW16YTNBOFEvb2JXZStVQkU4Y241Z29TZmY2N3dQekYrZ25DQlRGNkJOQTd6K0NxUk9XMk1UVzVNVkY5cDg4SmlNQlduSERjSEZHeTlHNERrTHdCNzJEM2p6MGhBaWM0YlUrNS9uMzVpWFVGeGRFekx4dGcrRjBJQmtFaE9QSEVHa1ZZdC83K2prWmlONW8yV1NSQ0M0Y2JnSFM4L0VOVVZ1WWlJUHdKc1Q4MEhyZzJ6cVRJRVFTQ3Nyc3VDcTA3QW1QSE1UbDUvbzVLeWoxSVRWa212bHgralFGSWR2ZmxrWDF5RWREcmczQ0NVd3JqNndzNmFRV0ZnRlBkb0p0RTVKTHhZd0NLMWVoQ3JyMWlzTzdlYXJZbjVWNUFCa1Y0eFpYVmdQVDRHRUJuQ0tScTdYbkdGSHN3Q01Ea0tja1JUMDRtUlVBSURBSDZiRFZRTU5GLy8wUmlINEJQUkxpNHB3RklWdmVWZ0xnUUFhRnZJeXFlbUtMbE5HR2lmb1h0aFBEMXFhNlUrd0h4cVFnWDU1a2k2M01nY0w2Mm5VSDZGNVRMVm9WZzNKWmY5eUxLRFNBMG1lOGJZM0Q5aDh1QkNaUDB6SVBlT2xBaXdzWGRURUJXUWFJakFnSHZleUJrK2FtRlJ4OFluTkVIYnhvT3Axbm9xMXczd2cyME5kK3BrZ2NCK1lVb1czRnhkZWdrZHpVa3ZNZXhLSGZudm16dFp4ekpuRUh5a1R2bVduanY5T2hwSVhvcEVnUmt0UWlIT3BzY3NnWkFEb1JIRHJGVDRrYzZHQ1EyRjlzU0c3UDh1dUhlOUNIM1JTRFhpUENLQzZzQnlmM1NBTVJEWkpFNmc3b2p0dENhb3M2b0wvc1BYbGF5blc1a1dHZTR4ZHhWKzZxU1ZaQllJOWFGT2xWYldibGZRYUNEYTBEb2IxQytXb1hPR1E5S2h1ZXRPbmt2OVRqUGVUT3NQWHN2SVJZcEdmSDlTb1JENXg4R0JPaUFnRXNPWWJDUSt4bXhoVTVmZm9FWEV0Uy9kKzJNRmk5Y1VoMkNGK0VWSFUybFhncUpiRmNjWWlkYkthcm80ZGExQis0SHBET25BbDB1cU4yeVd5NlJVa0ppclNnTC9iWWFrQjVyd2JNZWJuU0lIWGZRQzYrcjJKUWZJRVMzeVREK3pDbjZKRUlWTjBXaUFjbktEVmZ2RmpyTE5ySFRIVHJpUDJ5Ym9Yb21PSEFEaXFibGd2ZjhKclY2KzFaY3dsQUxEUmluaFJ3aUVCWnJRem1tRGlsenRYMXJaMW5wVU9SV0pqUWRzY2xUL2QyZlVDV21sVi9pMWllSkFDTEt4TnJpRHQ0QW9STVlteDJpZ3p0SWxOS2dQV2tZdGlBd2Raa3R3dEZSd1ROc3o2MWlXcElVMDI2S0ZrRHNsRG4xaHR1QlJVOG1IaUJtUFhNUDVVZzNIQXlsdms2VWhiTGRjd2hYQmpOR1lvdFhyOVZzVHdVUTF1V09IaGRBZmRJdlRybWtPdEZCbElXeXFnSHBzUTVDdG5lVTRHQ2wxT2lORXhBZFJSVVFzeThxZmtaZm83TlJkSXdqR1cxb0FjU0tZTHJFVlNJZEVvOUlkTkJvVkNSYnZ6Q3Q2WnIrd0o0OVJncVJrMUJSTFVDeWUzd05JYytKeXIyT3Z5N3M3SEI2NWZUT2RSUXJ3R2xXcXVaYU1VMlVoRW1HZm9tMU5pbEdHWlpYWFJRUlFNVFhvcXo0WEhNTDF4a2dkdWF1em1RQUswQk1zNUw2aTJOSWxNWkR3bER4RjgzUnNVVHMyN0FTMzQ1TTRBZ2c2MFc0dUwwWjdWMFBvSjJ5RHJGUzZMck0zWGhLUFhxU0JJUFJWNnNZV2l6cC9OWXZWb0RRREtib1ZDcGVBZEhwcGRvTk9CNkhSTDlEQjIzY1dPdllVbXpiMUM4UFQzRW0zMVVJeWgzUzJHd1ZKMTU3SkhLQ2IwUTRkSTY1UWZVTklOb3FjNGhuRmxXWXBTb2dabFBVYTRVRmFybThUS3ArZUtvKy9XSWxNY2lWZlJTVHlEMERFcnUzVEtJNGtwaytBR0kybVNqcHpheW5NNm5hemlkVDFha1JRT1MzSXJ5aW5Uc09jYnA2RmVoZnE0cVhQcWhmVE1XZnFHK3VaSVpodkZpSDFHT01lc2VXT2dWRWQ3amRDeUFtWVJqZUtaeWdybC9HRkxnVFkzWnVRQU1nTnV5Z3FsL2M3dnBwQnlRcjkxdEhoM1Ywck41RW9zU1BQdXo4cCtpeHFLN3E2SGU4K21YVlowUkVXYWl0R1Z3OCtnRmhhQ01TS285S2RJdGRGUFRxdTFya0JpUmFQSjZWdW5Gb3h6MGdWbWF2empnV0NhQ0xReWhPR0pWV09iSGxkbVBOQ2hBbmdWWUxEdGtBZ2JNOStTRk9IS0ZFSzQ3UG1TVVllL3pNU1JJQkZUcUJpSGN1eFJ3SHh6NzVLZmNPb3c3SFVHS2pLQXUxTVVXV00wQzhPa0lxZ01TbTI2aXVPSnE4bE9rcVI2d1o3cGsweFp2SkcxazhGanVuVGtJblJyVFhBeUIyU296eVYyZDBsYXVjSzV5K2drcXlIVUVjbHg5ZlQ1Q0FIQ05GTENQQ09zWnJKVjRkdVFIVmdJUk5Ec25PTlRoRTlVeTBYZUt4enZDN0NoZVpkYUtQQ1NSNmo4QXlBcXdhR2svVW5wM0o2MFM4d2lzZ2RrcFhwMktuNk9GQlVSN01qQndHblZGYnRKaDFWUFVFZ2RDOW8ralZ3aUl0amRESmR5Szg0bXd6ZExJUkVQeEdWcUwxY1BpNWxTSnpFbEJMMUpOVllqTXpJYzJWVFlXdG9pZjhQanBucFQ5VTlaMUpBeTJBMk9rUlhVa09WZ0ZNeW1WK3hVRkZUM0N5REhqcTBoTldDOGd1ODhhUi9pQnpSTmhra3dpSHpuTFBJWFdSQnNRSXJjckhhUmdvcFBXa1MwL1ljYlBkOFFTbmk3STJJTG5mQVNKVFZhY2ZHcCtWcjBDaWNSL0FxL1hpTk91RWc2S280T3JVclNmc0FMSGlZamM3cDhaK3lHWVJEbVdhVzdqdUFMRUxPenRsV2FzSk93SEViejFoTlQ2ZGM5Y0dDSzBjSHZPS1RUYlF3U1dxZ05DeW8vWGtsU01UR1JteHo2MjR3KzBSREF0QU5nRTQwNUdWWlE3UXp1enp1b09ZQ0pCa0hlcTNBc3B1ems2ODgraDJ0UUlTajB1YzVDYkZUdHp1VUF4bE5EL0ZrU3c5RVR1dWVDZU5vODF5Snh5bkZSQjJiTGRpM0c3NHNNM1lXRlpkZjZER0pQQ1VpZFlmNWZRaUVReEF0b2h3NkV4VHFic1hXV3pLamt2NFRJZUNkN0xhL0t3Yjc2U3hsK043QmlEYlJEaDBoaDVBckZaME5HR2MydVYrRXRWdDIzYnhPMjJMVHU1QWFmSGwrZ0Rod096a3ZnNnJ5eTBoZGJ4SENjQVFpZFZ1bzg1OW9OSmc5ZGVBc25NM0EyanR5c3FLbm5BODBlVkZuK2dncXRzMk9DY2U4TFQ2ampEMTJxRGgraUlDcGNIclRRN1JBd2duYlJlTzVqTzNWb2hiWW5wOUx4NFliRnYzZGtOcGNLUUp5RlorU2Qwemg1Z0VzSXZ4SEVtQUpBTERpMVZsdDFCS2czZUx5RjJFT1QwK0FvVEREOXpHV1g2NllqeGVWN2piOTZuQWVRcllMcERwMWdGTU5KN1M0TDBFcEM5eTh2UjlCdFRPR2psU3pOK2gxd1BqeDlxVHppOHcyR05wOE84RTVEcms1T2s3MFhLa2lpdVZEeno3Q1lZQnlHUUNjaXR5OG1ZbTRpYmw1MWJpeW1vSExYb2YzTXhFWjZBdzJVRkNNMHVGMFlaNHhXOHdERUNlSUNDamtKUDNuRExCNDFWVUVWZnhDR0FDdzhuN3ZibmtKRjBvV2VLMk5QZzBBZmtMY3ZJZTF3SklJbkdsbXFiRHdmQnJEUVNHOTN2b0xMeWZoT05RU1l3Z3Q5SzBUVllnc3pUNEFnRVpoNXk4U1ZybWJDZXU4c2NiKytCdWJzb2gxM3pJRzNIV3U3dTZpTHFCbjFLaWY4UU1GcFV0WUJLakxqN3dYQnFjUVVEdXh3VzlIc0QrL2Q0d3NSTlhKQ1NKb2tvSWxWR3d6ZkpmakRQaFZ1ZkJTZnpHSjdtN3BVZFhOcVBLUEtMcnBLVUJxNWNWRVpDSGNPbkFDZmpoUjZkTjFLeHY5OTJzUksyU0FKVG5pWTQ0SjJySDYzTXptOUhyRjBiZGp1UFVKc0R5dC85RFFCN0dvTnZ1eGJwdjNUWmx2UGZ4WXVkY1lLYnA4SDJWbXdxOGpkRDZiUzRJNmlvLzA0VlV4bjF1VzJEZXpEa0U1RW5rangvclNYbkcrM2l5MVdEaWJiOUdGRzQvUStiN3lUWFVFZFJOS2puREtnVDFXcWR2TCtEeEIrWVRrS2N4cldnMG5uekJmWk9xNHNwcGRnakJJZWZ3YklmVHE0dGlaME5PTUcvcElSREo5bmNTVWRlNFgyVVJBWGtlSzFmZDRlbTdzeXJpeXZ6QWwxdENrRnNZQXFmeHdIMko2SEM0eVVuUmJWUHg4OThFZ1NtdWZ2czFpUWllNlBtY2w3NUhkdnQ3ak9CaVplVWlYRFcwYldUZ1RrdThjRHZiU25ieW10UHgxNGY2elRNcXNPVE5sU0kxOVRJai9DN2xYRHcxclRkZW5IV0s0L0hGKzB5c21UUGx1TkZqNkFWK1RXN1VyWnR4OGZtdmkyNlhqRE1BMmJ2M2p5amZNeEpYM3RBSmxmdWRYM3NVcTBPU2xWdDdOT0RXS08wWExKbTlEQUpQaVdiTmxoMDZmeUFYTFoySUwxYmZoTmZleWtTZzRlcnVwR0ROSzd5SERpNURwL05lRWYxN1A4WStEd05TWHA2SEEzSlU1SUxpWC9mV2p3dUtrMEtWT3V6a2xNWTc4VTdSQWh3NDhMekl5SWpjbEZuamhJNzg0c3RiOE4yV2tTaVkyQVVCMFhDbnVwOVk4V2EyU1g5Ympzek02YUpUaC9sbVY3V09UTWxuWGhxSHJkdUhZc0Y3N1FHUjV1ZVlqdG0ycStSZURMcHFGVnEzbUNudUhENHRtZzYxQWZuMTEwNFFhYmRoeE9oQldCTSs0NWdsbWw4VGw3SUNIYlBYNHRRbVJlTFpSLzhWMjQzbG9VTDVVMFVmeU1xaHVQMnVQbGo3ZFhPL3huYk10VXN3Y3JMS0lNUnJZdmIwUjYzbWIzdktVNWFYWDRQVXRNRzRmM0pQTEZyYVhPdVZlc2NjRWhGbmJ5LzZYMUdHbjhyZkVDODk4YkFkQ2VJZXU1VVZGUU9RbnQ0Znl6L3VpWDg4Y2laMi9QZEVWMWRhSElzQVJNODVvOWtlUEhEdmwxaS9jWTRZT2FTV21JcXJRMkpwSjZYc2pBMGJlcU5seTF3OE56TWIwNHN5QUhHaWNlZWhnMlBVeHlJb3ZBNXYxTEFmY01ld0VtemJ0VUMweTN3eEVSbVVLU3IzNysrRkpjRWV5TW5xaUZtdloyTEZ5aWJZdU9Wa0NCd1BpVVlJSUFESjMxSlVaMEJHdDIzOG5YOUdNdStqamJ6cS96QnIxM3B1MXEzeElORzg2dlo1Wm1zZ3Qwc0ZicjF4TTFxM0NxS3ljckZJVDUrbk1paGxRQTZSWmV2V3JwZyt1d015bW1SaVVMK1dDSDZhZ2M5V05jYktMNDdEenQxcGdFd0ZCTUZKUVFBQ1ZlQmxsUUpFaWI4Z3EzOFRuTWlYQ2c2REZlbUV6dzhCVmh0VWxWazVyK09ZRGpXNmFORWM2Tm9KNkhJaDBQVWlvR1h6Q2dDYlVGNGVST1BHaTRVUUphcEQ4allRMVY0YTZpbFQ0UCtHQzVPbCt4SUtud0FBQUFCSlJVNUVya0pnZ2c9PQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlvdWt1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXFpeWkuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5pcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL3YucXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vbS52LnFxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoudHVkb3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5tZ3R2LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL3R2LnNvaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi4xOTA1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2ZpbG0uc29odS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmJpbGliaWxpLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoucHB0di5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9pdGVtLnRhb2Jhby5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9zLnRhb2Jhby5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9kZXRhaWwudG1hbGwuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vZGV0YWlsLnRtYWxsLmhrLyoKLy8gQG1hdGNoICAgICAgICAqOi8vaXRlbS5qZC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlpeWFvamQuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vbnBjaXRlbS5qZC5oay8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGlhbmd4aW55YW8uY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vbXVzaWMuMTYzLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL3kucXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5rdWdvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1d28uY24vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnhpbWFsYXlhLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouemhpaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5kb3V5aW4uY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5rdWFpc2hvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLml4aWd1YS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlvdXR1YmUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vNDcuOTkuMTU4LjExOC8qCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9sZjI2LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9jcnlwdG8tanMvNC4xLjEvY3J5cHRvLWpzLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vbGY5LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9xcmNvZGVqcy8xLjAuMC9xcmNvZGUuanMKLy8gQGFudGlmZWF0dXJlICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIIKLy8gQGdyYW50ICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZG93bmxvYWQKLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAY29ubmVjdCAgICAgIGllc2RvdXlpbi5jb20KLy8gQGNvbm5lY3QgICAgICA0Ny45OS4xNTguMTE4Ci8vIEBjb25uZWN0ICAgICAgYXBpLnR5cGVjaHJvbWUuY29tCi8vIEBjb25uZWN0ICAgICAgZ2l0bGFiLmNvbQovLyBAZG93bmxvYWRVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNzA2MzQvJUU2JTg3JTkyJUU0JUJBJUJBJUU0JUI4JTkzJUU3JTk0JUE4JUVGJUJDJThDJUU1JTg1JUE4JUU3JUJEJTkxVklQJUU4JUE3JTg2JUU5JUEyJTkxJUU1JTg1JThEJUU4JUI0JUI5JUU3JUEwJUI0JUU4JUE3JUEzJUU1JThFJUJCJUU1JUI5JUJGJUU1JTkxJThBJUUzJTgwJTgxJUU1JTg1JUE4JUU3JUJEJTkxJUU5JTlGJUIzJUU0JUI5JTkwJUU3JTlCJUI0JUU2JThFJUE1JUU0JUI4JThCJUU4JUJEJUJEJUUzJTgwJTgxJUU3JTlGJUE1JUU0JUI5JThFJUU1JUEyJTlFJUU1JUJDJUJBJUUzJTgwJTgxJUU3JTlGJUFEJUU4JUE3JTg2JUU5JUEyJTkxJUU2JTk3JUEwJUU2JUIwJUI0JUU1JThEJUIwJUU0JUI4JThCJUU4JUJEJUJEJUU3JUFEJTg5JUU1JUE0JTlBJUU1JThBJTlGJUU4JTgzJUJEJUU1JUI3JUE1JUU1JTg1JUI3JUU3JUFFJUIxJUVGJUJDJThDJUU1JThBJTlGJUU4JTgzJUJEJUU1JThGJUFGJUU3JThCJUFDJUU3JUFCJThCJUU1JUJDJTgwJUU1JTg1JUIzJUUzJTgwJTgyJUU5JTk1JUJGJUU2JTlDJTlGJUU2JTlCJUI0JUU2JTk2JUIwJUVGJUJDJThDJUU2JTk0JUJFJUU1JUJGJTgzJUU0JUJEJUJGJUU3JTk0JUE4JUUzJTgwJTgydjYudXNlci5qcwovLyBAdXBkYXRlVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzcwNjM0LyVFNiU4NyU5MiVFNCVCQSVCQSVFNCVCOCU5MyVFNyU5NCVBOCVFRiVCQyU4QyVFNSU4NSVBOCVFNyVCRCU5MVZJUCVFOCVBNyU4NiVFOSVBMiU5MSVFNSU4NSU4RCVFOCVCNCVCOSVFNyVBMCVCNCVFOCVBNyVBMyVFNSU4RSVCQiVFNSVCOSVCRiVFNSU5MSU4QSVFMyU4MCU4MSVFNSU4NSVBOCVFNyVCRCU5MSVFOSU5RiVCMyVFNCVCOSU5MCVFNyU5QiVCNCVFNiU4RSVBNSVFNCVCOCU4QiVFOCVCRCVCRCVFMyU4MCU4MSVFNyU5RiVBNSVFNCVCOSU4RSVFNSVBMiU5RSVFNSVCQyVCQSVFMyU4MCU4MSVFNyU5RiVBRCVFOCVBNyU4NiVFOSVBMiU5MSVFNiU5NyVBMCVFNiVCMCVCNCVFNSU4RCVCMCVFNCVCOCU4QiVFOCVCRCVCRCVFNyVBRCU4OSVFNSVBNCU5QSVFNSU4QSU5RiVFOCU4MyVCRCVFNSVCNyVBNSVFNSU4NSVCNyVFNyVBRSVCMSVFRiVCQyU4QyVFNSU4QSU5RiVFOCU4MyVCRCVFNSU4RiVBRiVFNyU4QiVBQyVFNyVBQiU4QiVFNSVCQyU4MCVFNSU4NSVCMyVFMyU4MCU4MiVFOSU5NSVCRiVFNiU5QyU5RiVFNiU5QiVCNCVFNiU5NiVCMCVFRiVCQyU4QyVFNiU5NCVCRSVFNSVCRiU4MyVFNCVCRCVCRiVFNyU5NCVBOCVFMyU4MCU4MnY2Lm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIGRvbUhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoKICAgIHZhciBkb21TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgogICAgZG9tU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CgogICAgZG9tU3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgLy/lubPlj7DliKTmlq0KICAgIHZhciBpc01vYmlsZSA9IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUG9kfEJsYWNrQmVycnkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwoKICAgIGlmKGlzTW9iaWxlKXsKCiAgICAgICAgbGV0IHBsYXlMaW5lID0gWwogICAgICAgICAgICB7Im5hbWUiOiLnuq/lh4AxIiwidXJsIjoiaHR0cHM6Ly9pbTE5MDcudG9wLz9qeD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiWVQiLCJ1cmwiOiJodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0ifQogICAgICAgIF07CgogICAgICAgIGxldCB1c2VXZWIgPSBbJ20uYmlsaWJpbGkuY29tJywneW91a3UuY29tJywnd3d3LnlvdWt1LmNvbScsJ20ueW91a3UuY29tJywnbS52LnFxLmNvbScsJ20uaXFpeWkuY29tJywnbS5tZ3R2LmNvbScsJ20udHYuc29odS5jb20nLCdtLjE5MDUuY29tJywnbS5wcHR2LmNvbScsJ20ubGUuY29tJ107CgogICAgICAgIGlmKHVzZVdlYi5pbmRleE9mKGxvY2F0aW9uLmhvc3QpID09IC0xKXsKICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4jeaYr+W6lOeUqOe9keermScpO3JldHVybjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsKCiAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKCiAgICAgICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKCiAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7CgogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSsiPSIrY3ZhbHVlKyI7ICIrZXhwaXJlczsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGdldENvb2tpZShjbmFtZSl7CiAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7CiAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IodmFyIGk9MDsgaTxjYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvbSxkb21JZCl7CgogICAgICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5OwoKICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRvbSk7CgogICAgICAgICAgICBuZXdFbGVtZW50LmlkID0gZG9tSWQ7CgogICAgICAgICAgICB2YXIgbmV3RWxlbWVudEh0bWxDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwoKICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7CgogICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnRIdG1sQ29udGVudCk7CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9hc3QobXNnLGR1cmF0aW9uKXsKCiAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOwoKICAgICAgICAgICAgbGV0IHRvYXN0RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICB0b2FzdERvbS5pbm5lckhUTUwgPSBtc2c7CgogICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycKCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOwoKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsKCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOwoKICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLm9wYWNpdHkgPSAnMCc7CgogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOwoKICAgICAgICAgICAgfSwgZHVyYXRpb24pOwoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBsYXlWaWRlb0Z1bmMoKXsKICAgICAgICAgICAgLy9jc3MKICAgICAgICAgICAgbGV0IHBsYXlWaWRlb1N0eWxlID0gYAogICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsKICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDtjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTsKICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtsZXQ6MHB4O3RvcDozNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlOwoKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fd3JhcHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkO2xlZnQ6NDBweDt0b3A6MzYwcHg7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmV7CiAgICAgICAgICAgICAgICB3aWR0aDozMjBweDsKICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsKICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6c2Nyb2xsOwogICAgICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVfbGluZV91bHsKICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAgICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CiAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgcGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwoKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsKICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsKICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICB3aWR0aDozMCU7CiAgICAgICAgICAgICAgICBjb2xvcjojRkZGOwogICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7CiAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOwogICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7CiAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkewogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICB9CgogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7CiAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGA7CgogICAgICAgICAgICBkb21TdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwbGF5VmlkZW9TdHlsZSkpOwoKICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7CiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIHRhcmdldD0nX2JsYW5rJyBzdHlsZT0nJyBjbGFzcz0ncGxheUJ1dHRvbiB6aG1fcGxheV92aWRvZV9pY29uJyBpZD0nemhtbG9nbyc+PGltZyBjbGFzcz0naWNvbkxvZ28nIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nIHRpdGxlPSfngrnlh7vlj7PkvqfliJfooajov5vooYzop6PmnpAnIHN0eWxlPSd3aWR0aDo0MHB4Jz4iOwoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJyBzdHlsZT0nZGlzcGxheTpub25lOyc+IgoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19saW5lJz4iOwoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjxkaXY+PHVsIGNsYXNzPSd6aG1fcGxheV92aWRlX2xpbmVfdWwnPiI7CgogICAgICAgICAgICBwbGF5TGluZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmKGdldENvb2tpZSgncGxheUxpbmVBY3Rpb24nKSA9PSBpdGVtLnVybCl7CgogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSd6aG1fbGluZV9zZWxlY3RlZCc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPWA8bGkgY2xhc3M9J3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSAke3NlbGVjdGVkfScgdXJsPScke2l0ZW0udXJsfScgPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6bm9kZTvmkq3mlL7ljLrln58KCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOwoKICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsKCiAgICAgICAgICAgIC8v5b6q546v5Yik5pat5piv5ZCm5Zyo5pKt5pS+6aG177yM5piv5YiZ5omn6KGM5LiL6Z2iCiAgICAgICAgICAgIGxldCBqeFZpZGVvRGF0YSA9IFsKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9wbGF5XC5odG1sXD9jaWQ9LyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC9wbGF5XC5odG1sXD9jaWRcPS8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvY292ZXJcLy4qaHRtbC8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovaHR0cHM/OlwvXC9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD8uKmNpZC4qLyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfLyxhcmVhQ2xhc3NOYW1lOicnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIudmlkZW8tYXJlYSIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwubWd0dlwuY29tXC9iLyxhcmVhQ2xhc3NOYW1lOidjbGVhcmZpeCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonc2lkZXNsaXBfc2xpZGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXkvLGFyZWFDbGFzc05hbWU6J2p1amknfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3BsYXlcLnR1ZG91XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnBwdHZcLmNvbVwvc2hvd1wvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiN2b2RQbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuMTkwNS5jb21cL3ZvZFwvcGxheVwvL30sCiAgICAgICAgICAgIF07CgogICAgICAgICAgICAvL+WIm+W7umxvZ29faWNvbgogICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CgogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7CgogICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGggPT0gMCl7CgogICAgICAgICAgICAgICAgICAgIHRvYXN0KCfor7flnKjop4bpopHmkq3mlL7pobXngrnlh7vlm77moIcnKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1fcGxheV92aWRlb193cmFwJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5U2hvdyA9IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXk7CgogICAgICAgICAgICAgICAgICAgIHBsYXlTaG93ID09ICdub25lJz8gcGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc6cGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZSgncGxheUxpbmVBY3Rpb24nLHRoaXMuZ2V0QXR0cmlidXRlKCd1cmwnKSwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vd1dlYk5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vd05vZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vd1dlYk5vZGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dXZWJOb2RlLmlubmVySFRNTCA9IHBsYXlKeEh0bWw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5SWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlJZnJhbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlmcmFtZS5zcmM9IGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR572R56uZ57uT54K55LiN5a2Y5ZyoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KQoKCiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2p4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZSk7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvU2VsZWN0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgfQoKICAgICAgICBwbGF5VmlkZW9GdW5jKCk7CgogICAgfWVsc2V7CiAgICAgICAgLyotLWNvbmZpZy0tKi8KICAgICAgICB2YXIgQ29uZmlnID17CgogICAgICAgIGNvdXBvblVybDp3aW5kb3cubG9jYXRpb24uaHJlZiwKCiAgICAgICAgY291cG9uSG9zdDp3aW5kb3cubG9jYXRpb24uaG9zdCwKCiAgICAgICAgd2ViVXJsOidodHRwOi8vbXVzaWMubGl1emhpamluLmNuLycsCgogICAgICAgIGljb25WaXBUb3A6MzYwLAoKICAgICAgICBpY29uVmlwUG9zaXRpb24gOiAnbGVmdCcsCgogICAgICAgIGljb25WaXBXaWR0aCA6IDQwLAoKICAgICAgICBjb3Vwb25UaW1lck51bSA6IDEwMCwvLzEwMOasoeetieS6jjEw56eSCgogICAgICAgIGNvdXBvbldhaXRUaW1lIDogMTAwLAoKICAgICAgICBpY29uV2FpdFRpbWUgOiAxMDAsCgogICAgICAgIGljb25WaXBPcGFjaXR5OjEwMCwKCiAgICAgICAgc2VsZWN0ZWRMZWZ0OidzZWxlY3RlZCcsCgogICAgICAgIHNlbGVjdGVkUmlnaHQ6JycsCgogICAgICAgIHZpZGVvUGxheUxpbmVBZGQ6R01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnLDApLAoKICAgICAgICBkeVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2R5VmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICBrc1ZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2tzVmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ3hpZ3VhVmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgnYmlsaVZpZGVvRG93bmxvYWQnLDIyKSwKCiAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ3lvdXR1YmVWaWRlb0Rvd25sb2FkJywyMiksCgogICAgICAgIH0KCiAgICAgICAgdmFyIHtjb3Vwb25VcmwsCiAgICAgICAgICAgIGNvdXBvbkhvc3QsCiAgICAgICAgICAgIHdlYlVybCwKICAgICAgICAgICAgaWNvblZpcFRvcCwKICAgICAgICAgICAgaWNvblZpcFBvc2l0aW9uLAogICAgICAgICAgICBpY29uVmlwV2lkdGgsCiAgICAgICAgICAgIGljb25WaXBPcGFjaXR5LAogICAgICAgICAgICBjb3Vwb25UaW1lck51bSwKICAgICAgICAgICAgY291cG9uV2FpdFRpbWUsCiAgICAgICAgICAgIGljb25XYWl0VGltZSwKICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0LAogICAgICAgICAgICBzZWxlY3RlZFJpZ2h0LAogICAgICAgICAgICB2aWRlb1BsYXlMaW5lQWRkLAogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQsCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZCwKICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkLAogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZCwKICAgICAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQKICAgICAgICB9ID0gQ29uZmlnOwogICAgICAgIC8qLS1sYW5nLS0qLwogICAgICAgIHZhciBsYW5nID0gewogICAgICAgICAgICBzZXQ6J+iuvue9ricsCiAgICAgICAgICAgIGljb25Qb3NpdGlvbjon5Zu+5qCH5L2N572uJywKICAgICAgICAgICAgcGxheVZpZGVvOifop4bpopHop6PmnpAnLAogICAgICAgICAgICBwbGF5TXVzaWM6J+mfs+S5kOS4i+i9vScsCiAgICAgICAgICAgIHpoTmljZTon55+l5LmO5aKe5by6JywKICAgICAgICAgICAgdmlkZW9Eb3dubG9hZDon6KeG6aKR5LiL6L29JywKICAgICAgICAgICAgaWNvbkhlaWdodDon5Zu+5qCH6auY5bqmJywKICAgICAgICAgICAgaWNvbldpZHRoOiflm77moIflpKflsI8nLAogICAgICAgICAgICBpY29uTGluZTon5rC05bmz5L2N572uJywKICAgICAgICAgICAgaWNvbldhaXRUaW1lOifnrYnlvoXml7bpl7QnLAogICAgICAgICAgICBpY29uTGVmdDon6Z2g5bemJywKICAgICAgICAgICAgaWNvblJpZ2h0OifpnaDlj7MnLAogICAgICAgICAgICB0aXBJY29uSGVpZ2h0Oifpu5jorqQzNjAs5bu66K6uMX41MDAnLAogICAgICAgICAgICB0aXBJY29uV2lkdGg6J+m7mOiupDQwLOW7uuiurjIwfjUwJywKICAgICAgICAgICAgdGlwSWNvbk9wYWNpdHk6J+ivt+Whq+WGmTAtMTAw55qE5pW05pWwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uSGVpZ2h0Oic85Zu+5qCH5L2N572uPuS4reeahDzlm77moIfpq5jluqY+5bqU5Li6MTAwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjF+NTAwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uV2lkdGg6Jzzlm77moIfkvY3nva4+5Lit55qEPOWbvuagh+Wkp+Wwjz7lupTkuLoxMDDku6XlhoXmraPmlbTmlbDvvIzlu7rorq4yMH41MCcsCiAgICAgICAgICAgIHRpcEVycm9ySWNvbk9wYWNpdHk6J+Whq+WGmeaVsOWtl+S4jeato+ehricsCiAgICAgICAgICAgIHNldFBsYXlWaWRlbzon6Kej5p6Q6K6+572uJywKICAgICAgICAgICAgcGxheVZpZGVvTGluZUFkZDon56uZ5aSW6Kej5p6QJywKICAgICAgICAgICAgdGlwUGxheVZpZGVvTGluZUFkZDon6K+35aGr5YWl57q/6Lev5ZCN56ew5ZKM5Zyw5Z2A77yM5Lit6Ze055So5Y2K6KeS6YCX5Y+36ZqU5byA77yM5q+P57q/6Lev5LiA6KGM44CCJywKICAgICAgICAgICAgemhTZXQ6J+efpeS5juiuvue9ricsCiAgICAgICAgICAgIHpoVmlkZW9DbG9zZTon5bGP6JS96KeG6aKRJywKICAgICAgICAgICAgemhWaWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLAogICAgICAgICAgICB6aEFEQ2xvc2U6J+Wxj+iUveW5v+WRiicsCiAgICAgICAgICAgIHpoQ2xvc2VMZWZ0OiflhbPpl63kvqfovrnmoI8nLAogICAgICAgICAgICB6aENoYW5nZUxpbms6J+mTvuaOpeebtOaOpei3s+i9rCcsCiAgICAgICAgICAgIHNwZWNpYWxDb2x1bW46J+agh+iusOaWh+eroCcsCiAgICAgICAgICAgIHZpZGVvVGl0bGU6J+agh+iusOinhumikScsCiAgICAgICAgICAgIHpoS2V5d29yZENsb3NlOiflsY/olL3lhbPplK7or40nLAogICAgICAgICAgICB0aXBLZXl3b3JkOifor7fovpPlhaXlhbPplK7or40s55SoIiwi5Y+36ZqU5byAJywKICAgICAgICAgICAgYXV0aG9yTmFtZUNsb3NlOiflsY/olL3nlKjmiLcnLAogICAgICAgICAgICB0aXBBdXRob3JOYW1lOifor7fovpPlhaXnlKjmiLflkI0s55SoIiwi5Y+36ZqU5byAJywKICAgICAgICAgICAgeWFueHVhbkNsb3NlOiflsY/olL3nm5DpgIknLAogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQ6J+aKlumfs+S4i+i9vScsCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZDon5b+r5omL5LiL6L29JywKICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkOifopb/nk5zkuIvovb0nLAogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZDonQuermSAoYmlsaWJpbGkpIOS4i+i9vScsCiAgICAgICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkOid5b3V0dWJl5LiL6L29JywKICAgICAgICAgICAgc2NyaXB0c2luc3RhbGw6J+iEmuacrOWuieijhScsCiAgICAgICAgICAgIHNjcmlwdHN1c2U6J+S9v+eUqOaWueazlScsCiAgICAgICAgICAgIHF1ZXN0aW9uOifluLjop4Hpl67popgnLAogICAgICAgICAgICB0Z2dyb3VwOidUZWxlZ3JhbScKICAgICAgICB9OwoKICAgICAgICAvKi0tZGF0YXMtLSovCiAgICAgICAgdmFyIGRhdGFzID0gewoKICAgICAgICAgICAgZ2V0Q291cG9uOlt7aXNPcGVuOjIyLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidGFvYmFvIixub2RlOiIuQWN0aW9ucy0tbGVmdEJ1dHRvbnMtLTFNM0trRjciLG1hdGNoOi9pdGVtXC50YW9iYW9cLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsQ2Fvc2hpIixub2RlOiIjSl9MaW5rQnV5IixtYXRjaDovXmh0dHBzPzpcL1wvY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tXC8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbENhb3NoaSIsbm9kZToiLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3IixtYXRjaDovXmh0dHBzPzpcL1wvY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tXC8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbCIsbm9kZToiLkJhc2ljQ29udGVudC0tYWN0aW9ucy0tMWNvOHN4OCIsbWF0Y2g6L15odHRwcz86XC9cL2RldGFpbFwudG1hbGxcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsIixub2RlOiIjSl9MaW5rQnV5IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGxPdGhlciIsbm9kZToiLnRtLW1zZy1ib3giLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbCIsbm9kZToiLkJhc2ljQ29udGVudC0tYWN0aW9ucy0tMWNvOHN4OCIsbWF0Y2g6L15odHRwcz86XC9cL2RldGFpbFwudG1hbGxcLmhrL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L2l0ZW1cLmpkXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJqZCIsbm9kZToiI2Nob29zZS1idG5zIixtYXRjaDovXC55aXlhb2pkXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJqZCIsbm9kZToiI2Nob29zZS1idG5zIixtYXRjaDovbnBjaXRlbVwuamRcLmhrL30sCiAgICAgICAgICAgIF19XSwKICAgICAgICAgICAganhWaWRlbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9odHRwcz86XC9cL3ZcLnFxXC5jb20vLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbS8sbmFtZToncXFNb2JpbGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmlxaXlpXC5jb20vLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXFcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwcz86XC9cL20uaXFpeWlcLmNvbS8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL2FsaXBheV92aWRlb1wvaWRfL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cLy4qeW91a3VcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuYmlsaWJpbGlcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvbVwuYmlsaWJpbGlcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovbWd0dlwuY29tLyxhcmVhQ2xhc3NOYW1lOidlcGlzb2RlLWl0ZW1zIGNsZWFyZml4J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovLnR2XC5zb2h1XC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi90dWRvdVwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9sZVwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9wcHR2XC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6LzE5MDVcLmNvbS99LAoKICAgICAgICAgICAgXX1dLAogICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgYmFranhWaWRlbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAgICAgIC8ve2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbW9kX3BsYXllciIgLG5vZGVUeXBlOidpZCcgLG1hdGNoOi92XC5xcVwuY29tXC94XC9jb3Zlci8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtb2RfcGxheWVyIiAsbm9kZVR5cGU6J2lkJyAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZScsbmFtZToncXFQQyd9LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21vZF9wbGF5ZXIiICxub2RlVHlwZTonaWQnICxtYXRjaDovaHR0cHM6XC9cL3YucXEuY29tXC94XC9jb3ZlclwvW2EtekEtWjAtOV0rXC9bYS16QS1aMC05XSsuaHRtbC8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5jb250YWluZXItcGxheWVyIiAsbm9kZVR5cGU6J2NsYXNzJywgbWF0Y2g6L3ZcLnFxXC5jb21cL3hcL3BhZ2UvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJ30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD9jaWQvfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3hcL3BsYXlcLmh0bWxcP2NpZD0vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3BsYXlcLmh0bWxcP2NpZFw9L30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC9jb3ZlclwvLipodG1sL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2ZsYXNoYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5pbnRsLXZpZGVvLXdyYXAiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2JpbGliaWxpUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyX21vZHVsZSIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXdyYXBwZXIgcmVwb3J0LXdyYXAtbW9kdWxlJ30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtY29udGFpbmVyIG5vLXdyYXAnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21ndHYtcGxheWVyLXdyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21ndHZcLmNvbVwvYi8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyBjbGVhcmZpeCd9LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LAogICAgICAgICAgICAgICAgICAgIC8v5peg5Y2V54us5pKt5pS+6aG1e2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiJqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXlfXC8vfSwKCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwcHR2X3BsYXlwYWdlX2JveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwucHB0dlwuY29tXC9zaG93XC8vfSwKICAgICAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToicHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwucHB0dlwuY29tXC9zaG93XC8vfSwKICAgICAgICAgICAgICAgICAgICAvL+Wbvuagh+acquaYvuekuntmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToicHBsaXZlLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwucHB0dlwuY29tXC9zaG93XC8vfSwKCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwKICAgICAgICAgICAgICAgIF19XSwKICAgICAgICAqLwogICAgICAgICAgICBqeE11c2ljOlt7aXNPcGVuOkdNX2dldFZhbHVlKCdtdXNpY0xpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZTonbmV0ZWFzZScsbWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbS8sdGlwOifor7flnKjpn7PkuZDljZXmm7LpobXngrnlh7vlm77moIfkuIvovb0nfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZToncXEnLG1hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOWcqOaSreaUvumhteeCueWHu+Wbvuagh+S4i+i9vSd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheU11c2ljIixuYW1lOidrdWdvdScsbWF0Y2g6L2t1Z291XC5jb20vLHRpcDon6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZTona3V3bycsbWF0Y2g6L2t1d29cLmNuLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J3hpbWFsYXlhJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30KICAgICAgICAgICAgXX1dLAoKICAgICAgICAgICAgcGxheUxpbmU6WwogICAgICAgICAgICAgICAgeyJuYW1lIjoi57qv5YeAMSIsInVybCI6Imh0dHBzOi8vaW0xOTA3LnRvcC8/ang9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkLnq5kxIiwidXJsIjoiaHR0cHM6Ly9qeC5qc29ucGxheWVyLmNvbS9wbGF5ZXIvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiWVQiLCJ1cmwiOiJodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiQkwiLCJ1cmwiOiJodHRwczovL3ZpcC5ibGppZXguY29tLz92PSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLlhrDosYYiLCJ1cmwiOiJodHRwczovL2JkLmp4LmNuLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkNLIiwidXJsIjoiaHR0cHM6Ly93d3cuY2twbGF5ZXIudmlwL2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkpZIiwidXJsIjoiaHR0cHM6Ly9qeC5wbGF5ZXJqeS5jb20vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QbGEiLCJ1cmwiOiJodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJNM1U4IiwidXJsIjoiaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IlBNIiwidXJsIjoiaHR0cHM6Ly93d3cucGxheW0zdTguY24vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi55uY5Y+kIiwidXJsIjoiaHR0cHM6Ly93d3cucGFuZ3VqaWV4aS5jYy9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLliZbkupEiLCJ1cmwiOiJodHRwczovL3d3dy5wb3V5dW4uY29tLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuS4g+WTpSIsInVybCI6Imh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLlkKzkuZAiLCJ1cmwiOiJodHRwczovL2p4LmRqNnUuY29tLz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6Iue7tOWkmiIsInVybCI6Imh0dHBzOi8vanguaXZpdG8uY24vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Jm+57GzIiwidXJsIjoiaHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5aSc5bmVIiwidXJsIjoiaHR0cHM6Ly93d3cueWVtdS54eXovP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5LqR5p6QIiwidXJsIjoiaHR0cHM6Ly9qeC55cGFyc2UuY29tL2luZGV4LnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjE35LqRIiwidXJsIjoiaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTgwIiwidXJsIjoiaHR0cHM6Ly9qeC4wMDAxODAudG9wL2p4Lz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjRLIiwidXJsIjoiaHR0cHM6Ly9qeC40a2R2LmNvbS8/dXJsPSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIyeXMiLCJ1cmwiOiJodHRwczovL2dqLmZlbnhpYW5nYi5jb20vcGxheWVyL2FuYWx5c2lzLnBocD92PSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI4MDkwIiwidXJsIjoiaHR0cHM6Ly93d3cuODA5MGcuY24vP3VybD0iLCJtb2JpbGUiOjB9CiAgICAgICAgICAgIF0sCgogICAgICAgICAgICB6aE5pY2U6W3tpc09wZW46R01fZ2V0VmFsdWUoJ3poaWh1TGlzdCcsJzIyJyksd2ViOlsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonemhOaWNlJyxtYXRjaDovXmh0dHBzPzpcL1wvW2Etel0rXC56aGlodVwuY29tL30KICAgICAgICAgICAgXX1dLAogICAgICAgICAgICB0YW9iYW86W3tpc09wZW46R01fZ2V0VmFsdWUoJ3Rhb2JhbycsJzIyJyksd2ViOlsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondGFvYmFvU2VhcmNoJyxtYXRjaDovXmh0dHBzPzpcL1wvc1wudGFvYmFvXC5jb21cL3NlYXJjaFw/LisvfQogICAgICAgICAgICBdfV0sCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBkb3VZaW46W3tpc09wZW46R01fZ2V0VmFsdWUoJ2RvdXlpbkxpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOidkb3V5aW5Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz9bXi4rXSQvfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J2RvdXlpbkRvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvXD9lbnRlclw9Z3VpZGUkL30sCiAgICAgICAgICAgICAgICBdfV0sCiAgICAgICAgKi8KICAgICAgICAgICAgdmlkZW9Eb3dubG9hZDpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgndmlkZW9Eb3dubG9hZExpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvP1teLitdJC99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvXD9lbnRlclw9Z3VpZGUkL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9mb2xsb3ckL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC92cyQvfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cL2Rpc2NvdmVyXD9tb2RhbF9pZD0uKyQvfQogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz8uKyQvLGlzV2ViT3BlbjpkeVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidrc1ZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmt1YWlzaG91XC5jb21cLz8uKyQvLGlzV2ViT3Blbjprc1ZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXhpZ3VhXC5jb21cL1swLTldK1w/LiskLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneGlndWFWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5peGlndWFcLmNvbVwvLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonYmlsaVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmJpbGliaWxpXC5jb21cLy8saXNXZWJPcGVuOmJpbGlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneW91dHViZVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnlvdXR1YmVcLmNvbS8saXNXZWJPcGVuOnlvdXR1YmVWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgXX1dLAoKICAgICAgICAgICAga2V5Q29kZTpbCiAgICAgICAgICAgICAgICB7Y29kZTo0OCxpc1NoaWZ0OmZhbHNlLHZhbHVlOicwJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo0OCxpc1NoaWZ0OnRydWUsdmFsdWU6JyknfSwKICAgICAgICAgICAgICAgIHtjb2RlOjQ5LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzEnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjQ5LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonISd9LAogICAgICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMid9LAogICAgICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDp0cnVlLHZhbHVlOidAJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1MSxpc1NoaWZ0OmZhbHNlLHZhbHVlOiczJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1MSxpc1NoaWZ0OnRydWUsdmFsdWU6JyMnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUyLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzQnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUyLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonJCd9LAogICAgICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNSd9LAogICAgICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDp0cnVlLHZhbHVlOiclJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NCxpc1NoaWZ0OmZhbHNlLHZhbHVlOic2J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NCxpc1NoaWZ0OnRydWUsdmFsdWU6J14nfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU1LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzcnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU1LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonJid9LAogICAgICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOCd9LAogICAgICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDp0cnVlLHZhbHVlOicqJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Nyxpc1NoaWZ0OmZhbHNlLHZhbHVlOic5J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Nyxpc1NoaWZ0OnRydWUsdmFsdWU6JygnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjcwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2YnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjcwLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonRid9LAogICAgICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonaid9LAogICAgICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDp0cnVlLHZhbHVlOidKJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3NSxpc1NoaWZ0OmZhbHNlLHZhbHVlOidrJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3NSxpc1NoaWZ0OnRydWUsdmFsdWU6J0snfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2wnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc2LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonTCd9LAogICAgICAgICAgICBdLAoKICAgICAgICAgICAgZG93bmxvYWRPcHRpb246W3tuYW1lOifnm7TmjqXkuIvovb0nLGlkOid0b0Rvd25sb2FkJ30se25hbWU6J+WkjeWItumTvuaOpScsaWQ6J3RvQ29weSd9LHtuYW1lOifmiZPlvIDmlofku7YnLGlkOid0b0xpbmsnfV0KCiAgICAgICAgfQoKICAgICAgICB2YXIge2dldENvdXBvbixqeFZpZGVvLGp4TXVzaWMscGxheUxpbmUsemhOaWNlLHRhb2Jhbyx2aWRlb0Rvd25sb2FkLGtleUNvZGUsZG93bmxvYWRPcHRpb259ID0gZGF0YXM7CgogICAgICAgIC8qLS1DbGFzcy0tKi8KICAgICAgICBjbGFzcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewoKICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb25TZXRQYWdlJykgIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgLypjb29raWXlrZjlgqgKICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gdGhpcy5nZXRDb29raWUoJ2ljb25Ub3AnKT90aGlzLmdldENvb2tpZSgnaWNvblRvcCcpOmljb25WaXBUb3A7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiA9IHRoaXMuZ2V0Q29va2llKCdpY29uUG9zaXRpb24nKT90aGlzLmdldENvb2tpZSgnaWNvblBvc2l0aW9uJyk6aWNvblZpcFBvc2l0aW9uOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExlZnQgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJpZ2h0ID0gaWNvblZpcFBvc2l0aW9uPT0ncmlnaHQnPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBXaWR0aCA9IHRoaXMuZ2V0Q29va2llKCdpY29uV2lkdGgnKT90aGlzLmdldENvb2tpZSgnaWNvbldpZHRoJyk6aWNvblZpcFdpZHRoOwogICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGljb25WaXBUb3AgPSBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpIHx8IEdNX2dldFZhbHVlKCdpY29uVG9wJykgPT0gMD9HTV9nZXRWYWx1ZSgnaWNvblRvcCcpOmljb25WaXBUb3A7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiA9IEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb24nKT9HTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk6aWNvblZpcFBvc2l0aW9uOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExlZnQgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJpZ2h0ID0gaWNvblZpcFBvc2l0aW9uPT0ncmlnaHQnPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIGljb25WaXBXaWR0aCA9IEdNX2dldFZhbHVlKCdpY29uV2lkdGgnKT9HTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk6aWNvblZpcFdpZHRoOwoKICAgICAgICAgICAgICAgICAgICBpY29uV2FpdFRpbWUgPSBHTV9nZXRWYWx1ZSgnaWNvbldhaXRUaW1lJyk/R01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpKjEwMDA6aWNvbldhaXRUaW1lOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwT3BhY2l0eSA9IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpIHx8IEdNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25PcGFjaXR5Jyk6aWNvblZpcE9wYWNpdHk7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIuiuvue9riIsICgpID0+IHRoaXMubWVudVNldCgpKTsKCiAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKCk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXRTdHlsZSgpewogICAgICAgICAgICAgICAgbGV0IG1lbnVTZXRTdHlsZSA9IGAKICAgICAgICAgICAgICAgICAgICAgICAgLnpobU1hc2t7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk5OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDt0b3A6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuODsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAud3JhcC1ib3h7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDs7dG9wOiA1MCU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0yMDBweCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OjE2cHggbnVtRm9udCxQaW5nRmFuZ1NDLVJlZ3VsYXIsVGFob21hLE1pY3Jvc29mdCBZYWhlaSxzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDo0MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7aGVpZ2h0OjQwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGkgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaUNvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwU2F2ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDotMnB4O3JpZ2h0OjEwcHg7Zm9udC1zaXplOjI0cHg7Y3Vyc29yOnBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3R7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O3BhZGRpbmc6MTBweCAyMHB4O3dpZHRoOjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwOTtiYWNrZ3JvdW5kOiNmZWY5ZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggMnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgbGkgYXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiM1NTU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgYTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRVbEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjhweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDtiYWNrZ3JvdW5kOiNmZmY7d2lkdGg6MzAwcHg7aGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlSW5wdXR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZUxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoyNThweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZUNvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fY2lyY3VsYXJ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogNDBweDtoZWlnaHQ6IDIwcHg7Ym9yZGVyLXJhZGl1czogMTZweDt0cmFuc2l0aW9uOiAuM3M7Y3Vyc29yOiBwb2ludGVyO2JveC1zaGFkb3c6IDAgMCAzcHggIzk5OSBpbnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAucm91bmQtYnV0dG9uewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwcHg7aGVpZ2h0OiAyMHB4Oztib3JkZXItcmFkaXVzOiA1MCU7Ym94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwwLDAsLjUpO3RyYW5zaXRpb246IC4zcztwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9iYWNrewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCAjRkZGOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOyAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO21hcmdpbi1sZWZ0OjEwcHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvLXJpZ2h0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MjBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAzcHg7dHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO2N1cnNvcjpwb2ludGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFNhdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2hlYWRlcnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9jb250ZW50ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDIyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzICAgOiAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHph4zpnaLovajpgZMqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAgIDogaW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3QgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206bm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbHsKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i5bCP5pa55Z2XKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXMgICA6IDJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i6L2o6YGTKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3cgICA6IGluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAgIDogI2VkZWRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyotZm9ybS0qLwogICAgICAgICAgICAgICAgICAgICAgICA6cm9vdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWJhc2UtY29sb3I6ICM0MzRhNTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXByaW1hcnk6ICNmN2Y4Zjg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXNlY29uZGFyeTogI2ZlZmVmZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci1wcmltYXJ5OiAjYzJjMmMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ncmF5LWNvbG9yLXNlY29uZGFyeTogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci10ZXJ0aWFyeTogIzY3NmY3OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYWN0aXZlLWNvbG9yOiAjMjI3YzlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12YWxpZC1jb2xvcjogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1jb2xvcjogI2Y3MmY0NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1pY29uOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJTNDc3ZnJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlMjB3aWR0aCUzRCUyMjI0JTIyJTIwaGVpZ2h0JTNEJTIyMjQlMjIlMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNCUyMDI0JTIyJTNFJTIwJTNDcGF0aCUyMGQlM0QlMjJNMTMuNDElMjAxMmw0LjMtNC4yOWExJTIwMSUyMDAlMjAxJTIwMC0xLjQyLTEuNDJMMTIlMjAxMC41OWwtNC4yOS00LjNhMSUyMDElMjAwJTIwMCUyMDAtMS40MiUyMDEuNDJsNC4zJTIwNC4yOS00LjMlMjA0LjI5YTElMjAxJTIwMCUyMDAlMjAwJTIwMCUyMDEuNDIlMjAxJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwbDQuMjktNC4zJTIwNC4yOSUyMDQuM2ExJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAwLTEuNDJ6JTIyJTIwZmlsbCUzRCUyMiUyM2Y3MmY0NyUyMiUyMCUyRiUzRSUzQyUyRnN2ZyUzRSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDJweCAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjU1JTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5pdGlhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjpwbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6LXdlYmtpdC1hdXRvZmlsbCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiA5OTk5czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAwLjVlbSBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxLjVlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdICsgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1pbnZhbGlkLWljb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZS1vdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo5MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94OjphZnRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItd2lkdGg6IDZweCA0cHggMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtNzJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbml0aWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiBjYWxjKDFlbSArIDE2cHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE0MCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5LmZvY3VzLXZpc2libGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogOTk5OXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaXRpYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6b25seS1jaGlsZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWEgLl9kdW1teS1ib3ggewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudG9MZWZ0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsgLypTYWZhcmkgYW5kIENocm9tZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9MZWZ0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbW92ZVRvTGVmdCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JpZ2h0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb1JpZ2h0IDJzIGluZmluaXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9SaWdodHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9SaWdodCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVudVNldFN0eWxlKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1lbnVTZXQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBzZXRMaXN0SnNvbj0gWwogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcuaWNvblBvc2l0aW9uLCdzZXRMaXN0SUQnOidpY29uUG9zaXRpb25TZXRQYWdlJywnc2V0UGFnZUlEJzonbW92aWVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcucGxheVZpZGVvLCdzZXRMaXN0SUQnOidtb3ZpZUxpc3QnLCdzZXRQYWdlSUQnOidtb3ZpZVZpZGVvU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcucGxheU11c2ljLCdzZXRMaXN0SUQnOidtdXNpY0xpc3QnLCdzZXRQYWdlSUQnOicnLCd0YWtlUGxhY2UnOicnfSwKICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnpoTmljZSwnc2V0TGlzdElEJzonemhpaHVMaXN0Jywnc2V0UGFnZUlEJzonemhpaHVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzIyMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy52aWRlb0Rvd25sb2FkLCdzZXRMaXN0SUQnOid2aWRlb0Rvd25sb2FkTGlzdCcsJ3NldFBhZ2VJRCc6J3ZpZGVvRG93bmxvYWRTZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHZhciB6aGlodU9wdGlvbkpzb24gPSBbCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9DbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVWaWRlbycsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidkb3dubG9hZFZpZGVvJywnZGVmYXVsdCc6JzIyJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQURDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVBRCcsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENsb3NlTGVmdCwnb3B0aW9uSUQnOidyZW1vdmVSaWdodCcsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQ2hhbmdlTGluaywnb3B0aW9uSUQnOidjaGFuZ2VMaW5rJywnZGVmYXVsdCc6JzIyJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnNwZWNpYWxDb2x1bW4sJ29wdGlvbklEJzonc3BlY2lhbENvbHVtbicsJ2RlZmF1bHQnOjIyfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcudmlkZW9UaXRsZSwnb3B0aW9uSUQnOid2aWRlb1RpdGxlJywnZGVmYXVsdCc6MjJ9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEtleXdvcmRDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVLZXl3b3JkJywnZGVmYXVsdCc6JzAnfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuYXV0aG9yTmFtZUNsb3NlLCdvcHRpb25JRCc6J3JlbW92ZUF1dGhvck5hbWUnLCdkZWZhdWx0JzoyMn0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnlhbnh1YW5DbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVZYW54dWFuJywnZGVmYXVsdCc6JzAnfQogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB2YXIgcGxheVZpZGVvT3B0aW9uSnNvbiA9ewogICAgICAgICAgICAgICAgICAgICdvcHRpb25OYW1lJzpsYW5nLnBsYXlWaWRlb0xpbmVBZGQsCiAgICAgICAgICAgICAgICAgICAgJ29wdGlvbklEJzondmlkZW9QbGF5TGluZUFkZCcsCiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnOnZpZGVvUGxheUxpbmVBZGQsCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhJzondmlkZW9QbGF5TGluZUFkZFRleHRhcmVhJywKICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWFJZCc6J3BsYXlWaWRlb0xpbmVUZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgJ3RpcCc6CmDnuq/lh4AxLGh0dHBzOi8vaW0xOTA3LnRvcC8/ang9CkLnq5kxLGh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9CllULGh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPQpCTCxodHRwczovL3ZpcC5ibGppZXguY29tLz92PQrlhrDosYYsaHR0cHM6Ly9iZC5qeC5jbi8/dXJsPQpDSyxodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0KSlksaHR0cHM6Ly9qeC5wbGF5ZXJqeS5jb20vP3VybD0K6Kej5p6QbGEsaHR0cHM6Ly9hcGkuamlleGkubGEvP3VybD0KTTNVOCxodHRwczovL2p4Lm0zdTgudHYvamlleGkvP3VybD0KUE0saHR0cHM6Ly93d3cucGxheW0zdTguY24vamlleGkucGhwP3VybD0K55uY5Y+kLGh0dHBzOi8vd3d3LnBhbmd1amlleGkuY2MvamlleGkucGhwP3VybD0K5YmW5LqRLGh0dHBzOi8vd3d3LnBvdXl1bi5jb20vP3VybD0K5LiD5ZOlLGh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPQrlkKzkuZAsaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPQrnu7TlpJosaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPQromb7nsbMsaHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0K5aSc5bmVLGh0dHBzOi8vd3d3LnllbXUueHl6Lz91cmw9CuS6keaekCxodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0KMTfkupEsaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0KMTgwLGh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPQo0SyxodHRwczovL2p4LjRrZHYuY29tLz91cmw9CjJ5cyxodHRwczovL2dqLmZlbnhpYW5nYi5jb20vcGxheWVyL2FuYWx5c2lzLnBocD92PQo4MDkwLGh0dHBzOi8vd3d3LjgwOTBnLmNuLz91cmw9YCwKCiAgICAgICAgICAgICAgICAgICAgICd2YWx1ZU5hbWUnOidwbGF5VmlkZW9MaW5lVGV4dCd9CgogICAgICAgICAgICAgICAgdmFyIHZpZGVvRG93bmxvYWRPcHRpb25Kc29uID0gWwogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5keVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonZHlWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6ZHlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcua3NWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2tzVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmtzVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnhpZ3VhVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOid4aWd1YVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp4aWd1YVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5iaWxpVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidiaWxpVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmJpbGlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueW91dHViZVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzoneW91dHViZVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp5b3V0dWJlVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHZhciBzZXRIdG1sID0gIjxkaXYgaWQ9J3NldE1hc2snIGNsYXNzPSd6aG1NYXNrJz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nd3JhcC1ib3gnIGlkPSdzZXRXcmFwJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0naWNvblNldFBhZ2UnIGlkPSdtb3ZpZUljb25TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4gY2xhc3M9J3pobV9iYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLmljb25Qb3NpdGlvbisiPC9zcGFuPjxzcGFuIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L3NwYW4+PC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRQYWdlTGknPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IitsYW5nLmljb25IZWlnaHQrIu+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uVG9wJyB2YWx1ZT0nIitpY29uVmlwVG9wKyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbkhlaWdodCsiJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dF9fdmFsaWRhdG9yJz48L3NwYW4+PC9zcGFuPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8bGkgIHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtZmxleDsnPjxzcGFuIHN0eWxlPSdwYWRkaW5nLXRvcDo0cHg7Jz4iK2xhbmcuaWNvbkxpbmUrIu+8mjwvc3Bhbj48ZGl2IGNsYXNzPSdzZWxlY3QtYm94Jz48c2VsZWN0IGNsYXNzPSdzZWxlY3QtYm94X19ib2R5JyBpZD0naWNvblBvc2l0aW9uJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPG9wdGlvbiB2YWx1ZT0nbGVmdCcgIitzZWxlY3RlZExlZnQrIj4iK2xhbmcuaWNvbkxlZnQrIjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3JpZ2h0JyAiK3NlbGVjdGVkUmlnaHQrIj4iK2xhbmcuaWNvblJpZ2h0KyI8L29wdGlvbj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IitsYW5nLmljb25XaWR0aCsi77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25XaWR0aCcgdmFsdWU9JyIraWNvblZpcFdpZHRoKyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbldpZHRoKyInPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0X192YWxpZGF0b3InPjwvc3Bhbj48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uV2FpdFRpbWUrIu+8mjwvc3Bhbj48ZGl2IGNsYXNzPSdzZWxlY3QtYm94Jz48c2VsZWN0IGNsYXNzPSdzZWxlY3QtYm94X19ib2R5JyBpZD0naWNvbldhaXRUaW1lJz4iOwoKICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9MTtpPD04O2krKyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBpY29uU2VsZWN0ZWQgPSBHTV9nZXRWYWx1ZSgnaWNvbldhaXRUaW1lJyk9PWkvMj8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxvcHRpb24gdmFsdWU9IitpLzIrIiAiK2ljb25TZWxlY3RlZCsiPiIraS8yKyLnp5I8L29wdGlvbj4iOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijwvc2VsZWN0PjwvZGl2PjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT7pgI8g5piOIOW6piDvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbk9wYWNpdHknIHZhbHVlPSciK2ljb25WaXBPcGFjaXR5KyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbk9wYWNpdHkrIic+PC9zcGFuPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZScgaWQ9J3ZpZGVvRG93bmxvYWRTZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSd6aG1fYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy52aWRlb0Rvd25sb2FkKyI8L3NwYW4+PHNwYW4gIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3NldF9wYWdlX2xpc3QnPiI7CgogICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTx2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbi5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixzd2l0Y2hCYWNrQ29ybG9yLGRpc3BsYXk7CgogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLm9wdGlvbklELHZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLmRlZmF1bHQpOwoKICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25WYWx1ZSAhPSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmZmJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7CgogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gJ25vbmUnOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CgogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gJ2Jsb2NrJzsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZV9jb250ZW50Jz4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8c3Bhbj4iK3ZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLm9wdGlvbk5hbWUrIjwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9jaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3ZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLm9wdGlvbklEKyInPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjsgbGVmdDogIitvcHRpb25WYWx1ZSsicHg7Jz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2xpPiI7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2UnIGlkPSdtb3ZpZVZpZGVvU2V0UGFnZSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSd6aG1fc2V0X3BhZ2VfaGVhZGVyJz48c3BhbiBjbGFzcz0nemhtX2JhY2snPjwvc3Bhbj48c3Bhbj4iK2xhbmcuc2V0UGxheVZpZGVvKyI8L3NwYW4+PHNwYW4gIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3NldF9wYWdlX2xpc3QnIHN0eWxlPSdvdmVyZmxvdy15OnVuc2V0Jz4iOwoKICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcixkaXNwbGF5OwoKICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHBsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uSUQscGxheVZpZGVvT3B0aW9uSnNvbi5kZWZhdWx0KTsKCiAgICAgICAgICAgICAgICBpZihvcHRpb25WYWx1ZSAhPSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOwoKICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CgogICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2VfY29udGVudCc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8c3BhbiBjbGFzcz0ncGxheVZpZGVvT3B0aW9uTmFtZSc+IitwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbk5hbWUrIjwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX2NpcmN1bGFyJyBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjoiK3N3aXRjaEJhY2tDb3Jsb3IrIicgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25JRCsiJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjsgbGVmdDogIitvcHRpb25WYWx1ZSsicHg7Jz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCs9IjwvbGk+PGxpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2Puino+aekOe6v+i3rzwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdmb3JtX190ZXh0YXJlYSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3RleHRhcmVhIGpzLWZsZXhpYmxlLXRleHRhcmVhJyBzdHlsZT0ncGFkZGluZzogNXB4IDBweDsnIGlkPSciK3BsYXlWaWRlb09wdGlvbkpzb24udGV4dGFyZWErIic+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx0ZXh0YXJlYSByb3dzPSc5JyBjbGFzcz0ndGV4dGFyZWFfX2JvZHkgemhtX3Njcm9sbCcgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBQbGF5VmlkZW9MaW5lQWRkKyInIHN0eWxlPSd3aWR0aDoyNTBweDtmb250LXNpemU6MTJweDtwYWRkaW5nOjRweDtyZXNpemU6bm9uZTsnIGlkPSciK3BsYXlWaWRlb09wdGlvbkpzb24udGV4dGFyZWFJZCsiJz4iK0dNX2dldFZhbHVlKHBsYXlWaWRlb09wdGlvbkpzb24udmFsdWVOYW1lLHBsYXlWaWRlb09wdGlvbkpzb24udGlwKSsiPC90ZXh0YXJlYT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2UnIGlkPSd6aGlodUljb25TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4gY2xhc3M9J3pobV9iYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnpoU2V0KyI8L3NwYW4+PHNwYW4gIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3NldF9wYWdlX2xpc3QnIHN0eWxlPSdoZWlnaHQ6MjU4cHgnPiI7CgogICAgICAgICAgICAgICAgZm9yKHZhciBvcHRpb25OPTA7b3B0aW9uTjx6aGlodU9wdGlvbkpzb24ubGVuZ3RoO29wdGlvbk4rKyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcjsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklELHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5kZWZhdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGkgPjxkaXYgY2xhc3M9J3poaWh1U2V0UGFnZUNvbnRlbnQnPjxzcGFuPiIremhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbk5hbWUrIjwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9jaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOycgaWQ9Iit6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQrIj48ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiO2xlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVLZXl3b3JkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5d29yZFNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlS2V5d29yZCcsJzAnKSA9PSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkU2hvdyA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRTaG93ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J21hcmdpbi10b3A6MTBweDtkaXNwbGF5OiIra2V5d29yZFNob3crIjtwYWRkaW5nOjVweCAwcHg7JyBpZD0nemhpaHVLZXl3b3JkJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IHZhbHVlPSciK0dNX2dldFZhbHVlKCdpbnB1dFpoS2V5d29yZCcsJycpKyInIGlkPSdpbnB1dFpoS2V5d29yZCcgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwS2V5d29yZCsiJyBzdHlsZT0nd2lkdGg6ODglJz48c3Bhbj48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVBdXRob3JOYW1lJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0aG9yTmFtZVNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzIyJykgPT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yTmFtZVNob3cgPSAnYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JOYW1lU2hvdyA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheToiK2F1dGhvck5hbWVTaG93KyI7cGFkZGluZzo1cHggMHB4OycgaWQ9J3poaWh1QXV0aG9yTmFtZSc+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCB2YWx1ZT0nIitHTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnLCcnKSsiJyBpZD0naW5wdXRaaEF1dGhvck5hbWUnIGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEF1dGhvck5hbWUrIicgc3R5bGU9J3dpZHRoOjg4JSc+PHNwYW4+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3Bhbj48L3NwYW4+PHNwYW4+IitsYW5nLnNldCsiPC9zcGFuPjxzcGFuIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L3NwYW4+PC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3NldFdyYXBMaSc+IjsKCiAgICAgICAgICAgICAgICBmb3IodmFyIHNldE49MDtzZXROPHNldExpc3RKc29uLmxlbmd0aDtzZXROKyspewoKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdFZhbHVlID0gR01fZ2V0VmFsdWUoc2V0TGlzdEpzb25bc2V0Tl0uc2V0TGlzdElELCcyMicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLGFycm93Q29sb3Isc3dpdGNoQmFja0NvcmxvcjsKCiAgICAgICAgICAgICAgICAgICAgaWYobGlzdFZhbHVlICE9IDIyKXsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yPSAnI0VFRSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0NDQyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SnNvbltzZXROXS5zZXRQYWdlSUQgPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yID0gJyNFRUUnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+PHNwYW4+IitzZXRMaXN0SnNvbltzZXROXS5saXN0TmFtZSsiPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nc2V0V3JhcExpQ29udGVudCc+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fY2lyY3VsYXInIGlkPSciK3NldExpc3RKc29uW3NldE5dLnNldExpc3RJRCsiJyBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogIitzd2l0Y2hCYWNrQ29ybG9yKyI7Jz48ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiO2xlZnQ6ICIrbGlzdFZhbHVlKyJweCc+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8c3BhbiBjbGFzcz0ndG8tcmlnaHQnIGRhdGE9JyIrc2V0TGlzdEpzb25bc2V0Tl0uc2V0UGFnZUlEKyInIHRha2VQbGFjZT0nIitzZXRMaXN0SnNvbltzZXROXS50YWtlUGxhY2UrIicgc3R5bGU9J2JvcmRlcjogc29saWQgIithcnJvd0NvbG9yKyI7IGJvcmRlci13aWR0aDogMCAzcHggM3B4IDA7Jz48L3NwYW4+PC9kaXY+PC9saT4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0naGVpZ2h0OjQwcHg7JyBpZD0nemhtVGFrZVBsYWNlJz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0naWNvblNldEZvb3QnIHN0eWxlPScnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRGb290TGknPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+PGEgaHJlZj0naHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2JlbiMlRTUlQUUlODklRTglQTMlODV0bScgdGFyZ2V0PSdfYmxhbmsnPiIrbGFuZy5zY3JpcHRzaW5zdGFsbCsiPC9hPjwvbGk+44O7PGxpPjxhIGhyZWY9J2h0dHBzOi8vZ2l0bGFiLmNvbS9sYW5oYWhhL2xhbnJlbmppYW9iZW4jJUU0JUJEJUJGJUU3JTk0JUE4JyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnNjcmlwdHN1c2UrIjwvYT48L2xpPuODuzxsaT48YSBocmVmPSdodHRwczovL2dpdGxhYi5jb20vbGFuaGFoYS9sYW5yZW5qaWFvYmVuIyVFNSVCOCVCOCVFOCVBNyU4MSVFOSU5NyVBRSVFOSVBMiU5OCcgdGFyZ2V0PSdfYmxhbmsnPiIrbGFuZy5xdWVzdGlvbisiPC9hPjwvbGk+44O7PGxpPjxhIGhyZWY9J2h0dHBzOi8vdC5tZS8rc0dvNlpadnk1NHd6WVRsbCcgdGFyZ2V0PSdfYmxhbmsnPiIrbGFuZy50Z2dyb3VwKyI8L2E+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC91bD4nOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXRNYXNrJykpIHJldHVybjsKCiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobU1lbnUnKTsKCiAgICAgICAgICAgICAgICBsZXQgemhtTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1NZW51Jyk7CgogICAgICAgICAgICAgICAgemhtTWVudS5pbm5lckhUTUwgPSBzZXRIdG1sOwoKICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobU1lbnUnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8vIOWPlua2iOWumuaXtuWZqAoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnpobV9jaXJjdWxhcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oX2UpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uU3R5bGUgPSBpdGVtLmNoaWxkcmVuWzBdLnN0eWxlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IGJ1dHRvblN0eWxlLmxlZnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwYXJzZUludChsZWZ0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RMZWZ0VmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlZnQ9PTApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUubGVmdCA9ICcyMnB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmJhY2tncm91bmQgPSAnI2ZlNmQ3Myc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQ9JyNmZkU1RTUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5uZXh0U2libGluZyAmJiBpdGVtLm5leHRTaWJsaW5nLmdldEF0dHJpYnV0ZSgnZGF0YScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm5leHRTaWJsaW5nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCdib3JkZXI6IHNvbGlkICNjY2M7Ym9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGVmdFZhbHVlID0gMjI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUubGVmdCA9ICcwcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZD0nI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLm5leHRTaWJsaW5nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm5leHRTaWJsaW5nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCdib3JkZXI6IHNvbGlkICNFRUU7Ym9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExlZnRWYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2V0TGlzdElEID0gaXRlbS5pZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVLZXl3b3JkJyAmJiBsaXN0TGVmdFZhbHVlPT0yMil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhpaHVLZXl3b3JkJykuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MjIwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVLZXl3b3JkJyAmJiBsaXN0TGVmdFZhbHVlPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUtleXdvcmQnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSAnaGVpZ2h0OjE4MHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlQXV0aG9yTmFtZScgJiYgbGlzdExlZnRWYWx1ZT09MjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1QXV0aG9yTmFtZScpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSAnaGVpZ2h0OjI2MHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlQXV0aG9yTmFtZScgJiYgbGlzdExlZnRWYWx1ZT09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhpaHVBdXRob3JOYW1lJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0gJ2hlaWdodDoxMjBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShzZXRMaXN0SUQsbGlzdExlZnRWYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvUmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG8tcmlnaHQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUmlnaHQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gaXRlbS5wcmV2aW91c1NpYmxpbmcuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGxlZnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0ICE9IDIyKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRQYWdlSUQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2V0UGFnZUlEKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUlkLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9MZWZ0TW92ZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v55+l5LmO6K6+572u5pqC5L2N6auY5bqmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEPT0nemhpaHVJY29uU2V0UGFnZScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSBgaGVpZ2h0OjY4cHhgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrp7ml7blm77moIfpq5jluqYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllSWNvblNldFBhZ2UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpY29uVG9wJykudmFsdWU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKS5vZmZzZXRUb3A7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9CYWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnpobV9iYWNrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICB0b0JhY2suZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnREb20gPSBpdGVtLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREb20uY2xhc3NOYW1lPSdpY29uU2V0UGFnZSB0b1JpZ2h0TW92ZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0naGVpZ2h0OjQwcHg7JwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFNhdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvblNldFNhdmUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNhdmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uT3BhY2l0eT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbk9wYWNpdHknKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Qb3NpdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uUG9zaXRpb24nKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XYWl0VGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2FpdFRpbWUnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlb0xpbmVUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlWaWRlb0xpbmVUZXh0YXJlYScpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvTGluZUxlZnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZCcpLmNoaWxkcmVuWzBdLnN0eWxlLmxlZnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFpoS2V5d29yZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dFpoS2V5d29yZCcpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRBdXRob3JOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0WmhBdXRob3JOYW1lJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Ub3AgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMC05XVswLTldezAsMn0kKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uSGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uVG9wJyxpY29uVG9wLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyxpY29uVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25PcGFjaXR5ICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoL14oPzowfFsxLTldWzAtOV0/fDEwMCkkLy50ZXN0KGljb25PcGFjaXR5KSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uT3BhY2l0eSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvblRvcCcsaWNvblRvcCwzMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoaWNvbk9wYWNpdHkpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25PcGFjaXR5JyxpY29uT3BhY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uUG9zaXRpb24gIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5zZXRDb29raWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uUG9zaXRpb24nLGljb25Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2FpdFRpbWUgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25XYWl0VGltZScsaWNvbldhaXRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25XaWR0aCAhPScnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheKFsxLTldWzAtOV0/KSQpLy50ZXN0KGljb25XaWR0aCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChsYW5nLnRpcEVycm9ySWNvbldpZHRoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uV2lkdGgnLGljb25XaWR0aCwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldpZHRoJyxpY29uV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSA9PSAyMil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9MaW5lVGV4dCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBfdGhpcy5nZXRMaW5lKHBsYXlWaWRlb0xpbmVUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lT2JqLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ+e6v+i3r+i+k+WFpeS4jeato+ehricpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcsJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbnB1dFpoS2V5d29yZCAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLGlucHV0WmhLZXl3b3JkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhLZXl3b3JkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbnB1dEF1dGhvck5hbWUgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyxpbnB1dEF1dGhvck5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25Ub3AnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheWzEtOV1cZCokKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ2ZhbHNlJykKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25XaWR0aCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCdmYWxzZScpCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ3RydWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6IW+6K6v6KeG6aKR5b+r5o236ZSu5Yay56qBCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdXBvblVybC5tYXRjaCgvdlwucXFcLmNvbVwveFwvY292ZXIvKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZExpbmVUZXh0ID1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheVZpZGVvTGluZVRleHRhcmVhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydFBvcyA9IGFkZExpbmVUZXh0LnNlbGVjdGlvblN0YXJ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3MgPT09IHVuZGVmaW5lZCB8fCBlbmRQb3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlDb2RlLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmtleUNvZGUgPT0gaXRlbS5jb2RlICYmIGUuc2hpZnRLZXk9PWl0ZW0uaXNTaGlmdCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRWYWx1ZSA9IGFkZExpbmVUZXh0LnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydFZhbHVlID0gdGV4dFZhbHVlLnN1YnN0cmluZygwLHN0YXJ0UG9zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kVmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKHN0YXJ0UG9zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsVmFsdWUgPSBzdGFydFZhbHVlK2l0ZW0udmFsdWUrZW5kVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQudmFsdWU9YWxsVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcysxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnNlbGVjdGlvbkVuZCA9IGVuZFBvcysxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoZG9tLGRvbUlkKXsKCiAgICAgICAgICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5OwoKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOwoKICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQgPSBkb21JZDsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudEh0bWxDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwoKICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudEh0bWxDb250ZW50KTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlcXVlc3QobWV0aG9kLHVybCxkYXRhLGlzQ29va2llPScnKXsKCiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57CgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnJlYWR5U3RhdGU9PTQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3Quc3RhdHVzPT0yMDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcXVlc3Quc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsdXJsKTsKICAgICAgICAgICAgICAgICAgICAvL3JlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZihpc0Nvb2tpZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZW5kKGRhdGEpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXRDb29raWUoY25hbWUsY3ZhbHVlLGV4ZGF5cyl7CgogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwoKICAgICAgICAgICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKCiAgICAgICAgICAgICAgICB2YXIgZXhwaXJlcyA9ICJleHBpcmVzPSIrZC50b0dNVFN0cmluZygpOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRDb29raWUoY25hbWUpewogICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBjbmFtZSArICI9IjsKICAgICAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8Y2EubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0UXVlcnlTdHJpbmcoZSkgewogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyBlICsgIj0oW14mXSopKCZ8JCkiKTsKICAgICAgICAgICAgICAgIHZhciBhID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkubWF0Y2godCk7CiAgICAgICAgICAgICAgICBpZiAoYSAhPSBudWxsKSByZXR1cm4gYVsyXTsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0VXJsUGFyYW1zKHVybCl7CiAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbXj8mKyNdKyk9KFtePyYrI10rKS9nOwogICAgICAgICAgICAgICAgbGV0IG9iaj17fTsKICAgICAgICAgICAgICAgIHVybC5yZXBsYWNlKHJlZywocmVzLCQxLCQyKT0+e29ialskMV09JDJ9KTsKICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldExpbmUodGV4dCl7CgogICAgICAgICAgICAgICAgbGV0IHRleHRBcnIgPSB0ZXh0LnNwbGl0KCdcbicpOwoKICAgICAgICAgICAgICAgIGlmKHRleHRBcnIubGVuZ3RoID4gMCl7CgogICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gW107CgogICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eKC4rKShodHRwcz86XC9cLy4rKSQvOwoKICAgICAgICAgICAgICAgICAgICB0ZXh0QXJyLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9ccyosKi9nLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTWF0Y2ggPSBpdGVtLm1hdGNoKG1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmVNYXRjaCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iai5wdXNoKHsnbmFtZSc6bGluZU1hdGNoWzFdLnN1YnN0cmluZygwLDQpLCd1cmwnOmxpbmVNYXRjaFsyXX0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iaj1bXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZU9iajsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9hbGzlj4LmlbDpu5jorqTnqbrvvIzmmK/nnJ/ml7bov5Tlm57kuLrmlbDnu4QKICAgICAgICAgICAgc3RhdGljIGdldEVsZW1lbnQoY3NzLGFsbD0nJyl7CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7CgogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBudW0rKwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFsbCA9PSBmYWxzZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjc3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjc3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbS5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihudW09PTIwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDApCgogICAgICAgICAgICAgICAgICAgIH0pCgoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdGljIHRvYXN0KG1zZyxkdXJhdGlvbil7CgogICAgICAgICAgICAgICAgZHVyYXRpb249aXNOYU4oZHVyYXRpb24pPzMwMDA6ZHVyYXRpb247CgogICAgICAgICAgICAgICAgbGV0IHRvYXN0RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOwoKICAgICAgICAgICAgICAgIC8vdG9hc3REb20uc3R5bGUuY3NzVGV4dD0id2lkdGg6IDYwJTttaW4td2lkdGg6IDE1MHB4O29wYWNpdHk6IDAuNztoZWlnaHQ6IDMwcHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtsaW5lLWhlaWdodDogMzBweDt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogNXB4O3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDQwJTtsZWZ0OiAyMCU7ei1pbmRleDogOTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDEycHg7IjsKICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLmNzc1RleHQ9J3BhZGRpbmc6MnB4IDE1cHg7bWluLWhlaWdodDogMzZweDtsaW5lLWhlaWdodDogMzZweDt0ZXh0LWFsaWduOiBjZW50ZXI7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSk7Ym9yZGVyLXJhZGl1czogNHB4O2NvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7cG9zaXRpb246IGZpeGVkO3RvcDogNTAlO2xlZnQ6IDUwJTt6LWluZGV4OiA5OTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDE2cHg7JwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBkID0gMC41OwoKICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOwoKICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOwoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRvYXN0RG9tKSB9LCBkICogMTAwMCk7CgogICAgICAgICAgICAgICAgfSwgZHVyYXRpb24pOwoKICAgICAgICAgICAgfQogICAgICAgICAgICAvL2NyZWF0ZSB6aG1Mb2dvSWNvbgogICAgICAgICAgICB6aG1Mb2dvKCl7CgogICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgbGV0IHNvcnREaXYgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8ncm93Jzoncm93LXJldmVyc2UnOwoKICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlb1N0eWxlID0gYAogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsKICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4OwogICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7CiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOyR7aWNvblZpcFBvc2l0aW9ufTo1cHg7dG9wOiR7aWNvblZpcFRvcH1weDsKICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgIG92ZXJmbG93OnZpc2libGU7CiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ZmxleDsKICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246JHtzb3J0RGl2fTsKICAgICAgICAgICAgICAgICAgd2lkdGg6YXV0bzsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fd3JhcHsKICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OwogICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuaWNvbkxvZ297CiAgICAgICAgICAgICAgIG9wYWNpdHk6JHtpY29uVmlwT3BhY2l0eS8xMDB9OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lewogICAgICAgICAgICAgICAgICB3aWR0aDozMjBweDsKICAgICAgICAgICAgICAgICAgaGVpZ2h0OjMxNnB4OwogICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsKICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteDpoaWRkZW47CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVfbGluZV91bHsKICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAgICAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDsKICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7CgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpewogICAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7CiAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICAgIHdpZHRoOjMwJTsKICAgICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsKICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MzsKICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsKICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7CiAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsKICAgICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19qeHsKICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OwogICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBgOwoKICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwbGF5VmlkZW9TdHlsZSkpOwoKICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIHRhcmdldD0nX2JsYW5rJyBzdHlsZT0nJyBjbGFzcz0ncGxheUJ1dHRvbiB6aG1fcGxheV92aWRvZV9pY29uJyBpZD0nemhtbG9nbyc+IjsKCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxpbWcgY2xhc3M9J2ljb25Mb2dvJyBzdHlsZT0nd2lkdGg6IitpY29uVmlwV2lkdGgrInB4O2hlaWdodDoiK2ljb25WaXBXaWR0aCoxLjUrInB4JyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09Jz4iCgogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2PiI7CgogICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOwoKICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobUljb24nKTsKCiAgICAgICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/lt6bplK7mjInkuIvmi5bliqgKICAgICAgICAgICAgLy90eXBlOuagueaNruS4jeWQjOexu+Wei++8jOWkhOeQhuWbvuagh+WNleWHu+S6i+WKoQogICAgICAgICAgICB6aG1Mb2dvRHJhZyh0eXBlLHdlYil7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXLCoHpobUxvZ29EcmFnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6aG1sb2dvIik7CgogICAgICAgICAgICAgICAgdmFyIHpobUxvZ29JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmljb25Mb2dvIik7CgogICAgICAgICAgICAgICAgaWYoIXpobUxvZ29EcmFnIHx8ICF6aG1Mb2dvSWNvbilyZXR1cm47CgogICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZWRvd24gPSBmdW5jdGlvbihldmVudCl7CgogICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LndoaWNoPT0zKXJldHVybiBmYWxzZTsvL+Wxj+iUveWPs+mUrgoKICAgICAgICAgICAgICAgICAgICBsZXQgc2Vkb3duVG9wID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgemhtTG9nb0ljb25IZWlnaHQgPSB6aG1Mb2dvSWNvbi5vZmZzZXRIZWlnaHQ7CgogICAgICAgICAgICAgICAgICAgIGxldCBib3R0b21TcGFjZSA9IDEwOwoKICAgICAgICAgICAgICAgICAgICBpZihldmVudC50YXJnZXQuY2xhc3NOYW1lICE9ICdpY29uTG9nbycpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAvL2xldMKgc2hpZnRYwqA9wqBldmVudC5jbGllbnRYwqAtwqB6aG1Mb2dvRHJhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgIGxldCBzaGlmdHggPSA1OwoKICAgICAgICAgICAgICAgICAgICBsZXTCoHNoaWZ0WSA9IGV2ZW50LmNsaWVudFktemhtTG9nb0RyYWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwoKICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS5wb3NpdGlvbsKgPcKgJ2ZpeGVkJzsKCiAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUuekluZGV4wqA9wqA5OTk5OTk5OwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh6aG1Mb2dvRHJhZyk7CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uwqBvbk1vdXNlTW92ZShldmVudCl7CgogICAgICAgICAgICAgICAgICAgICAgICAvL3pobUxvZ29EcmFnLnN0eWxlLmxlZnTCoD3CoHBhZ2VYwqAtwqBzaGlmdFjCoCvCoCdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLmxlZnTCoD3CoCc1cHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWS1zaGlmdFk7CgogICAgICAgICAgICAgICAgICAgICAgICB5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIGhlaWdodCk7CgogICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPSB5KydweCc7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL+WcqG1vdXNlbW92ZeS6i+S7tuS4iuenu+WKqOWbvuaghwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsb25Nb3VzZU1vdmUpOwogICAgICAgICAgICAgICAgICAgIC8v5p2+5byA5LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsemhtTG9nb0RyYWcub2Zmc2V0VG9wKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wK3pobUxvZ29JY29uSGVpZ2h0K2JvdHRvbVNwYWNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0nMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmlubmVySGVpZ2h0IDwgaGVpZ2h0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPXdpbmRvdy5pbm5lckhlaWdodC16aG1Mb2dvSWNvbkhlaWdodC1ib3R0b21TcGFjZSsncHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL2NsaWNr5LqL5Lu25aSE55CGCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2aWRlbyc6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIHdlYi5sZW5ndGggPT0gMCAmJiB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A+MCAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPiBoZWlnaHQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7flnKjop4bpopHmkq3mlL7pobXngrnlh7vlm77moIcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXVzaWMnOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1Mb2dvRHJhZy5vZmZzZXRUb3A9PXNlZG93blRvcCAmJiBlLnRhcmdldC5jbGFzc05hbWUgPT0gJ2ljb25Mb2dvJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3pobUxvZ29EcmFnLm9ubW91c2V1cMKgPcKgbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbVwvI1wvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLm11c2ljXC4xNjNcLmNvbVwvbVwvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbVwvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLnFxXC5jb21cL25cL3J5cXFcL3BsYXllci99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdWdvdVwuY29tL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L2t1d29cLmNuL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3d3d1wueGltYWxheWFcLmNvbS99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmwgPSBtdXNpY1VybERhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG11c2ljVXJsLmxlbmd0aD09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KHdlYlswXS50aXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHdlYlswXS5uYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ldGVhc2UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGVhc2VGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3FxJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3Vnb3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1Z291RnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrdXdvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdXdvRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4aW1hbGF5YSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGltYWxheWFGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV0ZWFzZUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBfdGhpcy5nZXRVcmxQYXJhbXMobG9jYXRpb24uaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsUGFyYW1zLmlkID09IHVuZGVmaW5lZCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXRlYXNlVXJsRW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50KCdodHRwczovL211c2ljLjE2My5jb20vc29uZz9pZD0nK3VybFBhcmFtcy5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgb3BlblVybCA9IHdlYlVybCsnP3VybD0nK25ldGVhc2VVcmxFbmNvZGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrIj9pZD0iK3VybFBhcmFtcy5pZCsiJnR5cGU9bmV0ZWFzZSIKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHFxRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHFxU29uZ01hdGNoOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5ZXJfbXVzaWNfX2luZm8iKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpLmNoaWxkTm9kZXNbMF0uaHJlZi5tYXRjaCgvc29uZ0RldGFpbFwvKFxTKilcPy8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nXC8oXFMqKS5odG1sLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXFxU29uZ01hdGNoWzFdKXtjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+W5Yiw5q2M5puySUQnKTsgcmV0dXJufTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9MaW5rID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrcXFTb25nTWF0Y2hbMV0rJyZ0eXBlPXFxJnBsYXlVcmw9JythdWRpb0xpbms7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdWdvdUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb01vZHVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1ZGlvTW9kdWxlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJykuc3R5bGU9J2JvdHRvbTowcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Nob3dIaWRlX3BsYXliYXInKS5jbGFzc05hbWUgPSAnaWNvbiBzaG93LXBsYXliYXItYnRuJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0i44CCJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ0t1Z291TWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvU3JjID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrc29uZ0t1Z291TWF0Y2hbMV0rJyZ0eXBlPWt1Z291JnBsYXlVcmw9JythdWRpb1NyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1d29GdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2wnKS5zdHlsZT0nYm90dG9tOjBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IuOAgicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ0t1d29NYXRjaCA9IG5ld1VybC5tYXRjaChqeE11c2ljV2ViWzBdLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9Jytzb25nS3V3b01hdGNoWzFdKycmdHlwZT1rdXdvJnBsYXlVcmw9JythdWRpb1NyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhpbWFsYXlhRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhtLXBsYXllcicpLnN0eWxlPSdib3R0b206MHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0i44CCJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxJbmZvID0gbmV3VXJsLm1hdGNoKGp4TXVzaWNXZWJbMF0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHdlYlVybCsnP2lkPScrdXJsSW5mb1sxXSsnJnR5cGU9eGltYWxheWEmcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChuZXdVcmwpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxJbmZvWzFdKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4od2ViVXJsKyc/aWQ9Jyt1cmxJbmZvWzFdKycmdHlwZT14aW1hbGF5YSZwbGF5VXJsPScrZW5jb2RlVVJJQ29tcG9uZW50KG5ld1VybCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+WdXJs5Y+C5pWwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneW91dHViZSc6CgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9uZHJhZ3N0YXJ0wqA9wqBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHJldHVybsKgZmFsc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5LiL6L29CiAgICAgICAgICAgIHN0YXRpYyBMUl9kb3dubG9hZCh1cmwsZmlsZW5hbWUpewoKICAgICAgICAgICAgICAgIGxldCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh1YS5tYXRjaCgvdmVyc2lvblwvKFtcZC5dKykuKnNhZmFyaS8pKTsKCiAgICAgICAgICAgICAgICBpZih1YS5tYXRjaCgvdmVyc2lvblwvKFtcZC5dKykuKnNhZmFyaS8pKXsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQodXJsLGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgQ291cG9uQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewoKICAgICAgICAgICAgICAgIHN1cGVyKCk7CgogICAgICAgICAgICAgICAgdGhpcy5kaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgogICAgICAgICAgICAgICAgdGhpcy5kaXZFbGVtZW50LmlkPSd6aG1fZGl2X3MnOwoKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFvYmFvKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpOwoKICAgICAgICAgICAgICAgIG5vZGUuc3R5bGU9J292ZXJmbG93OmluaGVyaXQ7JwoKICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90YW9iYW8nOwoKICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZUNzcyA9IFsnLnRiLXNob3AtbmFtZSA+IGRsID4gZGQgPiBzdHJvbmcgPiBhJywnLnNob3AtbmFtZS1saW5rJ107CgogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcuSXRlbUhlYWRlci0tbWFpblRpdGxlLS0zQ0lqcVc1JyxzaG9wTmFtZUNzcykudGhlbihmdW5jdGlvbihyZXNwKXsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtYWxsKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX0xpbmtCdXknKS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90bWFsbCc7CgogICAgICAgICAgICAgICAgbGV0IHNob3BOYW1lQ3NzID0gWycuU2hvcEhlYWRlci0tdGl0bGUtLTJxc0JFMUEnXTsKCiAgICAgICAgICAgICAgICBfdGhpcy5nZXRUaXRsZVNob3AoJy5JdGVtSGVhZGVyLS1tYWluVGl0bGUtLTNDSWpxVzUnLHNob3BOYW1lQ3NzKS50aGVuKGZ1bmN0aW9uKHJlc3ApewoKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLHJlc3AuZ29vZHNUaXRsZSxyZXNwLnNob3BOYW1lKTsKCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRtYWxsQ2Fvc2hpKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICAvL2xldCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0pfTGlua0J1eScpLnBhcmVudE5vZGU7CgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQWN0aW9ucy0tbGVmdEJ1dHRvbnMtLTFNM0trRjcnKT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQWN0aW9ucy0tbGVmdEJ1dHRvbnMtLTFNM0trRjcnKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9MaW5rQnV5JykucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOwoKICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZUNzcyA9IFsnLlNob3BIZWFkZXItLXRpdGxlLS0ycXNCRTFBJ107CgogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcuSXRlbUhlYWRlci0tbWFpblRpdGxlLS0zQ0lqcVc1JyxzaG9wTmFtZUNzcykudGhlbihmdW5jdGlvbihyZXNwKXsKCiAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLHJlc3AuZ29vZHNUaXRsZSxyZXNwLnNob3BOYW1lKTsKCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1hbGxPdGhlcigpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG0tbXNnLWJveCcpOwoKICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90bWFsbCc7CgogICAgICAgICAgICAgICAgbGV0IHNob3BOYW1lQ3NzID0gWycuU2hvcEhlYWRlci0tdGl0bGUtLTJxc0JFMUEnXTsKCiAgICAgICAgICAgICAgICBfdGhpcy5nZXRUaXRsZVNob3AoJy5JdGVtSGVhZGVyLS1tYWluVGl0bGUtLTNDSWpxVzUnLHNob3BOYW1lQ3NzKS50aGVuKGZ1bmN0aW9uKHJlc3ApewoKICAgICAgICAgICAgICAgICAgIF90aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUscmVzcC5nb29kc1RpdGxlLHJlc3Auc2hvcE5hbWUpOwoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBqZCgpewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+ewoKICAgICAgICAgICAgICAgICAgICAvL2xldCBqZEdvb2RzSWQgPSBjb3Vwb25VcmwubWF0Y2goL2pkXC5jb21cLyhcUyopLmh0bWwvKTsKICAgICAgICAgICAgICAgICAgICBsZXQgamRHb29kc0lkID0gY291cG9uVXJsLm1hdGNoKC9qZFwuKGhrfGNvbSlcLyhcUyopLmh0bWwvKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGU9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjaG9vc2UtYnRucycpOwoKICAgICAgICAgICAgICAgICAgICBub2RlLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QoJ2dldCcsYGh0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL2luZGV4X2pkX25ldy5waHA/Z29vZHNfaWQ9JHtqZEdvb2RzSWRbMl19YCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3A9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sPScnOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0saWtleSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA8YSBpZD0namRDb3Vwb25MaW5rJHtpa2V5fScgaHJlZj0iJHtpdGVtLmNvdXBvbl9saW5rfSIgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyc+PC9hPgogICAgICAgIDxkaXYgY2xhc3M9InpobV9jb3Vwb24iIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4OyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9sZWZ0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9pbWdfaWNvbiI+CiAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQmtBSGovQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpMQUgvQUN3QUFBQUFaQUJrQUtmNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QmpyNkJqcjZCanY2Qmp2NkJqdjZCanY2Qnp2NkJ6djZDRHo2Q0R6NkNUMzZDVDM2Q1QzNkNqNzZDejc2Q3ovNkN6LzZERC82REVENkRVRDZEVUQ2RGtINkRrSDZEa0g2RDBMNkVFTDZFVVA2RVVUNkVrVDdFMFg3RkVYN0ZFYjdGRWI3RlViN0ZVZjdGVWY3RmtmN0ZrZjdGMGo3RjBqN0YwajdGMGo3R0VqN0dFbjdHVXI3R2t2N0cwdjdIRXo3SFUzN0gwLzdJVkQ3STFIN0pGTDdKbFQ3SjFUN0tGYjdLVmI3S2xmN0sxajdMbHI3TUZ6N01sMzdORi84Tm1EOE9HTDhPbVQ4UEdYOFAyZjhRV244UTJyOFJHdjhSbTM4Um0zOFIyNzhTRy84U1hEOFNuRDhUSEw4VG5QOFQzVDhVSFg4VW5mOFZIajhWM3Y4VzM3OFlJTDhaSVg4YW9uOGI0MzhjWS83Y0k3NmJZdjRhNG4xYVlmdVo0VGpaSC9VWkh6SFpudThhWHF0YkhxaWIzcVdjM3FJZDN1QWVIcDVlWGw2ZW5wN2UzdDhmSHg5ZlgxK2ZuNS9mMytBZ0lDQmdZR0Nnb0tEZzRPRWhJU0ZoWVdHaG9hSGg0ZUlpSWlKaVltS2lvcUxpNHVNakl5TmpZMk9qbzZQajQrUWtKQ1JrWkdTa3BLVGs1T1VsSlNWbFpXV2xwYVhsNWVZbUppWm1abWFtcHFibTV1Y25KeWRuWjJlbnA2Zm41K2dvS0Nob2FHaW9xS2pvNk9rcEtTbHBhV3JwcWUycUt2QXFhN0pxckhRcTdQWHJMWGRyTGZpcmJqb3JMbnVxcm55cUxqMXA3ajNwYmY1cExiNm9yYjdvclg4b2JYOG9MVDlvTFQ5b0xUOW9iWDlvcmI5bzdmOXBiajlwcm45cDduOXFMcjlxTHY5cWJ2OXFidjlxcno5cXJ6OXFyejlxN3o5cTczOXE3MzlyYjc5cnIvOXNNSDhzc0w4dE1UOHRzWDh1TWY3dXNuNnZjcjZ3TXo1d3M3NHc4LzR4ZEQzeDlIM3lOTDJ5dFQxeTlYMHpkYnowTmZ5MHRueDFOcngxTnZ4MWR2eDF0engxOTN3Mk4zeDJkL3cyOS92M09IdjN1THY0T1B2NHVYdTVlZnU1K251NnV2dDdlM3U3dTd2NysvdzhQRHg4Zkh5OHZMejgvUDA5UFQxOWZYMjl2YjQrUGo1K2ZuNysvdjgvUHo5L2YzKy92NysvdjcrL3Y0eXpUSUkvZ0QvQ1J4SXNLREJnd2dUS2x6SXNLSERoeEFacWx2U0pLTEZpeGd6L2l0RDVNUUpJMm8waWh4Sk1na0hCd284UENISnN1VkRZa0ljeUpSUXhKL0xtemdMNG9vNWs0ak5uRUJkNGhvaTA0RUVuMEdUR2pRSFJVbVNMdzZIRmozNmsyR1hKVW1nVkZVS3NVa0tDaGg2akdrb3RlZldoR0o4YUtDUXdnblhpR1Y2Rk1WUWsyRlpvMGdYK2p1aVFhYUNIcmplUHFUaW9xaURGRmNZYmlNcWt3S1NobFpXS0pCWklFZEl3UTIzRWFGUWxJSVFad3lqcUtCQVFjVVV1MEk0Tng1eUZuUENLaXNNZzRqQ3NCc1VJa1drTklSU3dyQ0tMYTRkK2pPQ3dYQ1B5eXpSL0RDTTRVandoMXdLRngxUnhlV1lGZ1dLd2lqei9LR1NrdzRLL3NBdzQ1SU1qT3dwSzNaM1NDYkkyaFRxVy9wYlVvS0NoeUhJMXpNc1UyU0lWcHkvTkRGRUVtbm9oeE11VkVDUlJSWllYQ0VFRnI0WTZKb2FVaGpod3d3c2VBQkNDU1dJb0lFTExnaVJ4QlM4U0FpVVAxTVFNY01JR2toZzJJc09VS0JCQ1R3a0VZYUpCWkhUMmtOU0NKRkNjVEFHYVJnSExSZ2hSa2IreEpPY0VqUFl3RVJnRUhVeHhGZENWdmtpQmk0c2tWOURhQ3lSZ3cxTFFLblJFaURJQk1JUFZPeG9rRDlRMkFCa2tCSndCbGFNTGdySmdRK0pOV1RORXp4NElKTUk4V0drbkdFVW5FQ0VGd3VwY1VSdlFjN1lRZzlHbkZDQ0NqQWcwUU1NSi9RRkl3VXRQS0htUUZVRU1jS0xPY0NqMGFCWHVxQWJRbWNRNGVlTC9oU00wTU1SVTJ3NWtCcFVHSkhEQ0tvWmRzSVNuemJCUXE5RjhmQ3BRMHlVQ2VOeEI1MGhoS2FHbFNCRUZNcEVCVVVRakJvbXdoSG1IRlJHRGtHZVFKdElhaVRSd3B0bWprc1FHcysrcUVFT1VoeUxrRDlSOEFDdFRCOEFhNUFYS21SWGxBWXdPS0VOUzFvTWNZSnFDcmhBUmtIZ0hBRmVVU0lVY1laR1poaVJyVXppR3ZUdFpER3FZTVJZTjBrQnhBa2dzTEJTUVUyTTZtc1Q4amJrajFjdnVvQm9RVTZvQU1JSlFsUUhWREJVUE1HRlFWM0E4R0lLVUxqMFJHeWRBYkhsT2xVNGtXWjN0d3lCcmdodTNkVEVDVU15Z1NOQnZCbW1nUkV0QzZTR3JRa3A4YXBNTGN5TW94cEJ2UGdEMlFhUlFVUU9PUndCZDBGcXBEYVgvaEZiL3hQRnhTZm92TkF5UkdoUVFFcEpPSlJGQzBVcHdNS1JKcEt6V1dkNUxUU0dDLzVXZG5kQmZQMnJ0WWxkdU1DeEF5cDA0ZEFZTEdTK25VTmVTQ2NURDVzTDVzVFpFckIyT25hVXljQ2R5OFJOSi9oNi9nelJxd2ZxTW5SZDVqS1E1MUFWV011RXdSSVNmdHU0QzdzM2RIenV5amQwQmcrRytaQ09nV0d3TURvUTM5K09mUFlNK1RONWVET3dZZUFUMlRvRzBmWGhKZC9Wd3lOb2daTVpUaW5odjFOSlFKOUFuUEF3RG56T2ZOaURDUHlta3dXRGZDRUovL05mRXBvUU83RVJnUU9reVNBRk9JQ2Zna0FCV2lYUTMwUG9Wd0Q3UFFRTXFaT0pBUXN5QnZkb2tEUWdNRUkyR0pLRUVveXVLQVdnRHNwQUNKVVI0cTUrL2dKY0NCbCtLQUVnZVBCc0wvSkFEeGhpZzN2SlpsVURXY0tiU3RCREJBSVJJa1AwVnhFTDhvU0h3WW9EREFrRHVCUkF4aklxb0FVZ0c4Z1RRS2cyNi8yd2hFRlVpQmRXb0VVakVvUUtMVEJqR1IyUWd5b3FSQW8vQUpFZ1haQ0RrM0VOV2lDQW9odlBCNUZrRldXRkJIa1pEd1lKSWg5UTRTRnEyQUlXTm9rRkxaRE5KSHViM3h2SDB4Vm9qUUFMQjFFRGd6alpCVEc1aEFvcDRCZ0ZpaUJLUmdwbmZRNFFBU3IxQXdiUkZjVUdGUnlJZVRJSHU0ZWdRUzY1UTRPQjJPYXJuem5rRzBoNGxRZWc5NUFxeExJb1B3aGJVcER3SmcxUTB5Rm1PQUlNWm9BRVZ6SUVDZEI2bm9ta2NESExSR1FiNVJ1aERhSWxRZ09kQVpreS9sRUpWNWlBUkIrWWN6MUx1QmNQM09jeUtCakJDSXEwSExnOHQ3WFFlUzF4NmZNS1dGUlF0UFFaNFY3VTYxdm5pcEtDU3k0RURPZnhpdzNpV0pBb05FOG1HbEJDMy83eGhYa2FoNlFEUWNJSERET0NOaDRrQ3pONDBReGdxaFIvRU9NZ1RsQ1c4NGdnRFlWQTRRUWNVMEFLd0tBUU5BU0JXQ0NvYUVHQ29VMk1WQ01LUDdEQkVCWkdFRFZJelRBZkNKUkIyQ0FFREpBUkEwT28xcnhBU1RsbUZNUUxROGdCRU9LVkV5b0lvVGNLd0lBUXpCa0dseFlsYlFycGdoQlVvQUloUUE0aFUxQUJxYmg2cTdJcWdBTFNzb0pMdkVBRUt2bWxCTUFwaUJSU1FDZ2hIRU1oNkpEQzB4SmlCaDhNN1RRRkNaKy9PbGFFNm1ta0NqbEEvaGRLVHBEWlNKcE5ObExOeUJLODZJRURFa1FNUC94WER3NkxrVjBJRDBZYUtNSlBEWktHcHhyR0JoUExpRU03czlkVUZnNUdHQ0NDU09KeVE3Wkk3RFZJUStrM0xlS1BJcURMQmNRdENCbU1NSnFZelRBanZOQ2JtZERFa084WXhnVnBqRWhrUmdkSmhWaEJDQ3FMa1JDcWloQXAyRUFFSThpQkU3clJrREp3NzE4cUphOTVEZk8yaGt6akNUa1FnUWg2WUZPTWpFRUtVZ2ptUUpvZ1ZBZkFRSmtSNlVJZUlaYlFoWndCeEs1OVRocE0reThidlBER053N0x2WURRakpVK3hBa3p0WktRWVNTQ0Z2dVl0QXNkc3BJZDRNOGpQd1NkU3g0eUI4VHFaSVZVUVFVM2pQS0x6c2pZS2krRXUzUDVBQWpHVE9ZeWw5a0RieXBBL2crQTRlV0dsSFo4VGxpQ25PZE1aenBEQVo4RjRNRnkyNnlRTjgrRWxnN3BCbVBDMDRNOTh4a2hmc2FMTnUraVprTWYyaUNKcGtwVUJ0M29SNVBXQnh5VE5Ga29YV2hMSTVyR2VIbUlNemp0YUU4THBMU0dFVUlZcm9DRkJTMklrNXk4d2hYRTBEYks2Tm5Va0FhMUF6aGc1bDZYMlVNNHZEV3VDWUpxTFFzcHo2VTI5Umt3YmV3Z0tjQUdiaDMyUUhiUzdDQjVoc0JPaGtJTDZsUnRCMmpBQnZXVXRrQlE5SVBoelVBQ0dFaTN1dE10Z1J6UURnZ3hGdmNBb2NXQjNCb2tvRVh4Z0wzbExaQy9HU1lIMFRYSUdQeXFWRC95V3lEM1pNNFFDbFNRTXBUVk1FQ0k5c0VKd2dRdmFvQUhUbkNmUDg3UWhOaUNkZDhUand1TVNVRGdBZzk0d0FWQm5vclNKbjZRS1lSWHlTNm9MY3RSZGxJaHE4RElNLy9IeTFwQWdTd3pCd2JGeTdsQnJEQWwyWHBiQlVOZ3F0QVY0ZzhxRktIbUxUakNMcGRPOWFvbkpDQUFJZmtFQ1RJQS93QXNCZ0FCQUZnQVlRQ25BQUFBQVFFQkFnSUNBd01EQkFRRUJRVUZCZ1lHQndjSENBZ0lDUWtKQ2dvS0N3c0xEQXdNRFEwTkRnNE9EdzhQRUJBUUVSRVJFaElTRXhNVEZCUVVGUlVWRmhZV0Z4Y1hHQmdZR1JrWkdob2FHeHNiSEJ3Y0hSMGRIaDRlSHg4ZklDQWdJU0VoSWlJaUl5TWpKQ1FrSlNVbEppWW1KeWNuS0Nnb0tTa3BLaW9xS3lzckxDd3NMUzB0TGk0dUx5OHZNREF3TVRFeE1qSXlNek16TkRRME5UVTFOalkyTnpjM09EZzRPVGs1T2pvNk96czdQRHc4UFQwOVBqNCtQejgvUUVCQVFVRkJRa0pDUTBORFJFUkVSVVZGUmtaR1IwZEhTRWhJU1VsSlNrcEtTMHRMVEV4TVRVMU5UazVPVDA5UFVGQlFVVkZSVWxKU1UxTlRWRlJVVlZWVlZsWldWMWRYV0ZoWVdWbFpXbHBhVzF0YlhGeGNYVjFkWGw1ZVgxOWZZR0JnWVdGaFltSmlZMk5qWkdSa1pXVmxabVptWjJkbmFHaG9hV2xwYW1wcWEydHJiR3hzYlcxdGJtNXViMjl2Y0hCd2NYRnhjbkp5YzNOemRIUjBkWFYxZG5aMmQzZDNlSGg0ZVhsNWVucDZlM3Q3Zkh4OGZYMTlmbjUrZjM5L2dJQ0FnWUdCZ29LQ2c0T0RoSVNFaFlXRmhvYUdoNGVIaUlpSWlZbUppb3FLaTR1TGpJeU1qWTJOam82T2o0K1BrSkNRa1pHUmtwS1NrNU9UbEpTVWxaV1ZscGFXbDVlWG1KaVluNTJUcXFTS3VLMSt6THByM3NWWTZjeE43czlIOE5CRjhOQkY4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThORkU4TkZFOE5GRThORkU4TkZFOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkc4ZEZHOGRGRzhkRkc4ZEZIOGRGSDhkRkg4ZEZJOGRGSThkRko4ZEpKOGRKSjhkSks4ZEpLOGRKTDhkSkw4ZEpNOGRKTThkTk44ZE5POGROUDhkTlA4ZE5ROGROUThkTlI4dFJTOHRSUzh0UlQ4dFJWOHRWVzh0Vlk4dFpaOHRaYjh0ZGU4OWRnODloaTg5aGo4OWhqODloazg5bG04OWxvOU5wcTlOcHI5TnBzOU50dDlOdHc5Tnh5OU54ejlOMTE5TjEyOU4xMzlOMTU5ZDU3OWQ5KzlkK0E5ZUNEOWVHRzl1S0s5dU9OOXVPUTkrV1grT2lrK091dStlMjQrdS9DK3ZISit2SElNczB5Q1A0QS93a2NTTENnd1lNSURmWUxOeTZodzRjUUkwcWNXSS9iTW1mZDhrM2N5TEhqUm0vSGN1VTZWczZqeVpNbitXMFRLYkpiUDVRd1l6N2N4NDFsTG00dlplcmMrWSttVFpjOGd4THNaKzdidDNnU2ZiTEVLUkhlTjIvbGNncDFPTTVaTDJEWjVrVlVLcElwUkhuWmdQVnlWbkpxUW5yWldQWUNPclBtVXFrSisza0R4aktiUHJNSTFVV3o2YXdkeEg1dWMvWHlGcEhkTTVheHJtbkVxNUJiTDdYYjRDSTBaM1ZzT29qNnRqMFcyY3NyNDRMcURyTk1odTV2T1c3ZFNrTXNwNHd2dk04SCszV2pXM2V4VG54cFdRTHJCaHNoUEdzMms2bmpPZTlaTEpiVzZQVkcrQzFrcmxqSmVkS3pkbnhrdytVSDZXa1ROdmI2em43ZmxQNzFPc2JOTnZhQzlMcHhpeXFVM3podTMvQ2RoN2xQSFRwNDd0cTE0K2FPMzN5OCtLRFRUVGJXUEhOTU1zb29rNHd3MFZpenpUZnArUGRmVFAyazA0MDF5dEJtMDRiakxaUE5OL0xNMTQ5a0c2R3pqVlVicHFqaU1kRjBFNkpKSTBwMHp6ZldXRFBPWFJ2Qnd3MktLdmFZb2pEV2hHTmVSUGpRYU0wMyswQVVUaklpSFpPTk9pVEdWbzQxR3FyNFdDOVgramhTTnV4STFFODUxemlYakhjSTNaTWJTeGk5NWxBKzNyU21vakRLUkpOTk44NDQ4NHcxM2hDNFRKVnFSY09lUSt0c3c2Uk4xMFE1a0prcDltS05hZ2ZadzQxek52V2lURGJlb0NQZlFmbW8wODAxeVd6R1Z6aUcvalBPTTU3V0ZhcEFTNnFZelpBQzJiT05NUDRwS3JNTk9oSmlaczQyeTZTWWpEZFJUcWVpTStaQWxNODMwWlNhaTNBRzNjTU5yRFlCY3cwNnB5TFVEenJYTU12U01kK1FDSTh6MVlrRWpEVi9RcVFqajdsRU54UklHeWJUalQwbzFkT05tMmdHaXg1d25HR2tGVWZvWkxQTU1jK1VSZEE0OElya3pEalJSdFJQVlJ0YW8rYS96aHl6ekRaZG1zU1BPdVFzUE5Cdkd3TExVem1pY2JiTmtQMnNNdzZVVStualdIQms2b1R3dGVITVowN0F3ckFGRVQ2c1N0dWNUZEVndFJ3KzJteVl6YVVQemNQTk5kZDRVN05CK0dpbUZtL0xvUk93TThOQjVNK3lUWDRqa1R0N3NmVE1pNThCNXVsYUJmOHpEM1VpSlFiMFEzUHAxakpzOEdRdHNNVU95V01jY3NwRmhERkxpc0ZHRHY2a040WDlqenpSZEd2dVg5MTRta3pFZUhsOUxhTmZCVTczUk9vNG81dlZqTlZEcjBqVzFETVI0SUxYSFZFOTE5aVVqZDhteVMwNjZady83dVhKejFsenRsQ3NxVVhZNW5OajdubEU0MENhRE55ZkcrVzc3K3dXdFBlMUtUOGtkK2NieFM1U01uNFZGTS92dnBPakVUNlBZbW45ZU9VVlZBNmt5dkFldCtPMmJ4UlB4OGVJVTlBOHIxNlA1VEc4aHRlak11c1VOSTYxM1c4MEQvamwzZzRSUFIzbnNvMzJmTFBKTWJSaERXdHQ2QmlNKzhjM05LUU1uVW5rZnNpYkNBUlpvZzBBOW1nODhiamNocUp4cjRHVWczN2VTOGdFd3pjUmVQU3ZnZ1RSUzQrc2daUjgxZWlGMXJpR3Z6eW91OHRJRUgrRGk0ZzRCalVTOHcxbEhQN1hzRWFEb3RHZ0p3MGtIL25SVHp2YzhUcUIzSXd6czVOSTZrZ29rZm1OeGgwSHdVY1M5UU9QSkhVa0haTGpETk1lV0x2OFRVUnh5d3VoVHVMaHRuTGhLQ0pqcTA0c1ZqVVJSQ0duaVR6SngwclFwRWFGb0dza2xKUElPc0lva3RGOUptM2VDdVRudkZFamI3d3hJb2pNQlREV3hoaW5FUXFQRG9tUi9UUzRqRDdxeEI1bkdza016U0lPdnRtbE45OHc0TSs4WkE1dnBFYUNHaFNHRDluV1JtRW9NaTVWd1pJekVpaXQyZGdraDRlc0V0UWdra0hCQmM4aDZDQ2tKRy81bVF6NlRITU8rYU5JNnVjUWQyaXdYTkFVU2o5cTlTOGVTbEptQnlsSHJ0RGt3SVBjUTJtakdhVkErRUc2MkppRFFOem9vRUR5d2JvbUZZOGdTZjdiVEdlNFdSRHc4SzB6L25BZU42eVJEV2g1UkIzYmNCTXd0dkhJdjEwelp3NkJ4NG1jRVUrSGdERmgra3NhWFhyeE1NVFpiVWVsNnFSQmtoa3BidkN6bitrZ1dVSkFtVEViRW1SODNScExOL1NIa0hWUUtVWE80SjAvZzZQT2pqeXhTYk44S2Y1RUlveXN0TVZZdVlqWlNmL0JzMUpaNHg0b3Vadkh2RmdRZWhwUWpBOUJDNGN3a2syRGhNWW13cUJrUjJSVEpSYWVoVTdHc3NhcDlvSE9ZeG54SVQ4MW8wY01JOENnMWxSUWF2RU1RdEJoaldRa1E0WmhBeDFZbVdtd3dvbnVhUDBFazErejRVbUJ6QU1kbHRwSTduNkp5WWoyanpRYnVRZGt1eW9VM0lEMUdsZ0NobWhIUzlyU1lxVksyZ2pvaEI0eVdTMjVWbGN1WGY1dFFnVDcydG9Xc3FHeVBVZ2tiZXVqWTl3enR3VVpKRzlkeTBIZ1pqVjB1am1HY3BmTDNPWWV3MU56WEtweEI4TFN1cERqRytISXJuYTNtOTF2bENPVTJaRHVkUDlSM2E2Y01UQzVDTzk0RVZMZXZpVUZ2ZXBkcjBIYXExZUhjQ1c5NHAwdWZmMTIzL2pLbHlEMFBhL284bXZjOW01REhrdDBoNElYek9EOHlLTm5lQ013Y050N0lMOWErTUlZWGhDaEpKemJlb1J5dUNueTczOWI5V0VRLzFLMUl4Wklaa3hzcGNpa21DRGxhQ09MdjRYRkZ3K2tRdG53MURHdVlWclNoc2ttMnFDcGpjbGhyV1BJaXpsRlByS05DZkl5UWtIMUlHUGpTem1YVE9KbWNhT0o5ZGdHYWxGTTVZR1VFcXpaS0FjK1JuUVBjdkJZZ0QybHNqbFcwMlVONWJZNXhJaGRNanI2OTlwbzFMakxCeEdITXJXMFN6empzbGhhVWhRdi9Wd1Fkb0EwUmNDZzZKUUpIUnROS2JORkh2MU1RQUFBSWY0VlRXRmtaU0IzYVhSb0lGTmpjbVZsYmxSdlIybG1BRHM9IiA+ICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXkiIHN0eWxlPSdtYXJnaW4tdG9wOjdweDsnPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fYW1vdW50X21vbmV5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9zaWduIiBzdHlsZT0nbWFyZ2luLXRvcDotMTBweDsnPsKlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfbnVtIj4ke2l0ZW0uZGlzY291bnR9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29uZGl0aW9uIj7mu6Eke2l0ZW0ucXVvdGF95YWD5Y+v55SoPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3RpbWUiIHN0eWxlPSdtYXJnaW4tdG9wOjEwcHg7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3Rlcm0iPuacieaViOacnzwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fZGF0ZSI+JHtpdGVtLmVuZFRpbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jaXJjbGUiIHN0eWxlPSJyaWdodDo0NHB4OyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9saW5rX2NvdXBvbiIgc3R5bGU9InBhZGRpbmc6MHB4IDE2cHggMHB4IDE2cHg7Ij4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ6aG1fZ2V0X2xpbmtfdGV4dCIgc3R5bGU9ImxldHRlci1zcGFjaW5nOiAxMHB4O2ZvbnQtc2l6ZToxNnB4O21hcmdpbi10b3A6MTBweDsiIGhyZWY9IiR7aXRlbS5jb3Vwb25fbGlua30iIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnIHN0eWxlPSJtYXJnaW4tbGVmdDoxNnB4O3dpZHRoOjM0cHg7Ij7pooblj5Y8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIGAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtX2Rpdl9zJykuaW5uZXJIVE1MID0gaHRtbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3Vwb25XaWR0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1fY291cG9uJykub2Zmc2V0V2lkdGg7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPHJlc3AubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpkQ291cG9uTGlua0RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNqZENvdXBvbkxpbmsnK2kpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpkQ291cG9uTGlua0RvbS5zdHlsZSA9IGBwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEwcHg7ei1pbmRleDoke2krMX07d2lkdGg6JHtjb3Vwb25XaWR0aH1weDtoZWlnaHQ6ODBweDtgOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlRdWFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1bW1hcnktcXVhbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3VtbWFyeVF1YW4pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlRdWFuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3VtbWFyeVF1YW4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1YW5IdG1sID0gYAo8ZGl2IGNsYXNzPSJkdCI+5LyYIOaDoCDliLg8L2Rpdj4KPGRpdiBjbGFzcz0iZGQiPgo8ZGw+CjxkdCBjbGFzcz0iZmwiPjwvZHQ+CjxkZCBjbGFzcz0ibGgiPgo8ZGl2IGNsYXNzPSJKLW9wZW4tdGIiIGhyZWY9ImphdmFzY3JpdDp2b2lkKDApIiBzdHlsZT0ibWFyZ2luLXRvcDotMTBweDsiPgpgOwogICAgICAgICAgICAgICAgICAgICAgICByZXNwLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFuSHRtbCArPWAKPHNwYW4gY2xhc3M9InF1YW4taXRlbSIgc3R5bGU9Im1hcmdpbi10b3A6MTBweCI+PHM+PC9zPjxiPjwvYj4KPHNwYW4gY2xhc3M9InRleHQiPjxhIGhyZWY9IiR7aXRlbS5jb3Vwb25fbGlua30iIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnIHN0eWxlPSdjb2xvcjojZGYzMDMzOyc+5ruhJHtpdGVtLnF1b3RhfeWHjyR7aXRlbS5kaXNjb3VudH08L2E+PC9zcGFuPgogPC9zcGFuPgpgOwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbkh0bWwgKz0gYDwvZGl2PjwvZGQ+PC9kbD48L2Rpdj5gOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuaWQ9J3N1bW1hcnktcXVhbic7CgogICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9ICdsaSBwLWNob29zZSBoaWRlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpdkVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbHN0YWcnLCdzaGFuZ3BpbnxrZXljb3VudHxwcm9kdWN0fGxpbmdxdWFuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9IHF1YW5IdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlJbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1bW1hcnktaW5mbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUluZm8uYWZ0ZXIoZGl2RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKQogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLGdvb2RzVGl0bGUsc2hvcE5hbWUpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+ewoKICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNfaWQgPSB0aGlzLmdldFF1ZXJ5U3RyaW5nKCdpZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighZ29vZHNfaWQpe2NvbnNvbGUubG9nKCdnb29kc19pZCcpO3JldHVybn07CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUgPT0gJ3pobV90YWJfdGFvYmFvJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBub2RlLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgxKScpLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5iZWZvcmUodGhpcy5kaXZFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBub2RlLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgaHR0cHM6Ly9hcGkudHlwZWNocm9tZS5jb20vZ2V0Y291cG9uLnBocD9nb29kc19pZD0ke2dvb2RzX2lkfSZnb29kc190aXRsZT0ke2VuY29kZVVSSUNvbXBvbmVudChnb29kc1RpdGxlKX0mc2hvcF9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNob3BOYW1lKX1gOwpjb25zb2xlLmxvZyh1cmwpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGU9PTIwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY291cG9uIiBvbmNsaWNrPSJ3aW5kb3cub3BlbignaHR0cHM6Ly9hcGkudHlwZWNocm9tZS5jb20vY29kZS5waHA/bGluaz0ke3Jlc3AuZGF0YS5jb2RlX3VybH0nKSIgc3R5bGU9J2N1cnNvcjpwb2ludGVyJz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xlZnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2ltZ19pY29uIj4KICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFCa0FIai9BQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRSkxBSC9BQ3dBQUFBQVpBQmtBS2Y2QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCanI2QmpyNkJqdjZCanY2Qmp2NkJqdjZCenY2Qnp2NkNEejZDRHo2Q1QzNkNUMzZDVDM2Q2o3NkN6NzZDei82Q3ovNkRELzZERUQ2RFVENkRVRDZEa0g2RGtINkRrSDZEMEw2RUVMNkVVUDZFVVQ2RWtUN0UwWDdGRVg3RkViN0ZFYjdGVWI3RlVmN0ZVZjdGa2Y3RmtmN0YwajdGMGo3RjBqN0YwajdHRWo3R0VuN0dVcjdHa3Y3RzB2N0hFejdIVTM3SDAvN0lWRDdJMUg3SkZMN0psVDdKMVQ3S0ZiN0tWYjdLbGY3SzFqN0xscjdNRno3TWwzN05GLzhObUQ4T0dMOE9tVDhQR1g4UDJmOFFXbjhRMnI4Ukd2OFJtMzhSbTM4UjI3OFNHLzhTWEQ4U25EOFRITDhUblA4VDNUOFVIWDhVbmY4VkhqOFYzdjhXMzc4WUlMOFpJWDhhb244YjQzOGNZLzdjSTc2Yll2NGE0bjFhWWZ1WjRUalpIL1VaSHpIWm51OGFYcXRiSHFpYjNxV2MzcUlkM3VBZUhwNWVYbDZlbnA3ZTN0OGZIeDlmWDErZm41L2YzK0FnSUNCZ1lHQ2dvS0RnNE9FaElTRmhZV0dob2FIaDRlSWlJaUppWW1LaW9xTGk0dU1qSXlOalkyT2pvNlBqNCtRa0pDUmtaR1NrcEtUazVPVWxKU1ZsWldXbHBhWGw1ZVltSmlabVptYW1wcWJtNXVjbkp5ZG5aMmVucDZmbjUrZ29LQ2hvYUdpb3FLam82T2twS1NscGFXcnBxZTJxS3ZBcWE3SnFySFFxN1BYckxYZHJMZmlyYmpvckxudXFybnlxTGoxcDdqM3BiZjVwTGI2b3JiN29yWDhvYlg4b0xUOW9MVDlvTFQ5b2JYOW9yYjlvN2Y5cGJqOXBybjlwN245cUxyOXFMdjlxYnY5cWJ2OXFyejlxcno5cXJ6OXE3ejlxNzM5cTczOXJiNzlyci85c01IOHNzTDh0TVQ4dHNYOHVNZjd1c242dmNyNndNejV3czc0dzgvNHhkRDN4OUgzeU5MMnl0VDF5OVgwemRiejBOZnkwdG54MU5yeDFOdngxZHZ4MXR6eDE5M3cyTjN4MmQvdzI5L3YzT0h2M3VMdjRPUHY0dVh1NWVmdTUrbnU2dXZ0N2UzdTd1N3Y3Ky93OFBEeDhmSHk4dkx6OC9QMDlQVDE5ZlgyOXZiNCtQajUrZm43Ky92OC9QejkvZjMrL3Y3Ky92NysvdjR5elRJSS9nRC9DUnhJc0tEQmd3Z1RLbHpJc0tIRGh4QVpxbHZTSktMRml4Z3ovaXRENU1RSkkybzBpaHhKTWdrSEJ3bzhQQ0hKc3VWRFlrSWN5SlJReEovTG16Z0w0b281azRqTm5FQmQ0aG9pMDRFRW4wR1RHalFIUlVtU0x3NkhGajM2azJHWEpVbWdWRlVLc1VrS0NoaDZqR2tvdGVmV2hHSjhhS0NRd2duWGlHVjZGTVZRazJGWm8wZ1granVpUWFhQ0hyamVQcVRpb3FpREZGY1liaU1xa3dLU2hsWldLSkJaSUVkSXdRMjNFYUZRbElJUVp3eWpxS0JBUWNVVXUwSTROeDV5Rm5QQ0tpc01nNGpDc0JzVUlrV2tOSVJTd3JDS0xhNGQrak9Dd1hDUHl5elIvRENNNFVqd2gxd0tGeDFSeGVXWUZnV0t3aWp6L0tHU2t3NEsvc0F3NDVJTWpPd3BLM1ozU0NiSTJoVHFXL3BiVW9LQ2h5SEkxek1zVTJTSVZweS9OREZFRW1ub2h4TXVWRUNSUlJaWVhDRUVGcjRZNkpvYVVoamh3d3dzZUFCQ0NTV0lvSUVMTGdpUnhCUzhTQWlVUDFNUU1jTUlHa2hnMklzT1VLQkJDVHdrRVlhSkJaSFQya05TQ0pGQ2NUQUdhUmdITFJnaFJrYit4Sk9jRWpQWXdFUmdFSFV4eEZkQ1Z2a2lCaTRza1Y5RGFDeVJndzFMUUtuUkVpRElCTUlQVk94b2tEOVEyQUJra0JKd0JsYU1MZ3JKZ1ErSk5XVE5Feng0SUpNSThXR2tuR0VVbkVDRUZ3dXBjVVJ2UWM3WVFnOUduRkNDQ2pBZzBRTU1KL1FGSXdVdFBLSG1RRlVFTWNLTE9jQ2owYUJYdXFBYlFtY1E0ZWVML2hTTTBNTVJVMnc1a0JwVUdKSERDS29aZHNJU256YkJRcTlGOGZDcFEweVVDZU54QjUwaGhLYUdsU0JFRk1wRUJVVVFqQm9td2hIbUhGUkdEa0dlUUp0SWFpVFJ3cHRtamtzUUdzKytxRUVPVWh5TGtEOVI4QUN0VEI4QWE1QVhLbVJYbEFZd09LRU5TMW9NY1lKcUNyaEFSa0hnSEFGZVVTSVVjWVpHWmhpUnJVemlHdlR0WkRHcVlNUllOMGtCeEFrZ3NMQlNRVTJNNm1zVDhqYmtqMWN2dW9Cb1FVNm9BTUlKUWxRSFZEQlVQTUdGUVYzQThHSUtVTGowUkd5ZEFiSGxPbFU0a1daM3R3eUJyZ2h1M2RURUNVTXlnU05CdkJtbWdSRXRDNlNHclFrcDhhcE1MY3lNb3hwQnZQZ0QyUWFSUVVRT09Sd0JkMEZxcERhWC9oRmIveFBGeFNmb3ZOQXlSR2hRUUVwSk9KUkZDMFVwd01LUkpwS3pXV2Q1TFRTR0MvNVdkbmRCZlAycnRZbGR1TUN4QXlwMDRkQVlMR1MrblVOZVNDY1RENXNMNXNUWkVyQjJPbmFVeWNDZHk4Uk5KL2g2L2d6UnF3ZnFNblJkNWpLUTUxQVZXTXVFd1JJU2Z0dTRDN3MzZEh6dXlqZDBCZytHK1pDT2dXR3dNRG9RMzkrT2ZQWU0rVE41ZURPd1llQVQyVG9HMGZYaEpkL1Z3eU5vZ1pNWlRpbmh2MU5KUUo5QW5QQXdEbnpPZk5pRENQeW1rd1dEZkNFSi8vTmZFcG9RTzdFUmdRT2t5U0FGT0lDZmdrQUJXaVhRMzBQb1Z3RDdQUVFNcVpPSkFRc3lCdmRva0RRZ01FSTJHSktFRW95dUtBV2dEc3BBQ0pVUjRxNSsvZ0pjQ0JsK0tBRWdlUEJzTC9KQUR4aGlnM3ZKWmxVRFdjS2JTdEJEQkFJUklrUDBWeEVMOG9TSHdZb0REQWtEdUJSQXhqSXFvQVVnRzhnVFFLZzI2LzJ3aEVGVWlCZFdvRVVqRW9RS0xUQmpHUjJRZ3lvcVJBby9BSkVnWFpDRGszRU5XaUNBb2h2UEI1RmtGV1dGQkhrWkR3WUpJaDlRNFNGcTJBSVdOb2tGTFpETkpIdWIzeHZIMHhWb2pRQUxCMUVEZ3pqWkJURzVoQW9wNEJnRmlpQktSZ3BuZlE0UUFTcjFBd2JSRmNVR0ZSeUllVElIdTRlZ1FTNjVRNE9CMk9hcm56bmtHMGg0bFFlZzk1QXF4TElvUHdoYlVwRHdKZzFRMHlGbU9BSU1ab0FFVnpJRUNkQjZub21rY0RITFJHUWI1UnVoRGFJbFFnT2RBWmt5L2xFSlY1aUFSQitZY3oxTHVCY1AzT2N5S0JqQkNJcTBITGc4dDdYUWVTMXg2Zk1LV0ZSUXRQUVo0VjdVNjF2bmlwS0NTeTRFRE9meGl3M2lXSkFvTkU4bUdsQkMzLzd4aFhrYWg2UURRY0lIRERPQ05oNGtDek40MFF4Z3FoUi9FT01nVGxDVzg0Z2dEWVZBNFFRY1UwQUt3S0FRTkFTQldDQ29hRUdDb1UyTVZDTUtQN0RCRUJaR0VEVkl6VEFmQ0pSQjJDQUVESkFSQTBPbzFyeEFTVGxtRk1RTFE4Z0JFT0tWRXlvSW9UY0t3SUFRekJrR2x4WWxiUXJwZ2hCVW9BSWhRQTRoVTFBQnFiaDZxN0lxZ0FMU3NvSkx2RUFFS3ZtbEJNQXBpQlJTUUNnaEhFTWg2SkRDMHhKaUJoOE03VFFGQ1orL09sYUU2bW1rQ2psQS9oZEtUcERaU0pwTk5sTE55Qks4NklFREVrUU1QL3hYRHc2TGtWMElEMFlhS01KUERaS0dweHJHQmhQTGlFTTdzOWRVRmc1R0dDQ0NTT0p5UTdaSTdEVklRK2szTGVLUElxRExCY1F0Q0JtTU1KcVl6VEFqdk5DYm1kREVrTzhZeGdWcGpFaGtSZ2RKaFZoQkNDcUxrUkNxaWhBcDJFQUVJOGlCRTdyUmtESnc3MThxSmE5NURmTzJoa3pqQ1RrUWdRaDZZRk9NakVFS1Vnam1RSm9nVkFmQVFKa1I2VUllSVpiUWhad0J4SzU5VGhwTSt5OGJ2UERHTnc3THZZRFFqSlUreEFrenRaS1FZU1NDRnZ1WXRBc2RzcElkNE04alB3U2RTeDR5QjhUcVpJVlVRUVUzalBLTHpzallLaStFdTNQNUFBakdUT1l5bDlrRGJ5cEEvZytBNGVXR2xIWjhUbGlDbk9kTVp6cERBWjhGNE1GeTI2eVFOOCtFbGc3cEJtUEMwNE05OHhraGZzYUxOdStpWmtNZjJpQ0pwa3BVQnQzb1I1UFdCeHlUTkZrb1hXaExJNXJHZUhtSU16anRhRThMcExTR0VVSVlyb0NGQlMySWs1eTh3aFhFMERiSzZOblVrQWExQXpoZzVsNlgyVU00dkRXdUNZSnFMUXNwejZVMjlSa3diZXdnS2NBR2JoMzJRSGJTN0NCNWhzQk9oa0lMNmxSdEIyakFCdldVdGtCUTlJUGh6VUFDR0VpM3V0TXRnUnpRRGdneEZ2Y0FvY1dCM0Jva29FWHhnTDNsTFpDL0dTWUgwVFhJR1B5cVZEL3lXeUQzWk00UUNsU1FNcFRWTUVDSTlzRUp3Z1F2YW9BSFRuQ2ZQODdRaE5pQ2RkOFRqd3VNU1VEZ0FnOTR3QVZCbm9yU0puNlFLWVJYeVM2b0xjdFJkbElocThESU0vL0h5MXBBZ1N3ekJ3YkZ5N2xCckRBbDJYcGJCVU5ncXRBVjRnOHFGS0htTFRqQ0xwZE85YW9uSkNBQUlma0VDVElBL3dBc0JnQUJBRmdBWVFDbkFBQUFBUUVCQWdJQ0F3TURCQVFFQlFVRkJnWUdCd2NIQ0FnSUNRa0pDZ29LQ3dzTERBd01EUTBORGc0T0R3OFBFQkFRRVJFUkVoSVNFeE1URkJRVUZSVVZGaFlXRnhjWEdCZ1lHUmtaR2hvYUd4c2JIQndjSFIwZEhoNGVIeDhmSUNBZ0lTRWhJaUlpSXlNakpDUWtKU1VsSmlZbUp5Y25LQ2dvS1NrcEtpb3FLeXNyTEN3c0xTMHRMaTR1THk4dk1EQXdNVEV4TWpJeU16TXpORFEwTlRVMU5qWTJOemMzT0RnNE9UazVPam82T3pzN1BEdzhQVDA5UGo0K1B6OC9RRUJBUVVGQlFrSkNRME5EUkVSRVJVVkZSa1pHUjBkSFNFaElTVWxKU2twS1MwdExURXhNVFUxTlRrNU9UMDlQVUZCUVVWRlJVbEpTVTFOVFZGUlVWVlZWVmxaV1YxZFhXRmhZV1ZsWldscGFXMXRiWEZ4Y1hWMWRYbDVlWDE5ZllHQmdZV0ZoWW1KaVkyTmpaR1JrWldWbFptWm1aMmRuYUdob2FXbHBhbXBxYTJ0cmJHeHNiVzF0Ym01dWIyOXZjSEJ3Y1hGeGNuSnljM056ZEhSMGRYVjFkbloyZDNkM2VIaDRlWGw1ZW5wNmUzdDdmSHg4ZlgxOWZuNStmMzkvZ0lDQWdZR0Jnb0tDZzRPRGhJU0VoWVdGaG9hR2g0ZUhpSWlJaVltSmlvcUtpNHVMakl5TWpZMk5qbzZPajQrUGtKQ1FrWkdSa3BLU2s1T1RsSlNVbFpXVmxwYVdsNWVYbUppWW41MlRxcVNLdUsxK3pMcHIzc1ZZNmN4TjdzOUg4TkJGOE5CRjhOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5GRThORkU4TkZFOE5GRThORkU4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRzhkRkc4ZEZHOGRGRzhkRkg4ZEZIOGRGSDhkRkk4ZEZJOGRGSjhkSko4ZEpKOGRKSzhkSks4ZEpMOGRKTDhkSk04ZEpNOGROTjhkTk84ZE5QOGROUDhkTlE4ZE5ROGROUjh0UlM4dFJTOHRSVDh0UlY4dFZXOHRWWTh0Wlo4dFpiOHRkZTg5ZGc4OWhpODloajg5aGo4OWhrODlsbTg5bG85TnBxOU5wcjlOcHM5TnR0OU50dzlOeHk5Tnh6OU4xMTlOMTI5TjEzOU4xNTlkNTc5ZDkrOWQrQTllQ0Q5ZUdHOXVLSzl1T045dU9ROStXWCtPaWsrT3V1K2UyNCt1L0MrdkhKK3ZISU1zMHlDUDRBL3drY1NMQ2d3WU1JRGZZTE55Nmh3NGNRSTBxY1dJL2JNbWZkOGszY3lMSGpSbS9IY3VVNlZzNmp5Wk1uK1cwVEtiSmJQNVF3WXo3Y3g0MWxMbTR2WmVyYytZK21UWmM4Z3hMc1orN2J0M2dTZmJMRUtSSGVOMi9sY2dwMU9NNVpMMkRaNWtWVUtwSXBSSG5aZ1BWeVZuSnFRbnJaV1BZQ09yUG1VcWtKKzNrRHhqS2JQck1JMVVXejZhd2R4SDV1Yy9YeUZwSGRNNWF4cm1uRXE1QmJMN1hiNENJMFozVnNPb2o2dGowVzJjc3I0NExxRHJOTWh1NXZPVzdkU2tNc3A0d3Z2TThIKzNXalczZXhUbnhwV1FMckJoc2hQR3MyazZuak9lOVpMSmJXNlBWRytDMWtybGpKZWRLemRueGt3K1VINldrVE52YjZ6bjdmbFA3MU9zYk5OdmFDOUxweGl5cVUzemh1My9DZGg3bFBIVHA0N3RxMTQrYU8zM3k4K0tEVFRUYldQSE5NTXNvb2s0d3cwVml6elRmcCtQZGZUUDJrMDQwMXl0Qm0wNGJqTFpQTk4vTE0xNDlrRzZHempWVWJwcWppTWRGMEU2SkpJMHAwenpmV1dEUE9YUnZCd3cyS0t2YVlvakRXaEdOZVJQalFhTTAzKzBBVVRqSWlIWk9OT2lUR1ZvNDFHcXI0V0M5WCtqaFNOdXhJMUU4NTF6aVhqSGNJM1pNYlN4aTk1bEErM3JTbW9qREtSSk5OTjg0NDg0dzEzaEM0VEpWcVJjT2VRK3RzdzZSTjEwUTVrSmtwOW1LTmFnZlp3NDF6TnZXaVREYmVvQ1BmUWZtbzA4MDF5V3pHVnppRy9qUE9NNTdXRmFwQVM2cVl6WkFDMmJPTk1QNHBLck1OT2hKaVpzNDJ5NlNZakRkUlRxZWlNK1pBbE04MzBaU2FpM0FHM2NNTnJEWUJjdzA2cHlMVUR6clhNTXZTTWQrUUNJOHoxWWtFakRWL1FxUWpqN2xFTnhSSUd5YlRqVDBvMWRPTm0yZ0dpeDV3bkdHa0ZVZm9aTFBNTWMrVVJkQTQ4SXJrekRqUlJ0UlBWUnRhbythL3poeXp6RFpkbXNTUE91UXNQTkJ2R3dMTFV6bWljYmJOa1Ayc013NlVVK25qV0hCazZvVHd0ZUhNWjA3QXdyQUZFVDZzU3R1Y1RkRWd0UncrMm15WXphVVB6Y1BOTmRkNFU3TkIrR2ltRm0vTG9ST3dNOE5CNU0reVRYNGprVHQ3c2ZUTWk1OEI1dWxhQmY4ekQzVWlKUWIwUTNQcDFqSnM4R1F0c01VT3lXTWNjc3BGaERGTGlzRkdEdjZrTjRYOWp6elJkR3Z1WDkxNG1rekVlSGw5TGFOZkJVNzNST280bzV2VmpOVkRyMGpXMURNUjRJTFhIVkU5MTlpVWpkOG15UzA2Nlp3Lzd1WEp6MWx6dGxDc3FVWFk1bk5qN25sRTQwQ2FETnlmRytXNzcrd1d0UGUxS1Q4a2QrY2J4UzVTTW40VkZNL3Z2cE9qRVQ2UFltbjllT1VWVkE2a3l2QWV0K08yYnhSUHg4ZUlVOUE4cjE2UDVURzhodGVqTXVzVU5JNjEzVzgwRC9qbDNnNFJQUjNuc28zMmZMUEpNYlJoRFd0dDZCaU0rOGMzTktRTW5Vbmtmc2liQ0FSWm9nMEE5bWc4OGJqY2hxSnhyNEdVZzM3ZVM4Z0V3emNSZVBTdmdnVFJTNCtzZ1pSODFlaUYxcmlHdnp5b3U4dElFSCtEaTRnNEJqVVM4dzFsSFA3WHNFYURvdEdnSncwa0gvblJUenZjOFRxQjNJd3pzNU5JNmtnb2tmbU54aDBId1VjUzlRT1BKSFVrSFpMakROTWVXTHY4VFVSeHl3dWhUdUxodG5MaEtDSmpxMDRzVmpVUlJDR25pVHpKeDByUXBFYUZvR3NrbEpQSU9zSW9rdEY5Sm0zZUN1VG52RkVqYjd3eElvak1CVERXeGhpbkVRcVBEb21SL1RTNGpEN3F4QjVuR3NrTXpTSU92dG1sTjk4dzRNKzhaQTV2cEVhQ0doU0dEOW5XUm1Fb01pNVZ3Wkl6RWlpdDJkZ2toNGVzRXRRZ2trSEJCYzhoNkNDa0pHLzVtUXo2VEhNTythTkk2dWNRZDJpd1hOQVVTajlxOVM4ZVNsSm1CeWxIcnREa3dJUGNRMm1qR2FWQStFRzYySmlEUU56b29FRHl3Ym9tRlk4Z1NmN2JUR2U0V1JEdzhLMHovbkFlTjZ5UkRXaDVSQjNiY0JNd3R2SEl2MTB6Wnc2Qng0bWNFVStIZ0RGaCtrc2FYWHJ4TU1UWmJVZWw2cVJCa2hrcGJ2Q3puK2tnV1VKQW1URWJFbVI4M1JwTE4vU0hrSFZRS1VYTzRKMC9nNlBPamp5eFNiTjhLZjVFSW95c3RNVll1WWpaU2YvQnMxSlo0eDRvdVp2SHZGZ1FlaHBRakE5QkM0Y3drazJEaE1ZbXdxQmtSMlJUSlJhZWhVN0dzc2FwOW9IT1l4bnhJVDgxbzBjTUk4Q2cxbFJRYXZFTVF0QmhqV1FrUTRaaEF4MVltV213d29udWFQMEVrMSt6NFVtQnpBTWRsdHBJN242SnlZajJqelFidVFka3V5b1UzSUQxR2xnQ2htaEhTOXJTWXFWSzJnam9oQjR5V1MyNVZsY3VYZjV0UWdUNzJ0b1dzcUd5UFVna2JldWpZOXd6dHdVWkpHOWR5MEhnWmpWMHVqbUdjcGZMM09ZZXcxTnpYS3B4QjhMU3VwRGpHK0hJcm5hM205MXZsQ09VMlpEdWRQOVIzYTZjTVRDNUNPOTRFVkxldmlVRnZlcGRyMEhhcTFlSGNDVzk0cDB1ZmYxMjMvaktseUQwUGEvbzhtdmM5bTVESGt0MGg0SVh6T0Q4eUtObmVDTXdjTnQ3SUw5YStNSVlYaENoSkp6YmVvUnl1Q255NzM5YjlXRVEvMUsxSXhaSVpreHNwY2lrbUNEbGFDT0x2NFhGRncra1F0bncxREd1WVZyU2hza20ycUNwamNsaHJXUElpemxGUHJLTkNmSXlRa0gxSUdQalN6bVhUT0ptY2FPSjlkZ0dhbEZNNVlHVUVxelpLQWMrUm5RUGN2QllnRDJsc2psVzAyVU41Ylk1eEloZE1qcjY5OXBvMUxqTEJ4R0hNclcwU3p6anNsaGFVaFF2L1Z3UWRvQTBSY0NnNkpRSkhSdE5LYk5GSHYxTVFBQUFJZjRWVFdGa1pTQjNhWFJvSUZOamNtVmxibFJ2UjJsbUFEcz0iID4gICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9hbW91bnRfbW9uZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5X3NpZ24iPsKlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfbnVtIj4ke3Jlc3AuZGF0YS55b3VodWlxdWFufTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvbmRpdGlvbiI+JHtyZXNwLmRhdGEuY291cG9uX2luZm99PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3RpbWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGVybSI+5pyJ5pWI5pyfPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9kYXRlIj4ke3Jlc3AuZGF0YS5jb3Vwb25fZW5kX3RpbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jaXJjbGUiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGlua19jb3Vwb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6Ij4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ6aG1fZ2V0X2xpbmtfdGV4dCI+54K55Ye76aKG5Y+WPC9hPgogICAgICAgICAgICAgICAgPGRpdiBpZD0idGJxcmNvZGUiIGNsYXNzPSJ6aG1fcXJjb2RlIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1fZGl2X3MnKS5pbm5lckhUTUw9aHRtbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXJjb2RlID0gbmV3IFFSQ29kZSgidGJxcmNvZGUiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEYXJrIDogIiMxMjEyMTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTGlnaHQgOiAiI2ZmZmZmZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdExldmVsIDogUVJDb2RlLkNvcnJlY3RMZXZlbC5NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcmNvZGUubWFrZUNvZGUocmVzcC5kYXRhLmNvZGVfdXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQWN0aW9ucy0tcm9vdC0taHdFdWpnYycpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLXJvb3QtLWh3RXVqZ2MnKS5zdHlsZT0icG9zaXRpb246dW5zZXQiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXcgUVJDb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YnFyY29kZSIpLCByZXNwLmNvZGVfdXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aWsOWinumihuWIuOagt+W8jwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChfdGhpcy5ub3dOYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0bWFsbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0VG1hbGxDb3Vwb24od2ViLm5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0bWFsbENhb3NoaSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0VG1hbGxDYW9zaGlDb3Vwb24od2ViLm5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0YW9iYW8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50YW9iYW9Db3Vwb25TdHlsZShyZXNwLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdqZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0SmRDb3Vwb24od2ViLm5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcC5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0sY291cG9uV2FpdFRpbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdGl0bGXlj4LmlbDllYblk4HmoIfpophjc3PvvIxzaG9w5bqX6ZO65ZCN56ewY3NzCiAgICAgICAgICAgIGdldFRpdGxlU2hvcCh0aXRsZSxzaG9wTmFtZUNzcyl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiByZXNwKCl7CgogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc1RpdGxlRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQodGl0bGUpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgc2hvcE5hbWVEb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudChzaG9wTmFtZUNzc1swXSk/YXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoc2hvcE5hbWVDc3NbMF0pOmF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KHNob3BOYW1lQ3NzWzFdKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGdvb2RzVGl0bGUgPSBnb29kc1RpdGxlRG9tPyhnb29kc1RpdGxlRG9tLmdldEF0dHJpYnV0ZSgnZGF0YS10aXRsZScpP2dvb2RzVGl0bGVEb20uZ2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJyk6Z29vZHNUaXRsZURvbS5pbm5lclRleHQpOicnOwoKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGdvb2RzVGl0bGVEb20sc2hvcE5hbWVEb20pOwoKICAgICAgICAgICAgICAgICAgICAvL2xldCBnb29kc1RpdGxlPWdvb2RzVGl0bGVEb20/Z29vZHNUaXRsZURvbS5pbm5lclRleHQ6Jyc7CgogICAgICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZSA9IHNob3BOYW1lRG9tP3Nob3BOYW1lRG9tLmlubmVyVGV4dDonJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZGF0YS5nb29kc1RpdGxlID0gZ29vZHNUaXRsZTsKCiAgICAgICAgICAgICAgICAgICAgZGF0YS5zaG9wTmFtZSA9IHNob3BOYW1lOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3AoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRhb2Jhb0NvdXBvblN0eWxlKHJlc3ApewoKICAgICAgICAgICAgICAgIGxldCBvdGhlckRpc2NvdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0pfT3RoZXJEaXNjb3VudCcpOy8v5Yik5pat5LyY5oOg5Yy65piv5ZCm5a2Y5ZyoCgogICAgICAgICAgICAgICAgaWYoIW90aGVyRGlzY291bnQpcmV0dXJuOwoKICAgICAgICAgICAgICAgIGxldCBjb3Vwb25IdG1sID0gYAo8aW1nIGNsYXNzPSJ0Yi1jb3Vwb24taWNvbiIgc3JjPSIvL2ltZy5hbGljZG4uY29tL3Rwcy9UQjF4bG5PTnBYWFhYYTlhWFhYWFhYWFhYWFgtODAtMTYucG5nIj4KJHtyZXNwLnlvdWh1aXF1YW595YWD5bqX6ZO65LyY5oOg5Yi477yMJHtyZXNwLmNvdXBvbl9pbmZvfQo8YSBjbGFzcz0iSl9jb3Vwb24iIGhyZWY9IiMiIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL2FwaS50eXBlY2hyb21lLmNvbS9jb2RlLnBocD9saW5rPSR7cmVzcC5jb2RlX3VybH0nKSI+6aKG5Y+WPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBsZXQgdGJDb3Vwb24gPSBvdGhlckRpc2NvdW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50Yi1jb3Vwb24nKTsKCiAgICAgICAgICAgICAgICBpZih0YkNvdXBvbi5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgIGxldCB0YkNvdXBvbkltZ0RvbSA9IHRiQ291cG9uWzBdLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgaW1nU3JjID0gdGJDb3Vwb25JbWdEb20uc3JjP3RiQ291cG9uSW1nRG9tLnNyYzonLy9pbWcuYWxpY2RuLmNvbS90cHMvVEIxeGxuT05wWFhYWGE5YVhYWFhYWFhYWFhYLTgwLTE2LnBuZyc7CgogICAgICAgICAgICAgICAgICAgIGxldCBnZXRDb3Vwb25Eb20gPSB0YkNvdXBvblswXS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIGdldENvdXBvbkRvbS5pbm5lckhUTUwgPSBjb3Vwb25IdG1sOwoKICAgICAgICAgICAgICAgICAgICBnZXRDb3Vwb25Eb20ucXVlcnlTZWxlY3RvcignaW1nJykuc2V0QXR0cmlidXRlKCdzcmMnLGltZ1NyYyk7CgogICAgICAgICAgICAgICAgICAgIHRiQ291cG9uWzBdLmJlZm9yZShnZXRDb3Vwb25Eb20pOwoKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyRGlzY291biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX090aGVyRGlzY291bnQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYob3RoZXJEaXNjb3VuKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0Yk90aGVyRGlzY291bnQgPSBvdGhlckRpc2NvdW4ucXVlcnlTZWxlY3RvcignLnRiLW90aGVyLWRpc2NvdW50Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICB0Yk90aGVyRGlzY291bnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9InRiLW90aGVyLWRpc2NvdW50LWNvbnRlbnQgdGItb3RoZXItZGlzY291bnQtc3BsaXQiPjxkaXYgY2xhc3M9InRiLWNvdXBvbiI+JHtjb3Vwb25IdG1sfTwvZGl2PjwvZGl2PmA7CgogICAgICAgICAgICAgICAgICAgICAgICBvdGhlckRpc2NvdW4uY2xhc3NOYW1lPSd0Yi1jbGVhcic7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheVZpZGVvQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheU11c2ljQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB4bWx5Q3JlYXRlQ2hlY2tib3goKXsKCiAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0bGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc291bmQtbGlzdCB1bCBsaScpOwoKICAgICAgICAgICAgICAgIHNvdW5kTGlzdGxpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjaGVja2JveGVkID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjaGVja2JveGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcudGV4dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdGl0bGUuc3R5bGUgPSAid2lkdGg6MzYwcHgiOwoKICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gdGl0bGUucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgnaHJlZicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3REb20gPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5pY29uLXdyYXBwZXInKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RG9tID0gZmlyc3REb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICBpbnB1dERvbS5zdHlsZT0gJ21pbi13aWR0aDogMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3pobUNoZWNrYm94JyB2YWx1ZT0iK3NyYysiICBjbGFzcz0nemhtQ2hlY2tib3gnPiI7CgogICAgICAgICAgICAgICAgICAgIGZpcnN0RG9tLmJlZm9yZShpbnB1dERvbSk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNsYXNzIFpoQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaG93U3BlY2lhbENvbHVtbigpewoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRSZWNvbW1lbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJkUmVjb21tZW5kLmxlbmd0aCA+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhWm9wLmNhcmQuY29udGVudC50eXBlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTmFtZSA9ICdzcGVjaWFsQ29sdW1uIEJ1dHRvbiBWb3RlQnV0dG9uIFZvdGVCdXR0b24tLXVwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MHB4IDVweDttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6MnB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+aWh+eroCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9odHRwcz86XC9cL3d3dy56aGlodS5jb21cL3NlYXJjaC8pKXsKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXI9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjYwMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRTZWFyY2guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoJyx0eXBlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZSA9PSAnUG9zdCcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+ZGl2PmEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aXRsZSlyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAnc3BlY2lhbENvbHVtbiBCdXR0b24gVm90ZUJ1dHRvbiBWb3RlQnV0dG9uLS11cCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlID0gJ2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzowcHggNXB4O21hcmdpbi1yaWdodDo1cHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+aWh+eroCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5iZWZvcmUobmV3RWxlbWVudCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNob3dWaWRlb1RpdGxlKCl7CgogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZiA9PSAnaHR0cHM6Ly93d3cuemhpaHUuY29tLycpewoKICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFJlY29tbWVuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5GZWVkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKGNhcmRSZWNvbW1lbmQubGVuZ3RoID4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRSZWNvbW1lbmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhWm9wKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzVmlkZW8gPSBkYXRhWm9wLmNhcmQuaGFzX3ZpZGVvOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhc1ZpZGVvID09IHRydWUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5kaXY+YScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPmRpdj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmEnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTmFtZSA9ICd2aWRlb1RpdGxlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTMxLCA4NiwgMC4xMik7Y29sb3I6IHJnYigyNTUsIDczLCAxMik7bGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfop4bpopEnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5iZWZvcmUobmV3RWxlbWVudCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lcj0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXJkU2VhcmNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLlNlYXJjaFJlc3VsdC1DYXJkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihuKys+NjAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkU2VhcmNoLmxlbmd0aCA+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFNlYXJjaC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZSA9PSAnWnZpZGVvJyApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+ZGl2PmEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aXRsZSlyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAndmlkZW9UaXRsZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlID0gJ2JhY2tncm91bmQ6IHJnYmEoMjU1LCAxMzEsIDg2LCAwLjEyKTtjb2xvcjogcmdiKDI1NSwgNzMsIDEyKTtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MXB4IDZweDttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZToxNHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfop4bpopEnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlVmlkZW8oKXsKCiAgICAgICAgICAgICAgICBsZXQgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5GZWVkJyk7CgogICAgICAgICAgICAgICAgY2FyZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkYXRhWm9wLmNhcmQuY29udGVudC52aWRlb19pZDsKCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW8pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnROb2RlLnN0eWxlPSdkaXNwbGF5Om5vbmU7JzsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlQUQoKXsKCiAgICAgICAgICAgICAgICBsZXQgemhIaWRlQUQgPSBgLlBjLWNhcmQsLlBjLXdvcmR7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fS5Ub3BzdG9yeUl0ZW0tLWFkdmVydENhcmR7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9YDsKCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoemhIaWRlQUQpKTsKCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG93bmxvYWRWaWRlbygpewoKICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZVRpbWVyPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvRG9tLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPHZpZGVvRG9tLmxlbmd0aDtpKyspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5VXJsID0gdmlkZW9Eb21baV0uc3JjP3ZpZGVvRG9tW2ldLnNyYzpmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvUGxheVVybCljb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvSXRlbVBhcmVudERvbSA9IHZpZGVvRG9tW2ldLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9JdGVtUGFyZW50RG9tKWNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JdGVtRG9tID0gdmlkZW9JdGVtUGFyZW50RG9tLnF1ZXJ5U2VsZWN0b3IoJy5fanJvNnQwOmxhc3QtY2hpbGQgPiBkaXY6Zmlyc3QtY2hpbGQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvSXRlbURvbSljb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9JdGVtRG9tLmNsYXNzTmFtZSA9PSAnZG93bmxvYWRWaWRlbycpY29udGludWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1WaWRlb0l0ZW1Eb20gPSB2aWRlb0l0ZW1Eb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1WaWRlb0l0ZW1Eb20ucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1WaWRlb0l0ZW1Eb20uc2V0QXR0cmlidXRlKCdjbGFzcycsJ2Rvd25sb2FkVmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JdGVtRG9tLmJlZm9yZSh6aG1WaWRlb0l0ZW1Eb20pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtVmlkZW9JdGVtRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHZpZGVvUGxheVVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvTmFtZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpKycubXA0JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQodmlkZW9QbGF5VXJsLHZpZGVvTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMDApOwoKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVJpZ2h0KCl7CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLnpoaWh1XC5jb21cL3Blb3BsZVwvLiovKSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHpoRnVsbFNjcmVlbiA9IGAuR2xvYmFsU2lkZUJhciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30KICAgICAgICAgICAgICAgICAgICAuY3NzLTFxeXl0ajd7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30KICAgICAgICAgICAgICAgICAgICAuUXVlc3Rpb24tc2lkZUNvbHVtbntkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0KICAgICAgICAgICAgICAgICAgICAuVG9wc3RvcnktbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9CiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uLW1haW5Db2x1bW57d2lkdGg6MTAwMHB4ICFpbXBvcnRhbnR9CiAgICAgICAgICAgICAgICAgICAgLmNzcy1jYXpnNDh7bWFyZ2luOiAwcHggMTZweCAwcHggMHB4ICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbldhaXRpbmctbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5jc3MtMWo1ZDNsbHtwYWRkaW5nLWxlZnQ6MTBweDt9CiAgICAgICAgICAgICAgICAgICAgLmNzcy15aGp3b2V7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5BdXRob3JJbmZve21heC13aWR0aDoxMDAwcHggIWltcG9ydGFudDt9OwogICAgICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoemhGdWxsU2NyZWVuKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhbmdlTGluaygpewoKICAgICAgICAgICAgICAgIGlmKGNvdXBvblVybC5pbmRleE9mKCd0YXJnZXQnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLmdldFVybFBhcmFtcyhjb3Vwb25VcmwpOwoKICAgICAgICAgICAgICAgICAgICBpZihvYmoudGFyZ2V0ID09IHVuZGVmaW5lZCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRlY29kZVVSSUNvbXBvbmVudChvYmoudGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1saW5rOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUtleXdvcmQoKXsKCiAgICAgICAgICAgICAgICB2YXIgR01LZXl3b3JkID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJywnMCcpOwoKICAgICAgICAgICAgICAgIGlmKEdNS2V5d29yZCA9PSAnMCcgfHwgR01LZXl3b3JkID09ICcnKSByZXR1cm47CgogICAgICAgICAgICAgICAgbGV0IGtleXdvcmQgPSBHTUtleXdvcmQuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOwoKICAgICAgICAgICAgICAgIGtleXdvcmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZSh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVpvcCAmJiBkYXRhWm9wLnRpdGxlLmluZGV4T2YoaXRlbSkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZCA9IHZhbHVlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZENsYXNzPSBpdGVtQ2FyZC5jbGFzc05hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbUNhcmRDbGFzcy5pbmRleE9mKCdUb3BzdG9yeUl0ZW0taXNSZWNvbW1lbmQnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1DYXJkLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUF1dGhvck5hbWUoKXsKCiAgICAgICAgICAgICAgICB2YXIgR01BdXRob3JOYW1lID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJywnMCcpOwoKICAgICAgICAgICAgICAgIGlmKEdNQXV0aG9yTmFtZSA9PSAnMCcgfHwgR01BdXRob3JOYW1lID09ICcnKSByZXR1cm47CgogICAgICAgICAgICAgICAgbGV0IGF1dGhvck5hbWUgPSBHTUF1dGhvck5hbWUuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICAvL+aQnOe0oumhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJMaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNhcmQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVzZXJMaW5rLmxlbmd0aCA+IDUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJMaW5rLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvciA9IGl0ZW0ucXVlcnlTZWxlY3RvcignYicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvcil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihhdXRob3IuaW5uZXJUZXh0KSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihuPjMwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+WbnuetlOmhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5MaXN0LWl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbURvbS5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5Db250ZW50SXRlbScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoY29udGVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JOYW1lLmluZGV4T2YoZGF0YVpvcC5hdXRob3JOYW1lKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/nrYnkvaDlm57nrZTpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS9xdWVzdGlvbi93YWl0aW5nJyl7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVzdGlvbkxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanNOYXZpZ2FibGUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1ZXN0aW9uTGlzdC5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25MaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JEb21UZXh0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuY3NzLXRuc2F4aCcpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yRG9tVGV4dCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yID0gYXV0aG9yRG9tVGV4dC5yZXBsYWNlKCciJywnJykucmVwbGFjZSgn55qE5o+Q6ZeuJywnJykucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvcil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvcikgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlPSdkaXNwbGF5Om5vbmU7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5o6o6I2Q6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnRJdGVtJyk7CgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UodmFsdWUuZ2V0QXR0cmlidXRlKCdkYXRhLXpvcCcpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihkYXRhWm9wLmF1dGhvck5hbWUpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUNhcmQgPSB2YWx1ZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtQ2FyZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1DYXJkLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v6K+E6K665bGP6JS9CiAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgIGxldCB0aW1lckNsb3NlQXV0aG9yID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQ29tbWVudHMtY29udGFpbmVyJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkNvbW1lbnRzLWNvbnRhaW5lcicpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMzRwb2RyJyk7CgogICAgICAgICAgICAgICAgICAgIC8vbGV0IGNvbW1lbnRCb3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY3NzLTM0cG9kcicpOwoKICAgICAgICAgICAgICAgICAgICBpZihjb21tZW50RG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50TGkgPSBjb21tZW50RG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jc3MtMWZybjkzeD5kaXY+ZGl2Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjb21tZW50TGlbMF0uY2xhc3NOYW1lPT0nY3NzLTE5NHY3M20nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRBdXRob3JOYW1lRG9tID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuY3NzLTFyZDBoNmYnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRBdXRob3JOYW1lID0gY29tbWVudEF1dGhvck5hbWVEb20uaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JOYW1lLmluZGV4T2YoY29tbWVudEF1dGhvck5hbWUpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVlhbnh1YW4oKXsKCiAgICAgICAgICAgICAgICAvL+WbnuetlOmhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5MaXN0LWl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbURvbS5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQgJiYgY29udGVudC5pbm5lclRleHQuaW5kZXhPZign55uQ6YCJJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxldCBhbnN3ZXJDYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFuc3dlckNhcmQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoYW5zd2VyQ2FyZCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGFuc3dlckNhcmQucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tT3JkaW5hcnlMYWJlbC1jb250ZW50Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJDYXJkLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v5pCc57Si6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7CgogICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7CgogICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXJkTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5DYXJkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkTGlzdC5sZW5ndGggPiA1KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tUGNDb2xsZWdlQ2FyZC10eXBlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgJiYgdHlwZS5pbm5lclRleHQuaW5kZXhPZign55uQ6YCJ5LiT5qCPJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvciA9IGl0ZW0ucXVlcnlTZWxlY3RvcignYicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yWWFueHVhbiA9IFsn5pWF5LqL5qGj5qGI5bGAJywgJ+ebkOmAieaOqOiNkCcsICfnm5DpgInnp5Hmma4nLCAn55uQ6YCJ5oiQ6ZW/6K6h5YiSJywgJ+efpeS5juebkOmAieS8muWRmCcsICfnn6XkuY7nm5DpgInliJvkvZzogIUnLCAn55uQ6YCJ5b+D55CGJywgJ+ebkOmAieWBpeW6t+W/heS/ruivvicsICfnm5DpgInlpYflppnnianor60nLCAn55uQ6YCJ55Sf5rS76aaGJywgJ+ebkOmAieiBjOWcuicsICfnm5DpgInmloflrabnlITpgIknLCAn55uQ6YCJ5L2c6ICF5bCP566h5a62JywgJ+ebkOmAieWNmueJqemmhicsICfnm5DpgInngrnph5EnLCAn55uQ6YCJ5rWL6K+E5a6kJywgJ+ebkOmAieenkeaKgOWJjeayvycsICfnm5DpgInkvJrlkZjnsr7lk4EnLCAn5Y6G5Y+y546v5ri46K6wJ107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvciAmJiBhdXRob3JZYW54dWFuLmluZGV4T2YoYXV0aG9yLmlubmVyVGV4dCkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG51bT4zMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy/mjqjojZDpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudEl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCAmJiBjb250ZW50LmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgIknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlQXV0aG9yKCl7CiAgICAgICAgICAgICAgICAvL+mAmui/h+WumuaXtuWZqOiOt+WPlgoKICAgICAgICAgICAgICAgIGxldCB0aW1lckNsb3NlQXV0aG9yID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNsb3NlQXV0aG9yQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUNsb3NlQXV0aG9yQnV0dG9uJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKHpobUNsb3NlQXV0aG9yQnV0dG9uKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvckluZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY3NzLTFyZDZ1a20nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9ySW5mbyl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlck5hbWVJbmZvID0gYXV0aG9ySW5mby5xdWVyeVNlbGVjdG9yKCcuVXNlckxpbmsnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVzZXJOYW1lSW5mbyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXJMaW5rSW5mbyA9IHVzZXJOYW1lSW5mby5xdWVyeVNlbGVjdG9yKCcuVXNlckxpbmstbGluaycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JOYW1lTGluayA9IHVzZXJMaW5rSW5mby5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IEdNQXV0aG9yTmFtZSA9IEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JBcnJheSA9IEdNQXV0aG9yTmFtZT9HTUF1dGhvck5hbWUuc3BsaXQoJywnKTonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uQ2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5pbm5lckhUTUwgPSBhdXRob3JBcnJheS5pbmRleE9mKGF1dGhvck5hbWVMaW5rKSAhPSAtMT8n5bey5bGP6JS9Jzon5bGP6JS955So5oi3JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zdHlsZSA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8ncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjJlNGQ7Ym9yZGVyLWNvbG9yOiNmZjJlNGQnOidwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5jbGFzc05hbWU9J0J1dHRvbiBGb2xsb3dCdXR0b24gRkVmVXJkZk1JS3BRREpEcWtqdGUgQnV0dG9uLS1wcmltYXJ5IEJ1dHRvbi0tYmx1ZSBlcE1KbDBsRlF1WWJDN2pyd3JfbyBKbVl6YWt5N01FUE1GY0pETE5NRyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2Uuc2V0QXR0cmlidXRlKCdpZCcsJ3pobUNsb3NlQXV0aG9yQnV0dG9uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWVJbmZvLmFwcGVuZENoaWxkKGJ1dHRvbkNsb3NlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZUluZm8ucGFyZW50Tm9kZS5zdHlsZT0nbGluZS1oZWlnaHQ6MzVweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1BdXRob3JOYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihidXR0b25DbG9zZS5pbm5lckhUTUw9PSflt7LlsY/olL0nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8YXV0aG9yQXJyYXkubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yQXJyYXlbaV0gPT0gYXV0aG9yTmFtZUxpbmspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JBcnJheS5zcGxpY2UoaSwxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1BdXRob3JOYW1lID0gYXV0aG9yQXJyYXkudG9TdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1BdXRob3JOYW1lPSBHTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnKT9HTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnKSsnLCcrYXV0aG9yTmFtZUxpbms6YXV0aG9yTmFtZUxpbms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnLHpobUF1dGhvck5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzIyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8n5bGP6JS955So5oi3Jzon5bey5bGP6JS9JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2Uuc3R5bGUgPSBidXR0b25DbG9zZS5pbm5lckhUTUwgPT0gJ+W3suWxj+iUvSc/J3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjojZmYyZTRkO2JvcmRlci1jb2xvcjojZmYyZTRkJzoncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY2xhc3MgVmlkZW9Eb3dubG9hZENsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAvL+iOt+WPluaJgOacieinhumikQogICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHZpZGVvRG9tQWxsKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgaWYodmlkZW9Eb21BbGwubGVuZ3RoPT0wKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAvL+iOt+WPluW9k+WJjeinhumikQoKICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0FsbD1bXTsKCiAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgPTA7aTx2aWRlb0RvbUFsbC5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9wbGF5ID0gdmlkZW9Eb21BbGxbaV0uZ2V0QXR0cmlidXRlKCdhdXRvcGxheScpOwoKICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRvcGxheSAhPT0gbnVsbCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0FsbC5wdXNoKHZpZGVvRG9tQWxsW2ldKTsKCiAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0NvbnRhaW5lcj1sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ21vZGFsX2lkJykgIT0gLTE/dmlkZW9BbGxbMF06dmlkZW9BbGxbdmlkZW9BbGwubGVuZ3RoLTFdOwoKICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0NvbnRhaW5lcilyZXR1cm47CgogICAgICAgICAgICAgICAgICAgLy/op4bpopHlnLDlnYAKICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB2aWRlb0NvbnRhaW5lciAmJiB2aWRlb0NvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGg+MCAmJiB2aWRlb0NvbnRhaW5lci5jaGlsZHJlblswXS5zcmM/dmlkZW9Db250YWluZXIuY2hpbGRyZW5bMF0uc3JjOnZpZGVvQ29udGFpbmVyLnNyYzsKCiAgICAgICAgICAgICAgICAgICAvL+inhumikUlECgogICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvSWQ7CgogICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSB1cmwubWF0Y2goL14oaHR0cHM6KT9cL1wvLitcLmNvbVwvKFthLXpBLVowLTldKylcL1thLXpBLVowLTldK1wvdmlkZW8vKTsKCiAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gdXJsLm1hdGNoKC9ibG9iOmh0dHBzOlwvXC93d3cuZG91eWluLmNvbVwvKC4qKS8pOwoKICAgICAgICAgICAgICAgICAgIGlmKHJlc3AgJiYgcmVzcFsyXSl7CgogICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSWQ9cmVzcFsyXTsKCiAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihyZXMgJiYgcmVzWzFdKXsKCiAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JZD1yZXNbMV0KCiAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JZCA9IHZpZGVvQ29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS14Z3BsYXllcmlkJykKICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHZpZGVvSWQpOwogICAgICAgICAgICAgICAgICAgLy/miYDmnInop4bpopHmk43kvZzmjInpkq7ljLrln58KCiAgICAgICAgICAgICAgICAgICBsZXQgcGxheUNvbnRhaW5lciA9IHZpZGVvQ29udGFpbmVyLnBhcmVudE5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcueGctcmlnaHQtZ3JpZCcpOwoKICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5Q29udGFpbmVyKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb3dubG9hZERvbSA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcignI3pobUR5RG93bmxvYWQnK3ZpZGVvSWQpOwoKICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvRG93bmxvYWREb20pewoKICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gcGxheUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcueGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZycpOwoKICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IG49MDtuPGRvbS5sZW5ndGg7bisrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidG4gPSBkb21bbl0ucXVlcnlTZWxlY3RvcignLmJ0bicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tW25dLmlkICE9ICd6aG1EeURvd25sb2FkJyt2aWRlb0lkICYmIGJ0bi5pbm5lclRleHQ9PSfkuIvovb0nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21bbl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21bbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICBpZih2aWRlb0NvbnRhaW5lciAmJiBwbGF5Q29udGFpbmVyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlDbGFyaXR5RG9tID0gcGxheUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZycpOwoKICAgICAgICAgICAgICAgICAgICAgICBpZighcGxheUNsYXJpdHlEb20pe2NvbnNvbGUubG9nKCfmnKrojrflj5bmmbrog73mjInpkq7lhYPntKAnKTtyZXR1cm47fQoKICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFseUNsYXJpdHlCdG4gPSBwbGF5Q2xhcml0eURvbS5xdWVyeVNlbGVjdG9yKCcuYnRuJyk7CgogICAgICAgICAgICAgICAgICAgICAgIGlmKCFwYWx5Q2xhcml0eUJ0bil7Y29uc29sZS5sb2coJ+acquiOt+WPluaZuuiDveaWh+acrOWFg+e0oCcpO3JldHVybjt9CgogICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZERvbSA9IHBsYXlDbGFyaXR5RG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUR5RG93bmxvYWQnK3ZpZGVvSWQpOwoKICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5zdHlsZT0nbWFyZ2luLXRvcDotNjhweDtwYWRkaW5nLXRvcDoxMDBweDtwYWRkaW5nLWxlZnQ6MjBweDtwYWRkaW5nLXJpZ2h0OjIwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVGV4dCA9IGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJy5idG4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnN0eWxlID0gJ2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDsnOwoKICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdpZCcsJ3pobURvdXlpbkRvd25sb2FkJyt2aWRlb0lkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbCA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcigneGctaWNvbjpudGgtb2YtdHlwZSgxKScpLmNoaWxkcmVuWzBdOwoKICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKT9kZXRhaWwuZ2V0QXR0cmlidXRlKCdocmVmJyk6bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgaWYobGlua1VybC5pbmRleE9mKCd3d3cuZG91eWluLmNvbScpPT0tMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVXJsPScvL3d3dy5kb3V5aW4uY29tJytsaW5rVXJsOwogICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnZGF0YS11cmwnLGxpbmtVcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnaHJlZicsJ2phdmFzY3JpcHQ6dm9pZCgwKTsnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpcnR1YWxEb20gPSBkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcudmlydHVhbCcpOwoKICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3dubG9hZERvbS5jbGFzc05hbWU9J3hncGxheWVyLXBsYXljbGFyaXR5LXNldHRpbmcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbERvbS5zdHlsZT0nZGlzcGxheTpibG9jayAhaW1wb3J0YW50JzsKCiAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Rvd25sb2FkRG9tLmNsYXNzTmFtZT0neGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZyBkaXNhcHBlYXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsRG9tLnN0eWxlPSdkaXNwbGF5Om5vbmUgIWltcG9ydGFudCc7CiAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRIdG1sID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEh0bWwgKz0gYDxkaXYgY2xhc3M9Iml0ZW0gJHtpdGVtLmlkfSIgaWQ9IiR7aXRlbS5pZH0ke3ZpZGVvSWR9Ij4ke2l0ZW0ubmFtZX08L2Rpdj5gOwoKICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICBpZihkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcudmlydHVhbCcpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJy52aXJ0dWFsJykuaW5uZXJIVE1MID0gZG93bmxvYWRIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgIC8vcGxheUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb3dubG9hZERvbSk7CgogICAgICAgICAgICAgICAgICAgICAgIHBsYXlDbGFyaXR5RG9tLmFmdGVyKGRvd25sb2FkRG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvTGlua0RvbSA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvTGluaycrdmlkZW9JZCk7CgogICAgICAgICAgICAgICAgICAgICAgIGlmKHRvTGlua0RvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICB0b0xpbmtEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsLm1hdGNoKC9eYmxvYi8pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfliqDlr4bop4bpopHlnLDlnYDvvIzml6Dms5Xnm7TmjqXmiZPlvIAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvRG93bmxvYWREb20gPSBwbGF5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJyt2aWRlb0lkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgaWYodG9Eb3dubG9hZERvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICB0b0Rvd25sb2FkRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmwpO3JldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmwubWF0Y2goL15ibG9iLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+WKoOWvhuinhumikeWcsOWdgO+8jOaXoOazleS4i+i9vScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb0RvbSA9IHBsYXlDb250YWluZXIucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignLnZpZGVvLWluZm8tZGV0YWlsJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXNjSW5mbyA9IGluZm9Eb20/aW5mb0RvbTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuejhfVmV4UGYnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXNjSW5mbyAmJiBkZXNjSW5mby5pbm5lclRleHQgJiYgZGVzY0luZm8uaW5uZXJUZXh0LnJlcGxhY2VBbGwoJy4nLCcnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGRlc2NJbmZvLmlubmVyVGV4dC5yZXBsYWNlQWxsKCcuJywnJykrJy5tcDQnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKHVybCxmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQ29weURvbSA9IHBsYXlDb250YWluZXIucXVlcnlTZWxlY3RvcignI3RvQ29weScrdmlkZW9JZCk7CgogICAgICAgICAgICAgICAgICAgICAgIGlmKHRvQ29weURvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvcHlEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgIC8vY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb21BcnIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnBsYXllci12aWRlbycsMSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb21BcnIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IHZpZGVvRG9tQXJyLmxlbmd0aD4yP3ZpZGVvRG9tQXJyWzFdOnZpZGVvRG9tQXJyWzBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKS5tYXRjaCgvXmJsb2IvKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WIoOmZpOaui+eVmeS4i+i9vURPTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlkZW9Eb3dubG9hZERvbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jsb2Lop4bpopHml6Dms5XkuIvovb0nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUtzVmlkZW9Eb3dubG9hZCh2aWRlb0RvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RvbS5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJyxmdW5jdGlvbigpeyAvL+aSreaUvuS4rQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuS4rSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7nu5PmnZ8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2dldENvbnRyb2xzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF1dG8td2FycHBlcicpLmdldEF0dHJpYnV0ZSgnYXV0b3BsYXknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRvUGxheSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VGltZVRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdGFsJykuaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWNvbmQgPSBwbGF5VGltZVRvdGFsLm1hdGNoKC8oLispOiguKykvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vjb25kVG90YWwgPSBzZWNvbmRbMV0qNjArcGFyc2VJbnQoc2Vjb25kWzJdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVVybCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1Lc0Rvd25sb2FkJykuZ2V0QXR0cmlidXRlKCdkYXRhLXVybCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhY2NvdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2ZpbGUtdXNlci1uYW1lLXRpdGxlJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2ZpbGUtdXNlci1uYW1lLXRpdGxlJykuaW5uZXJUZXh0OmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkLWF1dGhvcicpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8taW5mby10aXRsZScpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1pbmZvLXRpdGxlJykuaW5uZXJUZXh0Om5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0ZpbGVOYW1lID0gKGFjY291bnQgJiYgdGl0bGUpP2FjY291bnQrJy0nK3RpdGxlKycubXA0JzpuZXcgRGF0ZSgpLmdldFRpbWUoKSsnLm1wNCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKGRhdGFVcmwsdmlkZW9GaWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2Vjb25kVG90YWw8MzApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRmlsZU5hbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSsnLm1wNCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZChkYXRhVXJsLHZpZGVvRmlsZU5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRhdGFVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvTGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGdldENvbnRyb2xzKTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5jb2RlPT0nQXJyb3dEb3duJyB8fCBlLmNvZGU9PSdBcnJvd1VwJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0pCgoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSAvXmh0dHBzPzpcL1wvd3d3XC5rdWFpc2hvdVwuY29tXC8oLispLzsKCiAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IGxvY2F0aW9uLmhyZWYubWF0Y2gobWF0Y2gpOwoKICAgICAgICAgICAgICAgIGlmKCFyZXNwIHx8IChyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgPT0gLTEgJiYgcmVzcFsxXS5pbmRleE9mKCd2aWRlbycpID09LTEgJiYgcmVzcFsxXS5pbmRleE9mKCduZXctcmVjbycpID09IC0xKSl7CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3kuI3mmK/op4bpopHmkq3mlL7pobUnKTtyZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYocmVzcFsxXS5pbmRleE9mKCdzaG9ydC12aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXllckFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tY29udGFpbmVyLXBsYXllcicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyQXJlYVdpZHRoID0gcGxheWVyQXJlYS5zdHlsZS53aWR0aC5tYXRjaCgvKC4rKXB4Lyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJCYXJQcm9ncmVzcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItYmFyLXByb2dyZXNzJyk7CgogICAgICAgICAgICAgICAgICAgIHBsYXllckJhclByb2dyZXNzLnN0eWxlLndpZHRoID0gcGxheWVyQXJlYVdpZHRoWzFdLTMyMCsncHgnOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdGFsJyk7CgogICAgICAgICAgICAgICAgICAgIHRpbWVUb3RhbC5zdHlsZS5yaWdodD0nMTgwcHgnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodCcpOwoKICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb3dubG9hZERvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvRG93bmxvYWREb20pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBkZXRhaWxEb20gPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKTsKCiAgICAgICAgICAgICAgICBsZXQgeGdJY29uID0gZGV0YWlsRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJyk7CgogICAgICAgICAgICAgICAgeGdJY29uLnF1ZXJ5U2VsZWN0b3IoJy5rd2FpLXBsYXllci12b2x1bWUtc291bmQnKS5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J2N1cnNvcjpwb2ludGVyOyc+5LiL6L29PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBsZXQgc2xpZGVyID0geGdJY29uLnF1ZXJ5U2VsZWN0b3IoJy5wbC1zbGlkZXInKTsKCiAgICAgICAgICAgICAgICAvL3NsaWRlci5zdHlsZSA9ICd3aWR0aDo0OXB4O3BhZGRpbmc6MTBweCA1cHggMjBweDsnOwoKICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpc3QgPSAnJzsKCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZExpc3QgKz0gYDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTBweDtjb2xvcjojRkZGO2N1cnNvcjpwb2ludGVyOyIgaWQ9IiR7aXRlbS5pZH0iPiR7aXRlbS5uYW1lfTwvZGl2PmA7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICBzbGlkZXIuaW5uZXJIVE1MID0gZG93bmxvYWRMaXN0OwoKICAgICAgICAgICAgICAgIHhnSWNvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyxsaW5rVXJsKTsKCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICB4Z0ljb24uc3R5bGU9J2hlaWdodDo4MHB4Oyc7CgogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmJlZm9yZSh4Z0ljb24pOwoKICAgICAgICAgICAgICAgIHhnSWNvbi5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAvL2Rvd25sb2FkRG9tLmNsYXNzTmFtZT0neGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZyc7CgogICAgICAgICAgICAgICAgICAgIHNsaWRlci5zdHlsZT0gJ21hcmdpbi10b3A6MTBweDt3aWR0aDo0OXB4O3BhZGRpbmc6MTBweCA1cHggMjBweDtkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB4Z0ljb24ub25tb3VzZW91dD1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAvL2Rvd25sb2FkRG9tLmNsYXNzTmFtZT0neGdwbGF5ZXItcGxheWNsYXJpdHktc2V0dGluZyBkaXNhcHBlYXInOwogICAgICAgICAgICAgICAgICAgIHNsaWRlci5zdHlsZT0nZGlzcGxheTpub25lICFpbXBvcnRhbnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgLy/ph43mnoTmkq3mlL7mk43kvZzmjInpkq4KCiAgICAgICAgICAgICAgICBsZXQgemhtS3NCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NCdXR0b24nKTsKCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHpobUtzQnV0dG9uKTsKCiAgICAgICAgICAgICAgICBpZih6aG1Lc0J1dHRvbil7CgogICAgICAgICAgICAgICAgICAgIC8vemhtS3NCdXR0b24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh6aG1Lc0J1dHRvbik7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uSWNvbiA9IGRldGFpbERvbS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGJ1dHRvbkljb24pOwogICAgICAgICAgICAgICAgYnV0dG9uSWNvbi5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtS3NCdXR0b24nKTsKCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uSWNvbkltZyA9IGJ1dHRvbkljb24ucXVlcnlTZWxlY3RvcignLnVubXV0ZWQtaWNvbicpOwoKICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkljb25JbWcpewogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkljb25JbWcuc3R5bGUgPSAnYmFja2dyb3VuZDogdXJsKGh0dHBzOi8vczItMTA2MjMua3dpbWdzLmNvbS91ZGF0YS9wa2cvY2xvdWRjZG4vaW1nL3BsYXllci1zZXR0aW5nLmFkMWY1Y2U4LnN2Zykgbm8tcmVwZWF0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRldGFpbERvbS5hZnRlcihidXR0b25JY29uKTsKCiAgICAgICAgICAgICAgICBsZXQgcGxTbGlkZXIgPSBidXR0b25JY29uLnF1ZXJ5U2VsZWN0b3IoJy5wbC1zbGlkZXInKTsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5zdHlsZT0nd2lkdGg6YXV0bztwYWRkaW5nOjEwcHggMTBweCAyNXB4IDEwcHg7JzsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5pbm5lckhUTUwgPSAiIjsKCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uRm91ciA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg0KScpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbkZvdXIuc3R5bGUubWFyZ2luPScwcHgnOwoKICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5LXNldHRpbmctY29udGFpbmVyJyk7CgogICAgICAgICAgICAgICAgaWYoYXV0b1BsYXkpewogICAgICAgICAgICAgICAgICAgIGF1dG9QbGF5LnN0eWxlLm1hcmdpbj0nMHB4IDQwcHggMHB4IDBweCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uRml2ZSA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg1KScpOwoKICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkZpdmUpewoKICAgICAgICAgICAgICAgICAgICBidXR0b25GaXZlLnN0eWxlLm1hcmdpbj0nMTVweCAwcHgnOwoKICAgICAgICAgICAgICAgICAgICBidXR0b25GaXZlLm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItcm90YXRlLXRvb2x0aXAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0b29sVGlwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvb2xUaXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sMzApCgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcGxTbGlkZXIuYXBwZW5kQ2hpbGQoYnV0dG9uRml2ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uU2l4ID0gY29udHJvbHMucXVlcnlTZWxlY3RvcignZGl2Om50aC1vZi10eXBlKDYpJyk7CgogICAgICAgICAgICAgICAgaWYoYnV0dG9uU2l4KXsKCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uU2l4LnN0eWxlLm1hcmdpbj0nMTVweCAwcHgnOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbFRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rd2FpLXBsYXllci1mdWxsc2NyZWVuLXRvb2x0aXAnKTsKCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uU2l4Lm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItZnVsbHNjcmVlbi10b29sdGlwJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9vbFRpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b29sVGlwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9LDMwKQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHBsU2xpZGVyLmFwcGVuZENoaWxkKGJ1dHRvblNpeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25Gb3VyKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHhpZ3VhVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgndmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZVhpZ3VhVmlkZW9Eb3dubG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogImdldCIsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cDovLzQ3Ljk5LjE1OC4xMTgvdmlkZW8tY3JhY2svdjIvcGFyc2U/Y29udGVudD0nK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0FjY2VwdCc6ICd0ZXh0L3BsYWluLCB0ZXh0L2h0bWwsYXBwbGljYXRpb24vanNvbid9LAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24ocmVzKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzPT0yMDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwID0gSlNPTi5wYXJzZShyZXMucmVzcG9uc2VUZXh0KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NyYyA9ICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU3JjID0gcmVzcC5kYXRhLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codmlkZW9TcmMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9Eb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb1NyYyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9UaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlIGgxJykuaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0F1dGhvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hdXRob3JfX3VzZXJOYW1lJykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfmraPlnKjkuIvovb3or7fnqI3kvq8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQodmlkZW9TcmMsdmlkZW9UaXRsZSsnQCcrdmlkZW9BdXRob3IrJy5tcDQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0NvcHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeS4jeiDveWkjeWItuWcsOWdgCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodmlkZW9TcmMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvTGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb1NyYyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5LiN6IO955u05o6l5omT5byAJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb1NyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmNsYXNzTmFtZSA9PSAneGdwbGF5ZXItY29udHJvbC1pdGVtIGNvbnRyb2xfcGxheW5leHQgY29tbW9uLWNvbnRyb2wtaXRlbScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmpMaW5rID0ge307CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaHJlZil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLmhyZWYgPSBpdGVtLmhyZWY/aXRlbS5ocmVmOicnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay50YXJnZXQgPSBpdGVtLnRhcmdldD9pdGVtLnRhcmdldDonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvYmpMaW5rLmhyZWYgJiYgb2JqTGluay50YXJnZXQgIT0gJ19ibGFuaycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gb2JqTGluay5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yIDogZnVuY3Rpb24oZXJyKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7nu5PmnZ8iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhnLXN3aXRjaC1jaGVja2VkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1NTAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlWGlndWFWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgbGV0IHJpZ2h0R3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Zy1yaWdodC1ncmlkJyk7CgogICAgICAgICAgICAgICAgbGV0IHBsYXlDb250cm9sID0gcmlnaHRHcmlkLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgyKScpOwoKICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcGxheUNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgIGxldCBlbnRyeT0gY29udHJvbC5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItY29udHJvbC1pdGVtX19lbnRyeScpOwoKICAgICAgICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJ4Z3BjUGxheWVyX3RleHRFbnRyeSI+PHNwYW4+5LiL6L29PC9zcGFuPjwvZGl2Pic7CgogICAgICAgICAgICAgICAgbGV0IHBvcG92ZXIgPSBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1jb250cm9sLWl0ZW1fX3BvcG92ZXInKTsKCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRMaXN0ID0gJzx1bD4nOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGlzdCArPSBgPGxpIHRhYmluZGV4PSIwIiByb2xlPSJtZW51aXRlbXJhZGlvIiBhcmlhLWNoZWNrZWQ9ImZhbHNlIiBpZD0iJHtpdGVtLmlkfSI+JHtpdGVtLm5hbWV9PC9saT5gOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9ICc8L3VsPic7CgogICAgICAgICAgICAgICAgcG9wb3Zlci5pbm5lckhUTUwgPSBkb3dubG9hZExpc3Q7CgogICAgICAgICAgICAgICAgcGxheUNvbnRyb2wuYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgICAgICBkaXZEb20uc3R5bGU9IndpZHRoOiA4MHB4OyBoZWlnaHQ6IDE0MHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo0MHB4O2xlZnQ6MjBweDt6LWluZGV4Oi0xIjsKCiAgICAgICAgICAgICAgICBjb250cm9sLmFwcGVuZENoaWxkKGRpdkRvbSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBwb3BvdmVyLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIHBvcG92ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmlnaHRDb250cm9sID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1jb250cm9sbGVyLXdyYXAtcmlnaHQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmlnaHRDb250cm9sKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJpbGliaWxpLXBsYXllci12aWRlby1idG4tcXVhbGl0eScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tT3RoZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZG9tT3RoZXIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuKys+MzApY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IFt7bmFtZTondmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOidid3BfdmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOicuYmlsaWJpbGktcGxheWVyLXZpZGVvJyx0eXBlOidjbGFzcyd9XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwO2k8dmlkZW9Eb20ubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IHZpZGVvRG9tW2ldLnR5cGUgPT0gJ2RvbSc/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih2aWRlb0RvbVtpXS5uYW1lKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZpZGVvRG9tW2ldLm5hbWUpLmZpcnN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy/lj5bmtojlrprml7blmagKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuW8gOWniyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmlsaURvd25sb2FkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiaWxpRG93bmxvYWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWxpRG93bmxvYWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiaWxpRG93bmxvYWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgLy/lsY/olL3nmbvlvZXlvLnmoYYKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICBpZih2aWRlbyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmmoLlgZwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iaWxpLW1pbmktY2xvc2UtaWNvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjbG9zZUljb24pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjbG9zZUljb24pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VJY29uLmNsaWNrKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1MCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsaURvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKGRvd25sb2FkSWNvbil7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfkuIvovb3mjInpkq7lt7LlrZjlnKgnKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2Jhbmd1bWknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVhbGl0eSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuc3F1aXJ0bGUtcXVhbGl0eS13cmFwJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighcXVhbGl0eSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBxdWFsaXR5LmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnNxdWlydGxlLXZpZGVvLXF1YWxpdHktdGV4dCcpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnNxdWlydGxlLXZpZGVvLXF1YWxpdHktdGV4dCcpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eS5iZWZvcmUoY29udHJvbCk7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b0ljb25Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLmJpbGliaWxpLXBsYXllci12aWRlby1idG4tcXVhbGl0eScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWF1dG9JY29uRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBhdXRvSWNvbkRvbS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnVpLXNlbGVjdC1yZXN1bHQnKS5pbm5lclRleHQ9J+S4i+i9vSc7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5idWktc2VsZWN0LXJlc3VsdCcpLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JY29uRG9tLmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5b2T5YmN6aG16Z2i5LiN5piv6KeG6aKR5oiW55Wq5YmnJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidmlkID0gJycsYXZpZD0nJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF2LWxpbmsnKS5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9odHRwczpcL1wvd3d3LmJpbGliaWxpLmNvbVwvdmlkZW9cLyguKylcPy8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlkID0gcGFyYW1zWzFdLnJlcGxhY2UoJ2F2JywnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W9k+WJjemhtemdouaXoOazleS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJ2aWQgJiYgIWF2aWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5Zidmlk5oiWYXZpZCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YnZpZD0iK2J2aWQrIiZhaWQ9IithdmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHkv6Hmga/mjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/pgInpm4ZjaWQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gX3RoaXMuZ2V0UXVlcnlTdHJpbmcoJ3AnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUlkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLnBhZ2VzW3BhZ2VJZC0xXS5jaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5jaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2lkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPTExMic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IF90aGlzLnJlcXVlc3QoJ2dldCcsbGluaykudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb2RlIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHlnLDlnYDmjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBkYXRhLmRhdGEuZHVybFswXS51cmw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vR01fZG93bmxvYWQoZG93bmxvYWRVcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbihkb3dubG9hZFVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlQmlsaVZpZGVvRG93bmxvYWRPdGhlcigpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoZG93bmxvYWRJY29uKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4i+i9veaMiemSruW3suWtmOWcqCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWFsaXR5ID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1xdWFsaXR5LXdyYXAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFxdWFsaXR5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHF1YWxpdHkuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvSWNvbkRvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFhdXRvSWNvbkRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gYXV0b0ljb25Eb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29udHJvbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnN0eWxlPSdtYXJnaW4tdG9wOi04MHB4O3BhZGRpbmctdG9wOjgwcHg7bWFyZ2luLXJpZ2h0OjIwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLmJweC1wbGF5ZXItY3RybC1xdWFsaXR5LXJlc3VsdCcpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLmJweC1wbGF5ZXItY3RybC1xdWFsaXR5LW1lbnUnKS5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW1zID0gY29udHJvbC5xdWVyeVNlbGVjdG9yQWxsKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktbWVudS1pdGVtJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVZhbHVlID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhVmFsdWUgIT0gMTYgJiYgZGF0YVZhbHVlICE9IDgwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBhdXRvSWNvbkRvbS5iZWZvcmUoY29udHJvbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNsYXNzTmFtZT0nYnB4LXBsYXllci1jdHJsLWJ0biBicHgtcGxheWVyLWN0cmwtcXVhbGl0eSBicHgtc3RhdGUtc2hvdyc7CgogICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNsYXNzTmFtZT0nYnB4LXBsYXllci1jdHJsLWJ0biBicHgtcGxheWVyLWN0cmwtcXVhbGl0eSc7CiAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pobXpnaLkuI3mmK/op4bpopHmiJbnlarliacnKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiaWxpRGF0YVZhbHVlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLVZhbHVlJyk/ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLVZhbHVlJyk6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYmlsaURhdGFWYWx1ZSlyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnZpZCA9ICcnLGF2aWQ9Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2Jhbmd1bWknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnZpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hdi1saW5rJykuaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm93VXJsID0gbG9jYXRpb24uaHJlZi5zcGxpdCgnPycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBub3dVcmxbMF0ubWF0Y2goL2h0dHBzOlwvXC93d3cuYmlsaWJpbGkuY29tXC92aWRlb1wvKC4rKS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlkID0gcGFyYW1zWzFdLnJlcGxhY2UoJ2F2JywnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W9k+WJjemhtemdouaXoOazleS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJ2aWQgJiYgIWF2aWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5Zidmlk5oiWYXZpZCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YnZpZD0iK2J2aWQrIiZhaWQ9IithdmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHkv6Hmga/mjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/pgInpm4ZjaWQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gX3RoaXMuZ2V0UXVlcnlTdHJpbmcoJ3AnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUlkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLnBhZ2VzW3BhZ2VJZC0xXS5jaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5jaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSAnaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvcGxheWVyL3BsYXl1cmw/YXZpZD0nK3Jlc3AuZGF0YS5haWQrJyZjaWQ9JytjaWQrJyZxbj0nK2JpbGlEYXRhVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IF90aGlzLnJlcXVlc3QoJ2dldCcsbGluaywnJyx0cnVlKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvZGUgPCAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeWcsOWdgOaOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFVybCA9IGRhdGEuZGF0YS5kdXJsWzBdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRvd25sb2FkVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wueW91dHViZVwuY29tXC8od2F0Y2hcP3Y9Lit8c2hvcnRzXC8uKykvKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodXJsKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5b3V0dWJlSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih5b3V0dWJlSWNvbil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3V0dWJlSWNvbi5zdHlsZS5vcGFjaXR5PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy56aG1Mb2dvKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2xpbmUnIHN0eWxlPSdoZWlnaHQ6YXV0bzsnPiI7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fcGxheV92aWRlX2xpbmVfdWwnPiI7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMScsdXJsOidodHRwczovL3poLnNhdmVmcm9tLm5ldC8xNzYvI3VybD0nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot68yJyx1cmw6J2h0dHBzOi8vbXlkb3duZG93bi5jb20veTIjJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMycsdXJsOidodHRwczovL3d3dy55dGRvd25may5jb20vc2VhcmNoP3VybD0nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot680Jyx1cmw6J2h0dHBzOi8veW91dC5jb20vdmlkZW8vP3VybD0nfQogICAgICAgICAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjwvdWw+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobWxvZ28nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZURvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uY2xhc3NOYW1lID0gJ3BsYXlMaW5lRGl2IHpobV9wbGF5X3ZpZGVvX3dyYXAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lRG9tLmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHpobVBsYXkuYXBwZW5kQ2hpbGQocGxheUxpbmVEb20pOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnpobUxvZ29EcmFnKCd5b3V0dWJlJywnJyk7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtSWNvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtSWNvbil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtSWNvbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHpobUljb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobWxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtbG9nbyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1sb2dvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtbG9nbyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtbG9nby5zdHlsZS5vcGFjaXR5PTA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0sNTAwKQoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsYXNzIFZlcnNpb25DbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sKCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CgogICAgICAgICAgICAgICAgc3VwZXIoKTsKCiAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25VcmwgPSAnaHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2Jlbi8tL3Jhdy9tYWluL1JFQURNRS5tZD9yZWZfdHlwZT1oZWFkcyc7CgogICAgICAgICAgICAgICAgdGhpcy5yZW5ld1ZlcnNpb25VcmwgPSAnaHR0cHM6Ly9naXRsYWIuY29tL2xhbmhhaGEvbGFucmVuamlhb2JlbiMlRTYlOUIlQjQlRTYlOTYlQjAlRTYlOTclQTUlRTUlQkYlOTcnOwoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgX3RoaXMuY2hlY2tUaW1lKCk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFyZXNwKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2hlY2tSdW5UaW1lKCk7CgogICAgICAgICAgICAgICAgfSkoKQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0VmVyc2lvbihtb3RoZWQsdXJsKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CgogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1vdGhlZCwKCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLAoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsCgogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0FjY2VwdCc6ICd0ZXh0L3BsYWluLCB0ZXh0L2h0bWwsYXBwbGljYXRpb24vanNvbid9LAoKICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXMpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNBcnJheSA9IHJlcy5yZXNwb25zZVRleHQuc3BsaXQoJ1xuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25BcnJheT1bXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPHJlc0FycmF5Lmxlbmd0aDtpKyspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNBcnJheVtpXS5tYXRjaCgvXihbMC05OTldezEsM30pXC4/KFswLTk5OV17MSwzfSk/XC4/KFswLTk5OV17MSwzfSk/JC8pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25BcnJheS5wdXNoKHJlc0FycmF5W2ldKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZlcnNpb25BcnJheSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yIDogZnVuY3Rpb24oZXJyKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoZWNrVGltZSgpewoKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGxldCBpbnN0YWxsVGltZSA9IEdNX2dldFZhbHVlKCdpbnN0YWxsVGltZScsMCk7CgogICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpOwoKICAgICAgICAgICAgICAgIGxldCBkYXRlTm93VGltZSA9IGRhdGUuZ2V0VGltZSgpOwoKICAgICAgICAgICAgICAgIGxldCBpbnRlcnZhbFRpbWUgPSA4NjQwMCoxMDAwOwoKICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uSW50ZXJ2YWxUaW1lID0gODY0MDAqMTAwMDsKCiAgICAgICAgICAgICAgICBpZihpbnN0YWxsVGltZSl7CgogICAgICAgICAgICAgICAgICAgIGlmKGRhdGVOb3dUaW1lLWludGVydmFsVGltZT5pbnN0YWxsVGltZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0VmVyc2lvblRpbWUgPSBHTV9nZXRWYWx1ZSgnZ2V0VmVyc2lvblRpbWUnLDApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZU5vd1RpbWUtdmVyc2lvbkludGVydmFsVGltZSA+IGdldFZlcnNpb25UaW1lKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm93VGltZSA9IGRhdGUuZ2V0VGltZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbkFycj0gYXdhaXQgX3RoaXMuZ2V0VmVyc2lvbignZ2V0JyxfdGhpcy52ZXJzaW9uVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmVyc2lvbkFyci5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInojrflj5bliLDniYjmnKzlj7cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uT2JqPXZlcnNpb25BcnJbMF0uc3BsaXQoJy4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmVyc2lvbk9ubGluZSA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy52ZXJzaW9uT25saW5lWzBdID0gdmVyc2lvbk9ialswXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmVyc2lvbk9ubGluZVsxXSA9IHZlcnNpb25PYmpbMV0/dmVyc2lvbk9ialsxXTowOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy52ZXJzaW9uT25saW5lWzJdID0gdmVyc2lvbk9ialsyXT92ZXJzaW9uT2JqWzJdOjA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2ZXJzaW9uTm93ID0gR01faW5mby5zY3JpcHQudmVyc2lvbi5zcGxpdCgnLicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhfdGhpcy52ZXJzaW9uT25saW5lLHZlcnNpb25Ob3cpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8MztpKyspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyc2VJbnQoX3RoaXMudmVyc2lvbk9ubGluZVtpXSkgPiBwYXJzZUludCh2ZXJzaW9uTm93W2ldKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9aTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdnZXRWZXJzaW9uVGltZScsZGF0ZU5vd1RpbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgndmNvZGVSZXN1bHQnLGluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3ZlcnNpb25PbmxpbmUnLF90aGlzLnZlcnNpb25PbmxpbmUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCkKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2luc3RhbGxUaW1lJyxkYXRlTm93VGltZSk7CgogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpOwoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB9KQoKICAgICAgICB9CgogICAgICAgICAgICBjaGVja1J1blRpbWUoKXsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICBsZXQgZGF0ZU5vd1RpbWUgPSBkYXRlLmdldFRpbWUoKTsKCiAgICAgICAgICAgIGxldCBydW5UaXBUaW1lID0gR01fZ2V0VmFsdWUoJ3J1blRpcFRpbWUnLDApOy8v5by55qGG5pe26Ze0CgogICAgICAgICAgICBsZXQgdmNvZGVSZXN1bHQgPSBHTV9nZXRWYWx1ZSgndmNvZGVSZXN1bHQnKTsKCiAgICAgICAgICAgIF90aGlzLnZlcnNpb25PbmxpbmUgPSBHTV9nZXRWYWx1ZSgndmVyc2lvbk9ubGluZScpOwoKICAgICAgICAgICAgbGV0IHRpcEludGVydmFsVGltZSA9IDM2MDAqMTAwMDsKCiAgICAgICAgICAgIGlmKGRhdGVOb3dUaW1lLXJ1blRpcFRpbWUgPiB0aXBJbnRlcnZhbFRpbWUgJiYgdmNvZGVSZXN1bHQgIT0gJ3VuZGVmaW5lZCcpewoKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdydW5UaXBUaW1lJyxkYXRlTm93VGltZSk7CgogICAgICAgICAgICAgICAgc3dpdGNoKHZjb2RlUmVzdWx0KXsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zaG93VGlwUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgICAgIHNob3dUaXBQYWdlKCl7CgogICAgICAgICAgICAgICAgbGV0IHNldEh0bWwgPSI8ZGl2IGNsYXNzPSd3cmFwLWJveCcgc3R5bGU9J3RvcDphdXRvO2xlZnQ6YXV0bztib3R0b206NXB4O3JpZ2h0OjVweDt0cmFuc2Zvcm06bm9uZTtib3gtc2hhZG93OiAwcHggMHB4IDVweCAjODg4Oyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnIHN0eWxlPSdqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc+PHNwYW4+5Y+R546w5paw54mI5pysPC9zcGFuPjwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0naGVpZ2h0OjgwcHg7IGRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OmNlbnRlcjsgYWxpZ24taXRlbXM6Y2VudGVyOyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxwIHN0eWxlPSd3aWR0aDoyNDBweDt3b3JkLWJyZWFrOmJyZWFrLWFsbDtsaW5lLWhlaWdodDoyNnB4Oyc+5paw54mI5pysIDxhIGhyZWY9JyIrdGhpcy5yZW5ld1ZlcnNpb25VcmwrIicgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPSdjb2xvcjojZmU2ZDczOyc+diIrdGhpcy52ZXJzaW9uT25saW5lLmpvaW4oJy4nKSsiPC9hPiDlt7Llj5HluIPjgII8cD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J2Rpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OmNlbnRlcjsgYWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOjMwMHB4O2hlaWdodDo0MHB4O2JhY2tncm91bmQ6ICNmZWY5ZWY7Zm9udC1zaXplOjE0cHg7Jz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHNwYW4gaWQ9J3RpcFJlbmV3JyBzdHlsZT0nd2lkdGg6NTAlO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjogcG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7Y29sb3I6I2ZmZjtoZWlnaHQ6NDBweDtsaW5lLWhlaWdodDo0MHB4Oyc+5p+l55yL5pu05pawPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8c3BhbiBpZD0ndGlwQmFja09uJyBzdHlsZT0nd2lkdGg6NTAlO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjogcG9pbnRlcjsnPuW/veeVpTwvc3Bhbj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgIGxldCB0aXBQYWdlV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgICAgIHRpcFBhZ2VXcmFwLmlkPSd0aXBXcmFwJzsKCiAgICAgICAgICAgICAgICB0aXBQYWdlV3JhcC5pbm5lckhUTUwgPSBzZXRIdG1sOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGlwUGFnZVdyYXApOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0aXBCYWNrT24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnN0YWxsVGltZScsbmV3IERhdGUoKS5nZXRUaW1lKCkpOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGlwV3JhcCcpLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0aXBSZW5ldycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2luc3RhbGxUaW1lJyxuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0aXBXcmFwJykuc3R5bGU9J2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKF90aGlzLnJlbmV3VmVyc2lvblVybCk7CgogICAgICAgICAgICAgICAgICAgIC8vdGlwSWNvbkNsb3NlLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9KQoKCiAgICAgICAgICAgIH07CgogICAgICAgIH0KCiAgICAgICAgdmFyIGFsbFdlYiA9IFsuLi5nZXRDb3Vwb24sLi4uanhWaWRlbywuLi5qeE11c2ljLC4uLnpoTmljZSwuLi50YW9iYW8sLi4udmlkZW9Eb3dubG9hZF07CgogICAgICAgIHZhciBub3dXZWI9W107CgogICAgICAgIGFsbFdlYi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgaWYoaXRlbS5pc09wZW4gPT0gMCkgcmV0dXJuIHRydWU7CgogICAgICAgICAgICBpdGVtLndlYi5mb3JFYWNoKGZ1bmN0aW9uKHZhbCl7CgogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGxvY2F0aW9uLmhyZWYubWF0Y2godmFsLm1hdGNoKTsKCiAgICAgICAgICAgICAgICBpZihyZXN1bHQpewoKICAgICAgICAgICAgICAgICAgICBub3dXZWIucHVzaCh2YWwpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKCiAgICAgICAgfSkKCiAgICAgICAgaWYobm93V2ViLmxlbmd0aD09MCl7CgogICAgICAgICAgICBsZXQgYmFzZUNsYXNzID0gbmV3IEJhc2VDbGFzcygpOwoKICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieWMuemFjeivpee9keermeaIluivpeaooeWdl+W3suWFs+mXrScpO3JldHVybjsKICAgICAgICB9CgogICAgICAgIG5vd1dlYi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgc3dpdGNoKGl0ZW0uZnVuY05hbWUpewogICAgICAgICAgICAgICAgY2FzZSAnY291cG9uJzoKCiAgICAgICAgICAgICAgICAgICAgY291cG9uRnVuYyhpdGVtKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXlWaWRlbyc6CiAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvRnVuYygpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGxheU11c2ljJzoKICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNGdW5jKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnemhOaWNlJzoKICAgICAgICAgICAgICAgICAgICB6aE5pY2VGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb0Rvd25sb2FkJzoKCiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvRG93bmxvYWRDbGFzcyA9IG5ldyBWaWRlb0Rvd25sb2FkQ2xhc3MoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGl0ZW07CgogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNXZWJPcGVuID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaXRlbS5uYW1lKyflt7LlhbPpl60nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb3dubG9hZENsYXNzW25vd05hbWVdKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Rhb2Jhb1NlYXJjaCc6CiAgICAgICAgICAgICAgICAgICAgdGFvYmFvU2VhcmNoRnVuYyhpdGVtKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgfQoKICAgICAgICB9KQoKICAgICAgICBmdW5jdGlvbiBjb3Vwb25GdW5jKGl0ZW0pewoKICAgICAgICAgICAgdmFyIGNvdXBvbkNsYXNzID0gbmV3IENvdXBvbkNsYXNzKCk7CgogICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0gaXRlbTsKCiAgICAgICAgICAgIGNvdXBvbkNsYXNzLm5vd05hbWU9bm93TmFtZTsKCiAgICAgICAgICAgIHZhciBjb3Vwb25TdHlsZSA9YAogICAgICAgICAgICAgICAgICAgIGh0bWx7CiAgICAgICAgICAgICAgICAgICAgLS1yaWdodDoxMDAlOwogICAgICAgICAgICAgICAgICAgIC0tbGVmdDoxMDAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9jb3Vwb257CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6Zml0LWNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7CiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206MTVweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fbGVmdHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsKICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgcmlnaHQgdG9wLCB0cmFuc3BhcmVudCA4cHgsI2ZmZiAwKSB0b3AgbGVmdCAvdmFyKC0tcmlnaHQpIDUxJSBuby1yZXBlYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCByaWdodCBib3R0b20sIHRyYW5zcGFyZW50IDhweCwgI2ZmZiAwKSBib3R0b20gbGVmdCAvdmFyKC0tcmlnaHQpIDUxJSBuby1yZXBlYXQ7CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygycHggMnB4IDNweCAjODg4KTsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ODRweDsKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9pbWdfaWNvbnsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHggMHB4IDVweDsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6NXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9pbWdfaWNvbiBpbWd7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6NDdweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fY29udGVudHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDE4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX21vbmV5ewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9hbW91bnRfbW9uZXl7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fbW9uZXlfc2lnbnsKICAgICAgICAgICAgICAgICAgICBjb2xvcjojZjIzMDMwOwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX21vbmV5X251bXsKICAgICAgICAgICAgICAgICAgICBjb2xvcjojZjIzMDMwOwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTozNnB4OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2NvbmRpdGlvbnsKICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmIwZjNhOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY0ZWM7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDo1cHg7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjJweCA1cHg7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEycHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX3RpbWV7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogLTVweDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjJweCA0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX3Rlcm17CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2ZiMGYzYTsKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmIwZjNhOwogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MnB4OwogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggNHB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMThweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fZGF0ZXsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6OHB4OwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fY2lyY2xlewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmYjBmM2EgdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFBelVsRVFWUVlsUzNOTVVvRFFSaUc0WGNtdTlsQVhCUWJxKzFDQ3F1Y3dzYk9PM2dBUzI5aDRRbThnUmRJTUtWZ2xRVkJGaVNGallLQnFXWjJkLzdQSXZZUFBFNlNNQ0h2Y0Q4SHVMekJVc0lLRHlZOEFONFJVK0o5LzhuSDhvTFlKM3dXY2h4QmpKSHRaa04xZnNicDlvbXZoenY2Y2NEalFKTGF0bFhYZFpJazVhd2tLVnpkS2s5VzhnQkZVVkRYTlFBMmpKVEE3R1NPbVIyTHBta0lJV0E1NDZzcHZPNXdMMjlRejNHU0JCQ0hubndJek80ZjBmTWFZb0t5L0FjbThBNitmeGtYMTVBTnFpbVk4UWVtQ205MjByMWFVQUFBQUFCSlJVNUVya0pnZ2c9PSkgcmVwZWF0LXk7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDoxMHB4OwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDo2NnB4OwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICByaWdodDo5N3B4OwogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MjsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6bm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fbGlua19jb3Vwb257CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6Y2VudGVyOwogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMnB4IDJweCAzcHggIzg4OCk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIHRvcCByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGxlZnQgYm90dG9tLCB0cmFuc3BhcmVudCA4cHgsICNmYjA1M2EgMCkgYm90dG9tIHJpZ2h0IC92YXIoLS1sZWZ0KSA1MCUgbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogODRweDsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweCA2cHggMHB4IDRweDsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2dldF9saW5rX3RleHR7CiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4OwogICAgICAgICAgICAgICAgICAgIHdyaXRpbmctbW9kZTp2ZXJ0aWNhbC1scjsKICAgICAgICAgICAgICAgICAgICBsZXR0ZXItc3BhY2luZzowcHg7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseToiTWljcm9zb2Z0IFlhSGVpIjsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGxlZnQgdG9wLCB0cmFuc3BhcmVudCA4cHgsICNmYjA1M2EgMCkgdG9wIHJpZ2h0IC92YXIoLS1sZWZ0KSA1MCUgbm8tcmVwZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCBib3R0b20sIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSBib3R0b20gcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQ7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9nZXRfbGlua190ZXh0OmhvdmVyewogICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICAgICAgICAgICAgICBmb250LXdlaWdodDo4MDA7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseToiTWljcm9zb2Z0IFlhSGVpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLnpobV9xcmNvZGV7CiAgICAgICAgICAgICAgIGJvcmRlcjozcHggc29saWQgI2ZmZjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb3Vwb25TdHlsZSkpOwoKICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgbGV0IGNvdXBvblRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICBuKys7CgogICAgICAgICAgICAgICAgbGV0IHBhZ2VOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKQoKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocGFnZU5vZGUpOwoKICAgICAgICAgICAgICAgIGlmKHBhZ2VOb2RlKXsKCiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjb3Vwb25UaW1lcik7CgogICAgICAgICAgICAgICAgICAgIGNvdXBvbkNsYXNzW25vd05hbWVdKCk7CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIGlmKG49PWNvdXBvblRpbWVyTnVtKSBjbGVhckludGVydmFsKGNvdXBvblRpbWVyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sMTAwKQogICAgICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBsYXlWaWRlb0Z1bmMoKXsKCiAgICAgICAgICAgIHZhciBwbGF5VmlkZW9DbGFzcyA9IG5ldyBQbGF5VmlkZW9DbGFzcygpOwoKICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3MuemhtTG9nbygpOwoKICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JykpewoKICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gcGxheVZpZGVvQ2xhc3MuZ2V0TGluZShHTV9nZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnKSk7CgogICAgICAgICAgICAgICAgaWYobGluZU9iail7CgogICAgICAgICAgICAgICAgICAgIC8vcGxheUxpbmUgPSBbLi4ubGluZU9iaiwuLi5wbGF5TGluZV07CiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUgPSBsaW5lT2JqCgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvL2N1c3RvbSBhZGQgd2ViIGxpbmUKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6aWNvbixwbGF5TGluZTsKCiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOwoKICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9DbGFzcy5nZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpewoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9ICd6aG1fbGluZV9zZWxlY3RlZCc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPWA8bGkgY2xhc3M9J3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSAke3NlbGVjdGVkfScgdXJsPScke2l0ZW0udXJsfScgPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjwvZGl2PiI7CgogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1sb2dvJyk7CgogICAgICAgICAgICBsZXQgcGxheUxpbmVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgIHBsYXlMaW5lRG9tLmNsYXNzTmFtZSA9ICdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJzsKCiAgICAgICAgICAgIHBsYXlMaW5lRG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICBwbGF5TGluZURvbS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7CgogICAgICAgICAgICB6aG1QbGF5LmFwcGVuZENoaWxkKHBsYXlMaW5lRG9tKTsKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6bm9kZTvmkq3mlL7ljLrln58KCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOwoKICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsKCiAgICAgICAgICAgIGxldCBqeFZpZGVvRGF0YSA9IFsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllcl9fY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXItY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldK1wvW2EtekEtWjAtOV0rLmh0bWwvLGFyZWFDbGFzc05hbWU6J3BsYXlsaXN0LWxpc3QnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmNvbnRhaW5lci1wbGF5ZXIiICxtYXRjaDovdlwucXFcLmNvbVwveFwvcGFnZS8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNmbGFzaGJveCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidxeS1lcGlzb2RlLW51bScsbmFtZTonaXFpeWlQYyd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi92XC55b3VrdVwuY29tXC92X3Nob3dcL2lkXy8sYXJlYUNsYXNzTmFtZTonbmV3LWJveC1hbnRob2xvZ3ktaXRlbXMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3ZfcGxheVwvaWRfL30sCgogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNiaWxpYmlsaS1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvdmlkZW8vLG5hbWU6J2JpbGlQYycsYXJlYUNsYXNzTmFtZTondmlkZW8tZXBpc29kZS1jYXJkJ30sCiAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcl9tb2R1bGUiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonbGlzdC13cmFwcGVyJ30s5Y6f5p2lRE9NCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5icHgtcGxheWVyLXByaW1hcnktYXJlYSIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcGxpc3RfZXBfbGlzdF93cmFwcGVyX19QekxIYSd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3Lm1ndHZcLmNvbVwvYnxsXC9bMC05XS8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi90dlwuc29odVwuY29tXC92LyxhcmVhQ2xhc3NOYW1lOidzZXJpZXMtdGFiX3BhbmUnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2xlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonanVqaV9ncmlkJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdmlwXC4xOTA1LmNvbVwvcGxheVwvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjdm9kUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLjE5MDUuY29tXC92b2RcL3BsYXlcLy99LAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3MuemhtTG9nb0RyYWcoJ3ZpZGVvJyxqeFZpZGVvV2ViKTsKCiAgICAgICAgICAgIC8v5piv5ZCm5Zyo5pKt5pS+6aG1CiAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoID4gMCl7CgogICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07CgogICAgICAgICAgICAgICAgLy/pvKDmoIfnu4/ov4fmmL7npLrnur/ot68KICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v6YCJ5oup57q/6Lev6Kej5p6Q5pKt5pS+CgogICAgICAgICAgICAgICAgdmFyIHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3Muc2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicsdGhpcy5nZXRBdHRyaWJ1dGUoJ3VybCcpLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJykgIT0gMjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93V2ViTm9kZS5pbm5lckhUTUwgPSBwbGF5SnhIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgLyotLeeJueauiuWkhOeQhi0tKi8KICAgICAgICAgICAgICAgIC8v5LyY6YW35Y675bm/5ZGKCiAgICAgICAgICAgICAgICBpZihub3dOb2RlPT0iI3BsYXllciIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeW91a3VBZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZHZlcnRpc2UtbGF5ZXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5a0FkID0geW91a3VBZC5sYXN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICB5a0FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeWtBZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLWRhc2hib2FyZC0wJykuc3R5bGU9J2Rpc3BsYXk6ZmxleCc7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWxheWVyIHZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW8ucGxheSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8v5pqC5YGcCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktcGxheS1pY29uLTAnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuKyslMiA9PSAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGF1c2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsZnVuY3Rpb24oKXsgLy/mkq3mlL7ml7bpl7TmlLnlj5gKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeW91a3VBZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZHZlcnRpc2UtbGF5ZXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeWtBZCA9IHlvdWt1QWQubGFzdENoaWxkOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5a0FkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWtBZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHlrQWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktZGFzaGJvYXJkLTAnKS5zdHlsZT0nZGlzcGxheTpmbGV4JzsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL+mUruebmOW/q+i/m+W/q+mAgAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5vbmtleWRvd24gPSBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGV2ZW50LmtleUNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWxheWVyIHZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZT09MzkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmN1cnJlbnRUaW1lICsgNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihldmVudC5rZXlDb2RlPT0zNyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uY3VycmVudFRpbWUgLSA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+eIseWlh+iJuuWOu+W5v+WRigogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNmbGFzaGJveCIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNraXBwYWJsZS1hZnRlcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+iFvuiur+WOu3ZpcOW8ueeqlwogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIGxldCBuID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyA8IDEwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhbmVsVGlwVmlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVsLW92ZXJsYXknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYW5lbFRpcFZpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVGlwVmlwLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCgoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+S5kOinhumAiembhuWkhOeQhgogICAgICAgICAgICAgICAgaWYobm93Tm9kZSA9PSAiI2xlX3BsYXlib3giKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX2Jsb2NrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighakJsb2NrKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGpCbG9jay5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JZCA9IGpCbG9ja1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBgaHR0cHM6Ly93d3cubGUuY29tL3B0di92cGxheS8ke3ZpZGVvSWR9Lmh0bWxgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpCbG9ja1tpXS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgnaHJlZicsbGluayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9C56uZ5aSn5Lya5ZGYdXJs5aSE55CG77yM6aG16Z2iY2xhc3PkuI3kuIDoh7QKICAgICAgICAgICAgICAgIGlmKG5vd05vZGUgPT0gIi5wbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheWVyLWNvbnRhaW5lcicpICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jb250YWluZXInKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcucGxheWVyLW1hc2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcuYnB4LXBsYXllci1jb250YWluZXInOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKuiFvuiur+inhumikeeCueWHu+WFtuWug+inhumikei3s+i9rCovCiAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0ncXFQQycpewoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlndXJlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpZ3VyZScpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlndXJlRGV0YWlsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpZ3VyZV9kZXRhaWwnKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RJdGVtID0gWy4uLmZpZ3VyZSwuLi5maWd1cmVEZXRhaWxdOwoKICAgICAgICAgICAgICAgICAgICBpZihsaXN0SXRlbS5sZW5ndGggPiAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5rKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsaW5rOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+azqOmHiuaYr+WkmuS4quaSreaUvumAiembhuWMuuWfnwovKgogICAgICAgICAgICAgICAgbGV0IGVhcmVDbGFzc05hbWVBcnIgPSBqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlYXJlQ2xhc3NOYW1lQXJyKTtyZXR1cm47CgogICAgICAgICAgICAgICAgaWYoZWFyZUNsYXNzTmFtZUFyci5sZW5ndGg9PTApcmV0dXJuOwoqLwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewovKgogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8ZWFyZUNsYXNzTmFtZUFyci5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2VhcmVDbGFzc05hbWVBcnJbaV0pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS50YXJnZXQucGFyZW50Tm9kZS5ocmVmKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdC5sZW5ndGg9PTApe2NvbnNvbGUubG9nKCfor6XnvZHnq5nmkq3mlL7ljLrnsbvlkI3mlLnlj5gnKTtyZXR1cm47fQoKICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlLnRhcmdldC5wYXJlbnROb2RlLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB9LDIwMDApOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcGxheU11c2ljRnVuYygpewoKICAgICAgICAgICAgaWYoc2VsZi5mcmFtZUVsZW1lbnQgJiYgc2VsZi5mcmFtZUVsZW1lbnQudGFnTmFtZSA9PSAiSUZSQU1FIil7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcGxheU11c2ljQ2xhc3MgPSBuZXcgUGxheU11c2ljQ2xhc3MoKTsKCiAgICAgICAgICAgIHZhciBtdXNpY0lkID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKTsKCiAgICAgICAgICAgIC8vbmV0ZWFzZSDot6/nlLHkuKTmrKHvvIzpnIDph43lrprkuYkKICAgICAgICAgICAgdmFyIG5ld1VybCA9IGxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICBsZXQganhNdXNpY1dlYiA9IGp4TXVzaWNbMF0ud2ViLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3VXJsLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGlmKGp4TXVzaWNXZWIubGVuZ3RoKXsKCiAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1JY29uJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclpobUljb24pOyAvLyDlj5bmtojlrprml7blmagKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J2t1d28nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmljb24tYmFyX2ljb25fZG93bmxvYWRfJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uY2xhc3NOYW1lID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uc3R5bGU9J21hcmdpbi1sZWZ0OjEwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5pbm5lckhUTUwgPSAiPGEgc3R5bGU9J2ZvbnQtc2l6ZToxMHB4O3doaXRlLXNwYWNlOiBub3dyYXA7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzU1NTsnIGlkPSdrdXdvRG93bmxvYWQnPuS4i+i9vTwvYT4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sX3InKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMuYmVmb3JlKGljb24pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3V3b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb25nTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250cm9sIC5zb25nX25hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnRpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udHJvbCAuYXJ0aXN0JykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoYXVkaW9TcmMsc29uZ05hbWUrJy0nK2FydGlzdCsnLm1wMycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0neGltYWxheWEnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mkq3mlL7lmajliJvlu7rkuIvovb1pY29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhtQ29udHJvbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLW9wcmF0aW9ucycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHhtQ29udHJvbHMucXVlcnlTZWxlY3RvcignYTpudGgtb2YtdHlwZSgyKScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbiA9IGNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uLmlubmVySFRNTCA9ICI8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwcHg7d2hpdGUtc3BhY2U6IG5vd3JhcDtjdXJzb3I6cG9pbnRlcjtjb2xvcjojRkZGOycgaWQ9J3hpbWFEb3dubG9hZCc+5LiL6L29PC9zcGFuPiI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtQ29udHJvbHMuc3R5bGU9J3Bvc2l0aW9uOiByZWxhdGl2ZTttYXJnaW4tbGVmdDotMjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLXByb2dyZXNzJykuc3R5bGUud2lkdGg9JzQ1MHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhtLXBsYXllci1wbGF5dGltZScpLnN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6NDBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bUNvbnRyb2xzLnByZXBlbmQoaWNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mkq3mlL7lmajkuIvovb3kuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjeGltYURvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm1UaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mbS10aXRsZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZtVGl0bGVNYXRjaCA9IGZtVGl0bGUuaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tXC9zb3VuZFwvKFxTKikkLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbW9iaWxlLnhpbWFsYXlhLmNvbS9tb2JpbGUtcGxheXBhZ2UvdHJhY2svdjMvYmFzZUluZm8vJytuZXcgRGF0ZSgpLmdldFRpbWUoKSsnP2RldmljZT13ZWImdHJhY2tJZD0nK2ZtVGl0bGVNYXRjaFsxXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBkYXRhLnRyYWNrSW5mby5wbGF5VXJsTGlzdFsxXS51cmw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjEgPSBwbGF5VXJsLnJlcGxhY2VBbGwoJy0nLCcrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjIgPSBzdHIxLnJlcGxhY2VBbGwoJ18nLCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHN0cjIubGVuZ3RoJTQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobnVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMiArPSAnPT09PScuc3Vic3RyKG51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIyKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIENyeXB0b0pTLmVuYy5IZXgucGFyc2UoImFhYWQzZTRmZDU0MGIwZjc5ZGNhOTU2MDZlNzJiZjkzIiksIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzNwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZWNyeXB0ZWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRlY3J5cHRlZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChkZWNyeXB0ZWQsZGF0YS50cmFja0luZm8udGl0bGUrJy5tcDMnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6Kej5a+G5Zyw5Z2A5aSx6LSlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mhtemdouWIl+ihqOWIm+W7uuaJuemHj+S4i+i9vQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsTWF0Y2ggPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM6XC9cL3d3dy54aW1hbGF5YS5jb21cL2FsYnVtXC9bMC05XSsvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybE1hdGNoKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FuY2hvcl9zb3VuZF9saXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc291bmRMaXN0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdEhlYWQgPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvcignLmhlYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdEhlYWRUaXRsZSA9IHNvdW5kTGlzdEhlYWQucXVlcnlTZWxlY3RvcignLnNvcnQnKS5sYXN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYXRjaERvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhdGNoRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJhdGNoRG93bmxvYWREb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBbe25hbWU6J+aJuemHj+S4i+i9vScsaWQ6J2JhdGNoRG93bmxvYWQnfSx7bmFtZTon6YeN572uJyxpZDoncmVzZXQnfSx7bmFtZTon5YWo6YCJJyxpZDonc2VsZWN0QWxsJ31dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gc291bmRMaXN0SGVhZFRpdGxlLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLGl0ZW0uaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuaW5uZXJUZXh0ID0gaXRlbS5uYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kTGlzdEhlYWRUaXRsZS5hZnRlcihjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmJlZm9yZSgiIHwgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWxlY3RBbGwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUNoZWNrYm94LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtLmNoZWNrZWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGVja2VkPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZXNldCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1DaGVja2JveCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSd6aG1DaGVja2JveCddIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGVja2VkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5q2j5bqP5YCS5bqP5LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kTGlzdEhlYWQucXVlcnlTZWxlY3RvcignLnNvcnQnKS5maXJzdENoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXRjaERvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9CYXNlQ2xhc3MudG9hc3QoJ+W3suS4i+i9ve+8jOivt+eojeWAmScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1DaGVja2JveCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSd6aG1DaGVja2JveCddIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jaGVja2VkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzY3JNYXRjaCA9IGl0ZW0udmFsdWUubWF0Y2goL1wvc291bmRcLyhbMC05XSspLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbW9iaWxlLnhpbWFsYXlhLmNvbS9tb2JpbGUtcGxheXBhZ2UvdHJhY2svdjMvYmFzZUluZm8vJytuZXcgRGF0ZSgpLmdldFRpbWUoKSsnP2RldmljZT13ZWImdHJhY2tJZD0nK3Njck1hdGNoWzFdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGRhdGEudHJhY2tJbmZvLnBsYXlVcmxMaXN0WzFdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMiA9IHN0cjEucmVwbGFjZUFsbCgnXycsJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gc3RyMi5sZW5ndGglNDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIyICs9ICc9PT09Jy5zdWJzdHIobnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cjIpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ3J5cHRvSlMuZW5jLkhleC5wYXJzZSgiYWFhZDNlNGZkNTQwYjBmNzlkY2E5NTYwNmU3MmJmOTMiKSwgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQiwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGVjcnlwdGVkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWNyeXB0ZWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoZGVjcnlwdGVkLGRhdGEudHJhY2tJbmZvLnRpdGxlKycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuemhtQ2hlY2tib3gnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtQ2hlY2tib3gubGVuZ3RoID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+e/u+mhteS6i+S7tgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYWdpbmF0aW9uLXBhZ2UnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUJhcil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i3s+mhteS6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvblt0eXBlPXN1Ym1pdF0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUxpbmspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq5Yy56YWN5Yiw5YiX6KGo5Zyw5Z2AJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1MDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WFqOWxgOeCueWHu+S6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqTGluayA9IHt9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBhdGguZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaHJlZil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay5ocmVmID0gaXRlbS5ocmVmP2l0ZW0uaHJlZjonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLnRhcmdldCA9IGl0ZW0udGFyZ2V0P2l0ZW0udGFyZ2V0OicnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvYmpMaW5rLmhyZWYgJiYgb2JqTGluay50YXJnZXQgIT0gJ19ibGFuaycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IG9iakxpbmsuaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0na3Vnb3UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhT2JqID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGFvYmonKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YU9iail7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YW9iaicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsJ19ibGFuaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGFPYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdXBvblVybC5pbmRleE9mKCdtaXhzb25nJykhPS0xIHx8IGNvdXBvblVybC5pbmRleE9mKCdzb25nJykgIT0gLTEgfHwgY291cG9uVXJsLmluZGV4T2YoJ3NoYXJlJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdm9sdW1lRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZvbHVtZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkRG9tID0gdm9sdW1lRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnN0eWxlPSdtYXJnaW4tdG9wOjMwcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uaW5uZXJIVE1MID0gIjxhIHN0eWxlPSdjb2xvcjojZmZmO2ZvbnQtc2l6ZToxMHB4O3doaXRlLXNwYWNlOm5vd3JhcDtjdXJzb3I6cG9pbnRlcjsnIGlkPSdrdWdvdURvd25sb2FkJyBqYXZhc2NyaXB0OnZvaWQoMCk7PuS4i+i9vTwvYT4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRG9tLmJlZm9yZShkb3dubG9hZERvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVEb20uc3R5bGU9J2xlZnQ6NTBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21vZGUnKS5zdHlsZT0nbWFyZ2luLWxlZnQ6OTBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BiX2Rvd25sb2FkJykuc3R5bGU9J21hcmdpbi1sZWZ0OjEzMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGJfc2hhcmUnKS5zdHlsZT0nbWFyZ2luLWxlZnQ6MTcwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0Jykuc3R5bGU9J3JpZ2h0Oi0yMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3Vnb3VEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNteUF1ZGlvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvU3JjID0gYXVkaW8uZ2V0QXR0cmlidXRlKCdzcmMnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2luZ2VyTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaW5nZXJOYW1lJykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdOYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NvbmdOYW1lVGVtcCcpLnRpdGxlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChhdWRpb1NyYyxzb25nTmFtZSsnLScrc2luZ2VyTmFtZS5zdWJzdHIoMCxzaW5nZXJOYW1lLmxlbmd0aC0xKSsnLm1wMycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY291cG9uVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0nbmV0ZWFzZScgJiYgbG9jYXRpb24uaHJlZiA9PSAnaHR0cHM6Ly9tdXNpYy4xNjMuY29tL3N0L2Rvd25sb2FkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MuemhtTG9nbygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnpobUxvZ29EcmFnKCdtdXNpYycsanhNdXNpY1dlYik7CgogICAgICAgICAgICAgICAgICAgICAgICB9LGljb25XYWl0VGltZSk7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICBsZXQgemhtUGxheURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1JY29uJyk7CgogICAgICAgICAgICAgICAgIGlmKHpobVBsYXlEb20pewoKICAgICAgICAgICAgICAgICAgICAgemhtUGxheURvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHpobVBsYXlEb20pOwoKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pn7PpopHnvZHlnYDmsqHmnInmt7vliqDljLnphY3miJbljLnphY3plJnor68nKTsKCiAgICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gemhOaWNlRnVuYygpewoKICAgICAgICAgICAgdmFyIHpoQ2xhc3MgPSBuZXcgWmhDbGFzcygpOwoKICAgICAgICAgICAgLy/lhbPpl63nmbvlvZXlvLnmoYYKICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgIGxldCBsb2dpbk1vZGFsV3JhcHBlciA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCIuTW9kYWwtd3JhcHBlciIpOwoKICAgICAgICAgICAgICAgaWYobG9naW5Nb2RhbFdyYXBwZXIpewoKICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZUJ1dHRvbiA9IGxvZ2luTW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5Nb2RhbC1jbG9zZUJ1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgIGlmKGNsb3NlQnV0dG9uKXsKCiAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdXR0b24uY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KSgpCgogICAgICAgICAgICB2YXIgemhEYXRhID0gWwogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVZpZGVvJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZVZpZGVvJywnMCcpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlQUQnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlQUQnLCcyMicpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sCiAgICAgICAgICAgICAgICB7ZnVuYzonZG93bmxvYWRWaWRlbycsaXNPcGVuOkdNX2dldFZhbHVlKCdkb3dubG9hZFZpZGVvJywnMjInKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVJpZ2h0Jyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZVJpZ2h0JywnMCcpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sCiAgICAgICAgICAgICAgICB7ZnVuYzonY2hhbmdlTGluaycsaXNPcGVuOkdNX2dldFZhbHVlKCdjaGFuZ2VMaW5rJywnMjInKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZUtleXdvcmQnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlS2V5d29yZCcsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3Nob3dTcGVjaWFsQ29sdW1uJyxpc09wZW46R01fZ2V0VmFsdWUoJ3NwZWNpYWxDb2x1bW4nLCcyMicpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sCiAgICAgICAgICAgICAgICB7ZnVuYzonc2hvd1ZpZGVvVGl0bGUnLGlzT3BlbjpHTV9nZXRWYWx1ZSgndmlkZW9UaXRsZScsJzIyJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwKICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVBdXRob3JOYW1lJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUF1dGhvck5hbWUnLDIyKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVlhbnh1YW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlWWFueHVhbicsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J2Nsb3NlQXV0aG9yJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUF1dGhvck5hbWUnLDIyKSxpc09uc2Nyb2xsOjAsb25sb2FkOjF9LAogICAgICAgICAgICBdCgogICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLm9ubG9hZD09MCl7CiAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICB3aW5kb3cub25sb2FkPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT3Blbj09MjIgJiYgaXRlbS5vbmxvYWQ9PTEpewogICAgICAgICAgICAgICAgICAgICAgICB6aENsYXNzW2l0ZW0uZnVuY10oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CgogICAgICAgICAgICAgICAgaWYoc2Nyb2xsVG9wID4gMjAwKXsKCiAgICAgICAgICAgICAgICAgICAgemhEYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLmlzT25zY3JvbGw9PTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdGFvYmFvU2VhcmNoRnVuYyhpdGVtKXsKCiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWxlY3RUYicpOwoKICAgICAgICAgICAgICAgIGlmKCFkb20pewoKICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0c0RvbSA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5leHQtY2hlY2tib3gtZ3JvdXAnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoc2VsZWN0c0RvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gc2VsZWN0c0RvbS5xdWVyeVNlbGVjdG9yQWxsKCdsYWJlbCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1UZXh0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdzcGFuOmxhc3QtY2hpbGQnKS5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbVRleHQ9PSflpKnnjKsnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRiTGFiZWxzID0gaXRlbS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLnNldEF0dHJpYnV0ZSgnaWQnLCdzZWxlY3RUYicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXREb20gPSB0YkxhYmVscy5xdWVyeVNlbGVjdG9yKCdzcGFuOmZpcnN0LWNoaWxkID4gaW5wdXQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREb20udmFsdWU9J3NlcnZpY2U6dGFvYmFvJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJMYWJlbHMucXVlcnlTZWxlY3RvcignLm5leHQtY2hlY2tib3gtbGFiZWwnKS5pbm5lclRleHQ9J+a3mOWunSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnNlcnREb20gPSBzZWxlY3RzRG9tLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsOm50aC1vZi10eXBlKDIpJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydERvbS5iZWZvcmUodGJMYWJlbHMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsc2VsZWN0VGFvYmFvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJMYWJlbHMucXVlcnlTZWxlY3RvcignLm5leHQtY2hlY2tib3gtbGFiZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgaWYoZG9tLmNsYXNzTmFtZSA9PSAnbmV4dC1jaGVja2JveC13cmFwcGVyIGNoZWNrZWQgJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBzaG93VGJQYWdlKCk7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL2NsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGZ1bmN0aW9uIHNlbGVjdFRhb2JhbyhlKXsKCiAgICAgICAgICAgIGxldCBwYXJlbnREb20gPSBlLnRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICAgaWYocGFyZW50RG9tLmNsYXNzTmFtZSA9PSduZXh0LWNoZWNrYm94JyAmJiBwYXJlbnREb20ucGFyZW50Tm9kZS5jbGFzc05hbWUgPT0gJ25leHQtY2hlY2tib3gtd3JhcHBlciAnKXsKCiAgICAgICAgICAgICAgICBwYXJlbnREb20ucGFyZW50Tm9kZS5jbGFzc05hbWU9J25leHQtY2hlY2tib3gtd3JhcHBlciBjaGVja2VkICc7CgogICAgICAgICAgICAgICAgc2hvd1RiUGFnZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgIHBhcmVudERvbS5wYXJlbnROb2RlLmNsYXNzTmFtZT0nbmV4dC1jaGVja2JveC13cmFwcGVyICc7CgogICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTSA+IGRpdiA+IGEnKTsKCiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUuc3R5bGU9J2Rpc3BsYXk6YmxvY2snOwoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vbG9jYXRpb24ucmVsb2FkKCk7CgogICAgICAgICAgICB9CgoKCiAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gc2hvd1RiUGFnZSgpewoKICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50LS1jb250ZW50SW5uZXItLVFWVGNVME0gPiBkaXYgPiBhJyk7CgogICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0uaHJlZi5tYXRjaCgvXmh0dHBzOlwvXC9pdGVtXC50YW9iYW9cLmNvbS8pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50Tm9kZS5zdHlsZT0nZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAKICAgIH0KCiAgICAoYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAvL0dNX2RlbGV0ZVZhbHVlKCdpbmZvJyk7cmV0dXJuOwoKICAgICAgICBsZXQgaW5mbyA9IEdNX2dldFZhbHVlKCdpbmZvJywwKTsKCiAgICAgICAgLy9jb25zb2xlLmxvZyhpbmZvKTsKCiAgICAgICAgbGV0IGVuZERheVQgPSBpbmZvLmVuZERheVQ/aW5mby5lbmREYXlUOjA7CgogICAgICAgIGxldCB2ZXJzaW9uID0gR01faW5mby5zY3JpcHQudmVyc2lvbjsKCiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpOwoKICAgICAgICBsZXQgWSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCiAgICAgICAgbGV0IE0gPSAoZGF0ZS5nZXRNb250aCgpKzEgPCAxMCA/ICcwJysoZGF0ZS5nZXRNb250aCgpKzEpIDogZGF0ZS5nZXRNb250aCgpKzEpOwoKICAgICAgICBsZXQgRCA9IGRhdGUuZ2V0RGF0ZSgpOwoKICAgICAgICBsZXQgbm93VCA9IGRhdGUuZ2V0VGltZSgpOwoKICAgICAgICBsZXQgc2NyaXB0RCA9IGluZm8uc2NyaXB0RD9pbmZvLnNjcmlwdEQ6bm93VDsKCiAgICAgICAgaWYoIG5vd1QgPiBlbmREYXlUICl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdydW4nKTsKICAgICAgICAgICAgLy/liJvlu7ppbmZvCiAgICAgICAgICAgIGxldCBvYmpJbmZvID0ge307CgogICAgICAgICAgICBvYmpJbmZvLmVuZERheVQ9IG5ldyBEYXRlKGAke1l9LSR7TX0tJHtEfSAyMzo1OTo1OWApLmdldFRpbWUoKTsKCiAgICAgICAgICAgIG9iakluZm8uc2NyaXB0RCA9IHNjcmlwdEQ7CgogICAgICAgICAgICBvYmpJbmZvLnZlcnNpb24gPSB2ZXJzaW9uOwoKICAgICAgICAgICAgb2JqSW5mby51c2VUID0gbm93VDsKCiAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CgogICAgICAgICAgICAgICAgIG1ldGhvZDogInBvc3QiLAogICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL3RhcGkvZ2V0X3YucGhwJywKICAgICAgICAgICAgICAgICBkYXRhOiBgc2NyaXB0RD0ke3NjcmlwdER9JnVzZVQ9JHtub3dUfSZ2ZXJzaW9uPSR7dmVyc2lvbn1gLAogICAgICAgICAgICAgICAgIGhlYWRlcnM6ICB7CiAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXMpewogICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzID09PSAyMDApewoKICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKHJlcy5yZXNwb25zZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0LmNvZGU9PTEwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbmZvJyxvYmpJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5aSx6LSlJykKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcykKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgb25lcnJvciA6IGZ1bmN0aW9uKGVycil7CiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicpCiAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycikKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKCiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBydW4nKTsKICAgICAgICB9CgogICAgfSkoKQp9KSgpOw==
Add Comment
Please, Sign In to add comment