xiaomianao666

插件名:global_懒人工具箱(兼容版)

Jul 7th, 2023
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_懒人工具箱(兼容版)@base64://Ly8gPT1Vc2VyU2NyaXB0PT0NCi8vIEBuYW1lICAgICAgICAg5oeS5Lq65bel5YW3566xKOWFvOWuueeJiCkNCi8vIEBuYW1lc3BhY2UgICAgbHItdG9vbGJveA0KLy8gQHZlcnNpb24gICAgICA2LjguMQ0KLy8gQGRlc2NyaXB0aW9uICDmnKzohJrmnKznsr7pgInop6PmnpDnur/ot6/kuLrlpKflrrbmj5DkvpvkvJjphbfjgIHniLHlpYfoibrjgIHohb7orq/jgIFC56uZKGJpbGliaWxpKeOAgeS5kOinhuOAgeiKkuaenOetieWQhOWkp+inhumikee9keermShQQyvnp7vliqjnq68p6KeG6aKR6Kej5p6Q5pyN5Yqh77yM6K6p5L2g55yB5Y676LSt5Lmw6KeG6aKRVklQ6LS555So77yM5ZCM5pe25o+Q5L6b55+l5LmO5aKe5by6KOefpeS5juinhumikeS4i+i9veOAgeWOu+W5v+WRiuOAgeWOu+mZpOS+p+i+ueagj+OAgeWFs+mUruivjeWxj+iUveetieS8muWRmOWKn+iDvSnvvIzlhajnvZHpn7PkuZDlkozmnInlo7DkuablhY3lrqLmiLfnq6/kuIvovb0o572R5piT5LqR6Z+z5LmQ44CBUVHpn7PkuZDjgIHphbfni5fjgIHphbfmiJHjgIHomb7nsbPjgIHonLvonJNGTeOAgeiNlOaenUZN44CB5Zac6ams5ouJ6ZuF562JKe+8jOinhumikeaXoOawtOWNsOS4i+i9vShiaWxpYmlsaeOAgeaKlumfs+OAgeW/q+aJi+OAgeilv+eTnOOAgXlvdXR1YmUp77yM6Ieq5Yqo5p+l5Yi45Yqf6IO977yM5omA5pyJ5Yqf6IO95LqS5LiN5b2x5ZON77yM5Y+v54us56uL5byA5YWz44CCDQovLyBAYXV0aG9yICAgICAgIGxhbmhhaGENCi8vIEBpY29uICAgICAgICAgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFHUUFBQUJrQ0FZQUFBQnc0cFZVQUFBUThFbEVRVlI0WHUxZENYUVVSUnIrYXBJUVQxd1F3NkVZQmNTRXJDZ0tDb1Fvd29vY0xpcktlb0FvTEQ1eDJZRHUraFRDUG5kZEplQzVDdDZnSUJ0ZGxVTVF4QVBFOTVnTUtrYmhvV0dDS01ncHNQalVvRXNJa05yM1RhZGhNdW1lcWU2dW5nUkk4U0JBVjlmeGYvV2Y5VmVYZ0ljaXBjenk4UHBSL2FvUW9zek5CSVdUbDZTVXZRQU1BSEFKZ0ZiWXNTc2RINWUwd2ljbHdNcFZ3SzdkVHBvN2V1cG1OQU82ZFFhNmRESit0c2pZQ0dBTGdHSUE3d29oK0ZPcEtBTWk5KzI3R1kwYURjU1c3ZDN4eXVzdEVDcEp3MmIyMlZCcVVTQ3pOWkIzeVQ2TXVHa3JtbWNzUjJYbElwR2VQaytGVWtxQXlHODIvQm1udDd3V3o4NjhBQys5MmxTbDRZWTZBTkliQWJmY3NBdDNEaXZCdHUvbmkzWnRwaVdpUzF4QTVBOC9kTWU4OXdhZzdWbDk4ZURqNTJMbnJoTVROZGp3M0lJQ3pVOHJ4LzMzck1XR0RZc3hzTzlpY2RwcG45dlJ5UllRdVh2M0lLU2tETUNrcVQyeDhJUFRJWkRlUUd3UEZKQ3lBZ092L0E3MzVTL0ZmckZRTlAvTkIxYXRXUUlpZjk0N0JQc3JCbVBVWDd1ajlPdW1FRWp4TUpTR1YwMEtTSGtBT2UxMzRzVW5Qa0pxeWx6UnVQSDhXT0xVQWtUdTIzY2pEc29oR0pHZml6WGhKZzNVOUlFQ0hUdnN4S3luUDBSYVdwRVE0dDNvSG1vQUlxVzhETUJJNUUvb2gyWExUL1ZoS0ExTm1oUzR1djkyRkk1L0M4QU1JY1FoblZJVGtNOCtmd2pyTjkyRUJ4OC9DMElFR3Fqbkl3VW92aVlXaEhGVzY1bml3bzVQbUQwZEFrVHUrcmt2VWcvZWhUNkRMOFgvOWgzdjQxQWFtallwY01MeDVYai96U1VROGtuUnRHbkVlVHdNeU1MMy80SFBWdy9GRzIrM2dSQksva2xTS2R2NUF1RDBGc0RwTFEyUG1NWDhkK3hBR0RWZ0tWc1BiUHNlS1BzR0tGbWQxT0VxZFNibFFkd3c4Q3RjZE5FMDhmdmZQWE1JRUxsangza1FxZU53NWZYOVVIbWdmaWp5VmkyQVhqMkFpenNCdlM5Vm1sL0NTZ1RxczFYQXNxQUJVbjBvamRLK3gvdHZ6RU5LWUpKbzFteGJoQk5rNFdPRElGUEdvbWhPVndqUnFNN0dlZkpKQmdqRC9nQmtuZVB2TU1nNXM5NEVsaFVEMjNmNDIxZTgxaVYrd1lpYlA0S1FqNGg3UmhjYmdIVHJQeHBWdUIzbFA1OVhKOHFjM0hCTlArQ1d3VURqazVOUG5MY1dBOC9PcUJ0Z0pBNmdWY3NTcE1pbnhRZHpYalVBNlpCWGdLcXFZUkE0RjhsVUgrU0lQdzAzT0tJK2xMb0FSbFpWQVNoRlZXQzZXRmM4eFFBa0ovZWZPSWdoRUtMTllUWHZNNFd1N2d1TUcrT2NJeWhldHUwd2RJRlpLSDRJcnNsZDVEZ3FmeXA5L3QxSktkOEQvSHUyd1RISktGSUNFdXNRQ013U2E0T0YxU0tyMzFUOHVHY1FoR3psTzRlUVFCTUxER1d0VXFoOFNYeFRJZS81UmVXdHczVUlGSzB5OXNlZldlM1UzcWVGTnFIUWYrVXZ5UkZ5QTFMd3FpZ04zVzhBMHUrbUltemEzQThRL29iV2UrVUJFOGNuNWdvU2ZmNjd3UHpGK2duQ0JURjZCTkE3eitDcVJPVzJNVFc1TVZGOXA4OEppTUJXbkhEY0hGR3k5RzREa0x3QjcyRDNqejBoQWljNGJVKzUvbjM1aVhVRnhkRXpMeHRnK0YwSUJrRWhPUEhFR2tWWXQvNytqa1ppTjVvMldTUkNDNGNiZ0hTOC9FTlVWdVlpSVB3SnNUODBIcmcyenFUSUVRU0NzcnN1Q3EwN0FtUEhNVGw1L281S3lqMUlUVmttdmx4K2pRRklkdmZsa1gxeUVkRHJnM0NDVXdyajZ3czZhUVdGZ0ZQZG9KdEU1Skx4WXdDSzFlaENycjFpc083ZWFyWW41VjVBQmtWNHhaWFZnUFQ0R0VCbkNLUnE3WG5HRkhzd0NNRGtLY2tSVDA0bVJVQUlEQUg2YkRWUU1ORi8vMFJpSDRCUFJMaTRwd0ZJVnZlVmdMZ1FBYUZ2SXlxZW1LTGxOR0dpZm9YdGhQRDFxYTZVK3dIeHFRZ1g1NWtpNjNNZ2NMNjJuVUg2RjVUTFZvVmczSlpmOXlMS0RTQTBtZThiWTNEOWg4dUJDWlAweklQZU9sQWl3c1hkVEVCV1FhSWpBZ0h2ZXlCaythbUZSeDhZbk5FSGJ4b09wMW5vcTF3M3dnMjBOZCtwa2djQitZVW9XM0Z4ZGVna2R6VWt2TWV4S0hmbnZtenRaeHpKbkVIeWtUdm1Xbmp2OU9ocElYb3BFZ1JrdFFpSE9wc2NzZ1pBRG9SSERyRlQ0a2M2R0NRMkY5c1NHN1A4dXVIZTlDSDNSU0RYaVBDS0M2c0J5ZjNTQU1SRFpKRTZnN29qdHRDYW9zNm9ML3NQWGxheW5XNWtXR2U0eGR4Vis2cVNWWkJZSTlhRk9sVmJXYmxmUWFDRGEwRG9iMUMrV29YT0dROUtodWV0T25rdjlUalBlVE9zUFhzdklSWXBHZkg5U29SRDV4OEdCT2lBZ0VzT1liQ1EreG14aFU1ZmZvRVhFdFMvZCsyTUZpOWNVaDJDRitFVkhVMmxYZ3FKYkZjY1lpZGJLYXJvNGRhMUIrNEhwRE9uQWwwdXFOMnlXeTZSVWtKaXJTZ0wvYllha0I1cndiTWViblNJSFhmUUM2K3IySlFmSUVTM3lURCt6Q242SkVJVk4wV2lBY25LRFZmdkZqckxOckhUSFRyaVAyeWJvWG9tT0hBRGlxYmxndmY4SnJWNisxWmN3bEFMRFJpbmhSd2lFQlpyUXptbURpbHp0WDFyWjFucFVPUldKalFkc2NsVC9kMmZVQ1dtbFYvaTFpZUpBQ0xLeE5yaUR0NEFvUk1ZbXgyaWd6dElsTktnUFdrWXRpQXdkWmt0d3RGUndUTnN6NjFpV3BJVTAyNktGa0RzbERuMWh0dUJSVThtSGlCbVBYTVA1VWczSEF5bHZrNlVoYkxkY3doWEJqTkdZb3RYcjlWc1R3VVExdVdPSGhkQWZkSXZUcm1rT3RGQmxJV3lxZ0hwc1E1Q3RuZVU0R0NsMU9pTkV4QWRSUlVRc3k4cWZrWmZvN05SZEl3akdXMW9BY1NLWUxyRVZTSWRFbzlJZE5Cb1ZDUmJ2ekN0NlpyK3dKNDlSZ3FSazFCUkxVQ3llM3dOSWMrSnlyMk92eTdzN0hCNjVmVE9kUlFyd0dsV3F1WmFNVTJVaEVtR2ZvbTFOaWxHR1paWFhSUVJRTVRYb3F6NFhITUwxeGtnZHVhdXptUUFLMEJNczVMNmkyTklsTVpEd2xEeEY4M1JzVVRzMjdBUzM0NU00QWdnNjBXNHVMMFo3VjBQb0oyeURyRlM2THJNM1hoS1BYcVNCSVBSVjZzWVdpenAvTll2Vm9EUURLYm9WQ3BlQWRIcHBkb05PQjZIUkw5REIyM2NXT3ZZVW16YjFDOFBUM0VtMzFVSXloM1MyR3dWSjE1N0pIS0NiMFE0ZEk2NVFmVU5JTm9xYzRobkZsV1lwU29nWmxQVWE0VUZhcm04VEtwK2VLbysvV0lsTWNpVmZSU1R5RDBERXJ1M1RLSTRrcGsrQUdJMm1TanB6YXluTTZuYXppZFQxYWtSUU9TM0lyeWluVHNPY2JwNkZlaGZxNHFYUHFoZlRNV2ZxRyt1WklaaHZGaUgxR09NZXNlV09nVkVkN2pkQ3lBbVlSamVLWnlncmwvR0ZMZ1RZM1p1UUFNZ051eWdxbC9jN3ZwcEJ5UXI5MXRIaDNWMHJONUVvc1NQUHV6OHAraXhxSzdxNkhlOCttWFZaMFJFV2FpdEdWdzgrZ0ZoYUNNU0tvOUtkSXRkRlBUcXUxcmtCaVJhUEo2VnVuRm94ejBnVm1hdnpqZ1dDYUNMUXloT0dKVldPYkhsZG1QTkNoQW5nVllMRHRrQWdiTTkrU0ZPSEtGRUs0N1BtU1VZZS96TVNSSUJGVHFCaUhjdXhSd0h4ejc1S2ZjT293N0hVR0tqS0F1MU1VV1dNMEM4T2tJcWdNU20yNml1T0pxOGxPa3FSNndaN3BrMHhadkpHMWs4Rmp1blRrSW5SclRYQXlCMlNvenlWMmQwbGF1Y0s1eStna3F5SFVFY2x4OWZUNUNBSENORkxDUENPc1pySlY0ZHVRSFZnSVJORHNuT05UaEU5VXkwWGVLeHp2QzdDaGVaZGFLUENTUjZqOEF5QXF3YUdrL1VucDNKNjBTOHdpc2dka3BYcDJLbjZPRkJVUjdNakJ3R25WRmJ0SmgxVlBVRWdkQzlvK2pWd2lJdGpkREpkeUs4NG13emRMSVJFUHhHVnFMMWNQaTVsU0p6RWxCTDFKTlZZak16SWMyVlRZV3RvaWY4UGpwbnBUOVU5WjFKQXkyQTJPa1JYVWtPVmdGTXltVit4VUZGVDNDeURIanEwaE5XQzhndTg4YVIvaUJ6Uk5oa2t3aUh6bkxQSVhXUkJzUUlyY3JIYVJnb3BQV2tTMC9ZY2JQZDhRU25pN0kySUxuZkFTSlRWYWNmR3ArVnIwQ2ljUi9BcS9YaU5PdUVnNktvNE9yVXJTZnNBTEhpWWpjN3A4Wit5R1lSRG1XYVc3anVBTEVMT3p0bFdhc0pPd0hFYnoxaE5UNmRjOWNHQ0swY0h2T0tUVGJRd1NXcWdOQ3lvL1hrbFNNVEdSbXh6NjI0dyswUkRBdEFOZ0U0MDVHVlpRN1F6dXp6dW9PWUNKQmtIZXEzQXNwdXprNjg4K2gydFFJU2owdWM1Q2JGVHR6dVVBeGxORC9Ga1N3OUVUdXVlQ2VObzgxeUp4eW5GUkIyYkxkaTNHNzRzTTNZV0ZaZGY2REdKUENVaWRZZjVmUWlFUXhBdG9odzZFeFRxYnNYV1d6S2prdjRUSWVDZDdMYS9Ld2I3NlN4bCtON0JpRGJSRGgwaGg1QXJGWjBOR0djMnVWK0V0VnQyM2J4TzIyTFR1NUFhZkhsK2dEaHdPemt2ZzZyeXkwaGRieEhDY0FRaWRWdW84NTlvTkpnOWRlQXNuTTNBMmp0eXNxS25uQTgwZVZGbitnZ3F0czJPQ2NlOExUNmpqRDEycURoK2lJQ3BjSHJUUTdSQXdnbmJSZU81ak8zVm9oYllucDlMeDRZYkZ2M2RrTnBjS1FKeUZaK1NkMHpoNWdFc0l2eEhFbUFKQUxEaTFWbHQxQktnM2VMeUYyRU9UMCtBb1RERDl6R1dYNjZZanhlVjdqYjk2bkFlUXJZTHBEcDFnRk1OSjdTNEwwRXBDOXk4dlI5QnRUT0dqbFN6TitoMXdQang5cVR6aTh3MkdOcDhPOEU1RHJrNU9rNzBYS2tpaXVWRHp6N0NZWUJ5R1FDY2l0eThtWW00aWJsNTFiaXltb0hMWG9mM014RVo2QXcyVUZDTTB1RjBZWjR4Vzh3REVDZUlDQ2prSlAzbkRMQjQxVlVFVmZ4Q0dBQ3c4bjd2Ym5rSkYwb1dlSzJOUGcwQWZrTGN2SWUxd0pJSW5HbG1xYkR3ZkJyRFFTRzkzdm9MTHlmaE9OUVNZd2d0OUswVFZZZ3N6VDRBZ0VaaDV5OFNWcm1iQ2V1OHNjYisrQnVic29oMTN6SUczSFd1N3U2aUxxQm4xS2lmOFFNRnBVdFlCS2pMajd3WEJxY1FVRHV4d1c5SHNEKy9kNHdzUk5YSkNTSm9rb0lsVkd3emZKZmpEUGhWdWZCU2Z6R0o3bTdwVWRYTnFQS1BLTHJwS1VCcTVjVkVaQ0hjT25BQ2ZqaFI2ZE4xS3h2OTkyc1JLMlNBSlRuaVk0NEoyckg2M016bTlIckYwYmRqdVBVSnNEeXQvOURRQjdHb052dXhicHYzVFpsdlBmeFl1ZGNZS2JwOEgyVm13cThqZEQ2YlM0STZpby8wNFZVeG4xdVcyRGV6RGtFNUVua2p4L3JTWG5HKzNpeTFXRGliYjlHRkc0L1ErYjd5VFhVRWRSTktqbkRLZ1QxV3FkdkwrRHhCK1lUa0tjeHJXZzBubnpCZlpPcTRzcHBkZ2pCSWVmd2JJZlRxNHRpWjBOT01HL3BJUkRKOW5jU1VkZTRYMlVSQVhrZUsxZmQ0ZW03c3lyaXl2ekFsMXRDa0ZzWUFxZnh3SDJKNkhDNHlVblJiVlB4ODk4RWdTbXVmdnMxaVFpZTZQbWNsNzVIZHZ0N2pPQmlaZVVpWERXMGJXVGdUa3U4Y0R2YlNuYnltdFB4MTRmNnpUTXFzT1RObFNJMTlUSWovQzdsWER3MXJUZGVuSFdLNC9IRisweXNtVFBsdU5GajZBVitUVzdVclp0eDhmbXZpMjZYakRNQTJidjNqeWpmTXhKWDN0QUpsZnVkWDNzVXEwT1NsVnQ3Tk9EV0tPMFhMSm05REFKUGlXYk5saDA2ZnlBWExaMklMMWJmaE5mZXlrU2c0ZXJ1cEdETks3eUhEaTVEcC9OZUVmMTdQOFkrRHdOU1hwNkhBM0pVNUlMaVgvZldqd3VLazBLVk91emtsTVk3OFU3UkFodzQ4THpJeUlqY2xGbmpoSTc4NHN0YjhOMldrU2lZMkFVQjBYQ251cDlZOFdhMlNYOWJqc3pNNmFKVGgvbG1WN1dPVE1sblhocUhyZHVIWXNGNzdRR1I1dWVZanRtMnErUmVETHBxRlZxM21DbnVIRDR0bWc2MUFmbjExMDRRYWJkaHhPaEJXQk0rNDVnbG1sOFRsN0lDSGJQWDR0UW1SZUxaUi84VjI0M2xvVUw1VTBVZnlNcWh1UDJ1UGxqN2RYTy94bmJNdFVzd2NyTEtJTVJyWXZiMFI2M21iM3ZLVTVhWFg0UFV0TUc0ZjNKUExGcmFYT3VWZXNjY0VoRm5ieS82WDFHR244cmZFQzg5OGJBZENlSWV1NVVWRlFPUW50NGZ5ei91aVg4OGNpWjIvUGRFVjFkYUhJc0FSTTg1bzlrZVBIRHZsMWkvY1k0WU9hU1dtSXFyUTJKcEo2WHNqQTBiZXFObHkxdzhOek1iMDRzeUFIR2ljZWVoZzJQVXh5SW92QTV2MUxBZmNNZXdFbXpidFVDMHkzd3hFUm1VS1NyMzcrK0ZKY0VleU1ucWlGbXZaMkxGeWliWXVPVmtDQndQaVVZSUlBREozMUpVWjBCR3QyMzhuWDlHTXUrampienEvekJyMTNwdTFxM3hJTkc4NnZaNVptc2d0MHNGYnIxeE0xcTNDcUt5Y3JGSVQ1K25NaWhsUUE2UlpldldycGcrdXdNeW1tUmlVTCtXQ0g2YWdjOVdOY2JLTDQ3RHp0MXBnRXdGQk1GSlFRQUNWZUJsbFFKRWliOGdxMzhUbk1pWENnNkRGZW1Fenc4QlZodFVsVms1citPWURqVzZhTkVjNk5vSjZISWgwUFVpb0dYekNnQ2JVRjRlUk9QR2k0VVFKYXBEOGpZUTFWNGE2aWxUNFArR0M1T2wreElLbndBQUFBQkpSVTVFcmtKZ2dnPT0NCi8vIEBtYXRjaCAgICAgICAgKjovLyoueW91a3UuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXFpeWkuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXEuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGUuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL3YucXEuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL20udi5xcS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi50dWRvdS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5tZ3R2LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly90di5zb2h1LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLjE5MDUuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL2ZpbG0uc29odS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5wcHR2LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9pdGVtLnRhb2Jhby5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vcy50YW9iYW8uY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9kZXRhaWwudG1hbGwuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL2RldGFpbC50bWFsbC5oay8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly9pdGVtLmpkLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlpeWFvamQuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovL25wY2l0ZW0uamQuaGsvKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5saWFuZ3hpbnlhby5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vbXVzaWMuMTYzLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly95LnFxLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1Z291LmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1d28uY24vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi54aW1hbGF5YS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi56aGlodS5jb20vKg0KLy8gQG1hdGNoICAgICAgICAqOi8vKi5kb3V5aW4uY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyoua3VhaXNob3UuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXhpZ3VhLmNvbS8qDQovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnlvdXR1YmUuY29tLyoNCi8vIEBtYXRjaCAgICAgICAgKjovLzQ3Ljk5LjE1OC4xMTgvKg0KLy8gQGFudGlmZWF0dXJlICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIINCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9sZjI2LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9jcnlwdG8tanMvNC4xLjEvY3J5cHRvLWpzLm1pbi5qcw0KLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmOS1jZG4tdG9zLmJ5dGVjZG50cC5jb20vY2RuL2V4cGlyZS0xLU0vcXJjb2RlanMvMS4wLjAvcXJjb2RlLmpzDQovLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQNCi8vIEBncmFudCAgICAgICAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kDQovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlDQovLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlDQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlDQovLyBAZ3JhbnQgICAgICAgIEdNX2Rvd25sb2FkDQovLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0DQovLyBAZ3JhbnQgICAgICAgIEdNX3NldENsaXBib2FyZA0KLy8gQGNvbm5lY3QgICAgICBpZXNkb3V5aW4uY29tDQovLyBAY29ubmVjdCAgICAgIDQ3Ljk5LjE1OC4xMTgNCi8vID09L1VzZXJTY3JpcHQ9PQ0KDQooZnVuY3Rpb24oKSB7DQogICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgdmFyIGRvbUhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOw0KDQogICAgdmFyIGRvbVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCg0KICAgIGRvbVN0eWxlLnR5cGUgPSAndGV4dC9jc3MnOw0KDQogICAgZG9tU3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOw0KICAgIC8v5bmz5Y+w5Yik5patDQogICAgdmFyIGlzTW9iaWxlID0gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQb2R8QmxhY2tCZXJyeS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7DQoNCiAgICBpZihpc01vYmlsZSl7DQoNCiAgICAgICAgbGV0IHBsYXlMaW5lID0gWw0KICAgICAgICAgICAgeyJuYW1lIjoi57qv5YeAMSIsInVybCI6Imh0dHBzOi8vaW0xOTA3LnRvcC8/ang9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJC56uZMSIsInVybCI6Imh0dHBzOi8vanguanNvbnBsYXllci5jb20vcGxheWVyLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0ifSwNCiAgICAgICAgICAgIHsibmFtZSI6Ik9LIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0ifSwNCiAgICAgICAgICAgIHsibmFtZSI6IuS6uuS6uui/tyIsInVybCI6Imh0dHBzOi8vanguYmxiby5jYzo0NDMzLz91cmw9In0sDQogICAgICAgICAgICB7Im5hbWUiOiLmgJ3lj6QzIiwidXJsIjoiaHR0cHM6Ly9qc2FwLmF0dGFraWRzLmNvbS8/dXJsPSJ9LA0KICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSJ9LA0KICAgICAgICAgICAgeyJuYW1lIjoiWVQiLCJ1cmwiOiJodHRwczovL2p4Lnlhbmd0dS50b3AvP3VybD0ifQ0KICAgICAgICBdOw0KDQogICAgICAgIGxldCB1c2VXZWIgPSBbJ20uYmlsaWJpbGkuY29tJywneW91a3UuY29tJywnd3d3LnlvdWt1LmNvbScsJ20ueW91a3UuY29tJywnbS52LnFxLmNvbScsJ20uaXFpeWkuY29tJywnbS5tZ3R2LmNvbScsJ20udHYuc29odS5jb20nLCdtLjE5MDUuY29tJywnbS5wcHR2LmNvbScsJ20ubGUuY29tJ107DQoNCiAgICAgICAgaWYodXNlV2ViLmluZGV4T2YobG9jYXRpb24uaG9zdCkgPT0gLTEpew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4jeaYr+W6lOeUqOe9keermScpO3JldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsNCg0KICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOw0KDQogICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7DQoNCiAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7DQoNCiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0Q29va2llKGNuYW1lKXsNCiAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7DQogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsNCiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvbSxkb21JZCl7DQoNCiAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOw0KDQogICAgICAgICAgICBuZXdFbGVtZW50LmlkID0gZG9tSWQ7DQoNCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7DQoNCiAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnRIdG1sQ29udGVudCk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHRvYXN0KG1zZyxkdXJhdGlvbil7DQoNCiAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOw0KDQogICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOw0KDQogICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycNCg0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0b2FzdERvbSk7DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsNCg0KICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnLXdlYmtpdC10cmFuc2Zvcm0gJyArIGQgKyAncyBlYXNlLWluLCBvcGFjaXR5ICcgKyBkICsgJ3MgZWFzZS1pbic7DQoNCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOw0KDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOw0KDQogICAgICAgICAgICB9LCBkdXJhdGlvbik7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHBsYXlWaWRlb0Z1bmMoKXsNCiAgICAgICAgICAgIC8vY3NzDQogICAgICAgICAgICBsZXQgcGxheVZpZGVvU3R5bGUgPSBgDQogICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsNCiAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7Y3Vyc29yOnBvaW50ZXI7DQogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5Ow0KICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7DQogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGV0OjBweDt0b3A6MzYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZTsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7DQogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGVmdDo0MHB4O3RvcDozNjBweDsNCiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7DQogICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lew0KICAgICAgICAgICAgICAgIHdpZHRoOjMyMHB4Ow0KICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsNCiAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsNCiAgICAgICAgICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7DQogICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7DQogICAgICAgICAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDsNCiAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOw0KICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4Ow0KICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpew0KICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsNCiAgICAgICAgICAgICAgICBtYXJnaW46MnB4Ow0KICAgICAgICAgICAgICAgIHdpZHRoOjMwJTsNCiAgICAgICAgICAgICAgICBjb2xvcjojRkZGOw0KICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOw0KICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MzsNCiAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOw0KICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7DQogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsNCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsNCiAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOw0KICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMA0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7DQogICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsNCiAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsNCiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsNCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGA7DQoNCiAgICAgICAgICAgIGRvbVN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7DQoNCiAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7DQogICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyB0YXJnZXQ9J19ibGFuaycgc3R5bGU9JycgY2xhc3M9J3BsYXlCdXR0b24gemhtX3BsYXlfdmlkb2VfaWNvbicgaWQ9J3pobWxvZ28nPjxpbWcgY2xhc3M9J2ljb25Mb2dvJyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09JyB0aXRsZT0n54K55Ye75Y+z5L6n5YiX6KGo6L+b6KGM6Kej5p6QJyBzdHlsZT0nd2lkdGg6NDBweCc+IjsNCg0KICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJyBzdHlsZT0nZGlzcGxheTpub25lOyc+Ig0KDQogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2xpbmUnPiI7DQoNCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOw0KDQogICAgICAgICAgICBwbGF5TGluZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7DQoNCiAgICAgICAgICAgICAgICBpZihnZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpew0KDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSd6aG1fbGluZV9zZWxlY3RlZCc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7DQoNCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8L2Rpdj48L2Rpdj48L2Rpdj4iOw0KDQogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fDQoNCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOw0KDQogICAgICAgICAgICBwbGF5SnhIdG1sICs9ICI8aWZyYW1lIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nbm8nIGFsbG93ZnVsbHNjcmVlbj10cnVlIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgbmFtZT0nanhfcGxheScgc3R5bGU9J2hlaWdodDoxMDAlO3dpZHRoOjEwMCUnIGlkPSdwbGF5SWZyYW1lJz48L2lmcmFtZT48L2Rpdj4iOw0KDQogICAgICAgICAgICAvL+W+queOr+WIpOaWreaYr+WQpuWcqOaSreaUvumhte+8jOaYr+WImeaJp+ihjOS4i+mdog0KICAgICAgICAgICAgbGV0IGp4VmlkZW9EYXRhID0gWw0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwveFwvcGxheVwuaHRtbFw/Y2lkPS8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3BsYXlcLmh0bWxcP2NpZFw9LyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvY292ZXJcLy4qaHRtbC8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbVwveFwvbVwvcGxheVw/LipjaWQuKi8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmludGwtdmlkZW8td3JhcCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwueW91a3VcLmNvbVwvdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvdmlkZW9cLy8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtYm9keSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIudmlkZW8tYXJlYSIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwubWd0dlwuY29tXC9iLyxhcmVhQ2xhc3NOYW1lOidjbGVhcmZpeCd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbGVfcGxheWJveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvcHR2XC92cGxheVwvLyxhcmVhQ2xhc3NOYW1lOidzaWRlc2xpcF9zbGlkZSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjai1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3ZwbGF5LyxhcmVhQ2xhc3NOYW1lOidqdWppJ30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3BsYXlcLnR1ZG91XC5jb21cL3Zfc2hvd1wvaWRfL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwcHR2X3BsYXlwYWdlX2JveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwucHB0dlwuY29tXC9zaG93XC8vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdmlwXC4xOTA1LmNvbVwvcGxheVwvL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiN2b2RQbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuMTkwNS5jb21cL3ZvZFwvcGxheVwvL30sDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAvL+WIm+W7umxvZ29faWNvbg0KICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOw0KDQogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgIHpobVBsYXkuaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOw0KDQogICAgICAgICAgICBsZXQganhWaWRlb1dlYiA9IGp4VmlkZW9EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOw0KDQogICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGggPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+ivt+WcqOinhumikeaSreaUvumhteeCueWHu+WbvuaghycpOw0KDQogICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnpobV9wbGF5X3ZpZGVvX3dyYXAnKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVNob3cgPSBwbGF5TGluZURpdi5zdHlsZS5kaXNwbGF5Ow0KDQogICAgICAgICAgICAgICAgICAgIHBsYXlTaG93ID09ICdub25lJz8gcGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc6cGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgcGxheUxpbmVUZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wbGF5TGluZVRkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgemhtX2xpbmVfc2VsZWN0ZWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZSgncGxheUxpbmVBY3Rpb24nLHRoaXMuZ2V0QXR0cmlidXRlKCd1cmwnKSwzMCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm93V2ViTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobm93Tm9kZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dXZWJOb2RlLmlubmVySFRNTCA9IHBsYXlKeEh0bWw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlJZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheUlmcmFtZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHnvZHnq5nnu5PngrnkuI3lrZjlnKgnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOw0KDQogICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApDQoNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0pDQoNCg0KICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2p4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9TZWxlY3Qpew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICB9DQoNCiAgICAgICAgcGxheVZpZGVvRnVuYygpOw0KDQogICAgfWVsc2V7DQogICAgICAgIC8qLS1jb25maWctLSovDQogICAgICAgIHZhciBDb25maWcgPXsNCg0KICAgICAgICBjb3Vwb25Vcmw6d2luZG93LmxvY2F0aW9uLmhyZWYsDQoNCiAgICAgICAgY291cG9uSG9zdDp3aW5kb3cubG9jYXRpb24uaG9zdCwNCg0KICAgICAgICB3ZWJVcmw6J2h0dHA6Ly9tdXNpYy5saXV6aGlqaW4uY24vJywNCg0KICAgICAgICBpY29uVmlwVG9wOjM2MCwNCg0KICAgICAgICBpY29uVmlwUG9zaXRpb24gOiAnbGVmdCcsDQoNCiAgICAgICAgaWNvblZpcFdpZHRoIDogNDAsDQoNCiAgICAgICAgY291cG9uVGltZXJOdW0gOiAxMDAsLy8xMDDmrKHnrYnkuo4xMOenkg0KDQogICAgICAgIGNvdXBvbldhaXRUaW1lIDogMTAwLA0KDQogICAgICAgIGljb25XYWl0VGltZSA6IDEwMCwNCg0KICAgICAgICBpY29uVmlwT3BhY2l0eToxMDAsDQoNCiAgICAgICAgc2VsZWN0ZWRMZWZ0OidzZWxlY3RlZCcsDQoNCiAgICAgICAgc2VsZWN0ZWRSaWdodDonJywNCg0KICAgICAgICB2aWRlb1BsYXlMaW5lQWRkOkdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJywwKSwNCg0KICAgICAgICBkeVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2R5VmlkZW9Eb3dubG9hZCcsMjIpLA0KDQogICAgICAgIGtzVmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgna3NWaWRlb0Rvd25sb2FkJywyMiksDQoNCiAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCd4aWd1YVZpZGVvRG93bmxvYWQnLDIyKSwNCg0KICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgnYmlsaVZpZGVvRG93bmxvYWQnLDIyKSwNCg0KICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgneW91dHViZVZpZGVvRG93bmxvYWQnLDIyKSwNCg0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHtjb3Vwb25VcmwsDQogICAgICAgICAgICBjb3Vwb25Ib3N0LA0KICAgICAgICAgICAgd2ViVXJsLA0KICAgICAgICAgICAgaWNvblZpcFRvcCwNCiAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiwNCiAgICAgICAgICAgIGljb25WaXBXaWR0aCwNCiAgICAgICAgICAgIGljb25WaXBPcGFjaXR5LA0KICAgICAgICAgICAgY291cG9uVGltZXJOdW0sDQogICAgICAgICAgICBjb3Vwb25XYWl0VGltZSwNCiAgICAgICAgICAgIGljb25XYWl0VGltZSwNCiAgICAgICAgICAgIHNlbGVjdGVkTGVmdCwNCiAgICAgICAgICAgIHNlbGVjdGVkUmlnaHQsDQogICAgICAgICAgICB2aWRlb1BsYXlMaW5lQWRkLA0KICAgICAgICAgICAgZHlWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAga3NWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkLA0KICAgICAgICAgICAgYmlsaVZpZGVvRG93bmxvYWQsDQogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZA0KICAgICAgICB9ID0gQ29uZmlnOw0KICAgICAgICAvKi0tbGFuZy0tKi8NCiAgICAgICAgdmFyIGxhbmcgPSB7DQogICAgICAgICAgICBzZXQ6J+iuvue9ricsDQogICAgICAgICAgICBpY29uUG9zaXRpb246J+Wbvuagh+S9jee9ricsDQogICAgICAgICAgICBwbGF5VmlkZW86J+inhumikeino+aekCcsDQogICAgICAgICAgICBwbGF5TXVzaWM6J+mfs+S5kOS4i+i9vScsDQogICAgICAgICAgICB6aE5pY2U6J+efpeS5juWinuW8uicsDQogICAgICAgICAgICB2aWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLA0KICAgICAgICAgICAgaWNvbkhlaWdodDon5Zu+5qCH6auY5bqmJywNCiAgICAgICAgICAgIGljb25XaWR0aDon5Zu+5qCH5aSn5bCPJywNCiAgICAgICAgICAgIGljb25MaW5lOifmsLTlubPkvY3nva4nLA0KICAgICAgICAgICAgaWNvbldhaXRUaW1lOifnrYnlvoXml7bpl7QnLA0KICAgICAgICAgICAgaWNvbkxlZnQ6J+mdoOW3picsDQogICAgICAgICAgICBpY29uUmlnaHQ6J+mdoOWPsycsDQogICAgICAgICAgICB0aXBJY29uSGVpZ2h0Oifpu5jorqQzNjAs5bu66K6uMX41MDAnLA0KICAgICAgICAgICAgdGlwSWNvbldpZHRoOifpu5jorqQ0MCzlu7rorq4yMH41MCcsDQogICAgICAgICAgICB0aXBJY29uT3BhY2l0eTon6K+35aGr5YaZMC0xMDDnmoTmlbTmlbAnLA0KICAgICAgICAgICAgdGlwRXJyb3JJY29uSGVpZ2h0Oic85Zu+5qCH5L2N572uPuS4reeahDzlm77moIfpq5jluqY+5bqU5Li6MTAwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjF+NTAwJywNCiAgICAgICAgICAgIHRpcEVycm9ySWNvbldpZHRoOic85Zu+5qCH5L2N572uPuS4reeahDzlm77moIflpKflsI8+5bqU5Li6MTAw5Lul5YaF5q2j5pW05pWw77yM5bu66K6uMjB+NTAnLA0KICAgICAgICAgICAgdGlwRXJyb3JJY29uT3BhY2l0eTon5aGr5YaZ5pWw5a2X5LiN5q2j56GuJywNCiAgICAgICAgICAgIHNldFBsYXlWaWRlbzon6Kej5p6Q6K6+572uJywNCiAgICAgICAgICAgIHBsYXlWaWRlb0xpbmVBZGQ6J+ermeWkluino+aekCcsDQogICAgICAgICAgICB0aXBQbGF5VmlkZW9MaW5lQWRkOifor7floavlhaXnur/ot6/lkI3np7DlkozlnLDlnYDvvIzkuK3pl7TnlKjljYrop5LpgJflj7fpmpTlvIDvvIzmr4/nur/ot6/kuIDooYzjgIInLA0KICAgICAgICAgICAgemhTZXQ6J+efpeS5juiuvue9ricsDQogICAgICAgICAgICB6aFZpZGVvQ2xvc2U6J+Wxj+iUveinhumikScsDQogICAgICAgICAgICB6aFZpZGVvRG93bmxvYWQ6J+inhumikeS4i+i9vScsDQogICAgICAgICAgICB6aEFEQ2xvc2U6J+Wxj+iUveW5v+WRiicsDQogICAgICAgICAgICB6aENsb3NlTGVmdDon5YWz6Zet5L6n6L655qCPJywNCiAgICAgICAgICAgIHpoQ2hhbmdlTGluazon6ZO+5o6l55u05o6l6Lez6L2sJywNCiAgICAgICAgICAgIHNwZWNpYWxDb2x1bW46J+agh+iusOaWh+eroCcsDQogICAgICAgICAgICB2aWRlb1RpdGxlOifmoIforrDop4bpopEnLA0KICAgICAgICAgICAgemhLZXl3b3JkQ2xvc2U6J+Wxj+iUveWFs+mUruivjScsDQogICAgICAgICAgICB0aXBLZXl3b3JkOifor7fovpPlhaXlhbPplK7or40s55SoIiwi5Y+36ZqU5byAJywNCiAgICAgICAgICAgIGF1dGhvck5hbWVDbG9zZTon5bGP6JS955So5oi3JywNCiAgICAgICAgICAgIHRpcEF1dGhvck5hbWU6J+ivt+i+k+WFpeeUqOaIt+WQjSznlKgiLCLlj7fpmpTlvIAnLA0KICAgICAgICAgICAgeWFueHVhbkNsb3NlOiflsY/olL3nm5DpgIknLA0KICAgICAgICAgICAgZHlWaWRlb0Rvd25sb2FkOifmipbpn7PkuIvovb0nLA0KICAgICAgICAgICAga3NWaWRlb0Rvd25sb2FkOiflv6vmiYvkuIvovb0nLA0KICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkOifopb/nk5zkuIvovb0nLA0KICAgICAgICAgICAgYmlsaVZpZGVvRG93bmxvYWQ6J0Lnq5kgKGJpbGliaWxpKSDkuIvovb0nLA0KICAgICAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQ6J3lvdXR1YmXkuIvovb0nLA0KICAgICAgICB9Ow0KDQogICAgICAgIC8qLS1kYXRhcy0tKi8NCiAgICAgICAgdmFyIGRhdGFzID0gew0KDQogICAgICAgICAgICBnZXRDb3Vwb246W3tpc09wZW46MjIsd2ViOlsNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidGFvYmFvIixub2RlOiIuSl9MaW5rQWRkIixtYXRjaDovaXRlbVwudGFvYmFvXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGxDYW9zaGkiLG5vZGU6IiNKX0xpbmtCdXkiLG1hdGNoOi9eaHR0cHM/OlwvXC9jaGFvc2hpLmRldGFpbC50bWFsbC5jb21cLy99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbENhb3NoaSIsbm9kZToiLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3IixtYXRjaDovXmh0dHBzPzpcL1wvY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tXC8vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6Ii5CYXNpY0NvbnRlbnQtLWFjdGlvbnMtLTFjbzhzeDgiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6IiNKX0xpbmtCdXkiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGxPdGhlciIsbm9kZToiLnRtLW1zZy1ib3giLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6Ii5CYXNpY0NvbnRlbnQtLWFjdGlvbnMtLTFjbzhzeDgiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5oay99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJqZCIsbm9kZToiI2Nob29zZS1idG5zIixtYXRjaDovaXRlbVwuamRcLmNvbS99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJqZCIsbm9kZToiI2Nob29zZS1idG5zIixtYXRjaDovXC55aXlhb2pkXC5jb20vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L25wY2l0ZW1cLmpkXC5oay99LA0KICAgICAgICAgICAgXX1dLA0KICAgICAgICAgICAganhWaWRlbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovaHR0cHM/OlwvXC92XC5xcVwuY29tLyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovaHR0cHM/OlwvXC9tXC52XC5xcVwuY29tLyxuYW1lOidxcU1vYmlsZSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5pcWl5aVwuY29tLyxuYW1lOidpcWl5aVBjJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5pcVwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwcz86XC9cL20uaXFpeWlcLmNvbS8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC8uKnlvdWt1XC5jb20vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuYmlsaWJpbGlcLmNvbS99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL21cLmJpbGliaWxpXC5jb20vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L21ndHZcLmNvbS8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyBjbGVhcmZpeCd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi8udHZcLnNvaHVcLmNvbS99LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC50dlwuc29odVwuY29tL30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyV3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovZmlsbVwuc29odVwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi90dWRvdVwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6L2xlXC5jb20vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovcHB0dlwuY29tL30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6LzE5MDVcLmNvbS99LA0KDQogICAgICAgICAgICBdfV0sDQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgIGJha2p4VmlkZW86W3tpc09wZW46R01fZ2V0VmFsdWUoJ21vdmllTGlzdCcsJzIyJyksd2ViOlsNCiAgICAgICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtb2RfcGxheWVyIiAsbm9kZVR5cGU6J2lkJyAsbWF0Y2g6L3ZcLnFxXC5jb21cL3hcL2NvdmVyLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZSd9LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtb2RfcGxheWVyIiAsbm9kZVR5cGU6J2lkJyAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZScsbmFtZToncXFQQyd9LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtb2RfcGxheWVyIiAsbm9kZVR5cGU6J2lkJyAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldK1wvW2EtekEtWjAtOV0rLmh0bWwvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmNvbnRhaW5lci1wbGF5ZXIiICxub2RlVHlwZTonY2xhc3MnLCBtYXRjaDovdlwucXFcLmNvbVwveFwvcGFnZS8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD9jaWQvfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9wbGF5XC5odG1sXD9jaWQ9L30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwudlwucXFcLmNvbVwvcGxheVwuaHRtbFw/Y2lkXD0vfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC9jb3ZlclwvLipodG1sL30sDQoNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjZmxhc2hib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidxeS1lcGlzb2RlLW51bScsbmFtZTonaXFpeWlQYyd9LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFcLmNvbVwvcGxheVwvLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LA0KDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfL30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwueW91a3VcLmNvbVwvdl9zaG93XC9pZF8vfSwNCg0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNiaWxpYmlsaVBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC92aWRlby99LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJfbW9kdWxlIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL2Jhbmd1bWkvLGFyZWFDbGFzc05hbWU6J2VwLWxpc3Qtd3JhcHBlciByZXBvcnQtd3JhcC1tb2R1bGUnfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtY29udGFpbmVyIG5vLXdyYXAnfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvdmlkZW9cLy99LA0KDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtZ3R2LXBsYXllci13cmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9tZ3R2XC5jb21cL2IvLGFyZWFDbGFzc05hbWU6J2VwaXNvZGUtaXRlbXMgY2xlYXJmaXgnfSwNCg0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LA0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb21cL2FsYnVtXC8vfSwNCg0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LA0KICAgICAgICAgICAgICAgICAgICAvL+aXoOWNleeLrOaSreaUvumhtXtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiai1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3ZwbGF5X1wvL30sDQoNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LA0KDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LA0KICAgICAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToicHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwucHB0dlwuY29tXC9zaG93XC8vfSwNCiAgICAgICAgICAgICAgICAgICAgLy/lm77moIfmnKrmmL7npLp7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6InBwbGl2ZS1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnBwdHZcLmNvbVwvc2hvd1wvL30sDQoNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwNCiAgICAgICAgICAgICAgICBdfV0sDQogICAgICAgICovDQogICAgICAgICAgICBqeE11c2ljOlt7aXNPcGVuOkdNX2dldFZhbHVlKCdtdXNpY0xpc3QnLCcyMicpLHdlYjpbDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J25ldGVhc2UnLG1hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb20vLHRpcDon6K+35Zyo6Z+z5LmQ5Y2V5puy6aG154K55Ye75Zu+5qCH5LiL6L29J30sDQoNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZToncXEnLG1hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOWcqOaSreaUvumhteeCueWHu+Wbvuagh+S4i+i9vSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J2t1Z291JyxtYXRjaDova3Vnb3VcLmNvbS8sdGlwOifor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29Iid9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J2t1d28nLG1hdGNoOi9rdXdvXC5jbi8sdGlwOifor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29Iid9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J3hpbWFsYXlhJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30NCiAgICAgICAgICAgIF19XSwNCg0KICAgICAgICAgICAgcGxheUxpbmU6Ww0KICAgICAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL2ltMTkwNy50b3AvP2p4PSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi54ix6LGGIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiQkwiLCJ1cmwiOiJodHRwczovL3ZpcC5ibGppZXguY29tLz92PSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Yaw6LGGIiwidXJsIjoiaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IueZvuWfnyIsInVybCI6Imh0dHBzOi8vanguNjE4Zy5jb20vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IkNLIiwidXJsIjoiaHR0cHM6Ly93d3cuY2twbGF5ZXIudmlwL2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6ImNrbW92IiwidXJsIjoiaHR0cHM6Ly93d3cuY2ttb3YudmlwL2FwaS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiSDgiLCJ1cmwiOiJodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiSlkiLCJ1cmwiOiJodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QIiwidXJsIjoiaHR0cHM6Ly9ja21vdi5jY3lqamQuY29tL2NrbW92Lz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLop6PmnpBsYSIsInVybCI6Imh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLogIHmnb8iLCJ1cmwiOiJodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Ik1BTyIsInVybCI6Imh0dHBzOi8vd3d3Lm10b3N6LmNvbS9tM3U4LnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJNM1U4IiwidXJsIjoiaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLor7rorq8iLCJ1cmwiOiJodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Ik9LIiwidXJsIjoiaHR0cHM6Ly9va2p4LmNjLz91cmw9IiwibW9iaWxlIjoxfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJQTSIsInVybCI6Imh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnm5jlj6QiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkuIPlk6UiLCJ1cmwiOiJodHRwczovL2p4Lm5ueHYuY24vdHYucGhwP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IlJESEsiLCJ1cmwiOiJodHRwczovL2p4LnJkaGsubmV0Lz92PSIsIm1vYmlsZSI6MX0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Lq65Lq66L+3IiwidXJsIjoiaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuaAneS6kSIsInVybCI6Imh0dHBzOi8vanguYXAycC5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5oCd5Y+kMyIsInVybCI6Imh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6Iue7tOWkmiIsInVybCI6Imh0dHBzOi8vanguaXZpdG8uY24vP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuiZvuexsyIsInVybCI6Imh0dHBzOi8vangueG1mbHYuY29tLz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoi5LqR56uvIiwidXJsIjoiaHR0cHM6Ly9zYi41Z3Nlby5uZXQvP3VybD0iLCJtb2JpbGUiOjB9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IuS6keaekCIsInVybCI6Imh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMDUyMyIsInVybCI6Imh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTfkupEiLCJ1cmwiOiJodHRwczovL3d3dy4xNzE3eXVuLmNvbS9qeC90eS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sDQogICAgICAgICAgICAgICAgeyJuYW1lIjoiMTgwIiwidXJsIjoiaHR0cHM6Ly9qeC4wMDAxODAudG9wL2p4Lz91cmw9IiwibW9iaWxlIjowfSwNCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI0SyIsInVybCI6Imh0dHBzOi8vanguNGtkdi5jb20vP3VybD0iLCJtb2JpbGUiOjF9LA0KICAgICAgICAgICAgICAgIHsibmFtZSI6IjgwOTAiLCJ1cmwiOiJodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPSIsIm1vYmlsZSI6MH0NCiAgICAgICAgICAgIF0sDQoNCiAgICAgICAgICAgIHpoTmljZTpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnemhpaHVMaXN0JywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonemhOaWNlJyxtYXRjaDovXmh0dHBzPzpcL1wvW2Etel0rXC56aGlodVwuY29tL30NCiAgICAgICAgICAgIF19XSwNCiAgICAgICAgICAgIHRhb2Jhbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgndGFvYmFvJywnMjInKSx3ZWI6Ww0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondGFvYmFvU2VhcmNoJyxtYXRjaDovXmh0dHBzPzpcL1wvc1wudGFvYmFvXC5jb21cL3NlYXJjaFw/LisvfQ0KICAgICAgICAgICAgXX1dLA0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICBkb3VZaW46W3tpc09wZW46R01fZ2V0VmFsdWUoJ2RvdXlpbkxpc3QnLCcyMicpLHdlYjpbDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonZG91eWluRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC8/W14uK10kL30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonZG91eWluRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9cP2VudGVyXD1ndWlkZSQvfSwNCiAgICAgICAgICAgICAgICBdfV0sDQogICAgICAgICovDQogICAgICAgICAgICB2aWRlb0Rvd25sb2FkOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd2aWRlb0Rvd25sb2FkTGlzdCcsJzIyJyksd2ViOlsNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz9bXi4rXSQvfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9cP2VudGVyXD1ndWlkZSQvfSwNCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9mb2xsb3ckL30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvdnMkL30sDQogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvZGlzY292ZXJcP21vZGFsX2lkPS4rJC99DQogICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC8/LiskLyxpc1dlYk9wZW46ZHlWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2tzVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wua3VhaXNob3VcLmNvbVwvPy4rJC8saXNXZWJPcGVuOmtzVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXhpZ3VhXC5jb21cL1swLTldK1w/LiskLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXhpZ3VhXC5jb21cLy8saXNXZWJPcGVuOnhpZ3VhVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidiaWxpVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuYmlsaWJpbGlcLmNvbVwvLyxpc1dlYk9wZW46YmlsaVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneW91dHViZVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnlvdXR1YmVcLmNvbS8saXNXZWJPcGVuOnlvdXR1YmVWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgIF19XSwNCg0KICAgICAgICAgICAga2V5Q29kZTpbDQogICAgICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMCd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjQ4LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonKSd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjQ5LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzEnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OnRydWUsdmFsdWU6JyEnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1MCxpc1NoaWZ0OmZhbHNlLHZhbHVlOicyJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTAsaXNTaGlmdDp0cnVlLHZhbHVlOidAJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMyd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjUxLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonIyd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjUyLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzQnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OnRydWUsdmFsdWU6JyQnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1Myxpc1NoaWZ0OmZhbHNlLHZhbHVlOic1J30sDQogICAgICAgICAgICAgICAge2NvZGU6NTMsaXNTaGlmdDp0cnVlLHZhbHVlOiclJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU0LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonXid9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU1LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzcnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OnRydWUsdmFsdWU6JyYnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo1Nixpc1NoaWZ0OmZhbHNlLHZhbHVlOic4J30sDQogICAgICAgICAgICAgICAge2NvZGU6NTYsaXNTaGlmdDp0cnVlLHZhbHVlOicqJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOSd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjU3LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonKCd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjcwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2YnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OnRydWUsdmFsdWU6J0YnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3NCxpc1NoaWZ0OmZhbHNlLHZhbHVlOidqJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NzQsaXNTaGlmdDp0cnVlLHZhbHVlOidKJ30sDQogICAgICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDpmYWxzZSx2YWx1ZTonayd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjc1LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonSyd9LA0KICAgICAgICAgICAgICAgIHtjb2RlOjc2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2wnfSwNCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OnRydWUsdmFsdWU6J0wnfSwNCiAgICAgICAgICAgIF0sDQoNCiAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uOlt7bmFtZTon55u05o6l5LiL6L29JyxpZDondG9Eb3dubG9hZCd9LHtuYW1lOiflpI3liLbpk77mjqUnLGlkOid0b0NvcHknfSx7bmFtZTon5omT5byA5paH5Lu2JyxpZDondG9MaW5rJ31dDQoNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciB7Z2V0Q291cG9uLGp4VmlkZW8sanhNdXNpYyxwbGF5TGluZSx6aE5pY2UsdGFvYmFvLHZpZGVvRG93bmxvYWQsa2V5Q29kZSxkb3dubG9hZE9wdGlvbn0gPSBkYXRhczsNCg0KICAgICAgICAvKi0tQ2xhc3MtLSovDQogICAgICAgIGNsYXNzIEJhc2VDbGFzc3sNCg0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCg0KICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb25TZXRQYWdlJykgIT0gMCl7DQogICAgICAgICAgICAgICAgICAgIC8qY29va2ll5a2Y5YKoDQogICAgICAgICAgICAgICAgICAgIGljb25WaXBUb3AgPSB0aGlzLmdldENvb2tpZSgnaWNvblRvcCcpP3RoaXMuZ2V0Q29va2llKCdpY29uVG9wJyk6aWNvblZpcFRvcDsNCg0KICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSB0aGlzLmdldENvb2tpZSgnaWNvblBvc2l0aW9uJyk/dGhpcy5nZXRDb29raWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsNCg0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExlZnQgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8nc2VsZWN0ZWQnOicnOw0KDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmlnaHQgPSBpY29uVmlwUG9zaXRpb249PSdyaWdodCc/J3NlbGVjdGVkJzonJzsNCg0KICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSB0aGlzLmdldENvb2tpZSgnaWNvbldpZHRoJyk/dGhpcy5nZXRDb29raWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsNCiAgICAgICAgICAgICAgICAgICAgKi8NCg0KICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gR01fZ2V0VmFsdWUoJ2ljb25Ub3AnKSB8fCBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOw0KDQogICAgICAgICAgICAgICAgICAgIGljb25WaXBQb3NpdGlvbiA9IEdNX2dldFZhbHVlKCdpY29uUG9zaXRpb24nKT9HTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk6aWNvblZpcFBvc2l0aW9uOw0KDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGVmdCA9IGljb25WaXBQb3NpdGlvbj09J2xlZnQnPydzZWxlY3RlZCc6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOw0KDQogICAgICAgICAgICAgICAgICAgIGljb25WaXBXaWR0aCA9IEdNX2dldFZhbHVlKCdpY29uV2lkdGgnKT9HTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk6aWNvblZpcFdpZHRoOw0KDQogICAgICAgICAgICAgICAgICAgIGljb25XYWl0VGltZSA9IEdNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKT9HTV9nZXRWYWx1ZSgnaWNvbldhaXRUaW1lJykqMTAwMDppY29uV2FpdFRpbWU7DQoNCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcE9wYWNpdHkgPSBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSB8fCBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSA9PSAwP0dNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpOmljb25WaXBPcGFjaXR5Ow0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgi6K6+572uIiwgKCkgPT4gdGhpcy5tZW51U2V0KCkpOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIG1lbnVTZXQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICBsZXQgbWVudVNldFN0eWxlID0gYA0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobU1hc2t7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OTk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDt0b3A6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowLjg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAud3JhcC1ib3h7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOzt0b3A6IDUwJTtsZWZ0OiA1MCU7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTIwMHB4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzAwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICM1NTU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6aGlkZGVuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6MTZweCBudW1Gb250LFBpbmdGYW5nU0MtUmVndWxhcixUYWhvbWEsTWljcm9zb2Z0IFlhaGVpLHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDo0MDAgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwSGVhZHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7aGVpZ2h0OjQwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDo0MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaSBsaXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaUNvbnRlbnR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwU2F2ZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTJweDtyaWdodDoxMHB4O2ZvbnQtc2l6ZToyNHB4O2N1cnNvcjpwb2ludGVyDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3R7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjBweDtwYWRkaW5nOjEwcHggMjBweDt3aWR0aDoxMDAlOw0KICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDA5O2JhY2tncm91bmQ6I2ZlZjllZjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpIGxpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4IDJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaSBhew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiM1NTU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBhOmhvdmVyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmU2ZDczOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MHB4O2xlZnQ6MzAwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRVbEhlYWR7DQogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VIZWFkew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjQwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6NDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmZmOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VMaSBsaXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6OHB4IDIwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDtiYWNrZ3JvdW5kOiNmZmY7d2lkdGg6MzAwcHg7aGVpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VJbnB1dHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlTGl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MjU4cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlQ29udGVudHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIC5jaXJjdWxhcnsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogNDBweDtoZWlnaHQ6IDIwcHg7Ym9yZGVyLXJhZGl1czogMTZweDt0cmFuc2l0aW9uOiAuM3M7Y3Vyc29yOiBwb2ludGVyO2JveC1zaGFkb3c6IDAgMCAzcHggIzk5OSBpbnNldDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5yb3VuZC1idXR0b257DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwcHg7aGVpZ2h0OiAyMHB4Oztib3JkZXItcmFkaXVzOiA1MCU7Ym94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwwLDAsLjUpO3RyYW5zaXRpb246IC4zcztwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuYmFja3sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHNvbGlkICNGRkY7IGJvcmRlci13aWR0aDogMCAzcHggM3B4IDA7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogM3B4O3RyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7ICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7bWFyZ2luLWxlZnQ6MTBweDtjdXJzb3I6cG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50by1yaWdodHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDoyMHB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7Y3Vyc29yOnBvaW50ZXI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0U2F2ZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiNGRkY7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6MHB4O2xlZnQ6MzAwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9oZWFkZXJ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDo0MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmU2ZDczOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9jb250ZW50ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjIwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoeaVtOS9k+agt+W8jyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggOiAwcHg7ICAvKumrmOWuveWIhuWIq+WvueW6lOaoquerlua7muWKqOadoeeahOWwuuWvuCovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1cyAgIDogMnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdoui9qOmBkyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAgIDogaW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAgIDogI2VkZWRlZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0IGxpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGxpOmxhc3QtY2hpbGR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTpub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGx7DQogICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGwgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHmlbTkvZPmoLflvI8qLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMXB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1cyAgIDogMnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i6L2o6YGTKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvKi1mb3JtLSovDQogICAgICAgICAgICAgICAgICAgICAgICA6cm9vdCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1iYXNlLWNvbG9yOiAjNDM0YTU2Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2hpdGUtY29sb3ItcHJpbWFyeTogI2Y3ZjhmODsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXNlY29uZGFyeTogI2ZlZmVmZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3ItcHJpbWFyeTogI2MyYzJjMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3Itc2Vjb25kYXJ5OiAjYzJjMmMyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci10ZXJ0aWFyeTogIzY3NmY3OTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWFjdGl2ZS1jb2xvcjogIzIyN2M5ZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXZhbGlkLWNvbG9yOiAjYzJjMmMyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1jb2xvcjogI2Y3MmY0NzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWludmFsaWQtaWNvbjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwd2lkdGglM0QlMjIyNCUyMiUyMGhlaWdodCUzRCUyMjI0JTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMjQlMjAyNCUyMiUzRSUyMCUzQ3BhdGglMjBkJTNEJTIyTTEzLjQxJTIwMTJsNC4zLTQuMjlhMSUyMDElMjAwJTIwMSUyMDAtMS40Mi0xLjQyTDEyJTIwMTAuNTlsLTQuMjktNC4zYTElMjAxJTIwMCUyMDAlMjAwLTEuNDIlMjAxLjQybDQuMyUyMDQuMjktNC4zJTIwNC4yOWExJTIwMSUyMDAlMjAwJTIwMCUyMDAlMjAxLjQyJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMGw0LjI5LTQuMyUyMDQuMjklMjA0LjNhMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMCUyMDElMjAxJTIwMCUyMDAlMjAwJTIwMC0xLjQyeiUyMiUyMGZpbGwlM0QlMjIlMjNmNzJmNDclMjIlMjAlMkYlM0UlM0MlMkZzdmclM0UiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OjBweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEuN2VtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAycHggMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo1NSU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTo6LW1vei1wbGFjZWhvbGRlciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjpwbGFjZWhvbGRlciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICosIDo6YWZ0ZXIsIDo6YmVmb3JlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaXRpYWwgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWRdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OmZvY3VzIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMC41ZW0gY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxLjVlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdICsgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW52YWxpZC1pY29uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjVzIGVhc2Utb3V0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjkwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveDo6YWZ0ZXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiA2cHggNHB4IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvIDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtNzJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxLjdlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IGNhbGMoMWVtICsgMTZweCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE0MCU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjJweDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0taW52YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keS5mb2N1cy12aXNpYmxlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogaW5oZXJpdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWVtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6b25seS1jaGlsZCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogdmVydGljYWw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6Zm9jdXMgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWN0aXZlLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW52YWxpZC1jb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWEgLl9kdW1teS1ib3ggew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjQwcHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xlZnRNb3Zlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjptb3ZlVG9MZWZ0IDAuNXMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9MZWZ0ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MjAwcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9MZWZ0IC8qU2FmYXJpIGFuZCBDaHJvbWUqL3sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAudG9SaWdodE1vdmV7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgbW92ZVRvUmlnaHR7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMDBweDt9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9SaWdodCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMHB4O30NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYDsNCg0KICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtZW51U2V0U3R5bGUpKTsNCg0KICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICAgICAgdmFyIHNldExpc3RKc29uPSBbDQogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcuaWNvblBvc2l0aW9uLCdzZXRMaXN0SUQnOidpY29uUG9zaXRpb25TZXRQYWdlJywnc2V0UGFnZUlEJzonbW92aWVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LA0KICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnBsYXlWaWRlbywnc2V0TGlzdElEJzonbW92aWVMaXN0Jywnc2V0UGFnZUlEJzonbW92aWVWaWRlb1NldFBhZ2UnLCd0YWtlUGxhY2UnOicwcHgnfSwNCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5wbGF5TXVzaWMsJ3NldExpc3RJRCc6J211c2ljTGlzdCcsJ3NldFBhZ2VJRCc6JycsJ3Rha2VQbGFjZSc6Jyd9LA0KICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnpoTmljZSwnc2V0TGlzdElEJzonemhpaHVMaXN0Jywnc2V0UGFnZUlEJzonemhpaHVJY29uU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzIyMHB4J30sDQogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcudmlkZW9Eb3dubG9hZCwnc2V0TGlzdElEJzondmlkZW9Eb3dubG9hZExpc3QnLCdzZXRQYWdlSUQnOid2aWRlb0Rvd25sb2FkU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LA0KICAgICAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICAgICB2YXIgemhpaHVPcHRpb25Kc29uID0gWw0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhWaWRlb0Nsb3NlLCdvcHRpb25JRCc6J3JlbW92ZVZpZGVvJywnZGVmYXVsdCc6JzAnfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidkb3dubG9hZFZpZGVvJywnZGVmYXVsdCc6JzIyJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEFEQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlQUQnLCdkZWZhdWx0JzonMjInfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQ2xvc2VMZWZ0LCdvcHRpb25JRCc6J3JlbW92ZVJpZ2h0JywnZGVmYXVsdCc6JzAnfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQ2hhbmdlTGluaywnb3B0aW9uSUQnOidjaGFuZ2VMaW5rJywnZGVmYXVsdCc6JzIyJ30sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5zcGVjaWFsQ29sdW1uLCdvcHRpb25JRCc6J3NwZWNpYWxDb2x1bW4nLCdkZWZhdWx0JzoyMn0sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy52aWRlb1RpdGxlLCdvcHRpb25JRCc6J3ZpZGVvVGl0bGUnLCdkZWZhdWx0JzoyMn0sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEtleXdvcmRDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVLZXl3b3JkJywnZGVmYXVsdCc6JzAnfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmF1dGhvck5hbWVDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVBdXRob3JOYW1lJywnZGVmYXVsdCc6MjJ9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueWFueHVhbkNsb3NlLCdvcHRpb25JRCc6J3JlbW92ZVlhbnh1YW4nLCdkZWZhdWx0JzonMCd9DQogICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgIHZhciBwbGF5VmlkZW9PcHRpb25Kc29uID17DQogICAgICAgICAgICAgICAgICAgICdvcHRpb25OYW1lJzpsYW5nLnBsYXlWaWRlb0xpbmVBZGQsDQogICAgICAgICAgICAgICAgICAgICdvcHRpb25JRCc6J3ZpZGVvUGxheUxpbmVBZGQnLA0KICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCc6dmlkZW9QbGF5TGluZUFkZCwNCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhJzondmlkZW9QbGF5TGluZUFkZFRleHRhcmVhJywNCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhSWQnOidwbGF5VmlkZW9MaW5lVGV4dGFyZWEnLA0KICAgICAgICAgICAgICAgICAgICAndGlwJzoNCmDnuq/lh4AxLGh0dHBzOi8vaW0xOTA3LnRvcC8/ang9DQpC56uZMSxodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPQ0K54ix6LGGLGh0dHBzOi8vanguYWlkb3Vlci5uZXQvP3VybD0NCkJMLGh0dHBzOi8vdmlwLmJsamlleC5jb20vP3Y9DQrlhrDosYYsaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0NCueZvuWfnyxodHRwczovL2p4LjYxOGcuY29tLz91cmw9DQpDSyxodHRwczovL3d3dy5ja3BsYXllci52aXAvamlleGkvP3VybD0NCkNIb2ssaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0NCmNrbW92LGh0dHBzOi8vd3d3LmNrbW92LnZpcC9hcGkucGhwP3VybD0NCkg4LGh0dHBzOi8vd3d3Lmg4anguY29tL2ppZXhpLnBocD91cmw9DQpKWSxodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPQ0K6Kej5p6QLGh0dHBzOi8vY2ttb3YuY2N5ampkLmNvbS9ja21vdi8/dXJsPQ0K6Kej5p6QbGEsaHR0cHM6Ly9hcGkuamlleGkubGEvP3VybD0NCuiAgeadvyxodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0NCk1BTyxodHRwczovL3d3dy5tdG9zei5jb20vbTN1OC5waHA/dXJsPQ0KTTNVOCxodHRwczovL2p4Lm0zdTgudHYvamlleGkvP3VybD0NCuivuuiuryxodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0NCk9LLGh0dHBzOi8vb2tqeC5jYy8/dXJsPQ0KUE0saHR0cHM6Ly93d3cucGxheW0zdTguY24vamlleGkucGhwP3VybD0NCuebmOWPpCxodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9DQrkuIPlk6UsaHR0cHM6Ly9qeC5ubnh2LmNuL3R2LnBocD91cmw9DQpSREhLLGh0dHBzOi8vangucmRoay5uZXQvP3Y9DQrkurrkurrov7csaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0NCuaAneS6kSxodHRwczovL2p4LmFwMnAuY24vP3VybD0NCuaAneWPpDMsaHR0cHM6Ly9qc2FwLmF0dGFraWRzLmNvbS8/dXJsPQ0K5ZCs5LmQLGh0dHBzOi8vanguZGo2dS5jb20vP3VybD0NCue7tOWkmixodHRwczovL2p4Lml2aXRvLmNuLz91cmw9DQromb7nsbMsaHR0cHM6Ly9qeC54bWZsdi5jb20vP3VybD0NCllULGh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPQ0K5LqR56uvLGh0dHBzOi8vc2IuNWdzZW8ubmV0Lz91cmw9DQrkupHmnpAsaHR0cHM6Ly9qeC55cGFyc2UuY29tL2luZGV4LnBocD91cmw9DQowNTIzLGh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPQ0KMTfkupEsaHR0cHM6Ly93d3cuMTcxN3l1bi5jb20vangvdHkucGhwP3VybD0NCjE4MCxodHRwczovL2p4LjAwMDE4MC50b3AvangvP3VybD0NCjRLLGh0dHBzOi8vanguNGtkdi5jb20vP3VybD0NCjgwOTAsaHR0cHM6Ly93d3cuODA5MGcuY24vP3VybD1gLA0KDQogICAgICAgICAgICAgICAgICAgICAndmFsdWVOYW1lJzoncGxheVZpZGVvTGluZVRleHQnfQ0KDQogICAgICAgICAgICAgICAgdmFyIHZpZGVvRG93bmxvYWRPcHRpb25Kc29uID0gWw0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuZHlWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2R5VmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmR5VmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5rc1ZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzona3NWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6a3NWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnhpZ3VhVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOid4aWd1YVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp4aWd1YVZpZGVvRG93bmxvYWR9LA0KICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuYmlsaVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonYmlsaVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0JzpiaWxpVmlkZW9Eb3dubG9hZH0sDQogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy55b3V0dWJlVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOid5b3V0dWJlVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOnlvdXR1YmVWaWRlb0Rvd25sb2FkfSwNCiAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgdmFyIHNldEh0bWwgPSAiPGRpdiBpZD0nc2V0TWFzaycgY2xhc3M9J3pobU1hc2snPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3dyYXAtYm94JyBpZD0nc2V0V3JhcCc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0naWNvblNldFBhZ2UnIGlkPSdtb3ZpZUljb25TZXRQYWdlJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy5pY29uUG9zaXRpb24rIjwvc3Bhbj48c3BhbiBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9zcGFuPjwvbGk+PC91bD4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRQYWdlTGknPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbkhlaWdodCsi77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25Ub3AnIHZhbHVlPSciK2ljb25WaXBUb3ArIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uSGVpZ2h0KyInPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0X192YWxpZGF0b3InPjwvc3Bhbj48L3NwYW4+PC9saT4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPGxpICBzdHlsZT0nZGlzcGxheTogaW5saW5lLWZsZXg7Jz48c3BhbiBzdHlsZT0ncGFkZGluZy10b3A6NHB4Oyc+IitsYW5nLmljb25MaW5lKyLvvJo8L3NwYW4+PGRpdiBjbGFzcz0nc2VsZWN0LWJveCc+PHNlbGVjdCBjbGFzcz0nc2VsZWN0LWJveF9fYm9keScgaWQ9J2ljb25Qb3NpdGlvbic+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPG9wdGlvbiB2YWx1ZT0nbGVmdCcgIitzZWxlY3RlZExlZnQrIj4iK2xhbmcuaWNvbkxlZnQrIjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3JpZ2h0JyAiK3NlbGVjdGVkUmlnaHQrIj4iK2xhbmcuaWNvblJpZ2h0KyI8L29wdGlvbj4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3NlbGVjdD48L2Rpdj48L2xpPiINCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiIrbGFuZy5pY29uV2lkdGgrIu+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uV2lkdGgnIHZhbHVlPSciK2ljb25WaXBXaWR0aCsiJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEljb25XaWR0aCsiJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dF9fdmFsaWRhdG9yJz48L3NwYW4+PC9zcGFuPjwvbGk+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uV2FpdFRpbWUrIu+8mjwvc3Bhbj48ZGl2IGNsYXNzPSdzZWxlY3QtYm94Jz48c2VsZWN0IGNsYXNzPSdzZWxlY3QtYm94X19ib2R5JyBpZD0naWNvbldhaXRUaW1lJz4iOw0KDQogICAgICAgICAgICAgICAgZm9yKGxldCBpID0xO2k8PTg7aSsrKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblNlbGVjdGVkID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpPT1pLzI/J3NlbGVjdGVkJzonJzsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxvcHRpb24gdmFsdWU9IitpLzIrIiAiK2ljb25TZWxlY3RlZCsiPiIraS8yKyLnp5I8L29wdGlvbj4iOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3NlbGVjdD48L2Rpdj48L2xpPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT7pgI8g5piOIOW6piDvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbk9wYWNpdHknIHZhbHVlPSciK2ljb25WaXBPcGFjaXR5KyInIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwSWNvbk9wYWNpdHkrIic+PC9zcGFuPjwvbGk+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2UnIGlkPSd2aWRlb0Rvd25sb2FkU2V0UGFnZSc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSdiYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnZpZGVvRG93bmxvYWQrIjwvc3Bhbj48c3BhbiAgY2xhc3M9J2ljb25TZXRTYXZlJz7DlzwvbGk+PC91bD4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0Jz4iOw0KDQogICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTx2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbi5sZW5ndGg7aSsrKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3IsZGlzcGxheTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVmFsdWUgPSBHTV9nZXRWYWx1ZSh2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5vcHRpb25JRCx2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5kZWZhdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25WYWx1ZSAhPSAnMjInKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ID0gJ25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAnYmxvY2snOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlX2NvbnRlbnQnPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPHNwYW4+Iit2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5vcHRpb25OYW1lKyI8L3NwYW4+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2NpcmN1bGFyJyBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjoiK3N3aXRjaEJhY2tDb3Jsb3IrIicgaWQ9JyIrdmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0ub3B0aW9uSUQrIic+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7IGxlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvbGk+IjsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iDQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiINCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlJyBpZD0nbW92aWVWaWRlb1NldFBhZ2UnPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSd6aG1fc2V0X3BhZ2VfaGVhZGVyJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy5zZXRQbGF5VmlkZW8rIjwvc3Bhbj48c3BhbiAgY2xhc3M9J2ljb25TZXRTYXZlJz7DlzwvbGk+PC91bD4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0JyBzdHlsZT0nb3ZlcmZsb3cteTp1bnNldCc+IjsNCg0KICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcixkaXNwbGF5Ow0KDQogICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUocGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25JRCxwbGF5VmlkZW9PcHRpb25Kc29uLmRlZmF1bHQpOw0KDQogICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7DQoNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7DQoNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZV9jb250ZW50Jz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPHNwYW4gY2xhc3M9J3BsYXlWaWRlb09wdGlvbk5hbWUnPiIrcGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25OYW1lKyI8L3NwYW4+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nY2lyY3VsYXInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiIrc3dpdGNoQmFja0NvcmxvcisiJyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLm9wdGlvbklEKyInPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7IGxlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sKz0iPC9saT48bGk+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdj7op6PmnpDnur/ot688L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdmb3JtX190ZXh0YXJlYSc+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ndGV4dGFyZWEganMtZmxleGlibGUtdGV4dGFyZWEnIHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4OycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYSsiJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dGV4dGFyZWEgcm93cz0nOScgY2xhc3M9J3RleHRhcmVhX19ib2R5IHpobV9zY3JvbGwnIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwUGxheVZpZGVvTGluZUFkZCsiJyBzdHlsZT0nd2lkdGg6MjUwcHg7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHg7cmVzaXplOm5vbmU7JyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLnRleHRhcmVhSWQrIic+IitHTV9nZXRWYWx1ZShwbGF5VmlkZW9PcHRpb25Kc29uLnZhbHVlTmFtZSxwbGF5VmlkZW9PcHRpb25Kc29uLnRpcCkrIjwvdGV4dGFyZWE+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9saT4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiINCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+Ig0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2UnIGlkPSd6aGlodUljb25TZXRQYWdlJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy56aFNldCsiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3NldF9wYWdlX2xpc3QnIHN0eWxlPSdoZWlnaHQ6MjU4cHgnPiI7DQoNCiAgICAgICAgICAgICAgICBmb3IodmFyIG9wdGlvbk49MDtvcHRpb25OPHpoaWh1T3B0aW9uSnNvbi5sZW5ndGg7b3B0aW9uTisrKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3I7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklELHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5kZWZhdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25WYWx1ZSAhPSAnMjInKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOw0KDQogICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpID48ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2VDb250ZW50Jz48c3Bhbj4iK3poaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25OYW1lKyI8L3NwYW4+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2NpcmN1bGFyJyBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogIitzd2l0Y2hCYWNrQ29ybG9yKyI7JyBpZD0iK3poaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCsiPjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7bGVmdDogIitvcHRpb25WYWx1ZSsicHg7Jz48L2Rpdj48L2Rpdj48L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCA9PSAncmVtb3ZlS2V5d29yZCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5d29yZFNob3c7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdyZW1vdmVLZXl3b3JkJywnMCcpID09ICcyMicpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZFNob3cgPSAnYmxvY2snOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkU2hvdyA9ICdub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheToiK2tleXdvcmRTaG93KyI7cGFkZGluZzo1cHggMHB4OycgaWQ9J3poaWh1S2V5d29yZCc+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCB2YWx1ZT0nIitHTV9nZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLCcnKSsiJyBpZD0naW5wdXRaaEtleXdvcmQnIGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEtleXdvcmQrIicgc3R5bGU9J3dpZHRoOjg4JSc+PHNwYW4+PC9kaXY+IjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmKHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCA9PSAncmVtb3ZlQXV0aG9yTmFtZScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0aG9yTmFtZVNob3c7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdyZW1vdmVBdXRob3JOYW1lJywnMjInKSA9PSAnMjInKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvck5hbWVTaG93ID0gJ2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yTmFtZVNob3cgPSAnbm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBzdHlsZT0nbWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6IithdXRob3JOYW1lU2hvdysiO3BhZGRpbmc6NXB4IDBweDsnIGlkPSd6aGlodUF1dGhvck5hbWUnPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgdmFsdWU9JyIrR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJywnJykrIicgaWQ9J2lucHV0WmhBdXRob3JOYW1lJyBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBBdXRob3JOYW1lKyInIHN0eWxlPSd3aWR0aDo4OCUnPjxzcGFuPjwvZGl2PiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2xpPiI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiINCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4+PC9zcGFuPjxzcGFuPiIrbGFuZy5zZXQrIjwvc3Bhbj48c3BhbiBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9zcGFuPjwvbGk+PC91bD4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3NldFdyYXBMaSc+IjsNCg0KICAgICAgICAgICAgICAgIGZvcih2YXIgc2V0Tj0wO3NldE48c2V0TGlzdEpzb24ubGVuZ3RoO3NldE4rKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RWYWx1ZSA9IEdNX2dldFZhbHVlKHNldExpc3RKc29uW3NldE5dLnNldExpc3RJRCwnMjInKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLGFycm93Q29sb3Isc3dpdGNoQmFja0NvcmxvcjsNCg0KICAgICAgICAgICAgICAgICAgICBpZihsaXN0VmFsdWUgIT0gMjIpew0KICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dDb2xvcj0gJyNFRUUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0NDQyc7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdEpzb25bc2V0Tl0uc2V0UGFnZUlEID09ICcnKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0VFRSc7DQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPjxzcGFuPiIrc2V0TGlzdEpzb25bc2V0Tl0ubGlzdE5hbWUrIjwvc3Bhbj4iOw0KDQogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nc2V0V3JhcExpQ29udGVudCc+IjsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2NpcmN1bGFyJyBpZD0nIitzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQrIicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOyc+PGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjtsZWZ0OiAiK2xpc3RWYWx1ZSsicHgnPjwvZGl2PjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8c3BhbiBjbGFzcz0ndG8tcmlnaHQnIGRhdGE9JyIrc2V0TGlzdEpzb25bc2V0Tl0uc2V0UGFnZUlEKyInIHRha2VQbGFjZT0nIitzZXRMaXN0SnNvbltzZXROXS50YWtlUGxhY2UrIicgc3R5bGU9J2JvcmRlcjogc29saWQgIithcnJvd0NvbG9yKyI7IGJvcmRlci13aWR0aDogMCAzcHggM3B4IDA7Jz48L3NwYW4+PC9kaXY+PC9saT4iOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdoZWlnaHQ6NDBweDsnIGlkPSd6aG1UYWtlUGxhY2UnPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2ljb25TZXRGb290JyBzdHlsZT0nJz4iOw0KDQogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRGb290TGknPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48L2xpPiI7DQoNCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9JzwvdWw+JzsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC9kaXY+JzsNCg0KICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2V0TWFzaycpKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobU1lbnUnKTsNCg0KICAgICAgICAgICAgICAgIGxldCB6aG1NZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobU1lbnUnKTsNCg0KICAgICAgICAgICAgICAgIHpobU1lbnUuaW5uZXJIVE1MID0gc2V0SHRtbDsNCg0KICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtTWVudScpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclpobUljb24pOyAvLyDlj5bmtojlrprml7blmagNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNpcmN1bGFyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bGFyLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oX2Upew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25TdHlsZSA9IGl0ZW0uY2hpbGRyZW5bMF0uc3R5bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBidXR0b25TdHlsZS5sZWZ0Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwYXJzZUludChsZWZ0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdExlZnRWYWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0PT0wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUubGVmdCA9ICcyMnB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUuYmFja2dyb3VuZCA9ICcjZmU2ZDczJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZFNUU1JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5uZXh0U2libGluZyAmJiBpdGVtLm5leHRTaWJsaW5nLmdldEF0dHJpYnV0ZSgnZGF0YScpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI2NjYztib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAyMjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUubGVmdCA9ICcwcHgnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQ9JyNmZmYnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLm5leHRTaWJsaW5nKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI0VFRTtib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExlZnRWYWx1ZSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2V0TGlzdElEID0gaXRlbS5pZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SUQgPT0gJ3JlbW92ZUtleXdvcmQnICYmIGxpc3RMZWZ0VmFsdWU9PTIyKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1S2V5d29yZCcpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MjIwcHgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVLZXl3b3JkJyAmJiBsaXN0TGVmdFZhbHVlPT0wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1S2V5d29yZCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0gJ2hlaWdodDoxODBweCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SUQgPT0gJ3JlbW92ZUF1dGhvck5hbWUnICYmIGxpc3RMZWZ0VmFsdWU9PTIyKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1QXV0aG9yTmFtZScpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MjYwcHgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVBdXRob3JOYW1lJyAmJiBsaXN0TGVmdFZhbHVlPT0wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1QXV0aG9yTmFtZScpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0gJ2hlaWdodDoxMjBweCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShzZXRMaXN0SUQsbGlzdExlZnRWYWx1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvUmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG8tcmlnaHQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9SaWdodC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gaXRlbS5wcmV2aW91c1NpYmxpbmcuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVmdCAhPSAyMikgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRQYWdlSUQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXRQYWdlSUQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJZC5jbGFzc05hbWU9J2ljb25TZXRQYWdlIHRvTGVmdE1vdmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v55+l5LmO6K6+572u5pqC5L2N6auY5bqmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldFBhZ2VJRD09J3poaWh1SWNvblNldFBhZ2UnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSBgaGVpZ2h0OjY4cHhgOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrp7ml7blm77moIfpq5jluqYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEID09ICdtb3ZpZUljb25TZXRQYWdlJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpY29uVG9wJykudmFsdWU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKS5vZmZzZXRUb3A7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9CYWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhY2snKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9CYWNrLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudERvbSA9IGl0ZW0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9SaWdodE1vdmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0naGVpZ2h0OjQwcHg7Jw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFNhdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaWNvblNldFNhdmUnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2F2ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25PcGFjaXR5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uT3BhY2l0eScpLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uUG9zaXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblBvc2l0aW9uJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbldhaXRUaW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25XYWl0VGltZScpLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9MaW5lVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvTGluZUxlZnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZCcpLmNoaWxkcmVuWzBdLnN0eWxlLmxlZnQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0WmhLZXl3b3JkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0WmhLZXl3b3JkJykudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0QXV0aG9yTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dFpoQXV0aG9yTmFtZScpLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Ub3AgIT0gJycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlswLTldWzAtOV17MCwyfSQpLy50ZXN0KGljb25Ub3ApKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChsYW5nLnRpcEVycm9ySWNvbkhlaWdodCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uVG9wJyxpY29uVG9wLDMwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Ub3AnLGljb25Ub3ApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvbk9wYWNpdHkgIT0gJycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC9eKD86MHxbMS05XVswLTldP3wxMDApJC8udGVzdChpY29uT3BhY2l0eSkpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uT3BhY2l0eSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uVG9wJyxpY29uVG9wLDMwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoaWNvbk9wYWNpdHkpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uT3BhY2l0eScsaWNvbk9wYWNpdHkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvblBvc2l0aW9uICE9ICcnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5zZXRDb29raWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uLDMwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25XYWl0VGltZSAhPSAnJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uV2FpdFRpbWUnLGljb25XYWl0VGltZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2lkdGggIT0nJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheKFsxLTldWzAtOV0/KSQpLy50ZXN0KGljb25XaWR0aCkpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uV2lkdGgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvbldpZHRoJyxpY29uV2lkdGgsMzApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldpZHRoJyxpY29uV2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSA9PSAyMil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYXlWaWRlb0xpbmVUZXh0KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gX3RoaXMuZ2V0TGluZShwbGF5VmlkZW9MaW5lVGV4dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lT2JqLmxlbmd0aD4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnLHBsYXlWaWRlb0xpbmVUZXh0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgn57q/6Lev6L6T5YWl5LiN5q2j56GuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JywnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcscGxheVZpZGVvTGluZVRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5wdXRaaEtleXdvcmQgIT0gJycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLGlucHV0WmhLZXl3b3JkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhLZXl3b3JkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlucHV0QXV0aG9yTmFtZSAhPSAnJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsaW5wdXRBdXRob3JOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uVG9wJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSB0aGlzLnZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25Ub3ApKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCdmYWxzZScpDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldpZHRoJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IHRoaXMudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlsxLTldXGQqJCkvLnRlc3QoaWNvbldpZHRoKSkpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywnZmFsc2UnKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ3RydWUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6IW+6K6v6KeG6aKR5b+r5o236ZSu5Yay56qBDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwubWF0Y2goL3ZcLnFxXC5jb21cL3hcL2NvdmVyLykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZExpbmVUZXh0ID1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheVZpZGVvTGluZVRleHRhcmVhJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBhZGRMaW5lVGV4dC5zZWxlY3Rpb25TdGFydDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcyA9PT0gdW5kZWZpbmVkIHx8IGVuZFBvcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q29kZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmtleUNvZGUgPT0gaXRlbS5jb2RlICYmIGUuc2hpZnRLZXk9PWl0ZW0uaXNTaGlmdCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFZhbHVlID0gYWRkTGluZVRleHQudmFsdWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRWYWx1ZSA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoMCxzdGFydFBvcyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kVmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKHN0YXJ0UG9zKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxWYWx1ZSA9IHN0YXJ0VmFsdWUraXRlbS52YWx1ZStlbmRWYWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnZhbHVlPWFsbFZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcysxOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kID0gZW5kUG9zKzE7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoZG9tLGRvbUlkKXsNCg0KICAgICAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZG9tKTsNCg0KICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQgPSBkb21JZDsNCg0KICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7DQoNCiAgICAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudEh0bWxDb250ZW50KTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXF1ZXN0KG1ldGhvZCx1cmwsZGF0YSxpc0Nvb2tpZT0nJyl7DQoNCiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnJlYWR5U3RhdGU9PTQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdC5zdGF0dXM9PTIwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxdWVzdC5zdGF0dXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCx1cmwpOw0KICAgICAgICAgICAgICAgICAgICAvL3JlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYoaXNDb29raWUpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOw0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbmQoZGF0YSk7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldENvb2tpZShjbmFtZSxjdmFsdWUsZXhkYXlzKXsNCg0KICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsNCg0KICAgICAgICAgICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsNCg0KICAgICAgICAgICAgICAgIHZhciBleHBpcmVzID0gImV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCk7DQoNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSsiPSIrY3ZhbHVlKyI7ICIrZXhwaXJlczsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZ2V0Q29va2llKGNuYW1lKXsNCiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGNuYW1lICsgIj0iOw0KICAgICAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gY2FbaV0udHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnZXRRdWVyeVN0cmluZyhlKSB7DQogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyBlICsgIj0oW14mXSopKCZ8JCkiKTsNCiAgICAgICAgICAgICAgICB2YXIgYSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLm1hdGNoKHQpOw0KICAgICAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHJldHVybiBhWzJdOw0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZ2V0VXJsUGFyYW1zKHVybCl7DQogICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW14/JisjXSspPShbXj8mKyNdKykvZzsNCiAgICAgICAgICAgICAgICBsZXQgb2JqPXt9Ow0KICAgICAgICAgICAgICAgIHVybC5yZXBsYWNlKHJlZywocmVzLCQxLCQyKT0+e29ialskMV09JDJ9KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnZXRMaW5lKHRleHQpew0KDQogICAgICAgICAgICAgICAgbGV0IHRleHRBcnIgPSB0ZXh0LnNwbGl0KCdcbicpOw0KDQogICAgICAgICAgICAgICAgaWYodGV4dEFyci5sZW5ndGggPiAwKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IFtdOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eKC4rKShodHRwcz86XC9cLy4rKSQvOw0KDQogICAgICAgICAgICAgICAgICAgIHRleHRBcnIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXHMqLCovZywnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtKSByZXR1cm4gdHJ1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVNYXRjaCA9IGl0ZW0ubWF0Y2gobWF0Y2gpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lTWF0Y2gpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iai5wdXNoKHsnbmFtZSc6bGluZU1hdGNoWzFdLnN1YnN0cmluZygwLDQpLCd1cmwnOmxpbmVNYXRjaFsyXX0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPYmo9W107DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVPYmo7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL2FsbOWPguaVsOm7mOiupOepuu+8jOaYr+ecn+aXtui/lOWbnuS4uuaVsOe7hA0KICAgICAgICAgICAgc3RhdGljIGdldEVsZW1lbnQoY3NzLGFsbD0nJyl7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSsrDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb207DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFsbCA9PSBmYWxzZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNzcyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzcyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb20ubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobnVtPT0yMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwzMDApDQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHN0YXRpYyB0b2FzdChtc2csZHVyYXRpb24pew0KDQogICAgICAgICAgICAgICAgZHVyYXRpb249aXNOYU4oZHVyYXRpb24pPzMwMDA6ZHVyYXRpb247DQoNCiAgICAgICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgICAgIHRvYXN0RG9tLmlubmVySFRNTCA9IG1zZzsNCg0KICAgICAgICAgICAgICAgIC8vdG9hc3REb20uc3R5bGUuY3NzVGV4dD0id2lkdGg6IDYwJTttaW4td2lkdGg6IDE1MHB4O29wYWNpdHk6IDAuNztoZWlnaHQ6IDMwcHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtsaW5lLWhlaWdodDogMzBweDt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogNXB4O3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDQwJTtsZWZ0OiAyMCU7ei1pbmRleDogOTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDEycHg7IjsNCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycNCg0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOw0KDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsNCg0KICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOw0KDQogICAgICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLm9wYWNpdHkgPSAnMCc7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOw0KDQogICAgICAgICAgICAgICAgfSwgZHVyYXRpb24pOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL2NyZWF0ZSB6aG1Mb2dvSWNvbg0KICAgICAgICAgICAgemhtTG9nbygpew0KDQogICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICBsZXQgc29ydERpdiA9IGljb25WaXBQb3NpdGlvbj09J2xlZnQnPydyb3cnOidyb3ctcmV2ZXJzZSc7DQoNCiAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGANCiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRvZV9pY29uew0KICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4Ow0KICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7DQogICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOyR7aWNvblZpcFBvc2l0aW9ufTo1cHg7dG9wOiR7aWNvblZpcFRvcH1weDsNCiAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOw0KICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6dmlzaWJsZTsNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ZmxleDsNCiAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiR7c29ydERpdn07DQogICAgICAgICAgICAgICAgICB3aWR0aDphdXRvOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7DQogICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7DQogICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAuaWNvbkxvZ297DQogICAgICAgICAgICAgICBvcGFjaXR5OiR7aWNvblZpcE9wYWNpdHkvMTAwfTsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lew0KICAgICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7DQogICAgICAgICAgICAgICAgICBoZWlnaHQ6MzE2cHg7DQogICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsNCiAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVfbGluZV91bHsNCiAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4Ow0KICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsNCiAgICAgICAgICAgICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7DQogICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOw0KICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHg7DQogICAgICAgICAgICAgICAgICBtYXJnaW46MHB4Ow0KDQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsNCiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsNCiAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7DQogICAgICAgICAgICAgICAgICB3aWR0aDozMCU7DQogICAgICAgICAgICAgICAgICBjb2xvcjojRkZGOw0KICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7DQogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7DQogICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOw0KICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saTpob3ZlcnsNCiAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7DQogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzANCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsNCiAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7DQogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzANCiAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ew0KICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsNCiAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOw0KICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7DQogICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIGA7DQoNCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGxheVZpZGVvU3R5bGUpKTsNCg0KICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPScnIGNsYXNzPSdwbGF5QnV0dG9uIHpobV9wbGF5X3ZpZG9lX2ljb24nIGlkPSd6aG1sb2dvJz4iOw0KDQogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8aW1nIGNsYXNzPSdpY29uTG9nbycgc3R5bGU9J3dpZHRoOiIraWNvblZpcFdpZHRoKyJweDtoZWlnaHQ6IitpY29uVmlwV2lkdGgqMS41KyJweCcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUNXQVBjQUFQSkVRL3Y3K2ZuTHlQakN3ZlJuWmZuVDBQSktTZmpHeFB2MjlQblkxL05iV3Z2MTgvYVVrL3JsNC9ydzd2bkt5UGFKaVBycjZmYWFtUFJ5Y2ZhTGl2djU5L0pKU1BydjdmTlZWUG5lM2ZydDYvTlFUL3Y2K1BlbHBQYWdudlIzZHZpNnVQdno4ZmV4ci9uT3pQZWdudnJrNHZSMWMvSkdSZnJxNlBuUXp2akN3UG5TMFBuWjEvdnc3dm5hMmZlb3AvZW1wZnJjMnZOVVUvaXhyL1I0ZHZXSmgvZXNxdkpIUnZ2eDcvcnk4Zk5TVWZOV1ZQakJ3UFY2ZWZhTWl2bmYzZmk4dXZXRGd2djQ5dnJwNlByeThQSlBUdmFZbC9uVDBmblcxUGVycWZSc2EvUnZidldBZi9WOWZQbms0dmkydGZSallmUmhYL3Z1N1BOWVYvSkZSUG5rNGZhSGhmYVhsdnYzOWZyaDMvaTd1dm5OeS9uT3kvcnM2dmVycXZSZ1h2bmQyL2FHaFBXUmtQVi9mZnJpNFByajRQaXdyZm5MeWZhVWt2UmZYZkpOVFBqRncvZXlzZlJsWS9SeGNQdnY3ZmV6c3ZpMHN2djI4L2FibXZlcXFQZXBxUEpNUy9leXNQV09qZk5kWFBSemN2djA4dlJ1YmZybzV2ZWlvZmVsby9OWldQbloyUE5wYVBuVTB2UmZYdm5IeGZpdXJQakF2L25RemZybjVmbmMyL2Uwc3ZhZG5QZTR0L2FTa2ZOWFZ2Um1aUGV0cXZuWTF2aTh1L2Vpb1BpdHEvaS92ZlJ3Yi9SMWRQbmUzUGFlbmZhY212ZTN0dm5Sei9yajRmYVhsZlYrZlBXRmhQSkxTdmFOaS9XTWpQUjBjL2FWay9XUGovYWRtL3JwNS9uSXh2Um9adlJpWWZqRHd2YVZsUEpPVGZlMnRmTnFhZkpSVVBla292YWFtZk5hV2ZWOGV2bmQzUG5OelBuVjFQZXNxL2pFdy9WNmVQUjNkL25nM3ZydzdmYVdsUGVucGZhZm5mV1Bqdml3cnZOV1Zmbk15dmk2dWZWL2Z2VjllL25iMnZydTYvUmtZdmpBdnZuSXhmUmlZUGk5dlBlZ24vVjdlZmVqb2ZlMXRQV0NnZnJtNVBKSVIvbmMydk5jVy9KUVQvakZ4UHZ5OFBXRGdmV0JmL1JzYlBWNWQvTnBhZk5jWFBuZjN2YUlodlJ2Yi9pdnJmblgxdk5SVWZhS2lmUnRiUGFabC9OZVhQZTV1UFdDZ1BScmF2YUloL05vWi9uSngvV0ZnL2k5dS9SMmRmakh4dmpJeHZOVFV2aS92dmUxcy9OZVhRQUFBQUFBQUFBQUFBQUFBQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRRWxnQUFBQ3dBQUFBQVpBQ1dBQUFJL2dBQkNCeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGlseElZRVNBQUNNSWpGeHBVSVdEQUE1VWVGakk0dVRKQkN4ekNzeGhrOGlRaFRadDZzeXB3YWFHREFzSEJPVXhsT1VMSkNXUXZLaXhjQU9EQVFNWWJHaTZVa0dQR2owVUdPQkt0cXpaczJqVHFsM0x0cU1DRTAxTWlLMUtZc1FJRWxzN2ZtRkNhOUVXRjRrUWhDaVRRb1VJVFV6U2ZPeVFna1dLRGtHU0x0V29BOWl1WlVFemF3NGdCWnFWSWh0UjJFU0JVNkZtakRRT0Nkbk1lak1DTFJNeUxyQzU0QUxOb0tVcGpuSFJ1bmZyVHZVdW5wbTk0TUVma2dNY1hCaWdjdUlsM3I2anN6NmpvS0lKQ1I0a21OZ3hFa01qM3lYby9ta0NKYWlXQlRWZjlGaVpNNmxFYndTb1RyUTl5RXNLNndxcVNPVnhLTU5Xa2plc3VkRGNmQUJjUXdkcmZWd2hBMFVXaElISVprTDBRcUFhSzJ6bWlRODNaQVRGRVpvVk1oOEd5bWlHQUNVV2NFVEZGUWdFOVVCRUJtQ2dBQVpqTVVRQUNTUU1xSkFNWldqbWdtSWZmWkhBU1F1VUVoRUVJandoQWdRMkhtUkRVRFlzcEFaMFFkMVJZa2duaU1GQUZCTEZZRk1NUUN6MGtrMjJKWFRDZzVtaFFaWWRWcEJqeDBKeTBCWm1RazRFVllWQ2RXVEdRVHBrRVZKVUFDNkFsdEFQTm1XaXdrSVFmSGtCQkFuMVlxY1ZaZmtScFVJK3hBRkVIRDRvMFJBQlNSYWtBNEJCaldKV0I1bkZocEFCVTBReFJZd1kzWkdaTG1mbHNacE4vbVZNdVZJYkhBU1ZoYXhsTVpMWktUbWxFQlFIc2FSMVFvZzI5U0hmU0tWa1pzWmE2bVJHZ1VZVGlHcFFBVUc5NGVkQ09wZ1VnaGV2Z0xSRlVDNGN0QVFESGpDd0JIY0tGWHFTQTRnU3hFZVpEdWtUMURLT0hNdVJIa0ZwY0pCTE1NbTBVSncyelVrUUhFRjFnZXBDZTJqbVN6SWVOV05UT3dmeGRKSlBYZ2IxSmdBV2hCQVVNQSsxbGdJekhKMVF4eGFickduUW5nRWN0ZENTTmlWQmtEZEJWWEF0UTdXeXhnRW5qK1QwVkZSVHljZ0FBMGtTYkZNckVGWGcyeDZVbUN5U1YyRE5SVkVXUVRINmtOSFJwVElLRlFRYWhFRm1HQlFkVkNHNXRBYUdHeGo5c1VBRmpIeUVURkJsUlBUcVNTOEFFRVlmclJWQ1NFVnVCTVdIL2tlYkJBV0MyMEhWSVpBb3dtaThXUVVpNEROUm5UYjU0ZEYzTnFVTkVSWkIwVUhRSTV6VXJCa09jK0RhVU44MkhVUFFXMHpRNEhSQ0JDZ1ZBSE1ERFJLVU94R2xhSlBsQmNYRElXc05oQUZSS0VFTlFoQmoyQndCMlcwMjVRYTFUWlpDSlB0SkxoOVVqVFd0U2ZLT1ErL2ExQUJCb3AxRUdsQ1pEUlJCVUt6RUhwUVhDVmt3aCtHYkhWTGRRbEVFSlFWQkVnZEFzVUtxbjhTVVFMUFpWRXRFK1o5RXZrSVlXSVRtTW9PRkRtQXRJWUNJR1VIdVFSeDd6RVFoVnNHS1ZnWkN0Wk1zQ0NJSnN3bXJHQUlKWDdFbUVqZjZGVUd1azUzdFVBUUhRY2xHUk5BWEFCQTZCQm51MFV3SUZKS0hvT0RBSTlrN1NSdFdHQlFYTnFRSi9tVFlUQVFVUW9DZ0pNSWppZ2hLT1hob2swbzBCQXBjYU0yekVvS0pvSURCSTJ1SVdrU1NhQk5hTEVRR2Q2aGdac2hBZzRXSUlTaXE4RWdsZ2tLQ2lEakNKaUVvUnZtTWdNTE40TUFJR1ZxSUlZTGl4SUcwNkVVSFE0aFY3REpCZ1p3aUtFU0xTQ2dzWVlpN0lXUU1NZFJNQmRpZ0E0ZDh5eVppSUFpUmpJUWt5ZGprZmdBUVJGQzRjVUNOZExBMVhJRENRMDZ3dkFCSUN3QmFPZ21YdUJlVWdkeUFjallSUkVTNllRbHpxSklnTW9EREFJTkNoakZFNUJKQlFRQ3UyZ1NraXgya0pzVWp5Q1ZQMHNhSDRNRW1DSkFqeGlUQVFodmlVU0tPc29rOENoTExBTXlTaUtwajNVQStnUnVJU0NJb3dnQUFFeUtabVVsV2NpSjAvclBKRlFxeXlTTmw2aUh0Q3dxV0hJS3lBQmpEZzV0SlpVVW04S3VjRWVTUE1Mb0lsQUt3TElkMFFUckZ2TWdoZ3NJRmtWd1RqdHF3cUcvdW1NZUtRQ0l6UGhDSktGajRQNFo4N3o2VXpFZ1diV0t3a1lES0poVUluMHRabzlDTTBDQXpSc2pJakdwMEVCMzBMd0FwYUVpT3htaE1qVmlnQVVGcFFTQUZNb0VyZU9BS0UwQlhRbGgya2lZWlpCYVorUVJEMk9ETmttWWtHSm5KNUVIV3dKTWNyT0dCQ2ZuU1Nad3BFQU1rSXBrN1ZJZ2FkaEdBQmNEaG5odFJ3Z0J2WWErQ3hHOStjSklUUXFvWWxCTE1iQ2l5OEVSbTlvYVFIRzR2WFlacTEwSElHcFJ0a0tVSWdjZ01NUlRTZ1NQOFFIaVJZVWkwRm1LQmNXU0dGMDBwL2tMWWdxSUl6eFZFQVRRSWd1bW1XaEZtWkFZUFE1SEJMVElUQWg1eEpSYVpZWWRPMG5BOG5PckJMQWV5eVRsMHdvUnVCa0IzWnNsaEFOYkJFblRBUWpNY21PSkhWcXNRWkFZRkVBTVJCeXlrRUFFR21OVWlKNkFBcDRLQ0JZWTVCTGU2UFIxQzFBVVR6UnJFREwwVHlBM20wRXBmTk9FaUZoZ0dWRFhUaFZjeTVBV21QVUxQRkFLd2t3ak1JQ2V3ajAxY0FRQWxnSUUxSzhDRExDVHlEVE5vV0RPSXVPQkRVS1l5aGNnMUFIUVZDR050OGdWaURGT1NBbUNBRzlRZ3BtZkFneE9wYUEwQ05GSEtoeHoySndyaGFnQ2FaNUJGUlBXbDBqa0pCN0xnakVuTW9BUEJvTVlhQW9ITDNsQ0hJdno2aGI5SVFxTi9BdUFHZGV4Ti9qTXlFT1UyODhrV0ZobVhCOUJ3TG94SXd6ZWVlQzRBYUdBTU4vY21CVDBnRUFpRVRLS0NFR0FXSC9ielNUU1FoQzlrelFBWjFNd0k5cE9RTkh4aUVtQVFvMllXNElKamlHRVZoWjBQS0RhREF1dzZ4QUxoQU1jOGhvRUtDWkNDQ1c1QWI5WU9nb1o2bXFGYnN5NElSSGxyNkhSbXFnMFZETVFxY24wUUh4UkpCSlVpM2swTzRnZ2hDTUVWUlNiMlFBQjFFa0hSVWlqU2pnZ3oreHBqZ3RRdkFLRE10a1BLZWM2RURISUVoUlMzUS9yWlNYVi9aTmZ1anJlODUwM3Zlay9rM09tMmQwRklxQjJ0SXVUYjRkYjNRSWJUVndFY3h6VGRNNGdBSHNEd0I0aFhJUlJvK0FNR0lKQm9hT0hpV2docVFXQWdjWW1yb0FNZ2wwai8vbXFqN0FEa2hpQlFYbDFEdm8wVUFGRExKZ2RRdUhRaTBJbUhLOFN5Sno5STZrNml6b0o4KzNvN3RjbmZYQjZVbUJkRUFHN3V4QWNZd2hqSERPOGlGTWpNMGhYeUFha0w1T1VuTVRwQmtPN21DRXc5SVcrSmkzNHIwZ0svTFdUUU5tazUwV0V1Y3o4UHNTa1ZpcVpDZmlUMGdXQTlBRm9mQ05kUElvQ0NVR0FHQ1dobEFJYXVFd2trY3lHdC9QcmQ4eTZRdlFlZzd3ZjVRQ3ZmUHBTeTJ3UUdDWUZCVUNpLzlxeTNuZThKTVh4UXZvNlJvWnBaSUhFL3lRb1NrbnFWMjczb24zKzhRbHFKZVlRd0xTeThIb2lTdlhvUXpkdWtCUW14L0VrZXZ2allReDRoQ3o1SjdRK3lNNmxReGNVV20zMVFiQzZRcU51RTg1M0h1L0VWL3BMOEFDei9aRVpSTzBJcUhJQUxINFR1UEQvSXR5bE9rT0lmUFNqSFB3anRFM0prUW1WV0lUTUlDdEFMd21hYlNLQWc3cmQxOEJkNnpwSVFZVFptQzBGZWlEZDZCVkYxdnpjdHNQZCtOaEYvQlpGeTJGY1Fja1puL29ZUjZEZDRCWkYvTnJGNkFCaUJBamlCQnpFRDlDUjdaQUdDeTBZUUhmaC9JOGgyRW5nU0pTQnhrbEFDd29kTnBEY1VEbmdTQ0ZBUXl3TjhFQ2lESmVobU1GZ1cvYWQ4QXlGNkxSaURuamVEMG9FQU16QmVEcFlRYUtkNkE5RjZVemlFVDFpRXZvRUFLN0NEbzFJcXA4SVEvTVV1RE5HREFVQjVVUGFEQnhHQWVoZFZEVENIZEpnQkF2QjlEQkVwazVKc0ZLWllESkdFQWZBczF0ZUVUcWg5VUVpQi9oUkJiUUZnYmRBSEpnMXhoU29IaVZ2SWhZYm9oWWc0RWR0R2Nra1dGRXdHY1VHQkZJQ1lFSERZZUFPSUVlVFdKV1JHVkE2UmNnQ3dQT0pYaUl3SEFJNTNpUkxCYnFkbkVkL1dlb1JIaWJFNGl4a0JieDh4aUpvaGhxOUhoSEZvZ3VxV2NtbW5FS01vaTZVb2JvNVhkNkpJZ3NjSWV1ckdoTlBIak5SSWlzZzRGS256RWozWEVEbTRoZ3ZSakw2SUVmeG1RZ29CVFlUSUVLM25ldE5vak54b2pjSkJIQVozYlNjQkVSSkFoM05JZlFYUkNBa1FrQWxnQ0FZQkF2eTRpeFV4Y3QwMkVBQW5jQWFCYzFYQkFJU1VGdzQ1RU5PQUN5eUFDMzZRV2hVNUVWTXdBVTB3QVdYWWtTUlpraVo1a2g0UlFWbEJrUjI1RDAzUU5Ma25QQkFOV1pKZXdBSTg4M3dKY1JvbHlXS3ZhQkRzYUhJbVdYL294SE8zU0cvNVVCUWFZQWx3aFpJTVlRcUE4Z09tVUpSTU9aVlVXWlZXYVpVQkFRQWgrUVFCbGdBQUFDd0dBQVlBV1FDTEFJY3l6VEx4MFVYeHBVVHlYMFB5U0VQeVZrUHllVVR5Z2tUd3lFVHpUVVB4eWtYeWlrVHd4MFR4dGtYeVVVUHh0MFR4cmtYeHhrWHd2MFR5bUVUeWkwUHh1VVR5YWtQeHlFWHh4RVh5YUVQeHUwVHh6RVh4elVYeWtVVHhsRVR5VWtQeWowVHhoa1R4cEVUeWJrVHh0RVh4dzBYeW5FVHhna1R5VkVQeWUwVHlaVVB4b0VUeHNFVHllVVB5YkVQeHNrVHh1MFh5ZEVUeHJFVHljRVB5WjBQeHYwWHhlVVR4elVUeW1rVHhqMFR4azBQeVkwUHhya1R5alVUeHAwVHlXa1B5YVVQeGhFVHhvMFR4ZFVQeW9VVHlXRVB5Y2tQeHFVVHhxMFR4cWtUeWswUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJL2dBSFFBZ1FBTUlBQUFnVEtseklzS0hEaHhBalJoUndJY0FGQVFzZUVDVFlRS0xIanlCRE5sU3dVVUdKalJ0RnFsekpNbUdFalJGZ0NFQXBvcVhObXhFN2tLaEJva09MQkFjRUNEaVFBS2ZSb3dnTGpMQXhvZ0FCcEZDalNwMUt0YXJWcTFpemF0MEtzWUNGR1JhY0pxQUFBUUtGb2x5eGdtRHhnQVdJR0RNMzFreDdGY05HREExUUVxUjdsY1BHRFJjMGJ1ekl0Nm9Ndnh1UTVCZ2dBQUVEQVFjTFU3VVFZa0VJSUI4a2E5N011YlBuejZBL0UzQlF3TUZUQUFNb1VJZ2MrcWFCQ1NZbUdCamdBYVdIMWpjcmJLeXdBZ0ZLQnJodDN2akxRQUpLQ2NGYmF0aW9RWUFCM3dFWUdFak9NZ1VPSWpoUzdFQTRnRFYxbFFSUS92eEFjZnE3K2ZQbzA0UE9rRUU5U0JVbkZweFE4ZUU1UVFUVDNVK3NlSEdCOFkzSTZRY1JTUVNaQkIxQndBbjQwRXNFeFZUYlJqb28rSkJPUFBtRTJnRUhlQ2ZoUWtveDVkU0dJSVlvNG9na0t1U1ZFUzQ0eFJoQmtKVUl3Rm9WdlBDV1lCeTVhQmRCZU9rVmdJc0VCbUJTWEFUTlJXSVNpQjJ4QUZCQ0VlVWlaWlpoNXVLVFVFWXBaV0dqbGZZVVVHVXBXZUpyc2MwR1pBQkNqcWdiUWJ6cDZPSndCRzNBQUkwQkVFYmltQUh3dG1JQUxXNEptMndhUGxtbGFWUDI2ZWVmT0tXMjJwTTBCTEZBRURSODhDQkJ0NVhvQTBrSytMREFnZEh4V0ZJSi94RVVJSWszQm9DWGZkSGxSeUlJTDJnZ1l3d0lzUWRsQVM0TWtXSjUvb0RHS3V1c0M2bjZKS3V1T2dVcWZpNTJVT29MUG1VYXdLWWpNaGhBVEpRbVNHS1BKaTBhUUlRbFVtUVJScWlwbG1lSThNbEhINjNjZHV1dGlIcytOV2VkSktad3AzWnN1am5pY2dRMVoyYUphQWFnNXBkaGlnZ25iMWhDb0NXSlhPTFpaN2pmQml4d2lQbnVPeUtUSVZqd0FiMHVIaFlBQnpMazhDNkpmcVVaR0VycWl0Z3BYdU5ldStGYWJiM1ZwMWRnZlRqd3lTaWpKNmpIRzNiWUZBSE9Oa29paFQyMWtLeUx4c1lrTExFaU1sc0NxTks1S0cxL3FiYjNaTGJ6WlpieTBreTNacXVMNFkzMzFLNmlqbWdkZHRydDdDSzdBVFIzTTd6RU9RdnRtN3V0VU8yZ0x2WTcyNytrOGRuMDIzQVh4cGh2NUI1Y1djSWZwTnV3VVY4UVM2eVhpeFhMZXhGTk50N1ZRTUZva2RnRER3L3cwQU9xVTZKQXd3dzBrQmYzNVpoZmhlUlFpWTlZeEF3ZUVzQndpVW84VUdFTEV4Y0xFd3g2bCtoenh5NEs4VklFUWl6UTV3SExhWkJoUUFBaC9oVk5ZV1JsSUhkcGRHZ2dVMk55WldWdVZHOUhhV1lBT3c9PSc+Ig0KDQogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2PiI7DQoNCiAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/lt6bplK7mjInkuIvmi5bliqgNCiAgICAgICAgICAgIC8vdHlwZTrmoLnmja7kuI3lkIznsbvlnovvvIzlpITnkIblm77moIfljZXlh7vkuovliqENCiAgICAgICAgICAgIHpobUxvZ29EcmFnKHR5cGUsd2ViKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICB2YXLCoHpobUxvZ29EcmFnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6aG1sb2dvIik7DQoNCiAgICAgICAgICAgICAgICB2YXIgemhtTG9nb0ljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaWNvbkxvZ28iKTsNCg0KICAgICAgICAgICAgICAgIGlmKCF6aG1Mb2dvRHJhZyB8fCAhemhtTG9nb0ljb24pcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZWRvd24gPSBmdW5jdGlvbihldmVudCl7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQud2hpY2g9PTMpcmV0dXJuIGZhbHNlOy8v5bGP6JS95Y+z6ZSuDQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlZG93blRvcCA9IHpobUxvZ29EcmFnLm9mZnNldFRvcDsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgemhtTG9nb0ljb25IZWlnaHQgPSB6aG1Mb2dvSWNvbi5vZmZzZXRIZWlnaHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGJvdHRvbVNwYWNlID0gMTA7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQudGFyZ2V0LmNsYXNzTmFtZSAhPSAnaWNvbkxvZ28nKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAvL2xldMKgc2hpZnRYwqA9wqBldmVudC5jbGllbnRYwqAtwqB6aG1Mb2dvRHJhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0Ow0KICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXTCoHNoaWZ0WSA9IGV2ZW50LmNsaWVudFktemhtTG9nb0RyYWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOw0KDQogICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnBvc2l0aW9uwqA9wqAnZml4ZWQnOw0KDQogICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh6aG1Mb2dvRHJhZyk7DQoNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb27CoG9uTW91c2VNb3ZlKGV2ZW50KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUubGVmdMKgPcKgJzVweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB6aG1Mb2dvSWNvbkhlaWdodC1ib3R0b21TcGFjZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWS1zaGlmdFk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB5KSwgaGVpZ2h0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0geSsncHgnOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy/lnKhtb3VzZW1vdmXkuovku7bkuIrnp7vliqjlm77moIcNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxvbk1vdXNlTW92ZSk7DQogICAgICAgICAgICAgICAgICAgIC8v5p2+5byA5LqL5Lu2DQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsemhtTG9nb0RyYWcub2Zmc2V0VG9wKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyzCoG9uTW91c2VNb3ZlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wK3pobUxvZ29JY29uSGVpZ2h0K2JvdHRvbVNwYWNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1Mb2dvRHJhZy5vZmZzZXRUb3AgPCAwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9JzBweCc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5pbm5lckhlaWdodCA8IGhlaWdodCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPXdpbmRvdy5pbm5lckhlaWdodC16aG1Mb2dvSWNvbkhlaWdodC1ib3R0b21TcGFjZSsncHgnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvL2NsaWNr5LqL5Lu25aSE55CGDQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2aWRlbyc6DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYgd2ViLmxlbmd0aCA9PSAwICYmIHpobUxvZ29EcmFnLm9mZnNldFRvcD4wICYmIHdpbmRvdy5pbm5lckhlaWdodCA+IGhlaWdodCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtdXNpYyc6DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYgZS50YXJnZXQuY2xhc3NOYW1lID09ICdpY29uTG9nbycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmxEYXRhID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8jXC8oPzpzb25nfGRqKVw/aWQvfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLm11c2ljXC4xNjNcLmNvbVwvbVwvKD86c29uZ3xkailcP2lkL30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyg/OnNvbmd8ZGopXD9pZC99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wveVwucXFcLmNvbVwvblwvcnlxcVwvcGxheWVyL30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdWdvdVwuY29tL30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdXdvXC5jbi99LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tL30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybCA9IG11c2ljVXJsRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobXVzaWNVcmwubGVuZ3RoPT0wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCh3ZWJbMF0udGlwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHdlYlswXS5uYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXRlYXNlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0ZWFzZUZ1bigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdxcSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxRnVuKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1Z291JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Vnb3VGdW4oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3V3byc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1d29GdW4oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneGltYWxheWEnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hbGF5YUZ1bigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV0ZWFzZUZ1bigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybFBhcmFtcyA9IF90aGlzLmdldFVybFBhcmFtcyhsb2NhdGlvbi5ocmVmKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybFBhcmFtcy5pZCA9PSB1bmRlZmluZWQpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXRlYXNlVXJsRW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50KCdodHRwczovL211c2ljLjE2My5jb20vc29uZz9pZD0nK3VybFBhcmFtcy5pZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBvcGVuVXJsID0gd2ViVXJsKyc/dXJsPScrbmV0ZWFzZVVybEVuY29kZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyI/aWQ9Iit1cmxQYXJhbXMuaWQrIiZ0eXBlPW5ldGVhc2UiDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxcUZ1bigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHFxU29uZ01hdGNoOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5ZXJfbXVzaWNfX2luZm8iKS5jaGlsZE5vZGVzWzBdLmhyZWYubWF0Y2goL3NvbmdEZXRhaWxcLyhcUyopXD8vKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NpbV9zb25nX2luZm8iKS5jaGlsZE5vZGVzWzBdLmhyZWYubWF0Y2goL3NvbmdcLyhcUyopLmh0bWwvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXFxU29uZ01hdGNoWzFdKXtjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+W5Yiw5q2M5puySUQnKTsgcmV0dXJufTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb0xpbmsgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3FxU29uZ01hdGNoWzFdKycmdHlwZT1xcSZwbGF5VXJsPScrYXVkaW9MaW5rOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3Vnb3VGdW4oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb01vZHVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXVkaW9Nb2R1bGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpLnN0eWxlPSdib3R0b206MHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Nob3dIaWRlX3BsYXliYXInKS5jbGFzc05hbWUgPSAnaWNvbiBzaG93LXBsYXliYXItYnRuJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ0t1Z291TWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3NvbmdLdWdvdU1hdGNoWzFdKycmdHlwZT1rdWdvdSZwbGF5VXJsPScrYXVkaW9TcmM7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdXdvRnVuKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2wnKS5zdHlsZT0nYm90dG9tOjBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdLdXdvTWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3NvbmdLdXdvTWF0Y2hbMV0rJyZ0eXBlPWt1d28mcGxheVVybD0nK2F1ZGlvU3JjOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geGltYWxheWFGdW4oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXInKS5zdHlsZT0nYm90dG9tOjBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybEluZm8gPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh3ZWJVcmwrJz9pZD0nK3VybEluZm9bMV0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxJbmZvWzFdKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih3ZWJVcmwrJz9pZD0nK3VybEluZm9bMV0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+WdXJs5Y+C5pWwJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneW91dHViZSc6DQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25kcmFnc3RhcnTCoD3CoGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybsKgZmFsc2U7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5LiL6L29DQogICAgICAgICAgICBzdGF0aWMgTFJfZG93bmxvYWQodXJsLGZpbGVuYW1lKXsNCg0KICAgICAgICAgICAgICAgIGxldCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsNCg0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHVhLm1hdGNoKC92ZXJzaW9uXC8oW1xkLl0rKS4qc2FmYXJpLykpOw0KDQogICAgICAgICAgICAgICAgaWYodWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsKTsNCg0KICAgICAgICAgICAgICAgIH1lbHNlew0KY29uc29sZS5sb2codXJsKTsNCiAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQodXJsLGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBjbGFzcyBDb3Vwb25DbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCg0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCg0KICAgICAgICAgICAgICAgIHN1cGVyKCk7DQoNCiAgICAgICAgICAgICAgICB0aGlzLmRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudC5pZD0nemhtX2Rpdl9zJzsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGFvYmFvKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9qdVZhbGlkJyk7DQoNCiAgICAgICAgICAgICAgICBub2RlLnN0eWxlPSdvdmVyZmxvdzppbmhlcml0OycNCg0KICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90YW9iYW8nOw0KDQogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcudGItbWFpbi10aXRsZScsJy50Yi1zaG9wLW5hbWUgPiBkbCA+IGRkID4gc3Ryb25nID4gYScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7DQoNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG1hbGwoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX0xpbmtCdXknKS5wYXJlbnROb2RlOw0KDQogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsNCg0KICAgICAgICAgICAgICAgIF90aGlzLmdldFRpdGxlU2hvcCgnLkl0ZW1IZWFkZXItLW1haW5UaXRsZS0tM0NJanFXNScsJy5TaG9wSGVhZGVyLS10aXRsZS0tMnFzQkUxQScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7DQoNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0bWFsbENhb3NoaSgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIC8vbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9MaW5rQnV5JykucGFyZW50Tm9kZTsNCg0KICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0pfTGlua0J1eScpLnBhcmVudE5vZGU7DQoNCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOw0KDQogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcuSXRlbUhlYWRlci0tbWFpblRpdGxlLS0zQ0lqcVc1JywnLlNob3BIZWFkZXItLXRpdGxlLS0ycXNCRTFBJykudGhlbihmdW5jdGlvbihyZXNwKXsNCg0KICAgICAgICAgICAgICAgICAgIF90aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUscmVzcC5nb29kc1RpdGxlLHJlc3Auc2hvcE5hbWUpOw0KDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0bWFsbE90aGVyKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG0tbXNnLWJveCcpOw0KDQogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsNCg0KICAgICAgICAgICAgICAgIF90aGlzLmdldFRpdGxlU2hvcCgnLkl0ZW1IZWFkZXItLW1haW5UaXRsZS0tM0NJanFXNScsJy5TaG9wSGVhZGVyLS10aXRsZS0tMnFzQkUxQScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7DQoNCiAgICAgICAgICAgICAgICAgICBfdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLHJlc3AuZ29vZHNUaXRsZSxyZXNwLnNob3BOYW1lKTsNCg0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgLy90aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgamQoKXsNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgLy9sZXQgamRHb29kc0lkID0gY291cG9uVXJsLm1hdGNoKC9qZFwuY29tXC8oXFMqKS5odG1sLyk7DQogICAgICAgICAgICAgICAgICAgIGxldCBqZEdvb2RzSWQgPSBjb3Vwb25VcmwubWF0Y2goL2pkXC4oaGt8Y29tKVwvKFxTKikuaHRtbC8pOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBub2RlPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2hvb3NlLWJ0bnMnKTsNCg0KICAgICAgICAgICAgICAgICAgICBub2RlLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdCgnZ2V0JyxgaHR0cHM6Ly9hcGkudHlwZWNocm9tZS5jb20vaW5kZXhfamRfbmV3LnBocD9nb29kc19pZD0ke2pkR29vZHNJZFsyXX1gKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sPScnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICByZXNwLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGANCiAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvdXBvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9sZWZ0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1faW1nX2ljb24iPg0KICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFCa0FIai9BQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRSkxBSC9BQ3dBQUFBQVpBQmtBS2Y2QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCanI2QmpyNkJqdjZCanY2Qmp2NkJqdjZCenY2Qnp2NkNEejZDRHo2Q1QzNkNUMzZDVDM2Q2o3NkN6NzZDei82Q3ovNkRELzZERUQ2RFVENkRVRDZEa0g2RGtINkRrSDZEMEw2RUVMNkVVUDZFVVQ2RWtUN0UwWDdGRVg3RkViN0ZFYjdGVWI3RlVmN0ZVZjdGa2Y3RmtmN0YwajdGMGo3RjBqN0YwajdHRWo3R0VuN0dVcjdHa3Y3RzB2N0hFejdIVTM3SDAvN0lWRDdJMUg3SkZMN0psVDdKMVQ3S0ZiN0tWYjdLbGY3SzFqN0xscjdNRno3TWwzN05GLzhObUQ4T0dMOE9tVDhQR1g4UDJmOFFXbjhRMnI4Ukd2OFJtMzhSbTM4UjI3OFNHLzhTWEQ4U25EOFRITDhUblA4VDNUOFVIWDhVbmY4VkhqOFYzdjhXMzc4WUlMOFpJWDhhb244YjQzOGNZLzdjSTc2Yll2NGE0bjFhWWZ1WjRUalpIL1VaSHpIWm51OGFYcXRiSHFpYjNxV2MzcUlkM3VBZUhwNWVYbDZlbnA3ZTN0OGZIeDlmWDErZm41L2YzK0FnSUNCZ1lHQ2dvS0RnNE9FaElTRmhZV0dob2FIaDRlSWlJaUppWW1LaW9xTGk0dU1qSXlOalkyT2pvNlBqNCtRa0pDUmtaR1NrcEtUazVPVWxKU1ZsWldXbHBhWGw1ZVltSmlabVptYW1wcWJtNXVjbkp5ZG5aMmVucDZmbjUrZ29LQ2hvYUdpb3FLam82T2twS1NscGFXcnBxZTJxS3ZBcWE3SnFySFFxN1BYckxYZHJMZmlyYmpvckxudXFybnlxTGoxcDdqM3BiZjVwTGI2b3JiN29yWDhvYlg4b0xUOW9MVDlvTFQ5b2JYOW9yYjlvN2Y5cGJqOXBybjlwN245cUxyOXFMdjlxYnY5cWJ2OXFyejlxcno5cXJ6OXE3ejlxNzM5cTczOXJiNzlyci85c01IOHNzTDh0TVQ4dHNYOHVNZjd1c242dmNyNndNejV3czc0dzgvNHhkRDN4OUgzeU5MMnl0VDF5OVgwemRiejBOZnkwdG54MU5yeDFOdngxZHZ4MXR6eDE5M3cyTjN4MmQvdzI5L3YzT0h2M3VMdjRPUHY0dVh1NWVmdTUrbnU2dXZ0N2UzdTd1N3Y3Ky93OFBEeDhmSHk4dkx6OC9QMDlQVDE5ZlgyOXZiNCtQajUrZm43Ky92OC9QejkvZjMrL3Y3Ky92NysvdjR5elRJSS9nRC9DUnhJc0tEQmd3Z1RLbHpJc0tIRGh4QVpxbHZTSktMRml4Z3ovaXRENU1RSkkybzBpaHhKTWdrSEJ3bzhQQ0hKc3VWRFlrSWN5SlJReEovTG16Z0w0b281azRqTm5FQmQ0aG9pMDRFRW4wR1RHalFIUlVtU0x3NkhGajM2azJHWEpVbWdWRlVLc1VrS0NoaDZqR2tvdGVmV2hHSjhhS0NRd2duWGlHVjZGTVZRazJGWm8wZ1granVpUWFhQ0hyamVQcVRpb3FpREZGY1liaU1xa3dLU2hsWldLSkJaSUVkSXdRMjNFYUZRbElJUVp3eWpxS0JBUWNVVXUwSTROeDV5Rm5QQ0tpc01nNGpDc0JzVUlrV2tOSVJTd3JDS0xhNGQrak9Dd1hDUHl5elIvRENNNFVqd2gxd0tGeDFSeGVXWUZnV0t3aWp6L0tHU2t3NEsvc0F3NDVJTWpPd3BLM1ozU0NiSTJoVHFXL3BiVW9LQ2h5SEkxek1zVTJTSVZweS9OREZFRW1ub2h4TXVWRUNSUlJaWVhDRUVGcjRZNkpvYVVoamh3d3dzZUFCQ0NTV0lvSUVMTGdpUnhCUzhTQWlVUDFNUU1jTUlHa2hnMklzT1VLQkJDVHdrRVlhSkJaSFQya05TQ0pGQ2NUQUdhUmdITFJnaFJrYit4Sk9jRWpQWXdFUmdFSFV4eEZkQ1Z2a2lCaTRza1Y5RGFDeVJndzFMUUtuUkVpRElCTUlQVk94b2tEOVEyQUJra0JKd0JsYU1MZ3JKZ1ErSk5XVE5Feng0SUpNSThXR2tuR0VVbkVDRUZ3dXBjVVJ2UWM3WVFnOUduRkNDQ2pBZzBRTU1KL1FGSXdVdFBLSG1RRlVFTWNLTE9jQ2owYUJYdXFBYlFtY1E0ZWVML2hTTTBNTVJVMnc1a0JwVUdKSERDS29aZHNJU256YkJRcTlGOGZDcFEweVVDZU54QjUwaGhLYUdsU0JFRk1wRUJVVVFqQm9td2hIbUhGUkdEa0dlUUp0SWFpVFJ3cHRtamtzUUdzKytxRUVPVWh5TGtEOVI4QUN0VEI4QWE1QVhLbVJYbEFZd09LRU5TMW9NY1lKcUNyaEFSa0hnSEFGZVVTSVVjWVpHWmhpUnJVemlHdlR0WkRHcVlNUllOMGtCeEFrZ3NMQlNRVTJNNm1zVDhqYmtqMWN2dW9Cb1FVNm9BTUlKUWxRSFZEQlVQTUdGUVYzQThHSUtVTGowUkd5ZEFiSGxPbFU0a1daM3R3eUJyZ2h1M2RURUNVTXlnU05CdkJtbWdSRXRDNlNHclFrcDhhcE1MY3lNb3hwQnZQZ0QyUWFSUVVRT09Sd0JkMEZxcERhWC9oRmIveFBGeFNmb3ZOQXlSR2hRUUVwSk9KUkZDMFVwd01LUkpwS3pXV2Q1TFRTR0MvNVdkbmRCZlAycnRZbGR1TUN4QXlwMDRkQVlMR1MrblVOZVNDY1RENXNMNXNUWkVyQjJPbmFVeWNDZHk4Uk5KL2g2L2d6UnF3ZnFNblJkNWpLUTUxQVZXTXVFd1JJU2Z0dTRDN3MzZEh6dXlqZDBCZytHK1pDT2dXR3dNRG9RMzkrT2ZQWU0rVE41ZURPd1llQVQyVG9HMGZYaEpkL1Z3eU5vZ1pNWlRpbmh2MU5KUUo5QW5QQXdEbnpPZk5pRENQeW1rd1dEZkNFSi8vTmZFcG9RTzdFUmdRT2t5U0FGT0lDZmdrQUJXaVhRMzBQb1Z3RDdQUVFNcVpPSkFRc3lCdmRva0RRZ01FSTJHSktFRW95dUtBV2dEc3BBQ0pVUjRxNSsvZ0pjQ0JsK0tBRWdlUEJzTC9KQUR4aGlnM3ZKWmxVRFdjS2JTdEJEQkFJUklrUDBWeEVMOG9TSHdZb0REQWtEdUJSQXhqSXFvQVVnRzhnVFFLZzI2LzJ3aEVGVWlCZFdvRVVqRW9RS0xUQmpHUjJRZ3lvcVJBby9BSkVnWFpDRGszRU5XaUNBb2h2UEI1RmtGV1dGQkhrWkR3WUpJaDlRNFNGcTJBSVdOb2tGTFpETkpIdWIzeHZIMHhWb2pRQUxCMUVEZ3pqWkJURzVoQW9wNEJnRmlpQktSZ3BuZlE0UUFTcjFBd2JSRmNVR0ZSeUllVElIdTRlZ1FTNjVRNE9CMk9hcm56bmtHMGg0bFFlZzk1QXF4TElvUHdoYlVwRHdKZzFRMHlGbU9BSU1ab0FFVnpJRUNkQjZub21rY0RITFJHUWI1UnVoRGFJbFFnT2RBWmt5L2xFSlY1aUFSQitZY3oxTHVCY1AzT2N5S0JqQkNJcTBITGc4dDdYUWVTMXg2Zk1LV0ZSUXRQUVo0VjdVNjF2bmlwS0NTeTRFRE9meGl3M2lXSkFvTkU4bUdsQkMzLzd4aFhrYWg2UURRY0lIRERPQ05oNGtDek40MFF4Z3FoUi9FT01nVGxDVzg0Z2dEWVZBNFFRY1UwQUt3S0FRTkFTQldDQ29hRUdDb1UyTVZDTUtQN0RCRUJaR0VEVkl6VEFmQ0pSQjJDQUVESkFSQTBPbzFyeEFTVGxtRk1RTFE4Z0JFT0tWRXlvSW9UY0t3SUFRekJrR2x4WWxiUXJwZ2hCVW9BSWhRQTRoVTFBQnFiaDZxN0lxZ0FMU3NvSkx2RUFFS3ZtbEJNQXBpQlJTUUNnaEhFTWg2SkRDMHhKaUJoOE03VFFGQ1orL09sYUU2bW1rQ2psQS9oZEtUcERaU0pwTk5sTE55Qks4NklFREVrUU1QL3hYRHc2TGtWMElEMFlhS01KUERaS0dweHJHQmhQTGlFTTdzOWRVRmc1R0dDQ0NTT0p5UTdaSTdEVklRK2szTGVLUElxRExCY1F0Q0JtTU1KcVl6VEFqdk5DYm1kREVrTzhZeGdWcGpFaGtSZ2RKaFZoQkNDcUxrUkNxaWhBcDJFQUVJOGlCRTdyUmtESnc3MThxSmE5NURmTzJoa3pqQ1RrUWdRaDZZRk9NakVFS1Vnam1RSm9nVkFmQVFKa1I2VUllSVpiUWhad0J4SzU5VGhwTSt5OGJ2UERHTnc3THZZRFFqSlUreEFrenRaS1FZU1NDRnZ1WXRBc2RzcElkNE04alB3U2RTeDR5QjhUcVpJVlVRUVUzalBLTHpzallLaStFdTNQNUFBakdUT1l5bDlrRGJ5cEEvZytBNGVXR2xIWjhUbGlDbk9kTVp6cERBWjhGNE1GeTI2eVFOOCtFbGc3cEJtUEMwNE05OHhraGZzYUxOdStpWmtNZjJpQ0pwa3BVQnQzb1I1UFdCeHlUTkZrb1hXaExJNXJHZUhtSU16anRhRThMcExTR0VVSVlyb0NGQlMySWs1eTh3aFhFMERiSzZOblVrQWExQXpoZzVsNlgyVU00dkRXdUNZSnFMUXNwejZVMjlSa3diZXdnS2NBR2JoMzJRSGJTN0NCNWhzQk9oa0lMNmxSdEIyakFCdldVdGtCUTlJUGh6VUFDR0VpM3V0TXRnUnpRRGdneEZ2Y0FvY1dCM0Jva29FWHhnTDNsTFpDL0dTWUgwVFhJR1B5cVZEL3lXeUQzWk00UUNsU1FNcFRWTUVDSTlzRUp3Z1F2YW9BSFRuQ2ZQODdRaE5pQ2RkOFRqd3VNU1VEZ0FnOTR3QVZCbm9yU0puNlFLWVJYeVM2b0xjdFJkbElocThESU0vL0h5MXBBZ1N3ekJ3YkZ5N2xCckRBbDJYcGJCVU5ncXRBVjRnOHFGS0htTFRqQ0xwZE85YW9uSkNBQUlma0VDVElBL3dBc0JnQUJBRmdBWVFDbkFBQUFBUUVCQWdJQ0F3TURCQVFFQlFVRkJnWUdCd2NIQ0FnSUNRa0pDZ29LQ3dzTERBd01EUTBORGc0T0R3OFBFQkFRRVJFUkVoSVNFeE1URkJRVUZSVVZGaFlXRnhjWEdCZ1lHUmtaR2hvYUd4c2JIQndjSFIwZEhoNGVIeDhmSUNBZ0lTRWhJaUlpSXlNakpDUWtKU1VsSmlZbUp5Y25LQ2dvS1NrcEtpb3FLeXNyTEN3c0xTMHRMaTR1THk4dk1EQXdNVEV4TWpJeU16TXpORFEwTlRVMU5qWTJOemMzT0RnNE9UazVPam82T3pzN1BEdzhQVDA5UGo0K1B6OC9RRUJBUVVGQlFrSkNRME5EUkVSRVJVVkZSa1pHUjBkSFNFaElTVWxKU2twS1MwdExURXhNVFUxTlRrNU9UMDlQVUZCUVVWRlJVbEpTVTFOVFZGUlVWVlZWVmxaV1YxZFhXRmhZV1ZsWldscGFXMXRiWEZ4Y1hWMWRYbDVlWDE5ZllHQmdZV0ZoWW1KaVkyTmpaR1JrWldWbFptWm1aMmRuYUdob2FXbHBhbXBxYTJ0cmJHeHNiVzF0Ym01dWIyOXZjSEJ3Y1hGeGNuSnljM056ZEhSMGRYVjFkbloyZDNkM2VIaDRlWGw1ZW5wNmUzdDdmSHg4ZlgxOWZuNStmMzkvZ0lDQWdZR0Jnb0tDZzRPRGhJU0VoWVdGaG9hR2g0ZUhpSWlJaVltSmlvcUtpNHVMakl5TWpZMk5qbzZPajQrUGtKQ1FrWkdSa3BLU2s1T1RsSlNVbFpXVmxwYVdsNWVYbUppWW41MlRxcVNLdUsxK3pMcHIzc1ZZNmN4TjdzOUg4TkJGOE5CRjhOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5GRThORkU4TkZFOE5GRThORkU4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRzhkRkc4ZEZHOGRGRzhkRkg4ZEZIOGRGSDhkRkk4ZEZJOGRGSjhkSko4ZEpKOGRKSzhkSks4ZEpMOGRKTDhkSk04ZEpNOGROTjhkTk84ZE5QOGROUDhkTlE4ZE5ROGROUjh0UlM4dFJTOHRSVDh0UlY4dFZXOHRWWTh0Wlo4dFpiOHRkZTg5ZGc4OWhpODloajg5aGo4OWhrODlsbTg5bG85TnBxOU5wcjlOcHM5TnR0OU50dzlOeHk5Tnh6OU4xMTlOMTI5TjEzOU4xNTlkNTc5ZDkrOWQrQTllQ0Q5ZUdHOXVLSzl1T045dU9ROStXWCtPaWsrT3V1K2UyNCt1L0MrdkhKK3ZISU1zMHlDUDRBL3drY1NMQ2d3WU1JRGZZTE55Nmh3NGNRSTBxY1dJL2JNbWZkOGszY3lMSGpSbS9IY3VVNlZzNmp5Wk1uK1cwVEtiSmJQNVF3WXo3Y3g0MWxMbTR2WmVyYytZK21UWmM4Z3hMc1orN2J0M2dTZmJMRUtSSGVOMi9sY2dwMU9NNVpMMkRaNWtWVUtwSXBSSG5aZ1BWeVZuSnFRbnJaV1BZQ09yUG1VcWtKKzNrRHhqS2JQck1JMVVXejZhd2R4SDV1Yy9YeUZwSGRNNWF4cm1uRXE1QmJMN1hiNENJMFozVnNPb2o2dGowVzJjc3I0NExxRHJOTWh1NXZPVzdkU2tNc3A0d3Z2TThIKzNXalczZXhUbnhwV1FMckJoc2hQR3MyazZuak9lOVpMSmJXNlBWRytDMWtybGpKZWRLemRueGt3K1VINldrVE52YjZ6bjdmbFA3MU9zYk5OdmFDOUxweGl5cVUzemh1My9DZGg3bFBIVHA0N3RxMTQrYU8zM3k4K0tEVFRUYldQSE5NTXNvb2s0d3cwVml6elRmcCtQZGZUUDJrMDQwMXl0Qm0wNGJqTFpQTk4vTE0xNDlrRzZHempWVWJwcWppTWRGMEU2SkpJMHAwenpmV1dEUE9YUnZCd3cyS0t2YVlvakRXaEdOZVJQalFhTTAzKzBBVVRqSWlIWk9OT2lUR1ZvNDFHcXI0V0M5WCtqaFNOdXhJMUU4NTF6aVhqSGNJM1pNYlN4aTk1bEErM3JTbW9qREtSSk5OTjg0NDg0dzEzaEM0VEpWcVJjT2VRK3RzdzZSTjEwUTVrSmtwOW1LTmFnZlp3NDF6TnZXaVREYmVvQ1BmUWZtbzA4MDF5V3pHVnppRy9qUE9NNTdXRmFwQVM2cVl6WkFDMmJPTk1QNHBLck1OT2hKaVpzNDJ5NlNZakRkUlRxZWlNK1pBbE04MzBaU2FpM0FHM2NNTnJEWUJjdzA2cHlMVUR6clhNTXZTTWQrUUNJOHoxWWtFakRWL1FxUWpqN2xFTnhSSUd5YlRqVDBvMWRPTm0yZ0dpeDV3bkdHa0ZVZm9aTFBNTWMrVVJkQTQ4SXJrekRqUlJ0UlBWUnRhbythL3poeXp6RFpkbXNTUE91UXNQTkJ2R3dMTFV6bWljYmJOa1Ayc013NlVVK25qV0hCazZvVHd0ZUhNWjA3QXdyQUZFVDZzU3R1Y1RkRWd0UncrMm15WXphVVB6Y1BOTmRkNFU3TkIrR2ltRm0vTG9ST3dNOE5CNU0reVRYNGprVHQ3c2ZUTWk1OEI1dWxhQmY4ekQzVWlKUWIwUTNQcDFqSnM4R1F0c01VT3lXTWNjc3BGaERGTGlzRkdEdjZrTjRYOWp6elJkR3Z1WDkxNG1rekVlSGw5TGFOZkJVNzNST280bzV2VmpOVkRyMGpXMURNUjRJTFhIVkU5MTlpVWpkOG15UzA2Nlp3Lzd1WEp6MWx6dGxDc3FVWFk1bk5qN25sRTQwQ2FETnlmRytXNzcrd1d0UGUxS1Q4a2QrY2J4UzVTTW40VkZNL3Z2cE9qRVQ2UFltbjllT1VWVkE2a3l2QWV0K08yYnhSUHg4ZUlVOUE4cjE2UDVURzhodGVqTXVzVU5JNjEzVzgwRC9qbDNnNFJQUjNuc28zMmZMUEpNYlJoRFd0dDZCaU0rOGMzTktRTW5Vbmtmc2liQ0FSWm9nMEE5bWc4OGJqY2hxSnhyNEdVZzM3ZVM4Z0V3emNSZVBTdmdnVFJTNCtzZ1pSODFlaUYxcmlHdnp5b3U4dElFSCtEaTRnNEJqVVM4dzFsSFA3WHNFYURvdEdnSncwa0gvblJUenZjOFRxQjNJd3pzNU5JNmtnb2tmbU54aDBId1VjUzlRT1BKSFVrSFpMakROTWVXTHY4VFVSeHl3dWhUdUxodG5MaEtDSmpxMDRzVmpVUlJDR25pVHpKeDByUXBFYUZvR3NrbEpQSU9zSW9rdEY5Sm0zZUN1VG52RkVqYjd3eElvak1CVERXeGhpbkVRcVBEb21SL1RTNGpEN3F4QjVuR3NrTXpTSU92dG1sTjk4dzRNKzhaQTV2cEVhQ0doU0dEOW5XUm1Fb01pNVZ3Wkl6RWlpdDJkZ2toNGVzRXRRZ2trSEJCYzhoNkNDa0pHLzVtUXo2VEhNTythTkk2dWNRZDJpd1hOQVVTajlxOVM4ZVNsSm1CeWxIcnREa3dJUGNRMm1qR2FWQStFRzYySmlEUU56b29FRHl3Ym9tRlk4Z1NmN2JUR2U0V1JEdzhLMHovbkFlTjZ5UkRXaDVSQjNiY0JNd3R2SEl2MTB6Wnc2Qng0bWNFVStIZ0RGaCtrc2FYWHJ4TU1UWmJVZWw2cVJCa2hrcGJ2Q3puK2tnV1VKQW1URWJFbVI4M1JwTE4vU0hrSFZRS1VYTzRKMC9nNlBPamp5eFNiTjhLZjVFSW95c3RNVll1WWpaU2YvQnMxSlo0eDRvdVp2SHZGZ1FlaHBRakE5QkM0Y3drazJEaE1ZbXdxQmtSMlJUSlJhZWhVN0dzc2FwOW9IT1l4bnhJVDgxbzBjTUk4Q2cxbFJRYXZFTVF0QmhqV1FrUTRaaEF4MVltV213d29udWFQMEVrMSt6NFVtQnpBTWRsdHBJN242SnlZajJqelFidVFka3V5b1UzSUQxR2xnQ2htaEhTOXJTWXFWSzJnam9oQjR5V1MyNVZsY3VYZjV0UWdUNzJ0b1dzcUd5UFVna2JldWpZOXd6dHdVWkpHOWR5MEhnWmpWMHVqbUdjcGZMM09ZZXcxTnpYS3B4QjhMU3VwRGpHK0hJcm5hM205MXZsQ09VMlpEdWRQOVIzYTZjTVRDNUNPOTRFVkxldmlVRnZlcGRyMEhhcTFlSGNDVzk0cDB1ZmYxMjMvaktseUQwUGEvbzhtdmM5bTVESGt0MGg0SVh6T0Q4eUtObmVDTXdjTnQ3SUw5YStNSVlYaENoSkp6YmVvUnl1Q255NzM5YjlXRVEvMUsxSXhaSVpreHNwY2lrbUNEbGFDT0x2NFhGRncra1F0bncxREd1WVZyU2hza20ycUNwamNsaHJXUElpemxGUHJLTkNmSXlRa0gxSUdQalN6bVhUT0ptY2FPSjlkZ0dhbEZNNVlHVUVxelpLQWMrUm5RUGN2QllnRDJsc2psVzAyVU41Ylk1eEloZE1qcjY5OXBvMUxqTEJ4R0hNclcwU3p6anNsaGFVaFF2L1Z3UWRvQTBSY0NnNkpRSkhSdE5LYk5GSHYxTVFBQUFJZjRWVFdGa1pTQjNhWFJvSUZOamNtVmxibFJ2UjJsbUFEcz0iID4gICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb250ZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5IiBzdHlsZT0nbWFyZ2luLXRvcDo3cHg7Jz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9hbW91bnRfbW9uZXkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9zaWduIiBzdHlsZT0nbWFyZ2luLXRvcDotMTBweDsnPsKlPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5X251bSI+JHtpdGVtLmRpc2NvdW50fTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29uZGl0aW9uIj7mu6Eke2l0ZW0ucXVvdGF95YWD5Y+v55SoPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGltZSIgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3Rlcm0iPuacieaViOacnzwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2RhdGUiPiR7aXRlbS5lbmRUaW1lfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NpcmNsZSIgc3R5bGU9InJpZ2h0OjQ0cHg7Ij48L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9saW5rX2NvdXBvbiIgc3R5bGU9InBhZGRpbmc6MHB4IDE2cHggMHB4IDE2cHg7Ij4NCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iemhtX2dldF9saW5rX3RleHQiIHN0eWxlPSJsZXR0ZXItc3BhY2luZzogMTBweDtmb250LXNpemU6MTZweDttYXJnaW4tdG9wOjEwcHg7IiBocmVmPSIke2l0ZW0uY291cG9uX2xpbmt9IiB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyBzdHlsZT0ibWFyZ2luLWxlZnQ6MTZweDt3aWR0aDozNHB4OyI+6aKG5Y+WPC9hPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICBgDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobV9kaXZfcycpLmlubmVySFRNTCA9IGh0bWw7DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KDQoNCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBnZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lLGdvb2RzVGl0bGUsc2hvcE5hbWUpew0KDQogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+ew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc19pZCA9IHRoaXMuZ2V0UXVlcnlTdHJpbmcoJ2lkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoIWdvb2RzX2lkKXtjb25zb2xlLmxvZygnZ29vZHNfaWQnKTtyZXR1cm59Ow0KDQogICAgICAgICAgICAgICAgICAgIGlmKGNsYXNzTmFtZSA9PSAnemhtX3RhYl90YW9iYW8nKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKS5iZWZvcmUodGhpcy5kaXZFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYmVmb3JlKHRoaXMuZGl2RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYGh0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL2dldGNvdXBvbi5waHA/Z29vZHNfaWQ9JHtnb29kc19pZH0mZ29vZHNfdGl0bGU9JHtlbmNvZGVVUklDb21wb25lbnQoZ29vZHNUaXRsZSl9JnNob3BfbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaG9wTmFtZSl9YDsNCg0KICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3AuY29kZT09MjAwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYA0KICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY291cG9uIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9sZWZ0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1faW1nX2ljb24iPg0KICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFCa0FIai9BQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRSkxBSC9BQ3dBQUFBQVpBQmtBS2Y2QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCanI2QmpyNkJqdjZCanY2Qmp2NkJqdjZCenY2Qnp2NkNEejZDRHo2Q1QzNkNUMzZDVDM2Q2o3NkN6NzZDei82Q3ovNkRELzZERUQ2RFVENkRVRDZEa0g2RGtINkRrSDZEMEw2RUVMNkVVUDZFVVQ2RWtUN0UwWDdGRVg3RkViN0ZFYjdGVWI3RlVmN0ZVZjdGa2Y3RmtmN0YwajdGMGo3RjBqN0YwajdHRWo3R0VuN0dVcjdHa3Y3RzB2N0hFejdIVTM3SDAvN0lWRDdJMUg3SkZMN0psVDdKMVQ3S0ZiN0tWYjdLbGY3SzFqN0xscjdNRno3TWwzN05GLzhObUQ4T0dMOE9tVDhQR1g4UDJmOFFXbjhRMnI4Ukd2OFJtMzhSbTM4UjI3OFNHLzhTWEQ4U25EOFRITDhUblA4VDNUOFVIWDhVbmY4VkhqOFYzdjhXMzc4WUlMOFpJWDhhb244YjQzOGNZLzdjSTc2Yll2NGE0bjFhWWZ1WjRUalpIL1VaSHpIWm51OGFYcXRiSHFpYjNxV2MzcUlkM3VBZUhwNWVYbDZlbnA3ZTN0OGZIeDlmWDErZm41L2YzK0FnSUNCZ1lHQ2dvS0RnNE9FaElTRmhZV0dob2FIaDRlSWlJaUppWW1LaW9xTGk0dU1qSXlOalkyT2pvNlBqNCtRa0pDUmtaR1NrcEtUazVPVWxKU1ZsWldXbHBhWGw1ZVltSmlabVptYW1wcWJtNXVjbkp5ZG5aMmVucDZmbjUrZ29LQ2hvYUdpb3FLam82T2twS1NscGFXcnBxZTJxS3ZBcWE3SnFySFFxN1BYckxYZHJMZmlyYmpvckxudXFybnlxTGoxcDdqM3BiZjVwTGI2b3JiN29yWDhvYlg4b0xUOW9MVDlvTFQ5b2JYOW9yYjlvN2Y5cGJqOXBybjlwN245cUxyOXFMdjlxYnY5cWJ2OXFyejlxcno5cXJ6OXE3ejlxNzM5cTczOXJiNzlyci85c01IOHNzTDh0TVQ4dHNYOHVNZjd1c242dmNyNndNejV3czc0dzgvNHhkRDN4OUgzeU5MMnl0VDF5OVgwemRiejBOZnkwdG54MU5yeDFOdngxZHZ4MXR6eDE5M3cyTjN4MmQvdzI5L3YzT0h2M3VMdjRPUHY0dVh1NWVmdTUrbnU2dXZ0N2UzdTd1N3Y3Ky93OFBEeDhmSHk4dkx6OC9QMDlQVDE5ZlgyOXZiNCtQajUrZm43Ky92OC9QejkvZjMrL3Y3Ky92NysvdjR5elRJSS9nRC9DUnhJc0tEQmd3Z1RLbHpJc0tIRGh4QVpxbHZTSktMRml4Z3ovaXRENU1RSkkybzBpaHhKTWdrSEJ3bzhQQ0hKc3VWRFlrSWN5SlJReEovTG16Z0w0b281azRqTm5FQmQ0aG9pMDRFRW4wR1RHalFIUlVtU0x3NkhGajM2azJHWEpVbWdWRlVLc1VrS0NoaDZqR2tvdGVmV2hHSjhhS0NRd2duWGlHVjZGTVZRazJGWm8wZ1granVpUWFhQ0hyamVQcVRpb3FpREZGY1liaU1xa3dLU2hsWldLSkJaSUVkSXdRMjNFYUZRbElJUVp3eWpxS0JBUWNVVXUwSTROeDV5Rm5QQ0tpc01nNGpDc0JzVUlrV2tOSVJTd3JDS0xhNGQrak9Dd1hDUHl5elIvRENNNFVqd2gxd0tGeDFSeGVXWUZnV0t3aWp6L0tHU2t3NEsvc0F3NDVJTWpPd3BLM1ozU0NiSTJoVHFXL3BiVW9LQ2h5SEkxek1zVTJTSVZweS9OREZFRW1ub2h4TXVWRUNSUlJaWVhDRUVGcjRZNkpvYVVoamh3d3dzZUFCQ0NTV0lvSUVMTGdpUnhCUzhTQWlVUDFNUU1jTUlHa2hnMklzT1VLQkJDVHdrRVlhSkJaSFQya05TQ0pGQ2NUQUdhUmdITFJnaFJrYit4Sk9jRWpQWXdFUmdFSFV4eEZkQ1Z2a2lCaTRza1Y5RGFDeVJndzFMUUtuUkVpRElCTUlQVk94b2tEOVEyQUJra0JKd0JsYU1MZ3JKZ1ErSk5XVE5Feng0SUpNSThXR2tuR0VVbkVDRUZ3dXBjVVJ2UWM3WVFnOUduRkNDQ2pBZzBRTU1KL1FGSXdVdFBLSG1RRlVFTWNLTE9jQ2owYUJYdXFBYlFtY1E0ZWVML2hTTTBNTVJVMnc1a0JwVUdKSERDS29aZHNJU256YkJRcTlGOGZDcFEweVVDZU54QjUwaGhLYUdsU0JFRk1wRUJVVVFqQm9td2hIbUhGUkdEa0dlUUp0SWFpVFJ3cHRtamtzUUdzKytxRUVPVWh5TGtEOVI4QUN0VEI4QWE1QVhLbVJYbEFZd09LRU5TMW9NY1lKcUNyaEFSa0hnSEFGZVVTSVVjWVpHWmhpUnJVemlHdlR0WkRHcVlNUllOMGtCeEFrZ3NMQlNRVTJNNm1zVDhqYmtqMWN2dW9Cb1FVNm9BTUlKUWxRSFZEQlVQTUdGUVYzQThHSUtVTGowUkd5ZEFiSGxPbFU0a1daM3R3eUJyZ2h1M2RURUNVTXlnU05CdkJtbWdSRXRDNlNHclFrcDhhcE1MY3lNb3hwQnZQZ0QyUWFSUVVRT09Sd0JkMEZxcERhWC9oRmIveFBGeFNmb3ZOQXlSR2hRUUVwSk9KUkZDMFVwd01LUkpwS3pXV2Q1TFRTR0MvNVdkbmRCZlAycnRZbGR1TUN4QXlwMDRkQVlMR1MrblVOZVNDY1RENXNMNXNUWkVyQjJPbmFVeWNDZHk4Uk5KL2g2L2d6UnF3ZnFNblJkNWpLUTUxQVZXTXVFd1JJU2Z0dTRDN3MzZEh6dXlqZDBCZytHK1pDT2dXR3dNRG9RMzkrT2ZQWU0rVE41ZURPd1llQVQyVG9HMGZYaEpkL1Z3eU5vZ1pNWlRpbmh2MU5KUUo5QW5QQXdEbnpPZk5pRENQeW1rd1dEZkNFSi8vTmZFcG9RTzdFUmdRT2t5U0FGT0lDZmdrQUJXaVhRMzBQb1Z3RDdQUVFNcVpPSkFRc3lCdmRva0RRZ01FSTJHSktFRW95dUtBV2dEc3BBQ0pVUjRxNSsvZ0pjQ0JsK0tBRWdlUEJzTC9KQUR4aGlnM3ZKWmxVRFdjS2JTdEJEQkFJUklrUDBWeEVMOG9TSHdZb0REQWtEdUJSQXhqSXFvQVVnRzhnVFFLZzI2LzJ3aEVGVWlCZFdvRVVqRW9RS0xUQmpHUjJRZ3lvcVJBby9BSkVnWFpDRGszRU5XaUNBb2h2UEI1RmtGV1dGQkhrWkR3WUpJaDlRNFNGcTJBSVdOb2tGTFpETkpIdWIzeHZIMHhWb2pRQUxCMUVEZ3pqWkJURzVoQW9wNEJnRmlpQktSZ3BuZlE0UUFTcjFBd2JSRmNVR0ZSeUllVElIdTRlZ1FTNjVRNE9CMk9hcm56bmtHMGg0bFFlZzk1QXF4TElvUHdoYlVwRHdKZzFRMHlGbU9BSU1ab0FFVnpJRUNkQjZub21rY0RITFJHUWI1UnVoRGFJbFFnT2RBWmt5L2xFSlY1aUFSQitZY3oxTHVCY1AzT2N5S0JqQkNJcTBITGc4dDdYUWVTMXg2Zk1LV0ZSUXRQUVo0VjdVNjF2bmlwS0NTeTRFRE9meGl3M2lXSkFvTkU4bUdsQkMzLzd4aFhrYWg2UURRY0lIRERPQ05oNGtDek40MFF4Z3FoUi9FT01nVGxDVzg0Z2dEWVZBNFFRY1UwQUt3S0FRTkFTQldDQ29hRUdDb1UyTVZDTUtQN0RCRUJaR0VEVkl6VEFmQ0pSQjJDQUVESkFSQTBPbzFyeEFTVGxtRk1RTFE4Z0JFT0tWRXlvSW9UY0t3SUFRekJrR2x4WWxiUXJwZ2hCVW9BSWhRQTRoVTFBQnFiaDZxN0lxZ0FMU3NvSkx2RUFFS3ZtbEJNQXBpQlJTUUNnaEhFTWg2SkRDMHhKaUJoOE03VFFGQ1orL09sYUU2bW1rQ2psQS9oZEtUcERaU0pwTk5sTE55Qks4NklFREVrUU1QL3hYRHc2TGtWMElEMFlhS01KUERaS0dweHJHQmhQTGlFTTdzOWRVRmc1R0dDQ0NTT0p5UTdaSTdEVklRK2szTGVLUElxRExCY1F0Q0JtTU1KcVl6VEFqdk5DYm1kREVrTzhZeGdWcGpFaGtSZ2RKaFZoQkNDcUxrUkNxaWhBcDJFQUVJOGlCRTdyUmtESnc3MThxSmE5NURmTzJoa3pqQ1RrUWdRaDZZRk9NakVFS1Vnam1RSm9nVkFmQVFKa1I2VUllSVpiUWhad0J4SzU5VGhwTSt5OGJ2UERHTnc3THZZRFFqSlUreEFrenRaS1FZU1NDRnZ1WXRBc2RzcElkNE04alB3U2RTeDR5QjhUcVpJVlVRUVUzalBLTHpzallLaStFdTNQNUFBakdUT1l5bDlrRGJ5cEEvZytBNGVXR2xIWjhUbGlDbk9kTVp6cERBWjhGNE1GeTI2eVFOOCtFbGc3cEJtUEMwNE05OHhraGZzYUxOdStpWmtNZjJpQ0pwa3BVQnQzb1I1UFdCeHlUTkZrb1hXaExJNXJHZUhtSU16anRhRThMcExTR0VVSVlyb0NGQlMySWs1eTh3aFhFMERiSzZOblVrQWExQXpoZzVsNlgyVU00dkRXdUNZSnFMUXNwejZVMjlSa3diZXdnS2NBR2JoMzJRSGJTN0NCNWhzQk9oa0lMNmxSdEIyakFCdldVdGtCUTlJUGh6VUFDR0VpM3V0TXRnUnpRRGdneEZ2Y0FvY1dCM0Jva29FWHhnTDNsTFpDL0dTWUgwVFhJR1B5cVZEL3lXeUQzWk00UUNsU1FNcFRWTUVDSTlzRUp3Z1F2YW9BSFRuQ2ZQODdRaE5pQ2RkOFRqd3VNU1VEZ0FnOTR3QVZCbm9yU0puNlFLWVJYeVM2b0xjdFJkbElocThESU0vL0h5MXBBZ1N3ekJ3YkZ5N2xCckRBbDJYcGJCVU5ncXRBVjRnOHFGS0htTFRqQ0xwZE85YW9uSkNBQUlma0VDVElBL3dBc0JnQUJBRmdBWVFDbkFBQUFBUUVCQWdJQ0F3TURCQVFFQlFVRkJnWUdCd2NIQ0FnSUNRa0pDZ29LQ3dzTERBd01EUTBORGc0T0R3OFBFQkFRRVJFUkVoSVNFeE1URkJRVUZSVVZGaFlXRnhjWEdCZ1lHUmtaR2hvYUd4c2JIQndjSFIwZEhoNGVIeDhmSUNBZ0lTRWhJaUlpSXlNakpDUWtKU1VsSmlZbUp5Y25LQ2dvS1NrcEtpb3FLeXNyTEN3c0xTMHRMaTR1THk4dk1EQXdNVEV4TWpJeU16TXpORFEwTlRVMU5qWTJOemMzT0RnNE9UazVPam82T3pzN1BEdzhQVDA5UGo0K1B6OC9RRUJBUVVGQlFrSkNRME5EUkVSRVJVVkZSa1pHUjBkSFNFaElTVWxKU2twS1MwdExURXhNVFUxTlRrNU9UMDlQVUZCUVVWRlJVbEpTVTFOVFZGUlVWVlZWVmxaV1YxZFhXRmhZV1ZsWldscGFXMXRiWEZ4Y1hWMWRYbDVlWDE5ZllHQmdZV0ZoWW1KaVkyTmpaR1JrWldWbFptWm1aMmRuYUdob2FXbHBhbXBxYTJ0cmJHeHNiVzF0Ym01dWIyOXZjSEJ3Y1hGeGNuSnljM056ZEhSMGRYVjFkbloyZDNkM2VIaDRlWGw1ZW5wNmUzdDdmSHg4ZlgxOWZuNStmMzkvZ0lDQWdZR0Jnb0tDZzRPRGhJU0VoWVdGaG9hR2g0ZUhpSWlJaVltSmlvcUtpNHVMakl5TWpZMk5qbzZPajQrUGtKQ1FrWkdSa3BLU2s1T1RsSlNVbFpXVmxwYVdsNWVYbUppWW41MlRxcVNLdUsxK3pMcHIzc1ZZNmN4TjdzOUg4TkJGOE5CRjhOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5GRThORkU4TkZFOE5GRThORkU4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRzhkRkc4ZEZHOGRGRzhkRkg4ZEZIOGRGSDhkRkk4ZEZJOGRGSjhkSko4ZEpKOGRKSzhkSks4ZEpMOGRKTDhkSk04ZEpNOGROTjhkTk84ZE5QOGROUDhkTlE4ZE5ROGROUjh0UlM4dFJTOHRSVDh0UlY4dFZXOHRWWTh0Wlo4dFpiOHRkZTg5ZGc4OWhpODloajg5aGo4OWhrODlsbTg5bG85TnBxOU5wcjlOcHM5TnR0OU50dzlOeHk5Tnh6OU4xMTlOMTI5TjEzOU4xNTlkNTc5ZDkrOWQrQTllQ0Q5ZUdHOXVLSzl1T045dU9ROStXWCtPaWsrT3V1K2UyNCt1L0MrdkhKK3ZISU1zMHlDUDRBL3drY1NMQ2d3WU1JRGZZTE55Nmh3NGNRSTBxY1dJL2JNbWZkOGszY3lMSGpSbS9IY3VVNlZzNmp5Wk1uK1cwVEtiSmJQNVF3WXo3Y3g0MWxMbTR2WmVyYytZK21UWmM4Z3hMc1orN2J0M2dTZmJMRUtSSGVOMi9sY2dwMU9NNVpMMkRaNWtWVUtwSXBSSG5aZ1BWeVZuSnFRbnJaV1BZQ09yUG1VcWtKKzNrRHhqS2JQck1JMVVXejZhd2R4SDV1Yy9YeUZwSGRNNWF4cm1uRXE1QmJMN1hiNENJMFozVnNPb2o2dGowVzJjc3I0NExxRHJOTWh1NXZPVzdkU2tNc3A0d3Z2TThIKzNXalczZXhUbnhwV1FMckJoc2hQR3MyazZuak9lOVpMSmJXNlBWRytDMWtybGpKZWRLemRueGt3K1VINldrVE52YjZ6bjdmbFA3MU9zYk5OdmFDOUxweGl5cVUzemh1My9DZGg3bFBIVHA0N3RxMTQrYU8zM3k4K0tEVFRUYldQSE5NTXNvb2s0d3cwVml6elRmcCtQZGZUUDJrMDQwMXl0Qm0wNGJqTFpQTk4vTE0xNDlrRzZHempWVWJwcWppTWRGMEU2SkpJMHAwenpmV1dEUE9YUnZCd3cyS0t2YVlvakRXaEdOZVJQalFhTTAzKzBBVVRqSWlIWk9OT2lUR1ZvNDFHcXI0V0M5WCtqaFNOdXhJMUU4NTF6aVhqSGNJM1pNYlN4aTk1bEErM3JTbW9qREtSSk5OTjg0NDg0dzEzaEM0VEpWcVJjT2VRK3RzdzZSTjEwUTVrSmtwOW1LTmFnZlp3NDF6TnZXaVREYmVvQ1BmUWZtbzA4MDF5V3pHVnppRy9qUE9NNTdXRmFwQVM2cVl6WkFDMmJPTk1QNHBLck1OT2hKaVpzNDJ5NlNZakRkUlRxZWlNK1pBbE04MzBaU2FpM0FHM2NNTnJEWUJjdzA2cHlMVUR6clhNTXZTTWQrUUNJOHoxWWtFakRWL1FxUWpqN2xFTnhSSUd5YlRqVDBvMWRPTm0yZ0dpeDV3bkdHa0ZVZm9aTFBNTWMrVVJkQTQ4SXJrekRqUlJ0UlBWUnRhbythL3poeXp6RFpkbXNTUE91UXNQTkJ2R3dMTFV6bWljYmJOa1Ayc013NlVVK25qV0hCazZvVHd0ZUhNWjA3QXdyQUZFVDZzU3R1Y1RkRWd0UncrMm15WXphVVB6Y1BOTmRkNFU3TkIrR2ltRm0vTG9ST3dNOE5CNU0reVRYNGprVHQ3c2ZUTWk1OEI1dWxhQmY4ekQzVWlKUWIwUTNQcDFqSnM4R1F0c01VT3lXTWNjc3BGaERGTGlzRkdEdjZrTjRYOWp6elJkR3Z1WDkxNG1rekVlSGw5TGFOZkJVNzNST280bzV2VmpOVkRyMGpXMURNUjRJTFhIVkU5MTlpVWpkOG15UzA2Nlp3Lzd1WEp6MWx6dGxDc3FVWFk1bk5qN25sRTQwQ2FETnlmRytXNzcrd1d0UGUxS1Q4a2QrY2J4UzVTTW40VkZNL3Z2cE9qRVQ2UFltbjllT1VWVkE2a3l2QWV0K08yYnhSUHg4ZUlVOUE4cjE2UDVURzhodGVqTXVzVU5JNjEzVzgwRC9qbDNnNFJQUjNuc28zMmZMUEpNYlJoRFd0dDZCaU0rOGMzTktRTW5Vbmtmc2liQ0FSWm9nMEE5bWc4OGJqY2hxSnhyNEdVZzM3ZVM4Z0V3emNSZVBTdmdnVFJTNCtzZ1pSODFlaUYxcmlHdnp5b3U4dElFSCtEaTRnNEJqVVM4dzFsSFA3WHNFYURvdEdnSncwa0gvblJUenZjOFRxQjNJd3pzNU5JNmtnb2tmbU54aDBId1VjUzlRT1BKSFVrSFpMakROTWVXTHY4VFVSeHl3dWhUdUxodG5MaEtDSmpxMDRzVmpVUlJDR25pVHpKeDByUXBFYUZvR3NrbEpQSU9zSW9rdEY5Sm0zZUN1VG52RkVqYjd3eElvak1CVERXeGhpbkVRcVBEb21SL1RTNGpEN3F4QjVuR3NrTXpTSU92dG1sTjk4dzRNKzhaQTV2cEVhQ0doU0dEOW5XUm1Fb01pNVZ3Wkl6RWlpdDJkZ2toNGVzRXRRZ2trSEJCYzhoNkNDa0pHLzVtUXo2VEhNTythTkk2dWNRZDJpd1hOQVVTajlxOVM4ZVNsSm1CeWxIcnREa3dJUGNRMm1qR2FWQStFRzYySmlEUU56b29FRHl3Ym9tRlk4Z1NmN2JUR2U0V1JEdzhLMHovbkFlTjZ5UkRXaDVSQjNiY0JNd3R2SEl2MTB6Wnc2Qng0bWNFVStIZ0RGaCtrc2FYWHJ4TU1UWmJVZWw2cVJCa2hrcGJ2Q3puK2tnV1VKQW1URWJFbVI4M1JwTE4vU0hrSFZRS1VYTzRKMC9nNlBPamp5eFNiTjhLZjVFSW95c3RNVll1WWpaU2YvQnMxSlo0eDRvdVp2SHZGZ1FlaHBRakE5QkM0Y3drazJEaE1ZbXdxQmtSMlJUSlJhZWhVN0dzc2FwOW9IT1l4bnhJVDgxbzBjTUk4Q2cxbFJRYXZFTVF0QmhqV1FrUTRaaEF4MVltV213d29udWFQMEVrMSt6NFVtQnpBTWRsdHBJN242SnlZajJqelFidVFka3V5b1UzSUQxR2xnQ2htaEhTOXJTWXFWSzJnam9oQjR5V1MyNVZsY3VYZjV0UWdUNzJ0b1dzcUd5UFVna2JldWpZOXd6dHdVWkpHOWR5MEhnWmpWMHVqbUdjcGZMM09ZZXcxTnpYS3B4QjhMU3VwRGpHK0hJcm5hM205MXZsQ09VMlpEdWRQOVIzYTZjTVRDNUNPOTRFVkxldmlVRnZlcGRyMEhhcTFlSGNDVzk0cDB1ZmYxMjMvaktseUQwUGEvbzhtdmM5bTVESGt0MGg0SVh6T0Q4eUtObmVDTXdjTnQ3SUw5YStNSVlYaENoSkp6YmVvUnl1Q255NzM5YjlXRVEvMUsxSXhaSVpreHNwY2lrbUNEbGFDT0x2NFhGRncra1F0bncxREd1WVZyU2hza20ycUNwamNsaHJXUElpemxGUHJLTkNmSXlRa0gxSUdQalN6bVhUT0ptY2FPSjlkZ0dhbEZNNVlHVUVxelpLQWMrUm5RUGN2QllnRDJsc2psVzAyVU41Ylk1eEloZE1qcjY5OXBvMUxqTEJ4R0hNclcwU3p6anNsaGFVaFF2L1Z3UWRvQTBSY0NnNkpRSkhSdE5LYk5GSHYxTVFBQUFJZjRWVFdGa1pTQjNhWFJvSUZOamNtVmxibFJ2UjJsbUFEcz0iID4gICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb250ZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9hbW91bnRfbW9uZXkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9zaWduIj7CpTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9udW0iPiR7cmVzcC5kYXRhLnlvdWh1aXF1YW59PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb25kaXRpb24iPiR7cmVzcC5kYXRhLmNvdXBvbl9pbmZvfTwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3RpbWUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3Rlcm0iPuacieaViOacnzwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2RhdGUiPiR7cmVzcC5kYXRhLmNvdXBvbl9lbmRfdGltZX08L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jaXJjbGUiPjwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xpbmtfY291cG9uIiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiI+DQogICAgICAgICAgICAgICAgPGEgY2xhc3M9InpobV9nZXRfbGlua190ZXh0IiBvbmNsaWNrPSJ3aW5kb3cub3BlbignaHR0cHM6Ly9hcGkudHlwZWNocm9tZS5jb20vY29kZS5waHA/bGluaz0ke3Jlc3AuZGF0YS5jb2RlX3VybH0nKSI+54K55Ye76aKG5Y+WPC9hPg0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9InRicXJjb2RlIiBjbGFzcz0iemhtX3FyY29kZSI+PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIGA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobV9kaXZfcycpLmlubmVySFRNTD1odG1sOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHFyY29kZSA9IG5ldyBRUkNvZGUoInRicXJjb2RlIiwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogNjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGFyayA6ICIjMTIxMjEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMaWdodCA6ICIjZmZmZmZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdExldmVsIDogUVJDb2RlLkNvcnJlY3RMZXZlbC5NDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcmNvZGUubWFrZUNvZGUocmVzcC5kYXRhLmNvZGVfdXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1yb290LS1od0V1amdjJykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1yb290LS1od0V1amdjJykuc3R5bGU9InBvc2l0aW9uOnVuc2V0IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXcgUVJDb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YnFyY29kZSIpLCByZXNwLmNvZGVfdXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXNwLm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vdGl0bGXlj4LmlbDllYblk4HmoIfpophjc3PvvIxzaG9w5bqX6ZO65ZCN56ewY3NzDQogICAgICAgICAgICBnZXRUaXRsZVNob3AodGl0bGUsc2hvcCl7DQoNCiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiByZXNwKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGdvb2RzVGl0bGVEb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCh0aXRsZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNob3BOYW1lRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoc2hvcCk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhnb29kc1RpdGxlRG9tLHNob3BOYW1lRG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNUaXRsZT1nb29kc1RpdGxlRG9tP2dvb2RzVGl0bGVEb20uaW5uZXJUZXh0OicnOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZSA9IHNob3BOYW1lRG9tP3Nob3BOYW1lRG9tLmlubmVyVGV4dDonJzsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHt9Ow0KDQogICAgICAgICAgICAgICAgICAgIGRhdGEuZ29vZHNUaXRsZSA9IGdvb2RzVGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgZGF0YS5zaG9wTmFtZSA9IHNob3BOYW1lOw0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3AoKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBjbGFzcyBQbGF5VmlkZW9DbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7DQogICAgICAgICAgICAgICAgc3VwZXIoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgY2xhc3MgUGxheU11c2ljQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7DQogICAgICAgICAgICBjb25zdHJ1Y3Rvcigpew0KICAgICAgICAgICAgICAgIHN1cGVyKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHhtbHlDcmVhdGVDaGVja2JveCgpew0KDQogICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdGxpID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvdW5kLWxpc3QgdWwgbGknKTsNCg0KICAgICAgICAgICAgICAgIHNvdW5kTGlzdGxpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94ZWQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoY2hlY2tib3hlZCl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy50ZXh0Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoIXRpdGxlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICB0aXRsZS5zdHlsZSA9ICJ3aWR0aDozNjBweCI7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNyYyA9IHRpdGxlLnF1ZXJ5U2VsZWN0b3IoJ2EnKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3REb20gPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5pY29uLXdyYXBwZXInKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXREb20gPSBmaXJzdERvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgaW5wdXREb20uc3R5bGU9ICdtaW4td2lkdGg6IDBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3pobUNoZWNrYm94JyB2YWx1ZT0iK3NyYysiICBjbGFzcz0nemhtQ2hlY2tib3gnPiI7DQoNCiAgICAgICAgICAgICAgICAgICAgZmlyc3REb20uYmVmb3JlKGlucHV0RG9tKTsNCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNsYXNzIFpoQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7DQoNCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7DQogICAgICAgICAgICAgICAgc3VwZXIoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNob3dTcGVjaWFsQ29sdW1uKCl7DQoNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRSZWNvbW1lbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGNhcmRSZWNvbW1lbmQubGVuZ3RoID4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFJlY29tbWVuZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlID09ICdQb3N0Jyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+YScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aXRsZSlyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTmFtZSA9ICdzcGVjaWFsQ29sdW1uIEJ1dHRvbiBWb3RlQnV0dG9uIFZvdGVCdXR0b24tLXVwJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlID0gJ2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzowcHggNXB4O21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoycHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfmlofnq6AnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpew0KICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lcj0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRTZWFyY2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuU2VhcmNoUmVzdWx0LUNhcmQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjYwMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhcmRTZWFyY2gubGVuZ3RoID4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFNlYXJjaC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignLnNwZWNpYWxDb2x1bW4nKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhWm9wKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWFyY2gnLHR5cGUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+ZGl2PmEnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRpdGxlKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAnc3BlY2lhbENvbHVtbiBCdXR0b24gVm90ZUJ1dHRvbiBWb3RlQnV0dG9uLS11cCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnbGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjBweCA1cHg7bWFyZ2luLXJpZ2h0OjVweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfmlofnq6AnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5iZWZvcmUobmV3RWxlbWVudCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzaG93VmlkZW9UaXRsZSgpew0KDQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZiA9PSAnaHR0cHM6Ly93d3cuemhpaHUuY29tLycpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBjYXJkUmVjb21tZW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkZlZWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihjYXJkUmVjb21tZW5kLmxlbmd0aCA+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRSZWNvbW1lbmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignLnZpZGVvVGl0bGUnKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ZpZGVvID0gZGF0YVpvcC5jYXJkLmhhc192aWRlbzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhc1ZpZGVvID09IHRydWUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+ZGl2PmEnKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPmRpdj5hJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+YScpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAndmlkZW9UaXRsZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTMxLCA4NiwgMC4xMik7Y29sb3I6IHJnYigyNTUsIDczLCAxMik7bGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+inhumikSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXI9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXJkU2VhcmNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLlNlYXJjaFJlc3VsdC1DYXJkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKz42MDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkU2VhcmNoLmxlbmd0aCA+MCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRTZWFyY2guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJy52aWRlb1RpdGxlJykpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhWm9wLmNhcmQuY29udGVudC50eXBlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1p2aWRlbycgKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+ZGl2PmEnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRpdGxlKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAndmlkZW9UaXRsZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnYmFja2dyb3VuZDogcmdiYSgyNTUsIDEzMSwgODYsIDAuMTIpO2NvbG9yOiByZ2IoMjU1LCA3MywgMTIpO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn6KeG6aKRJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZW1vdmVWaWRlbygpew0KDQogICAgICAgICAgICAgICAgbGV0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOw0KDQogICAgICAgICAgICAgICAgY2FyZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudmlkZW9faWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUuc3R5bGU9J2Rpc3BsYXk6bm9uZTsnOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZW1vdmVBRCgpew0KDQogICAgICAgICAgICAgICAgbGV0IHpoSGlkZUFEID0gYC5QYy1jYXJkLC5QYy13b3Jke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O30uVG9wc3RvcnlJdGVtLS1hZHZlcnRDYXJke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fWA7DQoNCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoemhIaWRlQUQpKTsNCg0KICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICBkb3dubG9hZFZpZGVvKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM6XC9cL3d3d1wuemhpaHVcLmNvbVwvenZpZGVvXC8uKy8pKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1Eb3dubG9hZCcpKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLl9lMjk2cGcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoYnV0dG9uLmxlbmd0aDwyKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkQnV0ID0gYnV0dG9uWzFdLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dC5zZXRBdHRyaWJ1dGUoJ2lkJywnZG93bmxvYWRWaWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBidXR0b25bMV0uYmVmb3JlKGRvd25sb2FkQnV0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Rvd25sb2FkVmlkZW8nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb0lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlpWaWRlby1wbGF5ZXInKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpWaWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5aVmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9EYXRhID0gSlNPTi5wYXJzZSh6VmlkZW8uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0lkID0gdmlkZW9EYXRhLmNhcmQuY29udGVudC52aWRlb19pZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1VybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb09iaiA9IHZpZGVvVXJsLnNwbGl0KCc/Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JZCA9IHZpZGVvT2JqWzBdLnNwbGl0KCcvJykucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvSWQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+W6KeG6aKRaWQnKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhEb3dubG9hZCh2aWRlb0lkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgfSwyMDAwKTsNCg0KICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsKGUpID0+IHsNCg0KICAgICAgICAgICAgICAgICAgICBpZighZS5yZWxhdGVkTm9kZS5xdWVyeVNlbGVjdG9yKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlCYXIgPSBlLnJlbGF0ZWROb2RlLnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IGRpdjpsYXN0LWNoaWxkID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2Om50aC1vZi10eXBlKDIpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoIXBsYXlCYXIgfHwgcGxheUJhci5xdWVyeVNlbGVjdG9yKCcuemhtRG93bmxvYWQnKSkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHBsYXlCYXIuY2xhc3NOYW1lICE9ICdjc3MtMTk5cXg3bScpcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlCdXQ9IHBsYXlCYXIucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcuXzFjMWN2dWcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlCdXRMaSA9IHBsYXlCdXQucXVlcnlTZWxlY3RvcignOnNjb3BlID4gZGl2Omxhc3QtY2hpbGQgPiBkaXY6Zmlyc3QtY2hpbGQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBsYXlCdXRMaSkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRCdXQgPSBwbGF5QnV0TGkuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dC5jbGFzc05hbWUgPSBwbGF5QnV0TGkuY2xhc3NOYW1lICsgJyB6aG1Eb3dubG9hZCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb3dubG9hZEJ1dC5xdWVyeVNlbGVjdG9yKCcuXzF0ZzhvaXInKSkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dC5xdWVyeVNlbGVjdG9yKCcuXzF0ZzhvaXInKS5pbm5lclRleHQ9J+S4i+i9vSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlCdXRMaS5iZWZvcmUoZG93bmxvYWRCdXQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb0lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VmlkZW9EYXRhKGRvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudERvbSA9IGRvbS5wYXJlbnROb2RlDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyZW50RG9tLmNsYXNzTmFtZSAmJiBwYXJlbnREb20uY2xhc3NOYW1lPT0nRmVlZCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJlbnREb20uY2xhc3NOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRGF0YSA9IEpTT04ucGFyc2UocGFyZW50RG9tLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSWQgPSB2aWRlb0RhdGEuY2FyZC5jb250ZW50LnZpZGVvX2lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpZGVvRGF0YShwYXJlbnREb20pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RhdGEocGxheUJ1dCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHZpZGVvSWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvSWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5bop4bpopFpZCcpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aERvd25sb2FkKHZpZGVvSWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZnVuY3Rpb24gemhEb3dubG9hZCh2aWRlb0lkKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbGVucy56aGlodS5jb20vYXBpL3Y0L3ZpZGVvcy8nK3ZpZGVvSWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucGxheWxpc3QgIT0gdW5kZWZpbmVkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5X3VybCA9IGRhdGEucGxheWxpc3QuTEQucGxheV91cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9OYW1lID0gdmlkZW9JZCsiLm1wNCI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwbGF5X3VybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQocGxheV91cmwsdmlkZW9OYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+S4i+i9veWksei0pe+8gScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVtb3ZlUmlnaHQoKXsNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLnpoaWh1XC5jb21cL3Blb3BsZVwvLiovKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IHpoRnVsbFNjcmVlbiA9IGAuR2xvYmFsU2lkZUJhciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30NCiAgICAgICAgICAgICAgICAgICAgLmNzcy0xcXl5dGo3e2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDt9DQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbi1zaWRlQ29sdW1ue2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fQ0KICAgICAgICAgICAgICAgICAgICAuVG9wc3RvcnktbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9DQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbi1tYWluQ29sdW1ue3dpZHRoOjEwMDBweCAhaW1wb3J0YW50fQ0KICAgICAgICAgICAgICAgICAgICAuY3NzLWNhemc0OHttYXJnaW46IDBweCAxNnB4IDBweCAwcHggIWltcG9ydGFudDt9DQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbldhaXRpbmctbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7fQ0KICAgICAgICAgICAgICAgICAgICAuY3NzLTFqNWQzbGx7cGFkZGluZy1sZWZ0OjEwcHg7fQ0KICAgICAgICAgICAgICAgICAgICAuY3NzLXloandvZXtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW4gIWltcG9ydGFudDt9DQogICAgICAgICAgICAgICAgICAgIC5BdXRob3JJbmZve21heC13aWR0aDoxMDAwcHggIWltcG9ydGFudDt9Ow0KICAgICAgICAgICAgICAgICAgICBgOw0KICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh6aEZ1bGxTY3JlZW4pKTsNCg0KICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hhbmdlTGluaygpew0KDQogICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLmluZGV4T2YoJ3RhcmdldCcpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0gdGhpcy5nZXRVcmxQYXJhbXMoY291cG9uVXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihvYmoudGFyZ2V0ID09IHVuZGVmaW5lZCkgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZGVjb2RlVVJJQ29tcG9uZW50KG9iai50YXJnZXQpOw0KDQogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bGluazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZW1vdmVLZXl3b3JkKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgR01LZXl3b3JkID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJywnMCcpOw0KDQogICAgICAgICAgICAgICAgaWYoR01LZXl3b3JkID09ICcwJyB8fCBHTUtleXdvcmQgPT0gJycpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgIGxldCBrZXl3b3JkID0gR01LZXl3b3JkLnNwbGl0KCcsJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOw0KDQogICAgICAgICAgICAgICAga2V5d29yZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZSh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhWm9wICYmIGRhdGFab3AudGl0bGUuaW5kZXhPZihpdGVtKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUNhcmQgPSB2YWx1ZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZENsYXNzPSBpdGVtQ2FyZC5jbGFzc05hbWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtQ2FyZENsYXNzLmluZGV4T2YoJ1RvcHN0b3J5SXRlbS1pc1JlY29tbWVuZCcpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ2FyZC5zdHlsZT0nZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmVtb3ZlQXV0aG9yTmFtZSgpew0KDQogICAgICAgICAgICAgICAgdmFyIEdNQXV0aG9yTmFtZSA9IEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsJzAnKTsNCg0KICAgICAgICAgICAgICAgIGlmKEdNQXV0aG9yTmFtZSA9PSAnMCcgfHwgR01BdXRob3JOYW1lID09ICcnKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICBsZXQgYXV0aG9yTmFtZSA9IEdNQXV0aG9yTmFtZS5zcGxpdCgnLCcpOw0KDQogICAgICAgICAgICAgICAgLy/mkJzntKLpobUNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyTGluay5sZW5ndGggPiA1KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbmsuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvcil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvci5pbm5lclRleHQpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG4+MzApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbisrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMTAwKQ0KDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8v5Zue562U6aG1DQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBpdGVtRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkxpc3QtaXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1Eb20ubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLkNvbnRlbnRJdGVtJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoY29udGVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihkYXRhWm9wLmF1dGhvck5hbWUpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/nrYnkvaDlm57nrZTpobUNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vcXVlc3Rpb24vd2FpdGluZycpew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXN0aW9uTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qc05hdmlnYWJsZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihxdWVzdGlvbkxpc3QubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25MaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvckRvbVRleHQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5jc3MtdG5zYXhoJykuaW5uZXJUZXh0Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvckRvbVRleHQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yID0gYXV0aG9yRG9tVGV4dC5yZXBsYWNlKCciJywnJykucmVwbGFjZSgn55qE5o+Q6ZeuJywnJykucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihhdXRob3IpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlPSdkaXNwbGF5Om5vbmU7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9LDMwMCkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/mjqjojZDpobUNCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudEl0ZW0nKTsNCg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50LmZvckVhY2goZnVuY3Rpb24odmFsdWUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UodmFsdWUuZ2V0QXR0cmlidXRlKCdkYXRhLXpvcCcpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGRhdGFab3AuYXV0aG9yTmFtZSkgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1DYXJkID0gdmFsdWUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtQ2FyZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNhcmQuc3R5bGU9J2Rpc3BsYXk6bm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvL+ivhOiuuuWxj+iUvQ0KICAgICAgICAgICAgICAgIGxldCBuPTA7DQoNCiAgICAgICAgICAgICAgICBsZXQgdGltZXJDbG9zZUF1dGhvciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQ29tbWVudHMtY29udGFpbmVyJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkNvbW1lbnRzLWNvbnRhaW5lcicpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMzRwb2RyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy9sZXQgY29tbWVudEJveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMzRwb2RyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoY29tbWVudERvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50TGkgPSBjb21tZW50RG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jc3MtMWZybjkzeD5kaXY+ZGl2Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbW1lbnRMaVswXS5jbGFzc05hbWU9PSdjc3MtMTk0djczbScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRBdXRob3JOYW1lRG9tID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuY3NzLTFyZDBoNmYnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudEF1dGhvck5hbWUgPSBjb21tZW50QXV0aG9yTmFtZURvbS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGNvbW1lbnRBdXRob3JOYW1lKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJlbW92ZVlhbnh1YW4oKXsNCg0KICAgICAgICAgICAgICAgIC8v5Zue562U6aG1DQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBpdGVtRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkxpc3QtaXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1Eb20ubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tT3JkaW5hcnlMYWJlbC1jb250ZW50Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYW5zd2VyQ2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BbnN3ZXJDYXJkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoYW5zd2VyQ2FyZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYW5zd2VyQ2FyZC5xdWVyeVNlbGVjdG9yKCcuS2ZlQ29sbGVjdGlvbi1PcmRpbmFyeUxhYmVsLWNvbnRlbnQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCAmJiBjb250ZW50LmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgIknKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJDYXJkLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8v5pCc57Si6aG1DQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpew0KDQogICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkTGlzdC5sZW5ndGggPiA1KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZExpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tUGNDb2xsZWdlQ2FyZC10eXBlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZSAmJiB0eXBlLmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgInkuJPmoI8nKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yWWFueHVhbiA9IFsn5pWF5LqL5qGj5qGI5bGAJywgJ+ebkOmAieaOqOiNkCcsICfnm5DpgInnp5Hmma4nLCAn55uQ6YCJ5oiQ6ZW/6K6h5YiSJywgJ+efpeS5juebkOmAieS8muWRmCcsICfnn6XkuY7nm5DpgInliJvkvZzogIUnLCAn55uQ6YCJ5b+D55CGJywgJ+ebkOmAieWBpeW6t+W/heS/ruivvicsICfnm5DpgInlpYflppnnianor60nLCAn55uQ6YCJ55Sf5rS76aaGJywgJ+ebkOmAieiBjOWcuicsICfnm5DpgInmloflrabnlITpgIknLCAn55uQ6YCJ5L2c6ICF5bCP566h5a62JywgJ+ebkOmAieWNmueJqemmhicsICfnm5DpgInngrnph5EnLCAn55uQ6YCJ5rWL6K+E5a6kJywgJ+ebkOmAieenkeaKgOWJjeayvycsICfnm5DpgInkvJrlkZjnsr7lk4EnLCAn5Y6G5Y+y546v5ri46K6wJ107DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yICYmIGF1dGhvcllhbnh1YW4uaW5kZXhPZihhdXRob3IuaW5uZXJUZXh0KSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihudW0+MzApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtKys7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwxMDApDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvL+aOqOiNkOmhtQ0KICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOw0KDQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2xvc2VBdXRob3IoKXsNCiAgICAgICAgICAgICAgICAvL+mAmui/h+WumuaXtuWZqOiOt+WPlg0KDQogICAgICAgICAgICAgICAgbGV0IHRpbWVyQ2xvc2VBdXRob3IgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCB6aG1DbG9zZUF1dGhvckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1DbG9zZUF1dGhvckJ1dHRvbicpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHpobUNsb3NlQXV0aG9yQnV0dG9uKXJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9ySW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMXJhc2FtcicpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvckluZm8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlck5hbWVJbmZvID0gYXV0aG9ySW5mby5xdWVyeVNlbGVjdG9yKCcuVXNlckxpbmsnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodXNlck5hbWVJbmZvKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyTGlua0luZm8gPSB1c2VyTmFtZUluZm8ucXVlcnlTZWxlY3RvcignLlVzZXJMaW5rLWxpbmsnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JOYW1lTGluayA9IHVzZXJMaW5rSW5mby5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgR01BdXRob3JOYW1lID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yQXJyYXkgPSBHTUF1dGhvck5hbWU/R01BdXRob3JOYW1lLnNwbGl0KCcsJyk6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uQ2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9IGF1dGhvckFycmF5LmluZGV4T2YoYXV0aG9yTmFtZUxpbmspICE9IC0xPyflt7LlsY/olL0nOiflsY/olL3nlKjmiLcnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2Uuc3R5bGUgPSBidXR0b25DbG9zZS5pbm5lckhUTUwgPT0gJ+W3suWxj+iUvSc/J3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjojZmYyZTRkO2JvcmRlci1jb2xvcjojZmYyZTRkJzoncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5jbGFzc05hbWU9J0J1dHRvbiBGb2xsb3dCdXR0b24gRkVmVXJkZk1JS3BRREpEcWtqdGUgQnV0dG9uLS1wcmltYXJ5IEJ1dHRvbi0tYmx1ZSBlcE1KbDBsRlF1WWJDN2pyd3JfbyBKbVl6YWt5N01FUE1GY0pETE5NRyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtQ2xvc2VBdXRob3JCdXR0b24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lSW5mby5hcHBlbmRDaGlsZChidXR0b25DbG9zZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZUluZm8ucGFyZW50Tm9kZS5zdHlsZT0nbGluZS1oZWlnaHQ6MzVweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQXV0aG9yTmFtZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihidXR0b25DbG9zZS5pbm5lckhUTUw9PSflt7LlsY/olL0nKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxhdXRob3JBcnJheS5sZW5ndGg7aSsrKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvckFycmF5W2ldID09IGF1dGhvck5hbWVMaW5rKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JBcnJheS5zcGxpY2UoaSwxKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQXV0aG9yTmFtZSA9IGF1dGhvckFycmF5LnRvU3RyaW5nKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUF1dGhvck5hbWU9IEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpP0dNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpKycsJythdXRob3JOYW1lTGluazphdXRob3JOYW1lTGluazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsemhtQXV0aG9yTmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3JlbW92ZUF1dGhvck5hbWUnLCcyMicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8n5bGP6JS955So5oi3Jzon5bey5bGP6JS9JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zdHlsZSA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8ncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjJlNGQ7Ym9yZGVyLWNvbG9yOiNmZjJlNGQnOidwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNsYXNzIFZpZGVvRG93bmxvYWRDbGFzcyBleHRlbmRzIEJhc2VDbGFzc3sNCg0KICAgICAgICAgICAgY29uc3RydWN0b3IoKXsNCg0KICAgICAgICAgICAgICAgIHN1cGVyKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGR5VmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcueGctdmlkZW8tY29udGFpbmVyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdnNOYXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZnV5X3dtY3Q6bnRoLW9mLXR5cGUoNSknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8q5oqW6Z+z57u86Im65qCP55uu5pS554mIDQogICAgICAgICAgICAgICAgICAgICAgICBpZigodnNOYXYgJiYgdnNOYXYuY2xhc3NOYW1lLmluZGV4T2YoJ0xYWDc5bGVkJykgIT0gLTEpIHx8IGNvdXBvblVybC5pbmRleE9mKCd2c2RldGFpbCcpICE9IC0xKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn57u86Im65qCP55uu5YWz6Zet5LiL6L29Jyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwuaW5kZXhPZigndnNkZXRhaWwnKSAhPSAtMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+e7vOiJuuagj+ebruWFs+mXreS4i+i9vScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUR5VmlkZW9Eb3dubG9hZCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvSW5kZXggPSB2aWRlb1BsYXlEb21BbGwubGVuZ3RoPjE/dmlkZW9QbGF5RG9tQWxsLmxlbmd0aC0yOnZpZGVvUGxheURvbUFsbC5sZW5ndGgtMTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvUGxheURvbSA9IHZpZGVvUGxheURvbUFsbFt2aWRlb0luZGV4XTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdmlkZW9QbGF5RG9tID0gdmlkZW9QbGF5RG9tQWxsLmxlbmd0aD4xP3ZpZGVvUGxheURvbUFsbFt2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTJdOnZpZGVvUGxheURvbUFsbFt2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTFdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXlEb20uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+57uT5p2fIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctc3dpdGNoLWNoZWNrZWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgaW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5OdTY2UF9iYScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLlB6OHQybWVQJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvLmxlbmd0aD4wKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNjb3VudDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvW3ZpZGVvSW5kZXhdLmlubmVyVGV4dCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQgPSBpbmZvW3ZpZGVvSW5kZXhdLmlubmVyVGV4dC5yZXBsYWNlQWxsKCcuJywnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB0aXRsZUFyciA9IGluZm9bdmlkZW9JbmRleCoyKzFdLmlubmVyVGV4dC5zcGxpdCgnIycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy54aERvcGNRXycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHZ0W3ZpZGVvSW5kZXhdLmlubmVyVGV4dC5zcGxpdCgnIycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpdGxlWzBdIHx8IHRpdGxlWzFdKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSB0aXRsZVswXT90aXRsZVswXS5yZXBsYWNlQWxsKCcuJywnJykrYWNjb3VudCsnLm1wNCc6dGl0bGVbMV0ucmVwbGFjZUFsbCgnLicsJycpK2FjY291bnQrJy5tcDQnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGFjY291bnQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGFjY291bnQrJy5tcDQnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpKycubXA0JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSsnLm1wNCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQodmlkZW9QbGF5RG9tLmNoaWxkcmVuWzBdLnNyYyxmaWxlbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0NvcHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodmlkZW9QbGF5RG9tLmNoaWxkcmVuWzBdLnNyYyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9MaW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGdldENvbnRyb2xzKTsNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuY29kZT09J0Fycm93RG93bicgfHwgZS5jb2RlPT0nQXJyb3dVcCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGluc2VydGVkRG9tKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCd2aWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb20uYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywoZSkgPT4gew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWREb20oKTsNCg0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGdldENvbnRyb2xzKTsNCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3JlYXRlRHlWaWRlb0Rvd25sb2FkKCl7DQoNCiAgICAgICAgICAgICAgICBsZXQgY29udHJvbEFsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy54Zy1yaWdodC1ncmlkJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgY29udHJvbHMgPSBjb250cm9sQWxsLmxlbmd0aD4xP2NvbnRyb2xBbGxbY29udHJvbEFsbC5sZW5ndGgtMl06Y29udHJvbEFsbFtjb250cm9sQWxsLmxlbmd0aC0xXTsNCg0KICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobURvdXlpbkRvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vdmlkZW9Eb3dubG9hZERvbS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucGFyZW50Tm9kZSkNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgcGxheVNldGluZyA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWREb20gPSBwbGF5U2V0aW5nLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOw0KDQogICAgICAgICAgICAgICAgLy9sZXQgZG93bmxvYWRUZXh0ID0gZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignZGl2OmZpcnN0LWNoaWxkID4gc3BhbjpmaXJzdC1jaGlsZCcpOw0KDQogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVGV4dCA9IGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpmaXJzdC1jaGlsZCcpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LmlubmVyVGV4dD0n5LiL6L29JzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zdHlsZSA9ICdmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7JzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtRG91eWluRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkZXRhaWwgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCd4Zy1pY29uOm50aC1vZi10eXBlKDEpJykuY2hpbGRyZW5bMF07DQoNCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKT9kZXRhaWwuZ2V0QXR0cmlidXRlKCdocmVmJyk6bG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgIGlmKGxpbmtVcmwuaW5kZXhPZignd3d3LmRvdXlpbi5jb20nKT09LTEpew0KDQogICAgICAgICAgICAgICAgICAgIGxpbmtVcmw9Jy8vd3d3LmRvdXlpbi5jb20nK2xpbmtVcmw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnZGF0YS11cmwnLGxpbmtVcmwpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdocmVmJywnamF2YXNjcmlwdDp2b2lkKDApOycpOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5jbGFzc05hbWU9J3hncGxheWVyLXBsYXliYWNrLXNldHRpbmcgc2xpZGUtc2hvdyc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uY2xhc3NOYW1lPSd4Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRIdG1sID0gJyc7DQoNCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkSHRtbCArPSBgPGRpdiBjbGFzcz0ieGdwbGF5ZXItcGxheXJhdGlvLWl0ZW0gJHtpdGVtLmlkfSIgaWQ9IiR7aXRlbS5pZH0iPiR7aXRlbS5uYW1lfTwvZGl2PmA7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXlyYXRpby13cmFwJykuaW5uZXJIVE1MID0gZG93bmxvYWRIdG1sOw0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXNsaWRlcicpLnN0eWxlPSd3aWR0aDo2MHB4IGltcG9ydGFudDsnOw0KDQogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWF1dG9wbGF5LXNldHRpbmcnKTsNCg0KICAgICAgICAgICAgICAgIGF1dG9QbGF5LmFmdGVyKGRvd25sb2FkRG9tKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgICAgIGRpdkRvbS5zdHlsZT0icG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6LTk5OTtoZWlnaHQ6ODBweDt3aWR0aDo0MHB4O21hcmdpbi10b3A6LTgwcHg7Ig0KDQogICAgICAgICAgICAgICAgZG93bmxvYWREb20uYXBwZW5kQ2hpbGQoZGl2RG9tKTsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxEb20gPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCd4Zy1pY29uOm50aC1vZi10eXBlKDEpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHhnSWNvbiA9IGRldGFpbERvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoeGdJY29uLmNoaWxkcmVuWzFdICYmIHhnSWNvbi5jaGlsZHJlblsxXS5jbGFzc05hbWU9PSd4Zy10aXBzJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHhnSWNvbi5jaGlsZHJlblsxXS5pbm5lckhUTUw9J+S4i+i9veinhumikSc7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2xhc3NOYW1lPSd4Z3BsYXllci1kZXRhaWwtZW50cnknOw0KDQogICAgICAgICAgICAgICAgICAgIHhnSWNvbi5jaGlsZHJlblswXS5zdHlsZT0nbWFyZ2luLXJpZ2h0OjE2cHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKCdpZCcsJ3pobURvdXlpbkRvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtVcmwgPSB4Z0ljb24uY2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKCdocmVmJyk/eGdJY29uLmNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZSgnaHJlZicpOmxvY2F0aW9uLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgeGdJY29uLmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgnZGF0YS11cmwnLGxpbmtVcmwpOw0KDQogICAgICAgICAgICAgICAgICAgIHhnSWNvbi5jaGlsZHJlblswXS5yZW1vdmVBdHRyaWJ1dGUoJ3RhcmdldCcpOw0KDQogICAgICAgICAgICAgICAgICAgIHhnSWNvbi5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCdqYXZhc2NyaXB0OnZvaWQoMCk7Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgeGdJY29uLmNoaWxkcmVuWzBdLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nZGVzYycgc3R5bGU9J2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Jz7kuIvovb08L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1hdXRvcGxheS1zZXR0aW5nJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXkuYWZ0ZXIoeGdJY29uKTsNCiAgICAgICAgICAgICAgICAgICAgKi8NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBrc1ZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb21BcnIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnBsYXllci12aWRlbycsMSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbUFycil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSB2aWRlb0RvbUFyci5sZW5ndGg+Mj92aWRlb0RvbUFyclsxXTp2aWRlb0RvbUFyclswXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKS5tYXRjaCgvXmJsb2IvKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/liKDpmaTmrovnlZnkuIvovb1ET00NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvRG93bmxvYWREb20pew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlkZW9Eb3dubG9hZERvbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jsb2Lop4bpopHml6Dms5XkuIvovb0nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUtzVmlkZW9Eb3dubG9hZCh2aWRlb0RvbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLGZ1bmN0aW9uKCl7IC8v5pKt5pS+5LitDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuS4rSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvue7k+adnyIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXRDb250cm9scygpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF1dG8td2FycHBlcicpLmdldEF0dHJpYnV0ZSgnYXV0b3BsYXknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlUaW1lVG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG90YWwnKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vjb25kID0gcGxheVRpbWVUb3RhbC5tYXRjaCgvKC4rKTooLispLyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vjb25kVG90YWwgPSBzZWNvbmRbMV0qNjArcGFyc2VJbnQoc2Vjb25kWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVXJsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNjb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9maWxlLXVzZXItbmFtZS10aXRsZScpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9maWxlLXVzZXItbmFtZS10aXRsZScpLmlubmVyVGV4dDpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmVlZC1hdXRob3InKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8taW5mby10aXRsZScpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1pbmZvLXRpdGxlJykuaW5uZXJUZXh0Om5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRmlsZU5hbWUgPSAoYWNjb3VudCAmJiB0aXRsZSk/YWNjb3VudCsnLScrdGl0bGUrJy5tcDQnOm5ldyBEYXRlKCkuZ2V0VGltZSgpKycubXA0JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChkYXRhVXJsLHZpZGVvRmlsZU5hbWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWNvbmRUb3RhbDwzMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0ZpbGVOYW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZChkYXRhVXJsLHZpZGVvRmlsZU5hbWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihkYXRhVXJsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh2aWRlb0RvbS5nZXRBdHRyaWJ1dGUoJ3NyYycpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KDQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZ2V0Q29udHJvbHMpOw0KDQogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5jb2RlPT0nQXJyb3dEb3duJyB8fCBlLmNvZGU9PSdBcnJvd1VwJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9KQ0KDQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKXsNCg0KICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eaHR0cHM/OlwvXC93d3dcLmt1YWlzaG91XC5jb21cLyguKykvOw0KDQogICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKG1hdGNoKTsNCg0KICAgICAgICAgICAgICAgIGlmKCFyZXNwIHx8IChyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgPT0gLTEgJiYgcmVzcFsxXS5pbmRleE9mKCd2aWRlbycpID09LTEgJiYgcmVzcFsxXS5pbmRleE9mKCduZXctcmVjbycpID09IC0xKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjeS4jeaYr+inhumikeaSreaUvumhtScpO3JldHVybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZihyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJBcmVhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWNvbnRhaW5lci1wbGF5ZXInKTsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyQXJlYVdpZHRoID0gcGxheWVyQXJlYS5zdHlsZS53aWR0aC5tYXRjaCgvKC4rKXB4Lyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXllckJhclByb2dyZXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXllci1iYXItcHJvZ3Jlc3MnKTsNCg0KICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCYXJQcm9ncmVzcy5zdHlsZS53aWR0aCA9IHBsYXllckFyZWFXaWR0aFsxXS0zMjArJ3B4JzsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdGFsJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdGltZVRvdGFsLnN0eWxlLnJpZ2h0PScxODBweCc7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJpZ2h0Jyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb3dubG9hZERvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1Lc0Rvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlkZW9Eb3dubG9hZERvbSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgbGV0IGRldGFpbERvbSA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgxKScpOw0KDQogICAgICAgICAgICAgICAgbGV0IHhnSWNvbiA9IGRldGFpbERvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJyk7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24ucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXZvbHVtZS1zb3VuZCcpLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7Jz7kuIvovb08L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgbGV0IHNsaWRlciA9IHhnSWNvbi5xdWVyeVNlbGVjdG9yKCcucGwtc2xpZGVyJyk7DQoNCiAgICAgICAgICAgICAgICBzbGlkZXIuc3R5bGUgPSAnd2lkdGg6NDlweDtwYWRkaW5nOjEwcHggNXB4IDIwcHg7JzsNCg0KICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpc3QgPSAnJzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Y29sb3I6I0ZGRjtjdXJzb3I6cG9pbnRlcjsiIGlkPSIke2l0ZW0uaWR9Ij4ke2l0ZW0ubmFtZX08L2Rpdj5gOw0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIHNsaWRlci5pbm5lckhUTUwgPSBkb3dubG9hZExpc3Q7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdkYXRhLXVybCcsbGlua1VybCk7DQoNCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coeGdJY29uKTsNCg0KICAgICAgICAgICAgICAgIC8veGdJY29uLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7Jz7kuIvovb08L2Rpdj4iOw0KDQogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmJlZm9yZSh4Z0ljb24pOw0KDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIC8v6YeN5p6E5pKt5pS+5pON5L2c5oyJ6ZKuDQoNCiAgICAgICAgICAgICAgICBsZXQgemhtS3NCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NCdXR0b24nKTsNCg0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coemhtS3NCdXR0b24pOw0KDQogICAgICAgICAgICAgICAgaWYoemhtS3NCdXR0b24pew0KDQogICAgICAgICAgICAgICAgICAgIC8vemhtS3NCdXR0b24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh6aG1Lc0J1dHRvbik7DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGxldCBidXR0b25JY29uID0gZGV0YWlsRG9tLmNsb25lTm9kZSh0cnVlKTsNCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGJ1dHRvbkljb24pOw0KICAgICAgICAgICAgICAgIGJ1dHRvbkljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzQnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uSWNvbkltZyA9IGJ1dHRvbkljb24ucXVlcnlTZWxlY3RvcignLnVubXV0ZWQtaWNvbicpOw0KDQogICAgICAgICAgICAgICAgaWYoYnV0dG9uSWNvbkltZyl7DQogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkljb25JbWcuc3R5bGUgPSAnYmFja2dyb3VuZDogdXJsKGh0dHBzOi8vczItMTA2MjMua3dpbWdzLmNvbS91ZGF0YS9wa2cvY2xvdWRjZG4vaW1nL3BsYXllci1zZXR0aW5nLmFkMWY1Y2U4LnN2Zykgbm8tcmVwZWF0JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmFmdGVyKGJ1dHRvbkljb24pOw0KDQogICAgICAgICAgICAgICAgbGV0IHBsU2xpZGVyID0gYnV0dG9uSWNvbi5xdWVyeVNlbGVjdG9yKCcucGwtc2xpZGVyJyk7DQoNCiAgICAgICAgICAgICAgICBwbFNsaWRlci5zdHlsZT0nd2lkdGg6YXV0bztwYWRkaW5nOjEwcHggMTBweCAyNXB4IDEwcHg7JzsNCg0KICAgICAgICAgICAgICAgIHBsU2xpZGVyLmlubmVySFRNTCA9ICIiOw0KDQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkZvdXIgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoNCknKTsNCg0KICAgICAgICAgICAgICAgIGJ1dHRvbkZvdXIuc3R5bGUubWFyZ2luPScwcHgnOw0KDQogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXktc2V0dGluZy1jb250YWluZXInKTsNCg0KICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXkuc3R5bGUubWFyZ2luPScwcHggNDBweCAwcHggMHB4JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkZpdmUgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoNSknKTsNCg0KICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkZpdmUpew0KDQogICAgICAgICAgICAgICAgICAgIGJ1dHRvbkZpdmUuc3R5bGUubWFyZ2luPScxNXB4IDBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRml2ZS5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9vbFRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rd2FpLXBsYXllci1yb3RhdGUtdG9vbHRpcCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9vbFRpcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvb2xUaXApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LDMwKQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25GaXZlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvblNpeCA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg2KScpOw0KDQogICAgICAgICAgICAgICAgaWYoYnV0dG9uU2l4KXsNCg0KICAgICAgICAgICAgICAgICAgICBidXR0b25TaXguc3R5bGUubWFyZ2luPScxNXB4IDBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItZnVsbHNjcmVlbi10b29sdGlwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uU2l4Lm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLWZ1bGxzY3JlZW4tdG9vbHRpcCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9vbFRpcCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvb2xUaXApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9LDMwKQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25TaXgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25Gb3VyKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgndmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlWGlndWFWaWRlb0Rvd25sb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogImdldCIsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwOi8vNDcuOTkuMTU4LjExOC92aWRlby1jcmFjay92Mi9wYXJzZT9jb250ZW50PScrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0FjY2VwdCc6ICd0ZXh0L3BsYWluLCB0ZXh0L2h0bWwsYXBwbGljYXRpb24vanNvbid9LA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXMpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXM9PTIwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzLnJlc3BvbnNlVGV4dCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NyYyA9ICcnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPT0gMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NyYyA9IHJlc3AuZGF0YS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZpZGVvU3JjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1RpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvVGl0bGUgaDEnKS5pbm5lclRleHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9BdXRob3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXV0aG9yX191c2VyTmFtZScpLnRpdGxlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfmraPlnKjkuIvovb3or7fnqI3kvq8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZCh2aWRlb1NyYyx2aWRlb1RpdGxlKydAJyt2aWRlb0F1dGhvcisnLm1wNCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvU3JjKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeS4jeiDveWkjeWItuWcsOWdgCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W3suWkjeWItuWIsOWJqui0tOadvycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHZpZGVvU3JjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb1NyYyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHkuI3og73nm7TmjqXmiZPlvIAnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odmlkZW9TcmMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBhdGguZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmNsYXNzTmFtZSA9PSAneGdwbGF5ZXItY29udHJvbC1pdGVtIGNvbnRyb2xfcGxheW5leHQgY29tbW9uLWNvbnRyb2wtaXRlbScpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iakxpbmsgPSB7fTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaHJlZil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsuaHJlZiA9IGl0ZW0uaHJlZj9pdGVtLmhyZWY6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsudGFyZ2V0ID0gaXRlbS50YXJnZXQ/aXRlbS50YXJnZXQ6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakxpbmsuaHJlZiAmJiBvYmpMaW5rLnRhcmdldCAhPSAnX2JsYW5rJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IG9iakxpbmsuaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yIDogZnVuY3Rpb24oZXJyKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2aWRlbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvue7k+adnyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Zy1zd2l0Y2gtY2hlY2tlZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTUwMCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcmVhdGVYaWd1YVZpZGVvRG93bmxvYWQoKXsNCg0KICAgICAgICAgICAgICAgIGxldCByaWdodEdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctcmlnaHQtZ3JpZCcpOw0KDQogICAgICAgICAgICAgICAgbGV0IHBsYXlDb250cm9sID0gcmlnaHRHcmlkLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgyKScpOw0KDQogICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBwbGF5Q29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBsZXQgZW50cnk9IGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWNvbnRyb2wtaXRlbV9fZW50cnknKTsNCg0KICAgICAgICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJ4Z3BjUGxheWVyX3RleHRFbnRyeSI+PHNwYW4+5LiL6L29PC9zcGFuPjwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICBsZXQgcG9wb3ZlciA9IGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWNvbnRyb2wtaXRlbV9fcG9wb3ZlcicpOw0KDQogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkTGlzdCA9ICc8dWw+JzsNCg0KICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9IGA8bGkgdGFiaW5kZXg9IjAiIHJvbGU9Im1lbnVpdGVtcmFkaW8iIGFyaWEtY2hlY2tlZD0iZmFsc2UiIGlkPSIke2l0ZW0uaWR9Ij4ke2l0ZW0ubmFtZX08L2xpPmA7DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9ICc8L3VsPic7DQoNCiAgICAgICAgICAgICAgICBwb3BvdmVyLmlubmVySFRNTCA9IGRvd25sb2FkTGlzdDsNCg0KICAgICAgICAgICAgICAgIHBsYXlDb250cm9sLmJlZm9yZShjb250cm9sKTsNCg0KICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICAgICAgICAgIGRpdkRvbS5zdHlsZT0id2lkdGg6IDgwcHg7IGhlaWdodDogMTQwcHg7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjQwcHg7bGVmdDoyMHB4O3otaW5kZXg6LTEiOw0KDQogICAgICAgICAgICAgICAgY29udHJvbC5hcHBlbmRDaGlsZChkaXZEb20pOw0KDQogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgIHBvcG92ZXIuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgcG9wb3Zlci5zdHlsZS5kaXNwbGF5PSdub25lJzsNCg0KICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkKCl7DQoNCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KDQogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJpZ2h0Q29udHJvbCA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuc3F1aXJ0bGUtY29udHJvbGxlci13cmFwLXJpZ2h0Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmlnaHRDb250cm9sKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iaWxpYmlsaS1wbGF5ZXItdmlkZW8tYnRuLXF1YWxpdHknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tT3RoZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvbU90aGVyKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkT3RoZXIoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjMwKWNsZWFySW50ZXJ2YWwodGltZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gW3tuYW1lOid2aWRlbycsdHlwZTonZG9tJ30se25hbWU6J2J3cF92aWRlbycsdHlwZTonZG9tJ30se25hbWU6Jy5iaWxpYmlsaS1wbGF5ZXItdmlkZW8nLHR5cGU6J2NsYXNzJ31dOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDtpPHZpZGVvRG9tLmxlbmd0aDtpKyspew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IHZpZGVvRG9tW2ldLnR5cGUgPT0gJ2RvbSc/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih2aWRlb0RvbVtpXS5uYW1lKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZpZGVvRG9tW2ldLm5hbWUpLmZpcnN0Q2hpbGQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8v5Y+W5raI5a6a5pe25ZmoDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+5byA5aeLIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiaWxpRG93bmxvYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsaURvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmlsaURvd25sb2FkKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWxpRG93bmxvYWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiaWxpRG93bmxvYWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7DQogICAgICAgICAgICAgICAgICAgIC8v5bGP6JS955m75b2V5by55qGGDQogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW8pew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pqC5YGcIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYmlsaS1taW5pLWNsb3NlLWljb24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjbG9zZUljb24pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsb3NlSWNvbil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSWNvbi5jbGljaygpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZihkb3dubG9hZEljb24pew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4i+i9veaMiemSruW3suWtmOWcqCcpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnNxdWlydGxlLXF1YWxpdHktd3JhcCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighcXVhbGl0eSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHF1YWxpdHkuY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnNxdWlydGxlLXZpZGVvLXF1YWxpdHktdGV4dCcpLmlubmVyVGV4dD0n5LiL6L29JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkuYmVmb3JlKGNvbnRyb2wpOw0KDQogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvSWNvbkRvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuYmlsaWJpbGktcGxheWVyLXZpZGVvLWJ0bi1xdWFsaXR5Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFhdXRvSWNvbkRvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gYXV0b0ljb25Eb20uY2xvbmVOb2RlKHRydWUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5idWktc2VsZWN0LXJlc3VsdCcpLmlubmVyVGV4dD0n5LiL6L29JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnVpLXNlbGVjdC1yZXN1bHQnKS5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JY29uRG9tLmJlZm9yZShjb250cm9sKTsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemhtemdouS4jeaYr+inhumikeaIlueVquWJpycpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnZpZCA9ICcnLGF2aWQ9Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9odHRwczpcL1wvd3d3LmJpbGliaWxpLmNvbVwvdmlkZW9cLyguKylcPy8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW1zWzFdLmluZGV4T2YoJ2F2JykgIT0tMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpZCA9IHBhcmFtc1sxXS5yZXBsYWNlKCdhdicsJycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnZpZCA9IHBhcmFtc1sxXS5zdWJzdHJpbmcocGFyYW1zWzFdLmxlbmd0aC0xKT09Jy8nP3BhcmFtc1sxXS5zdWJzdHJpbmcoMCxwYXJhbXNbMV0ubGVuZ3RoLTEpOnBhcmFtc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflvZPliY3pobXpnaLml6Dms5XkuIvovb0nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFidmlkICYmICFhdmlkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5Zidmlk5oiWYXZpZCcpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YnZpZD0iK2J2aWQrIiZhaWQ9IithdmlkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlIDwgMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR5L+h5oGv5o6l5Y+j6L+U5Zue5pWw5o2u6ZSZ6K+vJyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6YCJ6ZuGY2lkDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gX3RoaXMuZ2V0UXVlcnlTdHJpbmcoJ3AnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaWQgPSAnJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhZ2VJZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLnBhZ2VzW3BhZ2VJZC0xXS5jaWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQgPSByZXNwLmRhdGEuY2lkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNpZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPTExMic7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gX3RoaXMucmVxdWVzdCgnZ2V0JyxsaW5rKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb2RlIDwgMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeaXoOazleS4i+i9vScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeWcsOWdgOaOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFVybCA9IGRhdGEuZGF0YS5kdXJsWzBdLnVybDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0dNX2Rvd25sb2FkKGRvd25sb2FkVXJsKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbihkb3dubG9hZFVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkT3RoZXIoKXsNCg0KICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQoNCiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsaURvd25sb2FkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYoZG93bmxvYWRJY29uKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfkuIvovb3mjInpkq7lt7LlrZjlnKgnKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2Jhbmd1bWknKSAhPSAtMSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWFsaXR5ID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1xdWFsaXR5LXdyYXAnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXF1YWxpdHkpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBxdWFsaXR5LmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eS5iZWZvcmUoY29udHJvbCk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9JY29uRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYXV0b0ljb25Eb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGF1dG9JY29uRG9tLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zdHlsZT0nbWFyZ2luLXJpZ2h0OjIwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktcmVzdWx0JykuaW5uZXJUZXh0PSfkuIvovb0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW1zID0gY29udHJvbC5xdWVyeVNlbGVjdG9yQWxsKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktbWVudS1pdGVtJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZSA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLVZhbHVlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhVmFsdWUgIT0gMTYgJiYgZGF0YVZhbHVlICE9IDgwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaXRlbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ljb25Eb20uYmVmb3JlKGNvbnRyb2wpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLm9ubW91c2VvdmVyPSgpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW91dD0oKT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemhtemdouS4jeaYr+inhumikeaIlueVquWJpycpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJpbGlEYXRhVmFsdWUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKT9lLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKTonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJpbGlEYXRhVmFsdWUpcmV0dXJuOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnZpZCA9ICcnLGF2aWQ9Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dVcmwgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCc/Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gbm93VXJsWzBdLm1hdGNoKC9odHRwczpcL1wvd3d3LmJpbGliaWxpLmNvbVwvdmlkZW9cLyguKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+WYnZpZOaIlmF2aWQnKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3P2J2aWQ9IitidmlkKyImYWlkPSIrYXZpZDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3AuY29kZSA8IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VJZCA9IF90aGlzLmdldFF1ZXJ5U3RyaW5nKCdwJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5wYWdlc1twYWdlSWQtMV0uY2lkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPScrYmlsaURhdGFWYWx1ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSBfdGhpcy5yZXF1ZXN0KCdnZXQnLGxpbmssJycsdHJ1ZSkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuY29kZSA8IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHlnLDlnYDmjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBkYXRhLmRhdGEuZHVybFswXS51cmw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZCgpew0KDQogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wueW91dHViZVwuY29tXC8od2F0Y2hcP3Y9Lit8c2hvcnRzXC8uKykvKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih1cmwpew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeW91dHViZUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih5b3V0dWJlSWNvbil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91dHViZUljb24uc3R5bGUub3BhY2l0eT0xOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy56aG1Mb2dvKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9Ijx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmUgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzEnLHVybDonaHR0cHM6Ly96aC5zYXZlZnJvbS5uZXQvMTc2LyN1cmw9J30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzInLHVybDonaHR0cHM6Ly9teWRvd25kb3duLmNvbS95MiMnfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMycsdXJsOidodHRwczovL3d3dy55dGRvd25may5jb20vc2VhcmNoP3VybD0nfSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevNCcsdXJsOidodHRwczovL3lvdXQuY29tL3ZpZGVvLz91cmw9J30NCiAgICAgICAgICAgICAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8L3VsPjwvZGl2PiI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobWxvZ28nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lRG9tLmNsYXNzTmFtZSA9ICdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB6aG1QbGF5LmFwcGVuZENoaWxkKHBsYXlMaW5lRG9tKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnpobUxvZ29EcmFnKCd5b3V0dWJlJywnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtSWNvbil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1JY29uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtSWNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobWxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1sb2dvKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemhtbG9nby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHpobWxvZ28pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtbG9nby5zdHlsZS5vcGFjaXR5PTA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfSw1MDApDQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGFsbFdlYiA9IFsuLi5nZXRDb3Vwb24sLi4uanhWaWRlbywuLi5qeE11c2ljLC4uLnpoTmljZSwuLi50YW9iYW8sLi4udmlkZW9Eb3dubG9hZF07DQoNCiAgICAgICAgdmFyIG5vd1dlYj1bXTsNCg0KICAgICAgICBhbGxXZWIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgaWYoaXRlbS5pc09wZW4gPT0gMCkgcmV0dXJuIHRydWU7DQoNCiAgICAgICAgICAgIGl0ZW0ud2ViLmZvckVhY2goZnVuY3Rpb24odmFsKXsNCg0KICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKHZhbC5tYXRjaCk7DQoNCiAgICAgICAgICAgICAgICBpZihyZXN1bHQpew0KDQogICAgICAgICAgICAgICAgICAgIG5vd1dlYi5wdXNoKHZhbCk7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KDQogICAgICAgIH0pDQogICAgICAgIGlmKG5vd1dlYi5sZW5ndGg9PTApew0KDQogICAgICAgICAgICBsZXQgYmFzZUNsYXNzID0gbmV3IEJhc2VDbGFzcygpOw0KDQogICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5Yy56YWN6K+l572R56uZ5oiW6K+l5qih5Z2X5bey5YWz6ZetJyk7cmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgbm93V2ViLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgIHN3aXRjaChpdGVtLmZ1bmNOYW1lKXsNCiAgICAgICAgICAgICAgICBjYXNlICdjb3Vwb24nOg0KDQogICAgICAgICAgICAgICAgICAgIGNvdXBvbkZ1bmMoaXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXlWaWRlbyc6DQogICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlb0Z1bmMoKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAncGxheU11c2ljJzoNCiAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljRnVuYyhpdGVtKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnemhOaWNlJzoNCiAgICAgICAgICAgICAgICAgICAgemhOaWNlRnVuYygpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb0Rvd25sb2FkJzoNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgdmlkZW9Eb3dubG9hZENsYXNzID0gbmV3IFZpZGVvRG93bmxvYWRDbGFzcygpOw0KDQogICAgICAgICAgICAgICAgICAgIHZhciB7ZnVuY05hbWUsbWF0Y2g6bm93TWF0Y2gsbm9kZTpub3dOb2RlLG5hbWU6bm93TmFtZX0gPSBpdGVtOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNXZWJPcGVuID09IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtLm5hbWUrJ+W3suWFs+mXrScpO3JldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb3dubG9hZENsYXNzW25vd05hbWVdKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICd0YW9iYW9TZWFyY2gnOg0KICAgICAgICAgICAgICAgICAgICB0YW9iYW9TZWFyY2hGdW5jKGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSkNCg0KICAgICAgICBmdW5jdGlvbiBjb3Vwb25GdW5jKGl0ZW0pew0KDQogICAgICAgICAgICB2YXIgY291cG9uQ2xhc3MgPSBuZXcgQ291cG9uQ2xhc3MoKTsNCg0KICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGl0ZW07DQoNCiAgICAgICAgICAgIHZhciBjb3Vwb25TdHlsZSA9YA0KICAgICAgICAgICAgICAgICAgICBodG1sew0KICAgICAgICAgICAgICAgICAgICAtLXJpZ2h0OjEwMCU7DQogICAgICAgICAgICAgICAgICAgIC0tbGVmdDoxMDAlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2NvdXBvbnsNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6Zml0LWNvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsNCiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczpmbGV4LXN0YXJ0Ow0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsNCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOjE1cHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fbGVmdHsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93Ow0KICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgcmlnaHQgdG9wLCB0cmFuc3BhcmVudCA4cHgsI2ZmZiAwKSB0b3AgbGVmdCAvdmFyKC0tcmlnaHQpIDUxJSBuby1yZXBlYXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgcmlnaHQgYm90dG9tLCB0cmFuc3BhcmVudCA4cHgsICNmZmYgMCkgYm90dG9tIGxlZnQgL3ZhcigtLXJpZ2h0KSA1MSUgbm8tcmVwZWF0Ow0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDJweCAycHggM3B4ICM4ODgpOw0KICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ODRweDsNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9pbWdfaWNvbnsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo0cHggMHB4IDBweCA1cHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDo1cHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1faW1nX2ljb24gaW1new0KICAgICAgICAgICAgICAgICAgICB3aWR0aDo0N3B4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2NvbnRlbnR7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX21vbmV5ew0KICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7DQogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9hbW91bnRfbW9uZXl7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX21vbmV5X3NpZ257DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmMjMwMzA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX21vbmV5X251bXsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjM2cHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC56aG1fY29uZGl0aW9uew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmIwZjNhOw0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmNGVjOw0KICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOjVweDsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNXB4Ow0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV90aW1lew0KICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IC01cHg7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MnB4IDRweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV90ZXJtew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmIwZjNhOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmIwZjNhOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjJweDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggNHB4Ow0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxOHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2RhdGV7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjhweDsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2NpcmNsZXsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZiMGYzYSB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQUF6VWxFUVZRWWxTM05NVW9EUVJpRzRYY211OWxBWEJRYnErMUNDcXVjd3NiT08zZ0FTMjloNFFtOGdSZElNS1ZnbFFWQkZpU0ZqWUtCcVdaMmQvN1BJdllQUEU2U01DSHZjRDhIdUx6QlVzSUtEeVk4QU40UlUrSjkvOG5IOG9MWUozd1djaHhCakpIdFprTjFmc2JwOW9tdmh6djZjY0RqUUpMYXRsWFhkWklrNWF3a0tWemRLazlXOGdCRlVWRFhOUUEyakpUQTdHU09tUjJMcG1rSUlXQTU0NnNwdk81d0wyOVF6M0dTQkJDSG5ud0l6TzRmMGZNYVlvS3kvQWNtOEE2K2Z4a1gxNUFOcWltWThRZW1DbTkyMHIxYVVBQUFBQUJKUlU1RXJrSmdnZz09KSByZXBlYXQteTsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDoxMHB4Ow0KICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTBweDsNCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjY2cHg7DQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6OTdweDsNCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoyOw0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6bm9uZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9saW5rX2NvdXBvbnsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczpjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMnB4IDJweCAzcHggIzg4OCk7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCB0b3AsIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSB0b3AgcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCBib3R0b20sIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSBib3R0b20gcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQ7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogODRweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggNnB4IDBweCA0cHg7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnpobV9nZXRfbGlua190ZXh0ew0KICAgICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4Ow0KICAgICAgICAgICAgICAgICAgICB3cml0aW5nLW1vZGU6dmVydGljYWwtbHI7DQogICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOjBweDsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiOw0KICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIHRvcCByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IGJvdHRvbSwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIGJvdHRvbSByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdDsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuemhtX2dldF9saW5rX3RleHQ6aG92ZXJ7DQogICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7DQogICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ODAwOw0KICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIC56aG1fcXJjb2Rlew0KICAgICAgICAgICAgICAgYm9yZGVyOjNweCBzb2xpZCAjZmZmOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGA7DQoNCiAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb3Vwb25TdHlsZSkpOw0KDQogICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsNCg0KICAgICAgICAgICAgbGV0IG49MDsNCg0KICAgICAgICAgICAgbGV0IGNvdXBvblRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgIG4rKzsNCg0KICAgICAgICAgICAgICAgIGxldCBwYWdlTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobm93Tm9kZSkNCg0KICAgICAgICAgICAgICAgIGlmKHBhZ2VOb2RlKXsNCg0KICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGNvdXBvblRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICBjb3Vwb25DbGFzc1tub3dOYW1lXSgpOw0KDQogICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYobj09Y291cG9uVGltZXJOdW0pIGNsZWFySW50ZXJ2YWwoY291cG9uVGltZXIpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSwxMDApDQogICAgICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcGxheVZpZGVvRnVuYygpew0KDQogICAgICAgICAgICB2YXIgcGxheVZpZGVvQ2xhc3MgPSBuZXcgUGxheVZpZGVvQ2xhc3MoKTsNCg0KICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3MuemhtTG9nbygpOw0KDQogICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnKSl7DQoNCiAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IHBsYXlWaWRlb0NsYXNzLmdldExpbmUoR01fZ2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JykpOw0KDQogICAgICAgICAgICAgICAgaWYobGluZU9iail7DQoNCiAgICAgICAgICAgICAgICAgICAgLy9wbGF5TGluZSA9IFsuLi5saW5lT2JqLC4uLnBsYXlMaW5lXTsNCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUgPSBsaW5lT2JqDQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vY3VzdG9tIGFkZCB3ZWIgbGluZQ0KDQogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7DQoNCiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsNCg0KICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjxkaXY+PHVsIGNsYXNzPSd6aG1fcGxheV92aWRlX2xpbmVfdWwnPiI7DQoNCiAgICAgICAgICAgIHBsYXlMaW5lLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsNCg0KICAgICAgICAgICAgICAgIGlmKHBsYXlWaWRlb0NsYXNzLmdldENvb2tpZSgncGxheUxpbmVBY3Rpb24nKSA9PSBpdGVtLnVybCl7DQoNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSAnemhtX2xpbmVfc2VsZWN0ZWQnOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9YDxsaSBjbGFzcz0ncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpICR7c2VsZWN0ZWR9JyB1cmw9JyR7aXRlbS51cmx9JyA+JHtpdGVtLm5hbWV9PC9saT5gOw0KDQogICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjwvZGl2PiI7DQoNCiAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobWxvZ28nKTsNCg0KICAgICAgICAgICAgbGV0IHBsYXlMaW5lRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoNCiAgICAgICAgICAgIHBsYXlMaW5lRG9tLmNsYXNzTmFtZSA9ICdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJzsNCg0KICAgICAgICAgICAgcGxheUxpbmVEb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KICAgICAgICAgICAgcGxheUxpbmVEb20uaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOw0KDQogICAgICAgICAgICB6aG1QbGF5LmFwcGVuZENoaWxkKHBsYXlMaW5lRG9tKTsNCg0KICAgICAgICAgICAgLy90ZW1wbGF0ZTpub2RlO+aSreaUvuWMuuWfnw0KDQogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsNCg0KICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsNCg0KICAgICAgICAgICAgbGV0IGp4VmlkZW9EYXRhID0gWw0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllcl9fY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyLWNvbnRhaW5lciIgLG1hdGNoOi9odHRwczpcL1wvdi5xcS5jb21cL3hcL2NvdmVyXC9bYS16QS1aMC05XStcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuY29udGFpbmVyLXBsYXllciIgLG1hdGNoOi92XC5xcVwuY29tXC94XC9wYWdlLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZSd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjZmxhc2hib3giLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixtYXRjaDovXmh0dHBzOlwvXC9tLmlxaXlpXC5jb21cL1t2d2FdXF8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3Zfc2hvd1wvaWRfLyxhcmVhQ2xhc3NOYW1lOiduZXctYm94LWFudGhvbG9neS1pdGVtcyd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3ZfcGxheVwvaWRfL30sDQoNCiAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllci1jb250YWluZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvdmlkZW8vfSwNCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNiaWxpYmlsaS1wbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvdmlkZW8vLG5hbWU6J2JpbGlQYycsYXJlYUNsYXNzTmFtZTondmlkZW8tZXBpc29kZS1jYXJkJ30sDQogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJfbW9kdWxlIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL2Jhbmd1bWkvLGFyZWFDbGFzc05hbWU6J2xpc3Qtd3JhcHBlcid9LOWOn+adpURPTQ0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmJweC1wbGF5ZXItcHJpbWFyeS1hcmVhIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL2Jhbmd1bWkvLGFyZWFDbGFzc05hbWU6J2VwbGlzdF9lcF9saXN0X3dyYXBwZXJfX1B6TEhhJ30sDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3Lm1ndHZcLmNvbVwvYnxsXC9bMC05XS8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyd9LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIueC1wbGF5ZXIiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L3R2XC5zb2h1XC5jb21cL3YvLGFyZWFDbGFzc05hbWU6J3Nlcmllcy10YWJfcGFuZSd9LA0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbGVfcGxheWJveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbGVcLmNvbVwvcHR2XC92cGxheVwvLyxhcmVhQ2xhc3NOYW1lOidqdWppX2dyaWQnfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovcGxheVwudHVkb3VcLmNvbVwvdl9zaG93XC9pZF8vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LA0KDQogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwNCg0KICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3ZvZFBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC4xOTA1LmNvbVwvdm9kXC9wbGF5XC8vfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7DQoNCiAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgIHBsYXlWaWRlb0NsYXNzLnpobUxvZ29EcmFnKCd2aWRlbycsanhWaWRlb1dlYik7DQoNCiAgICAgICAgICAgIC8v5piv5ZCm5Zyo5pKt5pS+6aG1DQogICAgICAgICAgICBpZihqeFZpZGVvV2ViLmxlbmd0aCA+IDApew0KDQogICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07DQoNCiAgICAgICAgICAgICAgICAvL+m8oOagh+e7j+i/h+aYvuekuue6v+i3rw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8v6YCJ5oup57q/6Lev6Kej5p6Q5pKt5pS+DQoNCiAgICAgICAgICAgICAgICB2YXIgcGxheUxpbmVUZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wbGF5TGluZVRkJyk7DQoNCiAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgemhtX2xpbmVfc2VsZWN0ZWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3Muc2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicsdGhpcy5nZXRBdHRyaWJ1dGUoJ3VybCcpLDMwKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSAhPSAyMil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm93V2ViTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobm93Tm9kZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dXZWJOb2RlLmlubmVySFRNTCA9IHBsYXlKeEh0bWw7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlJZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheUlmcmFtZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHnvZHnq5nnu5PngrnkuI3lrZjlnKgnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWYpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAvKi0t54m55q6K5aSE55CGLS0qLw0KICAgICAgICAgICAgICAgIC8v5LyY6YW35Y675bm/5ZGKDQogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXIiKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5b3VrdUFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkdmVydGlzZS1sYXllcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeWtBZCA9IHlvdWt1QWQubGFzdENoaWxkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB5a0FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeWtBZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktZGFzaGJvYXJkLTAnKS5zdHlsZT0nZGlzcGxheTpmbGV4JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW8ucGxheSgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL+aaguWBnA0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1wbGF5LWljb24tMCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWxheWVyIHZpZGVvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuKyslMiA9PSAwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wYXVzZSgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJyxmdW5jdGlvbigpeyAvL+aSreaUvuaXtumXtOaUueWPmA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdWt1QWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWR2ZXJ0aXNlLWxheWVyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeWtBZCA9IHlvdWt1QWQubGFzdENoaWxkOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5a0FkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5a0FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeWtBZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1kYXNoYm9hcmQtMCcpLnN0eWxlPSdkaXNwbGF5OmZsZXgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6ZSu55uY5b+r6L+b5b+r6YCADQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5vbmtleWRvd24gPSBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudC5rZXlDb2RlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LmtleUNvZGU9PTM5KXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmN1cnJlbnRUaW1lICsgNTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihldmVudC5rZXlDb2RlPT0zNyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZSAtIDU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvL+eIseWlh+iJuuWOu+W5v+WRig0KICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjZmxhc2hib3giKXsNCg0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2tpcHBhYmxlLWFmdGVyJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uY2xpY2soKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkNCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8v6IW+6K6v5Y67dmlw5by556qXDQogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXItY29udGFpbmVyIil7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyA8IDEwMCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFuZWxUaXBWaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFuZWwtb3ZlcmxheScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFuZWxUaXBWaXApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVGlwVmlwLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0sMTAwKQ0KDQoNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/kuZDop4bpgInpm4blpITnkIYNCiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIjbGVfcGxheWJveCIpew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX2Jsb2NrJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFqQmxvY2spIHJldHVybjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxqQmxvY2subGVuZ3RoO2krKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JZCA9IGpCbG9ja1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGBodHRwczovL3d3dy5sZS5jb20vcHR2L3ZwbGF5LyR7dmlkZW9JZH0uaHRtbGA7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqQmxvY2tbaV0uZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLGxpbmspOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9LDMwMDApDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy9C56uZ5aSn5Lya5ZGYdXJs5aSE55CG77yM6aG16Z2iY2xhc3PkuI3kuIDoh7QNCiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIucGxheWVyLWNvbnRhaW5lciIpew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItY29udGFpbmVyJykgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWNvbnRhaW5lcicpKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd05vZGUgPSAnLnBsYXllci1tYXNrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dOb2RlID0gJy5icHgtcGxheWVyLWNvbnRhaW5lcic7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8q6IW+6K6v6KeG6aKR54K55Ye75YW25a6D6KeG6aKR6Lez6L2sKi8NCiAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0ncXFQQycpew0KDQogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZ3VyZURldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWd1cmVfZGV0YWlsJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RJdGVtID0gWy4uLmZpZ3VyZSwuLi5maWd1cmVEZXRhaWxdOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RJdGVtLmxlbmd0aCA+IDApew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluayl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsaW5rOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvL+azqOmHiuaYr+WkmuS4quaSreaUvumAiembhuWMuuWfnw0KLyoNCiAgICAgICAgICAgICAgICBsZXQgZWFyZUNsYXNzTmFtZUFyciA9IGp4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZS5zcGxpdCgnLCcpOw0KDQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWFyZUNsYXNzTmFtZUFycik7cmV0dXJuOw0KDQogICAgICAgICAgICAgICAgaWYoZWFyZUNsYXNzTmFtZUFyci5sZW5ndGg9PTApcmV0dXJuOw0KKi8NCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQovKg0KICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGVhcmVDbGFzc05hbWVBcnIubGVuZ3RoO2krKyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2VhcmVDbGFzc05hbWVBcnJbaV0pKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LnBhcmVudE5vZGUuaHJlZik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICovDQoNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZih2aWRlb1NlbGVjdC5sZW5ndGg9PTApe2NvbnNvbGUubG9nKCfor6XnvZHnq5nmkq3mlL7ljLrnsbvlkI3mlLnlj5gnKTtyZXR1cm47fQ0KDQogICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlLnRhcmdldC5wYXJlbnROb2RlLmhyZWYpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9bG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICB9LDIwMDApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBwbGF5TXVzaWNGdW5jKCl7DQoNCiAgICAgICAgICAgIGlmKHNlbGYuZnJhbWVFbGVtZW50ICYmIHNlbGYuZnJhbWVFbGVtZW50LnRhZ05hbWUgPT0gIklGUkFNRSIpew0KDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcGxheU11c2ljQ2xhc3MgPSBuZXcgUGxheU11c2ljQ2xhc3MoKTsNCg0KICAgICAgICAgICAgdmFyIG11c2ljSWQgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOw0KDQogICAgICAgICAgICAvL25ldGVhc2Ug6Lev55Sx5Lik5qyh77yM6ZyA6YeN5a6a5LmJDQogICAgICAgICAgICB2YXIgbmV3VXJsID0gbG9jYXRpb24uaHJlZjsNCg0KICAgICAgICAgICAgbGV0IGp4TXVzaWNXZWIgPSBqeE11c2ljWzBdLndlYi5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3VXJsLm1hdGNoKGl0ZW0ubWF0Y2gpOw0KDQogICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICBpZihqeE11c2ljV2ViLmxlbmd0aCl7DQoNCiAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy8g5Y+W5raI5a6a5pe25ZmoDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J2t1d28nKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pY29uLWJhcl9pY29uX2Rvd25sb2FkXycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5jbGFzc05hbWUgPSAnJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uLnN0eWxlPSdtYXJnaW4tbGVmdDoxMHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5pbm5lckhUTUwgPSAiPGEgc3R5bGU9J2ZvbnQtc2l6ZToxMHB4O3doaXRlLXNwYWNlOiBub3dyYXA7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzU1NTsnIGlkPSdrdXdvRG93bmxvYWQnPuS4i+i9vTwvYT4iOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2xfcicpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLmJlZm9yZShpY29uKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3V3b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ05hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udHJvbCAuc29uZ19uYW1lJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnRpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udHJvbCAuYXJ0aXN0JykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChhdWRpb1NyYyxzb25nTmFtZSsnLScrYXJ0aXN0KycubXAzJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0neGltYWxheWEnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mkq3mlL7lmajliJvlu7rkuIvovb1pY29uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4bUNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhtLXBsYXllci1vcHJhdGlvbnMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHhtQ29udHJvbHMucXVlcnlTZWxlY3RvcignYTpudGgtb2YtdHlwZSgyKScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5pbm5lckhUTUwgPSAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMHB4O3doaXRlLXNwYWNlOiBub3dyYXA7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6I0ZGRjsnIGlkPSd4aW1hRG93bmxvYWQnPuS4i+i9vTwvc3Bhbj4iOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtQ29udHJvbHMuc3R5bGU9J3Bvc2l0aW9uOiByZWxhdGl2ZTttYXJnaW4tbGVmdDotMjBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItcHJvZ3Jlc3MnKS5zdHlsZS53aWR0aD0nNDUwcHgnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItcGxheXRpbWUnKS5zdHlsZT0ncG9zaXRpb246IGFic29sdXRlO3JpZ2h0OjQwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bUNvbnRyb2xzLnByZXBlbmQoaWNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5pKt5pS+5Zmo5LiL6L295LqL5Lu2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN4aW1hRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZtVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZm0tdGl0bGUnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZtVGl0bGVNYXRjaCA9IGZtVGl0bGUuaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tXC9zb3VuZFwvKFxTKikkLyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly9tb2JpbGUueGltYWxheWEuY29tL21vYmlsZS1wbGF5cGFnZS90cmFjay92My9iYXNlSW5mby8nK25ldyBEYXRlKCkuZ2V0VGltZSgpKyc/ZGV2aWNlPXdlYiZ0cmFja0lkPScrZm1UaXRsZU1hdGNoWzFdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGRhdGEudHJhY2tJbmZvLnBsYXlVcmxMaXN0WzFdLnVybDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIxID0gcGxheVVybC5yZXBsYWNlQWxsKCctJywnKycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjIgPSBzdHIxLnJlcGxhY2VBbGwoJ18nLCcvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gc3RyMi5sZW5ndGglNDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG51bSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMiArPSAnPT09PScuc3Vic3RyKG51bSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cjIpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKCJhYWFkM2U0ZmQ1NDBiMGY3OWRjYTk1NjA2ZTcyYmY5MyIpLCB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZWNyeXB0ZWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjcnlwdGVkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoZGVjcnlwdGVkLGRhdGEudHJhY2tJbmZvLnRpdGxlKycubXAzJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6aG16Z2i5YiX6KGo5Yib5bu65om56YeP5LiL6L29DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxNYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwczpcL1wvd3d3LnhpbWFsYXlhLmNvbVwvYWxidW1cL1swLTldKy8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxNYXRjaCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FuY2hvcl9zb3VuZF9saXN0Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzb3VuZExpc3Qpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VuZExpc3RIZWFkID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdEhlYWRUaXRsZSA9IHNvdW5kTGlzdEhlYWQucXVlcnlTZWxlY3RvcignLnNvcnQnKS5sYXN0Q2hpbGQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhdGNoRG93bmxvYWREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmF0Y2hEb3dubG9hZCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFiYXRjaERvd25sb2FkRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBbe25hbWU6J+aJuemHj+S4i+i9vScsaWQ6J2JhdGNoRG93bmxvYWQnfSx7bmFtZTon6YeN572uJyxpZDoncmVzZXQnfSx7bmFtZTon5YWo6YCJJyxpZDonc2VsZWN0QWxsJ31dOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHNvdW5kTGlzdEhlYWRUaXRsZS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLGl0ZW0uaWQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5pbm5lclRleHQgPSBpdGVtLm5hbWU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkVGl0bGUuYWZ0ZXIoY29udHJvbCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmJlZm9yZSgiIHwgIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VsZWN0QWxsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXRlbS5jaGVja2VkKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGVja2VkPXRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVzZXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1DaGVja2JveCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSd6aG1DaGVja2JveCddIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1DaGVja2JveC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5q2j5bqP5YCS5bqP5LqL5Lu2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkLnF1ZXJ5U2VsZWN0b3IoJy5zb3J0JykuZmlyc3RDaGlsZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kTGlzdEhlYWRUaXRsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXRjaERvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Jhc2VDbGFzcy50b2FzdCgn5bey5LiL6L2977yM6K+356iN5YCZJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmNoZWNrZWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2NyTWF0Y2ggPSBpdGVtLnZhbHVlLm1hdGNoKC9cL3NvdW5kXC8oWzAtOV0rKS8pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vbW9iaWxlLnhpbWFsYXlhLmNvbS9tb2JpbGUtcGxheXBhZ2UvdHJhY2svdjMvYmFzZUluZm8vJytuZXcgRGF0ZSgpLmdldFRpbWUoKSsnP2RldmljZT13ZWImdHJhY2tJZD0nK3Njck1hdGNoWzFdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGRhdGEudHJhY2tJbmZvLnBsYXlVcmxMaXN0WzFdLnVybDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIxID0gcGxheVVybC5yZXBsYWNlQWxsKCctJywnKycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjIgPSBzdHIxLnJlcGxhY2VBbGwoJ18nLCcvJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gc3RyMi5sZW5ndGglNDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG51bSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMiArPSAnPT09PScuc3Vic3RyKG51bSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cjIpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKCJhYWFkM2U0ZmQ1NDBiMGY3OWRjYTk1NjA2ZTcyYmY5MyIpLCB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGRlY3J5cHRlZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWNyeXB0ZWQpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChkZWNyeXB0ZWQsZGF0YS50cmFja0luZm8udGl0bGUrJy5tcDMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6Kej5a+G5Zyw5Z2A5aSx6LSlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3g9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy56aG1DaGVja2JveCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUNoZWNrYm94Lmxlbmd0aCA9PSAwKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+e/u+mhteS6i+S7tg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhZ2luYXRpb24tcGFnZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhZ2VCYXIpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i3s+mhteS6i+S7tg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b25bdHlwZT1zdWJtaXRdJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUxpbmspew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrljLnphY3liLDliJfooajlnLDlnYAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WFqOWxgOeCueWHu+S6i+S7tg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqTGluayA9IHt9Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmhyZWYpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay5ocmVmID0gaXRlbS5ocmVmP2l0ZW0uaHJlZjonJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsudGFyZ2V0ID0gaXRlbS50YXJnZXQ/aXRlbS50YXJnZXQ6Jyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvYmpMaW5rLmhyZWYgJiYgb2JqTGluay50YXJnZXQgIT0gJ19ibGFuaycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gb2JqTGluay5ocmVmOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J2t1Z291Jyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFEb20uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YU9iaiA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhb2JqJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YU9iail7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhb2JqJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCd0YXJnZXQnLCdfYmxhbmsnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YU9iaik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3Vwb25VcmwuaW5kZXhPZignbWl4c29uZycpIT0tMSB8fCBjb3Vwb25VcmwuaW5kZXhPZignc29uZycpICE9IC0xIHx8IGNvdXBvblVybC5pbmRleE9mKCdzaGFyZScpICE9IC0xKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2b2x1bWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdm9sdW1lJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZERvbSA9IHZvbHVtZURvbS5jbG9uZU5vZGUodHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi10b3A6MzBweCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLmlubmVySFRNTCA9ICI8YSBzdHlsZT0nY29sb3I6I2ZmZjtmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXI7JyBpZD0na3Vnb3VEb3dubG9hZCcgamF2YXNjcmlwdDp2b2lkKDApOz7kuIvovb08L2E+IjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRG9tLmJlZm9yZShkb3dubG9hZERvbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURvbS5zdHlsZT0nbGVmdDo1MHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb2RlJykuc3R5bGU9J21hcmdpbi1sZWZ0OjkwcHg7JzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BiX2Rvd25sb2FkJykuc3R5bGU9J21hcmdpbi1sZWZ0OjEzMHB4Oyc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYl9zaGFyZScpLnN0eWxlPSdtYXJnaW4tbGVmdDoxNzBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGlzdCcpLnN0eWxlPSdyaWdodDotMjBweDsnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3Vnb3VEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI215QXVkaW8nKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGF1ZGlvLmdldEF0dHJpYnV0ZSgnc3JjJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2luZ2VyTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaW5nZXJOYW1lJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ05hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc29uZ05hbWVUZW1wJykudGl0bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoYXVkaW9TcmMsc29uZ05hbWUrJy0nK3Npbmdlck5hbWUuc3Vic3RyKDAsc2luZ2VyTmFtZS5sZW5ndGgtMSkrJy5tcDMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvdXBvblVybCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J25ldGVhc2UnICYmIGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zdC9kb3dubG9hZCcpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnpobUxvZ28oKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnpobUxvZ29EcmFnKCdtdXNpYycsanhNdXNpY1dlYik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIH0saWNvbldhaXRUaW1lKTsNCg0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXlEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtSWNvbicpOw0KDQogICAgICAgICAgICAgICAgIGlmKHpobVBsYXlEb20pew0KDQogICAgICAgICAgICAgICAgICAgICB6aG1QbGF5RG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtUGxheURvbSk7DQoNCiAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pn7PpopHnvZHlnYDmsqHmnInmt7vliqDljLnphY3miJbljLnphY3plJnor68nKTsNCg0KICAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gemhOaWNlRnVuYygpew0KDQogICAgICAgICAgICB2YXIgemhDbGFzcyA9IG5ldyBaaENsYXNzKCk7DQoNCiAgICAgICAgICAgIC8v5YWz6Zet55m75b2V5by55qGGDQogICAgICAgICAgIChhc3luYyBmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICBsZXQgbG9naW5Nb2RhbFdyYXBwZXIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgiLk1vZGFsLXdyYXBwZXIiKTsNCg0KICAgICAgICAgICAgICAgaWYobG9naW5Nb2RhbFdyYXBwZXIpew0KDQogICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlQnV0dG9uID0gbG9naW5Nb2RhbFdyYXBwZXIucXVlcnlTZWxlY3RvcignLk1vZGFsLWNsb3NlQnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICAgICBpZihjbG9zZUJ1dHRvbil7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdXR0b24uY2xpY2soKTsNCg0KICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9KSgpDQoNCiAgICAgICAgICAgIHZhciB6aERhdGEgPSBbDQogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVZpZGVvJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZVZpZGVvJywnMCcpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZUFEJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUFEJywnMjInKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LA0KICAgICAgICAgICAgICAgIHtmdW5jOidkb3dubG9hZFZpZGVvJyxpc09wZW46R01fZ2V0VmFsdWUoJ2Rvd25sb2FkVmlkZW8nLCcyMicpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVJpZ2h0Jyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZVJpZ2h0JywnMCcpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sDQogICAgICAgICAgICAgICAge2Z1bmM6J2NoYW5nZUxpbmsnLGlzT3BlbjpHTV9nZXRWYWx1ZSgnY2hhbmdlTGluaycsJzIyJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwNCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlS2V5d29yZCcsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVLZXl3b3JkJywnMCcpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3Nob3dTcGVjaWFsQ29sdW1uJyxpc09wZW46R01fZ2V0VmFsdWUoJ3NwZWNpYWxDb2x1bW4nLCcyMicpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3Nob3dWaWRlb1RpdGxlJyxpc09wZW46R01fZ2V0VmFsdWUoJ3ZpZGVvVGl0bGUnLCcyMicpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZUF1dGhvck5hbWUnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsMjIpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sDQogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVlhbnh1YW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlWWFueHVhbicsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LA0KICAgICAgICAgICAgICAgIHtmdW5jOidjbG9zZUF1dGhvcicsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVBdXRob3JOYW1lJywyMiksaXNPbnNjcm9sbDowLG9ubG9hZDoxfSwNCiAgICAgICAgICAgIF0NCg0KICAgICAgICAgICAgemhEYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQogICAgICAgICAgICAgICAgaWYoaXRlbS5pc09wZW49PTIyICYmIGl0ZW0ub25sb2FkPT0wKXsNCiAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgd2luZG93Lm9ubG9hZD1mdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIHpoRGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT3Blbj09MjIgJiYgaXRlbS5vbmxvYWQ9PTEpew0KICAgICAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24oKXsNCg0KICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOw0KDQogICAgICAgICAgICAgICAgaWYoc2Nyb2xsVG9wID4gMjAwKXsNCg0KICAgICAgICAgICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLmlzT25zY3JvbGw9PTEpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gdGFvYmFvU2VhcmNoRnVuYyhpdGVtKXsNCg0KICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCg0KICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7DQoNCiAgICAgICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsNCg0KICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0c0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcubmV4dC1jaGVja2JveC1ncm91cCcpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKHNlbGVjdHNEb20pew0KDQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gc2VsZWN0c0RvbS5xdWVyeVNlbGVjdG9yQWxsKCdsYWJlbCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZihsYWJlbHMubGVuZ3RoPjApew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1UZXh0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcubmV4dC1jaGVja2JveC1sYWJlbCcpLmlubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtVGV4dD09J+WkqeeMqycpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGJMYWJlbHMgPSBpdGVtLmNsb25lTm9kZSh0cnVlKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90YkxhYmVscy5pZD0nc2VsZWN0VGInOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXREb20gPSB0YkxhYmVscy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERvbS52YWx1ZT0nc2VydmljZTp0YW9iYW8nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5xdWVyeVNlbGVjdG9yKCcubmV4dC1jaGVja2JveC1sYWJlbCcpLmlubmVyVGV4dD0n5reY5a6dJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5iZWZvcmUodGJMYWJlbHMpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsc2VsZWN0VGFvYmFvKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0VGFvYmFvKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdvb2RzTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50LS1jb250ZW50SW5uZXItLVFWVGNVME0gPiBkaXYgPiBhJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLnRhcmdldC5jbGFzc05hbWU9PSduZXh0LWNoZWNrYm94LWxhYmVsJylyZXR1cm47DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0YkxhYmVscy5jbGFzc05hbWU9PSduZXh0LWNoZWNrYm94LXdyYXBwZXIgJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJMYWJlbHMuY2xhc3NOYW1lPSduZXh0LWNoZWNrYm94LXdyYXBwZXIgY2hlY2tlZCc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNMaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtLmhyZWYubWF0Y2goL1wvXC9pdGVtXC50YW9iYW9cLmNvbVwvaXRlbVwuaHRtLykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZT0nZGlzcGxheTpub25lJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5jbGFzc05hbWU9J25leHQtY2hlY2tib3gtd3JhcHBlciAnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlPSdkaXNwbGF5OmJsb2NrJzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WIhumhtQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmV4dC1wYWdpbmF0aW9uLXBhZ2VzJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VCYXIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6I635Y+W5o+S5YWl5ZWG5ZOB5YWD57Sg5pa55rOVDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5Db250ZW50LS1jb250ZW50SW5uZXItLVFWVGNVME0nKS5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLChlKSA9PiB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhRG9tID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcignZGl2ID4gYScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhRG9tKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRiTGFiZWxzLmNsYXNzTmFtZT09J25leHQtY2hlY2tib3gtd3JhcHBlciBjaGVja2VkJyl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWFEb20uaHJlZi5tYXRjaCgvXC9cL2l0ZW1cLnRhb2Jhb1wuY29tXC9pdGVtXC5odG0vKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFEb20uc3R5bGU9J2Rpc3BsYXk6bm9uZSc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURvbS5zdHlsZT0nZGlzcGxheTpibG9jayc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lu7bov5/nrYnlvoXmlrnms5UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTSA+IGRpdiA+IGEnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGJMYWJlbHMuY2xhc3NOYW1lPT0nbmV4dC1jaGVja2JveC13cmFwcGVyIGNoZWNrZWQnKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlLmhyZWYubWF0Y2goL1wvXC9pdGVtXC50YW9iYW9cLmNvbVwvaXRlbVwuaHRtLykpew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlPSdkaXNwbGF5Om5vbmUnOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdHlsZT0nZGlzcGxheTpibG9jayc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMzAwMCkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW1UZXh0KTsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZWN0c0RvbSk7DQoNCg0KICAgICAgICAgICAgICAgIH0pKCk7DQoNCiAgICAgICAgICAgIH0pDQogICAgICAgIH0NCg0KICAgIH0NCn0pKCk7
Add Comment
Please, Sign In to add comment